2fa by email and by sms

This commit is contained in:
Antonio Cordeddu
2022-07-09 19:10:00 +02:00
parent 69e4bb620e
commit 91d110e1e7
47 changed files with 1253 additions and 48 deletions

View File

@ -45,7 +45,8 @@
"yiisoft/yii2-authclient": "^2.1", "yiisoft/yii2-authclient": "^2.1",
"yiisoft/yii2-httpclient": "^2.0", "yiisoft/yii2-httpclient": "^2.0",
"yiisoft/yii2-bootstrap": "^2.0", "yiisoft/yii2-bootstrap": "^2.0",
"yiisoft/yii2-swiftmailer": "^2.0" "yiisoft/yii2-swiftmailer": "^2.0",
"yetopen/yii2-sms-sender-interface": "^0.1.1"
}, },
"suggest": { "suggest": {
"2amigos/2fa-library": "Needed if you want to enable 2 Factor Authentication. Require version ^1.0", "2amigos/2fa-library": "Needed if you want to enable 2 Factor Authentication. Require version ^1.0",

View File

@ -162,6 +162,37 @@ class Bootstrap implements BootstrapInterface
}); });
} }
// Initialize array of two factor authentication validators available
if(is_null(Yii::$app->getModule('user')->twoFactorAuthenticationValidators)){
Yii::$app->getModule('user')->twoFactorAuthenticationValidators=[
'google-authenticator'=>[
'class'=>\Da\User\Validator\TwoFactorCodeValidator::class,
'description'=>Yii::t('usuario', 'Google Authenticator'),
'configurationUrl'=>'user/settings/two-factor'
],
'email'=>[
'class'=>\Da\User\Validator\TwoFactorEmailValidator::class,
'description'=>Yii::t('usuario', 'Email'),
'configurationUrl'=>'user/settings/two-factor-email',
// Time duration of the code in seconds
'codeDurationTime'=>300
],
'sms'=>[
'class'=>\Da\User\Validator\TwoFactorTextMessageValidator::class,
'description'=>Yii::t('usuario', 'Text message'),
'configurationUrl'=>'user/settings/two-factor-sms',
// component for sending sms
'smsSender'=>'smsSender',
// Time duration of the code in seconds
'codeDurationTime'=>300
]
];
}
if ($app instanceof WebApplication) { if ($app instanceof WebApplication) {
// override Yii // override Yii
$di->set( $di->set(
@ -173,6 +204,11 @@ class Bootstrap implements BootstrapInterface
] ]
); );
} }
} catch (Exception $e) { } catch (Exception $e) {
die($e); die($e);
} }

View File

@ -20,6 +20,9 @@ use Da\User\Service\SocialNetworkAccountConnectService;
use Da\User\Service\SocialNetworkAuthenticateService; use Da\User\Service\SocialNetworkAuthenticateService;
use Da\User\Traits\ContainerAwareTrait; use Da\User\Traits\ContainerAwareTrait;
use Da\User\Traits\ModuleAwareTrait; use Da\User\Traits\ModuleAwareTrait;
use Da\User\Validator\TwoFactorEmailValidator;
use Da\User\Validator\TwoFactorTextMessageValidator;
use Da\User\Model\User;
use Yii; use Yii;
use yii\authclient\AuthAction; use yii\authclient\AuthAction;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
@ -30,6 +33,7 @@ use yii\filters\VerbFilter;
use yii\web\Controller; use yii\web\Controller;
use yii\web\Response; use yii\web\Response;
use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
class SecurityController extends Controller class SecurityController extends Controller
{ {
@ -206,13 +210,30 @@ class SecurityController extends Controller
return $this->goBack(); return $this->goBack();
} }
} }
else{
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$credentials=Yii::$app->session->get('credentials');
$login= $credentials['login'];
$user = User::findOne(['email'=>$login]);
if( $user==null)
$user = User::findOne(['username'=>$login]);
$tfType = $user->getAuthTfType();
$class = ArrayHelper::getValue($validators,$tfType.'.class');
$object = $this
->make($class, [$user, null, $this->module->twoFactorAuthenticationCycles]);
$object->generateCode();
}
return $this->render( return $this->render(
'confirm', 'confirm',
[ [
'model' => $form, 'model' => $form,
'module' => $this->module, 'module' => $this->module
] ]
); );
} }

View File

