You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
5.6 KiB
111 lines
5.6 KiB
#!/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
# project: 3月
|
|
# author: liuyu
|
|
# date: 2020/3/6
|
|
|
|
import logging
|
|
import os
|
|
import random
|
|
from urllib.parse import quote
|
|
|
|
from django.urls import reverse
|
|
from rest_framework.views import APIView
|
|
|
|
from api.models import AppReleaseInfo
|
|
from common.base.baseutils import get_profile_full_path, make_random_uuid, get_server_domain_from_request, make_resigned
|
|
from common.core.response import ApiResponse, file_response, mobileprovision_file_response
|
|
from common.core.sysconfig import Config
|
|
from common.utils.storage import Storage, get_local_storage
|
|
from common.utils.token import verify_token, make_token
|
|
from fir_ser import settings
|
|
from xsign.models import APPToDeveloper, APPSuperSignUsedInfo
|
|
from xsign.utils.supersignutils import make_sign_udid_mobile_config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_post_udid_url(request, app_obj, pwd):
|
|
server_domain = get_server_domain_from_request(request, Config.POST_UDID_DOMAIN)
|
|
p_token = make_token(app_obj.app_id, time_limit=120, key='post_udid', force_new=True)
|
|
token = f'{p_token}{"".join(random.sample(p_token, 3))}{app_obj.app_id}{"".join(random.sample(p_token, 3))}{pwd}'
|
|
logger.info(f'make udid: p_token:{p_token} app_id:{app_obj.app_id} pwd:{pwd}')
|
|
logger.info(f'make udid: token:{token}')
|
|
token = quote(token, safe='/', encoding=None, errors=None)
|
|
return f'{server_domain}{reverse("xudid", kwargs={"short": app_obj.short})}?p={token}'
|
|
|
|
|
|
class XsignDownloadView(APIView):
|
|
"""
|
|
文件下载接口,适用于本地存储和所有plist文件下载
|
|
"""
|
|
|
|
def get(self, request, filename):
|
|
down_token = request.query_params.get(settings.DATA_DOWNLOAD_KEY, None)
|
|
password = request.query_params.get('password', '')
|
|
f_type = filename.split(".")[-1]
|
|
flag = True
|
|
storage_obj = get_local_storage()
|
|
if storage_obj.download_auth_type == 1:
|
|
if not down_token:
|
|
logger.error(f"file {filename} download failed lost down_token")
|
|
return ApiResponse(code=1004, msg="缺失token")
|
|
|
|
flag = verify_token(down_token, filename)
|
|
|
|
if flag:
|
|
if f_type == 'plist':
|
|
release_id = filename.split('.')[0]
|
|
app_to_developer_obj = APPToDeveloper.objects.filter(binary_file=release_id).first()
|
|
if app_to_developer_obj:
|
|
release_obj = AppReleaseInfo.objects.filter(is_master=True,
|
|
app_id=app_to_developer_obj.app_id).first()
|
|
else:
|
|
release_obj = AppReleaseInfo.objects.filter(release_id=release_id).first()
|
|
if release_obj:
|
|
app_obj = release_obj.app_id
|
|
storage = Storage(app_obj.user_id)
|
|
bundle_id = app_obj.bundle_id
|
|
app_version = release_obj.app_version
|
|
name = app_obj.name
|
|
ios_plist_bytes = make_resigned(storage.get_download_url(filename.split('.')[0] + ".ipa"),
|
|
storage.get_download_url(release_obj.icon_url), bundle_id,
|
|
app_version, name)
|
|
return file_response(ios_plist_bytes, make_random_uuid(), "application/x-plist")
|
|
return ApiResponse(code=1004, msg="plist release_id error")
|
|
elif f_type == 'mobileconifg':
|
|
release_obj = AppReleaseInfo.objects.filter(release_id=filename.split('.')[0]).first()
|
|
if release_obj:
|
|
app_obj = release_obj.app_id
|
|
udid_url = get_post_udid_url(request, app_obj, password)
|
|
ios_udid_mobile_config = make_sign_udid_mobile_config(udid_url, app_obj.bundle_id, app_obj.name)
|
|
return file_response(ios_udid_mobile_config, make_random_uuid() + '.mobileconfig',
|
|
"application/x-apple-aspen-config")
|
|
return ApiResponse(code=1004, msg="mobile_config release_id error")
|
|
elif f_type == 'mobileprovision':
|
|
release_obj = AppReleaseInfo.objects.filter(release_id=filename.split('.')[0]).first()
|
|
if release_obj:
|
|
app_super_obj = APPSuperSignUsedInfo.objects.filter(app_id=release_obj.app_id).last()
|
|
if not app_super_obj:
|
|
app_super_obj = APPSuperSignUsedInfo.objects.last()
|
|
|
|
if not app_super_obj:
|
|
file_path = Config.DEFAULT_MOBILEPROVISION.get("supersign").get('path')
|
|
if file_path and os.path.isfile(file_path):
|
|
return mobileprovision_file_response(file_path)
|
|
else:
|
|
developer_obj = app_super_obj.developerid
|
|
file_path = get_profile_full_path(developer_obj, release_obj.app_id)
|
|
if os.path.isfile(file_path):
|
|
return mobileprovision_file_response(file_path)
|
|
else:
|
|
file_path = Config.DEFAULT_MOBILEPROVISION.get("supersign").get('path')
|
|
if file_path and os.path.isfile(file_path):
|
|
return mobileprovision_file_response(file_path)
|
|
|
|
return ApiResponse(code=1004, msg="mobile_provision release_id error")
|
|
else:
|
|
logger.warning("super sing error file type")
|
|
|
|
logger.error(f"file {filename} download failed. down_token verify failed")
|
|
return ApiResponse(code=1004, msg="token校验失败")
|
|
|