%PDF-1.5 %���� ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY
| Server IP : 14.207.165.8 / Your IP : 216.73.216.26 Web Server : Apache/2.4.18 (Ubuntu) System : Linux 246 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64 User : root ( 0) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /proc/thread-self/root/var/www/html/water/vendor/amnah/yii2-user/controllers/ |
Upload File : |
<?php
namespace amnah\yii2\user\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\widgets\ActiveForm;
/**
* Default controller for User module
*/
class DefaultController extends Controller
{
/**
* @var \amnah\yii2\user\Module
* @inheritdoc
*/
public $module;
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['index', 'confirm', 'resend', 'logout'],
'allow' => true,
'roles' => ['?', '@'],
],
[
'actions' => ['account', 'profile', 'resend-change', 'cancel'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['login', 'register', 'forgot', 'reset', 'login-email', 'login-callback'],
'allow' => true,
'roles' => ['?'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* Display index - debug page, login page, or account page
*/
public function actionIndex()
{
if (defined('YII_DEBUG') && YII_DEBUG) {
$actions = $this->module->getActions();
return $this->render('index', ["actions" => $actions]);
} elseif (Yii::$app->user->isGuest) {
return $this->redirect(["/user/login"]);
} else {
return $this->redirect(["/user/account"]);
}
}
/**
* Display login page
*/
public function actionLogin()
{
/** @var \amnah\yii2\user\models\forms\LoginForm $model */
$model = $this->module->model("LoginForm");
// load post data and login
$post = Yii::$app->request->post();
if ($model->load($post) && $model->validate()) {
$returnUrl = $this->performLogin($model->getUser(), $model->rememberMe);
return $this->redirect($returnUrl);
}
return $this->render('login', compact("model"));
}
/**
* Login/register via email
*/
public function actionLoginEmail()
{
/** @var \amnah\yii2\user\models\forms\LoginEmailForm $loginEmailForm */
$loginEmailForm = $this->module->model("LoginEmailForm");
// load post data and validate
$post = Yii::$app->request->post();
if ($loginEmailForm->load($post) && $loginEmailForm->sendEmail()) {
$user = $loginEmailForm->getUser();
$message = $user ? "Login link sent" : "Registration link sent";
$message .= " - Please check your email";
Yii::$app->session->setFlash("Login-success", Yii::t("user", $message));
}
return $this->render("loginEmail", compact("loginEmailForm"));
}
/**
* Login/register callback via email
*/
public function actionLoginCallback($token)
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\Profile $profile */
/** @var \amnah\yii2\user\models\Role $role */
/** @var \amnah\yii2\user\models\UserToken $userToken */
$user = $this->module->model("User");
$profile = $this->module->model("Profile");
$userToken = $this->module->model("UserToken");
// check token and log user in directly
$userToken = $userToken::findByToken($token, $userToken::TYPE_EMAIL_LOGIN);
if ($userToken && $userToken->user) {
$returnUrl = $this->performLogin($userToken->user, $userToken->data);
$userToken->delete();
return $this->redirect($returnUrl);
}
// load post data
$post = Yii::$app->request->post();
$userLoaded = $user->load($post);
$profileLoaded = $profile->load($post);
if ($userToken && ($userLoaded || $profileLoaded)) {
// ensure that email is taken from the $userToken (and not from user input)
$user->email = $userToken->data;
// validate and register
if ($user->validate() && $profile->validate()) {
$role = $this->module->model("Role");
$user->setRegisterAttributes($role::ROLE_USER, $user::STATUS_ACTIVE)->save();
$profile->setUser($user->id)->save();
// log user in and delete token
$returnUrl = $this->performLogin($user);
$userToken->delete();
return $this->redirect($returnUrl);
}
}
$user->email = $userToken ? $userToken->data : null;
return $this->render("loginCallback", compact("user", "profile", "userToken"));
}
/**
* Perform the login
*/
protected function performLogin($user, $rememberMe = true)
{
// log user in
$loginDuration = $rememberMe ? $this->module->loginDuration : 0;
Yii::$app->user->login($user, $loginDuration);
// check for a valid returnUrl (to prevent a weird login bug)
// https://github.com/amnah/yii2-user/issues/115
$loginRedirect = $this->module->loginRedirect;
$returnUrl = Yii::$app->user->getReturnUrl($loginRedirect);
if (strpos($returnUrl, "user/login") !== false || strpos($returnUrl, "user/logout") !== false) {
$returnUrl = null;
}
return $returnUrl;
}
/**
* Log user out and redirect
*/
public function actionLogout()
{
Yii::$app->user->logout();
// handle redirect
$logoutRedirect = $this->module->logoutRedirect;
if ($logoutRedirect) {
return $this->redirect($logoutRedirect);
}
return $this->goHome();
}
/**
* Display registration page
*/
public function actionRegister()
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\Profile $profile */
/** @var \amnah\yii2\user\models\Role $role */
// set up new user/profile objects
$user = $this->module->model("User", ["scenario" => "register"]);
$profile = $this->module->model("Profile");
// load post data
$post = Yii::$app->request->post();
if ($user->load($post)) {
// ensure profile data gets loaded
$profile->load($post);
// validate for ajax request
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($user, $profile);
}
// validate for normal request
if ($user->validate() && $profile->validate()) {
// perform registration
$role = $this->module->model("Role");
$user->setRegisterAttributes($role::ROLE_USER)->save();
$profile->setUser($user->id)->save();
$this->afterRegister($user);
// set flash
// don't use $this->refresh() because user may automatically be logged in and get 403 forbidden
$successText = Yii::t("user", "Successfully registered [ {displayName} ]", ["displayName" => $user->getDisplayName()]);
$guestText = "";
if (Yii::$app->user->isGuest) {
$guestText = Yii::t("user", " - Please check your email to confirm your account");
}
Yii::$app->session->setFlash("Register-success", $successText . $guestText);
}
}
return $this->render("register", compact("user", "profile"));
}
/**
* Process data after registration
* @param \amnah\yii2\user\models\User $user
*/
protected function afterRegister($user)
{
/** @var \amnah\yii2\user\models\UserToken $userToken */
$userToken = $this->module->model("UserToken");
// determine userToken type to see if we need to send email
$userTokenType = null;
if ($user->status == $user::STATUS_INACTIVE) {
$userTokenType = $userToken::TYPE_EMAIL_ACTIVATE;
} elseif ($user->status == $user::STATUS_UNCONFIRMED_EMAIL) {
$userTokenType = $userToken::TYPE_EMAIL_CHANGE;
}
// check if we have a userToken type to process, or just log user in directly
if ($userTokenType) {
$userToken = $userToken::generate($user->id, $userTokenType);
if (!$numSent = $user->sendEmailConfirmation($userToken)) {
// handle email error
//Yii::$app->session->setFlash("Email-error", "Failed to send email");
}
} else {
Yii::$app->user->login($user, $this->module->loginDuration);
}
}
/**
* Confirm email
*/
public function actionConfirm($token)
{
/** @var \amnah\yii2\user\models\UserToken $userToken */
/** @var \amnah\yii2\user\models\User $user */
// search for userToken
$success = false;
$email = "";
$userToken = $this->module->model("UserToken");
$userToken = $userToken::findByToken($token, [$userToken::TYPE_EMAIL_ACTIVATE, $userToken::TYPE_EMAIL_CHANGE]);
if ($userToken) {
// find user and ensure that another user doesn't have that email
// for example, user registered another account before confirming change of email
$user = $this->module->model("User");
$user = $user::findOne($userToken->user_id);
$newEmail = $userToken->data;
if ($user->confirm($newEmail)) {
$success = true;
}
// set email and delete token
$email = $newEmail ?: $user->email;
$userToken->delete();
}
return $this->render("confirm", compact("userToken", "success", "email"));
}
/**
* Account
*/
public function actionAccount()
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\UserToken $userToken */
// set up user and load post data
$user = Yii::$app->user->identity;
$user->setScenario("account");
$loadedPost = $user->load(Yii::$app->request->post());
// validate for ajax request
if ($loadedPost && Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($user);
}
// validate for normal request
$userToken = $this->module->model("UserToken");
if ($loadedPost && $user->validate()) {
// check if user changed his email
$newEmail = $user->checkEmailChange();
if ($newEmail) {
$userToken = $userToken::generate($user->id, $userToken::TYPE_EMAIL_CHANGE, $newEmail);
if (!$numSent = $user->sendEmailConfirmation($userToken)) {
// handle email error
//Yii::$app->session->setFlash("Email-error", "Failed to send email");
}
}
// save, set flash, and refresh page
$user->save(false);
Yii::$app->session->setFlash("Account-success", Yii::t("user", "Account updated"));
return $this->refresh();
} else {
$userToken = $userToken::findByUser($user->id, $userToken::TYPE_EMAIL_CHANGE);
}
return $this->render("account", compact("user", "userToken"));
}
/**
* Profile
*/
public function actionProfile()
{
/** @var \amnah\yii2\user\models\Profile $profile */
// set up profile and load post data
$profile = Yii::$app->user->identity->profile;
$loadedPost = $profile->load(Yii::$app->request->post());
// validate for ajax request
if ($loadedPost && Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($profile);
}
// validate for normal request
if ($loadedPost && $profile->validate()) {
$profile->save(false);
Yii::$app->session->setFlash("Profile-success", Yii::t("user", "Profile updated"));
return $this->refresh();
}
return $this->render("profile", compact("profile"));
}
/**
* Resend email confirmation
*/
public function actionResend()
{
/** @var \amnah\yii2\user\models\forms\ResendForm $model */
// load post data and send email
$model = $this->module->model("ResendForm");
if ($model->load(Yii::$app->request->post()) && $model->sendEmail()) {
// set flash (which will show on the current page)
Yii::$app->session->setFlash("Resend-success", Yii::t("user", "Confirmation email resent"));
return $this->refresh();
}
return $this->render("resend", compact("model"));
}
/**
* Resend email change confirmation
*/
public function actionResendChange()
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\UserToken $userToken */
// find userToken of type email change
$user = Yii::$app->user->identity;
$userToken = $this->module->model("UserToken");
$userToken = $userToken::findByUser($user->id, $userToken::TYPE_EMAIL_CHANGE);
if ($userToken) {
// send email and set flash message
$user->sendEmailConfirmation($userToken);
Yii::$app->session->setFlash("Resend-success", Yii::t("user", "Confirmation email resent"));
}
return $this->redirect(["/user/account"]);
}
/**
* Cancel email change
*/
public function actionCancel()
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\UserToken $userToken */
// find userToken of type email change
$user = Yii::$app->user->identity;
$userToken = $this->module->model("UserToken");
$userToken = $userToken::findByUser($user->id, $userToken::TYPE_EMAIL_CHANGE);
if ($userToken) {
$userToken->delete();
Yii::$app->session->setFlash("Cancel-success", Yii::t("user", "Email change cancelled"));
}
return $this->redirect(["/user/account"]);
}
/**
* Forgot password
*/
public function actionForgot()
{
/** @var \amnah\yii2\user\models\forms\ForgotForm $model */
// load post data and send email
$model = $this->module->model("ForgotForm");
if ($model->load(Yii::$app->request->post()) && $model->sendForgotEmail()) {
// set flash (which will show on the current page)
Yii::$app->session->setFlash("Forgot-success", Yii::t("user", "Instructions to reset your password have been sent"));
return $this->refresh();
}
return $this->render("forgot", compact("model"));
}
/**
* Reset password
*/
public function actionReset($token)
{
/** @var \amnah\yii2\user\models\User $user */
/** @var \amnah\yii2\user\models\UserToken $userToken */
// get user token and check expiration
$userToken = $this->module->model("UserToken");
$userToken = $userToken::findByToken($token, $userToken::TYPE_PASSWORD_RESET);
if (!$userToken) {
return $this->render('reset', ["invalidToken" => true]);
}
// get user and set "reset" scenario
$success = false;
$user = $this->module->model("User");
$user = $user::findOne($userToken->user_id);
$user->setScenario("reset");
// load post data and reset user password
if ($user->load(Yii::$app->request->post()) && $user->save()) {
// delete userToken and set success = true
$userToken->delete();
$success = true;
}
return $this->render('reset', compact("user", "success"));
}
}