You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.2 KiB
Go

package upyun
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"fmt"
"pychr/global"
"strings"
"time"
)
const (
effectiveDuration = time.Minute * 30
)
type FormAPIToken struct {
Bucket string
Method string
Authorization string
XUpYunExpire int64
Policy string
Date string
}
type Policy struct {
Bucket string `json:"bucket"`
SaveKey string `json:"save-key"`
Expiration int64 `json:"expiration"`
// ContentMD5 string `json:"content-md5"`
}
func makeSaveKey() string {
return "/{year}/{mon}/{day}/upload_{random32}{.suffix}"
}
func makePolicy(bucket, saveKey string) (string, int64) {
expiration := time.Now().Add(effectiveDuration).Unix()
obj := Policy{
Bucket: bucket,
SaveKey: saveKey,
Expiration: expiration,
// ContentMD5: content-md5,
}
str, err := json.Marshal(&obj)
if err != nil {
return "", 0
}
sEnc := base64.StdEncoding.EncodeToString([]byte(str))
return sEnc, expiration
}
func md5Str(s string) string {
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
}
func makeRFC1123Date(d time.Time) string {
utc := d.UTC().Format(time.RFC1123)
return strings.Replace(utc, "UTC", "GMT", -1)
}
func base64ToStr(b []byte) string {
return base64.StdEncoding.EncodeToString(b)
}
func sign(key, secret, method, uri, date, policy, md5 string) string {
mac := hmac.New(sha1.New, []byte(secret))
elems := []string{}
for _, v := range []string{method, uri, date, policy, md5} {
if v != "" {
elems = append(elems, v)
}
}
value := strings.Join(elems, "&")
mac.Write([]byte(value))
signStr := base64ToStr(mac.Sum(nil))
return "UPYUN " + key + ":" + signStr
}
func GetUpyunToken(method, saveKey string) (r FormAPIToken, err error) {
method = strings.ToUpper(method)
date := makeRFC1123Date(time.Now())
policy, expiration := makePolicy(global.GVA_CONFIG.CDN.Bucket, saveKey)
authorization := sign(global.GVA_CONFIG.CDN.Bucket, md5Str(global.GVA_CONFIG.CDN.Password), method, "/"+global.GVA_CONFIG.CDN.Bucket, "", policy, "")
r.Bucket = global.GVA_CONFIG.CDN.Bucket
r.Method = method
r.XUpYunExpire = expiration
r.Authorization = authorization
r.Policy = policy
r.Date = date
return
}