站点更新:2018-01-23 15:56:23
This commit is contained in:
39
utils/jbls/Makefile
Normal file
39
utils/jbls/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
# https://golang.org/doc/install/source#environment
|
||||
GOOS := $(shell go env | awk -F= '$$1=="GOOS" {print $$2}' | awk -F '"' '{print $$2}') # 此处 awk 需使用两个 $
|
||||
GOARCH := $(shell go env | awk -F= '$$1=="GOARCH" {print $$2}' | awk -F '"' '{print $$2}')
|
||||
OSS = darwin dragonfly freebsd linux netbsd openbsd plan9 solaris windows
|
||||
PKG =
|
||||
# ifeq ($(strip $(GOOS)), windows)
|
||||
# GOARCH := $(strip $(GOARCH)).exe
|
||||
# endif
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
@ go build -ldflags "-s -w" -o JetBrainsLicenseServer_$(strip $(GOOS))_$(strip $(if \
|
||||
$(findstring windows,$(GOOS)),\
|
||||
$(strip $(GOARCH)).exe,\
|
||||
$(strip $(GOARCH))\
|
||||
))
|
||||
|
||||
.PHONY: amd64
|
||||
amd64:
|
||||
@ $(foreach OS,\
|
||||
$(OSS),\
|
||||
$(shell CGO_ENABLED=0 GOOS=$(OS) GOARCH=amd64 go build -ldflags "-s -w" -o JetBrainsLicenseServer_$(OS)_amd64$(if $(findstring windows,$(OS)),.exe)))
|
||||
@ echo done
|
||||
|
||||
.PHONY: 386
|
||||
386:
|
||||
@ $(foreach OS,\
|
||||
$(OSS),\
|
||||
$(shell CGO_ENABLED=0 GOOS=$(OS) GOARCH=386 go build -ldflags "-s -w" -o JetBrainsLicenseServer_$(OS)_386$(if $(findstring windows,$(OS)),.exe)))
|
||||
@ echo done
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@ rm -rf JetBrainsLicenseServer* idea
|
||||
|
||||
# 压缩。需要安装 https://github.com/upx/upx
|
||||
.PHONY: upx
|
||||
upx:
|
||||
@ upx $(if $(PKG),$(PKG),JetBrainsLicenseServer*)
|
126
utils/jbls/main.go
Executable file
126
utils/jbls/main.go
Executable file
@@ -0,0 +1,126 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto"
|
||||
"crypto/md5"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/x509"
|
||||
"encoding/hex"
|
||||
"encoding/pem"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.SetOutput(os.Stdout)
|
||||
|
||||
port := flag.Int("p", 21017, "port")
|
||||
host := flag.String("host", "0.0.0.0", "Bind TCP Address")
|
||||
flag.Parse()
|
||||
|
||||
log.Println("*************************************************************")
|
||||
log.Printf("** %-55s**", "JetBrains License Server")
|
||||
log.Printf("** %-55s**", "Please support genuine!!!")
|
||||
log.Printf("** Listen on %-45s**", fmt.Sprintf("%s:%d...", *host, *port))
|
||||
|
||||
addr := fmt.Sprintf("%s:%d", *host, *port)
|
||||
if strings.Contains(addr, "0.0.0.0") {
|
||||
addr = strings.Replace(addr, "0.0.0.0", "", 1)
|
||||
*host = strings.Replace(*host, "0.0.0.0", "127.0.0.1", 1)
|
||||
}
|
||||
|
||||
log.Printf("** You can use %-43s**", fmt.Sprintf("http://%s:%d as license server", *host, *port))
|
||||
log.Println("*************************************************************")
|
||||
|
||||
routerBinding()
|
||||
err := http.ListenAndServe(addr, 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 := "<PingResponse><message></message><responseCode>OK</responseCode><salt>" + salt + "</salt></PingResponse>"
|
||||
xmlSignature, _ := signature(xmlResponse)
|
||||
w.Header().Add("Content-Type", "text/xml")
|
||||
w.Write([]byte("<!-- " + xmlSignature + " -->\n" + xmlResponse))
|
||||
}
|
||||
|
||||
func obtainTicket(w http.ResponseWriter, r *http.Request) {
|
||||
// log.Println(r.URL)
|
||||
|
||||
salt := r.URL.Query().Get("salt")
|
||||
username := r.URL.Query().Get("userName")
|
||||
|
||||
if salt == "" || username == "" {
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
prolongationPeriod := 607875500
|
||||
|
||||
xmlResponse := "<ObtainTicketResponse><message></message><prolongationPeriod>" + strconv.Itoa(prolongationPeriod) + "</prolongationPeriod><responseCode>OK</responseCode><salt>" + salt + "</salt><ticketId>1</ticketId><ticketProperties>licensee=" + username + "\tlicenseType=0\t</ticketProperties></ObtainTicketResponse>"
|
||||
xmlSignature, _ := signature(xmlResponse)
|
||||
w.Header().Add("Content-Type", "text/xml")
|
||||
w.Write([]byte("<!-- " + xmlSignature + " -->\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) {
|
||||
// key, err := ioutil.ReadFile("rsa.key")
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// pem, _ := pem.Decode(key)
|
||||
|
||||
pem, _ := pem.Decode([]byte(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
|
||||
}
|
8
utils/jbls/rsa.key
Normal file
8
utils/jbls/rsa.key
Normal file
@@ -0,0 +1,8 @@
|
||||
-----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-----
|
Reference in New Issue
Block a user