| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103 |
- <?php
- declare(strict_types=1);
- namespace App\Controllers;
- use App\Models\Ann;
- use App\Models\Bought;
- use App\Models\Code;
- use App\Models\Docs;
- use App\Models\EmailVerify;
- use App\Models\InviteCode;
- use App\Models\Ip;
- use App\Models\LoginIp;
- use App\Models\Node;
- use App\Models\Payback;
- use App\Models\Setting;
- use App\Models\StreamMedia;
- use App\Models\User;
- use App\Models\UserSubscribeLog;
- use App\Services\Auth;
- use App\Services\Captcha;
- use App\Services\Config;
- use App\Services\Payment;
- use App\Utils\Check;
- use App\Utils\Cookie;
- use App\Utils\DatatablesHelper;
- use App\Utils\GA;
- use App\Utils\Hash;
- use App\Utils\QQWry;
- use App\Utils\ResponseHelper;
- use App\Utils\TelegramSessionManager;
- use App\Utils\Tools;
- use App\Utils\URL;
- use Ramsey\Uuid\Uuid;
- use Slim\Http\Request;
- use Slim\Http\Response;
- use voku\helper\AntiXSS;
- /**
- * HomeController
- */
- final class UserController extends BaseController
- {
- /**
- * @param array $args
- */
- public function index(Request $request, Response $response, array $args)
- {
- $captcha = [];
- if (Setting::obtain('enable_checkin_captcha') === true) {
- $captcha = Captcha::generate();
- }
- $data = [
- 'today_traffic_usage' => (int) $this->user->transfer_enable === 0 ? 0 : ($this->user->u + $this->user->d - $this->user->last_day_t) / $this->user->transfer_enable * 100,
- 'past_traffic_usage' => (int) $this->user->transfer_enable === 0 ? 0 : $this->user->last_day_t / $this->user->transfer_enable * 100,
- 'residual_flow' => (int) $this->user->transfer_enable === 0 ? 0 : ($this->user->transfer_enable - ($this->user->u + $this->user->d)) / $this->user->transfer_enable * 100,
- ];
- return $response->write(
- $this->view()
- ->assign('ann', Ann::orderBy('date', 'desc')->first())
- ->assign('getUniversalSub', SubController::getUniversalSub($this->user))
- ->assign('data', $data)
- ->assign('captcha', $captcha)
- ->display('user/index.tpl')
- );
- }
- /**
- * @param array $args
- */
- public function code(Request $request, Response $response, array $args)
- {
- $pageNum = $request->getQueryParams()['page'] ?? 1;
- $codes = Code::where('type', '<>', '-2')
- ->where('userid', '=', $this->user->id)
- ->orderBy('id', 'desc')
- ->paginate(15, ['*'], 'page', $pageNum);
- $render = Tools::paginateRender($codes);
- return $response->write(
- $this->view()
- ->assign('codes', $codes)
- ->assign('payments', Payment::getPaymentsEnabled())
- ->assign('render', $render)
- ->display('user/code.tpl')
- );
- }
- /**
- * @param array $args
- */
- public function codeCheck(Request $request, Response $response, array $args)
- {
- $time = $request->getQueryParams()['time'];
- $codes = Code::where('userid', '=', $this->user->id)
- ->where('usedatetime', '>', date('Y-m-d H:i:s', $time))
- ->first();
- if ($codes !== null && strpos($codes->code, '充值') !== false) {
- return $response->withJson([
- 'ret' => 1,
- ]);
- }
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- /**
- * @param array $args
- */
- public function codePost(Request $request, Response $response, array $args)
- {
- $code = trim($request->getParam('code'));
- if ($code === '') {
- return ResponseHelper::error($response, '请填写充值码');
- }
- $codeq = Code::where('code', $code)->where('isused', 0)->first();
- if ($codeq === null) {
- return ResponseHelper::error($response, '没有这个充值码');
- }
- $user = $this->user;
- $codeq->isused = 1;
- $codeq->usedatetime = date('Y-m-d H:i:s');
- $codeq->userid = $user->id;
- $codeq->save();
- if ($codeq->type === -1) {
- $user->money += $codeq->number;
- $user->save();
- // 返利
- if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_recharge') {
- Payback::rebate($user->id, $codeq->number);
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '兑换成功,金额为 ' . $codeq->number . ' 元',
- ]);
- }
- if ($codeq->type === 10001) {
- $user->transfer_enable += $codeq->number * 1024 * 1024 * 1024;
- $user->save();
- }
- if ($codeq->type === 10002) {
- if (\time() > strtotime($user->expire_in)) {
- $user->expire_in = date('Y-m-d H:i:s', \time() + $codeq->number * 86400);
- } else {
- $user->expire_in = date('Y-m-d H:i:s', strtotime($user->expire_in) + $codeq->number * 86400);
- }
- $user->save();
- }
- if ($codeq->type >= 1 && $codeq->type <= 10000) {
- if ($user->class === 0 || $user->class !== $codeq->type) {
- $user->class_expire = date('Y-m-d H:i:s', \time());
- $user->save();
- }
- $user->class_expire = date('Y-m-d H:i:s', strtotime($user->class_expire) + $codeq->number * 86400);
- $user->class = $codeq->type;
- $user->save();
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '',
- ]);
- }
- /**
- * @param array $args
- */
- public function checkGa(Request $request, Response $response, array $args)
- {
- $code = $request->getParam('code');
- if ($code === '') {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '二维码不能为空',
- ]);
- }
- $user = $this->user;
- $ga = new GA();
- $rcode = $ga->verifyCode($user->ga_token, $code);
- if (! $rcode) {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '测试错误',
- ]);
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '测试成功',
- ]);
- }
- /**
- * @param array $args
- */
- public function setGa(Request $request, Response $response, array $args)
- {
- $enable = $request->getParam('enable');
- if ($enable === '') {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '选项无效',
- ]);
- }
- $user = $this->user;
- $user->ga_enable = $enable;
- $user->save();
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '设置成功',
- ]);
- }
- /**
- * @param array $args
- */
- public function resetPort(Request $request, Response $response, array $args)
- {
- $temp = $this->user->resetPort();
- return $response->withJson([
- 'ret' => ($temp['ok'] === true ? 1 : 0),
- 'msg' => $temp['msg'],
- ]);
- }
- /**
- * @param array $args
- */
- public function specifyPort(Request $request, Response $response, array $args)
- {
- $temp = $this->user->specifyPort((int) $request->getParam('port'));
- return $response->withJson([
- 'ret' => ($temp['ok'] === true ? 1 : 0),
- 'msg' => $temp['msg'],
- ]);
- }
- /**
- * @param array $args
- */
- public function resetGa(Request $request, Response $response, array $args)
- {
- $ga = new GA();
- $secret = $ga->createSecret();
- $user = $this->user;
- $user->ga_token = $secret;
- $user->save();
- return $response->withStatus(302)->withHeader('Location', '/user/edit');
- }
- /**
- * @param array $args
- */
- public function profile(Request $request, Response $response, array $args)
- {
- $pageNum = $request->getQueryParams()['page'] ?? 1;
- $paybacks = Payback::where('ref_by', $this->user->id)
- ->orderBy('datetime', 'desc')
- ->paginate(15, ['*'], 'page', $pageNum);
- // 登录IP
- $totallogin = LoginIp::where('userid', '=', $this->user->id)->where('type', '=', 0)->orderBy('datetime', 'desc')->take(10)->get();
- // 使用IP
- $userip = [];
- $iplocation = new QQWry();
- $total = Ip::where('datetime', '>=', \time() - 300)->where('userid', '=', $this->user->id)->get();
- foreach ($total as $single) {
- $single->ip = Tools::getRealIp($single->ip);
- $is_node = Node::where('node_ip', $single->ip)->first();
- if ($is_node) {
- continue;
- }
- if (! isset($userip[$single->ip])) {
- $location = $iplocation->getlocation($single->ip);
- $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
- }
- }
- if ($request->getParam('json') === 1) {
- return $response->withJson([
- 'ret' => 1,
- 'paybacks' => $paybacks,
- 'userloginip' => $totallogin,
- 'userip' => $userip,
- ]);
- }
- $boughts = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->get();
- return $response->write(
- $this->view()
- ->assign('boughts', $boughts)
- ->assign('userip', $userip)
- ->assign('userloginip', $totallogin)
- ->assign('paybacks', $paybacks)
- ->registerClass('Tools', Tools::class)
- ->display('user/profile.tpl')
- );
- }
- /**
- * @param array $args
- */
- public function announcement(Request $request, Response $response, array $args)
- {
- $Anns = Ann::orderBy('date', 'desc')->get();
- if ($request->getParam('json') === 1) {
- return $response->withJson([
- 'Anns' => $Anns,
- 'ret' => 1,
- ]);
- }
- return $response->write(
- $this->view()
- ->assign('anns', $Anns)
- ->display('user/announcement.tpl')
- );
- }
- /**
- * @param array $args
- */
- public function docs(Request $request, Response $response, array $args)
- {
- $docs = Docs::orderBy('id', 'desc')->get();
- if ($request->getParam('json') === 1) {
- return $response->withJson([
- 'docs' => $docs,
- 'ret' => 1,
- ]);
- }
- return $response->write(
- $this->view()
- ->assign('docs', $docs)
- ->display('user/docs.tpl')
- );
- }
- /**
- * @param array $args
- */
- public function media(Request $request, Response $response, array $args)
- {
- $results = [];
- $db = new DatatablesHelper();
- $nodes = $db->query('SELECT DISTINCT node_id FROM stream_media');
- foreach ($nodes as $node_id) {
- $node = Node::where('id', $node_id)->first();
- $unlock = StreamMedia::where('node_id', $node_id)
- ->orderBy('id', 'desc')
- ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据
- ->first();
- if ($unlock !== null && $node !== null) {
- $details = \json_decode($unlock->result, true);
- $details = str_replace('Originals Only', '仅限自制', $details);
- $details = str_replace('Oversea Only', '仅限海外', $details);
- foreach ($details as $key => $value) {
- $info = [
- 'node_name' => $node->name,
- 'created_at' => $unlock->created_at,
- 'unlock_item' => $details,
- ];
- }
- array_push($results, $info);
- }
- }
- if ($_ENV['streaming_media_unlock_multiplexing'] !== null) {
- foreach ($_ENV['streaming_media_unlock_multiplexing'] as $key => $value) {
- $key_node = Node::where('id', $key)->first();
- $value_node = StreamMedia::where('node_id', $value)
- ->orderBy('id', 'desc')
- ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据
- ->first();
- if ($value_node !== null) {
- $details = \json_decode($value_node->result, true);
- $details = str_replace('Originals Only', '仅限自制', $details);
- $details = str_replace('Oversea Only', '仅限海外', $details);
- $info = [
- 'node_name' => $key_node->name,
- 'created_at' => $value_node->created_at,
- 'unlock_item' => $details,
- ];
- array_push($results, $info);
- }
- }
- }
- array_multisort(array_column($results, 'node_name'), SORT_ASC, $results);
- return $this->view()
- ->assign('results', $results)
- ->display('user/media.tpl');
- }
- /**
- * @param array $args
- */
- public function edit(Request $request, Response $response, array $args)
- {
- $themes = Tools::getDir(BASE_PATH . '/resources/views');
- $bind_token = TelegramSessionManager::addBindSession($this->user);
- $methods = Config::getSupportParam('method');
- return $this->view()
- ->assign('user', $this->user)
- ->assign('themes', $themes)
- ->assign('bind_token', $bind_token)
- ->assign('methods', $methods)
- ->assign('telegram_bot', $_ENV['telegram_bot'])
- ->registerClass('Config', Config::class)
- ->registerClass('URL', URL::class)
- ->display('user/edit.tpl');
- }
- /**
- * @param array $args
- */
- public function invite(Request $request, Response $response, array $args)
- {
- $code = InviteCode::where('user_id', $this->user->id)->first();
- if ($code === null) {
- $this->user->addInviteCode();
- $code = InviteCode::where('user_id', $this->user->id)->first();
- }
- $pageNum = $request->getQueryParams()['page'] ?? 1;
- $paybacks = Payback::where('ref_by', $this->user->id)
- ->orderBy('id', 'desc')
- ->paginate(15, ['*'], 'page', $pageNum);
- $paybacks_sum = Payback::where('ref_by', $this->user->id)->sum('ref_get');
- if (! $paybacks_sum) {
- $paybacks_sum = 0;
- }
- $render = Tools::paginateRender($paybacks);
- $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code->code;
- return $this->view()
- ->assign('code', $code)
- ->assign('render', $render)
- ->assign('paybacks', $paybacks)
- ->assign('invite_url', $invite_url)
- ->assign('paybacks_sum', $paybacks_sum)
- ->display('user/invite.tpl');
- }
- /**
- * @param array $args
- */
- public function buyInvite(Request $request, Response $response, array $args)
- {
- $price = Setting::obtain('invite_price');
- $num = $request->getParam('num');
- $num = trim($num);
- if (! Tools::isInt($num) || $price < 0 || $num <= 0) {
- return ResponseHelper::error($response, '非法请求');
- }
- $amount = $price * $num;
- $user = $this->user;
- if (! $user->isLogin) {
- return $response->withJson([ 'ret' => -1 ]);
- }
- if ($user->money < $amount) {
- return ResponseHelper::error($response, '余额不足,总价为' . $amount . '元。');
- }
- $user->invite_num += $num;
- $user->money -= $amount;
- $user->save();
- return ResponseHelper::successfully($response, '邀请次数添加成功');
- }
- /**
- * @param array $args
- */
- public function customInvite(Request $request, Response $response, array $args)
- {
- $price = Setting::obtain('custom_invite_price');
- $customcode = $request->getParam('customcode');
- $customcode = trim($customcode);
- if (Tools::isSpecialChars($customcode) || $price < 0 || $customcode === '' || strlen($customcode) > 32) {
- return ResponseHelper::error(
- $response,
- '定制失败,邀请链接不能为空,后缀不能包含特殊符号且长度不能大于32字符'
- );
- }
- if (InviteCode::where('code', $customcode)->count() !== 0) {
- return ResponseHelper::error($response, '此后缀名被抢注了');
- }
- $user = $this->user;
- if (! $user->isLogin) {
- return $response->withJson([ 'ret' => -1 ]);
- }
- if ($user->money < $price) {
- return ResponseHelper::error(
- $response,
- '余额不足,总价为' . $price . '元。'
- );
- }
- $code = InviteCode::where('user_id', $user->id)->first();
- $code->code = $customcode;
- $user->money -= $price;
- $user->save();
- $code->save();
- return ResponseHelper::successfully($response, '定制成功');
- }
- /**
- * @param array $args
- */
- public function updatePassword(Request $request, Response $response, array $args)
- {
- $oldpwd = $request->getParam('oldpwd');
- $pwd = $request->getParam('pwd');
- $repwd = $request->getParam('repwd');
- $user = $this->user;
- if (! Hash::checkPassword($user->pass, $oldpwd)) {
- return ResponseHelper::error($response, '旧密码错误');
- }
- if ($pwd !== $repwd) {
- return ResponseHelper::error($response, '两次输入不符合');
- }
- if (strlen($pwd) < 8) {
- return ResponseHelper::error($response, '密码太短啦');
- }
- $hashPwd = Hash::passwordHash($pwd);
- $user->pass = $hashPwd;
- $user->save();
- if ($_ENV['enable_forced_replacement'] === true) {
- $user->cleanLink();
- }
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function updateEmail(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $newemail = $request->getParam('newemail');
- $oldemail = $user->email;
- $otheruser = User::where('email', $newemail)->first();
- if ($_ENV['enable_change_email'] !== true) {
- return ResponseHelper::error($response, '此项不允许自行修改,请联系管理员操作');
- }
- if (Setting::obtain('reg_email_verify')) {
- $emailcode = $request->getParam('emailcode');
- $mailcount = EmailVerify::where('email', '=', $newemail)->where('code', '=', $emailcode)->where('expire_in', '>', \time())->first();
- if ($mailcount === null) {
- return ResponseHelper::error($response, '您的邮箱验证码不正确');
- }
- }
- if ($newemail === '') {
- return ResponseHelper::error($response, '未填写邮箱');
- }
- $check_res = Check::isEmailLegal($newemail);
- if ($check_res['ret'] === 0) {
- return $response->withJson($check_res);
- }
- if ($otheruser !== null) {
- return ResponseHelper::error($response, '邮箱已经被使用了');
- }
- if ($newemail === $oldemail) {
- return ResponseHelper::error($response, '新邮箱不能和旧邮箱一样');
- }
- $antiXss = new AntiXSS();
- $user->email = $antiXss->xss_clean($newemail);
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function updateUsername(Request $request, Response $response, array $args)
- {
- $newusername = $request->getParam('newusername');
- $user = $this->user;
- $antiXss = new AntiXSS();
- $user->user_name = $antiXss->xss_clean($newusername);
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function bought(Request $request, Response $response, array $args)
- {
- $pageNum = $request->getQueryParams()['page'] ?? 1;
- $shops = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
- if ($request->getParam('json') === 1) {
- foreach ($shops as $shop) {
- $shop->datetime = $shop->datetime();
- $shop->name = $shop->shop()->name;
- $shop->content = $shop->shop()->content();
- }
- return $response->withJson([
- 'ret' => 1,
- 'shops' => $shops,
- ]);
- }
- $render = Tools::paginateRender($shops);
- return $this->view()
- ->assign('shops', $shops)
- ->assign('render', $render)
- ->display('user/bought.tpl');
- }
- /**
- * @param array $args
- */
- public function deleteBoughtGet(Request $request, Response $response, array $args)
- {
- $id = $request->getParam('id');
- $shop = Bought::where('id', $id)->where('userid', $this->user->id)->first();
- if ($shop === null) {
- return ResponseHelper::error($response, '关闭自动续费失败,订单不存在。');
- }
- if ($this->user->id === $shop->userid) {
- $shop->renew = 0;
- }
- if (! $shop->save()) {
- return ResponseHelper::error($response, '关闭自动续费失败');
- }
- return ResponseHelper::successfully($response, '关闭自动续费成功');
- }
- /**
- * @param array $args
- */
- public function updateContact(Request $request, Response $response, array $args)
- {
- $type = $request->getParam('imtype');
- $contact = trim($request->getParam('contact'));
- $user = $this->user;
- if ($user->telegram_id !== null) {
- return ResponseHelper::error(
- $response,
- '您绑定了 Telegram ,所以此项并不能被修改。'
- );
- }
- if ($contact === '' || $type === '') {
- return ResponseHelper::error($response, '非法输入');
- }
- $user1 = User::where('im_value', $contact)->where('im_type', $type)->first();
- if ($user1 !== null) {
- return ResponseHelper::error($response, '此联络方式已经被注册');
- }
- $user->im_type = $type;
- $antiXss = new AntiXSS();
- $user->im_value = $antiXss->xss_clean($contact);
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function updateSSR(Request $request, Response $response, array $args)
- {
- $protocol = $request->getParam('protocol');
- $obfs = $request->getParam('obfs');
- $obfs_param = $request->getParam('obfs_param');
- $obfs_param = trim($obfs_param);
- $user = $this->user;
- if ($obfs === '' || $protocol === '') {
- return ResponseHelper::error($response, '非法输入');
- }
- if (! Tools::isParamValidate('obfs', $obfs)) {
- return ResponseHelper::error($response, '协议无效');
- }
- if (! Tools::isParamValidate('protocol', $protocol)) {
- return ResponseHelper::error($response, '协议无效');
- }
- $antiXss = new AntiXSS();
- $user->protocol = $antiXss->xss_clean($protocol);
- $user->obfs = $antiXss->xss_clean($obfs);
- $user->obfs_param = $antiXss->xss_clean($obfs_param);
- if (! Tools::checkNoneProtocol($user)) {
- return ResponseHelper::error(
- $response,
- '系统检测到您目前的加密方式为 none ,但您将要设置为的协议并不在以下协议<br>'
- . implode(',', Config::getSupportParam('allow_none_protocol'))
- . '<br>之内,请您先修改您的加密方式,再来修改此处设置。'
- );
- }
- if (! URL::SSCanConnect($user) && ! URL::SSRCanConnect($user)) {
- return ResponseHelper::error(
- $response,
- '您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。'
- );
- }
- $user->save();
- if (! URL::SSCanConnect($user)) {
- return ResponseHelper::error(
- $response,
- '设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。'
- );
- }
- if (! URL::SSRCanConnect($user)) {
- return ResponseHelper::error(
- $response,
- '设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。'
- );
- }
- return ResponseHelper::successfully($response, '设置成功,您可自由选用客户端来连接。');
- }
- /**
- * @param array $args
- */
- public function updateTheme(Request $request, Response $response, array $args)
- {
- $theme = $request->getParam('theme');
- $user = $this->user;
- if ($theme === '') {
- return ResponseHelper::error($response, '非法输入');
- }
- $antiXss = new AntiXSS();
- $user->theme = $antiXss->xss_clean($theme);
- $user->save();
- return ResponseHelper::successfully($response, '设置成功');
- }
- /**
- * @param array $args
- */
- public function updateMail(Request $request, Response $response, array $args)
- {
- $value = (int) $request->getParam('mail');
- if (\in_array($value, [0, 1, 2])) {
- $user = $this->user;
- if ($value === 2 && $_ENV['enable_telegram'] === false) {
- return ResponseHelper::error(
- $response,
- '修改失败,当前无法使用 Telegram 接收每日报告'
- );
- }
- $user->sendDailyMail = $value;
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- return ResponseHelper::error($response, '非法输入');
- }
- /**
- * @param array $args
- */
- public function resetPasswd(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $pwd = Tools::genRandomChar(16);
- $current_timestamp = \time();
- $new_uuid = Uuid::uuid3(Uuid::NAMESPACE_DNS, $user->email . '|' . $current_timestamp);
- $existing_uuid = User::where('uuid', $new_uuid)->first();
- if ($existing_uuid !== null) {
- return ResponseHelper::error($response, '目前出现一些问题,请稍后再试');
- }
- $user->uuid = $new_uuid;
- $user->passwd = $pwd;
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function updateMethod(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $antiXss = new AntiXSS();
- $method = strtolower($antiXss->xss_clean($request->getParam('method')));
- if ($method === '') {
- ResponseHelper::error($response, '非法输入');
- }
- if (! Tools::isParamValidate('method', $method)) {
- ResponseHelper::error($response, '加密无效');
- }
- $user->method = $method;
- $user->save();
- return ResponseHelper::successfully($response, '修改成功');
- }
- /**
- * @param array $args
- */
- public function logout(Request $request, Response $response, array $args)
- {
- Auth::logout();
- return $response->withStatus(302)->withHeader('Location', '/');
- }
- /**
- * @param array $args
- */
- public function doCheckIn(Request $request, Response $response, array $args)
- {
- if ($_ENV['enable_checkin'] === false) {
- return ResponseHelper::error($response, '暂时还不能签到');
- }
- if (Setting::obtain('enable_checkin_captcha') === true) {
- $ret = Captcha::verify($request->getParams());
- if (! $ret) {
- return ResponseHelper::error($response, '系统无法接受您的验证结果,请刷新页面后重试');
- }
- }
- if (strtotime($this->user->expire_in) < \time()) {
- return ResponseHelper::error($response, '没有过期的账户才可以签到');
- }
- $checkin = $this->user->checkin();
- if ($checkin['ok'] === false) {
- return ResponseHelper::error($response, $checkin['msg']);
- }
- return $response->withJson([
- 'ret' => 1,
- 'trafficInfo' => [
- 'todayUsedTraffic' => $this->user->todayUsedTraffic(),
- 'lastUsedTraffic' => $this->user->lastUsedTraffic(),
- 'unUsedTraffic' => $this->user->unusedTraffic(),
- ],
- 'traffic' => Tools::flowAutoShow($this->user->transfer_enable),
- 'unflowtraffic' => $this->user->transfer_enable,
- 'msg' => $checkin['msg'],
- ]);
- }
- /**
- * @param array $args
- */
- public function kill(Request $request, Response $response, array $args)
- {
- return $this->view()->display('user/kill.tpl');
- }
- /**
- * @param array $args
- */
- public function handleKill(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $passwd = $request->getParam('passwd');
- if (! Hash::checkPassword($user->pass, $passwd)) {
- return ResponseHelper::error($response, '密码错误');
- }
- if ($_ENV['enable_kill'] === true) {
- Auth::logout();
- $user->killUser();
- return ResponseHelper::successfully($response, '您的帐号已经从我们的系统中删除。欢迎下次光临');
- }
- return ResponseHelper::error($response, '管理员不允许删除,如需删除请联系管理员。');
- }
- /**
- * @param array $args
- */
- public function banned(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- return $this->view()
- ->assign('banned_reason', $user->banned_reason)
- ->display('user/banned.tpl');
- }
- /**
- * @param array $args
- */
- public function resetTelegram(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $user->telegramReset();
- return ResponseHelper::successfully($response, '重置成功');
- }
- /**
- * @param array $args
- */
- public function resetURL(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $user->cleanLink();
- return ResponseHelper::successfully($response, '重置成功');
- }
- /**
- * @param array $args
- */
- public function resetInviteURL(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $user->clearInviteCodes();
- return ResponseHelper::successfully($response, '重置成功');
- }
- /**
- * @param array $args
- */
- public function backtoadmin(Request $request, Response $response, array $args)
- {
- $userid = Cookie::get('uid');
- $adminid = Cookie::get('old_uid');
- $user = User::find($userid);
- $admin = User::find($adminid);
- if (! $admin->is_admin || ! $user) {
- Cookie::set([
- 'uid' => null,
- 'email' => null,
- 'key' => null,
- 'ip' => null,
- 'expire_in' => null,
- 'old_uid' => null,
- 'old_email' => null,
- 'old_key' => null,
- 'old_ip' => null,
- 'old_expire_in' => null,
- 'old_local' => null,
- ], \time() - 1000);
- }
- $expire_in = Cookie::get('old_expire_in');
- $local = Cookie::get('old_local');
- Cookie::set([
- 'uid' => Cookie::get('old_uid'),
- 'email' => Cookie::get('old_email'),
- 'key' => Cookie::get('old_key'),
- 'ip' => Cookie::get('old_ip'),
- 'expire_in' => $expire_in,
- 'old_uid' => null,
- 'old_email' => null,
- 'old_key' => null,
- 'old_ip' => null,
- 'old_expire_in' => null,
- 'old_local' => null,
- ], $expire_in);
- return $response->withStatus(302)->withHeader('Location', $local);
- }
- /**
- * @param array $args
- */
- public function getUserAllURL(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- $type = $request->getQueryParams()['type'];
- $return = '';
- switch ($type) {
- case 'ss':
- $return .= URL::getNewAllUrl($user, ['type' => 'ss']) . PHP_EOL;
- break;
- case 'ssr':
- $return .= URL::getNewAllUrl($user, ['type' => 'ssr']) . PHP_EOL;
- break;
- case 'v2ray':
- $return .= URL::getNewAllUrl($user, ['type' => 'vmess']) . PHP_EOL;
- break;
- default:
- $return .= '悟空别闹!';
- break;
- }
- $response = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')
- ->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')
- ->withHeader('Content-Disposition', ' attachment; filename=node.txt');
- return $response->write($return);
- }
- /**
- * 订阅记录
- *
- * @param array $args
- */
- public function subscribeLog(Request $request, Response $response, array $args)
- {
- if ($_ENV['subscribeLog_show'] === false) {
- return $response->withStatus(302)->withHeader('Location', '/user');
- }
- $pageNum = $request->getQueryParams()['page'] ?? 1;
- $logs = UserSubscribeLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
- $render = Tools::paginateRender($logs);
- return $this->view()
- ->assign('logs', $logs)
- ->assign('render', $render)
- ->registerClass('Tools', Tools::class)
- ->fetch('user/subscribe_log.tpl');
- }
- /**
- * @param array $args
- */
- public function switchThemeMode(Request $request, Response $response, array $args)
- {
- $user = $this->user;
- if ($user->is_dark_mode === 1) {
- $user->is_dark_mode = 0;
- } else {
- $user->is_dark_mode = 1;
- }
- $user->save();
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '切换成功',
- ]);
- }
- }
|