diff --git a/acl/lang/en b/acl/lang/en index 6dfa3e2a3..e4a017fdf 100644 --- a/acl/lang/en +++ b/acl/lang/en @@ -514,9 +514,18 @@ twofactor_enable=Enroll For Two-Factor Authentication twofactor_header=Two-factor authentication enrollment details twofactor_enrolling=Enrolling for two-factor authentication with provider $1 .. twofactor_failed=.. enrollment failed : $1 -twofactor_done=.. complete. Your ID with this provider is $1. +twofactor_done=.. completed, with ID $1 twofactor_setup=Two-factor authentication has not been enabled on this system yet, but can be turned on using the Webmin Configuration module. twofactor_ebutton=No button clicked! +twofactor_testdesc=Before logging out, you can test your new two-factor authentication setup here by entering a token. If for some reason it doesn't work, turn off two-factor authentication and try setting it up again. +twofactor_testfield=Two-factor token +twofactor_test=Validate Token +twofactor_terr=Failed to test two-factor setup +twofactor_etestuser=Login does not have two-factor enabled! +twofactor_testing=Testing two-factor validation with $1 .. +twofactor_testfailed=.. test failed! Maybe the wrong token was entered, or your authentication app has not been configured correctly? +twofactor_testok=.. test passed! You can now safely login using two-factor authentication. +twofactor_testdis=Disable Two-Factor Now forgot_title=Send Password Reset Link forgot_err=Failed to send password reset link diff --git a/acl/save_twofactor.cgi b/acl/save_twofactor.cgi index 865a83da4..ec0b8cea9 100755 --- a/acl/save_twofactor.cgi +++ b/acl/save_twofactor.cgi @@ -55,7 +55,7 @@ if ($in{'enable'}) { my $mfunc = "webmin::message_twofactor_". $miniserv{'twofactor_provider'}; if (defined(&{\&{$mfunc}})) { - print &{\&{$mfunc}}($user); + print "
".&{\&{$mfunc}}($user); } # Save user @@ -65,6 +65,15 @@ if ($in{'enable'}) { &webmin_log("twofactor", "user", $user->{'name'}, { 'provider' => $user->{'twofactor_provider'}, 'id' => $user->{'twofactor_id'} }); + + # Show a test form, so the user can validate + print &ui_form_start("test_twofactor.cgi"); + print $text{'twofactor_testdesc'},"\n"; + print "$text{'twofactor_testfield'} \n", + &ui_textbox("test", undef, 12),"\n"; + print &ui_hidden("user", $in{'user'}) if ($in{'user'}); + print "
\n";
+ print &ui_form_end([ [ undef, $text{'twofactor_test'} ] ]);
}
&ui_print_footer("", $text{'index_return'});
diff --git a/acl/test_twofactor.cgi b/acl/test_twofactor.cgi
new file mode 100755
index 000000000..55ab3c7d8
--- /dev/null
+++ b/acl/test_twofactor.cgi
@@ -0,0 +1,47 @@
+#!/usr/local/bin/perl
+# Validate a user-supplied two-factor token
+
+use strict;
+use warnings;
+no warnings 'redefine';
+no warnings 'uninitialized';
+require './acl-lib.pl';
+our (%in, %text, %access, $base_remote_user);
+&foreign_require("webmin");
+&error_setup($text{'twofactor_terr'});
+&ReadParse();
+
+# Get the user
+my @users = &list_users();
+my $user;
+if ($in{'user'}) {
+ &can_edit_user($in{'user'}) || &error($text{'edit_euser'});
+ ($user) = grep { $_->{'name'} eq $in{'user'} } @users;
+ }
+else {
+ ($user) = grep { $_->{'name'} eq $base_remote_user } @users;
+ }
+$user || &error($text{'twofactor_euser'});
+$user->{'twofactor_provider'} || &error($text{'twofactor_etestuser'});
+my @provs = &webmin::list_twofactor_providers();
+my ($prov) = grep { $_->[0] eq $user->{'twofactor_provider'} } @provs;
+
+# Call the validation function
+&ui_print_header(undef, $text{'twofactor_title'}, "");
+
+print &text('twofactor_testing', $prov->[1]),"
\n";
+my $func = "webmin::validate_twofactor_".$user->{'twofactor_provider'};
+my $err = &{\&{$func}}($user->{'twofactor_id'}, $in{'test'},
+ $user->{'twofactor_apikey'});
+if ($err) {
+ print &text('twofactor_testfailed', $err),"
\n"; + + print &ui_form_start("save_twofactor.cgi"); + print &ui_hidden("user", $in{'user'}) if ($in{'user'}); + print &ui_form_end([ [ "disable", $text{'twofactor_testdis'} ] ]); + } +else { + print $text{'twofactor_testok'},"
\n"; + } + +&ui_print_footer("", $text{'index_return'});