升级异常机制

This commit is contained in:
Star 2025-12-12 21:41:35 +08:00
parent 905f6348eb
commit 06298d9fe4
2 changed files with 198 additions and 54 deletions

12
go.mod
View File

@ -3,8 +3,8 @@ module apigo.cc/gojs/util
go 1.24.0
require (
apigo.cc/gojs v0.0.30
apigo.cc/gojs/console v0.0.3
apigo.cc/gojs v0.0.32
apigo.cc/gojs/console v0.0.4
github.com/ZZMarquis/gm v1.3.2
github.com/emmansun/gmsm v0.40.0
github.com/obscuren/ecies v0.0.0-20150213224233-7c0f4a9b18d9
@ -18,10 +18,10 @@ require (
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
github.com/google/pprof v0.0.0-20250903194437-c28834ac2320 // indirect
github.com/ssgo/config v1.7.10 // indirect
github.com/ssgo/log v1.7.9 // indirect
github.com/ssgo/log v1.7.10 // indirect
github.com/ssgo/standard v1.7.7 // indirect
github.com/ssgo/tool v0.4.29 // indirect
golang.org/x/crypto v0.43.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/crypto v0.46.0 // indirect
golang.org/x/sys v0.39.0 // indirect
golang.org/x/text v0.32.0 // indirect
)

240
util.go
View File

@ -48,7 +48,10 @@ func init() {
if r, err := json.Marshal(gojs.FixObject(args.Arguments[0].Export())); err == nil {
return vm.ToValue(string(r))
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"jsonP": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -61,7 +64,10 @@ func init() {
return vm.ToValue(string(r))
}
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"unJson": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -70,7 +76,10 @@ func init() {
if err := json.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"yaml": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -78,7 +87,10 @@ func init() {
if r, err := yaml.Marshal(gojs.FixObject(args.Arguments[0].Export())); err == nil {
return vm.ToValue(string(r))
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"unYaml": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -87,7 +99,10 @@ func init() {
if err := yaml.Unmarshal(u.Bytes(args.Arguments[0].Export()), &r); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"base64": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -115,7 +130,10 @@ func init() {
if r, err := hex.DecodeString(args.Str(0)); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"aes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -123,7 +141,10 @@ func init() {
if r, err := u.EncryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"unAes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -131,7 +152,10 @@ func init() {
if r, err := u.DecryptAesBytes(u.Bytes(args.Arguments[0].Export()), u.Bytes(args.Arguments[1].Export()), u.Bytes(args.Arguments[2].Export())); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"sm4": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -139,7 +163,10 @@ func init() {
if r, err := sm4.CBCEncrypt(u.Bytes(args.Arguments[1].Export())[0:16], u.Bytes(args.Arguments[2].Export())[0:16], util.PKCS5Padding(u.Bytes(args.Arguments[0].Export()), 16)); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"unSM4": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -152,7 +179,10 @@ func init() {
}
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"genECDSA": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -168,7 +198,10 @@ func init() {
}
pri, err := ecdsa.GenerateKey(curve, u.GlobalRand2)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
var buf bytes.Buffer
buf.WriteByte(byte(len(pri.X.Bytes())))
@ -181,7 +214,10 @@ func init() {
priKey := makeECDSAPriKey(args.Bytes(0))
priBytes, err := x509.MarshalPKCS8PrivateKey(priKey)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
pemBytes := pem.EncodeToMemory(&pem.Block{
Type: "PRIVATE KEY",
@ -194,7 +230,10 @@ func init() {
pubKey := makeECDSAPubKey(args.Bytes(0))
pubBytes, err := x509.MarshalPKIXPublicKey(pubKey)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
pemBytes := pem.EncodeToMemory(&pem.Block{
Type: "PUBLIC KEY",
@ -210,40 +249,61 @@ func init() {
if strings.Contains(keyText, "-----BEGIN PRIVATE KEY-----") {
keyType = "private"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad private pem key")))
// panic(vm.NewGoError(gojs.Err("bad private pem key")))
vm.SetData("_lastError", gojs.Err("bad private pem key"))
gojs.GetLogger(vm).Error("bad private pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else if strings.Contains(keyText, "-----BEGIN PUBLIC KEY-----") {
keyType = "public"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad public pem key")))
// panic(vm.NewGoError(gojs.Err("bad public pem key")))
vm.SetData("_lastError", gojs.Err("bad public pem key"))
gojs.GetLogger(vm).Error("bad public pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else {
var err error
if keyBytes, err = base64.StdEncoding.DecodeString(keyText); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
}
if keyType == "private" {
if priKey, err := x509.ParsePKCS8PrivateKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
if ecdsaPriKey, ok := priKey.(*ecdsa.PrivateKey); !ok {
panic(vm.NewGoError(gojs.Err("bad private key")))
// panic(vm.NewGoError(gojs.Err("bad private key")))
vm.SetData("_lastError", gojs.Err("bad private key"))
gojs.GetLogger(vm).Error("bad private key")
return nil
} else {
return vm.ToValue(ecdsaPriKey.D.Bytes())
}
}
} else {
if pubKey, err := x509.ParsePKIXPublicKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
if ecdsaPubKey, ok := pubKey.(*ecdsa.PublicKey); !ok {
panic(vm.NewGoError(gojs.Err("bad public key")))
// panic(vm.NewGoError(gojs.Err("bad public key")))
vm.SetData("_lastError", gojs.Err("bad public key"))
gojs.GetLogger(vm).Error("bad public key")
return nil
} else {
var buf bytes.Buffer
buf.WriteByte(byte(len(ecdsaPubKey.X.Bytes())))
@ -260,7 +320,10 @@ func init() {
priKey := makeECDSAPriKey(args.Bytes(1))
r, s, err := ecdsa.Sign(u.GlobalRand1, priKey, u.Sha256(data))
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
var buf bytes.Buffer
buf.WriteByte(byte(len(r.Bytes())))
@ -286,7 +349,10 @@ func init() {
pubKey := makeECDSAPubKey(args.Bytes(1))
eciesPubKey := ecies.ImportECDSAPublic(pubKey)
if r, err := ecies.Encrypt(u.GlobalRand1, eciesPubKey, data, nil, nil); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
return vm.ToValue(r)
}
@ -297,7 +363,10 @@ func init() {
priKey := makeECDSAPriKey(args.Bytes(1))
eciesPriKey := ecies.ImportECDSA(priKey)
if r, err := eciesPriKey.Decrypt(u.GlobalRand1, data, nil, nil); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
return vm.ToValue(r)
}
@ -310,7 +379,10 @@ func init() {
buf.Write(pri.Y.Bytes())
return vm.ToValue([][]byte{pri.D.Bytes(), buf.Bytes()})
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"exportSM2PrivateKey": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -318,7 +390,10 @@ func init() {
priKey := makePriKey(args.Bytes(0), sm2.P256())
priBytes, err := smx509.MarshalECPrivateKey(priKey)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
pemBytes := pem.EncodeToMemory(&pem.Block{
Type: "PRIVATE KEY",
@ -331,7 +406,10 @@ func init() {
pubKey := makePubKey(args.Bytes(0), sm2.P256())
pubBytes, err := smx509.MarshalPKIXPublicKey(pubKey)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
pemBytes := pem.EncodeToMemory(&pem.Block{
Type: "PUBLIC KEY",
@ -347,36 +425,54 @@ func init() {
if strings.Contains(keyText, "-----BEGIN PRIVATE KEY-----") {
keyType = "private"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad private pem key")))
// panic(vm.NewGoError(gojs.Err("bad private pem key")))
vm.SetData("_lastError", gojs.Err("bad private pem key"))
gojs.GetLogger(vm).Error("bad private pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else if strings.Contains(keyText, "-----BEGIN PUBLIC KEY-----") {
keyType = "public"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad public pem key")))
// panic(vm.NewGoError(gojs.Err("bad public pem key")))
vm.SetData("_lastError", gojs.Err("bad public pem key"))
gojs.GetLogger(vm).Error("bad public pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else {
var err error
if keyBytes, err = base64.StdEncoding.DecodeString(keyText); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
}
if keyType == "private" {
if priKey, err := smx509.ParseECPrivateKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
return vm.ToValue(priKey.D.Bytes())
}
} else {
if pubKey, err := smx509.ParsePKIXPublicKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
if sm2PubKey, ok := pubKey.(*ecdsa.PublicKey); !ok {
panic(vm.NewGoError(gojs.Err("bad public key")))
// panic(vm.NewGoError(gojs.Err("bad public key")))
vm.SetData("_lastError", gojs.Err("bad public key"))
gojs.GetLogger(vm).Error("bad public key")
return nil
} else {
var buf bytes.Buffer
buf.WriteByte(byte(len(sm2PubKey.X.Bytes())))
@ -398,7 +494,10 @@ func init() {
buf.Write(s.Bytes())
return vm.ToValue(buf.Bytes())
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"verifySM2": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -420,7 +519,10 @@ func init() {
if r, err := sm2.Encrypt(u.GlobalRand1, pubKey, data, nil); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"decryptSM2": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -430,7 +532,10 @@ func init() {
if r, err := sm2.Decrypt(&sm2.PrivateKey{PrivateKey: *priKey}, data); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
@ -442,7 +547,10 @@ func init() {
}
key, err := rsa.GenerateKey(rand.Reader, size)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
priBytes := x509.MarshalPKCS1PrivateKey(key)
pubBytes := x509.MarshalPKCS1PublicKey(&key.PublicKey)
@ -476,33 +584,48 @@ func init() {
if strings.Contains(keyText, "-----BEGIN RSA PRIVATE KEY-----") {
keyType = "private"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad private pem key")))
// panic(vm.NewGoError(gojs.Err("bad private pem key")))
vm.SetData("_lastError", gojs.Err("bad private pem key"))
gojs.GetLogger(vm).Error("bad private pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else if strings.Contains(keyText, "-----BEGIN RSA PUBLIC KEY-----") {
keyType = "public"
if block, _ := pem.Decode([]byte(keyText)); block == nil {
panic(vm.NewGoError(gojs.Err("bad public pem key")))
// panic(vm.NewGoError(gojs.Err("bad public pem key")))
vm.SetData("_lastError", gojs.Err("bad public pem key"))
gojs.GetLogger(vm).Error("bad public pem key")
return nil
} else {
keyBytes = block.Bytes
}
} else {
var err error
if keyBytes, err = base64.StdEncoding.DecodeString(keyText); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
}
if keyType == "private" {
if priKey, err := x509.ParsePKCS1PrivateKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
return vm.ToValue(x509.MarshalPKCS1PrivateKey(priKey))
}
} else {
if pubKey, err := x509.ParsePKCS1PublicKey(keyBytes); err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} else {
return vm.ToValue(x509.MarshalPKCS1PublicKey(pubKey))
}
@ -514,7 +637,10 @@ func init() {
priKey := makeRSAPriKey(args.Bytes(1))
signature, err := rsa.SignPKCS1v15(rand.Reader, priKey, crypto.SHA256, u.Sha256(data))
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
return vm.ToValue(signature)
},
@ -532,7 +658,10 @@ func init() {
pubKey := makeRSAPubKey(args.Bytes(1))
encryptedData, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, pubKey, data, nil)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
return vm.ToValue(encryptedData)
},
@ -542,7 +671,10 @@ func init() {
priKey := makeRSAPriKey(args.Bytes(1))
decryptedData, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, priKey, data, nil)
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
return vm.ToValue(decryptedData)
},
@ -552,7 +684,10 @@ func init() {
if r, err := u.Gzip(u.Bytes(args.Arguments[0].Export())); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"gunzip": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -560,7 +695,10 @@ func init() {
if r, err := u.Gunzip(u.Bytes(args.Arguments[0].Export())); err == nil {
return vm.ToValue(r)
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
},
"uniqueId": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -743,7 +881,10 @@ func init() {
err = tpl.Execute(buf, args.Arguments[1].Export())
}
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
return vm.ToValue(buf.String())
},
@ -799,7 +940,10 @@ func init() {
args := gojs.MakeArgs(&argsIn, vm).Check(1)
r, err := filepath.Abs(args.Str(0))
if err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
}
return vm.ToValue(r)
},