@ -28,10 +28,14 @@ use Da\User\Query\SocialNetworkAccountQuery;
use Da\User\Query\UserQuery; use Da\User\Query\UserQuery;
use Da\User\Service\EmailChangeService; use Da\User\Service\EmailChangeService;
use Da\User\Service\TwoFactorQrCodeUriGeneratorService; use Da\User\Service\TwoFactorQrCodeUriGeneratorService;
use Da\User\Service\TwoFactorEmailCodeGeneratorService;
use Da\User\Service\TwoFactorSmsCodeGeneratorService;
use Da\User\Traits\ContainerAwareTrait; use Da\User\Traits\ContainerAwareTrait;
use Da\User\Traits\ModuleAwareTrait; use Da\User\Traits\ModuleAwareTrait;
use Da\User\Validator\AjaxRequestModelValidator; use Da\User\Validator\AjaxRequestModelValidator;
use Da\User\Validator\TwoFactorCodeValidator; use Da\User\Validator\TwoFactorCodeValidator;
use Da\User\Validator\TwoFactorEmailValidator;
use Da\User\Validator\TwoFactorTextMessageValidator;
use Yii; use Yii;
use yii\base\DynamicModel; use yii\base\DynamicModel;
use yii\filters\AccessControl; use yii\filters\AccessControl;
@ -111,7 +115,8 @@ class SettingsController extends Controller
'delete', 'delete',
'two-factor', 'two-factor',
'two-factor-enable', 'two-factor-enable',
'two-factor-disable' 'two-factor-disable',
'two-factor-mobile-phone'
], ],
'roles' => ['@'], 'roles' => ['@'],
], ],
@ -348,7 +353,7 @@ class SettingsController extends Controller
public function actionConfirm($id, $code) public function actionConfirm($id, $code)
{ {
$user = $this->userQuery->whereId($id)->one(); $user = $this->userQuery->whereId($id)->one();
if ($user === null || MailChangeStrategyInterface::TYPE_INSECURE === $this->module->emailChangeStrategy) { if ($user === null || MailChangeStrategyInterface::TYPE_INSECURE === $this->module->emailChangeStrategy) {
throw new NotFoundHttpException(); throw new NotFoundHttpException();
} }
@ -400,16 +405,31 @@ class SettingsController extends Controller
public function actionTwoFactor($id) public function actionTwoFactor($id)
{ {
/** @var User $user */ $choice=Yii::$app->request->post('choice');
/**
* @var User $user
*/
$user = $this->userQuery->whereId($id)->one(); $user = $this->userQuery->whereId($id)->one();
if (null === $user) { if (null === $user) {
throw new NotFoundHttpException(); throw new NotFoundHttpException();
} }
$uri = $this->make(TwoFactorQrCodeUriGeneratorService::class, [$user])->run(); switch($choice)
{
return $this->renderAjax('two-factor', ['id' => $id, 'uri' => $uri]); case 'google-authenticator':
$uri = $this->make(TwoFactorQrCodeUriGeneratorService::class, [$user])->run();
return $this->renderAjax('two-factor', ['id' => $id, 'uri' => $uri]);
case 'email':
$emailCode = $this->make(TwoFactorEmailCodeGeneratorService::class, [$user])->run();
return $this->renderAjax('two-factor-email', ['id' => $id, 'code' => $emailCode]);
case 'sms':
// get mobile phone, if exists
$mobilePhone=$user->getAuthTfMobilePhone();
$smsCode = $this->make(TwoFactorSmsCodeGeneratorService::class, [$user])->run();
return $this->renderAjax('two-factor-sms', ['id' => $id, 'code' => $smsCode, 'mobilePhone' => $mobilePhone] );
}
} }
public function actionTwoFactorEnable($id) public function actionTwoFactorEnable($id)
@ -426,18 +446,22 @@ class SettingsController extends Controller
]; ];
} }
$code = Yii::$app->request->get('code'); $code = Yii::$app->request->get('code');
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$choice = Yii::$app->request->get('choice');
$codeDurationTime = ArrayHelper::getValue($validators,$choice.'.codeDurationTime', 0);
$class = ArrayHelper::getValue($validators,$choice.'.class');
$success = $this $object = $this
->make(TwoFactorCodeValidator::class, [$user, $code, $this->module->twoFactorAuthenticationCycles]) ->make($class, [$user, $code, $this->module->twoFactorAuthenticationCycles]);
->validate(); $success = $object->validate();
$success = $success && $user->updateAttributes(['auth_tf_enabled' => '1','auth_tf_type' => $choice]);
$success = $success && $user->updateAttributes(['auth_tf_enabled' => '1']); $message = $success
? $object->getSuccessMessage():$object->getUnsuccessMessage($codeDurationTime);
return [ return [
'success' => $success, 'success' => $success,
'message' => $success 'message' => $message
? Yii::t('usuario', 'Two factor authentication successfully enabled.')
: Yii::t('usuario', 'Verification failed. Please, enter new code.')
]; ];
} }
@ -488,4 +512,39 @@ class SettingsController extends Controller
$account->delete(); $account->delete();
$this->trigger(SocialNetworkConnectEvent::EVENT_AFTER_DISCONNECT, $event); $this->trigger(SocialNetworkConnectEvent::EVENT_AFTER_DISCONNECT, $event);
} }
public function actionTwoFactorMobilePhone($id)
{
Yii::$app->response->format = Response::FORMAT_JSON;
/**
*
*
* @var User $user
*/
$user = $this->userQuery->whereId($id)->one();
if (null === $user) {
return [
'success' => false,
'message' => Yii::t('usuario', 'User not found.')
];
}
$mobilePhone = Yii::$app->request->get('mobilephone');
$currentMobilePhone = $user->getAuthTfMobilePhone();
$success=false;
if($currentMobilePhone==$mobilePhone){
$success=true;
}else{
$success = $user->updateAttributes(['auth_tf_mobile_phone' => $mobilePhone]);
$this->make(TwoFactorSmsCodeGeneratorService::class, [$user])->run();
}
return [
'success' => $success,
'message' => $success
? Yii::t('usuario', 'Mobile phone number successfully enabled.')
: Yii::t('usuario', 'Mobile phone number not registered.'),
];
}
} }

View File

@ -27,6 +27,7 @@ class MailEvent extends Event
const TYPE_RECOVERY = 'recovery'; const TYPE_RECOVERY = 'recovery';
const TYPE_CONFIRM = 'confirm'; const TYPE_CONFIRM = 'confirm';
const TYPE_RECONFIRM = 'reconfirm'; const TYPE_RECONFIRM = 'reconfirm';
const TYPE_TWOFACTORCODE = 'twofactorcode';
const EVENT_BEFORE_SEND_MAIL = 'beforeSendMail'; const EVENT_BEFORE_SEND_MAIL = 'beforeSendMail';
const EVENT_AFTER_SEND_MAIL = 'afterSendMail'; const EVENT_AFTER_SEND_MAIL = 'afterSendMail';

View File

@ -114,6 +114,28 @@ class MailFactory
return static::makeMailerService(MailEvent::TYPE_RECONFIRM, $from, $to, $subject, 'reconfirmation', $params); return static::makeMailerService(MailEvent::TYPE_RECONFIRM, $from, $to, $subject, 'reconfirmation', $params);
} }
/**
* @param User $user
* @param String $code
*
* @throws InvalidConfigException
* @return MailService
*/
public static function makeTwoFactorCodeMailerService(User $user, String $code)
{
/** @var Module $module */
$module = Yii::$app->getModule('user');
$to = $user->email;
$from = $module->mailParams['fromEmail'];
$subject = $module->mailParams['reconfirmationMailSubject'];
$params = [
'code' => $code,
];
return static::makeMailerService(MailEvent::TYPE_TWOFACTORCODE, $from, $to, $subject, 'twofactorcode', $params);
}
/** /**
* Builds a MailerService. * Builds a MailerService.
* *

View File

@ -15,14 +15,19 @@ use Da\User\Helper\SecurityHelper;
use Da\User\Model\User; use Da\User\Model\User;
use Da\User\Query\UserQuery; use Da\User\Query\UserQuery;
use Da\User\Traits\ModuleAwareTrait; use Da\User\Traits\ModuleAwareTrait;
use Da\User\Traits\ContainerAwareTrait;
use Da\User\Validator\TwoFactorCodeValidator; use Da\User\Validator\TwoFactorCodeValidator;
use Da\User\Validator\TwoFactorEmailValidator;
use Da\User\Validator\TwoFactorTextMessageValidator;
use Yii; use Yii;
use yii\base\InvalidParamException; use yii\base\InvalidParamException;
use yii\base\Model; use yii\base\Model;
use yii\helpers\ArrayHelper;
class LoginForm extends Model class LoginForm extends Model
{ {
use ModuleAwareTrait; use ModuleAwareTrait;
use ContainerAwareTrait;
/** /**
* @var string login User's email or username * @var string login User's email or username
@ -107,14 +112,21 @@ class LoginForm extends Model
'twoFactorAuthenticationCodeValidate' => [ 'twoFactorAuthenticationCodeValidate' => [
'twoFactorAuthenticationCode', 'twoFactorAuthenticationCode',
function ($attribute) { function ($attribute) {
if ($this->user === null ||
!(new TwoFactorCodeValidator( if ($this->user === null ) {
$this->user,
$this->twoFactorAuthenticationCode,
$this->module->twoFactorAuthenticationCycles
))
->validate()) {
$this->addError($attribute, Yii::t('usuario', 'Invalid two factor authentication code')); $this->addError($attribute, Yii::t('usuario', 'Invalid two factor authentication code'));
}else{
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$type = $this->user->auth_tf_type;
$class = ArrayHelper::getValue($validators,$type.'.class');
$codeDurationTime = ArrayHelper::getValue($validators,$type.'.codeDurationTime', 0);
$validator = $this
->make($class, [$this->user, $this->twoFactorAuthenticationCode, $this->module->twoFactorAuthenticationCycles]);
$success = $validator->validate();
if (!$success) {
$this->addError($attribute, $validator->getUnsuccessLoginMessage($codeDurationTime));
}
} }
} }
], ],

View File

@ -0,0 +1,27 @@
<?php
namespace Da\User\Migration;
use yii\db\Migration;
/**
* Handles adding columns to table `{{%user}}`.
*/
class m000000_000010_add_auth_tf_type_column_to_user_table extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('{{%user}}', 'auth_tf_type', $this->string(20)->after('auth_tf_enabled'));
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('{{%user}}', 'auth_tf_type');
}
}

