| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | #!/usr/bin/env python3# -*- coding: utf-8 -*-import hashlibimport jsonimport timeimport uuidimport boto3from django.http import HttpResponse, JsonResponsefrom django.views import Viewfrom Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARNfrom Controller.DeviceConfirmRegion import Device_Regionfrom Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \    SerialNumberModelfrom Object.IOTCore.IotObject import IOTClientfrom Object.ResponseObject import ResponseObjectfrom Service.CommonService import CommonServiceclass S3GetStsView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.GET        operation = kwargs.get('operation', None)        return self.validate(operation, request_dict, request)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.POST        operation = kwargs.get('operation', None)        return self.validate(operation, request_dict, request)    def validate(self, operation, request_dict, request):        response = ResponseObject()        if operation == 'ota':            return self.ota(request_dict, response, request)        else:            return response.json(404)    # 授权ota升级s3预签名    def ota(self, request_dict, response, request):        mold = request_dict.get('mold', None)  #0国内, 1国外        region_name = request_dict.get('region_name', None)        bucket_name = request_dict.get('bucket_name', None)        endpoint = request_dict.get('endpoint', None)        filepath = request_dict.get('filepath', None)        role_name = request_dict.get('jobname', None)        mold = int(mold)        try:            aws_access_key_id = AWS_ACCESS_KEY_ID[mold]            aws_secret_access_key = AWS_SECRET_ACCESS_KEY[mold]            aws_arn = AWS_ARN[mold]        except:            res = {'code': 404, 'msg': 'mold not exists!'}            return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")        ###############        boto3_sts = boto3.client(            'sts',            aws_access_key_id=aws_access_key_id,            aws_secret_access_key=aws_secret_access_key,            region_name=region_name        )        Policy = {            "Version": "2012-10-17",            "Statement": [                {                    "Effect": "Allow",                    "Action": "s3:*",                    "Resource": ["{aws_arn}:::{bucket_name}/{filepath}*".                                     format(aws_arn=aws_arn, bucket_name=bucket_name, filepath=filepath)]                }            ]        }        response = boto3_sts.get_federation_token(            Name='{role_name}'.format(role_name=role_name),            Policy=json.dumps(Policy),            DurationSeconds=7200        )        ##############        res = {            'AccessKeyId': response['Credentials']['AccessKeyId'],            'AccessKeySecret': response['Credentials']['SecretAccessKey'],            'SessionToken': response['Credentials']['SessionToken'],            'Expiration': response['Credentials']['Expiration'],            'expire': 900,            'endpoint': endpoint,            'bucket_name': bucket_name,            'arn': response['FederatedUser']['Arn'],            'region': region_name,            'bucket_mold': mold        }        return JsonResponse(status=200, data=res)
 |