diff --git a/.editorconfig b/.editorconfig
index 6553d30fd..140440443 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -13,5 +13,5 @@ insert_final_newline = true
indent_style = space
indent_size = 2
-[Makefile]
+[*akefile]
indent_style = tab
diff --git a/.travis.yml b/.travis.yml
index 0ca1e192c..393d00338 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -51,13 +51,13 @@ install:
before_script:
- PHP=$TRAVIS_PHP_VERSION
- - if [[ ! $PHP = hhvm* ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
- # xdebug isn't enable for PHP 7.1
- - if [[ ! $PHP = hhvm* ]]; then phpenv config-rm xdebug.ini || echo "xdebug not available"; fi
+ - echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
+ - phpenv config-rm xdebug.ini || echo "xdebug not available"
- composer self-update --no-progress
script:
- travis_wait bash composer install -o --no-interaction --no-progress --prefer-dist
+
- echo "travis_fold:start:prepare"
- make prepare DB=$DB
- echo "travis_fold:end:prepare"
diff --git a/app/DoctrineMigrations/Version20181202073750.php b/app/DoctrineMigrations/Version20181202073750.php
new file mode 100644
index 000000000..5978291e8
--- /dev/null
+++ b/app/DoctrineMigrations/Version20181202073750.php
@@ -0,0 +1,76 @@
+connection->getDatabasePlatform()->getName()) {
+ case 'sqlite':
+ $this->addSql('DROP INDEX UNIQ_1D63E7E5C05FB297');
+ $this->addSql('DROP INDEX UNIQ_1D63E7E5A0D96FBF');
+ $this->addSql('DROP INDEX UNIQ_1D63E7E592FC23A8');
+ $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('user', true) . ' AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication FROM ' . $this->getTable('user', true) . '');
+ $this->addSql('DROP TABLE ' . $this->getTable('user', true) . '');
+ $this->addSql('CREATE TABLE ' . $this->getTable('user', true) . ' (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, password_requested_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, emailTwoFactor BOOLEAN NOT NULL, salt VARCHAR(255) DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL, roles CLOB NOT NULL --(DC2Type:array)
+ , googleAuthenticatorSecret VARCHAR(255) DEFAULT NULL, backupCodes CLOB DEFAULT NULL --(DC2Type:json_array)
+ )');
+ $this->addSql('INSERT INTO ' . $this->getTable('user', true) . ' (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, emailTwoFactor) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication FROM __temp__' . $this->getTable('user', true) . '');
+ $this->addSql('DROP TABLE __temp__' . $this->getTable('user', true) . '');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON ' . $this->getTable('user', true) . ' (confirmation_token)');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON ' . $this->getTable('user', true) . ' (email_canonical)');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON ' . $this->getTable('user', true) . ' (username_canonical)');
+ break;
+ case 'mysql':
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' ADD googleAuthenticatorSecret VARCHAR(191) DEFAULT NULL');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' CHANGE twoFactorAuthentication emailTwoFactor BOOLEAN NOT NULL');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' DROP trusted');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' ADD backupCodes LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:json_array)\'');
+ break;
+ case 'postgresql':
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' ADD googleAuthenticatorSecret VARCHAR(191) DEFAULT NULL');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' RENAME COLUMN twofactorauthentication TO emailTwoFactor');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' DROP trusted');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' ADD backupCodes TEXT DEFAULT NULL');
+ break;
+ }
+ }
+
+ public function down(Schema $schema): void
+ {
+ switch ($this->connection->getDatabasePlatform()->getName()) {
+ case 'sqlite':
+ $this->addSql('DROP INDEX UNIQ_1D63E7E592FC23A8');
+ $this->addSql('DROP INDEX UNIQ_1D63E7E5A0D96FBF');
+ $this->addSql('DROP INDEX UNIQ_1D63E7E5C05FB297');
+ $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('user', true) . ' AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, emailTwoFactor FROM "' . $this->getTable('user', true) . '"');
+ $this->addSql('DROP TABLE "' . $this->getTable('user', true) . '"');
+ $this->addSql('CREATE TABLE "' . $this->getTable('user', true) . '" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username VARCHAR(180) NOT NULL, username_canonical VARCHAR(180) NOT NULL, email VARCHAR(180) NOT NULL, email_canonical VARCHAR(180) NOT NULL, enabled BOOLEAN NOT NULL, password VARCHAR(255) NOT NULL, last_login DATETIME DEFAULT NULL, password_requested_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, twoFactorAuthentication BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL COLLATE BINARY, confirmation_token VARCHAR(255) DEFAULT NULL COLLATE BINARY, roles CLOB NOT NULL COLLATE BINARY, trusted CLOB DEFAULT NULL COLLATE BINARY)');
+ $this->addSql('INSERT INTO "' . $this->getTable('user', true) . '" (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, emailTwoFactor FROM __temp__' . $this->getTable('user', true) . '');
+ $this->addSql('DROP TABLE __temp__' . $this->getTable('user', true) . '');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON "' . $this->getTable('user', true) . '" (username_canonical)');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON "' . $this->getTable('user', true) . '" (email_canonical)');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON "' . $this->getTable('user', true) . '" (confirmation_token)');
+ break;
+ case 'mysql':
+ $this->addSql('ALTER TABLE `' . $this->getTable('user') . '` DROP googleAuthenticatorSecret');
+ $this->addSql('ALTER TABLE `' . $this->getTable('user') . '` CHANGE emailtwofactor twoFactorAuthentication BOOLEAN NOT NULL');
+ $this->addSql('ALTER TABLE `' . $this->getTable('user') . '` ADD trusted TEXT DEFAULT NULL');
+ $this->addSql('ALTER TABLE `' . $this->getTable('user') . '` DROP backupCodes');
+ break;
+ case 'postgresql':
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' DROP googleAuthenticatorSecret');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' RENAME COLUMN emailTwoFactor TO twofactorauthentication');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' ADD trusted TEXT DEFAULT NULL');
+ $this->addSql('ALTER TABLE ' . $this->getTable('user') . ' DROP backupCodes');
+ break;
+ }
+ }
+}
diff --git a/app/Resources/static/themes/_global/index.js b/app/Resources/static/themes/_global/index.js
index bb3e95b6d..9ad96fc02 100644
--- a/app/Resources/static/themes/_global/index.js
+++ b/app/Resources/static/themes/_global/index.js
@@ -89,4 +89,22 @@ $(document).ready(() => {
}
};
});
+
+ // mimic radio button because emailTwoFactor is a boolean
+ $('#update_user_googleTwoFactor').on('change', () => {
+ $('#update_user_emailTwoFactor').prop('checked', false);
+ });
+
+ $('#update_user_emailTwoFactor').on('change', () => {
+ $('#update_user_googleTwoFactor').prop('checked', false);
+ });
+
+ // same mimic for super admin
+ $('#user_googleTwoFactor').on('change', () => {
+ $('#user_emailTwoFactor').prop('checked', false);
+ });
+
+ $('#user_emailTwoFactor').on('change', () => {
+ $('#user_googleTwoFactor').prop('checked', false);
+ });
});
diff --git a/app/Resources/static/themes/material/index.js b/app/Resources/static/themes/material/index.js
index 057945977..2926cad11 100755
--- a/app/Resources/static/themes/material/index.js
+++ b/app/Resources/static/themes/material/index.js
@@ -50,25 +50,30 @@ $(document).ready(() => {
$('#tag_label').focus();
return false;
});
+
$('#nav-btn-add').on('click', () => {
toggleNav('.nav-panel-add', '#entry_url');
return false;
});
+
const materialAddForm = $('.nav-panel-add');
materialAddForm.on('submit', () => {
materialAddForm.addClass('disabled');
$('input#entry_url', materialAddForm).prop('readonly', true).trigger('blur');
});
+
$('#nav-btn-search').on('click', () => {
toggleNav('.nav-panel-search', '#search_entry_term');
return false;
});
+
$('.close').on('click', (e) => {
$(e.target).parent('.nav-panel-item').hide(100);
$('.nav-panel-actions').show(100);
$('.nav-panels').css('background', 'transparent');
return false;
});
+
$(window).scroll(() => {
const s = $(window).scrollTop();
const d = $(document).height();
diff --git a/app/config/config.yml b/app/config/config.yml
index 4b34af302..2d8f9bf01 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -198,10 +198,17 @@ fos_oauth_server:
refresh_token_lifetime: 1209600
scheb_two_factor:
- trusted_computer:
+ trusted_device:
enabled: true
cookie_name: wllbg_trusted_computer
- cookie_lifetime: 2592000
+ lifetime: 2592000
+
+ backup_codes:
+ enabled: "%twofactor_auth%"
+
+ google:
+ enabled: "%twofactor_auth%"
+ template: WallabagUserBundle:Authentication:form.html.twig
email:
enabled: "%twofactor_auth%"
diff --git a/app/config/routing.yml b/app/config/routing.yml
index 0bd2d1306..a7c0f7e9d 100644
--- a/app/config/routing.yml
+++ b/app/config/routing.yml
@@ -51,3 +51,11 @@ craue_config_settings_modify:
fos_js_routing:
resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"
+
+2fa_login:
+ path: /2fa
+ defaults:
+ _controller: "scheb_two_factor.form_controller:form"
+
+2fa_login_check:
+ path: /2fa_check
diff --git a/app/config/security.yml b/app/config/security.yml
index 96489e268..6a21b4e55 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -56,9 +56,17 @@ security:
path: /logout
target: /
+ two_factor:
+ provider: fos_userbundle
+ auth_form_path: 2fa_login
+ check_path: 2fa_login_check
+
access_control:
- { path: ^/api/(doc|version|info|user), roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
+ # force role for logout otherwise when 2fa enable, you won't be able to logout
+ # https://github.com/scheb/two-factor-bundle/issues/168#issuecomment-430822478
+ - { path: ^/logout, roles: [IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_2FA_IN_PROGRESS] }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /(unread|starred|archive|all).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
@@ -67,5 +75,6 @@ security:
- { path: ^/share, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/settings, roles: ROLE_SUPER_ADMIN }
- { path: ^/annotations, roles: ROLE_USER }
+ - { path: ^/2fa, role: IS_AUTHENTICATED_2FA_IN_PROGRESS }
- { path: ^/users, roles: ROLE_SUPER_ADMIN }
- { path: ^/, roles: ROLE_USER }
diff --git a/composer.json b/composer.json
index 21d71b74a..7678d7b87 100644
--- a/composer.json
+++ b/composer.json
@@ -31,7 +31,7 @@
"issues": "https://github.com/wallabag/wallabag/issues"
},
"require": {
- "php": ">=7.1.0",
+ "php": ">=7.1.3",
"ext-pcre": "*",
"ext-dom": "*",
"ext-curl": "*",
@@ -70,7 +70,7 @@
"friendsofsymfony/user-bundle": "2.0.*",
"friendsofsymfony/oauth-server-bundle": "^1.5",
"stof/doctrine-extensions-bundle": "^1.2",
- "scheb/two-factor-bundle": "^2.14",
+ "scheb/two-factor-bundle": "^3.0",
"grandt/phpepub": "dev-master",
"wallabag/php-mobi": "~1.0",
"kphoen/rulerz-bundle": "~0.13",
@@ -87,7 +87,8 @@
"friendsofsymfony/jsrouting-bundle": "^2.2",
"bdunogier/guzzle-site-authenticator": "^1.0.0",
"defuse/php-encryption": "^2.1",
- "html2text/html2text": "^4.1"
+ "html2text/html2text": "^4.1",
+ "pragmarx/recovery": "^0.1.0"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "~3.0",
@@ -147,7 +148,7 @@
"config": {
"bin-dir": "bin",
"platform": {
- "php": "7.1"
+ "php": "7.1.3"
}
},
"minimum-stability": "dev",
diff --git a/src/Wallabag/CoreBundle/Command/ShowUserCommand.php b/src/Wallabag/CoreBundle/Command/ShowUserCommand.php
index a0184267e..c95efbf3a 100644
--- a/src/Wallabag/CoreBundle/Command/ShowUserCommand.php
+++ b/src/Wallabag/CoreBundle/Command/ShowUserCommand.php
@@ -57,7 +57,8 @@ class ShowUserCommand extends ContainerAwareCommand
sprintf('Display name: %s', $user->getName()),
sprintf('Creation date: %s', $user->getCreatedAt()->format('Y-m-d H:i:s')),
sprintf('Last login: %s', null !== $user->getLastLogin() ? $user->getLastLogin()->format('Y-m-d H:i:s') : 'never'),
- sprintf('2FA activated: %s', $user->isTwoFactorAuthentication() ? 'yes' : 'no'),
+ sprintf('2FA (email) activated: %s', $user->isEmailTwoFactor() ? 'yes' : 'no'),
+ sprintf('2FA (OTP) activated: %s', $user->isGoogleAuthenticatorEnabled() ? 'yes' : 'no'),
]);
}
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php
index be6feb7cd..9257ab18d 100644
--- a/src/Wallabag/CoreBundle/Controller/ConfigController.php
+++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php
@@ -2,6 +2,7 @@
namespace Wallabag\CoreBundle\Controller;
+use PragmaRX\Recovery\Recovery as BackupCodes;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -46,7 +47,7 @@ class ConfigController extends Controller
$activeTheme = $this->get('liip_theme.active_theme');
$activeTheme->setName($config->getTheme());
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.config_saved'
);
@@ -68,7 +69,7 @@ class ConfigController extends Controller
$userManager->updateUser($user, true);
}
- $this->get('session')->getFlashBag()->add('notice', $message);
+ $this->addFlash('notice', $message);
return $this->redirect($this->generateUrl('config') . '#set4');
}
@@ -83,7 +84,7 @@ class ConfigController extends Controller
if ($userForm->isSubmitted() && $userForm->isValid()) {
$userManager->updateUser($user, true);
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.user_updated'
);
@@ -99,7 +100,7 @@ class ConfigController extends Controller
$em->persist($config);
$em->flush();
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.rss_updated'
);
@@ -131,7 +132,7 @@ class ConfigController extends Controller
$em->persist($taggingRule);
$em->flush();
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.tagging_rules_updated'
);
@@ -153,11 +154,123 @@ class ConfigController extends Controller
],
'twofactor_auth' => $this->getParameter('twofactor_auth'),
'wallabag_url' => $this->getParameter('domain_name'),
- 'enabled_users' => $this->get('wallabag_user.user_repository')
- ->getSumEnabledUsers(),
+ 'enabled_users' => $this->get('wallabag_user.user_repository')->getSumEnabledUsers(),
]);
}
+ /**
+ * Enable 2FA using email.
+ *
+ * @Route("/config/otp/email", name="config_otp_email")
+ */
+ public function otpEmailAction()
+ {
+ if (!$this->getParameter('twofactor_auth')) {
+ return $this->createNotFoundException('two_factor not enabled');
+ }
+
+ $user = $this->getUser();
+
+ $user->setGoogleAuthenticatorSecret(null);
+ $user->setBackupCodes(null);
+ $user->setEmailTwoFactor(true);
+
+ $this->container->get('fos_user.user_manager')->updateUser($user, true);
+
+ $this->addFlash(
+ 'notice',
+ 'flashes.config.notice.otp_enabled'
+ );
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
+ /**
+ * Enable 2FA using OTP app, user will need to confirm the generated code from the app.
+ *
+ * @Route("/config/otp/app", name="config_otp_app")
+ */
+ public function otpAppAction()
+ {
+ if (!$this->getParameter('twofactor_auth')) {
+ return $this->createNotFoundException('two_factor not enabled');
+ }
+
+ $user = $this->getUser();
+ $secret = $this->get('scheb_two_factor.security.google_authenticator')->generateSecret();
+
+ $user->setGoogleAuthenticatorSecret($secret);
+ $user->setEmailTwoFactor(false);
+
+ $backupCodes = (new BackupCodes())->toArray();
+ $backupCodesHashed = array_map(
+ function ($backupCode) {
+ return password_hash($backupCode, PASSWORD_DEFAULT);
+ },
+ $backupCodes
+ );
+
+ $user->setBackupCodes($backupCodesHashed);
+
+ $this->container->get('fos_user.user_manager')->updateUser($user, true);
+
+ return $this->render('WallabagCoreBundle:Config:otp_app.html.twig', [
+ 'backupCodes' => $backupCodes,
+ 'qr_code' => $this->get('scheb_two_factor.security.google_authenticator')->getQRContent($user),
+ ]);
+ }
+
+ /**
+ * Cancelling 2FA using OTP app.
+ *
+ * @Route("/config/otp/app/cancel", name="config_otp_app_cancel")
+ */
+ public function otpAppCancelAction()
+ {
+ if (!$this->getParameter('twofactor_auth')) {
+ return $this->createNotFoundException('two_factor not enabled');
+ }
+
+ $user = $this->getUser();
+ $user->setGoogleAuthenticatorSecret(null);
+ $user->setBackupCodes(null);
+
+ $this->container->get('fos_user.user_manager')->updateUser($user, true);
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
+ /**
+ * Validate OTP code.
+ *
+ * @param Request $request
+ *
+ * @Route("/config/otp/app/check", name="config_otp_app_check")
+ */
+ public function otpAppCheckAction(Request $request)
+ {
+ $isValid = $this->get('scheb_two_factor.security.google_authenticator')->checkCode(
+ $this->getUser(),
+ $request->get('_auth_code')
+ );
+
+ if (true === $isValid) {
+ $this->addFlash(
+ 'notice',
+ 'flashes.config.notice.otp_enabled'
+ );
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
+ $this->addFlash(
+ 'two_factor',
+ 'scheb_two_factor.code_invalid'
+ );
+
+ return $this->redirect($this->generateUrl('config_otp_app'));
+ }
+
/**
* @param Request $request
*
@@ -178,7 +291,7 @@ class ConfigController extends Controller
return new JsonResponse(['token' => $config->getRssToken()]);
}
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.rss_token_updated'
);
@@ -203,7 +316,7 @@ class ConfigController extends Controller
$em->remove($rule);
$em->flush();
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.tagging_rules_deleted'
);
@@ -269,7 +382,7 @@ class ConfigController extends Controller
break;
}
- $this->get('session')->getFlashBag()->add(
+ $this->addFlash(
'notice',
'flashes.config.notice.' . $type . '_reset'
);
diff --git a/src/Wallabag/CoreBundle/Form/Type/UserInformationType.php b/src/Wallabag/CoreBundle/Form/Type/UserInformationType.php
index 07c999496..6e4c9154c 100644
--- a/src/Wallabag/CoreBundle/Form/Type/UserInformationType.php
+++ b/src/Wallabag/CoreBundle/Form/Type/UserInformationType.php
@@ -21,9 +21,14 @@ class UserInformationType extends AbstractType
->add('email', EmailType::class, [
'label' => 'config.form_user.email_label',
])
- ->add('twoFactorAuthentication', CheckboxType::class, [
+ ->add('emailTwoFactor', CheckboxType::class, [
'required' => false,
- 'label' => 'config.form_user.twoFactorAuthentication_label',
+ 'label' => 'config.form_user.emailTwoFactor_label',
+ ])
+ ->add('googleTwoFactor', CheckboxType::class, [
+ 'required' => false,
+ 'label' => 'config.form_user.googleTwoFactor_label',
+ 'mapped' => false,
])
->add('save', SubmitType::class, [
'label' => 'config.form.save',
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
index 5a770dffb..454f547de 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
@@ -59,6 +59,7 @@ config:
password: 'Adgangskode'
# rules: 'Tagging rules'
new_user: 'Tilføj bruger'
+ # reset: 'Reset area'
form:
save: 'Gem'
form_settings:
@@ -98,11 +99,19 @@ config:
# all: 'All'
# rss_limit: 'Number of items in the feed'
form_user:
- # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Navn'
email_label: 'Emailadresse'
- # twoFactorAuthentication_label: 'Two factor authentication'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ two_factor:
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
# title: Delete my account (a.k.a danger zone)
# description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +169,15 @@ config:
# and: 'One rule AND another'
# matches: 'Tests that a subject matches a search (case-insensitive).
Example: title matches "football"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
# default_title: 'Title of the entry'
@@ -532,7 +550,8 @@ user:
email_label: 'Emailadresse'
# enabled_label: 'Enabled'
# last_login_label: 'Last login'
- # twofactor_label: Two factor authentication
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
# save: Save
# delete: Delete
# delete_confirm: Are you sure?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index 2ae8f08ec..dc1d4723f 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -59,6 +59,7 @@ config:
password: 'Kennwort'
rules: 'Tagging-Regeln'
new_user: 'Benutzer hinzufügen'
+ reset: 'Zurücksetzen'
form:
save: 'Speichern'
form_settings:
@@ -98,11 +99,19 @@ config:
all: 'Alle'
rss_limit: 'Anzahl der Einträge pro Feed'
form_user:
- two_factor_description: "Wenn du die Zwei-Faktor-Authentifizierung aktivierst, erhältst du eine E-Mail mit einem Code bei jeder nicht vertrauenswürdigen Verbindung"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Name'
email_label: 'E-Mail-Adresse'
- twoFactorAuthentication_label: 'Zwei-Faktor-Authentifizierung'
- help_twoFactorAuthentication: "Wenn du 2FA aktivierst, wirst du bei jedem Login einen Code per E-Mail bekommen."
+ two_factor:
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: 'Lösche mein Konto (a.k.a Gefahrenzone)'
description: 'Wenn du dein Konto löschst, werden ALL deine Artikel, ALL deine Tags, ALL deine Anmerkungen und dein Konto dauerhaft gelöscht (kann NICHT RÜCKGÄNGIG gemacht werden). Du wirst anschließend ausgeloggt.'
@@ -532,7 +541,8 @@ user:
email_label: 'E-Mail-Adresse'
enabled_label: 'Aktiviert'
last_login_label: 'Letzter Login'
- twofactor_label: 'Zwei-Faktor-Authentifizierung'
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: 'Speichern'
delete: 'Löschen'
delete_confirm: 'Bist du sicher?'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index d1d741591..45145c806 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -59,6 +59,7 @@ config:
password: 'Password'
rules: 'Tagging rules'
new_user: 'Add a user'
+ reset: 'Reset area'
form:
save: 'Save'
form_settings:
@@ -98,11 +99,19 @@ config:
all: 'All'
rss_limit: 'Number of items in the feed'
form_user:
- two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connection."
+ two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Name'
email_label: 'Email'
- twoFactorAuthentication_label: 'Two factor authentication'
- help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ two_factor:
+ emailTwoFactor_label: 'Using email (receive a code by email)'
+ googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ table_method: Method
+ table_state: State
+ table_action: Action
+ state_enabled: Enabled
+ state_disabled: Disabled
+ action_email: Use email
+ action_app: Use OTP App
delete:
title: Delete my account (a.k.a danger zone)
description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +169,15 @@ config:
and: 'One rule AND another'
matches: 'Tests that a subject matches a search (case-insensitive).
Example: title matches "football"
'
notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ page_title: Two-factor authentication
+ app:
+ two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ cancel: Cancel
+ enable: Enable
entry:
default_title: 'Title of the entry'
@@ -532,7 +550,8 @@ user:
email_label: 'Email'
enabled_label: 'Enabled'
last_login_label: 'Last login'
- twofactor_label: Two factor authentication
+ twofactor_email_label: Two factor authentication by email
+ twofactor_google_label: Two factor authentication by OTP app
save: Save
delete: Delete
delete_confirm: Are you sure?
@@ -578,6 +597,7 @@ flashes:
tags_reset: Tags reset
entries_reset: Entries reset
archived_reset: Archived entries deleted
+ otp_enabled: Two-factor authentication enabled
entry:
notice:
entry_already_saved: 'Entry already saved on %date%'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
index 741d3e9f3..c1047e55a 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
@@ -59,6 +59,7 @@ config:
password: 'Contraseña'
rules: 'Reglas de etiquetado automáticas'
new_user: 'Añadir un usuario'
+ reset: 'Reiniciar mi cuenta'
form:
save: 'Guardar'
form_settings:
@@ -98,11 +99,19 @@ config:
# all: 'All'
rss_limit: 'Límite de artículos en feed RSS'
form_user:
- two_factor_description: "Con la autenticación en dos pasos recibirá código por e-mail en cada nueva conexión que no sea de confianza."
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nombre'
email_label: 'Dirección de e-mail'
- twoFactorAuthentication_label: 'Autenticación en dos pasos'
- help_twoFactorAuthentication: "Si activas la autenticación en dos pasos, cada vez que quieras iniciar sesión en wallabag recibirás un código por e-mail."
+ two_factor:
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: Eliminar mi cuenta (Zona peligrosa)
description: Si eliminas tu cuenta, TODOS tus artículos, TODAS tus etiquetas, TODAS tus anotaciones y tu cuenta serán eliminadas de forma PERMANENTE (no se puede deshacer). Después serás desconectado.
@@ -160,6 +169,15 @@ config:
and: 'Una regla Y la otra'
matches: 'Prueba si un sujeto corresponde a una búsqueda (insensible a mayusculas).
Ejemplo : title matches "fútbol"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'Título del artículo'
@@ -532,7 +550,8 @@ user:
email_label: 'E-mail'
enabled_label: 'Activado'
last_login_label: 'Último inicio de sesión'
- twofactor_label: Autenticación en dos pasos
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: Guardar
delete: Eliminar
delete_confirm: ¿Estás seguro?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
index 2ef5dd528..3042de2ef 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
@@ -59,6 +59,7 @@ config:
password: 'رمز'
rules: 'برچسبگذاری خودکار'
new_user: 'افزودن کاربر'
+ # reset: 'Reset area'
form:
save: 'ذخیره'
form_settings:
@@ -98,11 +99,19 @@ config:
# all: 'All'
rss_limit: 'محدودیت آر-اس-اس'
form_user:
- two_factor_description: "با فعالکردن تأیید ۲مرحلهای هر بار که اتصال تأییدنشدهای برقرار شد، به شما یک کد از راه ایمیل فرستاده میشود"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'نام'
email_label: 'نشانی ایمیل'
- twoFactorAuthentication_label: 'تأیید ۲مرحلهای'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ two_factor:
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
# title: Delete my account (a.k.a danger zone)
# description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +169,15 @@ config:
# and: 'One rule AND another'
# matches: 'Tests that a subject matches a search (case-insensitive).
Example: title matches "football"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
# default_title: 'Title of the entry'
@@ -532,7 +550,8 @@ user:
email_label: 'نشانی ایمیل'
# enabled_label: 'Enabled'
# last_login_label: 'Last login'
- # twofactor_label: Two factor authentication
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
# save: Save
# delete: Delete
# delete_confirm: Are you sure?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index 7a2029b45..57740ba23 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -59,6 +59,7 @@ config:
password: "Mot de passe"
rules: "Règles de tag automatiques"
new_user: "Créer un compte"
+ reset: "Réinitialisation"
form:
save: "Enregistrer"
form_settings:
@@ -98,11 +99,19 @@ config:
all: "Tous"
rss_limit: "Nombre d’articles dans le flux"
form_user:
- two_factor_description: "Activer l’authentification double-facteur veut dire que vous allez recevoir un code par courriel à chaque nouvelle connexion non approuvée."
+ two_factor_description: "Activer l’authentification double-facteur veut dire que vous allez recevoir un code par courriel OU que vous devriez utiliser une application de mot de passe à usage unique (comme Google Authenticator, Authy or FreeOTP) pour obtenir un code temporaire à chaque nouvelle connexion non approuvée. Vous ne pouvez pas choisir les deux options."
name_label: "Nom"
email_label: "Adresse courriel"
- twoFactorAuthentication_label: "Double authentification"
- help_twoFactorAuthentication: "Si vous activez 2FA, à chaque tentative de connexion à wallabag, vous recevrez un code par email."
+ two_factor:
+ emailTwoFactor_label: 'En utlisant l’email (recevez un code par email)'
+ googleTwoFactor_label: 'En utilisant une application de mot de passe à usage unique (ouvrez l’app, comme Google Authenticator, Authy or FreeOTP, pour obtenir un mot de passe à usage unique)'
+ table_method: Méthode
+ table_state: État
+ table_action: Action
+ state_enabled: Activé
+ state_disabled: Désactivé
+ action_email: Utiliser l'email
+ action_app: Utiliser une app OTP
delete:
title: "Supprimer mon compte (attention danger !)"
description: "Si vous confirmez la suppression de votre compte, TOUS les articles, TOUS les tags, TOUTES les annotations et votre compte seront DÉFINITIVEMENT supprimé (c’est IRRÉVERSIBLE). Vous serez ensuite déconnecté."
@@ -160,6 +169,15 @@ config:
and: "Une règle ET l’autre"
matches: "Teste si un sujet correspond à une recherche (non sensible à la casse).
Exemple : title matches \"football\"
"
notmatches: "Teste si un sujet ne correspond pas à une recherche (non sensible à la casse).
Exemple : title notmatches \"football\"
"
+ otp:
+ page_title: Authentification double-facteur
+ app:
+ two_factor_code_description_1: Vous venez d’activer l’authentification double-facteur, ouvrez votre application OTP pour configurer la génération du mot de passe à usage unique. Ces informations disparaîtront après un rechargement de la page.
+ two_factor_code_description_2: 'Vous pouvez scanner le QR code avec votre application :'
+ two_factor_code_description_3: 'N’oubliez pas de sauvegarder ces codes de secours dans un endroit sûr, vous pourrez les utiliser si vous ne pouvez plus accéder à votre application OTP :'
+ two_factor_code_description_4: 'Testez un code généré par votre application OTP :'
+ cancel: Annuler
+ enable: Activer
entry:
default_title: "Titre de l’article"
@@ -533,6 +551,8 @@ user:
enabled_label: "Activé"
last_login_label: "Dernière connexion"
twofactor_label: "Double authentification"
+ twofactor_email_label: Double authentification par email
+ twofactor_google_label: Double authentification par OTP app
save: "Sauvegarder"
delete: "Supprimer"
delete_confirm: "Êtes-vous sûr ?"
@@ -578,6 +598,7 @@ flashes:
tags_reset: "Tags supprimés"
entries_reset: "Articles supprimés"
archived_reset: "Articles archivés supprimés"
+ otp_enabled: "Authentification à double-facteur activée"
entry:
notice:
entry_already_saved: "Article déjà sauvegardé le %date%"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
index 3a4594455..274e5338a 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
@@ -59,6 +59,7 @@ config:
password: 'Password'
rules: 'Regole di etichettatura'
new_user: 'Aggiungi utente'
+ reset: 'Area di reset'
form:
save: 'Salva'
form_settings:
@@ -98,11 +99,18 @@ config:
# all: 'All'
rss_limit: 'Numero di elementi nel feed'
form_user:
- two_factor_description: "Abilitando l'autenticazione a due fattori riceverai una e-mail con un codice per ogni nuova connesione non verificata"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nome'
email_label: 'E-mail'
- twoFactorAuthentication_label: 'Autenticazione a due fattori'
- help_twoFactorAuthentication: "Se abiliti l'autenticazione a due fattori, ogni volta che vorrai connetterti a wallabag, riceverai un codice via E-mail."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: Cancella il mio account (zona pericolosa)
description: Rimuovendo il tuo account, TUTTI i tuoi articoli, TUTTE le tue etichette, TUTTE le tue annotazioni ed il tuo account verranno rimossi PERMANENTEMENTE (impossibile da ANNULLARE). Verrai poi disconnesso.
@@ -160,6 +168,15 @@ config:
and: "Una regola E un'altra"
matches: 'Verifica che un oggetto risulti in una ricerca (case-insensitive).
Esempio: titolo contiene "football"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: "Titolo del contenuto"
@@ -532,7 +549,8 @@ user:
email_label: 'E-mail'
enabled_label: 'Abilitato'
last_login_label: 'Ultima connessione'
- twofactor_label: Autenticazione a due fattori
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: Salva
delete: Cancella
delete_confirm: Sei sicuro?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
index 9df9e6456..4e5370f98 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
@@ -59,6 +59,7 @@ config:
password: 'Senhal'
rules: "Règlas d'etiquetas automaticas"
new_user: 'Crear un compte'
+ reset: 'Zòna de reïnicializacion'
form:
save: 'Enregistrar'
form_settings:
@@ -98,11 +99,18 @@ config:
all: 'Totes'
rss_limit: "Nombre d'articles dins un flux RSS"
form_user:
- two_factor_description: "Activar l'autentificacion en dos temps vòl dire que recebretz un còdi per corrièl per cada novèla connexion pas aprovada."
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nom'
email_label: 'Adreça de corrièl'
- twoFactorAuthentication_label: 'Dobla autentificacion'
- help_twoFactorAuthentication: "S'avètz activat l'autentificacion en dos temps, cada còp que volètz vos connectar a wallabag, recebretz un còdi per corrièl."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: Suprimir mon compte (Mèfi zòna perilhosa)
description: Se confirmatz la supression de vòstre compte, TOTES vòstres articles, TOTAS vòstras etiquetas, TOTAS vòstras anotacions e vòstre compte seràn suprimits per totjorn. E aquò es IRREVERSIBLE. Puèi seretz desconnectat.
@@ -160,6 +168,15 @@ config:
and: "Una règla E l'autra"
matches: 'Teste se un subjècte correspond a una recèrca (non sensibla a la cassa).
Exemple : title matches \"football\"
'
notmatches: 'Teste se subjècte correspond pas a una recèrca (sensibla a la cassa).
Example : title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: "Títol de l'article"
@@ -532,7 +549,8 @@ user:
email_label: 'Adreça de corrièl'
enabled_label: 'Actiu'
last_login_label: 'Darrièra connexion'
- twofactor_label: 'Autentificacion doble-factor'
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: 'Enregistrar'
delete: 'Suprimir'
delete_confirm: 'Sètz segur ?'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index 684c40e28..a7a4d6c39 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -59,6 +59,7 @@ config:
password: 'Hasło'
rules: 'Zasady tagowania'
new_user: 'Dodaj użytkownika'
+ reset: 'Reset'
form:
save: 'Zapisz'
form_settings:
@@ -98,11 +99,18 @@ config:
all: 'Wszystkie'
rss_limit: 'Link do RSS'
form_user:
- two_factor_description: "Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanym połączeniu"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nazwa'
email_label: 'Adres email'
- twoFactorAuthentication_label: 'Autoryzacja dwuetapowa'
- help_twoFactorAuthentication: "Jeżeli włączysz autoryzację dwuetapową. Za każdym razem, kiedy będziesz chciał się zalogować, dostaniesz kod na swój e-mail."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: Usuń moje konto (niebezpieczna strefa !)
description: Jeżeli usuniesz swoje konto, wszystkie twoje artykuły, tagi, adnotacje, oraz konto zostaną trwale usunięte (operacja jest NIEODWRACALNA). Następnie zostaniesz wylogowany.
@@ -160,6 +168,15 @@ config:
and: 'Jedna reguła I inna'
matches: 'Sprawdź czy temat pasuje szukaj (duże lub małe litery).
Przykład: tytuł zawiera "piłka nożna"
'
notmatches: 'Sprawdź czy temat nie zawiera szukaj (duże lub małe litery).
Przykład: tytuł nie zawiera "piłka nożna"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'Tytuł wpisu'
@@ -532,7 +549,8 @@ user:
email_label: 'Adres email'
enabled_label: 'Włączony'
last_login_label: 'Ostatnie logowanie'
- twofactor_label: Autoryzacja dwuetapowa
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: Zapisz
delete: Usuń
delete_confirm: Jesteś pewien?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
index 7932d7ab0..a5483a6d3 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
@@ -59,6 +59,7 @@ config:
password: 'Senha'
rules: 'Regras de tags'
new_user: 'Adicionar um usuário'
+ # reset: 'Reset area'
form:
save: 'Salvar'
form_settings:
@@ -98,11 +99,18 @@ config:
# all: 'All'
rss_limit: 'Número de itens no feed'
form_user:
- two_factor_description: 'Habilitar autenticação de dois passos significa que você receberá um e-mail com um código a cada nova conexão desconhecida.'
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nome'
email_label: 'E-mail'
- twoFactorAuthentication_label: 'Autenticação de dois passos'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
# title: Delete my account (a.k.a danger zone)
# description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +168,15 @@ config:
and: 'Uma regra E outra'
matches: 'Testa que um assunto corresponde a uma pesquisa (maiúscula ou minúscula).
Exemplo: título corresponde a "futebol"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'Título da entrada'
@@ -532,7 +549,8 @@ user:
email_label: 'E-mail'
enabled_label: 'Habilitado'
last_login_label: 'Último login'
- twofactor_label: 'Autenticação de dois passos'
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: 'Salvar'
delete: 'Apagar'
delete_confirm: 'Tem certeza?'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
index 4d091f031..3b7fbd691 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
@@ -59,6 +59,7 @@ config:
password: 'Parolă'
# rules: 'Tagging rules'
new_user: 'Crează un utilizator'
+ # reset: 'Reset area'
form:
save: 'Salvează'
form_settings:
@@ -98,11 +99,18 @@ config:
# all: 'All'
rss_limit: 'Limită RSS'
form_user:
- # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Nume'
email_label: 'E-mail'
- # twoFactorAuthentication_label: 'Two factor authentication'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
# title: Delete my account (a.k.a danger zone)
# description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +168,15 @@ config:
# and: 'One rule AND another'
# matches: 'Tests that a subject matches a search (case-insensitive).
Example: title matches "football"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
# default_title: 'Title of the entry'
@@ -532,7 +549,8 @@ user:
email_label: 'E-mail'
# enabled_label: 'Enabled'
# last_login_label: 'Last login'
- # twofactor_label: Two factor authentication
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
# save: Save
# delete: Delete
# delete_confirm: Are you sure?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
index cc327ae48..927466314 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
@@ -58,6 +58,7 @@ config:
password: 'Пароль'
rules: 'Правила настройки простановки тегов'
new_user: 'Добавить пользователя'
+ reset: 'Сброс данных'
form:
save: 'Сохранить'
form_settings:
@@ -95,11 +96,18 @@ config:
archive: 'архивные'
rss_limit: 'Количество записей в фиде'
form_user:
- two_factor_description: "Включить двухфакторную аутентификацию, Вы получите сообщение на указанный email с кодом, при каждом новом непроверенном подключении."
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'Имя'
email_label: 'Email'
- twoFactorAuthentication_label: 'Двухфакторная аутентификация'
- help_twoFactorAuthentication: "Если Вы включите двухфакторную аутентификацию, то Вы будете получать код на указанный ранее email, каждый раз при входе в wallabag."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: "Удалить мой аккаунт (или опасная зона)"
description: "Если Вы удалите ваш аккаунт, ВСЕ ваши записи, теги и другие данные, будут БЕЗВОЗВРАТНО удалены (операция не может быть отменена после). Затем Вы выйдете из системы."
@@ -155,6 +163,15 @@ config:
or: 'Одно правило ИЛИ другое'
and: 'Одно правило И другое'
matches: 'Тесты, в которых тема соответствует поиску (без учета регистра). Пример: title matches "футбол"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'Название записи'
@@ -520,7 +537,8 @@ user:
email_label: 'Email'
enabled_label: 'Включить'
last_login_label: 'Последний вход'
- twofactor_label: "Двухфакторная аутентификация"
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: "Сохранить"
delete: "Удалить"
delete_confirm: "Вы уверены?"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
index 148aa5411..1fe4fa0ea 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
@@ -59,6 +59,7 @@ config:
password: 'รหัสผ่าน'
rules: 'การแท็กข้อบังคับ'
new_user: 'เพิ่มผู้ใช้'
+ reset: 'รีเซ็ตพื้นที่ '
form:
save: 'บันทึก'
form_settings:
@@ -98,11 +99,18 @@ config:
all: 'ทั้งหมด'
rss_limit: 'จำนวนไอเทมที่เก็บ'
form_user:
- two_factor_description: "การเปิดใช้งาน two factor authentication คือคุณจะต้องได้รับอีเมลกับ code ที่ยังไม่ตรวจสอบในการเชื่อมต่อ"
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'ชื่อ'
email_label: 'อีเมล'
- twoFactorAuthentication_label: 'Two factor authentication'
- help_twoFactorAuthentication: "ถ้าคุณเปิด 2FA, ในแต่ละช่วงเวลาที่คุณต้องการลงชื่อเข้าใช wallabag, คุณจะต้องได้รับ code จากอีเมล"
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
title: ลบบัญชีของฉัน (โซนที่เป็นภัย!)
description: ถ้าคุณลบบัญชีของคุณIf , รายการทั้งหมดของคุณ, แท็กทั้งหมดของคุณ, หมายเหตุทั้งหมดของคุณและบัญชีของคุณจะถูกลบอย่างถาวร (มันไม่สามารถยกเลิกได้) คุณจะต้องลงชื่อออก
@@ -160,6 +168,15 @@ config:
and: 'หนึ่งข้อบังคับและอื่นๆ'
matches: 'ทดสอบว่า เรื่อง นี้ตรงกับ การต้นหา (กรณีไม่ทราบ).
ตัวอย่าง: หัวข้อที่ตรงกับ "football"
'
notmatches: 'ทดสอบว่า เรื่อง นี้ไม่ตรงกับ การต้นหา (กรณีไม่ทราบ).
ตัวอย่าง: หัวข้อทีไม่ตรงกับ "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'หัวข้อรายการ'
@@ -530,7 +547,8 @@ user:
email_label: 'อีเมล'
enabled_label: 'เปิดใช้งาน'
last_login_label: 'ลงชื้อเข้าใช้ครั้งสุดท้าย'
- twofactor_label: Two factor authentication
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
save: บันทึก
delete: ลบ
delete_confirm: ตุณแน่ใจหรือไม่?
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
index 6fb9852a3..3b8a0d599 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
@@ -59,6 +59,7 @@ config:
password: 'Şifre'
rules: 'Etiketleme kuralları'
new_user: 'Bir kullanıcı ekle'
+ # reset: 'Reset area'
form:
save: 'Kaydet'
form_settings:
@@ -98,11 +99,18 @@ config:
# all: 'All'
rss_limit: 'RSS içeriğinden talep edilecek makale limiti'
form_user:
- two_factor_description: "İki adımlı doğrulamayı aktifleştirdiğinizde, her yeni güvenilmeyen bağlantılarda size e-posta ile bir kod alacaksınız."
+ # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code OR need to use an OTP app (like Google Authenticator, Authy or FreeOTP) to get a one time code on every new untrusted connection. You can't choose both option."
name_label: 'İsim'
email_label: 'E-posta'
- twoFactorAuthentication_label: 'İki adımlı doğrulama'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ # emailTwoFactor_label: 'Using email (receive a code by email)'
+ # googleTwoFactor_label: 'Using an OTP app (open the app, like Google Authenticator, Authy or FreeOTP, to get a one time code)'
+ # table_method: Method
+ # table_state: State
+ # table_action: Action
+ # state_enabled: Enabled
+ # state_disabled: Disabled
+ # action_email: Use email
+ # action_app: Use OTP App
delete:
# title: Delete my account (a.k.a danger zone)
# description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
@@ -160,6 +168,15 @@ config:
and: 'Bir kural ve diğeri'
# matches: 'Tests that a subject matches a search (case-insensitive).
Example: title matches "football"
'
# notmatches: 'Tests that a subject doesn''t match match a search (case-insensitive).
Example: title notmatches "football"
'
+ otp:
+ # page_title: Two-factor authentication
+ # app:
+ # two_factor_code_description_1: You just enabled the OTP two factor authentication, open your OTP app and use that code to get a one time password. It'll disapear after a page reload.
+ # two_factor_code_description_2: 'You can scan that QR Code with your app:'
+ # two_factor_code_description_3: 'Also, save these backup codes in a safe place, you can use them in case you lose access to your OTP app:'
+ # two_factor_code_description_4: 'Test an OTP code from your configured app:'
+ # cancel: Cancel
+ # enable: Enable
entry:
default_title: 'Makalenin başlığı'
@@ -530,7 +547,8 @@ user:
email_label: 'E-posta'
# enabled_label: 'Enabled'
# last_login_label: 'Last login'
- # twofactor_label: Two factor authentication
+ # twofactor_email_label: Two factor authentication by email
+ # twofactor_google_label: Two factor authentication by OTP app
# save: Save
# delete: Delete
# delete_confirm: Are you sure?
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
index bcc57dace..93f8ddf8a 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
@@ -86,8 +86,7 @@
@@ -169,52 +168,41 @@
+ {{ form_widget(form.user.save) }}
+
{% if twofactor_auth %}
+
{{ 'config.form_user.two_factor.table_method'|trans }} | +{{ 'config.form_user.two_factor.table_state'|trans }} | +{{ 'config.form_user.two_factor.table_action'|trans }} | +
---|---|---|
{{ 'config.form_user.two_factor.emailTwoFactor_label'|trans }} | +{% if app.user.isEmailTwoFactor %}{{ 'config.form_user.two_factor.state_enabled'|trans }}{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %} | +{{ 'config.form_user.two_factor.action_email'|trans }} | +
{{ 'config.form_user.two_factor.googleTwoFactor_label'|trans }} | +{% if app.user.isGoogleTwoFactor %}{{ 'config.form_user.two_factor.state_enabled'|trans }}{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %} | +{{ 'config.form_user.two_factor.action_app'|trans }} | +