Browse Source

update test sts

lang 4 years ago
parent
commit
1ffffcc6b6
1 changed files with 94 additions and 0 deletions
  1. 94 0
      Controller/CloudStorage.py

+ 94 - 0
Controller/CloudStorage.py

@@ -97,6 +97,9 @@ class CloudStorageView(View):
         elif operation == 'getsignsts':
         elif operation == 'getsignsts':
             ip = CommonService.get_ip_address(request)
             ip = CommonService.get_ip_address(request)
             return self.do_get_sign_sts(request_dict, ip, response)
             return self.do_get_sign_sts(request_dict, ip, response)
+        elif operation == 'testgetsignsts':
+            ip = CommonService.get_ip_address(request)
+            return self.do_test_get_sign_sts(request_dict, ip, response)
             # return self.do_get_sign_sts_test(request_dict, ip, response)
             # return self.do_get_sign_sts_test(request_dict, ip, response)
         elif operation == 'storeplaylist':
         elif operation == 'storeplaylist':
             return self.do_store_playlist(request_dict, response)
             return self.do_store_playlist(request_dict, response)
@@ -421,6 +424,97 @@ class CloudStorageView(View):
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
 
 
+    def do_test_get_sign_sts(self, request_dict, ip, response):
+        uidToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJYS1daU0M1RkNKWVQxOUI3MTExQSIsImNoYW5uZWwiOjF9.YvBCETPrKknw7B-RU3Mij-WJLKf46KGrDQvZMMN7dQk'
+        reset = request_dict.get('reset', None)
+        utko = UidTokenObject(uidToken)
+        if utko.flag is False:
+            return response.json(444, 'uidToken')
+        uid = utko.UID
+        channel = utko.channel
+        print(channel)
+        print(uid)
+        now_time = int(time.time())
+        ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
+                   values("bucket__mold", "bucket__bucket", "bucket__endpoint",
+                          "bucket__region", "endTime").order_by('addTime')[:1]
+        if ubqs.exists():
+            # 亚马逊 s3 sts
+            sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
+                values("addTime", "data")
+            if sts_qs.exists():
+                endTime = int(sts_qs[0]["addTime"]) + 800
+                if reset == 0 and endTime > now_time:
+                    print(endTime)
+                    print(now_time)
+                    res = json.loads(sts_qs[0]["data"])
+                    return JsonResponse(status=200, data=res)
+                # 套餐id
+            storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+            bucket_name = ubqs[0]['bucket__bucket']
+            endpoint = ubqs[0]['bucket__endpoint']
+            region_id = ubqs[0]['bucket__region']
+
+            try:
+                aws_access_key_id = AWS_ACCESS_KEY_ID[ubqs[0]["bucket__mold"]]
+                aws_secret_access_key = AWS_SECRET_ACCESS_KEY[ubqs[0]["bucket__mold"]]
+                aws_arn = AWS_ARN[ubqs[0]["bucket__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_id
+            )
+            Policy = {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Action": "s3:*",
+                        "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                    }
+                ]
+            }
+            response = boto3_sts.get_federation_token(
+                Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
+                Policy=json.dumps(Policy),
+                DurationSeconds=900
+            )
+            ##############
+            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'],
+                'code': 0,
+                'storage': storage,
+                'endTime': ubqs[0]['endTime'],
+                'ip': ip,
+                'region': region_id,
+                'bucket_mold':ubqs[0]['bucket__mold']
+            }
+            if sts_qs.exists():
+                sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
+            else:
+                StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
+                                           addTime=now_time, type=1)
+            return JsonResponse(status=200, data=res)
+            # else:
+            #     res = {'code': 404, 'msg': 'data not exists!'}
+            #     return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+        res = {'code': 405, 'msg': 'Not purchased or expired!'}
+        return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+
     def do_query_vod_list(self, request_dict, userID, response):
     def do_query_vod_list(self, request_dict, userID, response):
         startTime = int(request_dict.get('startTime', None))
         startTime = int(request_dict.get('startTime', None))
         endTime = int(request_dict.get('endTime', None))
         endTime = int(request_dict.get('endTime', None))