View File

@ -0,0 +1,25 @@
<?php
use yii\db\Migration;
/**
* Handles adding columns to table `{{%user}}`.
*/
class m220708_080521_add_auth_tf_mobile_phone_column_to_user_table extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('{{%user}}', 'auth_tf_mobile_phone', $this->string(20)->after('auth_tf_type'));
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('{{%user}}', 'auth_tf_mobile_phone');
}
}

View File

@ -44,6 +44,8 @@ use yii\web\IdentityInterface;
* @property string $auth_key * @property string $auth_key
* @property string $auth_tf_key * @property string $auth_tf_key
* @property int $auth_tf_enabled * @property int $auth_tf_enabled
* @property string $auth_tf_type
* @property string $auth_tf_mobile_phone
* @property string $registration_ip * @property string $registration_ip
* @property int $confirmed_at * @property int $confirmed_at
* @property int $blocked_at * @property int $blocked_at
@ -248,7 +250,9 @@ class User extends ActiveRecord implements IdentityInterface
// two factor auth rules // two factor auth rules
'twoFactorSecretTrim' => ['auth_tf_key', 'trim'], 'twoFactorSecretTrim' => ['auth_tf_key', 'trim'],
'twoFactorSecretLength' => ['auth_tf_key', 'string', 'max' => 16], 'twoFactorSecretLength' => ['auth_tf_key', 'string', 'max' => 16],
'twoFactorEnabledNumber' => ['auth_tf_enabled', 'boolean'] 'twoFactorEnabledNumber' => ['auth_tf_enabled', 'boolean'],
'twoFactorTypeLength' => ['auth_tf_type', 'string', 'max' => 20],
'twoFactorTypeLength' => ['auth_tf_mobile_phone', 'string', 'max' => 20],
]; ];
} }
@ -361,4 +365,22 @@ class User extends ActiveRecord implements IdentityInterface
return $d->diff(new \DateTime(), true)->format("%a"); return $d->diff(new \DateTime(), true)->format("%a");
} }
/**
* Returns authentication two factor type enabled for the user
* @return integer
*/
public function getAuthTfType()
{
return $this->getAttribute('auth_tf_type');
}
/**
* Returns the mobile phone number used for sms authentication two factor for the user
* @return string
*/
public function getAuthTfMobilePhone()
{
return $this->getAttribute('auth_tf_mobile_phone');
}
} }

View File

@ -81,11 +81,19 @@ class Module extends BaseModule
* @var bool whether to enable two factor authentication or not * @var bool whether to enable two factor authentication or not
*/ */
public $enableTwoFactorAuthentication = false; public $enableTwoFactorAuthentication = false;
/**
* @var array list of channel for two factor authentication availables
*/
public $twoFactorAuthenticationValidators = null;
/** /**
* @var int cycles of key generation are set on 30 sec. To avoid sync issues, increased validity up to 60 sec. * @var int cycles of key generation are set on 30 sec. To avoid sync issues, increased validity up to 60 sec.
* @see http://2fa-library.readthedocs.io/en/latest/ * @see http://2fa-library.readthedocs.io/en/latest/
*/ */
public $twoFactorAuthenticationCycles = 1; public $twoFactorAuthenticationCycles = 1;
/**
* @var int the number of seconds for which the code sent by email or by mobile phone is valid
* */
public $twoFactorEmailAuthenticationValidity = 300;
/** /**
* @var bool whether to allow auto login or not * @var bool whether to allow auto login or not
*/ */

View File

@ -0,0 +1,61 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service;
use Da\TwoFA\Manager;
use Da\User\Contracts\ServiceInterface;
use Da\User\Model\User;
use Da\User\Factory\MailFactory;
use Yii;
class TwoFactorEmailCodeGeneratorService implements ServiceInterface
{
/**
* @var User
*/
protected $user;
/**
* TwoFactorEmailCodeGeneratorService constructor.
*
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* @inheritdoc
*/
public function run()
{
$user = $this->user;
if (!$user->auth_tf_key) {
$user->auth_tf_key = (new Manager())->generateSecretKey();
$user->updateAttributes(['auth_tf_key']);
}
// generate key
$code = random_int(0, 999999);
$code = str_pad($code, 6, 0, STR_PAD_LEFT);
// send email
$mailService = MailFactory::makeTwoFactorCodeMailerService($user, $code);
$mailService->run();
// put key in session
Yii::$app->session->set("email_code_time", date('Y-m-d H:i:s'));
Yii::$app->session->set("email_code", $code);
return $code;
}
}

View File

