From bc205b171f5acc070b3fedf90aacda729538c16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=94=E5=A7=AC=E6=A1=91?= Date: Fri, 6 Mar 2020 17:37:26 -0500 Subject: [PATCH] =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E8=8A=82=E7=82=B9=E9=98=BB?= =?UTF-8?q?=E6=96=AD=E6=A3=80=E6=B5=8B=EF=BC=8C=E6=94=AF=E4=BB=98=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Components/NetworkDetection.php | 61 +++ app/Console/Commands/NodeBlockedDetection.php | 58 +-- app/Http/Controllers/AdminController.php | 65 ++-- app/Http/Controllers/Api/AlipayController.php | 2 +- app/Http/Controllers/Api/F2fpayController.php | 57 +-- app/Http/Controllers/CouponController.php | 35 +- app/Http/Controllers/PaymentController.php | 66 +++- app/Http/Controllers/UserController.php | 9 +- composer.lock | 215 +++++------ public/assets/geetest/gt.js | 354 ++++++++++++++++++ resources/views/admin/nodeList.blade.php | 17 + resources/views/admin/system.blade.php | 2 +- .../views/vendor/geetest/geetest.blade.php | 4 +- routes/web.php | 2 +- 14 files changed, 713 insertions(+), 234 deletions(-) create mode 100644 app/Components/NetworkDetection.php create mode 100644 public/assets/geetest/gt.js diff --git a/app/Components/NetworkDetection.php b/app/Components/NetworkDetection.php new file mode 100644 index 00000000..fb7c5205 --- /dev/null +++ b/app/Components/NetworkDetection.php @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/app/Console/Commands/NodeBlockedDetection.php b/app/Console/Commands/NodeBlockedDetection.php index 9ad4ddc3..df142938 100644 --- a/app/Console/Commands/NodeBlockedDetection.php +++ b/app/Console/Commands/NodeBlockedDetection.php @@ -2,13 +2,12 @@ namespace App\Console\Commands; -use App\Components\Curl; use App\Components\Helpers; +use App\Components\NetworkDetection; use App\Components\ServerChan; use App\Http\Models\SsNode; use App\Mail\nodeCrashWarning; use Cache; -use Exception; use Illuminate\Console\Command; use Log; use Mail; @@ -61,16 +60,15 @@ class NodeBlockedDetection extends Command } } if($node->detectionType != 1){ - $icmpCheck = $this->networkCheck($node->ip, TRUE, FALSE); + $icmpCheck = NetworkDetection::networkCheck($node->ip, TRUE); if($icmpCheck != FALSE && $icmpCheck != "通讯正常"){ $message .= "| ".$node->name." | ICMP | ".$icmpCheck." |\r\n"; $sendText = TRUE; $info = TRUE; } } - if($node->detectionType != 2){ - $tcpCheck = $this->networkCheck($node->ip, FALSE, $node->single? $node->port : FALSE); + $tcpCheck = NetworkDetection::networkCheck($node->ip, FALSE, $node->single? $node->port : NULL); if($tcpCheck != FALSE && $tcpCheck != "通讯正常"){ $message .= "| ".$node->name." | TCP | ".$tcpCheck." |\r\n"; $sendText = TRUE; @@ -124,54 +122,4 @@ class NodeBlockedDetection extends Command } ServerChan::send($title, $content); } - - /** - * 用api.50network.com进行节点阻断检测 - * - * @param string $ip 被检测的IP - * @param boolean $type true 为ICMP,false 为tcp - * @param int $port 检测端口 - * - * @return bool|string - */ - private function networkCheck($ip, $type, $port) - { - $url = 'https://api.50network.com/china-firewall/check/ip/'.($type? 'icmp/' : ($port? 'tcp_port/' : 'tcp_ack/')).$ip.($port? '/'.$port : ''); - $checkName = $type? 'ICMP' : 'TCP'; - - try{ - $ret = json_decode(Curl::send($url), TRUE); - if(!$ret){ - Log::warning("【".$checkName."阻断检测】检测".$ip."时,接口返回异常访问链接:".$url); - - return FALSE; - }elseif(!$ret['success']){ - if($ret['error'] == "execute timeout (3s)"){ - sleep(10); - - return $this->networkCheck($ip, $type, $port); - }else{ - Log::warning("【".$checkName."阻断检测】检测".$ip.($port? : '')."时,返回".json_encode($ret)); - - } - - - return FALSE; - } - } catch(Exception $e){ - Log::warning("【".$checkName."阻断检测】检测".$ip."时,接口请求超时".$e); - - return FALSE; - } - - if($ret['firewall-enable'] && $ret['firewall-disable']){ - return "通讯正常"; // 正常 - }elseif($ret['firewall-enable'] && !$ret['firewall-disable']){ - return "海外阻断"; // 国外访问异常 - }elseif(!$ret['firewall-enable'] && $ret['firewall-disable']){ - return "国内阻断"; // 被墙 - }else{ - return "机器宕机"; // 服务器宕机 - } - } } diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 63268b9c..11223cd1 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Components\Helpers; use App\Components\IPIP; +use App\Components\NetworkDetection; use App\Components\QQWry; use App\Http\Models\Article; use App\Http\Models\Config; @@ -522,33 +523,51 @@ class AdminController extends Controller // 节点列表 public function nodeList(Request $request) { - $status = $request->input('status'); + if($request->isMethod('POST')){ + $id = $request->input('id'); + $node = SsNode::query()->whereKey($id)->first(); + // 使用DDNS的node先通过gethostbyname获取ipv4地址 + if($node->is_ddns){ + $ip = gethostbyname($node->server); + if(strcmp($ip, $node->server) != 0){ + $node->ip = $ip; + }else{ + return Response::json(['status' => 'fail', 'title' => 'IP获取错误', 'message' => $node->name.'IP获取失败']); + } + } + $data[0] = NetworkDetection::networkCheck($node->ip,TRUE); //ICMP + $data[1] = NetworkDetection::networkCheck($node->ip, FALSE, $node->single? $node->port : NULL); //TCP - $query = SsNode::query(); + return Response::json(['status' => 'success', 'title' => '['.$node->name.']阻断信息', 'message'=>$data]); + }else{ + $status = $request->input('status'); - if(isset($status)){ - $query->where('status', $status); + $query = SsNode::query(); + + if(isset($status)){ + $query->where('status', $status); + } + + $nodeList = $query->orderBy('status', 'desc')->orderBy('id', 'asc')->paginate(15)->appends($request->except('page')); + foreach($nodeList as $node){ + // 在线人数 + $online_log = SsNodeOnlineLog::query()->where('node_id', $node->id)->where('log_time', '>=', strtotime("-5 minutes"))->orderBy('id', 'desc')->first(); + $node->online_users = empty($online_log)? 0 : $online_log->online_user; + + // 已产生流量 + $totalTraffic = SsNodeTrafficDaily::query()->where('node_id', $node->id)->sum('total'); + $node->transfer = flowAutoShow($totalTraffic); + + // 负载(10分钟以内) + $node_info = SsNodeInfo::query()->where('node_id', $node->id)->where('log_time', '>=', strtotime("-10 minutes"))->orderBy('id', 'desc')->first(); + $node->isOnline = empty($node_info) || empty($node_info->load)? 0 : 1; + $node->load = $node->isOnline? $node_info->load : '离线'; + $node->uptime = empty($node_info)? 0 : seconds2time($node_info->uptime); + } + + $view['nodeList'] = $nodeList; } - $nodeList = $query->orderBy('status', 'desc')->orderBy('id', 'asc')->paginate(15)->appends($request->except('page')); - foreach($nodeList as $node){ - // 在线人数 - $online_log = SsNodeOnlineLog::query()->where('node_id', $node->id)->where('log_time', '>=', strtotime("-5 minutes"))->orderBy('id', 'desc')->first(); - $node->online_users = empty($online_log)? 0 : $online_log->online_user; - - // 已产生流量 - $totalTraffic = SsNodeTrafficDaily::query()->where('node_id', $node->id)->sum('total'); - $node->transfer = flowAutoShow($totalTraffic); - - // 负载(10分钟以内) - $node_info = SsNodeInfo::query()->where('node_id', $node->id)->where('log_time', '>=', strtotime("-10 minutes"))->orderBy('id', 'desc')->first(); - $node->isOnline = empty($node_info) || empty($node_info->load)? 0 : 1; - $node->load = $node->isOnline? $node_info->load : '离线'; - $node->uptime = empty($node_info)? 0 : seconds2time($node_info->uptime); - } - - $view['nodeList'] = $nodeList; - return Response::view('admin.nodeList', $view); } diff --git a/app/Http/Controllers/Api/AlipayController.php b/app/Http/Controllers/Api/AlipayController.php index df61fcc5..71be54be 100644 --- a/app/Http/Controllers/Api/AlipayController.php +++ b/app/Http/Controllers/Api/AlipayController.php @@ -24,10 +24,10 @@ class AlipayController extends Controller { Log::info("【支付宝国际】回调接口[POST]:".var_export($request->all(), TRUE)); - $result = "fail"; $alipayNotify = new AlipayNotify(self::$systemConfig['alipay_sign_type'], self::$systemConfig['alipay_partner'], self::$systemConfig['alipay_key'], self::$systemConfig['alipay_private_key'], self::$systemConfig['alipay_public_key'], self::$systemConfig['alipay_transport']); // 验证支付宝交易 + $result = "fail"; $verify_result = $alipayNotify->verifyNotify(); if($verify_result){ // 验证成功 $result = "success"; diff --git a/app/Http/Controllers/Api/F2fpayController.php b/app/Http/Controllers/Api/F2fpayController.php index 57489627..ca61ee84 100644 --- a/app/Http/Controllers/Api/F2fpayController.php +++ b/app/Http/Controllers/Api/F2fpayController.php @@ -4,10 +4,13 @@ namespace App\Http\Controllers\Api; use App\Components\Callback; use App\Http\Controllers\Controller; +use Exception; use Illuminate\Http\Request; +use InvalidArgumentException; use Log; -use Payment\Client\Query; -use Payment\Common\PayException; +use Payment\Client; +use Payment\Exceptions\ClassNotFoundException; +use Payment\Exceptions\GatewayException; class F2fpayController extends Controller { @@ -24,32 +27,42 @@ class F2fpayController extends Controller public function store(Request $request) { Log::info("【支付宝当面付】回调接口[POST]:".var_export($request->all(), TRUE)); + $aliConfig = [ + 'use_sandbox' => FALSE, + 'app_id' => self::$systemConfig['f2fpay_app_id'], + 'sign_type' => 'RSA2', + 'ali_public_key' => self::$systemConfig['f2fpay_public_key'], + 'rsa_private_key' => self::$systemConfig['f2fpay_private_key'], + 'notify_url' => self::$systemConfig['website_url']."/api/f2fpay", // 异步回调接口 + 'return_url' => self::$systemConfig['website_url'], + ]; - $result = "fail"; + $data = [ + 'trade_no' => $request->input('out_trade_no'), + 'transaction_id' => $request->input('trade_no'), + ]; + // 使用 try{ - $verify_result = Query::run('ali_charge', [ - 'use_sandbox' => FALSE, - "partner" => self::$systemConfig['f2fpay_app_id'], - 'app_id' => self::$systemConfig['f2fpay_app_id'], - 'sign_type' => 'RSA2', - 'ali_public_key' => self::$systemConfig['f2fpay_public_key'], - 'rsa_private_key' => self::$systemConfig['f2fpay_private_key'], - 'notify_url' => self::$systemConfig['website_url']."/api/f2fpay", // 异步回调接口 - 'return_url' => self::$systemConfig['website_url'], - 'return_raw' => FALSE - ], [ - 'out_trade_no' => $request->input('out_trade_no'), - 'trade_no' => $request->input('trade_no'), - ]); - + $client = new Client(Client::ALIPAY, $aliConfig); + $verify_result = $client->tradeQuery($data); Log::info("【支付宝当面付】回调验证查询:".var_export($verify_result, TRUE)); - } catch(PayException $e){ - Log::info("【支付宝当面付】回调验证查询出错:".var_export($e->errorMessage(), TRUE)); - exit($result); + } catch(InvalidArgumentException $e){ + Log::error("【支付宝当面付】回调信息错误: ".$e->getMessage()); + exit; + } catch(GatewayException $e){ + Log::error("【支付宝当面付】建立支付错误: ".$e->getMessage()); + exit; + } catch(ClassNotFoundException $e){ + Log::error("【支付宝当面付】未知类型: ".$e->getMessage()); + exit; + } catch(Exception $e){ + Log::error("【支付宝当面付】错误: ".$e->getMessage()); + exit; } - if($verify_result['is_success'] == 'T'){ // 验证成功 + $result = "fail"; + if($verify_result['code'] == 10000 && $verify_result['msg'] == "Success"){ // 验证成功 $result = "success"; if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS'){ // 商户订单号 diff --git a/app/Http/Controllers/CouponController.php b/app/Http/Controllers/CouponController.php index 13d4fe5e..ab9f2e4b 100644 --- a/app/Http/Controllers/CouponController.php +++ b/app/Http/Controllers/CouponController.php @@ -51,7 +51,40 @@ class CouponController extends Controller public function addCoupon(Request $request) { if($request->isMethod('POST')){ - $this->validate($request, ['name' => 'required', 'type' => 'required|integer|between:1,3', 'usage' => 'required|integer|between:1,2', 'num' => 'required|integer|min:1', 'amount' => 'required_unless:type,2|numeric|min:0.01|nullable', 'discount' => 'required_if:type,2|numeric|between:1,9.9|nullable', 'available_start' => 'required|date|before_or_equal:available_end', 'available_end' => 'required|date|after_or_equal:available_start',], ['name.required' => '请填入卡券名称', 'type.required' => '请选择卡券类型', 'type.integer' => '卡券类型不合法,请重选', 'type.between' => '卡券类型不合法,请重选', 'usage.required' => '请选择卡券用途', 'usage.integer' => '卡券用途不合法,请重选', 'usage.between' => '卡券用途不合法,请重选', 'num.required' => '请填写卡券数量', 'num.integer' => '卡券数量不合法', 'num.min' => '卡券数量不合法,最小1', 'amount.required_unless' => '请填入卡券面值', 'amount.numeric' => '卡券金额不合法', 'amount.min' => '卡券金额不合法,最小0.01', 'discount.required_if' => '请填入卡券折扣', 'discount.numeric' => '卡券折扣不合法', 'discount.between' => '卡券折扣不合法,有效范围:1 ~ 9.9', 'available_start.required' => '请填入有效期', 'available_start.date' => '有效期不合法', 'available_start.before_or_equal' => '有效期不合法', 'available_end.required' => '请填入有效期', 'available_end.date' => '有效期不合法', 'available_end.after_or_equal' => '有效期不合法']); + $this->validate($request, [ + 'name' => 'required', + 'sn' => 'mail|unique:coupon', + 'type' => 'required|integer|between:1,3', + 'usage' => 'required|integer|between:1,2', + 'num' => 'required|integer|min:1', + 'amount' => 'required_unless:type,2|numeric|min:0.01|nullable', + 'discount' => 'required_if:type,2|numeric|between:1,9.9|nullable', + 'available_start' => 'required|date|before_or_equal:available_end', + 'available_end' => 'required|date|after_or_equal:available_start', + ], [ + 'name.required' => '请填入卡券名称', + 'type.required' => '请选择卡券类型', + 'type.integer' => '卡券类型不合法,请重选', + 'type.between' => '卡券类型不合法,请重选', + 'usage.required' => '请选择卡券用途', + 'usage.integer' => '卡券用途不合法,请重选', + 'usage.between' => '卡券用途不合法,请重选', + 'num.required' => '请填写卡券数量', + 'num.integer' => '卡券数量不合法', + 'num.min' => '卡券数量不合法,最小1', + 'amount.required_unless' => '请填入卡券面值', + 'amount.numeric' => '卡券金额不合法', + 'amount.min' => '卡券金额不合法,最小0.01', + 'discount.required_if' => '请填入卡券折扣', + 'discount.numeric' => '卡券折扣不合法', + 'discount.between' => '卡券折扣不合法,有效范围:1 ~ 9.9', + 'available_start.required' => '请填入有效期', + 'available_start.date' => '有效期不合法', + 'available_start.before_or_equal' => '有效期不合法', + 'available_end.required' => '请填入有效期', + 'available_end.date' => '有效期不合法', + 'available_end.after_or_equal' => '有效期不合法' + ]); $type = $request->input('type'); diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index 5beb4200..ddf01fad 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -15,8 +15,11 @@ use Auth; use DB; use Exception; use Illuminate\Http\Request; +use InvalidArgumentException; use Log; -use Payment\Client\Charge; +use Payment\Client; +use Payment\Exceptions\ClassNotFoundException; +use Payment\Exceptions\GatewayException; use Response; use Validator; @@ -31,7 +34,7 @@ class PaymentController extends Controller { use Callback; -// 创建支付订单 + // 创建支付订单 public function create(Request $request) { $goods_id = $request->input('goods_id'); @@ -151,23 +154,52 @@ class PaymentController extends Controller $pay_way = 2; // TODO:goods表里增加一个字段用于自定义商品付款时展示的商品名称, // TODO:这里增加一个随机商品列表,根据goods的价格随机取值 - $result = Charge::run("ali_qr", [ - 'use_sandbox' => FALSE, - "partner" => self::$systemConfig['f2fpay_app_id'], + + $aliConfig = [ + 'use_sandbox' => FALSE, // 是否使用沙盒模式 'app_id' => self::$systemConfig['f2fpay_app_id'], - 'sign_type' => 'RSA2', + 'sign_type' => 'RSA2', // RSA RSA2 'ali_public_key' => self::$systemConfig['f2fpay_public_key'], 'rsa_private_key' => self::$systemConfig['f2fpay_private_key'], - 'notify_url' => self::$systemConfig['website_url']."/api/f2fpay", // 异步回调接口 + 'limit_pay' => [ + //'balance',// 余额 + //'moneyFund',// 余额宝 + //'debitCardExpress',// 借记卡快捷 + //'creditCard',//信用卡 + //'creditCardExpress',// 信用卡快捷 + //'creditCardCartoon',//信用卡卡通 + //'credit_group',// 信用支付类型(包含信用卡卡通、信用卡快捷、花呗、花呗分期) + ], // 用户不可用指定渠道支付当有多个渠道时用“,”分隔 + 'notify_url' => self::$systemConfig['website_url']."/api/f2fpay", 'return_url' => self::$systemConfig['website_url'], - 'return_raw' => FALSE - ], - [ - 'body' => '', - 'subject' => self::$systemConfig['f2fpay_subject_name'], - 'order_no' => $orderSn, - 'amount' => $amount, - ]); + 'fee_type' => 'CNY', // 货币类型 当前仅支持该字段 + ]; + + $payData = [ + 'body' => '', + 'subject' => self::$systemConfig['f2fpay_subject_name']? : self::$systemConfig['website_name'], + 'trade_no' => $orderSn, + 'time_expire' => time()+9000, // 表示必须 1000s 内付款 + 'amount' => $amount, // 单位为元 ,最小为0.01 + ]; + + try{ + $client = new Client(Client::ALIPAY, $aliConfig); + $result = $client->pay(Client::ALI_CHANNEL_QR, $payData); + } catch(InvalidArgumentException $e){ + Log::error("【支付宝当面付】输入信息错误: ".$e->getMessage()); + exit; + } catch(GatewayException $e){ + Log::error("【支付宝当面付】建立支付错误: ".$e->getMessage()." | ".var_dump($e->getRaw())); + exit; + } catch(ClassNotFoundException $e){ + Log::error("【支付宝当面付】未知类型: ".$e->getMessage()); + exit; + } catch(Exception $e){ + Log::error("【支付宝当面付】错误: ".$e->getMessage()); + exit; + } + }else{ return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:未知支付类型']); } @@ -182,8 +214,8 @@ class PaymentController extends Controller if(self::$systemConfig['is_alipay'] && $pay_type == 4){ $payment->qr_code = $result; }elseif(self::$systemConfig['is_f2fpay'] && $pay_type == 5){ - $payment->qr_code = $result; - $payment->qr_url = 'http://qr.topscan.com/api.php?text='.$result.'&bg=ffffff&fg=000000&pt=1c73bd&m=10&w=400&el=1&inpt=1eabfc&logo=https://t.alipayobjects.com/tfscom/T1Z5XfXdxmXXXXXXXX.png'; + $payment->qr_code = $result['qr_code']; + $payment->qr_url = 'http://qr.topscan.com/api.php?text='.$result['qr_code'].'&bg=ffffff&fg=000000&pt=1c73bd&m=10&w=400&el=1&inpt=1eabfc&logo=https://t.alipayobjects.com/tfscom/T1Z5XfXdxmXXXXXXXX.png'; //后备:https://cli.im/api/qrcode/code?text=".$result['qr_code']."&mhid=5EfGCwztyckhMHcmI9ZcOKs $payment->qr_local_url = $payment->qr_url; } $payment->status = 0; diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 4a7e8a49..828f1786 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -585,17 +585,18 @@ class UserController extends Controller //付费用户判断 $view['not_paying_user'] = Order::uid()->where('status', 2)->where('is_expire', 0)->where('origin_amount', '>', 0)->doesntExist(); //客户端安装 - $view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/clients/ipa.plist'; - $view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/ipa.plist'; + $view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/clients/Shadowrocket.plist'; + $view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/clients/Quantumult.plist'; // 订阅连接 $subscribe = UserSubscribe::query()->where('user_id', Auth::user()->id)->first(); $view['subscribe_status'] = $subscribe->status; $subscribe_link = (self::$systemConfig['subscribe_domain']? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url']).'/s/'.$subscribe->code; $view['link'] = $subscribe_link; + $view['subscribe_link'] ='sub://'.base64url_encode($subscribe_link); $view['Shadowrocket_link'] = 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(self::$systemConfig['website_name'].'-'.self::$systemConfig['website_url']); $view['Shadowrocket_linkQrcode'] = 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(self::$systemConfig['website_name']); - $view['Quantumult_linkOut'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/Rejection.conf'); - $view['Quantumult_linkIn'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/BacktoCN.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/Rejection.conf'); + $view['Quantumult_linkOut'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf'); + $view['Quantumult_linkIn'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/BacktoCN.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf'); return Response::view('user.help', $view); } diff --git a/composer.lock b/composer.lock index 3dcbbef5..905e7003 100644 --- a/composer.lock +++ b/composer.lock @@ -481,16 +481,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", - "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", "shasum": "", "mirrors": [ { @@ -543,7 +543,7 @@ "spdx", "validator" ], - "time": "2019-07-29T10:31:59+00:00" + "time": "2020-02-14T07:44:31+00:00" }, { "name": "composer/xdebug-handler", @@ -1105,16 +1105,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.15", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "e834eea5306d85d67de5a05db5882911d5b29357" + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e834eea5306d85d67de5a05db5882911d5b29357", - "reference": "e834eea5306d85d67de5a05db5882911d5b29357", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", "shasum": "", "mirrors": [ { @@ -1165,7 +1165,7 @@ "validation", "validator" ], - "time": "2020-01-20T21:40:59+00:00" + "time": "2020-02-13T22:36:52+00:00" }, { "name": "erusev/parsedown", @@ -1274,16 +1274,16 @@ }, { "name": "fideloper/proxy", - "version": "4.2.2", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "790194d5d3da89a713478875d2e2d05855a90a81" + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/790194d5d3da89a713478875d2e2d05855a90a81", - "reference": "790194d5d3da89a713478875d2e2d05855a90a81", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", "shasum": "", "mirrors": [ { @@ -1293,11 +1293,11 @@ ] }, "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0", + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", "php": ">=5.4.0" }, "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0", + "illuminate/http": "^5.0|^6.0|^7.0|^8.0", "mockery/mockery": "^1.0", "phpunit/phpunit": "^6.0" }, @@ -1330,7 +1330,7 @@ "proxy", "trusted proxy" ], - "time": "2019-12-20T13:11:11+00:00" + "time": "2020-02-22T01:51:47+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1827,16 +1827,16 @@ }, { "name": "jaybizzle/crawler-detect", - "version": "v1.2.92", + "version": "v1.2.93", "source": { "type": "git", "url": "https://github.com/JayBizzle/Crawler-Detect.git", - "reference": "eb167049d7de1e5320138186b9dcb2e5f9df260d" + "reference": "608ec84bdf85fa8200c0f36f455483698b450ecd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/eb167049d7de1e5320138186b9dcb2e5f9df260d", - "reference": "eb167049d7de1e5320138186b9dcb2e5f9df260d", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/608ec84bdf85fa8200c0f36f455483698b450ecd", + "reference": "608ec84bdf85fa8200c0f36f455483698b450ecd", "shasum": "", "mirrors": [ { @@ -1878,7 +1878,7 @@ "crawlerdetect", "php crawler detect" ], - "time": "2020-02-07T20:28:07+00:00" + "time": "2020-02-16T12:34:48+00:00" }, { "name": "jenssegers/agent", @@ -2029,16 +2029,16 @@ }, { "name": "laravel/framework", - "version": "v5.8.36", + "version": "v5.8.37", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "ccf857af50897eda43ceaf12e318cf214e0e4e95" + "reference": "ce08aaee3a0b8bb58b459b2decf7f25ba7b10fa4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/ccf857af50897eda43ceaf12e318cf214e0e4e95", - "reference": "ccf857af50897eda43ceaf12e318cf214e0e4e95", + "url": "https://api.github.com/repos/laravel/framework/zipball/ce08aaee3a0b8bb58b459b2decf7f25ba7b10fa4", + "reference": "ce08aaee3a0b8bb58b459b2decf7f25ba7b10fa4", "shasum": "", "mirrors": [ { @@ -2179,7 +2179,7 @@ "framework", "laravel" ], - "time": "2019-12-17T16:00:14+00:00" + "time": "2020-02-14T14:29:11+00:00" }, { "name": "laravel/tinker", @@ -2998,16 +2998,16 @@ }, { "name": "nesbot/carbon", - "version": "2.29.1", + "version": "2.30.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2" + "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e509be5bf2d703390e69e14496d9a1168452b0a2", - "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/912dff66d2690ca66abddb9b291a1df5f371d3b4", + "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4", "shasum": "", "mirrors": [ { @@ -3070,7 +3070,7 @@ "datetime", "time" ], - "time": "2020-01-21T09:36:43+00:00" + "time": "2020-02-07T15:25:46+00:00" }, { "name": "nikic/php-parser", @@ -3916,16 +3916,16 @@ }, { "name": "ramsey/uuid", - "version": "3.9.2", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "7779489a47d443f845271badbdcedfe4df8e06fb" + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7779489a47d443f845271badbdcedfe4df8e06fb", - "reference": "7779489a47d443f845271badbdcedfe4df8e06fb", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", "shasum": "", "mirrors": [ { @@ -4005,7 +4005,7 @@ "identifier", "uuid" ], - "time": "2019-12-17T08:18:51+00:00" + "time": "2020-02-21T04:36:14+00:00" }, { "name": "rap2hpoutre/laravel-log-viewer", @@ -4192,16 +4192,16 @@ }, { "name": "seld/phar-utils", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "84715761c35808076b00908a20317a3a8a67d17e" + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/84715761c35808076b00908a20317a3a8a67d17e", - "reference": "84715761c35808076b00908a20317a3a8a67d17e", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", "shasum": "", "mirrors": [ { @@ -4236,22 +4236,22 @@ ], "description": "PHAR file format utilities, for when PHP phars you up", "keywords": [ - "phra" + "phar" ], - "time": "2020-01-13T10:41:09+00:00" + "time": "2020-02-14T15:25:33+00:00" }, { "name": "spatie/laravel-permission", - "version": "3.6.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "0a063ce206c7545737d19c1beda12003fc66e4e9" + "reference": "2339b6fae8f8aa5af047e1a0c54b6fb37546058a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/0a063ce206c7545737d19c1beda12003fc66e4e9", - "reference": "0a063ce206c7545737d19c1beda12003fc66e4e9", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/2339b6fae8f8aa5af047e1a0c54b6fb37546058a", + "reference": "2339b6fae8f8aa5af047e1a0c54b6fb37546058a", "shasum": "", "mirrors": [ { @@ -4312,7 +4312,7 @@ "security", "spatie" ], - "time": "2020-01-17T16:18:51+00:00" + "time": "2020-02-18T21:16:24+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -5125,16 +5125,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", + "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", "shasum": "", "mirrors": [ { @@ -5152,7 +5152,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5185,20 +5185,20 @@ "polyfill", "portable" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36" + "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/a019efccc03f1a335af6b4f20c30f5ea8060be36", - "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/926832ce51059bb58211b7b2080a88e0c3b5328e", + "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e", "shasum": "", "mirrors": [ { @@ -5216,7 +5216,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5250,20 +5250,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a", + "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a", "shasum": "", "mirrors": [ { @@ -5275,7 +5275,7 @@ "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -5283,7 +5283,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5318,20 +5318,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-01-17T12:01:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", + "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", "shasum": "", "mirrors": [ { @@ -5349,7 +5349,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5383,20 +5383,20 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", + "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", "shasum": "", "mirrors": [ { @@ -5411,7 +5411,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5444,20 +5444,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/5e66a0fa1070bf46bec4bea7962d285108edd675", + "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675", "shasum": "", "mirrors": [ { @@ -5472,7 +5472,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -5508,7 +5508,7 @@ "portable", "shim" ], - "time": "2019-11-27T16:25:15+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/process", @@ -6666,16 +6666,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/a48807183a4b819072f26e347bbd0b5199a9d15f", + "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f", "shasum": "", "mirrors": [ { @@ -6685,28 +6685,25 @@ ] }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpdocumentor/type-resolver": "0.4.*", - "phpunit/phpunit": "^6.4" + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6717,10 +6714,14 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-12-28T18:55:12+00:00" + "time": "2020-02-09T09:16:15+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -7950,16 +7951,16 @@ }, { "name": "webmozart/assert", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" + "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", - "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", + "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", + "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", "shasum": "", "mirrors": [ { @@ -8000,7 +8001,7 @@ "check", "validate" ], - "time": "2019-11-24T13:36:37+00:00" + "time": "2020-02-14T12:15:55+00:00" } ], "aliases": [], diff --git a/public/assets/geetest/gt.js b/public/assets/geetest/gt.js new file mode 100644 index 00000000..ab793308 --- /dev/null +++ b/public/assets/geetest/gt.js @@ -0,0 +1,354 @@ +"v0.4.8 Geetest Inc."; + +(function (window) { + "use strict"; + if (typeof window === 'undefined') { + throw new Error('Geetest requires browser environment'); + } + +var document = window.document; +var Math = window.Math; +var head = document.getElementsByTagName("head")[0]; + +function _Object(obj) { + this._obj = obj; +} + +_Object.prototype = { + _each: function (process) { + var _obj = this._obj; + for (var k in _obj) { + if (_obj.hasOwnProperty(k)) { + process(k, _obj[k]); + } + } + return this; + } +}; + +function Config(config) { + var self = this; + new _Object(config)._each(function (key, value) { + self[key] = value; + }); +} + +Config.prototype = { + api_server: 'api.geetest.com', + protocol: 'http://', + typePath: '/gettype.php', + fallback_config: { + slide: { + static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"], + type: 'slide', + slide: '/static/js/geetest.0.0.0.js' + }, + fullpage: { + static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"], + type: 'fullpage', + fullpage: '/static/js/fullpage.0.0.0.js' + } + }, + _get_fallback_config: function () { + var self = this; + if (isString(self.type)) { + return self.fallback_config[self.type]; + } else if (self.new_captcha) { + return self.fallback_config.fullpage; + } else { + return self.fallback_config.slide; + } + }, + _extend: function (obj) { + var self = this; + new _Object(obj)._each(function (key, value) { + self[key] = value; + }) + } +}; +var isNumber = function (value) { + return (typeof value === 'number'); +}; +var isString = function (value) { + return (typeof value === 'string'); +}; +var isBoolean = function (value) { + return (typeof value === 'boolean'); +}; +var isObject = function (value) { + return (typeof value === 'object' && value !== null); +}; +var isFunction = function (value) { + return (typeof value === 'function'); +}; +var MOBILE = /Mobi/i.test(navigator.userAgent); +var pt = MOBILE ? 3 : 0; + +var callbacks = {}; +var status = {}; + +var nowDate = function () { + var date = new Date(); + var year = date.getFullYear(); + var month = date.getMonth() + 1; + var day = date.getDate(); + var hours = date.getHours(); + var minutes = date.getMinutes(); + var seconds = date.getSeconds(); + + if (month >= 1 && month <= 9) { + month = '0' + month; + } + if (day >= 0 && day <= 9) { + day = '0' + day; + } + if (hours >= 0 && hours <= 9) { + hours = '0' + hours; + } + if (minutes >= 0 && minutes <= 9) { + minutes = '0' + minutes; + } + if (seconds >= 0 && seconds <= 9) { + seconds = '0' + seconds; + } + var currentdate = year + '-' + month + '-' + day + " " + hours + ":" + minutes + ":" + seconds; + return currentdate; +} + +var random = function () { + return parseInt(Math.random() * 10000) + (new Date()).valueOf(); +}; + +var loadScript = function (url, cb) { + var script = document.createElement("script"); + script.charset = "UTF-8"; + script.async = true; + + // 对geetest的静态资源添加 crossOrigin + if ( /static\.geetest\.com/g.test(url)) { + script.crossOrigin = "anonymous"; + } + + script.onerror = function () { + cb(true); + }; + var loaded = false; + script.onload = script.onreadystatechange = function () { + if (!loaded && + (!script.readyState || + "loaded" === script.readyState || + "complete" === script.readyState)) { + + loaded = true; + setTimeout(function () { + cb(false); + }, 0); + } + }; + script.src = url; + head.appendChild(script); +}; + +var normalizeDomain = function (domain) { + // special domain: uems.sysu.edu.cn/jwxt/geetest/ + // return domain.replace(/^https?:\/\/|\/.*$/g, ''); uems.sysu.edu.cn + return domain.replace(/^https?:\/\/|\/$/g, ''); // uems.sysu.edu.cn/jwxt/geetest +}; +var normalizePath = function (path) { + path = path.replace(/\/+/g, '/'); + if (path.indexOf('/') !== 0) { + path = '/' + path; + } + return path; +}; +var normalizeQuery = function (query) { + if (!query) { + return ''; + } + var q = '?'; + new _Object(query)._each(function (key, value) { + if (isString(value) || isNumber(value) || isBoolean(value)) { + q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&'; + } + }); + if (q === '?') { + q = ''; + } + return q.replace(/&$/, ''); +}; +var makeURL = function (protocol, domain, path, query) { + domain = normalizeDomain(domain); + + var url = normalizePath(path) + normalizeQuery(query); + if (domain) { + url = protocol + domain + url; + } + + return url; +}; + +var load = function (config, send, protocol, domains, path, query, cb) { + var tryRequest = function (at) { + + var url = makeURL(protocol, domains[at], path, query); + loadScript(url, function (err) { + if (err) { + if (at >= domains.length - 1) { + cb(true); + // report gettype error + if (send) { + config.error_code = 508; + var url = protocol + domains[at] + path; + reportError(config, url); + } + } else { + tryRequest(at + 1); + } + } else { + cb(false); + } + }); + }; + tryRequest(0); +}; + + +var jsonp = function (domains, path, config, callback) { + if (isObject(config.getLib)) { + config._extend(config.getLib); + callback(config); + return; + } + if (config.offline) { + callback(config._get_fallback_config()); + return; + } + + var cb = "geetest_" + random(); + window[cb] = function (data) { + if (data.status == 'success') { + callback(data.data); + } else if (!data.status) { + callback(data); + } else { + callback(config._get_fallback_config()); + } + window[cb] = undefined; + try { + delete window[cb]; + } catch (e) { + } + }; + load(config, true, config.protocol, domains, path, { + gt: config.gt, + callback: cb + }, function (err) { + if (err) { + callback(config._get_fallback_config()); + } + }); +}; + +var reportError = function (config, url) { + load(config, false, config.protocol, ['monitor.geetest.com'], '/monitor/send', { + time: nowDate(), + captcha_id: config.gt, + challenge: config.challenge, + pt: pt, + exception_url: url, + error_code: config.error_code + }, function (err) {}) +} + +var throwError = function (errorType, config) { + var errors = { + networkError: '网络错误', + gtTypeError: 'gt字段不是字符串类型' + }; + if (typeof config.onError === 'function') { + config.onError(errors[errorType]); + } else { + throw new Error(errors[errorType]); + } +}; + +var detect = function () { + return window.Geetest || document.getElementById("gt_lib"); +}; + +if (detect()) { + status.slide = "loaded"; +} + +window.initGeetest = function (userConfig, callback) { + + var config = new Config(userConfig); + + if (userConfig.https) { + config.protocol = 'https://'; + } else if (!userConfig.protocol) { + config.protocol = window.location.protocol + '//'; + } + + // for KFC + if (userConfig.gt === '050cffef4ae57b5d5e529fea9540b0d1' || + userConfig.gt === '3bd38408ae4af923ed36e13819b14d42') { + config.apiserver = 'yumchina.geetest.com/'; // for old js + config.api_server = 'yumchina.geetest.com'; + } + + if(userConfig.gt){ + window.GeeGT = userConfig.gt + } + + if(userConfig.challenge){ + window.GeeChallenge = userConfig.challenge + } + + if (isObject(userConfig.getType)) { + config._extend(userConfig.getType); + } + jsonp([config.api_server || config.apiserver], config.typePath, config, function (newConfig) { + var type = newConfig.type; + var init = function () { + config._extend(newConfig); + callback(new window.Geetest(config)); + }; + + callbacks[type] = callbacks[type] || []; + var s = status[type] || 'init'; + if (s === 'init') { + status[type] = 'loading'; + + callbacks[type].push(init); + + load(config, true, config.protocol, newConfig.static_servers || newConfig.domains, newConfig[type] || newConfig.path, null, function (err) { + if (err) { + status[type] = 'fail'; + throwError('networkError', config); + } else { + status[type] = 'loaded'; + var cbs = callbacks[type]; + for (var i = 0, len = cbs.length; i < len; i = i + 1) { + var cb = cbs[i]; + if (isFunction(cb)) { + cb(); + } + } + callbacks[type] = []; + } + }); + } else if (s === "loaded") { + init(); + } else if (s === "fail") { + throwError('networkError', config); + } else if (s === "loading") { + callbacks[type].push(init); + } + }); + +}; + + +})(window); + diff --git a/resources/views/admin/nodeList.blade.php b/resources/views/admin/nodeList.blade.php index 54bee445..60db3f6c 100644 --- a/resources/views/admin/nodeList.blade.php +++ b/resources/views/admin/nodeList.blade.php @@ -1,6 +1,11 @@ @extends('admin.layouts') @section('css') + @endsection @section('content')
@@ -62,6 +67,7 @@
+ @@ -92,6 +98,17 @@ - + +

{{trans('auth.captcha_loading')}}

@define use Illuminate\Support\Facades\Config diff --git a/routes/web.php b/routes/web.php index 202f6f7f..9ee57b98 100644 --- a/routes/web.php +++ b/routes/web.php @@ -26,7 +26,7 @@ Route::group(['middleware' => ['isForbidden', 'isLogin', 'isAdmin']], function() Route::post('admin/delUser', 'AdminController@delUser'); // 删除账号 Route::post('admin/batchAddUsers', 'AdminController@batchAddUsers'); // 批量生成账号 Route::get('admin/exportSSJson', 'AdminController@exportSSJson'); // 导出原版SS的json配置信息 - Route::get('admin/nodeList', 'AdminController@nodeList'); // 节点列表 + Route::any('admin/nodeList', 'AdminController@nodeList'); // 节点列表 Route::any('admin/addNode', 'AdminController@addNode'); // 添加节点 Route::any('admin/editNode', 'AdminController@editNode'); // 编辑节点 Route::post('admin/delNode', 'AdminController@delNode'); // 删除节点