AuthController.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. namespace App\Controllers;
  3. use App\Models\InviteCode;
  4. use App\Models\User;
  5. use App\Services\Auth;
  6. use App\Services\Auth\EmailVerify;
  7. use App\Services\Config;
  8. use App\Services\Logger;
  9. use App\Services\Mail;
  10. use App\Utils\Check;
  11. use App\Utils\Hash;
  12. use App\Utils\Http;
  13. use App\Utils\Tools;
  14. /**
  15. * AuthController
  16. */
  17. class AuthController extends BaseController
  18. {
  19. // Register Error Code
  20. const WrongCode = 501;
  21. const IllegalEmail = 502;
  22. const PasswordTooShort = 511;
  23. const PasswordNotEqual = 512;
  24. const EmailUsed = 521;
  25. // Login Error Code
  26. const UserNotExist = 601;
  27. const UserPasswordWrong = 602;
  28. // Verify Email
  29. const VerifyEmailWrongEmail = 701;
  30. const VerifyEmailExist = 702;
  31. public function login($request, $response, $args)
  32. {
  33. return $this->view()->display('auth/login.tpl');
  34. }
  35. public function loginHandle($request, $response, $args)
  36. {
  37. // $data = $request->post('sdf');
  38. $email = $request->getParam('email');
  39. $email = strtolower($email);
  40. $passwd = $request->getParam('passwd');
  41. $rememberMe = $request->getParam('remember_me');
  42. // Handle Login
  43. $user = User::where('email', '=', $email)->first();
  44. if ($user == null) {
  45. $res['ret'] = 0;
  46. $res['error_code'] = self::UserNotExist;
  47. $res['msg'] = "邮箱或者密码错误";
  48. return $this->echoJson($response, $res);
  49. }
  50. if (!Hash::checkPassword($user->pass, $passwd)) {
  51. $res['ret'] = 0;
  52. $res['error_code'] = self::UserPasswordWrong;
  53. $res['msg'] = "邮箱或者密码错误";
  54. return $this->echoJson($response, $res);
  55. }
  56. // @todo
  57. $time = 3600 * 24;
  58. if ($rememberMe) {
  59. $time = 3600 * 24 * 7;
  60. }
  61. Logger::info("login user $user->id ");
  62. Auth::login($user->id, $time);
  63. $res['ret'] = 1;
  64. $res['msg'] = "欢迎回来";
  65. return $this->echoJson($response, $res);
  66. }
  67. public function register($request, $response, $args)
  68. {
  69. $ary = $request->getQueryParams();
  70. $code = "";
  71. if (isset($ary['code'])) {
  72. $code = $ary['code'];
  73. }
  74. $requireEmailVerification = Config::get('emailVerifyEnabled');
  75. return $this->view()->assign('code', $code)->assign('requireEmailVerification', $requireEmailVerification)->display('auth/register.tpl');
  76. }
  77. public function registerHandle($request, $response, $args)
  78. {
  79. $name = $request->getParam('name');
  80. $email = $request->getParam('email');
  81. $email = strtolower($email);
  82. $passwd = $request->getParam('passwd');
  83. $repasswd = $request->getParam('repasswd');
  84. $code = $request->getParam('code');
  85. $verifycode = $request->getParam('verifycode');
  86. // check code
  87. $c = InviteCode::where('code', $code)->first();
  88. if ($c == null) {
  89. $res['ret'] = 0;
  90. $res['error_code'] = self::WrongCode;
  91. $res['msg'] = "邀请码无效";
  92. return $this->echoJson($response, $res);
  93. }
  94. // check email format
  95. if (!Check::isEmailLegal($email)) {
  96. $res['ret'] = 0;
  97. $res['error_code'] = self::IllegalEmail;
  98. $res['msg'] = "邮箱无效";
  99. return $this->echoJson($response, $res);
  100. }
  101. // check pwd length
  102. if (strlen($passwd) < 8) {
  103. $res['ret'] = 0;
  104. $res['error_code'] = self::PasswordTooShort;
  105. $res['msg'] = "密码太短";
  106. return $this->echoJson($response, $res);
  107. }
  108. // check pwd re
  109. if ($passwd != $repasswd) {
  110. $res['ret'] = 0;
  111. $res['error_code'] = self::PasswordNotEqual;
  112. $res['msg'] = "两次密码输入不符";
  113. return $this->echoJson($response, $res);
  114. }
  115. // check email
  116. $user = User::where('email', $email)->first();
  117. if ($user != null) {
  118. $res['ret'] = 0;
  119. $res['error_code'] = self::EmailUsed;
  120. $res['msg'] = "邮箱已经被注册了";
  121. return $this->echoJson($response, $res);
  122. }
  123. // verify email
  124. if (Config::get('emailVerifyEnabled') && !EmailVerify::checkVerifyCode($email, $verifycode)) {
  125. $res['ret'] = 0;
  126. $res['msg'] = '邮箱验证代码不正确';
  127. return $this->echoJson($response, $res);
  128. }
  129. // check ip limit
  130. $ip = Http::getClientIP();
  131. $ipRegCount = Check::getIpRegCount($ip);
  132. if ($ipRegCount >= Config::get('ipDayLimit')) {
  133. $res['ret'] = 0;
  134. $res['msg'] = '当前IP注册次数超过限制';
  135. return $this->echoJson($response, $res);
  136. }
  137. // do reg user
  138. $user = new User();
  139. $user->user_name = $name;
  140. $user->email = $email;
  141. $user->pass = Hash::passwordHash($passwd);
  142. $user->passwd = Tools::genRandomChar(6);
  143. $user->port = Tools::getLastPort() + 1;
  144. $user->t = 0;
  145. $user->u = 0;
  146. $user->d = 0;
  147. $user->transfer_enable = Tools::toGB(Config::get('defaultTraffic'));
  148. $user->invite_num = Config::get('inviteNum');
  149. $user->reg_ip = Http::getClientIP();
  150. $user->ref_by = $c->user_id;
  151. if ($user->save()) {
  152. $res['ret'] = 1;
  153. $res['msg'] = "注册成功";
  154. $c->delete();
  155. return $this->echoJson($response, $res);
  156. }
  157. $res['ret'] = 0;
  158. $res['msg'] = "未知错误";
  159. return $this->echoJson($response, $res);
  160. }
  161. public function sendVerifyEmail($request, $response, $args)
  162. {
  163. $res = [];
  164. $email = $request->getParam('email');
  165. if (!Check::isEmailLegal($email)) {
  166. $res['ret'] = 0;
  167. $res['error_code'] = self::VerifyEmailWrongEmail;
  168. $res['msg'] = '邮箱无效';
  169. return $this->echoJson($response, $res);
  170. }
  171. // check email
  172. $user = User::where('email', $email)->first();
  173. if ($user != null) {
  174. $res['ret'] = 0;
  175. $res['error_code'] = self::VerifyEmailExist;
  176. $res['msg'] = "邮箱已经被注册了";
  177. return $this->echoJson($response, $res);
  178. }
  179. if (EmailVerify::sendVerification($email)) {
  180. $res['ret'] = 1;
  181. $res['msg'] = '验证代码已发送至您的邮箱,请在登录邮箱后将验证码填到相应位置.';
  182. return $this->echoJson($response, $res);
  183. }
  184. $res['ret'] = 0;
  185. $res['msg'] = '邮件发送失败,请联系管理员';
  186. return $this->echoJson($response, $res);
  187. }
  188. public function logout($request, $response, $args)
  189. {
  190. Auth::logout();
  191. return $this->redirect($response, '/auth/login');
  192. }
  193. }