@ -0,0 +1,79 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Service;
use Da\TwoFA\Manager;
use Da\User\Contracts\ServiceInterface;
use Da\User\Model\User;
use Da\User\Factory\MailFactory;
use yii\di\Instance;
use yetopen\smssender\SmsSenderInterface;
use yii\helpers\ArrayHelper;
use Yii;
class TwoFactorSmsCodeGeneratorService implements ServiceInterface
{
/**
* @var User
*/
protected $user;
/**
* @var Type
*/
protected $type;
/**
* @var SmsSenderInterface
*/
protected $smsSender;
/**
* TwoFactorSmsCodeGeneratorService constructor.
*
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
$this->type = 'sms';
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$smsSender = ArrayHelper::getValue($validators,'sms'.'.smsSender');
$this->smsSender = Instance::ensure($smsSender, SmsSenderInterface::class);
}
/**
* @inheritdoc
*/
public function run()
{
// generate key
$code = random_int(0, 999999);
$code = str_pad($code, 6, 0, STR_PAD_LEFT);
// get the mobile phone of the user
$user = $this->user;
$mobilePhone=$user->getAuthTfMobilePhone();
if( !(null===$mobilePhone) && $mobilePhone!='' ){
// send sms
$this->smsSender->send($mobilePhone, $code);
// put key in session
Yii::$app->session->set("sms_code_time", date('Y-m-d H:i:s'));
Yii::$app->session->set("sms_code", $code);
}
return $code;
}
}

View File

@ -15,9 +15,14 @@ use Da\TwoFA\Exception\InvalidSecretKeyException;
use Da\TwoFA\Manager; use Da\TwoFA\Manager;
use Da\User\Contracts\ValidatorInterface; use Da\User\Contracts\ValidatorInterface;
use Da\User\Model\User; use Da\User\Model\User;
use Da\User\Traits\ContainerAwareTrait;
use Da\User\Service\TwoFactorEmailCodeGeneratorService;
use Yii;
class TwoFactorCodeValidator implements ValidatorInterface class TwoFactorCodeValidator implements ValidatorInterface
{ {
use ContainerAwareTrait;
protected $user; protected $user;
protected $code; protected $code;
protected $cycles; protected $cycles;
@ -46,4 +51,49 @@ class TwoFactorCodeValidator implements ValidatorInterface
$manager = new Manager(); $manager = new Manager();
return $manager->setCycles($this->cycles)->verify($this->code, $this->user->auth_tf_key); return $manager->setCycles($this->cycles)->verify($this->code, $this->user->auth_tf_key);
} }
/**
* @return bool
*
*/
public function isValidationCodeToBeSent()
{
return false;
}
/**
* @return string
*
*/
public function getSuccessMessage()
{
return Yii::t('usuario', 'Two factor authentication successfully enabled.');
}
/**
* @return string
*
*/
public function getUnsuccessMessage($codeDurationTime)
{
return Yii::t('usuario', 'Verification failed. Please, enter new code.');
}
/**
* @return string
*
*/
public function getUnsuccessLoginMessage($codeDurationTime)
{
return Yii::t('usuario', 'Verification failed. Please, enter new code.');
}
/**
* @return string
*
*/
public function generateCode()
{
return $this->make(TwoFactorEmailCodeGeneratorService::class,[$this->user])->run();
}
} }

View File

@ -0,0 +1,111 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Validator;
use Da\TwoFA\Exception\InvalidSecretKeyException;
use Da\User\Model\User;
use Yii;
use yii\helpers\ArrayHelper;
use Da\User\Traits\ContainerAwareTrait;
use Da\User\Service\TwoFactorEmailCodeGeneratorService;
class TwoFactorEmailValidator extends TwoFactorCodeValidator
{
use ContainerAwareTrait;
protected $user;
protected $code;
protected $cycles;
protected $type;
/**
* TwoFactorCodeValidator constructor.
*
* @param User $user
* @param $code
* @param int $cycles
*/
public function __construct(User $user, $code, $cycles = 0)
{
$this->user = $user;
$this->code = $code;
$this->cycles = $cycles;
$this->type = 'email';
}
/**
* @throws InvalidSecretKeyException
* @return bool|int
*
*/
public function validate()
{
$emailCodeTime = new \DateTime(Yii::$app->session->get("email_code_time"));
$currentTime = new \DateTime('now');
$interval = $currentTime->getTimestamp()-$emailCodeTime->getTimestamp();
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$codeDurationTime = ArrayHelper::getValue($validators,$this->type.'.codeDurationTime', 0);
if($interval > $codeDurationTime )
return false;
$emailCode = Yii::$app->session->get("email_code");
return $this->code==$emailCode;
}
/**
* @return bool
*
*/
public function isValidationCodeToBeSent()
{
return true;
}
/**
* @return string
*
*/
public function getSuccessMessage()
{
return Yii::t('usuario', 'Two factor authentication successfully enabled.');
}
/**
* @return string
*
*/
public function getUnsuccessMessage($codeDurationTime)
{
return Yii::t('usuario', 'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.', [$codeDurationTime]);
}
/**
* @return string
*
*/
public function getUnsuccessLoginMessage($codeDurationTime)
{
return Yii::t('usuario', 'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.', [$codeDurationTime]);
}
/**
* @return string
*
*/
public function generateCode()
{
return $this->make(TwoFactorEmailCodeGeneratorService::class,$this->user)->run();
}
}

View File

@ -0,0 +1,102 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Da\User\Validator;
use Da\TwoFA\Exception\InvalidSecretKeyException;
use Da\User\Model\User;
use Yii;
use yii\helpers\ArrayHelper;
use Da\User\Traits\ContainerAwareTrait;
use Da\User\Service\TwoFactorSmsCodeGeneratorService;
class TwoFactorTextMessageValidator extends TwoFactorCodeValidator
{
use ContainerAwareTrait;
protected $user;
protected $code;
protected $cycles;
/**
* TwoFactorCodeValidator constructor.
*
* @param User $user
* @param $code
* @param int $cycles
*/
public function __construct(User $user, $code, $cycles = 0)
{
$this->user = $user;
$this->code = $code;
$this->cycles = $cycles;
$this->type = 'sms';
}
/**
* @throws InvalidSecretKeyException
* @return bool|int
*
*/
public function validate()
{
$smsCodeTime = new \DateTime(Yii::$app->session->get("sms_code_time"));
$currentTime = new \DateTime('now');
$interval = $currentTime->getTimestamp()-$smsCodeTime->getTimestamp();
$module = Yii::$app->getModule('user');
$validators = $module->twoFactorAuthenticationValidators;
$codeDurationTime = ArrayHelper::getValue($validators,$this->type.'.codeDurationTime', 0);
if($interval > $codeDurationTime )
return false;
$smsCode = Yii::$app->session->get("sms_code");
return $this->code==$smsCode;
}
/**
* @return string
*
*/
public function getSuccessMessage()
{
return Yii::t('usuario', 'Two factor authentication successfully enabled.');
}
/**
* @return string
*
*/
public function getUnsuccessMessage($codeDurationTime)
{
return Yii::t('usuario', 'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.', [$codeDurationTime]);
}
/**
* @return string
*
*/
public function getUnsuccessLoginMessage($codeDurationTime)
{
return Yii::t('usuario', 'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.', [$codeDurationTime]);
}
/**
* @return string
*
*/
public function generateCode()
{
$object = $this->make(TwoFactorSmsCodeGeneratorService::class,[$this->user]);
return $object->run();
}
}

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -275,7 +275,22 @@ return [
'{0} cannot be blank.' => '{0} darf nicht leer sein.', '{0} cannot be blank.' => '{0} darf nicht leer sein.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Eine Nachricht wurde an Deine E-Mail Adresse gesendet@@', 'A message has been sent to your email address. ' => '@@Eine Nachricht wurde an Deine E-Mail Adresse gesendet@@',

View File

@ -277,4 +277,21 @@ return [
'Submit' => 'Absenden', 'Submit' => 'Absenden',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => 'Leider können Sie nicht mit dieser Seite arbeiten, ohne uns die Zustimmung zur Verarbeitung Ihrer Daten zu geben.', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => 'Leider können Sie nicht mit dieser Seite arbeiten, ohne uns die Zustimmung zur Verarbeitung Ihrer Daten zu geben.',
'Your consent is required to work with this site' => 'Ihre Zustimmung ist erforderlich, um mit dieser Website zu arbeiten', 'Your consent is required to work with this site' => 'Ihre Zustimmung ist erforderlich, um mit dieser Website zu arbeiten',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Now you can resume the login process' => '@@@@',
]; ];

