]);
}
+ /**
+ * Disable 2FA using email.
+ *
+ * @Route("/config/otp/email/disable", name="disable_otp_email")
+ */
+ public function disableOtpEmailAction()
+ {
+ if (!$this->getParameter('twofactor_auth')) {
+ return $this->createNotFoundException('two_factor not enabled');
+ }
+
+ $user = $this->getUser();
+ $user->setEmailTwoFactor(false);
+
+ $this->container->get('fos_user.user_manager')->updateUser($user, true);
+
+ $this->addFlash(
+ 'notice',
+ 'flashes.config.notice.otp_disabled'
+ );
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
/**
* Enable 2FA using email.
*
return $this->redirect($this->generateUrl('config') . '#set3');
}
+ /**
+ * Disable 2FA using OTP app.
+ *
+ * @Route("/config/otp/app/disable", name="disable_otp_app")
+ */
+ public function disableOtpAppAction()
+ {
+ if (!$this->getParameter('twofactor_auth')) {
+ return $this->createNotFoundException('two_factor not enabled');
+ }
+
+ $user = $this->getUser();
+
+ $user->setGoogleAuthenticatorSecret('');
+ $user->setBackupCodes(null);
+
+ $this->container->get('fos_user.user_manager')->updateUser($user, true);
+
+ $this->addFlash(
+ 'notice',
+ 'flashes.config.notice.otp_disabled'
+ );
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
/**
* Enable 2FA using OTP app, user will need to confirm the generated code from the app.
*
$this->container->get('fos_user.user_manager')->updateUser($user, true);
+ $this->addFlash(
+ 'notice',
+ 'flashes.config.notice.otp_enabled'
+ );
+
return $this->render('WallabagCoreBundle:Config:otp_app.html.twig', [
'backupCodes' => $backupCodes,
'qr_code' => $this->get('scheb_two_factor.security.google_authenticator')->getQRContent($user),
# entries_reset: Entries reset
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: Einträge zurücksetzen
archived_reset: Archiverte Einträge zurücksetzen
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: Entries reset
archived_reset: Archived entries deleted
otp_enabled: Two-factor authentication enabled
+ otp_disabled: Two-factor authentication disabled
tagging_rules_imported: Tagging rules imported
tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: Artículos reiniciados
archived_reset: Artículos archivados borrados
otp_enabled: Autenticación de dos pasos activada
+ # otp_disabled: Two-factor authentication disabled
tagging_rules_imported: Reglas de etiquetado importadas
tagging_rules_not_imported: Un error se ha producico en la importación de las reglas de etiquetado
entry:
# entries_reset: Entries reset
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: "Articles supprimés"
archived_reset: "Articles archivés supprimés"
otp_enabled: "Authentification à double-facteur activée"
+ otp_disabled: "Authentification à double-facteur désactivée"
tagging_rules_imported: Règles bien importées
tagging_rules_not_imported: Impossible d'importer les règles
entry:
entries_reset: Reset articoli
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: 記事がリセットされました
archived_reset: アーカイブ済みの記事がリセットされました
otp_enabled: 2要素認証が有効化されました
+ # otp_disabled: Two-factor authentication disabled
tagging_rules_imported: タグ付けルールがインポートされました
tagging_rules_not_imported: タグ付けルールのインポート中にエラーが発生しました
entry:
entries_reset: Articles levats
archived_reset: Articles archivat suprimits
otp_enabled: Autentificacion en dos temps activada
+ # otp_disabled: Two-factor authentication disabled
tagging_rules_imported: Règlas d’etiquetatge importadas
tagging_rules_not_imported: Error en important las règlas d’etiquetatge
entry:
entries_reset: Zresetuj wpisy
archived_reset: Zarchiwizowane wpisy usunięte
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: Artigos reinicializados
archived_reset: Artigos arquivados apagados
otp_enabled: Autenticação de dois fatores ativada
+ # otp_disabled: Two-factor authentication disabled
tagging_rules_imported: Regras de tags importadas
tagging_rules_not_imported: Erro ao importar regras de tags
entry:
# entries_reset: Entries reset
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: "Записи сброшены"
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: รีเซ็ตรายการ
archived_reset: การลบเอกสารของรายการ
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
# entries_reset: Entries reset
# archived_reset: Archived entries deleted
# otp_enabled: Two-factor authentication enabled
+ # otp_disabled: Two-factor authentication disabled
# tagging_rules_imported: Tagging rules imported
# tagging_rules_not_imported: Error while importing tagging rules
entry:
entries_reset: 项目列表已重置
archived_reset: 所有存档项目已删除
otp_enabled: 两步验证已启用
+ # otp_disabled: Two-factor authentication disabled
tagging_rules_imported: 标签规则已导入
tagging_rules_not_imported: 导入标签规则时发生了错误
entry:
<tr>
<td>{{ 'config.form_user.two_factor.emailTwoFactor_label'|trans }}</td>
<td>{% if app.user.isEmailTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
- <td><a href="{{ path('config_otp_email') }}" class="waves-effect waves-light btn{% if app.user.isEmailTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_email'|trans }}</a></td>
+ <td><a href="{{ path('config_otp_email') }}" class="waves-effect waves-light btn{% if app.user.isEmailTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_email'|trans }}</a> {% if app.user.isEmailTwoFactor %}<a href="{{ path('disable_otp_email') }}" class="waves-effect waves-light btn">Disable</a>{% endif %}</td>
</tr>
<tr>
<td>{{ 'config.form_user.two_factor.googleTwoFactor_label'|trans }}</td>
<td>{% if app.user.isGoogleTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
- <td><a href="{{ path('config_otp_app') }}" class="waves-effect waves-light btn{% if app.user.isGoogleTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_app'|trans }}</a></td>
+ <td><a href="{{ path('config_otp_app') }}" class="waves-effect waves-light btn{% if app.user.isGoogleTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_app'|trans }}</a> {% if app.user.isGoogleTwoFactor %}<a href="{{ path('disable_otp_app') }}" class="waves-effect waves-light btn">Disable</a>{% endif %}</td>
</tr>
</tbody>
</table>
<tr>
<td>{{ 'config.form_user.two_factor.emailTwoFactor_label'|trans }}</td>
<td>{% if app.user.isEmailTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
- <td><a href="{{ path('config_otp_email') }}" class="waves-effect waves-light btn{% if app.user.isEmailTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_email'|trans }}</a></td>
+ <td><a href="{{ path('config_otp_email') }}" class="waves-effect waves-light btn{% if app.user.isEmailTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_email'|trans }}</a> {% if app.user.isEmailTwoFactor %}<a href="{{ path('disable_otp_email') }}" class="waves-effect waves-light btn">Disable</a>{% endif %}</td>
</tr>
<tr>
<td>{{ 'config.form_user.two_factor.googleTwoFactor_label'|trans }}</td>
<td>{% if app.user.isGoogleTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
- <td><a href="{{ path('config_otp_app') }}" class="waves-effect waves-light btn{% if app.user.isGoogleTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_app'|trans }}</a></td>
+ <td><a href="{{ path('config_otp_app') }}" class="waves-effect waves-light btn{% if app.user.isGoogleTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_app'|trans }}</a> {% if app.user.isGoogleTwoFactor %}<a href="{{ path('disable_otp_app') }}" class="waves-effect waves-light btn">Disable</a>{% endif %}</td>
</tr>
</tbody>
</table>
$em->flush();
}
+ public function testUserDisable2faEmail()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $crawler = $client->request('GET', '/config/otp/email/disable');
+
+ $this->assertSame(302, $client->getResponse()->getStatusCode());
+
+ $crawler = $client->followRedirect();
+
+ $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
+ $this->assertContains('flashes.config.notice.otp_disabled', $alert[0]);
+
+ // restore user
+ $em = $this->getEntityManager();
+ $user = $em
+ ->getRepository('WallabagUserBundle:User')
+ ->findOneByUsername('admin');
+
+ $this->assertFalse($user->isEmailTwoFactor());
+ }
+
public function testUserEnable2faGoogle()
{
$this->logInAs('admin');
$this->assertEmpty($user->getBackupCodes());
}
+ public function testUserDisable2faGoogle()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $crawler = $client->request('GET', '/config/otp/app/disable');
+
+ $this->assertSame(302, $client->getResponse()->getStatusCode());
+
+ $crawler = $client->followRedirect();
+
+ $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
+ $this->assertContains('flashes.config.notice.otp_disabled', $alert[0]);
+
+ // restore user
+ $em = $this->getEntityManager();
+ $user = $em
+ ->getRepository('WallabagUserBundle:User')
+ ->findOneByUsername('admin');
+
+ $this->assertEmpty($user->getGoogleAuthenticatorSecret());
+ $this->assertEmpty($user->getBackupCodes());
+ }
+
public function testExportTaggingRule()
{
$this->logInAs('admin');