@@ -122,21 +122,40 @@ func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[str
122122 return nil , nil , err
123123 }
124124
125+ // Get credentials from the configured credentials provider.
126+ credValues , err := c .credsProvider .Get ()
127+ if err != nil {
128+ return nil , nil , err
129+ }
130+
131+ signerType := c .signature
132+ // Check if the signature type is default, it means caller didn't
133+ // ask for anything specific signature style.. Check if the
134+ // credentials set returned the type of signature that should
135+ // be used, if not proceed to use default.
136+ if signerType == SignatureDefault && credValues .SignatureType != "" {
137+ signerType = parseSignatureType (credValues .SignatureType )
138+ }
139+
140+ sessionToken := credValues .SessionToken
141+ accessKeyID := credValues .AccessKeyID
142+ secretAccessKey := credValues .SecretAccessKey
143+
125144 // Keep time.
126145 t := time .Now ().UTC ()
127146 // For signature version '2' handle here.
128- if c . signature .isV2 () {
147+ if signerType .isV2 () {
129148 policyBase64 := p .base64 ()
130149 p .formData ["policy" ] = policyBase64
131150 // For Google endpoint set this value to be 'GoogleAccessId'.
132151 if s3utils .IsGoogleEndpoint (c .endpointURL ) {
133- p .formData ["GoogleAccessId" ] = c . accessKeyID
152+ p .formData ["GoogleAccessId" ] = accessKeyID
134153 } else {
135154 // For all other endpoints set this value to be 'AWSAccessKeyId'.
136- p .formData ["AWSAccessKeyId" ] = c . accessKeyID
155+ p .formData ["AWSAccessKeyId" ] = accessKeyID
137156 }
138157 // Sign the policy.
139- p .formData ["signature" ] = s3signer .PostPresignSignatureV2 (policyBase64 , c . secretAccessKey )
158+ p .formData ["signature" ] = s3signer .PostPresignSignatureV2 (policyBase64 , secretAccessKey )
140159 return u , p .formData , nil
141160 }
142161
@@ -159,7 +178,7 @@ func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[str
159178 }
160179
161180 // Add a credential policy.
162- credential := s3signer .GetCredential (c . accessKeyID , location , t )
181+ credential := s3signer .GetCredential (accessKeyID , location , t )
163182 if err = p .addNewPolicy (policyCondition {
164183 matchType : "eq" ,
165184 condition : "$x-amz-credential" ,
@@ -168,13 +187,27 @@ func (c Client) PresignedPostPolicy(p *PostPolicy) (u *url.URL, formData map[str
168187 return nil , nil , err
169188 }
170189
190+ if sessionToken != "" {
191+ if err = p .addNewPolicy (policyCondition {
192+ matchType : "eq" ,
193+ condition : "$x-amz-security-token" ,
194+ value : sessionToken ,
195+ }); err != nil {
196+ return nil , nil , err
197+ }
198+ }
199+
171200 // Get base64 encoded policy.
172201 policyBase64 := p .base64 ()
202+
173203 // Fill in the form data.
174204 p .formData ["policy" ] = policyBase64
175205 p .formData ["x-amz-algorithm" ] = signV4Algorithm
176206 p .formData ["x-amz-credential" ] = credential
177207 p .formData ["x-amz-date" ] = t .Format (iso8601DateFormat )
178- p .formData ["x-amz-signature" ] = s3signer .PostPresignSignatureV4 (policyBase64 , t , c .secretAccessKey , location )
208+ if sessionToken != "" {
209+ p .formData ["x-amz-security-token" ] = sessionToken
210+ }
211+ p .formData ["x-amz-signature" ] = s3signer .PostPresignSignatureV4 (policyBase64 , t , secretAccessKey , location )
179212 return u , p .formData , nil
180213}
0 commit comments