UserController.php 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624
  1. <?php
  2. namespace App\Controllers;
  3. use App\Services\{
  4. Auth,
  5. Mail,
  6. Config,
  7. Payment
  8. };
  9. use App\Models\{
  10. Ip,
  11. Ann,
  12. Code,
  13. Node,
  14. Shop,
  15. User,
  16. Token,
  17. Relay,
  18. Bought,
  19. Coupon,
  20. Ticket,
  21. Payback,
  22. BlockIp,
  23. LoginIp,
  24. UnblockIp,
  25. Speedtest,
  26. DetectLog,
  27. DetectRule,
  28. TrafficLog,
  29. InviteCode,
  30. EmailVerify,
  31. UserSubscribeLog
  32. };
  33. use App\Utils\{
  34. GA,
  35. Pay,
  36. URL,
  37. Hash,
  38. Check,
  39. QQWry,
  40. Tools,
  41. Cookie,
  42. Geetest,
  43. Telegram,
  44. ClientProfiles,
  45. DatatablesHelper,
  46. TelegramSessionManager
  47. };
  48. use voku\helper\AntiXSS;
  49. use Exception;
  50. use Ramsey\Uuid\Uuid;
  51. /**
  52. * HomeController
  53. */
  54. class UserController extends BaseController
  55. {
  56. public function index($request, $response, $args)
  57. {
  58. $ssr_sub_token = LinkController::GenerateSSRSubCode($this->user->id);
  59. $GtSdk = null;
  60. $recaptcha_sitekey = null;
  61. if ($_ENV['enable_checkin_captcha'] == true) {
  62. switch ($_ENV['captcha_provider']) {
  63. case 'recaptcha':
  64. $recaptcha_sitekey = $_ENV['recaptcha_sitekey'];
  65. break;
  66. case 'geetest':
  67. $uid = time() . random_int(1, 10000);
  68. $GtSdk = Geetest::get($uid);
  69. break;
  70. }
  71. }
  72. $Ann = Ann::orderBy('date', 'desc')->first();
  73. if ($_ENV['subscribe_client_url'] != '') {
  74. $getClient = new Token();
  75. for ($i = 0; $i < 10; $i++) {
  76. $token = $this->user->id . Tools::genRandomChar(16);
  77. $Elink = Token::where('token', '=', $token)->first();
  78. if ($Elink == null) {
  79. $getClient->token = $token;
  80. break;
  81. }
  82. }
  83. $getClient->user_id = $this->user->id;
  84. $getClient->create_time = time();
  85. $getClient->expire_time = time() + 10 * 60;
  86. $getClient->save();
  87. } else {
  88. $token = '';
  89. }
  90. return $this->view()
  91. ->assign('ssr_sub_token', $ssr_sub_token)
  92. ->assign('display_ios_class', $_ENV['display_ios_class'])
  93. ->assign('display_ios_topup', $_ENV['display_ios_topup'])
  94. ->assign('ios_account', $_ENV['ios_account'])
  95. ->assign('ios_password', $_ENV['ios_password'])
  96. ->assign('ann', $Ann)
  97. ->assign('geetest_html', $GtSdk)
  98. ->assign('mergeSub', $_ENV['mergeSub'])
  99. ->assign('subUrl', $_ENV['subUrl'])
  100. ->registerClass('URL', URL::class)
  101. ->assign('recaptcha_sitekey', $recaptcha_sitekey)
  102. ->assign('subInfo', LinkController::getSubinfo($this->user, 0))
  103. ->assign('getClient', $token)
  104. ->display('user/index.tpl');
  105. }
  106. public function lookingglass($request, $response, $args)
  107. {
  108. $Speedtest = Speedtest::where('datetime', '>', time() - $_ENV['Speedtest_duration'] * 3600)->orderBy('datetime', 'desc')->get();
  109. return $this->view()->assign('speedtest', $Speedtest)->assign('hour', $_ENV['Speedtest_duration'])->display('user/lookingglass.tpl');
  110. }
  111. public function code($request, $response, $args)
  112. {
  113. $pageNum = $request->getQueryParams()['page'] ?? 1;
  114. $codes = Code::where('type', '<>', '-2')->where('userid', '=', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  115. $codes->setPath('/user/code');
  116. $render = Tools::paginate_render($codes);
  117. return $this->view()
  118. ->assign('codes', $codes)
  119. ->assign('pmw', Payment::purchaseHTML())
  120. ->assign('render', $render)
  121. ->display('user/code.tpl');
  122. }
  123. public function donate($request, $response, $args)
  124. {
  125. if ($_ENV['enable_donate'] != true) {
  126. exit(0);
  127. }
  128. $pageNum = $request->getQueryParams()['page'] ?? 1;
  129. $codes = Code::where(
  130. static function ($query) {
  131. $query->where('type', '=', -1)
  132. ->orWhere('type', '=', -2);
  133. }
  134. )->where('isused', 1)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  135. $codes->setPath('/user/donate');
  136. $render = Tools::paginate_render($codes);
  137. return $this->view()
  138. ->assign('codes', $codes)
  139. ->assign('total_in', Code::where('isused', 1)->where('type', -1)->sum('number'))
  140. ->assign('total_out', Code::where('isused', 1)->where('type', -2)->sum('number'))
  141. ->assign('render', $render)
  142. ->display('user/donate.tpl');
  143. }
  144. public function isHTTPS()
  145. {
  146. define('HTTPS', false);
  147. if (defined('HTTPS') && HTTPS) {
  148. return true;
  149. }
  150. if (!isset($_SERVER)) {
  151. return false;
  152. }
  153. if (!isset($_SERVER['HTTPS'])) {
  154. return false;
  155. }
  156. if ($_SERVER['HTTPS'] === 1) { //Apache
  157. return true;
  158. }
  159. if ($_SERVER['HTTPS'] === 'on') { //IIS
  160. return true;
  161. }
  162. if ($_SERVER['SERVER_PORT'] == 443) { //其他
  163. return true;
  164. }
  165. return false;
  166. }
  167. public function code_check($request, $response, $args)
  168. {
  169. $time = $request->getQueryParams()['time'];
  170. $codes = Code::where('userid', '=', $this->user->id)->where('usedatetime', '>', date('Y-m-d H:i:s', $time))->first();
  171. if ($codes != null && strpos($codes->code, '充值') !== false) {
  172. $res['ret'] = 1;
  173. return $response->getBody()->write(json_encode($res));
  174. }
  175. $res['ret'] = 0;
  176. return $response->getBody()->write(json_encode($res));
  177. }
  178. public function f2fpayget($request, $response, $args)
  179. {
  180. $time = $request->getQueryParams()['time'];
  181. $res['ret'] = 1;
  182. return $response->getBody()->write(json_encode($res));
  183. }
  184. public function f2fpay($request, $response, $args)
  185. {
  186. $amount = $request->getParam('amount');
  187. if ($amount == '') {
  188. $res['ret'] = 0;
  189. $res['msg'] = '订单金额错误:' . $amount;
  190. return $response->getBody()->write(json_encode($res));
  191. }
  192. $user = $this->user;
  193. //生成二维码
  194. $qrPayResult = Pay::alipay_get_qrcode($user, $amount, $qrPay);
  195. // 根据状态值进行业务处理
  196. switch ($qrPayResult->getTradeStatus()) {
  197. case 'SUCCESS':
  198. $aliresponse = $qrPayResult->getResponse();
  199. $res['ret'] = 1;
  200. $res['msg'] = '二维码生成成功';
  201. $res['amount'] = $amount;
  202. $res['qrcode'] = $qrPay->create_erweima($aliresponse->qr_code);
  203. break;
  204. case 'FAILED':
  205. $res['ret'] = 0;
  206. $res['msg'] = '支付宝创建订单二维码失败! 请使用其他方式付款。';
  207. break;
  208. case 'UNKNOWN':
  209. $res['ret'] = 0;
  210. $res['msg'] = '系统异常,状态未知! 请使用其他方式付款。';
  211. break;
  212. default:
  213. $res['ret'] = 0;
  214. $res['msg'] = '创建订单二维码返回异常! 请使用其他方式付款。';
  215. break;
  216. }
  217. return $response->getBody()->write(json_encode($res));
  218. }
  219. public function alipay($request, $response, $args)
  220. {
  221. $amount = $request->getQueryParams()['amount'];
  222. Pay::getGen($this->user, $amount);
  223. }
  224. public function codepost($request, $response, $args)
  225. {
  226. $code = $request->getParam('code');
  227. $code = trim($code);
  228. $user = $this->user;
  229. if ($code == '') {
  230. $res['ret'] = 0;
  231. $res['msg'] = '非法输入';
  232. return $response->getBody()->write(json_encode($res));
  233. }
  234. $codeq = Code::where('code', '=', $code)->where('isused', '=', 0)->first();
  235. if ($codeq == null) {
  236. $res['ret'] = 0;
  237. $res['msg'] = '此充值码错误';
  238. return $response->getBody()->write(json_encode($res));
  239. }
  240. $codeq->isused = 1;
  241. $codeq->usedatetime = date('Y-m-d H:i:s');
  242. $codeq->userid = $user->id;
  243. $codeq->save();
  244. if ($codeq->type == -1) {
  245. $user->money += $codeq->number;
  246. $user->save();
  247. if ($user->ref_by != '' && $user->ref_by != 0 && $user->ref_by != null) {
  248. $gift_user = User::where('id', '=', $user->ref_by)->first();
  249. $gift_user->money += ($codeq->number * ($_ENV['code_payback'] / 100));
  250. $gift_user->save();
  251. $Payback = new Payback();
  252. $Payback->total = $codeq->number;
  253. $Payback->userid = $this->user->id;
  254. $Payback->ref_by = $this->user->ref_by;
  255. $Payback->ref_get = $codeq->number * ($_ENV['code_payback'] / 100);
  256. $Payback->datetime = time();
  257. $Payback->save();
  258. }
  259. $res['ret'] = 1;
  260. $res['msg'] = '充值成功,充值的金额为' . $codeq->number . '元。';
  261. if ($_ENV['enable_donate'] == true) {
  262. if ($this->user->is_hide == 1) {
  263. Telegram::Send('姐姐姐姐,一位不愿透露姓名的大老爷给我们捐了 ' . $codeq->number . ' 元呢~');
  264. } else {
  265. Telegram::Send('姐姐姐姐,' . $this->user->user_name . ' 大老爷给我们捐了 ' . $codeq->number . ' 元呢~');
  266. }
  267. }
  268. return $response->getBody()->write(json_encode($res));
  269. }
  270. if ($codeq->type == 10001) {
  271. $user->transfer_enable += $codeq->number * 1024 * 1024 * 1024;
  272. $user->save();
  273. }
  274. if ($codeq->type == 10002) {
  275. if (time() > strtotime($user->expire_in)) {
  276. $user->expire_in = date('Y-m-d H:i:s', time() + $codeq->number * 86400);
  277. } else {
  278. $user->expire_in = date('Y-m-d H:i:s', strtotime($user->expire_in) + $codeq->number * 86400);
  279. }
  280. $user->save();
  281. }
  282. if ($codeq->type >= 1 && $codeq->type <= 10000) {
  283. if ($user->class == 0 || $user->class != $codeq->type) {
  284. $user->class_expire = date('Y-m-d H:i:s', time());
  285. $user->save();
  286. }
  287. $user->class_expire = date('Y-m-d H:i:s', strtotime($user->class_expire) + $codeq->number * 86400);
  288. $user->class = $codeq->type;
  289. $user->save();
  290. }
  291. }
  292. public function GaCheck($request, $response, $args)
  293. {
  294. $code = $request->getParam('code');
  295. $user = $this->user;
  296. if ($code == '') {
  297. $res['ret'] = 0;
  298. $res['msg'] = '二维码不能为空';
  299. return $response->getBody()->write(json_encode($res));
  300. }
  301. $ga = new GA();
  302. $rcode = $ga->verifyCode($user->ga_token, $code);
  303. if (!$rcode) {
  304. $res['ret'] = 0;
  305. $res['msg'] = '测试错误';
  306. return $response->getBody()->write(json_encode($res));
  307. }
  308. $res['ret'] = 1;
  309. $res['msg'] = '测试成功';
  310. return $response->getBody()->write(json_encode($res));
  311. }
  312. public function GaSet($request, $response, $args)
  313. {
  314. $enable = $request->getParam('enable');
  315. $user = $this->user;
  316. if ($enable == '') {
  317. $res['ret'] = 0;
  318. $res['msg'] = '选项无效';
  319. return $response->getBody()->write(json_encode($res));
  320. }
  321. $user->ga_enable = $enable;
  322. $user->save();
  323. $res['ret'] = 1;
  324. $res['msg'] = '设置成功';
  325. return $response->getBody()->write(json_encode($res));
  326. }
  327. public function ResetPort($request, $response, $args)
  328. {
  329. $user = $this->user;
  330. $temp = $user->ResetPort();
  331. $res['msg'] = $temp['msg'];
  332. $res['ret'] = ($temp['ok'] === true ? 1 : 0);
  333. return $response->getBody()->write(json_encode($res));
  334. }
  335. public function SpecifyPort($request, $response, $args)
  336. {
  337. $user = $this->user;
  338. $port = $request->getParam('port');
  339. $temp = $user->SpecifyPort($port);
  340. $res['msg'] = $temp['msg'];
  341. $res['ret'] = ($temp['ok'] === true ? 1 : 0);
  342. return $response->getBody()->write(json_encode($res));
  343. }
  344. public function GaReset($request, $response, $args)
  345. {
  346. $user = $this->user;
  347. $ga = new GA();
  348. $secret = $ga->createSecret();
  349. $user->ga_token = $secret;
  350. $user->save();
  351. return $response->withStatus(302)->withHeader('Location', '/user/edit');
  352. }
  353. public function profile($request, $response, $args)
  354. {
  355. $pageNum = $request->getQueryParams()['page'] ?? 1;
  356. $paybacks = Payback::where('ref_by', $this->user->id)->orderBy('datetime', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  357. $paybacks->setPath('/user/profile');
  358. $iplocation = new QQWry();
  359. $userip = array();
  360. $total = Ip::where('datetime', '>=', time() - 300)->where('userid', '=', $this->user->id)->get();
  361. $totallogin = LoginIp::where('userid', '=', $this->user->id)->where('type', '=', 0)->orderBy('datetime', 'desc')->take(10)->get();
  362. $userloginip = array();
  363. foreach ($totallogin as $single) {
  364. //if(isset($useripcount[$single->userid]))
  365. {
  366. if (!isset($userloginip[$single->ip])) {
  367. //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
  368. $location = $iplocation->getlocation($single->ip);
  369. $userloginip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
  370. }
  371. }
  372. }
  373. foreach ($total as $single) {
  374. //if(isset($useripcount[$single->userid]))
  375. {
  376. $single->ip = Tools::getRealIp($single->ip);
  377. $is_node = Node::where('node_ip', $single->ip)->first();
  378. if ($is_node) {
  379. continue;
  380. }
  381. if (!isset($userip[$single->ip])) {
  382. //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
  383. $location = $iplocation->getlocation($single->ip);
  384. $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
  385. }
  386. }
  387. }
  388. $boughts = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->get();
  389. if ($request->getParam('json') == 1) {
  390. $res['userip'] = $userip;
  391. $res['userloginip'] = $userloginip;
  392. $res['paybacks'] = $paybacks;
  393. $res['ret'] = 1;
  394. return $response->getBody()->write(json_encode($res));
  395. };
  396. return $this->view()->assign('boughts', $boughts)->assign('userip', $userip)->assign('userloginip', $userloginip)->assign('paybacks', $paybacks)->display('user/profile.tpl');
  397. }
  398. public function announcement($request, $response, $args)
  399. {
  400. $Anns = Ann::orderBy('date', 'desc')->get();
  401. if ($request->getParam('json') == 1) {
  402. $res['Anns'] = $Anns;
  403. $res['ret'] = 1;
  404. return $this->echoJson($response, $res);
  405. };
  406. return $this->view()->assign('anns', $Anns)->display('user/announcement.tpl');
  407. }
  408. public function tutorial($request, $response, $args)
  409. {
  410. return $this->view()->display('user/tutorial.tpl');
  411. }
  412. public function edit($request, $response, $args)
  413. {
  414. $themes = Tools::getDir(BASE_PATH . '/resources/views');
  415. $BIP = BlockIp::where('ip', $_SERVER['REMOTE_ADDR'])->first();
  416. if ($BIP == null) {
  417. $Block = 'IP: ' . $_SERVER['REMOTE_ADDR'] . ' 没有被封';
  418. $isBlock = 0;
  419. } else {
  420. $Block = 'IP: ' . $_SERVER['REMOTE_ADDR'] . ' 已被封';
  421. $isBlock = 1;
  422. }
  423. $bind_token = TelegramSessionManager::add_bind_session($this->user);
  424. $config_service = new Config();
  425. return $this->view()
  426. ->assign('user', $this->user)
  427. ->assign('themes', $themes)
  428. ->assign('isBlock', $isBlock)
  429. ->assign('Block', $Block)
  430. ->assign('bind_token', $bind_token)
  431. ->assign('telegram_bot', $_ENV['telegram_bot'])
  432. ->assign('config_service', $config_service)
  433. ->registerClass('URL', URL::class)
  434. ->display('user/edit.tpl');
  435. }
  436. public function invite($request, $response, $args)
  437. {
  438. $code = InviteCode::where('user_id', $this->user->id)->first();
  439. if ($code == null) {
  440. $this->user->addInviteCode();
  441. $code = InviteCode::where('user_id', $this->user->id)->first();
  442. }
  443. $pageNum = $request->getQueryParams()['page'] ?? 1;
  444. $paybacks = Payback::where('ref_by', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  445. if (!$paybacks_sum = Payback::where('ref_by', $this->user->id)->sum('ref_get')) {
  446. $paybacks_sum = 0;
  447. }
  448. $paybacks->setPath('/user/invite');
  449. $render = Tools::paginate_render($paybacks);
  450. return $this->view()
  451. ->assign('code', $code)
  452. ->assign('paybacks', $paybacks)
  453. ->assign('paybacks_sum', $paybacks_sum)
  454. ->assign('render', $render)
  455. ->display('user/invite.tpl');
  456. }
  457. public function buyInvite($request, $response, $args)
  458. {
  459. $price = $_ENV['invite_price'];
  460. $num = $request->getParam('num');
  461. $num = trim($num);
  462. if (!Tools::isInt($num) || $price < 0 || $num <= 0) {
  463. $res['ret'] = 0;
  464. $res['msg'] = '非法请求';
  465. return $response->getBody()->write(json_encode($res));
  466. }
  467. $amount = $price * $num;
  468. $user = $this->user;
  469. if (!$user->isLogin) {
  470. $res['ret'] = -1;
  471. return $response->getBody()->write(json_encode($res));
  472. }
  473. if ($user->money < $amount) {
  474. $res['ret'] = 0;
  475. $res['msg'] = '余额不足,总价为' . $amount . '元。';
  476. return $response->getBody()->write(json_encode($res));
  477. }
  478. $user->invite_num += $num;
  479. $user->money -= $amount;
  480. $user->save();
  481. $res['invite_num'] = $user->invite_num;
  482. $res['ret'] = 1;
  483. $res['msg'] = '邀请次数添加成功';
  484. return $response->getBody()->write(json_encode($res));
  485. }
  486. public function customInvite($request, $response, $args)
  487. {
  488. $price = $_ENV['custom_invite_price'];
  489. $customcode = $request->getParam('customcode');
  490. $customcode = trim($customcode);
  491. if (!Tools::is_validate($customcode) || $price < 0 || $customcode == '' || strlen($customcode) > 32) {
  492. $res['ret'] = 0;
  493. $res['msg'] = '非法请求,邀请链接后缀不能包含特殊符号且长度不能大于32字符';
  494. return $response->getBody()->write(json_encode($res));
  495. }
  496. if (InviteCode::where('code', $customcode)->count() != 0) {
  497. $res['ret'] = 0;
  498. $res['msg'] = '此后缀名被抢注了';
  499. return $response->getBody()->write(json_encode($res));
  500. }
  501. $user = $this->user;
  502. if (!$user->isLogin) {
  503. $res['ret'] = -1;
  504. return $response->getBody()->write(json_encode($res));
  505. }
  506. if ($user->money < $price) {
  507. $res['ret'] = 0;
  508. $res['msg'] = '余额不足,总价为' . $price . '元。';
  509. return $response->getBody()->write(json_encode($res));
  510. }
  511. $code = InviteCode::where('user_id', $user->id)->first();
  512. $code->code = $customcode;
  513. $user->money -= $price;
  514. $user->save();
  515. $code->save();
  516. $res['ret'] = 1;
  517. $res['msg'] = '定制成功';
  518. return $response->getBody()->write(json_encode($res));
  519. }
  520. public function sys()
  521. {
  522. return $this->view()->assign('ana', '')->display('user/sys.tpl');
  523. }
  524. public function updatePassword($request, $response, $args)
  525. {
  526. $oldpwd = $request->getParam('oldpwd');
  527. $pwd = $request->getParam('pwd');
  528. $repwd = $request->getParam('repwd');
  529. $user = $this->user;
  530. if (!Hash::checkPassword($user->pass, $oldpwd)) {
  531. $res['ret'] = 0;
  532. $res['msg'] = '旧密码错误';
  533. return $response->getBody()->write(json_encode($res));
  534. }
  535. if ($pwd != $repwd) {
  536. $res['ret'] = 0;
  537. $res['msg'] = '两次输入不符合';
  538. return $response->getBody()->write(json_encode($res));
  539. }
  540. if (strlen($pwd) < 8) {
  541. $res['ret'] = 0;
  542. $res['msg'] = '密码太短啦';
  543. return $response->getBody()->write(json_encode($res));
  544. }
  545. $hashPwd = Hash::passwordHash($pwd);
  546. $user->pass = $hashPwd;
  547. $user->save();
  548. $user->clean_link();
  549. $res['ret'] = 1;
  550. $res['msg'] = '修改成功';
  551. return $this->echoJson($response, $res);
  552. }
  553. public function updateEmail($request, $response, $args)
  554. {
  555. $user = $this->user;
  556. $newemail = $request->getParam('newemail');
  557. $oldemail = $user->email;
  558. $otheruser = User::where('email', $newemail)->first();
  559. if ($_ENV['enable_telegram'] !== true) {
  560. $res['ret'] = 0;
  561. $res['msg'] = '未啓用用戶自行修改郵箱功能';
  562. return $response->getBody()->write(json_encode($res));
  563. }
  564. if (Config::getconfig('Register.bool.Enable_email_verify')) {
  565. $emailcode = $request->getParam('emailcode');
  566. $mailcount = EmailVerify::where('email', '=', $newemail)->where('code', '=', $emailcode)->where('expire_in', '>', time())->first();
  567. if ($mailcount == null) {
  568. $res['ret'] = 0;
  569. $res['msg'] = '您的邮箱验证码不正确';
  570. return $response->getBody()->write(json_encode($res));
  571. }
  572. }
  573. if ($newemail == '') {
  574. $res['ret'] = 0;
  575. $res['msg'] = '未填写邮箱';
  576. return $response->getBody()->write(json_encode($res));
  577. }
  578. if (!Check::isEmailLegal($newemail)) {
  579. $res['ret'] = 0;
  580. $res['msg'] = '邮箱无效';
  581. return $response->getBody()->write(json_encode($res));
  582. }
  583. if ($otheruser != null) {
  584. $res['ret'] = 0;
  585. $res['msg'] = '邮箱已经被使用了';
  586. return $response->getBody()->write(json_encode($res));
  587. }
  588. if ($newemail == $oldemail) {
  589. $res['ret'] = 0;
  590. $res['msg'] = '新邮箱不能和旧邮箱一样';
  591. return $response->getBody()->write(json_encode($res));
  592. }
  593. $antiXss = new AntiXSS();
  594. $user->email = $antiXss->xss_clean($newemail);
  595. $user->save();
  596. $res['ret'] = 1;
  597. $res['msg'] = '修改成功';
  598. return $this->echoJson($response, $res);
  599. }
  600. public function updateUsername($request, $response, $args)
  601. {
  602. $newusername = $request->getParam('newusername');
  603. $user = $this->user;
  604. $antiXss = new AntiXSS();
  605. $user->user_name = $antiXss->xss_clean($newusername);
  606. $user->save();
  607. $res['ret'] = 1;
  608. $res['msg'] = '修改成功';
  609. return $this->echoJson($response, $res);
  610. }
  611. public function updateHide($request, $response, $args)
  612. {
  613. $hide = $request->getParam('hide');
  614. $user = $this->user;
  615. $user->is_hide = $hide;
  616. $user->save();
  617. $res['ret'] = 1;
  618. $res['msg'] = '修改成功';
  619. return $this->echoJson($response, $res);
  620. }
  621. public function Unblock($request, $response, $args)
  622. {
  623. $user = $this->user;
  624. $BIP = BlockIp::where('ip', $_SERVER['REMOTE_ADDR'])->get();
  625. foreach ($BIP as $bi) {
  626. $bi->delete();
  627. }
  628. $UIP = new UnblockIp();
  629. $UIP->userid = $user->id;
  630. $UIP->ip = $_SERVER['REMOTE_ADDR'];
  631. $UIP->datetime = time();
  632. $UIP->save();
  633. $res['ret'] = 1;
  634. $res['msg'] = $_SERVER['REMOTE_ADDR'];
  635. return $this->echoJson($response, $res);
  636. }
  637. public function shop($request, $response, $args)
  638. {
  639. $shops = Shop::where('status', 1)->orderBy('name')->get();
  640. return $this->view()->assign('shops', $shops)->display('user/shop.tpl');
  641. }
  642. public function CouponCheck($request, $response, $args)
  643. {
  644. $coupon = $request->getParam('coupon');
  645. $coupon = trim($coupon);
  646. $user = $this->user;
  647. if (!$user->isLogin) {
  648. $res['ret'] = -1;
  649. return $response->getBody()->write(json_encode($res));
  650. }
  651. $shop = $request->getParam('shop');
  652. $shop = Shop::where('id', $shop)->where('status', 1)->first();
  653. if ($shop == null) {
  654. $res['ret'] = 0;
  655. $res['msg'] = '非法请求';
  656. return $response->getBody()->write(json_encode($res));
  657. }
  658. if ($coupon == '') {
  659. $res['ret'] = 1;
  660. $res['name'] = $shop->name;
  661. $res['credit'] = '0 %';
  662. $res['total'] = $shop->price . '元';
  663. return $response->getBody()->write(json_encode($res));
  664. }
  665. $coupon = Coupon::where('code', $coupon)->first();
  666. if ($coupon == null) {
  667. $res['ret'] = 0;
  668. $res['msg'] = '优惠码无效';
  669. return $response->getBody()->write(json_encode($res));
  670. }
  671. if ($coupon->order($shop->id) == false) {
  672. $res['ret'] = 0;
  673. $res['msg'] = '此优惠码不可用于此商品';
  674. return $response->getBody()->write(json_encode($res));
  675. }
  676. $use_limit = $coupon->onetime;
  677. if ($use_limit > 0) {
  678. $use_count = Bought::where('userid', $user->id)->where('coupon', $coupon->code)->count();
  679. if ($use_count >= $use_limit) {
  680. $res['ret'] = 0;
  681. $res['msg'] = '优惠码次数已用完';
  682. return $response->getBody()->write(json_encode($res));
  683. }
  684. }
  685. $res['ret'] = 1;
  686. $res['name'] = $shop->name;
  687. $res['credit'] = $coupon->credit . ' %';
  688. $res['total'] = $shop->price * ((100 - $coupon->credit) / 100) . '元';
  689. return $response->getBody()->write(json_encode($res));
  690. }
  691. public function buy_traffic_package($request, $response, $args)
  692. {
  693. $user = $this->user;
  694. $shop = $request->getParam('shop');
  695. $shop = Shop::where('id', $shop)->where('status', 1)->first();
  696. $price = $shop->price;
  697. if ($shop == null || $shop->traffic_package() == 0) {
  698. $res['ret'] = 0;
  699. $res['msg'] = '非法请求';
  700. return $response->getBody()->write(json_encode($res));
  701. }
  702. if ($user->class < $shop->content['traffic_package']['class']['min'] || $user->class > $shop->content['traffic_package']['class']['max']) {
  703. $res['ret'] = 0;
  704. $res['msg'] = '您当前的会员等级无法购买此流量包';
  705. return $response->getBody()->write(json_encode($res));
  706. }
  707. if (!$user->isLogin) {
  708. $res['ret'] = -1;
  709. return $response->getBody()->write(json_encode($res));
  710. }
  711. if (bccomp($user->money, $price, 2) == -1) {
  712. $res['ret'] = 0;
  713. $res['msg'] = '喵喵喵~ 当前余额不足,总价为' . $price . '元。</br><a href="/user/code">点击进入充值界面</a>';
  714. return $response->getBody()->write(json_encode($res));
  715. }
  716. $user->money = bcsub($user->money, $price, 2);
  717. $user->save();
  718. $bought = new Bought();
  719. $bought->userid = $user->id;
  720. $bought->shopid = $shop->id;
  721. $bought->datetime = time();
  722. $bought->renew = 0;
  723. $bought->coupon = 0;
  724. $bought->price = $price;
  725. $bought->save();
  726. $shop->buy($user);
  727. $res['ret'] = 1;
  728. $res['msg'] = '购买成功';
  729. return $response->getBody()->write(json_encode($res));
  730. }
  731. public function buy($request, $response, $args)
  732. {
  733. $coupon = $request->getParam('coupon');
  734. $coupon = trim($coupon);
  735. $code = $coupon;
  736. $shop = $request->getParam('shop');
  737. $disableothers = $request->getParam('disableothers');
  738. $autorenew = $request->getParam('autorenew');
  739. $shop = Shop::where('id', $shop)->where('status', 1)->first();
  740. $orders = Bought::where('userid', $this->user->id)->get();
  741. foreach ($orders as $order) {
  742. if ($order->shop()->use_loop()) {
  743. if ($order->valid()) {
  744. $res['ret'] = 0;
  745. $res['msg'] = '您购买的含有自动重置系统的套餐还未过期,无法购买新套餐';
  746. return $response->getBody()->write(json_encode($res));
  747. }
  748. }
  749. };
  750. if ($shop == null) {
  751. $res['ret'] = 0;
  752. $res['msg'] = '非法请求';
  753. return $response->getBody()->write(json_encode($res));
  754. }
  755. if ($coupon == '') {
  756. $credit = 0;
  757. } else {
  758. $coupon = Coupon::where('code', $coupon)->first();
  759. if ($coupon == null) {
  760. $credit = 0;
  761. } else {
  762. if ($coupon->onetime == 1) {
  763. $onetime = true;
  764. }
  765. $credit = $coupon->credit;
  766. }
  767. if ($coupon->order($shop->id) == false) {
  768. $res['ret'] = 0;
  769. $res['msg'] = '此优惠码不可用于此商品';
  770. return $response->getBody()->write(json_encode($res));
  771. }
  772. if ($coupon->expire < time()) {
  773. $res['ret'] = 0;
  774. $res['msg'] = '此优惠码已过期';
  775. return $response->getBody()->write(json_encode($res));
  776. }
  777. $use_limit = $coupon->onetime;
  778. if ($use_limit > 0) {
  779. $use_count = Bought::where('userid', $user->id)->where('coupon', $coupon->code)->count();
  780. if ($use_count >= $use_limit) {
  781. $res['ret'] = 0;
  782. $res['msg'] = '优惠码次数已用完';
  783. return $response->getBody()->write(json_encode($res));
  784. }
  785. }
  786. }
  787. $price = $shop->price * ((100 - $credit) / 100);
  788. $user = $this->user;
  789. if (!$user->isLogin) {
  790. $res['ret'] = -1;
  791. return $response->getBody()->write(json_encode($res));
  792. }
  793. if (bccomp($user->money, $price, 2) == -1) {
  794. $res['ret'] = 0;
  795. $res['msg'] = '喵喵喵~ 当前余额不足,总价为' . $price . '元。</br><a href="/user/code">点击进入充值界面</a>';
  796. return $response->getBody()->write(json_encode($res));
  797. }
  798. $user->money = bcsub($user->money, $price, 2);
  799. $user->save();
  800. if ($disableothers == 1) {
  801. $boughts = Bought::where('userid', $user->id)->get();
  802. foreach ($boughts as $disable_bought) {
  803. $disable_bought->renew = 0;
  804. $disable_bought->save();
  805. }
  806. }
  807. $bought = new Bought();
  808. $bought->userid = $user->id;
  809. $bought->shopid = $shop->id;
  810. $bought->datetime = time();
  811. if ($autorenew == 0 || $shop->auto_renew == 0) {
  812. $bought->renew = 0;
  813. } else {
  814. $bought->renew = time() + $shop->auto_renew * 86400;
  815. }
  816. $bought->coupon = $code;
  817. if (isset($onetime)) {
  818. $price = $shop->price;
  819. }
  820. $bought->price = $price;
  821. $bought->save();
  822. $shop->buy($user);
  823. $res['ret'] = 1;
  824. $res['msg'] = '购买成功';
  825. return $response->getBody()->write(json_encode($res));
  826. }
  827. public function bought($request, $response, $args)
  828. {
  829. $pageNum = $request->getQueryParams()['page'] ?? 1;
  830. $shops = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  831. $shops->setPath('/user/bought');
  832. if ($request->getParam('json') == 1) {
  833. $res['ret'] = 1;
  834. foreach ($shops as $shop) {
  835. $shop->datetime = $shop->datetime();
  836. $shop->name = $shop->shop()->name;
  837. $shop->content = $shop->shop()->content();
  838. };
  839. $res['shops'] = $shops;
  840. return $response->getBody()->write(json_encode($res));
  841. };
  842. $render = Tools::paginate_render($shops);
  843. return $this->view()
  844. ->assign('shops', $shops)
  845. ->assign('render', $render)
  846. ->display('user/bought.tpl');
  847. }
  848. public function deleteBoughtGet($request, $response, $args)
  849. {
  850. $id = $request->getParam('id');
  851. $shop = Bought::where('id', $id)->where('userid', $this->user->id)->first();
  852. if ($shop == null) {
  853. $rs['ret'] = 0;
  854. $rs['msg'] = '关闭自动续费失败,订单不存在。';
  855. return $response->getBody()->write(json_encode($rs));
  856. }
  857. if ($this->user->id == $shop->userid) {
  858. $shop->renew = 0;
  859. }
  860. if (!$shop->save()) {
  861. $rs['ret'] = 0;
  862. $rs['msg'] = '关闭自动续费失败';
  863. return $response->getBody()->write(json_encode($rs));
  864. }
  865. $rs['ret'] = 1;
  866. $rs['msg'] = '关闭自动续费成功';
  867. return $response->getBody()->write(json_encode($rs));
  868. }
  869. public function updateWechat($request, $response, $args)
  870. {
  871. $type = $request->getParam('imtype');
  872. $wechat = $request->getParam('wechat');
  873. $wechat = trim($wechat);
  874. $user = $this->user;
  875. if ($user->telegram_id != 0) {
  876. $res['ret'] = 0;
  877. $res['msg'] = '您绑定了 Telegram ,所以此项并不能被修改。';
  878. return $response->getBody()->write(json_encode($res));
  879. }
  880. if ($wechat == '' || $type == '') {
  881. $res['ret'] = 0;
  882. $res['msg'] = '非法输入';
  883. return $response->getBody()->write(json_encode($res));
  884. }
  885. $user1 = User::where('im_value', $wechat)->where('im_type', $type)->first();
  886. if ($user1 != null) {
  887. $res['ret'] = 0;
  888. $res['msg'] = '此联络方式已经被注册';
  889. return $response->getBody()->write(json_encode($res));
  890. }
  891. $user->im_type = $type;
  892. $antiXss = new AntiXSS();
  893. $user->im_value = $antiXss->xss_clean($wechat);
  894. $user->save();
  895. $res['ret'] = 1;
  896. $res['msg'] = '修改成功';
  897. return $this->echoJson($response, $res);
  898. }
  899. public function updateSSR($request, $response, $args)
  900. {
  901. $protocol = $request->getParam('protocol');
  902. $obfs = $request->getParam('obfs');
  903. $obfs_param = $request->getParam('obfs_param');
  904. $obfs_param = trim($obfs_param);
  905. $user = $this->user;
  906. if ($obfs == '' || $protocol == '') {
  907. $res['ret'] = 0;
  908. $res['msg'] = '非法输入';
  909. return $response->getBody()->write(json_encode($res));
  910. }
  911. if (!Tools::is_param_validate('obfs', $obfs)) {
  912. $res['ret'] = 0;
  913. $res['msg'] = '混淆无效';
  914. return $response->getBody()->write(json_encode($res));
  915. }
  916. if (!Tools::is_param_validate('protocol', $protocol)) {
  917. $res['ret'] = 0;
  918. $res['msg'] = '协议无效';
  919. return $response->getBody()->write(json_encode($res));
  920. }
  921. $antiXss = new AntiXSS();
  922. $user->protocol = $antiXss->xss_clean($protocol);
  923. $user->obfs = $antiXss->xss_clean($obfs);
  924. $user->obfs_param = $antiXss->xss_clean($obfs_param);
  925. if (!Tools::checkNoneProtocol($user)) {
  926. $res['ret'] = 0;
  927. $res['msg'] = '系统检测到您目前的加密方式为 none ,但您将要设置为的协议并不在以下协议<br>' . implode(',', Config::getSupportParam('allow_none_protocol')) . '<br>之内,请您先修改您的加密方式,再来修改此处设置。';
  928. return $this->echoJson($response, $res);
  929. }
  930. if (!URL::SSCanConnect($user) && !URL::SSRCanConnect($user)) {
  931. $res['ret'] = 0;
  932. $res['msg'] = '您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。';
  933. return $this->echoJson($response, $res);
  934. }
  935. $user->save();
  936. if (!URL::SSCanConnect($user)) {
  937. $res['ret'] = 1;
  938. $res['msg'] = '设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。';
  939. return $this->echoJson($response, $res);
  940. }
  941. if (!URL::SSRCanConnect($user)) {
  942. $res['ret'] = 1;
  943. $res['msg'] = '设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。';
  944. return $this->echoJson($response, $res);
  945. }
  946. $res['ret'] = 1;
  947. $res['msg'] = '设置成功,您可自由选用客户端来连接。';
  948. return $this->echoJson($response, $res);
  949. }
  950. public function updateTheme($request, $response, $args)
  951. {
  952. $theme = $request->getParam('theme');
  953. $user = $this->user;
  954. if ($theme == '') {
  955. $res['ret'] = 0;
  956. $res['msg'] = '非法输入';
  957. return $response->getBody()->write(json_encode($res));
  958. }
  959. $user->theme = filter_var($theme, FILTER_SANITIZE_STRING);
  960. $user->save();
  961. $res['ret'] = 1;
  962. $res['msg'] = '设置成功';
  963. return $this->echoJson($response, $res);
  964. }
  965. public function updateMail($request, $response, $args)
  966. {
  967. $value = (int) $request->getParam('mail');
  968. if (in_array($value, [0, 1, 2])) {
  969. $user = $this->user;
  970. if ($value == 2 && $_ENV['enable_telegram'] === false) {
  971. $res['ret'] = 0;
  972. $res['msg'] = '修改失败,当前无法使用 Telegram 接收每日报告';
  973. return $this->echoJson($response, $res);
  974. }
  975. $user->sendDailyMail = $value;
  976. $user->save();
  977. $res['ret'] = 1;
  978. $res['msg'] = '修改成功';
  979. } else {
  980. $res['ret'] = 0;
  981. $res['msg'] = '非法输入';
  982. }
  983. return $this->echoJson($response, $res);
  984. }
  985. public function PacSet($request, $response, $args)
  986. {
  987. $pac = $request->getParam('pac');
  988. $user = $this->user;
  989. if ($pac == '') {
  990. $res['ret'] = 0;
  991. $res['msg'] = '输入不能为空';
  992. return $response->getBody()->write(json_encode($res));
  993. }
  994. $user->pac = $pac;
  995. $user->save();
  996. $res['ret'] = 1;
  997. $res['msg'] = '修改成功';
  998. return $this->echoJson($response, $res);
  999. }
  1000. public function updateSsPwd($request, $response, $args)
  1001. {
  1002. $user = Auth::getUser();
  1003. $pwd = Tools::genRandomChar(16);
  1004. $current_timestamp = time();
  1005. $new_uuid = Uuid::uuid3(Uuid::NAMESPACE_DNS, $user->email . '|' . $current_timestamp);
  1006. $otheruuid = User::where('uuid', $new_uuid)->first();
  1007. if ($pwd == '') {
  1008. $res['ret'] = 0;
  1009. $res['msg'] = '密码不能为空';
  1010. return $response->getBody()->write(json_encode($res));
  1011. }
  1012. if (!Tools::is_validate($pwd)) {
  1013. $res['ret'] = 0;
  1014. $res['msg'] = '密码无效';
  1015. return $response->getBody()->write(json_encode($res));
  1016. }
  1017. if ($otheruuid != null) {
  1018. $res['ret'] = 0;
  1019. $res['msg'] = '目前出现一些问题,请稍后再试';
  1020. return $response->getBody()->write(json_encode($res));
  1021. }
  1022. $user->uuid = $new_uuid;
  1023. $user->save();
  1024. $user->updateSsPwd($pwd);
  1025. $res['ret'] = 1;
  1026. return $this->echoJson($response, $res);
  1027. }
  1028. public function updateMethod($request, $response, $args)
  1029. {
  1030. $user = Auth::getUser();
  1031. $method = $request->getParam('method');
  1032. $method = strtolower($method);
  1033. if ($method == '') {
  1034. $res['ret'] = 0;
  1035. $res['msg'] = '非法输入';
  1036. return $response->getBody()->write(json_encode($res));
  1037. }
  1038. if (!Tools::is_param_validate('method', $method)) {
  1039. $res['ret'] = 0;
  1040. $res['msg'] = '加密无效';
  1041. return $response->getBody()->write(json_encode($res));
  1042. }
  1043. $user->method = $method;
  1044. if (!Tools::checkNoneProtocol($user)) {
  1045. $res['ret'] = 0;
  1046. $res['msg'] = '系统检测到您将要设置的加密方式为 none ,但您的协议并不在以下协议<br>' . implode(',', Config::getSupportParam('allow_none_protocol')) . '<br>之内,请您先修改您的协议,再来修改此处设置。';
  1047. return $this->echoJson($response, $res);
  1048. }
  1049. if (!URL::SSCanConnect($user) && !URL::SSRCanConnect($user)) {
  1050. $res['ret'] = 0;
  1051. $res['msg'] = '您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。';
  1052. return $this->echoJson($response, $res);
  1053. }
  1054. $user->updateMethod($method);
  1055. if (!URL::SSCanConnect($user)) {
  1056. $res['ret'] = 1;
  1057. $res['msg'] = '设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。';
  1058. return $this->echoJson($response, $res);
  1059. }
  1060. if (!URL::SSRCanConnect($user)) {
  1061. $res['ret'] = 1;
  1062. $res['msg'] = '设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。';
  1063. return $this->echoJson($response, $res);
  1064. }
  1065. $res['ret'] = 1;
  1066. $res['msg'] = '设置成功,您可自由选用两种客户端来进行连接。';
  1067. return $this->echoJson($response, $res);
  1068. }
  1069. public function logout($request, $response, $args)
  1070. {
  1071. Auth::logout();
  1072. return $response->withStatus(302)->withHeader('Location', '/');
  1073. }
  1074. public function doCheckIn($request, $response, $args)
  1075. {
  1076. if ($_ENV['enable_checkin_captcha'] == true) {
  1077. switch ($_ENV['captcha_provider']) {
  1078. case 'recaptcha':
  1079. $recaptcha = $request->getParam('recaptcha');
  1080. if ($recaptcha == '') {
  1081. $ret = false;
  1082. } else {
  1083. $json = file_get_contents('https://recaptcha.net/recaptcha/api/siteverify?secret=' . $_ENV['recaptcha_secret'] . '&response=' . $recaptcha);
  1084. $ret = json_decode($json)->success;
  1085. }
  1086. break;
  1087. case 'geetest':
  1088. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  1089. break;
  1090. }
  1091. if (!$ret) {
  1092. $res['ret'] = 0;
  1093. $res['msg'] = '系统无法接受您的验证结果,请刷新页面后重试。';
  1094. return $response->getBody()->write(json_encode($res));
  1095. }
  1096. }
  1097. if (strtotime($this->user->expire_in) < time()) {
  1098. $res['ret'] = 0;
  1099. $res['msg'] = '您的账户已过期,无法签到。';
  1100. return $response->getBody()->write(json_encode($res));
  1101. }
  1102. $checkin = $this->user->checkin();
  1103. if ($checkin['ok'] === false) {
  1104. $res['ret'] = 0;
  1105. $res['msg'] = $checkin['msg'];
  1106. return $this->echoJson($response, $res);
  1107. }
  1108. $res['msg'] = $checkin['msg'];
  1109. $res['unflowtraffic'] = $this->user->transfer_enable;
  1110. $res['traffic'] = Tools::flowAutoShow($this->user->transfer_enable);
  1111. $res['trafficInfo'] = array(
  1112. 'todayUsedTraffic' => $this->user->TodayusedTraffic(),
  1113. 'lastUsedTraffic' => $this->user->LastusedTraffic(),
  1114. 'unUsedTraffic' => $this->user->unusedTraffic(),
  1115. );
  1116. $res['ret'] = 1;
  1117. return $this->echoJson($response, $res);
  1118. }
  1119. public function kill($request, $response, $args)
  1120. {
  1121. return $this->view()->display('user/kill.tpl');
  1122. }
  1123. public function handleKill($request, $response, $args)
  1124. {
  1125. $user = Auth::getUser();
  1126. $email = $user->email;
  1127. $passwd = $request->getParam('passwd');
  1128. // check passwd
  1129. $res = array();
  1130. if (!Hash::checkPassword($user->pass, $passwd)) {
  1131. $res['ret'] = 0;
  1132. $res['msg'] = ' 密码错误';
  1133. return $this->echoJson($response, $res);
  1134. }
  1135. if ($_ENV['enable_kill'] == true) {
  1136. Auth::logout();
  1137. $user->kill_user();
  1138. $res['ret'] = 1;
  1139. $res['msg'] = '您的帐号已经从我们的系统中删除。欢迎下次光临!';
  1140. } else {
  1141. $res['ret'] = 0;
  1142. $res['msg'] = '管理员不允许删除,如需删除请联系管理员。';
  1143. }
  1144. return $this->echoJson($response, $res);
  1145. }
  1146. public function trafficLog($request, $response, $args)
  1147. {
  1148. $traffic = TrafficLog::where('user_id', $this->user->id)->where('log_time', '>', time() - 3 * 86400)->orderBy('id', 'desc')->get();
  1149. if ($request->getParam('json') == 1) {
  1150. $res['ret'] = 1;
  1151. foreach ($traffic as $trafficdata) {
  1152. $trafficdata->total_used = $trafficdata->totalUsedRaw();
  1153. $trafficdata->name = $trafficdata->node()->name;
  1154. }
  1155. $res['traffic'] = $traffic;
  1156. return $this->echoJson($response, $res);
  1157. }
  1158. return $this->view()->assign('logs', $traffic)->display('user/trafficlog.tpl');
  1159. }
  1160. public function detect_index($request, $response, $args)
  1161. {
  1162. $pageNum = $request->getQueryParams()['page'] ?? 1;
  1163. $logs = DetectRule::paginate(15, ['*'], 'page', $pageNum);
  1164. if ($request->getParam('json') == 1) {
  1165. $res['ret'] = 1;
  1166. $res['logs'] = $logs;
  1167. return $this->echoJson($response, $res);
  1168. }
  1169. $logs->setPath('/user/detect');
  1170. $render = Tools::paginate_render($logs);
  1171. return $this->view()
  1172. ->assign('rules', $logs)
  1173. ->assign('render', $render)
  1174. ->display('user/detect_index.tpl');
  1175. }
  1176. public function detect_log($request, $response, $args)
  1177. {
  1178. $pageNum = $request->getQueryParams()['page'] ?? 1;
  1179. $logs = DetectLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
  1180. if ($request->getParam('json') == 1) {
  1181. $res['ret'] = 1;
  1182. foreach ($logs as $log) {
  1183. $log->node_name = $log->Node()->name;
  1184. $log->detect_rule_name = $log->DetectRule()->name;
  1185. $log->detect_rule_text = $log->DetectRule()->text;
  1186. $log->detect_rule_regex = $log->DetectRule()->regex;
  1187. $log->detect_rule_type = $log->DetectRule()->type;
  1188. $log->detect_rule_date = date('Y-m-d H:i:s',$log->datetime);
  1189. }
  1190. $res['logs'] = $logs;
  1191. return $this->echoJson($response, $res);
  1192. }
  1193. $logs->setPath('/user/detect/log');
  1194. $render = Tools::paginate_render($logs);
  1195. return $this->view()
  1196. ->assign('logs', $logs)
  1197. ->assign('render', $render)
  1198. ->display('user/detect_log.tpl');
  1199. }
  1200. public function disable($request, $response, $args)
  1201. {
  1202. return $this->view()->display('user/disable.tpl');
  1203. }
  1204. public function telegram_reset($request, $response, $args)
  1205. {
  1206. $user = $this->user;
  1207. $user->TelegramReset();
  1208. return $response->withStatus(302)->withHeader('Location', '/user/edit');
  1209. }
  1210. public function resetURL($request, $response, $args)
  1211. {
  1212. $user = $this->user;
  1213. $user->clean_link();
  1214. return $response->withStatus(302)->withHeader('Location', '/user');
  1215. }
  1216. public function resetInviteURL($request, $response, $args)
  1217. {
  1218. $user = $this->user;
  1219. $user->clear_inviteCodes();
  1220. return $response->withStatus(302)->withHeader('Location', '/user/invite');
  1221. }
  1222. public function backtoadmin($request, $response, $args)
  1223. {
  1224. $userid = Cookie::get('uid');
  1225. $adminid = Cookie::get('old_uid');
  1226. $user = User::find($userid);
  1227. $admin = User::find($adminid);
  1228. if (!$admin->is_admin || !$user) {
  1229. Cookie::set([
  1230. 'uid' => null,
  1231. 'email' => null,
  1232. 'key' => null,
  1233. 'ip' => null,
  1234. 'expire_in' => null,
  1235. 'old_uid' => null,
  1236. 'old_email' => null,
  1237. 'old_key' => null,
  1238. 'old_ip' => null,
  1239. 'old_expire_in' => null,
  1240. 'old_local' => null
  1241. ], time() - 1000);
  1242. }
  1243. $expire_in = Cookie::get('old_expire_in');
  1244. $local = Cookie::get('old_local');
  1245. Cookie::set([
  1246. 'uid' => Cookie::get('old_uid'),
  1247. 'email' => Cookie::get('old_email'),
  1248. 'key' => Cookie::get('old_key'),
  1249. 'ip' => Cookie::get('old_ip'),
  1250. 'expire_in' => $expire_in,
  1251. 'old_uid' => null,
  1252. 'old_email' => null,
  1253. 'old_key' => null,
  1254. 'old_ip' => null,
  1255. 'old_expire_in' => null,
  1256. 'old_local' => null
  1257. ], $expire_in);
  1258. return $response->withStatus(302)->withHeader('Location', $local);
  1259. }
  1260. public function getUserAllURL($request, $response, $args)
  1261. {
  1262. $user = $this->user;
  1263. $type = $request->getQueryParams()["type"];
  1264. $return = '';
  1265. switch ($type) {
  1266. case 'ss':
  1267. $return .= URL::get_NewAllUrl($user, ['type' => 'ss']) . PHP_EOL;
  1268. break;
  1269. case 'ssr':
  1270. $return .= URL::get_NewAllUrl($user, ['type' => 'ssr']) . PHP_EOL;
  1271. break;
  1272. case 'v2ray':
  1273. $return .= URL::get_NewAllUrl($user, ['type' => 'vmess']) . PHP_EOL;
  1274. break;
  1275. default:
  1276. $return .= '悟空别闹!';
  1277. break;
  1278. }
  1279. $response = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')
  1280. ->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')
  1281. ->withHeader('Content-Disposition', ' attachment; filename=node.txt');
  1282. return $response->write($return);
  1283. }
  1284. /**
  1285. * 订阅记录
  1286. *
  1287. * @param Request $request
  1288. * @param Response $response
  1289. * @param array $args
  1290. */
  1291. public function subscribe_log($request, $response, $args)
  1292. {
  1293. if ($_ENV['subscribeLog_show'] === false) {
  1294. return $response->withStatus(302)->withHeader('Location', '/user');
  1295. }
  1296. $pageNum = $request->getQueryParams()['page'] ?? 1;
  1297. $logs = UserSubscribeLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
  1298. $iplocation = new QQWry();
  1299. $logs->setPath('/user/subscribe_log');
  1300. if (($request->getParam('json') == 1)) {
  1301. $res['ret'] = 1;
  1302. $res['logs'] = $logs;
  1303. foreach ($logs as $log) {
  1304. $location = $iplocation->getlocation($log->request_ip);
  1305. $log->country = iconv("gbk", "utf-8//IGNORE", $location['country']);
  1306. $log->area = iconv("gbk", "utf-8//IGNORE", $location['area']);
  1307. }
  1308. $res['subscribeLog_keep_days'] = $_ENV['subscribeLog_keep_days'];
  1309. return $this->echoJson($response, $res);
  1310. }
  1311. $render = Tools::paginate_render($logs);
  1312. return $this->view()
  1313. ->assign('logs', $logs)
  1314. ->assign('iplocation', $iplocation)
  1315. ->assign('render', $render)
  1316. ->fetch('user/subscribe_log.tpl');
  1317. }
  1318. /**
  1319. * 获取包含订阅信息的客户端压缩档
  1320. *
  1321. * @param Request $request
  1322. * @param Response $response
  1323. * @param array $args
  1324. */
  1325. public function getPcClient($request, $response, $args)
  1326. {
  1327. $zipArc = new \ZipArchive();
  1328. $user_token = LinkController::GenerateSSRSubCode($this->user->id);
  1329. $type = trim($request->getQueryParams()['type']);
  1330. // 临时文件存放路径
  1331. $temp_file_path = BASE_PATH . '/storage/';
  1332. // 客户端文件存放路径
  1333. $client_path = BASE_PATH . '/resources/clients/';
  1334. switch ($type) {
  1335. case 'ss-win':
  1336. $user_config_file_name = 'gui-config.json';
  1337. $content = ClientProfiles::getSSPcConf($this->user);
  1338. break;
  1339. case 'ssr-win':
  1340. $user_config_file_name = 'gui-config.json';
  1341. $content = ClientProfiles::getSSRPcConf($this->user);
  1342. break;
  1343. case 'v2rayn-win':
  1344. $user_config_file_name = 'guiNConfig.json';
  1345. $content = ClientProfiles::getV2RayNPcConf($this->user);
  1346. break;
  1347. default:
  1348. return 'gg';
  1349. }
  1350. $temp_file_path .= $type . '_' . $user_token . '.zip';
  1351. $client_path .= $type . '/';
  1352. // 文件存在则先删除
  1353. if (is_file($temp_file_path)) {
  1354. unlink($temp_file_path);
  1355. }
  1356. // 超链接文件内容
  1357. $site_url_content = '[InternetShortcut]' . PHP_EOL . 'URL=' . $_ENV['baseUrl'];
  1358. // 创建 zip 并添加内容
  1359. $zipArc->open($temp_file_path, \ZipArchive::CREATE);
  1360. $zipArc->addFromString($user_config_file_name, $content);
  1361. $zipArc->addFromString('点击访问_' . $_ENV['appName'] . '.url', $site_url_content);
  1362. Tools::folderToZip($client_path, $zipArc, strlen($client_path));
  1363. $zipArc->close();
  1364. $newResponse = $response->withHeader('Content-type', ' application/octet-stream')->withHeader('Content-Disposition', ' attachment; filename=' . $type . '.zip');
  1365. $newResponse->write(file_get_contents($temp_file_path));
  1366. unlink($temp_file_path);
  1367. return $newResponse;
  1368. }
  1369. /**
  1370. * 从使用同数据库的其他面板下载客户端[内置节点]
  1371. *
  1372. * @param Request $request
  1373. * @param Response $response
  1374. * @param array $args
  1375. */
  1376. public function getClientfromToken($request, $response, $args)
  1377. {
  1378. $token = $args['token'];
  1379. $Etoken = Token::where('token', '=', $token)->where('create_time', '>', time() - 60 * 10)->first();
  1380. if ($Etoken == null) {
  1381. return '下载链接已失效,请刷新页面后重新点击.';
  1382. }
  1383. $user = User::find($Etoken->user_id);
  1384. if ($user == null) {
  1385. return null;
  1386. }
  1387. $this->user = $user;
  1388. return $this->getPcClient($request, $response, $args);
  1389. }
  1390. }