PreSignV2 - presign the request in following style. https://${S3_BUCKET}.s3.amazonaws.com/${S3_OBJECT}?AWSAccessKeyId=${S3_ACCESS_KEY}&Expires=${TIMESTAMP}&Signature=${SIGNATURE}.
(req http.Request, accessKeyID, secretAccessKey string, expires int64, virtualHost bool)
| 58 | // PreSignV2 - presign the request in following style. |
| 59 | // https://${S3_BUCKET}.s3.amazonaws.com/${S3_OBJECT}?AWSAccessKeyId=${S3_ACCESS_KEY}&Expires=${TIMESTAMP}&Signature=${SIGNATURE}. |
| 60 | func PreSignV2(req http.Request, accessKeyID, secretAccessKey string, expires int64, virtualHost bool) *http.Request { |
| 61 | // Presign is not needed for anonymous credentials. |
| 62 | if accessKeyID == "" || secretAccessKey == "" { |
| 63 | return &req |
| 64 | } |
| 65 | |
| 66 | d := time.Now().UTC() |
| 67 | // Find epoch expires when the request will expire. |
| 68 | epochExpires := d.Unix() + expires |
| 69 | |
| 70 | // Add expires header if not present. |
| 71 | if expiresStr := req.Header.Get("Expires"); expiresStr == "" { |
| 72 | req.Header.Set("Expires", strconv.FormatInt(epochExpires, 10)) |
| 73 | } |
| 74 | |
| 75 | // Get presigned string to sign. |
| 76 | stringToSign := preStringToSignV2(req, virtualHost) |
| 77 | hm := hmac.New(sha1.New, []byte(secretAccessKey)) |
| 78 | hm.Write([]byte(stringToSign)) |
| 79 | |
| 80 | // Calculate signature. |
| 81 | signature := base64.StdEncoding.EncodeToString(hm.Sum(nil)) |
| 82 | |
| 83 | query := req.URL.Query() |
| 84 | // Handle specially for Google Cloud Storage. |
| 85 | if strings.Contains(getHostAddr(&req), ".storage.googleapis.com") { |
| 86 | query.Set("GoogleAccessId", accessKeyID) |
| 87 | } else { |
| 88 | query.Set("AWSAccessKeyId", accessKeyID) |
| 89 | } |
| 90 | |
| 91 | // Fill in Expires for presigned query. |
| 92 | query.Set("Expires", strconv.FormatInt(epochExpires, 10)) |
| 93 | |
| 94 | // Encode query and save. |
| 95 | req.URL.RawQuery = s3utils.QueryEncode(query) |
| 96 | |
| 97 | // Save signature finally. |
| 98 | req.URL.RawQuery += "&Signature=" + s3utils.EncodePath(signature) |
| 99 | |
| 100 | // Return. |
| 101 | return &req |
| 102 | } |
| 103 | |
| 104 | // PostPresignSignatureV2 - presigned signature for PostPolicy |
| 105 | // request. |