diff --git a/config/areas/account/drawers.php b/config/areas/account/drawers.php
index db81d6e1a4..1ca6763397 100644
--- a/config/areas/account/drawers.php
+++ b/config/areas/account/drawers.php
@@ -11,6 +11,10 @@
...$drawers['user.security.method.code'],
'pattern' => '(account)/security/method/code',
],
+ 'account.security.challenge.email' => [
+ ...$drawers['user.security.challenge.email'],
+ 'pattern' => '(account)/security/challenge/email',
+ ],
'account.security.challenge.totp' => [
...$drawers['user.security.challenge.totp'],
'pattern' => '(account)/security/challenge/totp',
diff --git a/config/areas/users/drawers.php b/config/areas/users/drawers.php
index 468d8641b1..ff20967b11 100644
--- a/config/areas/users/drawers.php
+++ b/config/areas/users/drawers.php
@@ -2,6 +2,7 @@
use Kirby\Panel\Controller\Drawer\FieldDrawerController;
use Kirby\Panel\Controller\Drawer\SectionDrawerController;
+use Kirby\Panel\Controller\Drawer\UserEmailChallengeDrawerController;
use Kirby\Panel\Controller\Drawer\UserSecurityCodeMethodDrawerController;
use Kirby\Panel\Controller\Drawer\UserSecurityDrawerController;
use Kirby\Panel\Controller\Drawer\UserTotpDrawerController;
@@ -16,6 +17,10 @@
'pattern' => 'users/(:any)/security/method/code',
'action' => UserSecurityCodeMethodDrawerController::class
],
+ 'user.security.challenge.email' => [
+ 'pattern' => 'users/(:any)/security/challenge/email',
+ 'action' => UserEmailChallengeDrawerController::class
+ ],
'user.security.challenge.totp' => [
'pattern' => 'users/(:any)/security/challenge/totp',
'action' => UserTotpDrawerController::class
diff --git a/i18n/translations/en.json b/i18n/translations/en.json
index 3322e22ade..181af0716b 100644
--- a/i18n/translations/en.json
+++ b/i18n/translations/en.json
@@ -552,6 +552,12 @@
"lock.isUnlocked": "Was unlocked by another user",
"login": "Log in",
+ "login.challenge.email.description": "Send a oneātime code to your email address that is used as a second factor when signing into your account.",
+ "login.challenge.email.disable.confirm": "Do you really want to disable codes via email for {user}?",
+ "login.challenge.email.disable.label": "Disable codes via email",
+ "login.challenge.email.empty": "Codes via email not set up yet",
+ "login.challenge.email.enable.label": "Enable codes via email",
+ "login.challenge.email.help": "Enter the code just sent to your email inbox.",
"login.challenge.email.label": "Code via email",
"login.challenge.totp.label": "Authenticator app",
"login.challenges.help": "Two-factor methods can add an additional layer of security by requiring more than just a password to sign in.",
diff --git a/panel/src/components/Drawers/UserEmailChallengeDrawer.vue b/panel/src/components/Drawers/UserEmailChallengeDrawer.vue
new file mode 100644
index 0000000000..51e8677eea
--- /dev/null
+++ b/panel/src/components/Drawers/UserEmailChallengeDrawer.vue
@@ -0,0 +1,168 @@
+
+