From 0b250f2c4b372e39e1cc3711e9b242d5aca5295f Mon Sep 17 00:00:00 2001 From: Star Date: Fri, 12 Dec 2025 21:41:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=BC=82=E5=B8=B8=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 12 +-- util.go | 240 ++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 198 insertions(+), 54 deletions(-) diff --git a/go.mod b/go.mod index bbae65e..26c87ac 100644 --- a/go.mod +++ b/go.mod @@ -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 ) diff --git a/util.go b/util.go index 3332b4e..fe6d59c 100644 --- a/util.go +++ b/util.go @@ -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) },