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  }