github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/obs/temporary_other.go (about) 1 package obs 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 "time" 8 ) 9 10 func (obsClient ObsClient) CreateBrowserBasedSignature(input *CreateBrowserBasedSignatureInput) (output *CreateBrowserBasedSignatureOutput, err error) { 11 if input == nil { 12 return nil, errors.New("CreateBrowserBasedSignatureInput is nil") 13 } 14 15 params := make(map[string]string, len(input.FormParams)) 16 for key, value := range input.FormParams { 17 params[key] = value 18 } 19 20 date := time.Now().UTC() 21 shortDate := date.Format(SHORT_DATE_FORMAT) 22 longDate := date.Format(LONG_DATE_FORMAT) 23 24 credential, _ := getCredential(obsClient.conf.securityProvider.ak, obsClient.conf.region, shortDate) 25 26 if input.Expires <= 0 { 27 input.Expires = 300 28 } 29 30 expiration := date.Add(time.Second * time.Duration(input.Expires)).Format(ISO8601_DATE_FORMAT) 31 params[PARAM_ALGORITHM_AMZ_CAMEL] = V4_HASH_PREFIX 32 params[PARAM_CREDENTIAL_AMZ_CAMEL] = credential 33 params[PARAM_DATE_AMZ_CAMEL] = longDate 34 35 if obsClient.conf.securityProvider.securityToken != "" { 36 if obsClient.conf.signature == SignatureObs { 37 params[HEADER_STS_TOKEN_OBS] = obsClient.conf.securityProvider.securityToken 38 } else { 39 params[HEADER_STS_TOKEN_AMZ] = obsClient.conf.securityProvider.securityToken 40 } 41 } 42 43 matchAnyBucket := true 44 matchAnyKey := true 45 count := 5 46 if bucket := strings.TrimSpace(input.Bucket); bucket != "" { 47 params["bucket"] = bucket 48 matchAnyBucket = false 49 count-- 50 } 51 52 if key := strings.TrimSpace(input.Key); key != "" { 53 params["key"] = key 54 matchAnyKey = false 55 count-- 56 } 57 58 originPolicySlice := make([]string, 0, len(params)+count) 59 originPolicySlice = append(originPolicySlice, fmt.Sprintf("{\"expiration\":\"%s\",", expiration)) 60 originPolicySlice = append(originPolicySlice, "\"conditions\":[") 61 for key, value := range params { 62 if _key := strings.TrimSpace(strings.ToLower(key)); _key != "" { 63 originPolicySlice = append(originPolicySlice, fmt.Sprintf("{\"%s\":\"%s\"},", _key, value)) 64 } 65 } 66 67 if matchAnyBucket { 68 originPolicySlice = append(originPolicySlice, "[\"starts-with\", \"$bucket\", \"\"],") 69 } 70 71 if matchAnyKey { 72 originPolicySlice = append(originPolicySlice, "[\"starts-with\", \"$key\", \"\"],") 73 } 74 75 originPolicySlice = append(originPolicySlice, "]}") 76 77 originPolicy := strings.Join(originPolicySlice, "") 78 policy := Base64Encode([]byte(originPolicy)) 79 signature := getSignature(policy, obsClient.conf.securityProvider.sk, obsClient.conf.region, shortDate) 80 81 output = &CreateBrowserBasedSignatureOutput{ 82 OriginPolicy: originPolicy, 83 Policy: policy, 84 Algorithm: params[PARAM_ALGORITHM_AMZ_CAMEL], 85 Credential: params[PARAM_CREDENTIAL_AMZ_CAMEL], 86 Date: params[PARAM_DATE_AMZ_CAMEL], 87 Signature: signature, 88 } 89 return 90 }