diff --git a/utils/idea/main.go b/utils/idea/main.go new file mode 100755 index 0000000..eb2d61d --- /dev/null +++ b/utils/idea/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "crypto" + "crypto/md5" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/hex" + "encoding/pem" + "flag" + "log" + "net/http" + "os" + "strconv" + "strings" +) + +func main() { + log.SetOutput(os.Stdout) + + address := flag.String("addr", "127.0.0.1:9418", "Bind TCP Address") + flag.Parse() + + log.Println("Starting server at http://" + *address) + log.Println("Quit the server with CTRL-C.") + + if strings.Contains(*address, "0.0.0.0") { + *address = strings.Replace(*address, "0.0.0.0", "", 1) + } + + routerBinding() + err := http.ListenAndServe(*address, http.DefaultServeMux) + if err != nil { + log.Fatalln(err) + } +} + +func urlMatcher(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.ToLower(r.URL.Path) + h.ServeHTTP(w, r) + }) +} + +func routerBinding() { + mux := http.NewServeMux() + http.Handle("/", urlMatcher(mux)) + + mux.HandleFunc("/", index) + + mux.HandleFunc("/rpc/ping.action", ping) + + mux.HandleFunc("/rpc/obtainticket.action", obtainTicket) +} + +func index(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("Server is starting!")) +} + +func ping(w http.ResponseWriter, r *http.Request) { + log.Println(r.URL) + salt := r.URL.Query().Get("salt") + xmlResponse := "OK" + salt + "" + xmlSignature, _ := signature(xmlResponse) + w.Header().Add("Content-Type", "text/xml") + w.Write([]byte("\n" + xmlResponse)) +} + +func obtainTicket(w http.ResponseWriter, r *http.Request) { + log.Println(r.URL) + //buildDate := r.URL.Query().Get("buildDate") + //clientVersion := r.URL.Query().Get("clientVersion") + //hostName := r.URL.Query().Get("hostName") + //machineId := r.URL.Query().Get("machineId") + //productCode := r.URL.Query().Get("productCode") + //productFamilyId := r.URL.Query().Get("productFamilyId") + salt := r.URL.Query().Get("salt") + //secure := r.URL.Query().Get("secure") + username := r.URL.Query().Get("userName") + //version := r.URL.Query().Get("version") + //versionNumber := r.URL.Query().Get("versionNumber") + + if salt == "" || username == "" { + w.WriteHeader(http.StatusForbidden) + return + } + + prolongationPeriod := 607875500 + + xmlResponse := "" + strconv.Itoa(prolongationPeriod) + "OK" + salt + "1licensee=" + username + "\tlicenseType=0\t" + xmlSignature, _ := signature(xmlResponse) + w.Header().Add("Content-Type", "text/xml") + w.Write([]byte("\n" + xmlResponse)) +} + +var privateKey = []byte(` +-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeOmxk4YZW9aaV9 +ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2Aa5FpNNj0BDlf38hOtkhDzz/h +kYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIhAOeCQp+NXxfBmfdG/S+XbRUAdv8iHBl+ +F6O2wr5fA2jzAiEAywlDfGIl6acnakPrmJE0IL8qvuO3FtsHBrpkUuOnXakCIQCqdr+XvADI/UTh +TuQepuErFayJMBSAsNe3NFsw0cUxAQIgGA5n7ZPfdBi3BdM4VeJWb87WrLlkVxPqeDSbcGrCyMkC +IFSs5JyXvFTreWt7IQjDssrKDRIPmALdNjvfETwlNJyY +-----END RSA PRIVATE KEY----- +`) + +func signature(message string) (string, error) { + pem, _ := pem.Decode(privateKey) + rsaPrivateKey, err := x509.ParsePKCS1PrivateKey(pem.Bytes) + + hashedMessage := md5.Sum([]byte(message)) + signature, err := rsa.SignPKCS1v15(rand.Reader, rsaPrivateKey, crypto.MD5, hashedMessage[:]) + if err != nil { + return "", err + } + hexSignature := hex.EncodeToString(signature) + return hexSignature, nil +} diff --git a/utils/resume/resume.go b/utils/resume/main.go similarity index 100% rename from utils/resume/resume.go rename to utils/resume/main.go