parent
6076659bf1
commit
81db86b9ef
@ -0,0 +1,151 @@ |
|||||||
|
#!/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.singals 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 |
@ -1,52 +0,0 @@ |
|||||||
#!/usr/bin/env python |
|
||||||
# -*- coding:utf-8 -*- |
|
||||||
# author: NinEveN |
|
||||||
# date: 2022/2/15 |
|
||||||
import logging |
|
||||||
|
|
||||||
from django.dispatch import Signal, receiver |
|
||||||
|
|
||||||
from api.models import AppReleaseInfo |
|
||||||
from common.core.sysconfig import Config |
|
||||||
from common.libs.storage.localApi import LocalStorage |
|
||||||
from xsign.models import AppUDID, APPToDeveloper, APPSuperSignUsedInfo |
|
||||||
|
|
||||||
logger = logging.getLogger(__name__) |
|
||||||
|
|
||||||
""" |
|
||||||
xsign 下载连接 |
|
||||||
""" |
|
||||||
|
|
||||||
xsign_app_download_url_signal = Signal(providing_args=["app_pk", "udid", "download_url_type", "limit"]) |
|
||||||
|
|
||||||
|
|
||||||
@receiver(xsign_app_download_url_signal) |
|
||||||
def xsign_app_download_url_callback(sender, **kwargs): |
|
||||||
udid = kwargs.get('udid') |
|
||||||
download_url_type = kwargs.get('download_url_type') |
|
||||||
limit = kwargs.get('limit') |
|
||||||
app_pk = kwargs.get('app_pk') |
|
||||||
|
|
||||||
local_storage = LocalStorage(**Config.IOS_PMFILE_DOWNLOAD_DOMAIN) |
|
||||||
appudid_obj = AppUDID.objects.filter(app_id_id=app_pk, udid__udid=udid, sign_status=4).last() |
|
||||||
if appudid_obj: |
|
||||||
super_sign_obj = APPSuperSignUsedInfo.objects.filter(udid__udid__udid=udid, |
|
||||||
app_id_id=app_pk, |
|
||||||
developerid__status__in=Config.DEVELOPER_USE_STATUS).last() |
|
||||||
if super_sign_obj and super_sign_obj.user_id.supersign_active: |
|
||||||
app_to_developer_obj = APPToDeveloper.objects.filter(app_id_id=app_pk, |
|
||||||
developerid=super_sign_obj.developerid).last() |
|
||||||
if app_to_developer_obj: |
|
||||||
release_obj = AppReleaseInfo.objects.filter(app_id_id=app_pk, is_master=True).last() |
|
||||||
if release_obj.release_id == app_to_developer_obj.release_file: |
|
||||||
binary_file = app_to_developer_obj.binary_file |
|
||||||
else: |
|
||||||
binary_file = app_to_developer_obj.release_file |
|
||||||
return local_storage.get_download_url( |
|
||||||
binary_file + "." + download_url_type, limit, is_xsign=True), "" |
|
||||||
else: |
|
||||||
return "", "" |
|
||||||
else: |
|
||||||
return "", "" |
|
||||||
else: |
|
||||||
return "", "" |
|
Loading…
Reference in new issue