AuthController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. <?php
  2. namespace App\Controllers;
  3. use App\Models\InviteCode;
  4. use App\Services\Config;
  5. use App\Utils\Check;
  6. use App\Utils\Tools;
  7. use App\Utils\Radius;
  8. use voku\helper\AntiXSS;
  9. use Psr\Http\Message\ServerRequestInterface;
  10. use Psr\Http\Message\ResponseInterface;
  11. use App\Utils\Hash;
  12. use App\Utils\Da;
  13. use App\Services\Auth;
  14. use App\Services\Mail;
  15. use App\Models\User;
  16. use App\Models\LoginIp;
  17. use App\Models\EmailVerify;
  18. use App\Utils\Duoshuo;
  19. use App\Utils\GA;
  20. use App\Utils\Wecenter;
  21. use App\Utils\Geetest;
  22. use App\Utils\TelegramSessionManager;
  23. /**
  24. * AuthController
  25. */
  26. class AuthController extends BaseController
  27. {
  28. public function login()
  29. {
  30. $uid = time().rand(1, 10000) ;
  31. if (Config::get('enable_geetest_login') == 'true') {
  32. $GtSdk = Geetest::get($uid);
  33. } else {
  34. $GtSdk = null;
  35. }
  36. if (Config::get('enable_telegram') == 'true') {
  37. $login_text = TelegramSessionManager::add_login_session();
  38. $login = explode("|", $login_text);
  39. $login_token = $login[0];
  40. $login_number = $login[1];
  41. } else {
  42. $login_token = '';
  43. $login_number = '';
  44. }
  45. return $this->view()->assign('geetest_html', $GtSdk)->assign('login_token', $login_token)->assign('login_number', $login_number)->assign('telegram_bot', Config::get('telegram_bot'))->display('auth/login.tpl');
  46. }
  47. public function loginHandle($request, $response, $args)
  48. {
  49. // $data = $request->post('sdf');
  50. $email = $request->getParam('email');
  51. $email = strtolower($email);
  52. $passwd = $request->getParam('passwd');
  53. $code = $request->getParam('code');
  54. $rememberMe = $request->getParam('remember_me');
  55. if (Config::get('enable_geetest_login') == 'true') {
  56. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  57. if (!$ret) {
  58. $res['ret'] = 0;
  59. $res['msg'] = "系统无法接受您的验证结果,请刷新页面后重试。";
  60. return $response->getBody()->write(json_encode($res));
  61. }
  62. }
  63. // Handle Login
  64. $user = User::where('email', '=', $email)->first();
  65. if ($user == null) {
  66. $rs['ret'] = 0;
  67. $rs['msg'] = "邮箱或者密码错误";
  68. return $response->getBody()->write(json_encode($rs));
  69. }
  70. if (!Hash::checkPassword($user->pass, $passwd)) {
  71. $rs['ret'] = 0;
  72. $rs['msg'] = "邮箱或者密码错误.";
  73. $loginip=new LoginIp();
  74. $loginip->ip=$_SERVER["REMOTE_ADDR"];
  75. $loginip->userid=$user->id;
  76. $loginip->datetime=time();
  77. $loginip->type=1;
  78. $loginip->save();
  79. return $response->getBody()->write(json_encode($rs));
  80. }
  81. // @todo
  82. $time = 3600*24;
  83. if ($rememberMe) {
  84. $time = 3600*24*7;
  85. }
  86. if ($user->ga_enable==1) {
  87. $ga = new GA();
  88. $rcode = $ga->verifyCode($user->ga_token, $code);
  89. if (!$rcode) {
  90. $res['ret'] = 0;
  91. $res['msg'] = "两步验证码错误,如果您是丢失了生成器或者错误地设置了这个选项,您可以尝试重置密码,即可取消这个选项。";
  92. return $response->getBody()->write(json_encode($res));
  93. }
  94. }
  95. Auth::login($user->id, $time);
  96. $rs['ret'] = 1;
  97. $rs['msg'] = "欢迎回来";
  98. $loginip=new LoginIp();
  99. $loginip->ip=$_SERVER["REMOTE_ADDR"];
  100. $loginip->userid=$user->id;
  101. $loginip->datetime=time();
  102. $loginip->type=0;
  103. $loginip->save();
  104. Wecenter::add($user, $passwd);
  105. Wecenter::Login($user, $passwd, $time);
  106. return $response->getBody()->write(json_encode($rs));
  107. }
  108. public function qrcode_loginHandle($request, $response, $args)
  109. {
  110. // $data = $request->post('sdf');
  111. $token = $request->getParam('token');
  112. $number = $request->getParam('number');
  113. $ret = TelegramSessionManager::step2_verify_login_session($token, $number);
  114. if (!$ret) {
  115. $res['ret'] = 0;
  116. $res['msg'] = "此令牌无法被使用。";
  117. return $response->getBody()->write(json_encode($res));
  118. }
  119. // Handle Login
  120. $user = User::where('id', '=', $ret)->first();
  121. // @todo
  122. $time = 3600*24;
  123. Auth::login($user->id, $time);
  124. $rs['ret'] = 1;
  125. $rs['msg'] = "欢迎回来";
  126. $loginip=new LoginIp();
  127. $loginip->ip=$_SERVER["REMOTE_ADDR"];
  128. $loginip->userid=$user->id;
  129. $loginip->datetime=time();
  130. $loginip->type=0;
  131. $loginip->save();
  132. return $response->getBody()->write(json_encode($rs));
  133. }
  134. public function register($request, $response, $next)
  135. {
  136. $ary = $request->getQueryParams();
  137. $code = "";
  138. if (isset($ary['code'])) {
  139. $antiXss = new AntiXSS();
  140. $code = $antiXss->xss_clean($ary['code']);
  141. }
  142. $uid = time().rand(1, 10000) ;
  143. if (Config::get('enable_geetest_reg') == 'true') {
  144. $GtSdk = Geetest::get($uid);
  145. } else {
  146. $GtSdk = null;
  147. }
  148. return $this->view()->assign('enable_invite_code', Config::get('enable_invite_code'))->assign('geetest_html', $GtSdk)->assign('enable_email_verify', Config::get('enable_email_verify'))->assign('code', $code)->display('auth/register.tpl');
  149. }
  150. public function sendVerify($request, $response, $next)
  151. {
  152. if (Config::get('enable_email_verify')=='true') {
  153. $email = $request->getParam('email');
  154. if ($email=="") {
  155. $res['ret'] = 0;
  156. $res['msg'] = "未填写邮箱";
  157. return $response->getBody()->write(json_encode($res));
  158. }
  159. // check email format
  160. if (!Check::isEmailLegal($email)) {
  161. $res['ret'] = 0;
  162. $res['msg'] = "邮箱无效";
  163. return $response->getBody()->write(json_encode($res));
  164. }
  165. $user = User::where('email', '=', $email)->first();
  166. if ($user!=null) {
  167. $res['ret'] = 0;
  168. $res['msg'] = "此邮箱已经注册";
  169. return $response->getBody()->write(json_encode($res));
  170. }
  171. $ipcount = EmailVerify::where('ip', '=', $_SERVER["REMOTE_ADDR"])->where('expire_in', '>', time())->count();
  172. if ($ipcount>=(int)Config::get('email_verify_iplimit')) {
  173. $res['ret'] = 0;
  174. $res['msg'] = "此IP请求次数过多";
  175. return $response->getBody()->write(json_encode($res));
  176. }
  177. $mailcount = EmailVerify::where('email', '=', $email)->where('expire_in', '>', time())->count();
  178. if ($mailcount>=3) {
  179. $res['ret'] = 0;
  180. $res['msg'] = "此邮箱请求次数过多";
  181. return $response->getBody()->write(json_encode($res));
  182. }
  183. $code = Tools::genRandomChar(6);
  184. $ev = new EmailVerify();
  185. $ev->expire_in = time() + Config::get('email_verify_ttl');
  186. $ev->ip = $_SERVER["REMOTE_ADDR"];
  187. $ev->email = $email;
  188. $ev->code = $code;
  189. $ev->save();
  190. $subject = Config::get('appName')."- 验证邮件";
  191. try {
  192. Mail::send($email, $subject, 'auth/verify.tpl', [
  193. "code" => $code,"expire" => date("Y-m-d H:i:s", time() + Config::get('email_verify_ttl'))
  194. ], [
  195. //BASE_PATH.'/public/assets/email/styles.css'
  196. ]);
  197. } catch (Exception $e) {
  198. return false;
  199. }
  200. $res['ret'] = 1;
  201. $res['msg'] = "验证码发送成功,请查收邮件。";
  202. return $response->getBody()->write(json_encode($res));
  203. }
  204. }
  205. public function registerHandle($request, $response, $next)
  206. {
  207. $name = $request->getParam('name');
  208. $email = $request->getParam('email');
  209. $email = strtolower($email);
  210. $passwd = $request->getParam('passwd');
  211. $repasswd = $request->getParam('repasswd');
  212. $code = $request->getParam('code');
  213. $imtype = $request->getParam('imtype');
  214. $emailcode = $request->getParam('emailcode');
  215. $wechat = $request->getParam('wechat');
  216. // check code
  217. if (Config::get('enable_geetest_reg') == 'true') {
  218. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  219. if (!$ret) {
  220. $res['ret'] = 0;
  221. $res['msg'] = "系统无法接受您的验证结果,请刷新页面后重试。";
  222. return $response->getBody()->write(json_encode($res));
  223. }
  224. }
  225. //dumplin:1、enable_invite_code为true则注册必须要填邀请码;2、邀请人等级为0则邀请码不可用;3、邀请人invite_num为可邀请次数,填负数则为无限
  226. $c = InviteCode::where('code', $code)->first();
  227. if ($c == null) {
  228. if (Config::get('enable_invite_code')=='true') {
  229. $res['ret'] = 0;
  230. $res['msg'] = "邀请码无效";
  231. return $response->getBody()->write(json_encode($res));
  232. }
  233. } else if ($c->user_id != 0) {
  234. $gift_user=User::where("id", "=", $c->user_id)->first();
  235. if ($gift_user == null) {
  236. $res['ret'] = 0;
  237. $res['msg'] = "邀请人不存在";
  238. return $response->getBody()->write(json_encode($res));
  239. } else if ($gift_user->class == 0) {
  240. $res['ret'] = 0;
  241. $res['msg'] = "邀请人不是VIP";
  242. return $response->getBody()->write(json_encode($res));
  243. } else if ($gift_user->invite_num == 0) {
  244. $res['ret'] = 0;
  245. $res['msg'] = "邀请人可用邀请次数为0";
  246. return $response->getBody()->write(json_encode($res));
  247. }
  248. }
  249. // check email format
  250. if (!Check::isEmailLegal($email)) {
  251. $res['ret'] = 0;
  252. $res['msg'] = "邮箱无效";
  253. return $response->getBody()->write(json_encode($res));
  254. }
  255. // check email
  256. $user = User::where('email', $email)->first();
  257. if ($user != null) {
  258. $res['ret'] = 0;
  259. $res['msg'] = "邮箱已经被注册了";
  260. return $response->getBody()->write(json_encode($res));
  261. }
  262. if (Config::get('enable_email_verify')=='true') {
  263. $mailcount = EmailVerify::where('email', '=', $email)->where('code', '=', $emailcode)->where('expire_in', '>', time())->first();
  264. if ($mailcount == null) {
  265. $res['ret'] = 0;
  266. $res['msg'] = "您的邮箱验证码不正确";
  267. return $response->getBody()->write(json_encode($res));
  268. }
  269. }
  270. // check pwd length
  271. if (strlen($passwd)<8) {
  272. $res['ret'] = 0;
  273. $res['msg'] = "密码请大于8位";
  274. return $response->getBody()->write(json_encode($res));
  275. }
  276. // check pwd re
  277. if ($passwd != $repasswd) {
  278. $res['ret'] = 0;
  279. $res['msg'] = "两次密码输入不符";
  280. return $response->getBody()->write(json_encode($res));
  281. }
  282. if ($imtype==""||$wechat=="") {
  283. $res['ret'] = 0;
  284. $res['msg'] = "请填上你的联络方式";
  285. return $response->getBody()->write(json_encode($res));
  286. }
  287. $user = User::where('im_value', $wechat)->where('im_type', $imtype)->first();
  288. if ($user != null) {
  289. $res['ret'] = 0;
  290. $res['msg'] = "此联络方式已注册";
  291. return $response->getBody()->write(json_encode($res));
  292. }
  293. if (Config::get('enable_email_verify')=='true') {
  294. EmailVerify::where('email', '=', $email)->delete();
  295. }
  296. // do reg user
  297. $user = new User();
  298. $antiXss = new AntiXSS();
  299. $user->user_name = $antiXss->xss_clean($name);
  300. $user->email = $email;
  301. $user->pass = Hash::passwordHash($passwd);
  302. $user->passwd = Tools::genRandomChar(6);
  303. $user->port = Tools::getAvPort();
  304. $user->t = 0;
  305. $user->u = 0;
  306. $user->d = 0;
  307. $user->method = Config::get('reg_method');
  308. $user->protocol = Config::get('reg_protocol');
  309. $user->protocol_param = Config::get('reg_protocol_param');
  310. $user->obfs = Config::get('reg_obfs');
  311. $user->obfs_param = Config::get('reg_obfs_param');
  312. $user->forbidden_ip = Config::get('reg_forbidden_ip');
  313. $user->forbidden_port = Config::get('reg_forbidden_port');
  314. $user->im_type = $imtype;
  315. $user->im_value = $antiXss->xss_clean($wechat);
  316. $user->transfer_enable = Tools::toGB(Config::get('defaultTraffic'));
  317. $user->invite_num = Config::get('inviteNum');
  318. $user->auto_reset_day = Config::get('reg_auto_reset_day');
  319. $user->auto_reset_bandwidth = Config::get('reg_auto_reset_bandwidth');
  320. $user->money=0;
  321. //dumplin:填写邀请人,写入邀请奖励
  322. $user->ref_by =0;
  323. if ($c != null) {
  324. if ($c->user_id != 0) {
  325. $gift_user=User::where("id", "=", $c->user_id)->first();
  326. $user->ref_by = $c->user_id;
  327. $user->money=Config::get('invite_get_money');
  328. $gift_user->transfer_enable=($gift_user->transfer_enable+Config::get('invite_gift')*1024*1024*1024);
  329. $gift_user->invite_num -= 1;
  330. $gift_user->save();
  331. }
  332. }
  333. $user->class_expire=date("Y-m-d H:i:s", time()+Config::get('user_class_expire_default')*3600);
  334. $user->class = Config::get('user_class_default');
  335. $user->node_connector=Config::get('user_conn');
  336. $user->node_speedlimit=Config::get('user_speedlimit');
  337. $user->expire_in=date("Y-m-d H:i:s", time()+Config::get('user_expire_in_default')*86400);
  338. $user->reg_date=date("Y-m-d H:i:s");
  339. $user->reg_ip=$_SERVER["REMOTE_ADDR"];
  340. $user->plan='A';
  341. $user->theme=Config::get('theme');
  342. $group=Config::get('ramdom_group');
  343. $Garray=explode(",", $group);
  344. $user->node_group=$Garray[rand(0, count($Garray)-1)];
  345. $ga = new GA();
  346. $secret = $ga->createSecret();
  347. $user->ga_token=$secret;
  348. $user->ga_enable=0;
  349. if ($user->save()) {
  350. $res['ret'] = 1;
  351. $res['msg'] = "注册成功!正在进入登录界面";
  352. Duoshuo::add($user);
  353. Radius::Add($user, $user->passwd);
  354. return $response->getBody()->write(json_encode($res));
  355. }
  356. $res['ret'] = 0;
  357. $res['msg'] = "未知错误";
  358. return $response->getBody()->write(json_encode($res));
  359. }
  360. public function logout($request, $response, $next)
  361. {
  362. Auth::logout();
  363. $newResponse = $response->withStatus(302)->withHeader('Location', '/auth/login');
  364. return $newResponse;
  365. }
  366. public function qrcode_check($request, $response, $args)
  367. {
  368. $token = $request->getQueryParams()["token"];
  369. $number = $request->getQueryParams()["number"];
  370. if (Config::get('enable_telegram') == 'true') {
  371. $ret = TelegramSessionManager::check_login_session($token, $number);
  372. $res['ret'] = $ret;
  373. return $response->getBody()->write(json_encode($res));
  374. } else {
  375. $res['ret'] = 0;
  376. return $response->getBody()->write(json_encode($res));
  377. }
  378. }
  379. }