%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/authclient/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/authclient/BaseFormAuth.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2016 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\user\authclient;
use humhub\modules\user\models\User;
use humhub\modules\user\Module;
use Yii;
use yii\base\NotSupportedException;
use humhub\modules\user\models\forms\Login;
/**
* BaseFormAuth is a base class for AuthClients using the Login Form
*
* @since 1.1
*/
class BaseFormAuth extends BaseClient
{
/**
* @var Login the login form model
*/
public $login = null;
/**
* @var User User from submitted login form (by username, without password)
*/
private $loginUser = null;
/**
* Authenticate the user using the login form.
*
* @throws NotSupportedException
*/
public function auth()
{
throw new NotSupportedException('Method "' . get_class($this) . '::' . __FUNCTION__ . '" not implemented.');
}
/**
* Find user by passed username from login form
*
* @return User|null
*/
public function getUserByLogin()
{
if (!$this->loginUser) {
$this->loginUser = ($this->login instanceof Login)
? User::find()
->where(['username' => $this->login->username])
->orWhere(['email' => $this->login->username])
->andWhere(['auth_mode' => $this->id])
->one()
: null;
}
return $this->loginUser;
}
/**
* How much seconds current user (who tried to log in by this client auth form) is delayed for login action
*
* @return integer
* @since 1.8
*/
public function getDelayedLoginTime()
{
return $this->getUserByLogin()
? $this->getUserByLogin()->getSettings()->get('nextLoginPossibleTime') - time()
: 0;
}
/**
* Check if current user (who tried to log in by this client auth form) is delayed for login action
*
* @return boolean
* @since 1.8
*/
public function isDelayedLoginAction()
{
return $this->getDelayedLoginTime() > 0;
}
/**
* Get a failed login attempts count
*
* @since 1.8
* @return int
*/
public function getFailedLoginAttemptsCount()
{
return (int)$this->getUserByLogin()->getSettings()->get('failedLoginAttemptsCount', 0);
}
/**
* Increase a counter of failed login attempts
* (Used after failed login action)
*
* @since 1.8
*/
public function countFailedLoginAttempts()
{
if ($this->getUserByLogin()) {
$this->getUserByLogin()->getSettings()->set('failedLoginAttemptsCount', $this->getFailedLoginAttemptsCount() + 1);
$this->delayLoginAfterFailedAttempt();
}
}
/**
* Reset a counter of failed login attempts
* (Used after successful login action)
*
* @since 1.8
*/
public function resetFailedLoginAttempts()
{
if ($this->getUserByLogin()) {
$this->getUserByLogin()->getSettings()->delete('failedLoginAttemptsCount');
$this->getUserByLogin()->getSettings()->delete('nextLoginPossibleTime');
}
}
/**
* Set data(counter and time) to mark the user is delayed for next login action
*
* @since 1.8
*/
public function delayLoginAfterFailedAttempt()
{
if (!$this->getUserByLogin()) {
return;
}
/* @var $module Module */
$module = Yii::$app->getModule('user');
$delaySeconds = 0;
foreach ($module->failedLoginDelayTimes as $configAttempts => $configSeconds) {
if ($this->getFailedLoginAttemptsCount() > $configAttempts) {
$delaySeconds = $configSeconds;
}
}
$this->getUserByLogin()->getSettings()->set('nextLoginPossibleTime', time() + $delaySeconds);
}
/**
* Report that the logged in user had some failed attempts
* (Used to display the report right after successful login action)
*
* @since 1.8
*/
public function reportAboutFailedLoginAttempts()
{
if (!$this->getUserByLogin()) {
return;
}
if ($this->getFailedLoginAttemptsCount() > 0) {
Yii::$app->getView()->warn(Yii::t('UserModule.base', 'Unsuccessful login attempts since last login: {failedLoginAttemptsCount}', [
'{failedLoginAttemptsCount}' => $this->getFailedLoginAttemptsCount()
]));
}
}
/**
* Action after successful login action
*/
public function onSuccessLogin()
{
$this->reportAboutFailedLoginAttempts();
$this->resetFailedLoginAttempts();
// Reset cached User because we don't need this anymore,
// but we should reset in order to avoid issues on tests where it may be used by different users after `$I->logout();`
$this->loginUser = null;
}
}