|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding:utf-8 -*-
|
|
|
|
# project: 4月
|
|
|
|
# author: liuyu
|
|
|
|
# date: 2020/4/7
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
|
|
|
|
from api.models import Apps, UserInfo
|
|
|
|
from api.utils.modelutils import get_app_d_count_by_app_id, add_remote_info_from_request
|
|
|
|
from common.base.baseutils import check_app_password, get_real_ip_address
|
|
|
|
from common.cache.storage import AppDownloadTodayTimesCache, AppDownloadTimesCache, DownloadUrlCache, AppInstanceCache
|
|
|
|
from common.core.signals import xsign_app_download_url_signal
|
|
|
|
from common.core.sysconfig import Config
|
|
|
|
from common.utils.caches import consume_user_download_times
|
|
|
|
from common.utils.storage import Storage, LocalStorage
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
def get_download_url_by_cache(app_obj, filename, limit, isdownload=True, key='', udid=None):
|
|
|
|
now = time.time()
|
|
|
|
if isdownload is None:
|
|
|
|
local_storage = LocalStorage(**Config.IOS_PMFILE_DOWNLOAD_DOMAIN)
|
|
|
|
download_url_type = 'plist'
|
|
|
|
if not udid:
|
|
|
|
if app_obj.get('issupersign', None):
|
|
|
|
download_url_type = 'mobileconifg'
|
|
|
|
else:
|
|
|
|
result = xsign_app_download_url_signal.send(None, app_pk=app_obj.get('pk'), udid=udid,
|
|
|
|
download_url_type=download_url_type, limit=limit)
|
|
|
|
return result[0][1]
|
|
|
|
|
|
|
|
supersign = Config.DEFAULT_MOBILEPROVISION.get("supersign")
|
|
|
|
mobileconifg = ""
|
|
|
|
|
|
|
|
if download_url_type == 'plist':
|
|
|
|
enterprise = Config.DEFAULT_MOBILEPROVISION.get("enterprise")
|
|
|
|
mpath = enterprise.get('path', None)
|
|
|
|
murl = enterprise.get('url', None)
|
|
|
|
else:
|
|
|
|
mpath = supersign.get('path', None)
|
|
|
|
murl = supersign.get('url', None)
|
|
|
|
|
|
|
|
if murl and len(murl) > 5:
|
|
|
|
mobileconifg = murl
|
|
|
|
|
|
|
|
if mpath and os.path.isfile(mpath):
|
|
|
|
mobileconifg = local_storage.get_download_url(filename.split(".")[0] + "." + "dmobileprovision", limit)
|
|
|
|
|
|
|
|
if download_url_type == 'mobileconifg' and supersign.get("self"):
|
|
|
|
mobileconifg = local_storage.get_download_url(filename.split(".")[0] + "." + "mobileprovision", limit)
|
|
|
|
|
|
|
|
return local_storage.get_download_url(filename.split(".")[0] + "." + download_url_type, limit), mobileconifg
|
|
|
|
download_val = DownloadUrlCache(key, filename).get_storage_cache()
|
|
|
|
if download_val:
|
|
|
|
if download_val.get("time") > now - 60:
|
|
|
|
return download_val.get("download_url"), ""
|
|
|
|
else:
|
|
|
|
user_obj = UserInfo.objects.filter(pk=app_obj.get("user_id")).first()
|
|
|
|
storage = Storage(user_obj)
|
|
|
|
return storage.get_download_url(filename, limit), ""
|
|
|
|
|
|
|
|
|
|
|
|
def get_app_instance_by_cache(app_id, password, limit, udid):
|
|
|
|
if udid:
|
|
|
|
app_info = Apps.objects.filter(app_id=app_id).values("pk", 'user_id', 'type', 'password', 'issupersign',
|
|
|
|
'user_id__certification__status').first()
|
|
|
|
if app_info:
|
|
|
|
app_info['d_count'] = get_app_d_count_by_app_id(app_id)
|
|
|
|
app_password = app_info.get("password")
|
|
|
|
if not check_app_password(app_password, password):
|
|
|
|
return None
|
|
|
|
return app_info
|
|
|
|
app_instance_cache = AppInstanceCache(app_id)
|
|
|
|
app_obj_cache = app_instance_cache.get_storage_cache()
|
|
|
|
if not app_obj_cache:
|
|
|
|
app_obj_cache = Apps.objects.filter(app_id=app_id).values("pk", 'user_id', 'type', 'password',
|
|
|
|
'issupersign',
|
|
|
|
'user_id__certification__status').first()
|
|
|
|
if app_obj_cache:
|
|
|
|
app_obj_cache['d_count'] = get_app_d_count_by_app_id(app_id)
|
|
|
|
app_instance_cache.set_storage_cache(app_obj_cache, limit)
|
|
|
|
if not app_obj_cache:
|
|
|
|
return None
|
|
|
|
app_password = app_obj_cache.get("password")
|
|
|
|
|
|
|
|
if not check_app_password(app_password, password):
|
|
|
|
return None
|
|
|
|
|
|
|
|
return app_obj_cache
|
|
|
|
|
|
|
|
|
|
|
|
def set_app_today_download_times(app_id):
|
|
|
|
cache_obj = AppDownloadTodayTimesCache(app_id)
|
|
|
|
if cache_obj.get_storage_cache():
|
|
|
|
cache_obj.incr()
|
|
|
|
else:
|
|
|
|
cache_obj.set_storage_cache(1, 3600 * 24)
|
|
|
|
|
|
|
|
|
|
|
|
def set_app_download_by_cache(app_id, limit=900):
|
|
|
|
app_download_cache = AppDownloadTimesCache(app_id)
|
|
|
|
download_times = app_download_cache.get_storage_cache()
|
|
|
|
if not download_times:
|
|
|
|
download_times = Apps.objects.filter(app_id=app_id).values("count_hits").first().get('count_hits')
|
|
|
|
app_download_cache.set_storage_cache(download_times + 1, limit)
|
|
|
|
else:
|
|
|
|
app_download_cache.incr()
|
|
|
|
app_download_cache.expire(limit)
|
|
|
|
set_app_today_download_times(app_id)
|
|
|
|
return download_times + 1
|
|
|
|
|
|
|
|
|
|
|
|
def get_app_download_url(request, res, app_id, short, password, release_id, isdownload, udid):
|
|
|
|
app_obj = get_app_instance_by_cache(app_id, password, 900, udid)
|
|
|
|
if app_obj:
|
|
|
|
if app_obj.get("type") == 0:
|
|
|
|
app_type = '.apk'
|
|
|
|
download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600)
|
|
|
|
else:
|
|
|
|
app_type = '.ipa'
|
|
|
|
if isdownload:
|
|
|
|
download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600, udid=udid)
|
|
|
|
else:
|
|
|
|
download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600, isdownload,
|
|
|
|
udid=udid)
|
|
|
|
|
|
|
|
res.data = {"download_url": download_url, "extra_url": extra_url}
|
|
|
|
if download_url != "" and "mobileconifg" not in download_url:
|
|
|
|
ip = get_real_ip_address(request)
|
|
|
|
msg = f"remote ip {ip} short {short} download_url {download_url} app_obj {app_obj}"
|
|
|
|
logger.info(msg)
|
|
|
|
add_remote_info_from_request(request, msg)
|
|
|
|
set_app_download_by_cache(app_id)
|
|
|
|
amount = app_obj.get("d_count")
|
|
|
|
auth_status = False
|
|
|
|
status = app_obj.get('user_id__certification__status', None)
|
|
|
|
if status and status == 1:
|
|
|
|
auth_status = True
|
|
|
|
if not consume_user_download_times(app_obj.get("user_id"), app_id, amount, auth_status):
|
|
|
|
res.code = 1009
|
|
|
|
res.msg = "可用下载额度不足"
|
|
|
|
del res.data
|
|
|
|
return res
|
|
|
|
return res
|
|
|
|
res.code = 1006
|
|
|
|
res.msg = "该应用不存在"
|
|
|
|
return res
|