| 564 | REQUIRES_IDENTITY_CACHE = True |
| 565 | |
| 566 | def add_auth(self, request): |
| 567 | datetime_now = datetime.datetime.utcnow() |
| 568 | request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP) |
| 569 | |
| 570 | fields = {} |
| 571 | if request.context.get('s3-presign-post-fields', None) is not None: |
| 572 | fields = request.context['s3-presign-post-fields'] |
| 573 | |
| 574 | policy = {} |
| 575 | conditions = [] |
| 576 | if request.context.get('s3-presign-post-policy', None) is not None: |
| 577 | policy = request.context['s3-presign-post-policy'] |
| 578 | if policy.get('conditions', None) is not None: |
| 579 | conditions = policy['conditions'] |
| 580 | |
| 581 | policy['conditions'] = conditions |
| 582 | |
| 583 | fields['x-amz-algorithm'] = 'AWS4-HMAC-SHA256' |
| 584 | fields['x-amz-credential'] = self.scope(request) |
| 585 | fields['x-amz-date'] = request.context['timestamp'] |
| 586 | |
| 587 | conditions.append({'x-amz-algorithm': 'AWS4-HMAC-SHA256'}) |
| 588 | conditions.append({'x-amz-credential': self.scope(request)}) |
| 589 | conditions.append({'x-amz-date': request.context['timestamp']}) |
| 590 | |
| 591 | if self.credentials.token is not None: |
| 592 | fields['X-Amz-S3session-Token'] = self.credentials.token |
| 593 | conditions.append( |
| 594 | {'X-Amz-S3session-Token': self.credentials.token} |
| 595 | ) |
| 596 | |
| 597 | # Dump the base64 encoded policy into the fields dictionary. |
| 598 | fields['policy'] = base64.b64encode( |
| 599 | json.dumps(policy).encode('utf-8') |
| 600 | ).decode('utf-8') |
| 601 | |
| 602 | fields['x-amz-signature'] = self.signature(fields['policy'], request) |
| 603 | |
| 604 | request.context['s3-presign-post-fields'] = fields |
| 605 | request.context['s3-presign-post-policy'] = policy |
| 606 | |
| 607 | |
| 608 | class S3ExpressQueryAuth(S3ExpressAuth): |