This commit is contained in:
Star 2024-12-20 18:35:59 +08:00
commit 34bd21efc4
6 changed files with 196 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
.*
!.gitignore
go.sum
env.yml
build
release
node_modules
package.json

62
COS.go Normal file
View File

@ -0,0 +1,62 @@
package tencent
import (
"strings"
sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)
func getCosClient(bucket string) *sts.Client {
return sts.NewClient(conf.Cos[bucket].SecretId, conf.Cos[bucket].SecretKey, nil)
}
type Cos struct {
client *sts.Client
bucket string
appId string
region string
}
func GetCos(bucket string) *Cos {
bConf := conf.Cos[bucket]
a := strings.Split(bConf.Bucket, "-")
return &Cos{
client: getCosClient(bucket),
bucket: bConf.Bucket,
appId: a[len(a)-1],
region: bConf.Region,
}
}
type CosToken struct {
sts.Credentials
Bucket string
Region string
}
var defaultAllowPath = "/"
func (c *Cos) GetToken(allowPath *string) (*CosToken, error) {
if allowPath == nil {
allowPath = &defaultAllowPath
}
crt, err := c.client.GetCredential(&sts.CredentialOptions{
DurationSeconds: 3600,
Region: c.region,
Policy: &sts.CredentialPolicy{
Statement: []sts.CredentialPolicyStatement{{
Action: []string{"name/cos:PostObject", "name/cos:PutObject", "name/cos:InitiateMultipartUpload", "name/cos:ListMultipartUploads", "name/cos:ListParts", "name/cos:UploadPart", "name/cos:CompleteMultipartUpload"},
Effect: "allow",
Resource: []string{"qcs::cos:" + c.region + ":uid/" + c.appId + ":" + c.bucket + *allowPath + "*"},
}},
},
})
if err == nil {
return &CosToken{
Credentials: *crt.Credentials,
Bucket: c.bucket,
Region: c.region,
}, nil
}
return nil, err
}

24
go.mod Normal file
View File

@ -0,0 +1,24 @@
module apigo.cc/cloud/tencent
go 1.18
require (
apigo.cc/gojs v0.0.10
apigo.cc/gojs/console v0.0.2
github.com/ssgo/config v1.7.9
github.com/ssgo/u v1.7.13
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20241118064430-63a76784514f
)
require (
github.com/dlclark/regexp2 v1.11.4 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect
github.com/ssgo/log v1.7.7 // indirect
github.com/ssgo/standard v1.7.7 // indirect
github.com/ssgo/tool v0.4.27 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

68
main.go Normal file
View File

@ -0,0 +1,68 @@
package tencent
import (
_ "embed"
"apigo.cc/gojs"
"apigo.cc/gojs/goja"
"github.com/ssgo/config"
"github.com/ssgo/u"
)
var confAes = u.NewAes([]byte("?GQ$0K0GgLdO=f+~L68PLm$uhKr4'=tV"), []byte("VFs7@sK61cj^f?HZ"))
var keysIsSet = false
func SetSSKey(key, iv []byte) {
if !keysIsSet {
confAes = u.NewAes(key, iv)
keysIsSet = true
}
}
var conf = struct {
Common *struct {
SecretId string
SecretKey string
}
Cos map[string]*struct {
Region string
Bucket string
SecretId string
SecretKey string
}
}{}
func init() {
obj := gojs.Map{
"cos": GetCos,
}
gojs.Register("apigo.cc/cloud/tencent", gojs.Module{
ObjectMaker: func(vm *goja.Runtime) gojs.Map {
config.LoadConfig("tencent", &conf)
conf.Common.SecretId = confAes.DecryptUrlBase64ToString(conf.Common.SecretId)
conf.Common.SecretKey = confAes.DecryptUrlBase64ToString(conf.Common.SecretKey)
for _, v := range conf.Cos {
v.SecretId, v.SecretKey = makeSecretIdAndKey(v.SecretId, v.SecretKey)
}
return gojs.ToMap(obj)
},
TsCode: gojs.MakeTSCode(obj),
SetSSKey: SetSSKey,
})
}
func makeSecretIdAndKey(secretId, SecretKey string) (string, string) {
if secretId != "" {
secretId = confAes.DecryptUrlBase64ToString(secretId)
} else {
secretId = conf.Common.SecretId
}
if SecretKey != "" {
SecretKey = confAes.DecryptUrlBase64ToString(SecretKey)
} else {
SecretKey = conf.Common.SecretKey
}
return secretId, SecretKey
}

23
main_test.go Normal file
View File

@ -0,0 +1,23 @@
package tencent_test
import (
"fmt"
"testing"
_ "apigo.cc/cloud/tencent"
"apigo.cc/gojs"
_ "apigo.cc/gojs/console"
"github.com/ssgo/u"
)
func TestHash(t *testing.T) {
gojs.ExportForDev()
r, err := gojs.RunFile("main_test.js")
if err != nil {
t.Fatal(err)
} else if r != true {
t.Fatal(r)
} else {
fmt.Println(u.BGreen("test succeess"))
}
}

11
main_test.js Normal file
View File

@ -0,0 +1,11 @@
import tencent from 'apigo.cc/cloud/tencent'
import co from 'apigo.cc/gojs/console'
try {
let lao = tencent.cos('lao')
co.info(JSON.stringify(lao.getToken()))
} catch (ex) {
co.error(ex)
}
return true