UserController.php 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713
  1. <?php
  2. namespace App\Controllers;
  3. use App\Services\Auth;
  4. use App\Models\Node;
  5. use App\Models\TrafficLog;
  6. use App\Models\InviteCode;
  7. use App\Models\CheckInLog;
  8. use App\Models\Ann;
  9. use App\Models\Speedtest;
  10. use App\Models\Shop;
  11. use App\Models\Coupon;
  12. use App\Models\Bought;
  13. use App\Models\Ticket;
  14. use App\Services\Config;
  15. use App\Utils\Hash;
  16. use App\Utils\Tools;
  17. use App\Utils\Radius;
  18. use App\Utils\Wecenter;
  19. use App\Models\RadiusBan;
  20. use App\Models\DetectLog;
  21. use App\Models\DetectRule;
  22. use voku\helper\AntiXSS;
  23. use App\Models\User;
  24. use App\Models\Code;
  25. use App\Models\Ip;
  26. use App\Models\Paylist;
  27. use App\Models\LoginIp;
  28. use App\Models\BlockIp;
  29. use App\Models\UnblockIp;
  30. use App\Models\Payback;
  31. use App\Models\Relay;
  32. use App\Utils\QQWry;
  33. use App\Utils\GA;
  34. use App\Utils\Geetest;
  35. use App\Utils\Telegram;
  36. use App\Utils\TelegramSessionManager;
  37. use App\Utils\Pay;
  38. use App\Utils\URL;
  39. use App\Services\Mail;
  40. /**
  41. * HomeController
  42. */
  43. class UserController extends BaseController
  44. {
  45. private $user;
  46. public function __construct()
  47. {
  48. $this->user = Auth::getUser();
  49. }
  50. public function index($request, $response, $args)
  51. {
  52. $user = $this->user;
  53. $ios_token = LinkController::GenerateIosCode("smart", 0, $this->user->id, 0, "smart");
  54. $acl_token = LinkController::GenerateAclCode("smart", 0, $this->user->id, 0, "smart");
  55. $router_token = LinkController::GenerateRouterCode($this->user->id, 0);
  56. $router_token_without_mu = LinkController::GenerateRouterCode($this->user->id, 1);
  57. $ssr_sub_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
  58. $uid = time().rand(1, 10000) ;
  59. if (Config::get('enable_geetest_checkin') == 'true') {
  60. $GtSdk = Geetest::get($uid);
  61. } else {
  62. $GtSdk = null;
  63. }
  64. $Ann = Ann::orderBy('date', 'desc')->first();
  65. return $this->view()->assign("ssr_sub_token", $ssr_sub_token)->assign("router_token", $router_token)
  66. ->assign("router_token_without_mu", $router_token_without_mu)->assign("acl_token", $acl_token)
  67. ->assign('ann', $Ann)->assign('geetest_html', $GtSdk)->assign("ios_token", $ios_token)
  68. ->assign('enable_duoshuo', Config::get('enable_duoshuo'))->assign('duoshuo_shortname', Config::get('duoshuo_shortname'))
  69. ->assign("user", $this->user)->registerClass("URL", "App\Utils\URL")->assign('baseUrl', Config::get('baseUrl'))->display('user/index.tpl');
  70. }
  71. public function panel($request, $response, $args)
  72. {
  73. $user = $this->user;
  74. $ios_token = LinkController::GenerateIosCode("smart", 0, $this->user->id, 0, "smart");
  75. $acl_token = LinkController::GenerateAclCode("smart", 0, $this->user->id, 0, "smart");
  76. $router_token = LinkController::GenerateRouterCode($this->user->id, 0);
  77. $router_token_without_mu = LinkController::GenerateRouterCode($this->user->id, 1);
  78. $ssr_sub_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
  79. $uid = time().rand(1, 10000) ;
  80. if (Config::get('enable_geetest_checkin') == 'true') {
  81. $GtSdk = Geetest::get($uid);
  82. } else {
  83. $GtSdk = null;
  84. }
  85. $Ann = Ann::orderBy('date', 'desc')->first();
  86. return $this->view()->assign("ssr_sub_token", $ssr_sub_token)->assign("router_token", $router_token)
  87. ->assign("router_token_without_mu", $router_token_without_mu)->assign("acl_token", $acl_token)
  88. ->assign('ann', $Ann)->assign('geetest_html', $GtSdk)->assign("ios_token", $ios_token)
  89. ->assign('enable_duoshuo', Config::get('enable_duoshuo'))->assign('duoshuo_shortname', Config::get('duoshuo_shortname'))
  90. ->assign("user", $this->user)->registerClass("URL", "App\Utils\URL")->assign('baseUrl', Config::get('baseUrl'))->display('user/panel.tpl');
  91. }
  92. public function lookingglass($request, $response, $args)
  93. {
  94. $Speedtest=Speedtest::where("datetime", ">", time()-Config::get('Speedtest_duration')*3600)->orderBy('datetime', 'desc')->get();
  95. return $this->view()->assign('speedtest', $Speedtest)->assign('hour', Config::get('Speedtest_duration'))->display('user/lookingglass.tpl');
  96. }
  97. public function node_admin($request, $response, $args)
  98. {
  99. $user = Auth::getUser();
  100. if ($user->is_admin) {
  101. $nodes = Node::where('type', 1)->orderBy('name')->get();
  102. } else {
  103. $nodes = Node::where(
  104. function ($query) {
  105. $query->Where("node_group", "=", $this->user->node_group)
  106. ->orWhere("node_group", "=", 0);
  107. }
  108. )->where('type', 1)->where("node_class", "<=", $this->user->class)->orderBy('name')->get();
  109. }
  110. $relay_rules = Relay::where('user_id', $this->user->id)->orwhere('user_id', 0)->orderBy('id', 'asc')->get();
  111. if (!Tools::is_protocol_relay($user)) {
  112. $relay_rules = array();
  113. }
  114. $node_prefix=array();
  115. $node_method=array();
  116. $a=0;
  117. $node_order=array();
  118. $node_alive=array();
  119. $node_prealive=array();
  120. $node_heartbeat=array();
  121. $node_bandwidth=array();
  122. $node_muport=array();
  123. $node_isv6=array();
  124. if ($user->is_admin) {
  125. $ports_count = Node::where('type', 1)->where('sort', 9)->orderBy('name')->count();
  126. } else {
  127. $ports_count = Node::where(
  128. function ($query) use ($user) {
  129. $query->Where("node_group", "=", $user->node_group)
  130. ->orWhere("node_group", "=", 0);
  131. }
  132. )->where('type', 1)->where('sort', 9)->where("node_class", "<=", $user->class)->orderBy('name')->count();
  133. }
  134. $ports_count += 1;
  135. foreach ($nodes as $node) {
  136. if ((($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0))||$user->is_admin)&&(!$node->isNodeTrafficOut())) {
  137. if ($node->sort==9) {
  138. $mu_user=User::where('port', '=', $node->server)->first();
  139. $mu_user->obfs_param=$this->user->getMuMd5();
  140. array_push($node_muport, array('server'=>$node,'user'=>$mu_user));
  141. continue;
  142. }
  143. $temp=explode(" - ", $node->name);
  144. $node_isv6[$temp[0]]=$node->isv6;
  145. if (!isset($node_prefix[$temp[0]])) {
  146. $node_prefix[$temp[0]]=array();
  147. $node_order[$temp[0]]=$a;
  148. $node_alive[$temp[0]]=0;
  149. if (isset($temp[1])) {
  150. $node_method[$temp[0]]=$temp[1];
  151. } else {
  152. $node_method[$temp[0]]="";
  153. }
  154. $a++;
  155. }
  156. if ($node->sort==0||$node->sort==7||$node->sort==8||$node->sort==10) {
  157. $node_tempalive=$node->getOnlineUserCount();
  158. $node_prealive[$node->id]=$node_tempalive;
  159. if ($node->isNodeOnline() !== null) {
  160. if ($node->isNodeOnline() === false) {
  161. $node_heartbeat[$temp[0]]="离线";
  162. } else {
  163. $node_heartbeat[$temp[0]]="在线";
  164. }
  165. } else {
  166. if (!isset($node_heartbeat[$temp[0]])) {
  167. $node_heartbeat[$temp[0]]="暂无数据";
  168. }
  169. }
  170. if ($node->node_bandwidth_limit==0) {
  171. $node_bandwidth[$temp[0]]=(int)($node->node_bandwidth/1024/1024/1024)." GB / 不限";
  172. } else {
  173. $node_bandwidth[$temp[0]]=(int)($node->node_bandwidth/1024/1024/1024)." GB / ".(int)($node->node_bandwidth_limit/1024/1024/1024)." GB - ".$node->bandwidthlimit_resetday." 日重置";
  174. }
  175. if ($node_tempalive!="暂无数据") {
  176. $node_alive[$temp[0]]=$node_alive[$temp[0]]+$node_tempalive;
  177. }
  178. } else {
  179. $node_prealive[$node->id]="暂无数据";
  180. if (!isset($node_heartbeat[$temp[0]])) {
  181. $node_heartbeat[$temp[0]]="暂无数据";
  182. }
  183. }
  184. if (isset($temp[1])) {
  185. if (strpos($node_method[$temp[0]], $temp[1])===false) {
  186. $node_method[$temp[0]]=$node_method[$temp[0]]." ".$temp[1];
  187. }
  188. }
  189. array_push($node_prefix[$temp[0]], $node);
  190. }
  191. }
  192. $node_prefix=(object)$node_prefix;
  193. $node_order=(object)$node_order;
  194. $tools = new Tools();
  195. return $this->view()->assign('relay_rules', $relay_rules)->assign('node_isv6', $node_isv6)->assign('tools', $tools)->assign('node_method', $node_method)->assign('node_muport', $node_muport)->assign('node_bandwidth', $node_bandwidth)->assign('node_heartbeat', $node_heartbeat)->assign('node_prefix', $node_prefix)->assign('node_prealive', $node_prealive)->assign('node_order', $node_order)->assign('user', $user)->assign('node_alive', $node_alive)->display('user/node_admin.tpl');
  196. }
  197. public function code($request, $response, $args)
  198. {
  199. $pageNum = 1;
  200. if (isset($request->getQueryParams()["page"])) {
  201. $pageNum = $request->getQueryParams()["page"];
  202. }
  203. $codes = Code::where('type', '<>', '-2')->where('userid', '=', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  204. $codes->setPath('/user/code');
  205. return $this->view()->assign('codes', $codes)->assign('pmw', Pay::getHTML($this->user))->display('user/code.tpl');
  206. }
  207. public function donate($request, $response, $args)
  208. {
  209. if (Config::get('enable_donate') != 'true') {
  210. exit(0);
  211. }
  212. $pageNum = 1;
  213. if (isset($request->getQueryParams()["page"])) {
  214. $pageNum = $request->getQueryParams()["page"];
  215. }
  216. $codes = Code::where(
  217. function ($query) {
  218. $query->where("type", "=", -1)
  219. ->orWhere("type", "=", -2);
  220. }
  221. )->where("isused", 1)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  222. $codes->setPath('/user/donate');
  223. return $this->view()->assign('codes', $codes)->assign('total_in', Code::where('isused', 1)->where('type', -1)->sum('number'))->assign('total_out', Code::where('isused', 1)->where('type', -2)->sum('number'))->display('user/donate.tpl');
  224. }
  225. public function code_check($request, $response, $args)
  226. {
  227. $time = $request->getQueryParams()["time"];
  228. $codes = Code::where('userid', '=', $this->user->id)->where('usedatetime', '>', date('Y-m-d H:i:s', $time))->first();
  229. if ($codes!=null && strpos($codes->code, "充值") !== false) {
  230. $res['ret'] = 1;
  231. return $response->getBody()->write(json_encode($res));
  232. } else {
  233. $res['ret'] = 0;
  234. return $response->getBody()->write(json_encode($res));
  235. }
  236. }
  237. public function f2fpayget($request, $response, $args)
  238. {
  239. $time = $request->getQueryParams()["time"];
  240. $res['ret'] = 1;
  241. return $response->getBody()->write(json_encode($res));
  242. }
  243. public function f2fpay($request, $response, $args)
  244. {
  245. $amount = $request->getParam('amount');
  246. if ($amount == "") {
  247. $res['ret'] = 0;
  248. $res['msg'] = "订单金额错误:".$amount;
  249. return $response->getBody()->write(json_encode($res));
  250. }
  251. $user = $this->user;
  252. //生成二维码
  253. $qrPayResult = Pay::alipay_get_qrcode($user, $amount, $qrPay);
  254. // 根据状态值进行业务处理
  255. switch ($qrPayResult->getTradeStatus()){
  256. case "SUCCESS":
  257. $aliresponse = $qrPayResult->getResponse();
  258. $res['ret'] = 1;
  259. $res['msg'] = "二维码生成成功";
  260. $res['amount'] = $amount;
  261. $res['qrcode'] = $qrPay->create_erweima($aliresponse->qr_code);
  262. break;
  263. case "FAILED":
  264. $res['ret'] = 0;
  265. $res['msg'] = "支付宝创建订单二维码失败!!! 请使用其他方式付款。";
  266. break;
  267. case "UNKNOWN":
  268. $res['ret'] = 0;
  269. $res['msg'] = "系统异常,状态未知!!!!!! 请使用其他方式付款。";
  270. break;
  271. default:
  272. $res['ret'] = 0;
  273. $res['msg'] = "创建订单二维码返回异常!!!!!! 请使用其他方式付款。";
  274. break;
  275. }
  276. return $response->getBody()->write(json_encode($res));
  277. }
  278. public function alipay($request, $response, $args)
  279. {
  280. $amount = $request->getQueryParams()["amount"];
  281. Pay::getGen($this->user, $amount);
  282. }
  283. public function codepost($request, $response, $args)
  284. {
  285. $code = $request->getParam('code');
  286. $user = $this->user;
  287. if ($code == "") {
  288. $res['ret'] = 0;
  289. $res['msg'] = "请填好充值码";
  290. return $response->getBody()->write(json_encode($res));
  291. }
  292. $codeq=Code::where("code", "=", $code)->where("isused", "=", 0)->first();
  293. if ($codeq == null) {
  294. $res['ret'] = 0;
  295. $res['msg'] = "此充值码错误";
  296. return $response->getBody()->write(json_encode($res));
  297. }
  298. $codeq->isused=1;
  299. $codeq->usedatetime=date("Y-m-d H:i:s");
  300. $codeq->userid=$user->id;
  301. $codeq->save();
  302. if ($codeq->type==-1) {
  303. $user->money=($user->money+$codeq->number);
  304. $user->save();
  305. if ($user->ref_by!=""&&$user->ref_by!=0&&$user->ref_by!=null) {
  306. $gift_user=User::where("id", "=", $user->ref_by)->first();
  307. $gift_user->money=($gift_user->money+($codeq->number*(Config::get('code_payback')/100)));
  308. $gift_user->save();
  309. $Payback=new Payback();
  310. $Payback->total=$codeq->number;
  311. $Payback->userid=$this->user->id;
  312. $Payback->ref_by=$this->user->ref_by;
  313. $Payback->ref_get=$codeq->number*(Config::get('code_payback')/100);
  314. $Payback->datetime=time();
  315. $Payback->save();
  316. }
  317. $res['ret'] = 1;
  318. $res['msg'] = "充值成功,充值的金额为".$codeq->number."元。";
  319. if (Config::get('enable_donate') == 'true') {
  320. if ($this->user->is_hide == 1) {
  321. Telegram::Send("姐姐姐姐,一位不愿透露姓名的大老爷给我们捐了 ".$codeq->number." 元呢~");
  322. } else {
  323. Telegram::Send("姐姐姐姐,".$this->user->user_name." 大老爷给我们捐了 ".$codeq->number." 元呢~");
  324. }
  325. }
  326. return $response->getBody()->write(json_encode($res));
  327. }
  328. if ($codeq->type==10001) {
  329. $user->transfer_enable=$user->transfer_enable+$codeq->number*1024*1024*1024;
  330. $user->save();
  331. }
  332. if ($codeq->type==10002) {
  333. if (time()>strtotime($user->expire_in)) {
  334. $user->expire_in=date("Y-m-d H:i:s", time()+$codeq->number*86400);
  335. } else {
  336. $user->expire_in=date("Y-m-d H:i:s", strtotime($user->expire_in)+$codeq->number*86400);
  337. }
  338. $user->save();
  339. }
  340. if ($codeq->type>=1&&$codeq->type<=10000) {
  341. if ($user->class==0||$user->class!=$codeq->type) {
  342. $user->class_expire=date("Y-m-d H:i:s", time());
  343. $user->save();
  344. }
  345. $user->class_expire=date("Y-m-d H:i:s", strtotime($user->class_expire)+$codeq->number*86400);
  346. $user->class=$codeq->type;
  347. $user->save();
  348. }
  349. }
  350. public function GaCheck($request, $response, $args)
  351. {
  352. $code = $request->getParam('code');
  353. $user = $this->user;
  354. if ($code == "") {
  355. $res['ret'] = 0;
  356. $res['msg'] = "悟空别闹";
  357. return $response->getBody()->write(json_encode($res));
  358. }
  359. $ga = new GA();
  360. $rcode = $ga->verifyCode($user->ga_token, $code);
  361. if (!$rcode) {
  362. $res['ret'] = 0;
  363. $res['msg'] = "测试错误";
  364. return $response->getBody()->write(json_encode($res));
  365. }
  366. $res['ret'] = 1;
  367. $res['msg'] = "测试成功";
  368. return $response->getBody()->write(json_encode($res));
  369. }
  370. public function GaSet($request, $response, $args)
  371. {
  372. $enable = $request->getParam('enable');
  373. $user = $this->user;
  374. if ($enable == "") {
  375. $res['ret'] = 0;
  376. $res['msg'] = "悟空别闹";
  377. return $response->getBody()->write(json_encode($res));
  378. }
  379. $user->ga_enable=$enable;
  380. $user->save();
  381. $res['ret'] = 1;
  382. $res['msg'] = "设置成功";
  383. return $response->getBody()->write(json_encode($res));
  384. }
  385. public function ResetPort($request, $response, $args)
  386. {
  387. $user = $this->user;
  388. $origin_port = $user->port;
  389. $user->port = Tools::getAvPort();
  390. $user->save();
  391. $relay_rules = Relay::where('user_id', $user->id)->where('port', $origin_port)->get();
  392. foreach ($relay_rules as $rule) {
  393. $rule->port = $user->port;
  394. $rule->save();
  395. }
  396. $res['ret'] = 1;
  397. $res['msg'] = "设置成功,新端口是".$user->port;
  398. return $response->getBody()->write(json_encode($res));
  399. }
  400. public function GaReset($request, $response, $args)
  401. {
  402. $user = $this->user;
  403. $ga = new GA();
  404. $secret = $ga->createSecret();
  405. $user->ga_token=$secret;
  406. $user->save();
  407. $newResponse = $response->withStatus(302)->withHeader('Location', '/user/edit');
  408. return $newResponse;
  409. }
  410. public function nodeAjax($request, $response, $args)
  411. {
  412. $id = $args['id'];
  413. $point_node=Node::find($id);
  414. $prefix=explode(" - ", $point_node->name);
  415. return $this->view()->assign('point_node', $point_node)->assign('prefix', $prefix[0])->assign('id', $id)->display('user/nodeajax.tpl');
  416. }
  417. public function node($request, $response, $args)
  418. {
  419. $user = Auth::getUser();
  420. $nodes = Node::where('type', 1)->orderBy('name')->get();
  421. $relay_rules = Relay::where('user_id', $this->user->id)->orwhere('user_id', 0)->orderBy('id', 'asc')->get();
  422. if (!Tools::is_protocol_relay($user)) {
  423. $relay_rules = array();
  424. }
  425. $node_prefix=array();
  426. $node_method=array();
  427. $a=0;
  428. $node_order=array();
  429. $node_alive=array();
  430. $node_prealive=array();
  431. $node_heartbeat=array();
  432. $node_bandwidth=array();
  433. $node_muport=array();
  434. $node_isv6=array();
  435. $node_class=array();
  436. $ports_count = Node::where('type', 1)->where('sort', 9)->orderBy('name')->count();
  437. $ports_count += 1;
  438. foreach ($nodes as $node) {
  439. if (((($user->node_group==$node->node_group||$node->node_group==0))||$user->is_admin)&&(!$node->isNodeTrafficOut())) {
  440. if ($node->sort==9) {
  441. $mu_user=User::where('port', '=', $node->server)->first();
  442. $mu_user->obfs_param=$this->user->getMuMd5();
  443. array_push($node_muport, array('server'=>$node,'user'=>$mu_user));
  444. continue;
  445. }
  446. $temp=explode(" - ", $node->name);
  447. $node_isv6[$temp[0]]=$node->isv6;
  448. $node_class[$temp[0]]=$node->node_class;
  449. if (!isset($node_prefix[$temp[0]])) {
  450. $node_prefix[$temp[0]]=array();
  451. $node_order[$temp[0]]=$a;
  452. $node_alive[$temp[0]]=0;
  453. if (isset($temp[1])) {
  454. $node_method[$temp[0]]=$temp[1];
  455. } else {
  456. $node_method[$temp[0]]="";
  457. }
  458. $a++;
  459. }
  460. if ($node->sort==0||$node->sort==7||$node->sort==8||$node->sort==10) {
  461. $node_tempalive=$node->getOnlineUserCount();
  462. $node_prealive[$node->id]=$node_tempalive;
  463. if ($node->isNodeOnline() !== null) {
  464. if ($node->isNodeOnline() === false) {
  465. $node_heartbeat[$temp[0]]="离线";
  466. } else {
  467. $node_heartbeat[$temp[0]]="在线";
  468. }
  469. } else {
  470. if (!isset($node_heartbeat[$temp[0]])) {
  471. $node_heartbeat[$temp[0]]="暂无数据";
  472. }
  473. }
  474. if ($node->node_bandwidth_limit==0) {
  475. $node_bandwidth[$temp[0]]=(int)($node->node_bandwidth/1024/1024/1024)." GB 已用";
  476. } else {
  477. $node_bandwidth[$temp[0]]=(int)($node->node_bandwidth/1024/1024/1024)." GB / ".(int)($node->node_bandwidth_limit/1024/1024/1024)." GB - ".$node->bandwidthlimit_resetday." 日重置";
  478. }
  479. if ($node_tempalive!="暂无数据") {
  480. $node_alive[$temp[0]]=$node_alive[$temp[0]]+$node_tempalive;
  481. }
  482. } else {
  483. $node_prealive[$node->id]="暂无数据";
  484. if (!isset($node_heartbeat[$temp[0]])) {
  485. $node_heartbeat[$temp[0]]="暂无数据";
  486. }
  487. }
  488. if (isset($temp[1])) {
  489. if (strpos($node_method[$temp[0]], $temp[1])===false) {
  490. $node_method[$temp[0]]=$node_method[$temp[0]]." ".$temp[1];
  491. }
  492. }
  493. array_push($node_prefix[$temp[0]], $node);
  494. }
  495. }
  496. $node_prefix=(object)$node_prefix;
  497. $node_order=(object)$node_order;
  498. $tools = new Tools();
  499. return $this->view()->assign('relay_rules', $relay_rules)->assign('node_class', $node_class)->assign('node_isv6', $node_isv6)->assign('tools', $tools)->assign('node_method', $node_method)->assign('node_muport', $node_muport)->assign('node_bandwidth', $node_bandwidth)->assign('node_heartbeat', $node_heartbeat)->assign('node_prefix', $node_prefix)->assign('node_prealive', $node_prealive)->assign('node_order', $node_order)->assign('user', $user)->assign('node_alive', $node_alive)->display('user/node.tpl');
  500. }
  501. public function nodeInfo($request, $response, $args)
  502. {
  503. $user = Auth::getUser();
  504. $id = $args['id'];
  505. $mu = $request->getQueryParams()["ismu"];
  506. $relay_rule_id = $request->getQueryParams()["relay_rule"];
  507. $node = Node::find($id);
  508. if ($node == null) {
  509. return null;
  510. }
  511. switch ($node->sort) {
  512. case 0:
  513. if ((($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0))||$user->is_admin)&&($node->node_bandwidth_limit==0||$node->node_bandwidth<$node->node_bandwidth_limit)) {
  514. return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->assign('relay_rule_id', $relay_rule_id)->registerClass("URL", "App\Utils\URL")->display('user/nodeinfo.tpl');
  515. }
  516. break;
  517. case 1:
  518. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  519. $email=$this->user->email;
  520. $email=Radius::GetUserName($email);
  521. $json_show="VPN 信息<br>地址:".$node->server."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  522. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfovpn.tpl');
  523. }
  524. break;
  525. case 2:
  526. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  527. $email=$this->user->email;
  528. $email=Radius::GetUserName($email);
  529. $json_show="SSH 信息<br>地址:".$node->server."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  530. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfossh.tpl');
  531. }
  532. break;
  533. case 3:
  534. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  535. $email=$this->user->email;
  536. $email=Radius::GetUserName($email);
  537. $exp = explode(":", $node->server);
  538. $token = LinkController::GenerateCode(3, $exp[0], $exp[1], 0, $this->user->id);
  539. $json_show="PAC 信息<br>地址:".Config::get('baseUrl')."/link/".$token."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  540. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfopac.tpl');
  541. }
  542. break;
  543. case 4:
  544. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  545. $email=$this->user->email;
  546. $email=Radius::GetUserName($email);
  547. $json_show="APN 信息<br>下载地址:".$node->server."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  548. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfoapn.tpl');
  549. }
  550. break;
  551. case 5:
  552. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  553. $email=$this->user->email;
  554. $email=Radius::GetUserName($email);
  555. $json_show="Anyconnect 信息<br>地址:".$node->server."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  556. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfoanyconnect.tpl');
  557. }
  558. break;
  559. case 6:
  560. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  561. $email=$this->user->email;
  562. $email=Radius::GetUserName($email);
  563. $exp = explode(":", $node->server);
  564. $token_cmcc = LinkController::GenerateApnCode("cmnet", $exp[0], $exp[1], $this->user->id);
  565. $token_cnunc = LinkController::GenerateApnCode("3gnet", $exp[0], $exp[1], $this->user->id);
  566. $token_ctnet = LinkController::GenerateApnCode("ctnet", $exp[0], $exp[1], $this->user->id);
  567. $json_show="APN 文件<br>移动地址:".Config::get('baseUrl')."/link/".$token_cmcc."<br>联通地址:".Config::get('baseUrl')."/link/".$token_cnunc."<br>电信地址:".Config::get('baseUrl')."/link/".$token_ctnet."<br>"."用户名:".$email."<br>密码:".$this->user->passwd."<br>支持方式:".$node->method."<br>备注:".$node->info;
  568. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfoapndownload.tpl');
  569. }
  570. break;
  571. case 7:
  572. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  573. $email=$this->user->email;
  574. $email=Radius::GetUserName($email);
  575. $token = LinkController::GenerateCode(7, $node->server, ($this->user->port-20000), 0, $this->user->id);
  576. $json_show="PAC Plus 信息<br>PAC 地址:".Config::get('baseUrl')."/link/".$token."<br>支持方式:".$node->method."<br>备注:".$node->info;
  577. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfopacplus.tpl');
  578. }
  579. break;
  580. case 8:
  581. if ($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0)) {
  582. $email=$this->user->email;
  583. $email=Radius::GetUserName($email);
  584. $token = LinkController::GenerateCode(8, $node->server, ($this->user->port-20000), 0, $this->user->id);
  585. $token_ios = LinkController::GenerateCode(8, $node->server, ($this->user->port-20000), 1, $this->user->id);
  586. $json_show="PAC Plus Plus信息<br>PAC 一般地址:".Config::get('baseUrl')."/link/".$token."<br>PAC iOS 地址:".Config::get('baseUrl')."/link/".$token_ios."<br>"."备注:".$node->info;
  587. return $this->view()->assign('json_show', $json_show)->display('user/nodeinfopacpp.tpl');
  588. }
  589. break;
  590. case 10:
  591. if ((($user->class>=$node->node_class&&($user->node_group==$node->node_group||$node->node_group==0))||$user->is_admin)&&($node->node_bandwidth_limit==0||$node->node_bandwidth<$node->node_bandwidth_limit)) {
  592. return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->assign('relay_rule_id', $relay_rule_id)->registerClass("URL", "App\Utils\URL")->display('user/nodeinfo.tpl');
  593. }
  594. break;
  595. default:
  596. echo "微笑";
  597. }
  598. }
  599. public function GetPcConf($request, $response, $args)
  600. {
  601. $is_mu = $request->getQueryParams()["is_mu"];
  602. $is_ss = $request->getQueryParams()["is_ss"];
  603. $newResponse = $response->withHeader('Content-type', ' application/octet-stream')->withHeader('Content-Disposition', ' attachment; filename=gui-config.json');//->getBody()->write($builder->output());
  604. $newResponse->getBody()->write(LinkController::GetPcConf($this->user, $is_mu, $is_ss));
  605. return $newResponse;
  606. }
  607. public function GetIosConf($request, $response, $args)
  608. {
  609. $newResponse = $response->withHeader('Content-type', ' application/octet-stream')->withHeader('Content-Disposition', ' attachment; filename=allinone.conf');//->getBody()->write($builder->output());
  610. if ($this->user->is_admin) {
  611. $newResponse->getBody()->write(LinkController::GetIosConf(Node::where(
  612. function ($query) {
  613. $query->where('sort', 0)
  614. ->orWhere('sort', 10);
  615. }
  616. )->where("type", "1")->get(), $this->user));
  617. } else {
  618. $newResponse->getBody()->write(LinkController::GetIosConf(Node::where(
  619. function ($query) {
  620. $query->where('sort', 0)
  621. ->orWhere('sort', 10);
  622. }
  623. )->where("type", "1")->where(
  624. function ($query) {
  625. $query->where("node_group", "=", $this->user->node_group)
  626. ->orWhere("node_group", "=", 0);
  627. }
  628. )->where("node_class", "<=", $this->user->class)->get(), $this->user));
  629. }
  630. return $newResponse;
  631. }
  632. public function profile($request, $response, $args)
  633. {
  634. $pageNum = 1;
  635. if (isset($request->getQueryParams()["page"])) {
  636. $pageNum = $request->getQueryParams()["page"];
  637. }
  638. $paybacks = Payback::where("ref_by", $this->user->id)->orderBy("datetime", "desc")->paginate(15, ['*'], 'page', $pageNum);
  639. $paybacks->setPath('/user/profile');
  640. $iplocation = new QQWry();
  641. $userip=array();
  642. $total = Ip::where("datetime",">=",time()-300)->where('userid', '=',$this->user->id)->get();
  643. $totallogin = LoginIp::where('userid', '=', $this->user->id)->where("type", "=", 0)->orderBy("datetime", "desc")->take(10)->get();
  644. $userloginip=array();
  645. foreach ($totallogin as $single) {
  646. //if(isset($useripcount[$single->userid]))
  647. {
  648. if (!isset($userloginip[$single->ip])) {
  649. //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
  650. $location=$iplocation->getlocation($single->ip);
  651. $userloginip[$single->ip]=iconv('gbk', 'utf-8//IGNORE', $location['country'].$location['area']);
  652. }
  653. }
  654. }
  655. foreach($total as $single)
  656. {
  657. //if(isset($useripcount[$single->userid]))
  658. {
  659. $single->ip = Tools::getRealIp($single->ip);
  660. $is_node = Node::where("node_ip", $single->ip)->first();
  661. if($is_node) {
  662. continue;
  663. }
  664. if(!isset($userip[$single->ip]))
  665. {
  666. //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
  667. $location=$iplocation->getlocation($single->ip);
  668. $userip[$single->ip]=iconv('gbk', 'utf-8//IGNORE', $location['country'].$location['area']);
  669. }
  670. }
  671. }
  672. return $this->view()->assign("userip",$userip)->assign("userloginip", $userloginip)->assign("paybacks", $paybacks)->display('user/profile.tpl');
  673. }
  674. public function announcement($request, $response, $args)
  675. {
  676. $Anns = Ann::orderBy('date', 'desc')->get();
  677. return $this->view()->assign("anns", $Anns)->display('user/announcement.tpl');
  678. }
  679. public function edit($request, $response, $args)
  680. {
  681. $themes=Tools::getDir(BASE_PATH."/resources/views");
  682. $BIP = BlockIp::where("ip", $_SERVER["REMOTE_ADDR"])->first();
  683. if ($BIP == null) {
  684. $Block = "IP: ".$_SERVER["REMOTE_ADDR"]." 没有被封";
  685. $isBlock = 0;
  686. } else {
  687. $Block = "IP: ".$_SERVER["REMOTE_ADDR"]." 已被封";
  688. $isBlock = 1;
  689. }
  690. $bind_token = TelegramSessionManager::add_bind_session($this->user);
  691. $config_service = new Config();
  692. return $this->view()->assign('user', $this->user)->assign('themes', $themes)->assign('isBlock', $isBlock)->assign('Block', $Block)->assign('bind_token', $bind_token)->assign('telegram_bot', Config::get('telegram_bot'))->assign('config_service', $config_service)
  693. ->registerClass("URL", "App\Utils\URL")->display('user/edit.tpl');
  694. }
  695. public function invite($request, $response, $args)
  696. {
  697. $pageNum = 1;
  698. if (isset($request->getQueryParams()["page"])) {
  699. $pageNum = $request->getQueryParams()["page"];
  700. }
  701. $codes=InviteCode::where('user_id', $this->user->id)->orderBy("created_at", "desc")->paginate(15, ['*'], 'page', $pageNum);
  702. $codes->setPath('/user/invite');
  703. return $this->view()->assign('codes', $codes)->display('user/invite.tpl');
  704. }
  705. public function doInvite($request, $response, $args)
  706. {
  707. $n = $this->user->invite_num;
  708. if ($n < 1) {
  709. $res['ret'] = 0;
  710. $res['msg'] = "失败";
  711. return $response->getBody()->write(json_encode($res));
  712. }
  713. for ($i = 0; $i < $n; $i++) {
  714. $char = Tools::genRandomChar(32);
  715. $code = new InviteCode();
  716. $code->code = $char;
  717. $code->user_id = $this->user->id;
  718. $code->save();
  719. }
  720. $this->user->invite_num = 0;
  721. $this->user->save();
  722. $res['ret'] = 1;
  723. $res['msg'] = "生成成功。";
  724. return $this->echoJson($response, $res);
  725. }
  726. public function sys()
  727. {
  728. return $this->view()->assign('ana', "")->display('user/sys.tpl');
  729. }
  730. public function updatePassword($request, $response, $args)
  731. {
  732. $oldpwd = $request->getParam('oldpwd');
  733. $pwd = $request->getParam('pwd');
  734. $repwd = $request->getParam('repwd');
  735. $user = $this->user;
  736. if (!Hash::checkPassword($user->pass, $oldpwd)) {
  737. $res['ret'] = 0;
  738. $res['msg'] = "旧密码错误";
  739. return $response->getBody()->write(json_encode($res));
  740. }
  741. if ($pwd != $repwd) {
  742. $res['ret'] = 0;
  743. $res['msg'] = "两次输入不符合";
  744. return $response->getBody()->write(json_encode($res));
  745. }
  746. if (strlen($pwd) < 8) {
  747. $res['ret'] = 0;
  748. $res['msg'] = "密码太短啦";
  749. return $response->getBody()->write(json_encode($res));
  750. }
  751. $hashPwd = Hash::passwordHash($pwd);
  752. $user->pass = $hashPwd;
  753. $user->save();
  754. $user->clean_link();
  755. $res['ret'] = 1;
  756. $res['msg'] = "修改成功";
  757. return $this->echoJson($response, $res);
  758. }
  759. public function updateHide($request, $response, $args)
  760. {
  761. $hide = $request->getParam('hide');
  762. $user = $this->user;
  763. $user->is_hide = $hide;
  764. $user->save();
  765. $res['ret'] = 1;
  766. $res['msg'] = "修改成功";
  767. return $this->echoJson($response, $res);
  768. }
  769. public function Unblock($request, $response, $args)
  770. {
  771. $user = $this->user;
  772. $BIP = BlockIp::where("ip", $_SERVER["REMOTE_ADDR"])->get();
  773. foreach ($BIP as $bi) {
  774. $bi->delete();
  775. }
  776. $UIP = new UnblockIp();
  777. $UIP->userid = $user->id;
  778. $UIP->ip = $_SERVER["REMOTE_ADDR"];
  779. $UIP->datetime = time();
  780. $UIP->save();
  781. $res['ret'] = 1;
  782. $res['msg'] = "发送解封命令解封 ".$_SERVER["REMOTE_ADDR"]." 成功";
  783. return $this->echoJson($response, $res);
  784. }
  785. public function shop($request, $response, $args)
  786. {
  787. $pageNum = 1;
  788. if (isset($request->getQueryParams()["page"])) {
  789. $pageNum = $request->getQueryParams()["page"];
  790. }
  791. $shops = Shop::where("status", 1)->paginate(15, ['*'], 'page', $pageNum);
  792. $shops->setPath('/user/shop');
  793. return $this->view()->assign('shops', $shops)->display('user/shop.tpl');
  794. }
  795. public function CouponCheck($request, $response, $args)
  796. {
  797. $coupon = $request->getParam('coupon');
  798. $shop = $request->getParam('shop');
  799. $shop=Shop::where("id", $shop)->where("status", 1)->first();
  800. if ($shop==null) {
  801. $res['ret'] = 0;
  802. $res['msg'] = "非法请求";
  803. return $response->getBody()->write(json_encode($res));
  804. }
  805. if ($coupon=="") {
  806. $res['ret'] = 1;
  807. $res['name'] = $shop->name;
  808. $res['credit'] = "0 %";
  809. $res['total'] = $shop->price."元";
  810. return $response->getBody()->write(json_encode($res));
  811. }
  812. $coupon=Coupon::where("code", $coupon)->first();
  813. if ($coupon==null) {
  814. $res['ret'] = 0;
  815. $res['msg'] = "优惠码无效";
  816. return $response->getBody()->write(json_encode($res));
  817. }
  818. if ($coupon->order($shop->id)==false) {
  819. $res['ret'] = 0;
  820. $res['msg'] = "此优惠码不可用于此商品";
  821. return $response->getBody()->write(json_encode($res));
  822. }
  823. $res['ret'] = 1;
  824. $res['name'] = $shop->name;
  825. $res['credit'] = $coupon->credit." %";
  826. $res['total'] = $shop->price*((100-$coupon->credit)/100)."元";
  827. return $response->getBody()->write(json_encode($res));
  828. }
  829. public function buy($request, $response, $args)
  830. {
  831. $coupon = $request->getParam('coupon');
  832. $code = $coupon;
  833. $shop = $request->getParam('shop');
  834. $autorenew = $request->getParam('autorenew');
  835. $shop=Shop::where("id", $shop)->where("status", 1)->first();
  836. if ($shop==null) {
  837. $res['ret'] = 0;
  838. $res['msg'] = "非法请求";
  839. return $response->getBody()->write(json_encode($res));
  840. }
  841. if ($coupon=="") {
  842. $credit=0;
  843. } else {
  844. $coupon=Coupon::where("code", $coupon)->first();
  845. if ($coupon==null) {
  846. $credit=0;
  847. } else {
  848. if ($coupon->onetime==1) {
  849. $onetime=true;
  850. }
  851. $credit=$coupon->credit;
  852. }
  853. if ($coupon->order($shop->id)==false) {
  854. $res['ret'] = 0;
  855. $res['msg'] = "此优惠码不可用于此商品";
  856. return $response->getBody()->write(json_encode($res));
  857. }
  858. if ($coupon->expire<time()) {
  859. $res['ret'] = 0;
  860. $res['msg'] = "此优惠码已过期";
  861. return $response->getBody()->write(json_encode($res));
  862. }
  863. }
  864. $price=$shop->price*((100-$credit)/100);
  865. $user=$this->user;
  866. if ((float)$user->money<(float)$price) {
  867. $res['ret'] = 0;
  868. $res['msg'] = "余额不足,总价为".$price."元。";
  869. return $response->getBody()->write(json_encode($res));
  870. }
  871. $user->money=$user->money-$price;
  872. $user->save();
  873. $bought=new Bought();
  874. $bought->userid=$user->id;
  875. $bought->shopid=$shop->id;
  876. $bought->datetime=time();
  877. if ($autorenew==0||$shop->auto_renew==0) {
  878. $bought->renew=0;
  879. } else {
  880. $bought->renew=time()+$shop->auto_renew*86400;
  881. }
  882. $bought->coupon=$code;
  883. if (isset($onetime)) {
  884. $price=$shop->price;
  885. }
  886. $bought->price=$price;
  887. $bought->save();
  888. $shop->buy($user);
  889. $res['ret'] = 1;
  890. $res['msg'] = "购买成功";
  891. return $response->getBody()->write(json_encode($res));
  892. }
  893. public function bought($request, $response, $args)
  894. {
  895. $pageNum = 1;
  896. if (isset($request->getQueryParams()["page"])) {
  897. $pageNum = $request->getQueryParams()["page"];
  898. }
  899. $shops = Bought::where("userid", $this->user->id)->orderBy("id", "desc")->paginate(15, ['*'], 'page', $pageNum);
  900. $shops->setPath('/user/bought');
  901. return $this->view()->assign('shops', $shops)->display('user/bought.tpl');
  902. }
  903. public function deleteBoughtGet($request, $response, $args)
  904. {
  905. $id = $request->getParam('id');
  906. $shop = Bought::where("id", $id)->where("userid", $this->user->id)->first();
  907. if ($shop==null) {
  908. $rs['ret'] = 0;
  909. $rs['msg'] = "退订失败,订单不存在。";
  910. return $response->getBody()->write(json_encode($rs));
  911. }
  912. if ($this->user->id==$shop->userid) {
  913. $shop->renew=0;
  914. }
  915. if (!$shop->save()) {
  916. $rs['ret'] = 0;
  917. $rs['msg'] = "退订失败";
  918. return $response->getBody()->write(json_encode($rs));
  919. }
  920. $rs['ret'] = 1;
  921. $rs['msg'] = "退订成功";
  922. return $response->getBody()->write(json_encode($rs));
  923. }
  924. public function ticket($request, $response, $args)
  925. {
  926. $pageNum = 1;
  927. if (isset($request->getQueryParams()["page"])) {
  928. $pageNum = $request->getQueryParams()["page"];
  929. }
  930. $tickets = Ticket::where("userid", $this->user->id)->where("rootid", 0)->orderBy("datetime", "desc")->paginate(15, ['*'], 'page', $pageNum);
  931. $tickets->setPath('/user/ticket');
  932. return $this->view()->assign('tickets', $tickets)->display('user/ticket.tpl');
  933. }
  934. public function ticket_create($request, $response, $args)
  935. {
  936. return $this->view()->display('user/ticket_create.tpl');
  937. }
  938. public function ticket_add($request, $response, $args)
  939. {
  940. $title = $request->getParam('title');
  941. $content = $request->getParam('content');
  942. if ($title==""||$content=="") {
  943. $res['ret'] = 0;
  944. $res['msg'] = "请填全";
  945. return $this->echoJson($response, $res);
  946. }
  947. if (strpos($content, "admin")!=false||strpos($content, "user")!=false) {
  948. $res['ret'] = 0;
  949. $res['msg'] = "请求中有不正当的词语。";
  950. return $this->echoJson($response, $res);
  951. }
  952. $ticket=new Ticket();
  953. $antiXss = new AntiXSS();
  954. $ticket->title=$antiXss->xss_clean($title);
  955. $ticket->content=$antiXss->xss_clean($content);
  956. $ticket->rootid=0;
  957. $ticket->userid=$this->user->id;
  958. $ticket->datetime=time();
  959. $ticket->save();
  960. $adminUser = User::where("is_admin", "=", "1")->get();
  961. foreach ($adminUser as $user) {
  962. $subject = Config::get('appName')."-新工单被开启";
  963. $to = $user->email;
  964. $text = "管理员您好,有人开启了新的工单,请您及时处理。。" ;
  965. try {
  966. Mail::send($to, $subject, 'news/warn.tpl', [
  967. "user" => $user,"text" => $text
  968. ], [
  969. ]);
  970. } catch (Exception $e) {
  971. echo $e->getMessage();
  972. }
  973. }
  974. $res['ret'] = 1;
  975. $res['msg'] = "提交成功";
  976. return $this->echoJson($response, $res);
  977. }
  978. public function ticket_update($request, $response, $args)
  979. {
  980. $id = $args['id'];
  981. $content = $request->getParam('content');
  982. $status = $request->getParam('status');
  983. if ($content==""||$status=="") {
  984. $res['ret'] = 0;
  985. $res['msg'] = "请填全";
  986. return $this->echoJson($response, $res);
  987. }
  988. if (strpos($content, "admin")!=false||strpos($content, "user")!=false) {
  989. $res['ret'] = 0;
  990. $res['msg'] = "请求中有不正当的词语。";
  991. return $this->echoJson($response, $res);
  992. }
  993. $ticket_main=Ticket::where("id", "=", $id)->where("rootid", "=", 0)->first();
  994. if ($ticket_main->userid!=$this->user->id) {
  995. $newResponse = $response->withStatus(302)->withHeader('Location', '/user/ticket');
  996. return $newResponse;
  997. }
  998. if ($status==1&&$ticket_main->status!=$status) {
  999. $adminUser = User::where("is_admin", "=", "1")->get();
  1000. foreach ($adminUser as $user) {
  1001. $subject = Config::get('appName')."-工单被重新开启";
  1002. $to = $user->email;
  1003. $text = "管理员您好,有人重新开启了<a href=\"".Config::get('baseUrl')."/admin/ticket/".$ticket_main->id."/view\">工单</a>,请您及时处理。" ;
  1004. try {
  1005. Mail::send($to, $subject, 'news/warn.tpl', [
  1006. "user" => $user,"text" => $text
  1007. ], [
  1008. ]);
  1009. } catch (Exception $e) {
  1010. echo $e->getMessage();
  1011. }
  1012. }
  1013. } else {
  1014. $adminUser = User::where("is_admin", "=", "1")->get();
  1015. foreach ($adminUser as $user) {
  1016. $subject = Config::get('appName')."-工单被回复";
  1017. $to = $user->email;
  1018. $text = "管理员您好,有人回复了<a href=\"".Config::get('baseUrl')."/admin/ticket/".$ticket_main->id."/view\">工单</a>,请您及时处理。" ;
  1019. try {
  1020. Mail::send($to, $subject, 'news/warn.tpl', [
  1021. "user" => $user,"text" => $text
  1022. ], [
  1023. ]);
  1024. } catch (Exception $e) {
  1025. echo $e->getMessage();
  1026. }
  1027. }
  1028. }
  1029. $antiXss = new AntiXSS();
  1030. $ticket=new Ticket();
  1031. $ticket->title=$antiXss->xss_clean($ticket_main->title);
  1032. $ticket->content=$antiXss->xss_clean($content);
  1033. $ticket->rootid=$ticket_main->id;
  1034. $ticket->userid=$this->user->id;
  1035. $ticket->datetime=time();
  1036. $ticket_main->status=$status;
  1037. $ticket_main->save();
  1038. $ticket->save();
  1039. $res['ret'] = 1;
  1040. $res['msg'] = "提交成功";
  1041. return $this->echoJson($response, $res);
  1042. }
  1043. public function ticket_view($request, $response, $args)
  1044. {
  1045. $id = $args['id'];
  1046. $ticket_main=Ticket::where("id", "=", $id)->where("rootid", "=", 0)->first();
  1047. if ($ticket_main->userid!=$this->user->id) {
  1048. $newResponse = $response->withStatus(302)->withHeader('Location', '/user/ticket');
  1049. return $newResponse;
  1050. }
  1051. $pageNum = 1;
  1052. if (isset($request->getQueryParams()["page"])) {
  1053. $pageNum = $request->getQueryParams()["page"];
  1054. }
  1055. $ticketset=Ticket::where("id", $id)->orWhere("rootid", "=", $id)->orderBy("datetime", "desc")->paginate(5, ['*'], 'page', $pageNum);
  1056. $ticketset->setPath('/user/ticket/'.$id."/view");
  1057. return $this->view()->assign('ticketset', $ticketset)->assign("id", $id)->display('user/ticket_view.tpl');
  1058. }
  1059. public function updateWechat($request, $response, $args)
  1060. {
  1061. $type = $request->getParam('imtype');
  1062. $wechat = $request->getParam('wechat');
  1063. $user = $this->user;
  1064. if ($user->telegram_id != 0) {
  1065. $res['ret'] = 0;
  1066. $res['msg'] = "您绑定了 Telegram ,所以此项并不能被修改。";
  1067. return $response->getBody()->write(json_encode($res));
  1068. }
  1069. if ($wechat == ""||$type == "") {
  1070. $res['ret'] = 0;
  1071. $res['msg'] = "请填好";
  1072. return $response->getBody()->write(json_encode($res));
  1073. }
  1074. $user1 = User::where('im_value', $wechat)->where('im_type', $type)->first();
  1075. if ($user1 != null) {
  1076. $res['ret'] = 0;
  1077. $res['msg'] = "此联络方式已经被注册了";
  1078. return $response->getBody()->write(json_encode($res));
  1079. }
  1080. $user->im_type = $type;
  1081. $antiXss = new AntiXSS();
  1082. $user->im_value = $antiXss->xss_clean($wechat);
  1083. $user->save();
  1084. $res['ret'] = 1;
  1085. $res['msg'] = "修改成功";
  1086. return $this->echoJson($response, $res);
  1087. }
  1088. public function updateSSR($request, $response, $args)
  1089. {
  1090. $protocol = $request->getParam('protocol');
  1091. $obfs = $request->getParam('obfs');
  1092. $user = $this->user;
  1093. if ($obfs == ""||$protocol == "") {
  1094. $res['ret'] = 0;
  1095. $res['msg'] = "请填好";
  1096. return $response->getBody()->write(json_encode($res));
  1097. }
  1098. if (!Tools::is_param_validate('obfs', $obfs)) {
  1099. $res['ret'] = 0;
  1100. $res['msg'] = "悟空别闹";
  1101. return $response->getBody()->write(json_encode($res));
  1102. }
  1103. if (!Tools::is_param_validate('protocol', $protocol)) {
  1104. $res['ret'] = 0;
  1105. $res['msg'] = "悟空别闹";
  1106. return $response->getBody()->write(json_encode($res));
  1107. }
  1108. $antiXss = new AntiXSS();
  1109. $user->protocol = $antiXss->xss_clean($protocol);
  1110. $user->obfs = $antiXss->xss_clean($obfs);
  1111. if (!Tools::checkNoneProtocol($user)) {
  1112. $res['ret'] = 0;
  1113. $res['msg'] = "您好,系统检测到您目前的加密方式为 none ,但您将要设置为的协议并不在以下协议<br>".implode(',', Config::getSupportParam('allow_none_protocol')).'<br>之内,请您先修改您的加密方式,再来修改此处设置。';
  1114. return $this->echoJson($response, $res);
  1115. }
  1116. if(!URL::SSCanConnect($user) && !URL::SSRCanConnect($user)) {
  1117. $res['ret'] = 0;
  1118. $res['msg'] = "您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。";
  1119. return $this->echoJson($response, $res);
  1120. }
  1121. $user->save();
  1122. if(!URL::SSCanConnect($user)) {
  1123. $res['ret'] = 0;
  1124. $res['msg'] = "设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。";
  1125. return $this->echoJson($response, $res);
  1126. }
  1127. if(!URL::SSRCanConnect($user)) {
  1128. $res['ret'] = 0;
  1129. $res['msg'] = "设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。";
  1130. return $this->echoJson($response, $res);
  1131. }
  1132. $res['ret'] = 0;
  1133. $res['msg'] = "设置成功,您可自由选用客户端来连接。";
  1134. return $this->echoJson($response, $res);
  1135. }
  1136. public function updateTheme($request, $response, $args)
  1137. {
  1138. $theme = $request->getParam('theme');
  1139. $user = $this->user;
  1140. if ($theme == "") {
  1141. $res['ret'] = 0;
  1142. $res['msg'] = "???";
  1143. return $response->getBody()->write(json_encode($res));
  1144. }
  1145. $user->theme = filter_var($theme, FILTER_SANITIZE_STRING);
  1146. $user->save();
  1147. $res['ret'] = 1;
  1148. $res['msg'] = "ok";
  1149. return $this->echoJson($response, $res);
  1150. }
  1151. public function updateMail($request, $response, $args)
  1152. {
  1153. $mail = $request->getParam('mail');
  1154. $user = $this->user;
  1155. if (!($mail == "1"||$mail == "0")) {
  1156. $res['ret'] = 0;
  1157. $res['msg'] = "悟空别闹";
  1158. return $response->getBody()->write(json_encode($res));
  1159. }
  1160. $user->sendDailyMail = $mail;
  1161. $user->save();
  1162. $res['ret'] = 1;
  1163. $res['msg'] = "ok";
  1164. return $this->echoJson($response, $res);
  1165. }
  1166. public function PacSet($request, $response, $args)
  1167. {
  1168. $pac = $request->getParam('pac');
  1169. $user = $this->user;
  1170. if ($pac == "") {
  1171. $res['ret'] = 0;
  1172. $res['msg'] = "悟空别闹";
  1173. return $response->getBody()->write(json_encode($res));
  1174. }
  1175. $user->pac = $pac;
  1176. $user->save();
  1177. $res['ret'] = 1;
  1178. $res['msg'] = "ok";
  1179. return $this->echoJson($response, $res);
  1180. }
  1181. public function updateSsPwd($request, $response, $args)
  1182. {
  1183. $user = Auth::getUser();
  1184. $pwd = $request->getParam('sspwd');
  1185. if ($pwd == "") {
  1186. $res['ret'] = 0;
  1187. $res['msg'] = "悟空别闹";
  1188. return $response->getBody()->write(json_encode($res));
  1189. }
  1190. if (!Tools::is_validate($pwd)) {
  1191. $res['ret'] = 0;
  1192. $res['msg'] = "悟空别闹";
  1193. return $response->getBody()->write(json_encode($res));
  1194. }
  1195. $user->updateSsPwd($pwd);
  1196. $res['ret'] = 1;
  1197. Radius::Add($user, $pwd);
  1198. return $this->echoJson($response, $res);
  1199. }
  1200. public function updateMethod($request, $response, $args)
  1201. {
  1202. $user = Auth::getUser();
  1203. $method = $request->getParam('method');
  1204. $method = strtolower($method);
  1205. if ($method == "") {
  1206. $res['ret'] = 0;
  1207. $res['msg'] = "悟空别闹";
  1208. return $response->getBody()->write(json_encode($res));
  1209. }
  1210. if (!Tools::is_param_validate('method', $method)) {
  1211. $res['ret'] = 0;
  1212. $res['msg'] = "悟空别闹";
  1213. return $response->getBody()->write(json_encode($res));
  1214. }
  1215. $user->method = $method;
  1216. if (!Tools::checkNoneProtocol($user)) {
  1217. $res['ret'] = 0;
  1218. $res['msg'] = "您好,系统检测到您将要设置的加密方式为 none ,但您的协议并不在以下协议<br>".implode(',', Config::getSupportParam('allow_none_protocol')).'<br>之内,请您先修改您的协议,再来修改此处设置。';
  1219. return $this->echoJson($response, $res);
  1220. }
  1221. if(!URL::SSCanConnect($user) && !URL::SSRCanConnect($user)) {
  1222. $res['ret'] = 0;
  1223. $res['msg'] = "您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。";
  1224. return $this->echoJson($response, $res);
  1225. }
  1226. $user->updateMethod($method);
  1227. if(!URL::SSCanConnect($user)) {
  1228. $res['ret'] = 0;
  1229. $res['msg'] = "设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。";
  1230. return $this->echoJson($response, $res);
  1231. }
  1232. if(!URL::SSRCanConnect($user)) {
  1233. $res['ret'] = 0;
  1234. $res['msg'] = "设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。";
  1235. return $this->echoJson($response, $res);
  1236. }
  1237. $res['ret'] = 0;
  1238. $res['msg'] = "设置成功,您可自由选用两种客户端来进行连接。";
  1239. return $this->echoJson($response, $res);
  1240. }
  1241. public function logout($request, $response, $args)
  1242. {
  1243. Auth::logout();
  1244. $newResponse = $response->withStatus(302)->withHeader('Location', '/auth/login');
  1245. return $newResponse;
  1246. }
  1247. public function doCheckIn($request, $response, $args)
  1248. {
  1249. if (Config::get('enable_geetest_checkin') == 'true') {
  1250. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  1251. if (!$ret) {
  1252. $res['ret'] = 0;
  1253. $res['msg'] = "系统无法接受您的验证结果,请刷新页面后重试。";
  1254. return $response->getBody()->write(json_encode($res));
  1255. }
  1256. }
  1257. if (!$this->user->isAbleToCheckin()) {
  1258. $res['msg'] = "您似乎已经续命过了...";
  1259. $res['ret'] = 1;
  1260. return $response->getBody()->write(json_encode($res));
  1261. }
  1262. $traffic = rand(Config::get('checkinMin'), Config::get('checkinMax'));
  1263. $this->user->transfer_enable = $this->user->transfer_enable + Tools::toMB($traffic);
  1264. $this->user->last_check_in_time = time();
  1265. $this->user->save();
  1266. $res['msg'] = sprintf("获得了 %u MB流量.", $traffic);
  1267. $res['ret'] = 1;
  1268. return $this->echoJson($response, $res);
  1269. }
  1270. public function kill($request, $response, $args)
  1271. {
  1272. return $this->view()->display('user/kill.tpl');
  1273. }
  1274. public function handleKill($request, $response, $args)
  1275. {
  1276. $user = Auth::getUser();
  1277. $email=$user->email;
  1278. $passwd = $request->getParam('passwd');
  1279. // check passwd
  1280. $res = array();
  1281. if (!Hash::checkPassword($user->pass, $passwd)) {
  1282. $res['ret'] = 0;
  1283. $res['msg'] = " 密码错误";
  1284. return $this->echoJson($response, $res);
  1285. }
  1286. // Auth::logout();
  1287. // $user->kill_user();
  1288. $res['ret'] = 1;
  1289. $res['msg'] = "您没有使用此功能的权限。";
  1290. return $this->echoJson($response, $res);
  1291. }
  1292. public function trafficLog($request, $response, $args)
  1293. {
  1294. $traffic=TrafficLog::where('user_id', $this->user->id)->where("log_time", ">", (time()-3*86400))->orderBy('id', 'desc')->get();
  1295. return $this->view()->assign('logs', $traffic)->display('user/trafficlog.tpl');
  1296. }
  1297. public function detect_index($request, $response, $args)
  1298. {
  1299. $pageNum = 1;
  1300. if (isset($request->getQueryParams()["page"])) {
  1301. $pageNum = $request->getQueryParams()["page"];
  1302. }
  1303. $logs = DetectRule::paginate(15, ['*'], 'page', $pageNum);
  1304. $logs->setPath('/user/detect');
  1305. return $this->view()->assign('rules', $logs)->display('user/detect_index.tpl');
  1306. }
  1307. public function detect_log($request, $response, $args)
  1308. {
  1309. $pageNum = 1;
  1310. if (isset($request->getQueryParams()["page"])) {
  1311. $pageNum = $request->getQueryParams()["page"];
  1312. }
  1313. $logs = DetectLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
  1314. $logs->setPath('/user/detect/log');
  1315. return $this->view()->assign('logs', $logs)->display('user/detect_log.tpl');
  1316. }
  1317. public function disable($request, $response, $args)
  1318. {
  1319. return $this->view()->display('user/disable.tpl');
  1320. }
  1321. public function telegram_reset($request, $response, $args)
  1322. {
  1323. $user = $this->user;
  1324. $user->telegram_id = 0;
  1325. $user->save();
  1326. $newResponse = $response->withStatus(302)->withHeader('Location', '/user/edit');
  1327. return $newResponse;
  1328. }
  1329. public function resetURL($request, $response, $args)
  1330. {
  1331. $user = $this->user;
  1332. $user->clean_link();
  1333. $newResponse = $response->withStatus(302)->withHeader('Location', '/user');
  1334. return $newResponse;
  1335. }
  1336. }