/** * @param $email * @param $captcha */ public function reset_password($email, $captcha) { lib()->load('Captcha', 'MailTemplate', 'User'); $c = new Captcha(); if (!$c->verify($captcha, true)) { $this->throwMsg(-3); } $user = new User(['user_email' => trim($email)]); if (!in_array($user->getStatus(), [0, 1, 2])) { $this->throwMsg(-4); } $mt = new MailTemplate("reset_password.html"); $mt->setUserInfo($user->getInfo()); $mt->setValues(["reset_password_url" => $this->create_reset_password_url($user)]); $mt->mailSend($user->getName(), $user->getEmail()); }
/** * 使用COOKIE登录系统 * @return bool|User */ public static function CookieLogin() { $cookie = trim(req()->cookie('UserLogin')); if (!empty($cookie)) { $cookie = explode("\t", $cookie); } if (count($cookie) == 2) { $cookie[0] = intval($cookie[0]); $cookie[1] = trim($cookie[1]); if ($cookie[0] > 0) { try { $user = new User($cookie[0]); if ($user->getCookieLogin() == $cookie[1]) { if (in_array($user->getStatus(), [0, 1, 2])) { if (trim(req()->cookie('LoginFlag')) != date("Y-m-d")) { //如果COOKIE中的日期和当前日期不相符就设置 try { self::setLastLoginInfo($user); } catch (\Exception $ex) { Log::write(_("User last login info set error.ID: ") . $user->getId() . _(".Exception:") . $ex->getMessage(), Log::SQL); } } return $user; } } } catch (\Exception $ex) { return false; } } } return false; }
/** * @param User $user * @param string $code * @throws \Exception * @return int 返回用户状态码 */ public static function UserActivation($user, $code) { if ($user->is_active()) { throw new \Exception(_("User is already activation")); } $meta = $user->getMeta()->get(["activation_code", "activation_time"], ''); if (empty($meta['activation_time']) || empty($meta['activation_code'])) { throw new \Exception(_("Activation code is invalid")); } if (time() - strtotime($meta['activation_time']) > hook()->apply('UserRegister_UserActivation_time', 3 * 24 * 60 * 60)) { throw new \Exception(_("Activation code is time out")); } if ($meta['activation_code'] != $code) { throw new \Exception(_("Activation code is error")); } else { $user->set(['status' => 1]); } return $user->getStatus(); }
/** * POST登录 * @param string $account * @param string $password * @param string $captcha * @param bool $save_status */ public function PostLogin($account, $password, $captcha, $save_status) { if (empty($account) || empty($password)) { $this->throwMsg(-10); } $save_status = !empty($save_status); if (!$this->Captcha($captcha)) { //验证码检测 $this->throwMsg(-5); } $account = strtolower($account); $password = strtolower($password); $this->GetAccountUser($account); lib()->load('UserCheck'); if (!UserCheck::CheckPasswordChar($password)) { $this->throwMsg(-3); } $ip = Ip::getInstance(); $max_error_count = hook()->apply("UserLogin_max_error_count", 6); $now_ip = $ip->realip(); if ($max_error_count <= $this->user->getErrorLoginCount() && $ip->fill($now_ip) === $ip->fill($this->user->getErrorLoginIp()) && explode(" ", $this->user->getErrorLoginTime())[0] == date("Y-m-d")) { //登录被限制 $this->throwMsg(-8); } else { if (UserCheck::CreatePassword($password, $this->user->getSalt()) !== $this->user->getPassword()) { //错误登录记录 $this->user->set(array("error_login_count" => 1 + $this->user->getErrorLoginCount(), 'error_login_time' => date("Y-m-d H:i:s"), 'error_login_ip' => $now_ip)); if ($this->user->getErrorLoginCount() >= $max_error_count) { hook()->apply("UserLogin_PostLogin_restrictions", NULL, $this->user); } $this->throwMsg(-4); } else { if (in_array($this->user->getStatus(), [0, 1, 2])) { if ($this->user->getErrorLoginCount() > 0) { //错误登录清零 $this->user->set(array("error_login_count" => 0)); } } else { //登录受限制,无法登录 $this->throwMsg(-9); } } } try { //登录成功后的COOKIE设置 if (strlen($this->user->getCookieLogin()) < 10) { $this->user->set(array("cookie_login" => salt_hash(time() . $this->user->getEmail(), salt(20)))); } if ($save_status) { cookie()->set("UserLogin", $this->user->getId() . "\t" . $this->user->getCookieLogin(), hook()->apply("UserLogin_PostLogin_CookieTime", time() + 60 * 60 * 24 * 7)); } else { cookie()->set("UserLogin", $this->user->getId() . "\t" . $this->user->getCookieLogin()); } } catch (\Exception $ex) { $this->throwMsg(-6); } try { //最后登录信息 self::setLastLoginInfo($this->user); } catch (\Exception $ex) { $this->code = -7; } hook()->apply('UserLogin_PostLogin_Success', NULL, $this->user); }