425 lines
16 KiB
Python
425 lines
16 KiB
Python
|
|
#coding: utf-8
|
||
|
|
#-------------------------------------------------------------------
|
||
|
|
# YakPanel
|
||
|
|
#-------------------------------------------------------------------
|
||
|
|
# Copyright (c) 2015-2019 YakPanel(www.yakpanel.com) All rights reserved.
|
||
|
|
#-------------------------------------------------------------------
|
||
|
|
# Author: hwliang <hwl@yakpanel.com>
|
||
|
|
#-------------------------------------------------------------------
|
||
|
|
|
||
|
|
#------------------------------
|
||
|
|
# AUTH验证接口
|
||
|
|
#------------------------------
|
||
|
|
|
||
|
|
import public,time,json,os,requests
|
||
|
|
try:
|
||
|
|
from YakPanel import cache, session
|
||
|
|
except:
|
||
|
|
pass
|
||
|
|
|
||
|
|
class panelAuth:
|
||
|
|
__product_list_path = 'data/product_list.pl'
|
||
|
|
__product_bay_path = 'data/product_bay.pl'
|
||
|
|
__product_id = '100000011'
|
||
|
|
__official_url = '{}'.format(public.OfficialApiBase())
|
||
|
|
# __official_url = 'http://dev.yakpanel.com'
|
||
|
|
|
||
|
|
def create_serverid(self, get):
|
||
|
|
try:
|
||
|
|
return public.get_userinfo()
|
||
|
|
except:
|
||
|
|
return public.return_msg_gettext(False, public.lang("Please login with account first"))
|
||
|
|
|
||
|
|
|
||
|
|
def create_plugin_other_order(self,get):
|
||
|
|
pdata = self.create_serverid(get)
|
||
|
|
pdata['pid'] = get.pid
|
||
|
|
pdata['cycle'] = get.cycle
|
||
|
|
p_url = public.GetConfigValue('home') + '/api/Pluginother/create_order'
|
||
|
|
if get.type == '1':
|
||
|
|
pdata['renew'] = 1
|
||
|
|
p_url = public.GetConfigValue('home') + '/api/Pluginother/renew_order'
|
||
|
|
return json.loads(public.httpPost(p_url,pdata))
|
||
|
|
|
||
|
|
def get_order_stat(self,get):
|
||
|
|
pdata = self.create_serverid(get)
|
||
|
|
pdata['order_id'] = get.oid
|
||
|
|
p_url = public.GetConfigValue('home') + '/api/Pluginother/order_stat'
|
||
|
|
if get.type == '1': p_url = public.GetConfigValue('home') + '/api/Pluginother/re_order_stat'
|
||
|
|
return json.loads(public.httpPost(p_url,pdata))
|
||
|
|
|
||
|
|
def check_serverid(self,get):
|
||
|
|
if get.serverid != self.create_serverid(get): return False
|
||
|
|
return True
|
||
|
|
|
||
|
|
def get_plugin_price(self, get):
|
||
|
|
try:
|
||
|
|
userPath = 'data/userInfo.json'
|
||
|
|
if not 'pluginName' in get and not 'product_id' in get: return public.return_msg_gettext(False, public.lang("Parameter ERROR!"))
|
||
|
|
if not os.path.exists(userPath): return public.return_msg_gettext(False, public.lang("Please login with account first"))
|
||
|
|
params = {}
|
||
|
|
if not hasattr(get,'product_id'):
|
||
|
|
params['product_id'] = self.get_plugin_info(get.pluginName)['id']
|
||
|
|
else:
|
||
|
|
params['product_id'] = get.product_id
|
||
|
|
data = self.send_cloud('{}/api/product/pricesV3'.format(self.__official_url), params)
|
||
|
|
if not data:
|
||
|
|
return public.return_msg_gettext(False, public.lang("Please log in to your YakPanel account on the panel first!"))
|
||
|
|
if not data['success']:
|
||
|
|
return public.return_msg_gettext(False,data['msg'])
|
||
|
|
# if len(data['res']) == 6:
|
||
|
|
# return data['res'][3:]
|
||
|
|
return data['res']
|
||
|
|
except:
|
||
|
|
del(session['get_product_list'])
|
||
|
|
return public.return_msg_gettext(False,'Syncing information, please try again!\n {}',(public.get_error_info(),))
|
||
|
|
|
||
|
|
def get_plugin_info(self,pluginName):
|
||
|
|
data = self.get_business_plugin(None)
|
||
|
|
if not data: return None
|
||
|
|
for d in data:
|
||
|
|
if d['name'] == pluginName: return d
|
||
|
|
return None
|
||
|
|
|
||
|
|
def get_plugin_list(self,get):
|
||
|
|
try:
|
||
|
|
if not session.get('get_product_bay') or not os.path.exists(self.__product_bay_path):
|
||
|
|
data = self.send_cloud('get_order_list_byuser', {})
|
||
|
|
if data: public.writeFile(self.__product_bay_path,json.dumps(data))
|
||
|
|
session['get_product_bay'] = True
|
||
|
|
data = json.loads(public.readFile(self.__product_bay_path))
|
||
|
|
return data
|
||
|
|
except: return None
|
||
|
|
|
||
|
|
def get_buy_code(self,get):
|
||
|
|
cycle = getattr(get,'cycle',1)
|
||
|
|
params = {}
|
||
|
|
params['cycle'] = cycle
|
||
|
|
params['cycle_unit'] = get.cycle_unit
|
||
|
|
params['product_id'] = get.pid
|
||
|
|
params['src'] = 2
|
||
|
|
params['trigger_entry'] = get.source
|
||
|
|
params['pay_channel'] = 2
|
||
|
|
# 0.管理后台生成 1.Ping++ 2.Stripe 3.Paypal 10.抵扣券
|
||
|
|
if hasattr(get, 'pay_channel'):
|
||
|
|
params['pay_channel'] = get.pay_channel
|
||
|
|
params['charge_type'] = get.charge_type
|
||
|
|
env_info = public.fetch_env_info()
|
||
|
|
params['environment_info'] = json.dumps(env_info)
|
||
|
|
params['server_id'] = env_info['install_code']
|
||
|
|
# 多机购买 数量
|
||
|
|
if not hasattr(get, 'num'):
|
||
|
|
return public.return_msg_gettext(False, public.lang("parameter error: num"))
|
||
|
|
params['num'] = get.num
|
||
|
|
|
||
|
|
# 添加购买来源
|
||
|
|
# params['source'] = get.source
|
||
|
|
|
||
|
|
data = self.send_cloud('{}/api/order/product/create'.format(self.__official_url), params)
|
||
|
|
if not data['success']:
|
||
|
|
return public.return_msg_gettext(False, data['res'])
|
||
|
|
return data['res']
|
||
|
|
|
||
|
|
def get_stripe_session_id(self,get):
|
||
|
|
|
||
|
|
params = {}
|
||
|
|
if hasattr(get, 'order_no'):
|
||
|
|
params['order_no'] = get.order_no
|
||
|
|
if hasattr(get, 'order_id'):
|
||
|
|
params['order_id'] = get.order_id
|
||
|
|
|
||
|
|
if hasattr(get, 'subscribe'):
|
||
|
|
params['subscribe'] = get.subscribe
|
||
|
|
|
||
|
|
if not params.get('order_no', None) and not params.get('order_id', None):
|
||
|
|
return public.return_msg_gettext(False, public.lang("parameter error"))
|
||
|
|
|
||
|
|
data = self.send_cloud('{}/api/order/product/pay'.format(self.__official_url), params)
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
return data['res']
|
||
|
|
# paypal支付
|
||
|
|
def get_paypal_session_id(self,get):
|
||
|
|
|
||
|
|
params = {}
|
||
|
|
if hasattr(get, 'oid'):
|
||
|
|
params['oid'] = get.oid
|
||
|
|
|
||
|
|
if not params.get('oid', None):
|
||
|
|
return public.return_msg_gettext(False, public.lang("parameter error"))
|
||
|
|
|
||
|
|
data = self.send_cloud('{}/api/paypal/create_order'.format(self.__official_url), params)
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
data2 = {
|
||
|
|
"status": data.get("success", False),
|
||
|
|
"res": data.get("res", ""),
|
||
|
|
"nonce": data.get("nonce", 0),
|
||
|
|
}
|
||
|
|
|
||
|
|
return data2
|
||
|
|
|
||
|
|
# paypal 支付确认
|
||
|
|
def check_paypal_status(self,get):
|
||
|
|
|
||
|
|
params = {}
|
||
|
|
if hasattr(get, 'paypal_order_id'):
|
||
|
|
params['paypal_order_id'] = get.paypal_order_id
|
||
|
|
|
||
|
|
if not params.get('paypal_order_id', None):
|
||
|
|
return public.return_msg_gettext(False, public.lang("parameter error"))
|
||
|
|
|
||
|
|
|
||
|
|
data = self.send_cloud('{}/api/paypal/capture_order'.format(self.__official_url), params)
|
||
|
|
# session['focre_cloud'] = True
|
||
|
|
data2 = {
|
||
|
|
"status": data.get("success", False),
|
||
|
|
"res": data.get("res", ""),
|
||
|
|
"nonce": data.get("nonce", 0),
|
||
|
|
}
|
||
|
|
|
||
|
|
return data2
|
||
|
|
|
||
|
|
|
||
|
|
def check_pay_status(self,get):
|
||
|
|
params = {}
|
||
|
|
params['id'] = get.id
|
||
|
|
data = self.send_cloud('check_product_pays', params)
|
||
|
|
if not data: return public.return_msg_gettext(False, public.lang("Fail to connect to the server!"))
|
||
|
|
if data['status'] == True:
|
||
|
|
self.flush_pay_status(get)
|
||
|
|
if 'get_product_bay' in session: del(session['get_product_bay'])
|
||
|
|
return data
|
||
|
|
|
||
|
|
def flush_pay_status(self,get):
|
||
|
|
if 'get_product_bay' in session: del(session['get_product_bay'])
|
||
|
|
data = self.get_plugin_list(get)
|
||
|
|
if not data: return public.return_msg_gettext(False, public.lang("Fail to connect to the server!"))
|
||
|
|
return public.return_msg_gettext(True, public.lang("Flush status success"))
|
||
|
|
|
||
|
|
def get_renew_code(self):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def check_renew_code(self):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def get_business_plugin(self,get):
|
||
|
|
try:
|
||
|
|
if not session.get('get_product_list') or not os.path.exists(self.__product_list_path):
|
||
|
|
data = self.send_cloud('{}/api/product/chargeProducts'.format(self.__official_url), {})
|
||
|
|
if data['success']: public.writeFile(self.__product_list_path,json.dumps(data['res']))
|
||
|
|
session['get_product_list'] = True
|
||
|
|
data = json.loads(public.readFile(self.__product_list_path))
|
||
|
|
return data
|
||
|
|
except: return None
|
||
|
|
|
||
|
|
def get_ad_list(self):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def check_plugin_end(self):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def get_re_order_status_plugin(self,get):
|
||
|
|
params = {}
|
||
|
|
params['pid'] = getattr(get,'pid',0)
|
||
|
|
data = self.send_cloud('get_re_order_status', params)
|
||
|
|
if not data: return public.return_msg_gettext(False, public.lang("Fail to connect to the server!"))
|
||
|
|
if data['status'] == True:
|
||
|
|
self.flush_pay_status(get)
|
||
|
|
if 'get_product_bay' in session: del(session['get_product_bay'])
|
||
|
|
return data
|
||
|
|
|
||
|
|
def get_voucher_plugin(self,get):
|
||
|
|
params = {}
|
||
|
|
params['product_id'] = getattr(get,'pid',0)
|
||
|
|
params['status'] = '0'
|
||
|
|
data = self.send_cloud('{}/api/user/productVouchers'.format(self.__official_url), params)
|
||
|
|
if not data: return []
|
||
|
|
return data['res']
|
||
|
|
|
||
|
|
def create_order_voucher_plugin(self,get):
|
||
|
|
cycle = getattr(get,'cycle','1')
|
||
|
|
params = {}
|
||
|
|
params['cycle'] = cycle
|
||
|
|
params['cycle_unit'] = get.cycle_unit
|
||
|
|
params['coupon_id'] = get.coupon_id
|
||
|
|
params['src'] = 2
|
||
|
|
params['pay_channel'] = 10
|
||
|
|
params['charge_type'] = get.charge_type
|
||
|
|
env_info = public.fetch_env_info()
|
||
|
|
params['environment_info'] = json.dumps(env_info)
|
||
|
|
params['server_id'] = env_info['install_code']
|
||
|
|
data = self.send_cloud('{}/api/order/product/create'.format(self.__official_url), params)
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
if data['success']:
|
||
|
|
return public.return_msg_gettext(True, public.lang("Activate successfully"))
|
||
|
|
return public.return_msg_gettext(False, public.lang("Activate failed"))
|
||
|
|
|
||
|
|
def send_cloud(self,cloudURL,params):
|
||
|
|
try:
|
||
|
|
userInfo = self.create_serverid(None)
|
||
|
|
if 'token' not in userInfo:
|
||
|
|
return None
|
||
|
|
url_headers = {"Content-Type": "application/json",
|
||
|
|
"authorization": "bt {}".format(userInfo['token'])
|
||
|
|
}
|
||
|
|
resp = requests.post(cloudURL, params =params, headers=url_headers)
|
||
|
|
resp = resp.json()
|
||
|
|
if not resp['res']: return None
|
||
|
|
return resp
|
||
|
|
except: return public.get_error_info()
|
||
|
|
|
||
|
|
def send_cloud_pro(self,module,params):
|
||
|
|
try:
|
||
|
|
cloudURL = '{}/api/order/product/'.format(self.__official_url)
|
||
|
|
userInfo = self.create_serverid(None)
|
||
|
|
params['os'] = 'Linux'
|
||
|
|
if 'status' in userInfo:
|
||
|
|
params['server_id'] = ''
|
||
|
|
else:
|
||
|
|
params['server_id'] = userInfo['server_id']
|
||
|
|
url_headers = {"authorization": "bt {}".format(userInfo['token'])}
|
||
|
|
resp = requests.post(cloudURL, params=params, headers=url_headers)
|
||
|
|
resp = resp.json()['res']
|
||
|
|
if not resp: return None
|
||
|
|
return resp
|
||
|
|
except: return None
|
||
|
|
|
||
|
|
def get_voucher(self,get):
|
||
|
|
params = {}
|
||
|
|
params['product_id'] = self.__product_id
|
||
|
|
params['status'] = '0'
|
||
|
|
data = self.send_cloud_pro('get_voucher', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
def get_order_status(self,get):
|
||
|
|
params = {}
|
||
|
|
data = self.send_cloud_pro('get_order_status', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
|
||
|
|
def get_product_discount_by(self,get):
|
||
|
|
params = {}
|
||
|
|
data = self.send_cloud_pro('get_product_discount_by', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
def get_re_order_status(self,get):
|
||
|
|
params = {}
|
||
|
|
data = self.send_cloud_pro('get_re_order_status', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
def create_order_voucher(self,get):
|
||
|
|
code = getattr(get,'code','1')
|
||
|
|
params = {}
|
||
|
|
params['code'] = code
|
||
|
|
data = self.send_cloud_pro('create_order_voucher', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
def create_order(self,get):
|
||
|
|
cycle = getattr(get,'cycle','1')
|
||
|
|
params = {}
|
||
|
|
params['cycle'] = cycle
|
||
|
|
params['cycle'] = 'month'
|
||
|
|
params['product_id'] = 100000012
|
||
|
|
params['src'] = 2
|
||
|
|
params['pay_channel'] = 2
|
||
|
|
params['charge_type'] = 1
|
||
|
|
params['environment_info'] = json.dumps(public.fetch_env_info())
|
||
|
|
data = self.send_cloud_pro('create', params)
|
||
|
|
return data
|
||
|
|
|
||
|
|
# def fetch_env_info(self):
|
||
|
|
# userInfo = self.create_serverid(None)
|
||
|
|
# return json.dumps({'ip': public.GetLocalIp(),
|
||
|
|
# 'is_ipv6': 0,
|
||
|
|
# 'os': 'Centos7',
|
||
|
|
# 'mac': self.get_mac_address(),
|
||
|
|
# 'hdid': public.fetch_disk_SN(),
|
||
|
|
# 'ramid': '16G',
|
||
|
|
# 'cpuid': public.fetch_cpu_ID(),
|
||
|
|
# 'server_name': self.get_hostname(),
|
||
|
|
# 'install_code': userInfo['server_id']
|
||
|
|
# })
|
||
|
|
|
||
|
|
def get_cpuname(self):
|
||
|
|
return public.ExecShell("cat /proc/cpuinfo|grep 'model name'|cut -d : -f2")[0].strip()
|
||
|
|
|
||
|
|
def get_product_auth(self,get):
|
||
|
|
params = {}
|
||
|
|
params['page'] = get.page if 'page' in get else 1
|
||
|
|
params['pageSize'] = get.pageSize if 'pageSize' in get else 15
|
||
|
|
data = self.send_cloud('{}/api/user/productAuthorizes'.format(self.__official_url), params)
|
||
|
|
if not data:
|
||
|
|
return []
|
||
|
|
if not data['success']: return []
|
||
|
|
data = data['res']
|
||
|
|
# return [i for i in data['list'] if i['status'] != 'activated' and get.pid == i['product_id']]
|
||
|
|
res = list()
|
||
|
|
for i in data['list']:
|
||
|
|
if i['status'] != 'activated' and str(get.pid) == str(i['product_id']):
|
||
|
|
res.append(i)
|
||
|
|
return res
|
||
|
|
|
||
|
|
def auth_activate(self,get):
|
||
|
|
params = {}
|
||
|
|
params['serial_no'] = get.serial_no
|
||
|
|
params['environment_info'] = json.dumps(public.fetch_env_info())
|
||
|
|
data = self.send_cloud('{}/api/authorize/product/activate'.format(self.__official_url), params)
|
||
|
|
if not data['success']: return public.return_msg_gettext(False, public.lang("Activate Failed"))
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
return public.return_msg_gettext(True, public.lang("Activate successfully"))
|
||
|
|
|
||
|
|
def renew_product_auth(self,get):
|
||
|
|
params = {}
|
||
|
|
params['serial_no'] = get.serial_no
|
||
|
|
params['pay_channel'] = get.pay_channel
|
||
|
|
params['cycle'] = get.cycle
|
||
|
|
params['cycle_unit'] = get.cycle_unit
|
||
|
|
params['src'] = 2
|
||
|
|
params['trigger_entry'] = get.source
|
||
|
|
params['environment_info'] = json.dumps(public.fetch_env_info())
|
||
|
|
if hasattr(get,'coupon_id') and get.pay_channel == '10':
|
||
|
|
params['coupon_id'] = get.coupon_id
|
||
|
|
data = self.send_cloud('{}/api/authorize/product/renew'.format(self.__official_url), params)
|
||
|
|
|
||
|
|
if not data['success']:
|
||
|
|
data['res'] = 'Invalid authorize OR authorize not found!'
|
||
|
|
return data
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
# 使用抵扣券续费直接返回续费结果
|
||
|
|
if get.pay_channel == '10':
|
||
|
|
if not data['success']:
|
||
|
|
return public.return_msg_gettext(False, public.lang("Renew Failed"))
|
||
|
|
return public.return_msg_gettext(True, public.lang("Renew successfully"))
|
||
|
|
# 使用支付续费返回stripe的请求数据
|
||
|
|
return data['res']
|
||
|
|
|
||
|
|
def free_trial(self,get):
|
||
|
|
"""
|
||
|
|
每个账号有一次免费试用专业版15天的机会
|
||
|
|
:return:
|
||
|
|
"""
|
||
|
|
params = {}
|
||
|
|
params['environment_info'] = json.dumps(public.fetch_env_info())
|
||
|
|
data = self.send_cloud('{}/api/product/obtainProfessionalMemberFree'.format(self.__official_url), params)
|
||
|
|
session['focre_cloud'] = True
|
||
|
|
# 使用抵扣券续费直接返回续费结果
|
||
|
|
if not data['success']:
|
||
|
|
return public.return_msg_gettext(False, public.lang("Apply Failed"))
|
||
|
|
return public.return_msg_gettext(True, public.lang("Apply successfully"))
|
||
|
|
|
||
|
|
# 获取专业版特权信息 或插件信息?
|
||
|
|
def get_plugin_remarks(self, get):
|
||
|
|
|
||
|
|
if not hasattr(get, 'product_id'):
|
||
|
|
return public.return_msg_gettext(False, public.lang("product_id Parameter ERROR!"))
|
||
|
|
product_id = get.product_id
|
||
|
|
|
||
|
|
ikey = 'plugin_remarks' + product_id
|
||
|
|
if ikey in session:
|
||
|
|
return session.get(ikey)
|
||
|
|
url = '{}/api/panel/get_advantages/{}'.format(self.__official_url, product_id)
|
||
|
|
data = requests.get(url).json()
|
||
|
|
# public.print_log(" ###############%%%%%%%%%%%%%%%%%%%% {}".format(data))
|
||
|
|
if not data: return public.returnMsg(False, public.lang("Failed to connect to the server!"))
|
||
|
|
session[ikey] = data
|
||
|
|
return data
|