View File

@ -276,6 +276,21 @@ return [
'privacy policy' => 'política de privacidad', 'privacy policy' => 'política de privacidad',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM, YYYY HH:mm}',
'{0} cannot be blank.' => '{0} no puede estar vacío.', '{0} cannot be blank.' => '{0} no puede estar vacío.',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '', '{0, date, MMM dd, YYYY HH:mm}' => '',
'An email has been sent with instructions for resetting your password' => '@@Se ha enviado un correo electrónico con instrucciones para restablecer su contraseña@@', 'An email has been sent with instructions for resetting your password' => '@@Se ha enviado un correo electrónico con instrucciones para restablecer su contraseña@@',

View File

@ -268,8 +268,23 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Authentication rule class {0} can not be instantiated' => '', 'Authentication rule class {0} can not be instantiated' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class must extend "yii\\rbac\\Rule".' => '', 'Rule class must extend "yii\\rbac\\Rule".' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'VKontakte' => '', 'VKontakte' => '',
'Yandex' => '', 'Yandex' => '',

View File

@ -192,9 +192,14 @@ return [
'Error sending welcome message to "{email}". Please try again later.' => '', 'Error sending welcome message to "{email}". Please try again later.' => '',
'Export my data' => '', 'Export my data' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Google Authenticator' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
'Impersonate this user' => '', 'Impersonate this user' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid password' => '', 'Invalid password' => '',
'Invalid two factor authentication code' => '', 'Invalid two factor authentication code' => '',
'Invalid value' => '', 'Invalid value' => '',
@ -203,6 +208,9 @@ return [
'Last login IP' => '', 'Last login IP' => '',
'Last login time' => '', 'Last login time' => '',
'Last password change' => '', 'Last password change' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Never' => '', 'Never' => '',
'New rule' => '', 'New rule' => '',
'Not found' => '', 'Not found' => '',
@ -210,6 +218,8 @@ return [
'Once you have deleted your data, you will not longer be able to sign in with this account.' => '', 'Once you have deleted your data, you will not longer be able to sign in with this account.' => '',
'Password age' => '', 'Password age' => '',
'Please be certain' => '', 'Please be certain' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Registration on this website is disabled' => '', 'Registration on this website is disabled' => '',
@ -229,14 +239,18 @@ return [
'Send password recovery email' => '', 'Send password recovery email' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
'The verification code is incorrect.' => '', 'The verification code is incorrect.' => '',
'There is neither role nor permission with name "{0}"' => '', 'There is neither role nor permission with name "{0}"' => '',
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This is the code to insert to enable two factor authentication' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -272,7 +272,22 @@ return [
'{0} cannot be blank.' => '{0} ne peut être vide.', '{0} cannot be blank.' => '{0} ne peut être vide.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'{0, date, MMM dd, YYYY HH:mm}' => '', '{0, date, MMM dd, YYYY HH:mm}' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -272,9 +272,24 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => 'Completa', 'Finish' => 'Completa',
'Force password change at next login' => 'Forza il cambio password al prossimo accesso', 'Force password change at next login' => 'Forza il cambio password al prossimo accesso',
'Forgot password?' => 'Password dimenticata?', 'Forgot password?' => 'Password dimenticata?',
'Google Authenticator' => 'Autenticatore di Google',
'Gravatar email' => 'Email di Gravatar', 'Gravatar email' => 'Email di Gravatar',
'Hello' => 'Ciao', 'Hello' => 'Ciao',
'Here you can download your personal data in a comma separated values format.' => 'Da qui puoi scaricare i tuoi dati in formato CSV.', 'Here you can download your personal data in a comma separated values format.' => 'Da qui puoi scaricare i tuoi dati in formato CSV.',
@ -121,6 +122,10 @@ return [
'In order to complete your request, please click the link below' => 'Per completare la richiesta fai click sul collegamento qui sotto', 'In order to complete your request, please click the link below' => 'Per completare la richiesta fai click sul collegamento qui sotto',
'In order to finish your registration, we need you to enter following fields' => 'Per finalizzare la registrazione devi fornire le seguenti informazioni', 'In order to finish your registration, we need you to enter following fields' => 'Per finalizzare la registrazione devi fornire le seguenti informazioni',
'Information' => 'Informazioni', 'Information' => 'Informazioni',
'Insert' => 'Inserisci',
'Insert the code you received by SMS.' => 'Inserisci il codice ricevuto tramite SMS.',
'Insert the code you received by email.' => 'Inserisci il codice ricevuto tramite email.',
'Insert the mobile phone number on which to receive text message.' => 'Inserisci il numero del cellulare sul quale ricevere i codici.',
'Invalid login or password' => 'Utente o password non validi', 'Invalid login or password' => 'Utente o password non validi',
'Invalid or expired link' => 'Collegamento non valido o scaduto', 'Invalid or expired link' => 'Collegamento non valido o scaduto',
'Invalid password' => 'Password non valida', 'Invalid password' => 'Password non valida',
@ -136,6 +141,9 @@ return [
'Login' => 'Accedi', 'Login' => 'Accedi',
'Logout' => 'Esci', 'Logout' => 'Esci',
'Manage users' => 'Gestisci gli utenti', 'Manage users' => 'Gestisci gli utenti',
'Mobile phone number' => 'Numero di cellulare',
'Mobile phone number not registered.' => 'L\'attivazione del numero di cellulare non è riuscita',
'Mobile phone number successfully enabled.' => 'Il numero di cellulare è stato abilitato',
'Name' => 'Nome', 'Name' => 'Nome',
'Networks' => 'Rete', 'Networks' => 'Rete',
'Never' => 'Mai', 'Never' => 'Mai',
@ -156,6 +164,8 @@ return [
'Please be certain' => 'Pensaci bene', 'Please be certain' => 'Pensaci bene',
'Please click the link below to complete your password reset' => 'Per favore fai click sul collegamento sotto per completare il cambio password', 'Please click the link below to complete your password reset' => 'Per favore fai click sul collegamento sotto per completare il cambio password',
'Please fix following errors:' => 'Per favore correggi i seguenti errori:', 'Please fix following errors:' => 'Per favore correggi i seguenti errori:',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => 'Inserire il codice corretto. Il codice è valido per {0} secondi. Se si desidera ricevere un nuovo codice cliccare su \'Annulla\' e ripetere la procedura di autenticazione',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => 'Inserire il codice corretto. Il codice è valido per {0} secondi. Se si desidera ricevere un nuovo codice, chiudere questa finestra e ripetere la richiesta di abilitazione.',
'Privacy' => 'Privacy', 'Privacy' => 'Privacy',
'Privacy settings' => 'Impostazioni privacy', 'Privacy settings' => 'Impostazioni privacy',
'Profile' => 'Profilo', 'Profile' => 'Profilo',
@ -192,6 +202,7 @@ return [
'Something went wrong' => 'È successo qualcosa di strano', 'Something went wrong' => 'È successo qualcosa di strano',
'Submit' => 'Invia', 'Submit' => 'Invia',
'Switch identities is disabled.' => 'Il cambio identità è disabilitato', 'Switch identities is disabled.' => 'Il cambio identità è disabilitato',
'Text message' => 'Messaggio di testo tramite SMS',
'Thank you for signing up on {0}' => 'Grazie per esserti registrato su {0}', 'Thank you for signing up on {0}' => 'Grazie per esserti registrato su {0}',
'Thank you, registration is now complete.' => 'Grazie, la tua registrazione è completa.', 'Thank you, registration is now complete.' => 'Grazie, la tua registrazione è completa.',
'The "recaptcha" component must be configured.' => 'Occorre configurare il componente "recaptcha".', 'The "recaptcha" component must be configured.' => 'Occorre configurare il componente "recaptcha".',
@ -208,8 +219,10 @@ return [
'Time zone is not valid' => 'Il fuso orario non è valido', 'Time zone is not valid' => 'Il fuso orario non è valido',
'Two Factor Authentication (2FA)' => 'Autenticazione a due fattori (2FA)', 'Two Factor Authentication (2FA)' => 'Autenticazione a due fattori (2FA)',
'Two factor authentication code' => 'Codice di autenticazione a due fattori', 'Two factor authentication code' => 'Codice di autenticazione a due fattori',
'Two factor authentication code by SMS' => 'Codice di autenticazione a due fattori tramite SMS',
'Two factor authentication code by email' => 'Codice di autenticazione a due fattori tramite email',
'Two factor authentication has been disabled.' => 'Autenticazione a due fattori disabilitata.', 'Two factor authentication has been disabled.' => 'Autenticazione a due fattori disabilitata.',
'Two factor authentication protects you in case of stolen credentials' => 'L\'autenticazione a due fattura ti protegge in caso di furto di credenziali', 'Two factor authentication protects you in case of stolen credentials' => 'L\'autenticazione a due fattori ti protegge in caso di furto di credenziali',
'Two factor authentication successfully enabled.' => 'Autenticazione a due fattori abilitata con successo.', 'Two factor authentication successfully enabled.' => 'Autenticazione a due fattori abilitata con successo.',
'Unable to confirm user. Please, try again.' => 'Impossibile confermare l\'utente, per favore ritenta.', 'Unable to confirm user. Please, try again.' => 'Impossibile confermare l\'utente, per favore ritenta.',
'Unable to create an account.' => 'Impossibile creare l\'account.', 'Unable to create an account.' => 'Impossibile creare l\'account.',
@ -278,5 +291,8 @@ return [
'{0, date, MMM dd, YYYY HH:mm}' => '{0, date, MMM dd, YYYY HH:mm}', '{0, date, MMM dd, YYYY HH:mm}' => '{0, date, MMM dd, YYYY HH:mm}',
'{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}', '{0, date, MMMM dd, YYYY HH:mm}' => '{0, date, dd MMMM YYYY HH:mm}',
'{0} cannot be blank.' => '{0} non può essere vuoto.', '{0} cannot be blank.' => '{0} non può essere vuoto.',
'This is the code to insert to enable two factor authentication' => '',
'An email has been sent with instructions for resetting your password' => '@@È stata inviata un\'email con le istruzioni per azzerare la tua password@@', 'An email has been sent with instructions for resetting your password' => '@@È stata inviata un\'email con le istruzioni per azzerare la tua password@@',
'Now you can resume the login process' => '@@Ora puoi riprendere il processo di autenticazione@@',
'Send new code' => '@@Invia un nuovo codice@@',
]; ];

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -272,9 +272,24 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',

View File

@ -272,9 +272,24 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',

View File

@ -272,9 +272,24 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',

View File

@ -264,12 +264,27 @@ return [
'Class' => '', 'Class' => '',
'Data privacy' => '', 'Data privacy' => '',
'Email' => '', 'Email' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Items' => '', 'Items' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Password' => '', 'Password' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'VKontakte' => '', 'VKontakte' => '',

View File

@ -272,9 +272,24 @@ return [
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '', 'An email with instructions to create a new password has been sent to {email} if it is associated with an {appName} account. Your existing password has not been changed.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Rule class name' => '', 'Rule class name' => '',
'Select rule...' => '', 'Select rule...' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',

View File

@ -275,7 +275,22 @@ return [
'{0} cannot be blank.' => '{0} не может быть пустым.', '{0} cannot be blank.' => '{0} не может быть пустым.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@Сообщение было отправлено на вашу электронную почту@@', 'A message has been sent to your email address. ' => '@@Сообщение было отправлено на вашу электронную почту@@',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -274,8 +274,23 @@ return [
'{0} cannot be blank.' => '{0} не може бути порожнім.', '{0} cannot be blank.' => '{0} не може бути порожнім.',
'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '', 'According to the European General Data Protection Regulation (GDPR) we need your consent to work with your personal data.' => '',
'Data privacy' => '', 'Data privacy' => '',
'Every user having your role has two factor authentication mandatory, you must enable it' => '',
'Google Authenticator' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Recovery message sent' => '', 'Recovery message sent' => '',
'Submit' => '', 'Submit' => '',
'Text message' => '',
'This is the code to insert to enable two factor authentication' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Unfortunately, you can not work with this site without giving us consent to process your data.' => '', 'Unfortunately, you can not work with this site without giving us consent to process your data.' => '',
'Your consent is required to work with this site' => '', 'Your consent is required to work with this site' => '',
'A message has been sent to your email address. ' => '@@На вашу електронну адресу надіслано повідомлення@@', 'A message has been sent to your email address. ' => '@@На вашу електронну адресу надіслано повідомлення@@',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -109,6 +109,7 @@ return [
'Finish' => '', 'Finish' => '',
'Force password change at next login' => '', 'Force password change at next login' => '',
'Forgot password?' => '', 'Forgot password?' => '',
'Google Authenticator' => '',
'Gravatar email' => '', 'Gravatar email' => '',
'Hello' => '', 'Hello' => '',
'Here you can download your personal data in a comma separated values format.' => '', 'Here you can download your personal data in a comma separated values format.' => '',
@ -120,6 +121,10 @@ return [
'In order to complete your request, please click the link below' => '', 'In order to complete your request, please click the link below' => '',
'In order to finish your registration, we need you to enter following fields' => '', 'In order to finish your registration, we need you to enter following fields' => '',
'Information' => '', 'Information' => '',
'Insert' => '',
'Insert the code you received by SMS.' => '',
'Insert the code you received by email.' => '',
'Insert the mobile phone number on which to receive text message.' => '',
'Invalid login or password' => '', 'Invalid login or password' => '',
'Invalid or expired link' => '', 'Invalid or expired link' => '',
'Invalid password' => '', 'Invalid password' => '',
@ -135,6 +140,9 @@ return [
'Login' => '', 'Login' => '',
'Logout' => '', 'Logout' => '',
'Manage users' => '', 'Manage users' => '',
'Mobile phone number' => '',
'Mobile phone number not registered.' => '',
'Mobile phone number successfully enabled.' => '',
'Name' => '', 'Name' => '',
'Networks' => '', 'Networks' => '',
'Never' => '', 'Never' => '',
@ -155,6 +163,8 @@ return [
'Please be certain' => '', 'Please be certain' => '',
'Please click the link below to complete your password reset' => '', 'Please click the link below to complete your password reset' => '',
'Please fix following errors:' => '', 'Please fix following errors:' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please click on \'Cancel\' and repeat the login request.' => '',
'Please, enter the right code. The code is valid for {0} seconds. If you want to get a new code, please close this window and repeat the enabling request.' => '',
'Privacy' => '', 'Privacy' => '',
'Privacy settings' => '', 'Privacy settings' => '',
'Profile' => '', 'Profile' => '',
@ -191,6 +201,7 @@ return [
'Something went wrong' => '', 'Something went wrong' => '',
'Submit' => '', 'Submit' => '',
'Switch identities is disabled.' => '', 'Switch identities is disabled.' => '',
'Text message' => '',
'Thank you for signing up on {0}' => '', 'Thank you for signing up on {0}' => '',
'Thank you, registration is now complete.' => '', 'Thank you, registration is now complete.' => '',
'The "recaptcha" component must be configured.' => '', 'The "recaptcha" component must be configured.' => '',
@ -200,6 +211,7 @@ return [
'There was an error in saving user' => '', 'There was an error in saving user' => '',
'This account has already been connected to another user' => '', 'This account has already been connected to another user' => '',
'This email address has already been taken' => '', 'This email address has already been taken' => '',
'This is the code to insert to enable two factor authentication' => '',
'This username has already been taken' => '', 'This username has already been taken' => '',
'This will disable two factor authentication. Are you sure?' => '', 'This will disable two factor authentication. Are you sure?' => '',
'This will remove your personal data from this site. You will no longer be able to sign in.' => '', 'This will remove your personal data from this site. You will no longer be able to sign in.' => '',
@ -207,6 +219,8 @@ return [
'Time zone is not valid' => '', 'Time zone is not valid' => '',
'Two Factor Authentication (2FA)' => '', 'Two Factor Authentication (2FA)' => '',
'Two factor authentication code' => '', 'Two factor authentication code' => '',
'Two factor authentication code by SMS' => '',
'Two factor authentication code by email' => '',
'Two factor authentication has been disabled.' => '', 'Two factor authentication has been disabled.' => '',
'Two factor authentication protects you in case of stolen credentials' => '', 'Two factor authentication protects you in case of stolen credentials' => '',
'Two factor authentication successfully enabled.' => '', 'Two factor authentication successfully enabled.' => '',

View File

@ -0,0 +1,22 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
/**
* @var String $code
*/
?>
<?= Yii::t('usuario', 'Hello') ?>,
<?= Yii::t('usuario', 'This is the code to insert to enable two factor authentication') ?>.
<?= $code ?>
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>.

View File

@ -0,0 +1,27 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
use yii\helpers\Html;
/**
* @var String $code
* @var \Da\User\Model\Token $token
*/
?>
<p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;">
<?= Yii::t('usuario', 'Hello') ?>,
</p>
<p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;">
<b><?= $code ?></b>
</p>
<p style="font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.6; font-weight: normal; margin: 0 0 10px; padding: 0;">
<?= Yii::t('usuario', 'If you did not make this request you can ignore this email') ?>.
</p>

View File

@ -47,7 +47,6 @@ $this->params['breadcrumbs'][] = $this->title;
'twoFactorAuthenticationCode', 'twoFactorAuthenticationCode',
['inputOptions' => ['autofocus' => 'autofocus', 'class' => 'form-control', 'tabindex' => '1']] ['inputOptions' => ['autofocus' => 'autofocus', 'class' => 'form-control', 'tabindex' => '1']]
) ?> ) ?>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<?= Html::a( <?= Html::a(

View File

@ -86,8 +86,8 @@ $module = Yii::$app->getModule('user');
<div class="modal-body"> <div class="modal-body">
... ...
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"> <button type="button" class="btn btn-default" data-dismiss="modal" onClick='window.location.reload();'>
<?= Yii::t('usuario', 'Close') ?> <?= Yii::t('usuario', 'Close') ?>
</button> </button>
</div> </div>
@ -102,6 +102,21 @@ $module = Yii::$app->getModule('user');
<p> <p>
<?= Yii::t('usuario', 'Two factor authentication protects you in case of stolen credentials') ?>. <?= Yii::t('usuario', 'Two factor authentication protects you in case of stolen credentials') ?>.
</p> </p>
<?php if ($module->enableTwoFactorAuthentication && !$model->getUser()->auth_tf_enabled):
$validators = $module->twoFactorAuthenticationValidators;
foreach( $validators as $name => $validator ) {
$description = $validator[ "description" ];
$checked = $name=='google-authenticator'?'checked':'';
?>
<div class="form-check">
<input class="form-check-input" type="radio" name="2famethod" id="<?= $name?>" value="<?= $name?>" <?= $checked?>>
<label class="form-check-label" for="<?= $name?>">
<?= $description?>
</label>
</div>
<?php
} ;
endif; ?>
<div class="text-right"> <div class="text-right">
<?= Html::a( <?= Html::a(
Yii::t('usuario', 'Disable two factor authentication'), Yii::t('usuario', 'Disable two factor authentication'),
@ -161,34 +176,69 @@ $module = Yii::$app->getModule('user');
// consider overriding this view and include your very own approach // consider overriding this view and include your very own approach
$uri = Url::to(['two-factor', 'id' => $model->getUser()->id]); $uri = Url::to(['two-factor', 'id' => $model->getUser()->id]);
$verify = Url::to(['two-factor-enable', 'id' => $model->getUser()->id]); $verify = Url::to(['two-factor-enable', 'id' => $model->getUser()->id]);
$mobilePhoneRegistration = Url::to(['two-factor-mobile-phone', 'id' => $model->getUser()->id]);
$js = <<<JS $js = <<<JS
$('#tfmodal') var choice = '';
$('#tfmodal')
.on('show.bs.modal', function(){ .on('show.bs.modal', function(){
var element = document.getElementsByName('2famethod');
for(i = 0; i < element.length; i++) {
if(element[i].checked)
choice = element[i].value;
}
if(!$('img#qrCode').length) { if(!$('img#qrCode').length) {
$(this).find('.modal-body').load('{$uri}'); $(this).find('.modal-body').load('{$uri}', {choice: choice});
} else { } else {
$('input#tfcode').val(''); $('input#tfcode').val('');
} }
}); });
$(document) $(document)
.on('click', '.btn-submit-code', function(e) { .on('click', '.btn-submit-code', function(e) {
e.preventDefault(); e.preventDefault();
var btn = $(this); var btn = $(this);
btn.prop('disabled', true); btn.prop('disabled', true);
var choice = '';
var element = document.getElementsByName('2famethod');
for(i = 0; i < element.length; i++) {
if(element[i].checked)
choice = element[i].value;
}
$.getJSON('{$verify}', {code: $('#tfcode').val(), choice: choice}, function(data){
btn.prop('disabled', false);
if(data.success) {
$('#enable_tf_btn, #disable_tf_btn').toggleClass('hide');
$('#tfmessage').removeClass('alert-danger').addClass('alert-success').find('p').text(data.message);
setTimeout(function() { $('#tfmodal').modal('hide'); }, 2000);
window.location.reload();
} else {
$('input#tfcode').val('');
$('#tfmessage').removeClass('alert-info').addClass('alert-danger').find('p').text(data.message);
}
}).fail(function(){ btn.prop('disabled', false); });
})
.on('click', '.btn-submit-mobile-phone', function(e) {
e.preventDefault();
var btn = $(this);
btn.prop('disabled', true);
$.getJSON('{$mobilePhoneRegistration}', {mobilephone: $('#mobilephone').val()}, function(data){
btn.prop('disabled', false);
if(data.success) {
btn.prop('disabled', true);
$('#smssection').toggleClass('hide');
$('#sendnewcode').toggleClass('hide');
$('#tfmessagephone').removeClass('alert-danger').addClass('alert-success').find('p').text(data.message);
} else {
$('input#phonenumber').val('');
$('#tfmessagephone').removeClass('alert-info').addClass('alert-danger').find('p').text(data.message);
}
}).fail(function(){ btn.prop('disabled', false); });
$.getJSON('{$verify}', {code: $('#tfcode').val()}, function(data){ })
btn.prop('disabled', false);
if(data.success) {
$('#enable_tf_btn, #disable_tf_btn').toggleClass('hide');
$('#tfmessage').removeClass('alert-danger').addClass('alert-success').find('p').text(data.message);
setTimeout(function() { $('#tfmodal').modal('hide'); }, 2000);
} else {
$('input#tfcode').val('');
$('#tfmessage').removeClass('alert-info').addClass('alert-danger').find('p').text(data.message);
}
}).fail(function(){ btn.prop('disabled', false); });
});
JS; JS;
$this->registerJs($js); $this->registerJs($js);

View File

@ -0,0 +1,35 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario-app project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
/** @var string $id */
/** @var string $uri */
?>
<div class="alert alert-info" id="tfmessage">
<p>
<?= Yii::t(
'usuario',
'Insert the code you received by email.'
) ?>
</p>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6 text-center">
<div class="input-group">
<input type="text" class="form-control" id="tfcode" placeholder="<?= Yii::t('usuario', 'Two factor authentication code by email') ?>"/>
<span class="input-group-btn">
<button type="button" class="btn btn-primary btn-submit-code">
<?= Yii::t('usuario', 'Enable') ?>
</button>
</span>
</div>
</div>
</div>

View File

@ -0,0 +1,68 @@
<?php
/*
* This file is part of the 2amigos/yii2-usuario-app project.
*
* (c) 2amigOS! <http://2amigos.us/>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
/** @var string $id */
/** @var string $uri */
/** @var string $mobilePhoneRegistration */
?>
<div id="phonenumbersection">
<div class="alert alert-info" id="tfmessagephone">
<p>
<?= Yii::t(
'usuario',
'Insert the mobile phone number on which to receive text message.'
) ?>
</p>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6 text-center">
<div class="input-group">
<input type="text" class="form-control" id="mobilephone" value="<?= $mobilePhone ?>" placeholder="<?= Yii::t('usuario', 'Mobile phone number') ?>"/>
<span class="input-group-btn">
<button type="button" class="btn btn-primary btn-submit-mobile-phone">
<?= Yii::t('usuario', 'Insert') ?>
</button>
</span>
</div>
</div>
</div>
</div>
<div id="smssection" class="hide">
<hr>
<div class="alert alert-info" id="tfmessage">
<p>
<?= Yii::t(
'usuario',
'Insert the code you received by SMS.'
) ?>
</p>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6 text-center">
<div></div>
</div>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6 text-center">
<div class="input-group">
<input type="text" class="form-control" id="tfcode" placeholder="<?= Yii::t('usuario', 'Two factor authentication code by SMS') ?>"/>
<span class="input-group-btn">
<button type="button" class="btn btn-primary btn-submit-code">
<?= Yii::t('usuario', 'Enable') ?>
</button>
</span>
</div>
</div>
</div>
</div>