Compare commits

..

127 Commits

Author SHA1 Message Date
Ilia Ross
ff4e0ae386 Fix to split lines up
https://github.com/webmin/webmin/pull/2462#pullrequestreview-2797791341
2025-04-28 03:33:52 +03:00
Ilia Ross
19bfe18e0f Add ability to make authentication in two steps 2025-04-28 00:55:59 +03:00
Ilia Ross
b48f6d3406 Fix to drop obsolete code 2025-04-28 00:51:04 +03:00
Jamie Cameron
172c504abb Add check for in-use TLS keys 2025-04-27 11:23:54 -07:00
Jamie Cameron
b92d8d11d6 Make sure atd is running if needed
https://github.com/webmin/webmin/issues/2461
2025-04-27 09:52:43 -07:00
Jamie Cameron
d073280e80 Factor out check for atd init script 2025-04-27 09:44:53 -07:00
Jamie Cameron
ebf1138788 CGI to save TLS keys 2025-04-26 21:50:44 -07:00
Jamie Cameron
3706f7862b Certs can start with BEGIN PUBLIC KEY 2025-04-26 20:25:31 -07:00
Jamie Cameron
9bd96b6448 Rate limit before checking if the user exists 2025-04-26 14:44:37 -07:00
Jamie Cameron
7ff37cd12f Add a delay based on the number of tries 2025-04-26 14:42:18 -07:00
Ilia Ross
55fd013b35 Fix to remove pointless new line that looks bad 2025-04-26 21:40:00 +03:00
Ilia Ross
014f949fdb Fix language when logging 2025-04-26 21:38:04 +03:00
Ilia Ross
cb3bde5374 Fix to set email correctly when resetting password 2025-04-26 21:37:42 +03:00
Jamie Cameron
4fbc57350f Add logging for password resets 2025-04-26 10:04:43 -07:00
Jamie Cameron
924e7e8ff5 Remove useless variable 2025-04-26 08:49:49 -07:00
Jamie Cameron
cb7de4edec Remove duplicate variable 2025-04-26 08:32:28 -07:00
Jamie Cameron
f17be6a383 Always show option to download in the background immediately 2025-04-25 20:11:45 -07:00
Jamie Cameron
bcfb698ac6 Detect case where cache is somehow empty
https://github.com/webmin/webmin/issues/2460
2025-04-25 19:50:25 -07:00
Jamie Cameron
8bd079f52f Merge branch 'master' of github.com:webmin/webmin 2025-04-25 16:51:05 -07:00
Jamie Cameron
cef76798f8 clean/reset environment will preserve variables 2025-04-25 16:50:58 -07:00
Ilia Ross
4f046c1d6d Fix to quote escape labels 2025-04-25 23:58:06 +03:00
Ilia Ross
cc83641c11 Add ability for themes to handle each "forgot_*" page 2025-04-25 20:01:30 +03:00
Ilia Ross
971c526ade Fix to lower the static delay for now 2025-04-25 11:39:27 +03:00
Jamie Cameron
717f0b1100 Work on form to edit a TLS key 2025-04-24 21:39:47 -07:00
Jamie Cameron
6ff0e50e94 Merge branch 'master' of github.com:webmin/webmin 2025-04-24 21:12:13 -07:00
Jamie Cameron
0de1844755 Work on DNS over TLS 2025-04-24 21:07:03 -07:00
Ilia Ross
e55f3bdb74 Add ability for the theme to construct own forgot link 2025-04-25 00:49:39 +03:00
Ilia Ross
25d2edeeaf Add a cooldown period for password reset request rates 2025-04-24 21:06:43 +03:00
Ilia Ross
201d817e9d Fix to preserve ACL even for modules with noacl flag
What matters now is that the module gets removed from ACLs, and the new module config page (that didn't exist before) stops working. So the simplest and best solution is to keep the module visible normally, but skip editable ACLs—since the plugin is meant to be controlled by Virtualmin permissions, and access to its config should always be allowed.

https://github.com/webmin/webmin/pull/2426/files#r1972474077
2025-04-24 11:25:03 +03:00
Ilia Ross
b2626ca9c1 Fix to default to useradmin module even for anon user 2025-04-24 10:24:17 +03:00
Ilia Ross
0553cae4e3 Fix to avoid printing switch theme code unless authed 2025-04-24 10:23:14 +03:00
Jamie Cameron
740368fc0d Use correct password hashing function 2025-04-23 20:58:48 -07:00
Jamie Cameron
7c932d3cb0 No need to create extra variables 2025-04-23 20:56:21 -07:00
Jamie Cameron
b46043de84 Check for the d variable properly 2025-04-23 20:51:59 -07:00
Ilia Ross
69e3844cec Fix critical issues when resetting the password
1. If changing password in `/etc/shadow` clone user correctly
 2. Restart miniserv after changing password in `/etc/shadow`
 3. Use correct hashing format when changing Webmin and Unix password
2025-04-23 15:18:09 +03:00
Ilia Ross
215b1332fc Fix to check if domain hash isn't empty 2025-04-23 14:15:56 +03:00
Jamie Cameron
bb8b926d52 Properly declare $d 2025-04-22 22:01:21 -07:00
Ilia Ross
967d519943 Fix to replace the table with much simpler and better layout 2025-04-22 22:25:38 +03:00
Ilia Ross
c84ef98016 Fix default mode to be login and password 2025-04-22 15:27:34 +03:00
Ilia Ross
fd153b28f3 Add improvements to the UI 2025-04-22 15:26:41 +03:00
Ilia Ross
7a3210849d Fix default system type config option to show label correctly 2025-04-22 13:45:52 +03:00
Ilia Ross
fb8339a3ca Fix to always default to fast mode
https://github.com/webmin/webmin/issues/2458#issuecomment-2818513756
2025-04-22 13:40:54 +03:00
Jamie Cameron
e0b6ae7691 Obsfucate email for display 2025-04-21 22:04:03 -07:00
Jamie Cameron
3f5ae24beb Ask for password twice 2025-04-21 19:56:20 -07:00
Jamie Cameron
8cd74c1c35 Don't show Virtualmin output when resetting a password 2025-04-21 16:55:35 -07:00
Jamie Cameron
e983ded21e Include forgotten password pages in package 2025-04-21 16:51:51 -07:00
Ilia Ross
0037d9a9ca Fix to use fast PRC mode by default 2025-04-21 16:28:38 +03:00
Jamie Cameron
a49b5fc0cb Sure as hell nobody is running BIND 8 anymore 2025-04-20 21:20:12 -07:00
Jamie Cameron
e87fc560c9 Move random flag check into a function 2025-04-20 21:15:49 -07:00
Jamie Cameron
ac21e39a88 Use standard functions for version checks 2025-04-20 20:50:51 -07:00
Jamie Cameron
d070176535 Cleanup and reformat code 2025-04-20 20:35:22 -07:00
Jamie Cameron
4c60aa1865 Include username is email subject 2025-04-20 11:15:17 -07:00
Jamie Cameron
590a3218be Cleanup old forgotten password reset key 2025-04-20 11:14:05 -07:00
Jamie Cameron
cf50dd2431 Start of work on password reset rate limiting 2025-04-20 10:54:39 -07:00
Jamie Cameron
a04646e785 Cannot reset password if you're logged in 2025-04-20 10:30:14 -07:00
Jamie Cameron
5d2debca26 Code cleanups 2025-04-20 10:24:07 -07:00
Jamie Cameron
79e5d72393 Cleanup forgotten password link files older than 1 day 2025-04-20 10:21:25 -07:00
Jamie Cameron
410d240e8b What if WEBMIN_VAR isn't set 2025-04-20 10:18:36 -07:00
Jamie Cameron
c074e150f6 Merge branch 'master' of github.com:webmin/webmin 2025-04-20 10:00:55 -07:00
Jamie Cameron
2916f5b723 Define the forgot password dir in init_config 2025-04-20 10:00:47 -07:00
Jamie Cameron
167e8f2b1f support unix user password changes 2025-04-18 22:01:56 -07:00
Ilia Ross
f71c413b6d Fix to allow proxy links to open as they are if the referrer is trusted 2025-04-19 00:31:42 +03:00
Jamie Cameron
a664809bf4 Implement forgotted password reset for Virtualmin users 2025-04-17 22:11:39 -07:00
Jamie Cameron
d8513dbd9e Fix case where error is not called in a module 2025-04-17 22:08:53 -07:00
Jamie Cameron
268b72917d CGI to un-install PHP versions 2025-04-17 21:52:25 -07:00
Jamie Cameron
4082701c48 Version detection fixes 2025-04-17 21:48:05 -07:00
Jamie Cameron
4018977aeb Code and variable scope cleanups
https://github.com/webmin/webmin/issues/2458
2025-04-17 14:15:50 -07:00
Jamie Cameron
ff0da2ca90 Code cleanups
https://github.com/webmin/webmin/issues/2458
2025-04-17 14:05:40 -07:00
Jamie Cameron
badb5b60f7 Merge branch 'master' of github.com:webmin/webmin 2025-04-17 07:39:22 -07:00
Jamie Cameron
a9652f4c88 Minor version bump 2025-04-17 07:39:12 -07:00
Ilia Ross
2febc12586 Merge pull request #2456 from MacSteini/master
Update de
2025-04-16 15:27:03 +03:00
MacSteini
625fff0c6f Update de 2025-04-16 11:32:22 +01:00
Jamie Cameron
ea973b571b Fix password change for regular webmin users 2025-04-15 21:23:10 -07:00
Jamie Cameron
ba6da02850 Don't show module index link if not in a module 2025-04-15 21:19:59 -07:00
Jamie Cameron
f15b147bd0 No need to check for the same condition twice 2025-04-15 21:16:49 -07:00
Jamie Cameron
4b927ed588 Avoid duplicating the error message 2025-04-15 21:14:06 -07:00
Jamie Cameron
8894ca18cf Merge branch 'master' of github.com:webmin/webmin 2025-04-15 19:05:19 -07:00
Jamie Cameron
d9dbcd9746 More work on forgotten password support 2025-04-14 22:44:55 -07:00
Ilia Ross
00ad7fec7a Fix broken Hungarian translations #2455 2025-04-15 01:04:50 +03:00
Jamie Cameron
f76451975c Fix allow-update check
https://forum.virtualmin.com/t/virtualmin-dns-fails-to-detect-rndc-freeze-is-needed/132653
2025-04-12 21:42:41 -07:00
Jamie Cameron
315664a1e1 Merge branch 'master' of github.com:webmin/webmin 2025-04-12 11:00:36 -07:00
Jamie Cameron
18a4c86e2f Work on forgotten password page 2025-04-12 11:00:30 -07:00
Ilia Ross
f65625047b Fix to convert entities to ASCII before printing to logs 2025-04-12 18:26:26 +03:00
Ilia Ross
8d0f19f64d Fix to simplify error print 2025-04-12 18:25:18 +03:00
Jamie Cameron
a768e731cf Allow anonymous access to the forgotten password CGIs 2025-04-11 22:25:17 -07:00
Jamie Cameron
535accda63 Merge branch 'master' of github.com:webmin/webmin 2025-04-11 22:12:18 -07:00
Jamie Cameron
a6c3cccbac Code cleanups 2025-04-11 22:11:59 -07:00
Ilia Ross
d2d16608dc Fix to filter out potentially dangerous characters
https://github.com/webmin/webmin/issues/1838#issuecomment-2795296531
2025-04-11 14:12:33 +03:00
Ilia Ross
196e3ed6c4 Fix to drop trailing dot to align 2025-04-11 12:43:35 +03:00
Jamie Cameron
acdc65c5d7 Code cleanups 2025-04-10 21:39:48 -07:00
Jamie Cameron
dffdd66fb4 UI to enable forgotten password recovery 2025-04-10 21:37:54 -07:00
Jamie Cameron
f6fc4490db Clean up code and check for existing flag before checking variables 2025-04-10 21:32:52 -07:00
Jamie Cameron
73a882b7a0 Merge branch 'master' of github.com:webmin/webmin 2025-04-10 21:29:30 -07:00
Jamie Cameron
5de2d599a2 Delete webmin module from debian package properly 2025-04-10 21:28:08 -07:00
Ilia Ross
cf2806edac Fix to check if local version of mysqldump supports --set-gtid-purged flag
https://forum.virtualmin.com/t/schedule-backup-database-remote-mysql-error/132874/25?u=ilia
2025-04-10 19:36:01 +03:00
Jamie Cameron
0bf83ea2a8 Merge pull request #2447 from webmin/dev/fix-ssl-scheduled-renewals-for-webmin
Fix to respect option to copy new key and certificate to Webmin
2025-04-09 21:32:41 -07:00
Ilia Ross
544db4b1a9 Merge pull request #2451 from MacSteini/master
Update de
2025-04-09 11:43:28 +03:00
MacSteini
f7e4b57c42 Update de 2025-04-09 09:41:47 +01:00
MacSteini
9e9fc9bc87 Update de 2025-04-09 08:40:45 +01:00
MacSteini
23dff016cd Update de 2025-04-09 08:36:45 +01:00
Jamie Cameron
c191caf04b Add a Webmin user field for email address 2025-04-08 20:58:28 -07:00
Jamie Cameron
05f4b8ff96 log package deletion 2025-04-08 20:19:24 -07:00
Jamie Cameron
f30275b49e Merge branch 'master' of github.com:webmin/webmin 2025-04-08 20:13:05 -07:00
Jamie Cameron
3e1b07f823 Add UI for deleting packages and modules 2025-04-08 20:12:38 -07:00
Jamie Cameron
49990e5949 Merge pull request #2450 from MacSteini/master
Update de
2025-04-08 18:36:35 -07:00
MacSteini
434d46643b Update de 2025-04-09 01:16:04 +01:00
MacSteini
33ed262ff0 Merge branch 'webmin:master' into master 2025-04-09 01:11:14 +01:00
Ilia Ross
0bc1dae232 Fix no use logic 2025-04-08 12:12:07 +03:00
Ilia Ross
2760336b40 Fix to use a different type of double-negation logic
https://github.com/webmin/webmin/pull/2447#discussion_r2030265612
2025-04-07 16:42:48 +03:00
Jamie Cameron
18bd46fe93 Work on support for removing packages 2025-04-06 18:58:58 -07:00
Jamie Cameron
fde1b02880 Factor out function to get domains list 2025-04-06 17:21:16 -07:00
Jamie Cameron
f94dabb88c Add form to install a new PHP package 2025-04-06 12:38:12 -07:00
Jamie Cameron
9e9d674206 Show version used by Virtualmin as well 2025-04-06 11:42:03 -07:00
Jamie Cameron
bd5c0bfa54 No need to show domains column if virtualmin isn't installed 2025-04-06 11:33:49 -07:00
Jamie Cameron
b1fdf42530 Don't set a flag that's already set
https://forum.virtualmin.com/t/schedule-backup-database-remote-mysql-error/132874/10
2025-04-03 21:55:59 -07:00
Ilia Ross
f2cba6af00 Fix to respect option to copy new key and certificate to Webmin
https://forum.virtualmin.com/t/letsencrypt-automatic-certificate-advice/132891/3?u=ilia
2025-04-03 16:51:45 +03:00
Jamie Cameron
e5beb7f022 Merge branch 'master' of github.com:webmin/webmin 2025-04-01 22:25:13 -07:00
Jamie Cameron
99f6638194 Coe style cleaups 2025-04-01 22:25:09 -07:00
Jamie Cameron
aa55e33b7e Work on page to show PHP versions 2025-04-01 22:24:33 -07:00
Ilia Ross
b3f28ee4f7 Fix to use new API for remote QR code generation
https://forum.virtualmin.com/t/two-factor-authenticator-is-missing-google-option/132766/14?u=ilia
2025-04-01 14:49:22 +03:00
MacSteini
2ce1157190 Update de 2025-04-01 10:27:58 +01:00
Ilia Ross
d40dbe391e Update translations 2025-03-31 15:42:27 +03:00
Ilia Ross
0fc1bea55e Update TOTP help page 2025-03-31 15:41:48 +03:00
Ilia Ross
225d113d38 Fix not to switch to remote user in case of admin login 2025-03-30 15:43:46 +03:00
Jamie Cameron
663640d801 Merge pull request #2445 from webmin/dev/fix-listing-mysql-auth-plugins
Fix to dynamically list auth plugins in MySQL/MariaDB
2025-03-29 22:07:05 -05:00
Ilia Ross
8bc5ba7a32 Fix to correctly display hashed passwords in UI 2025-03-29 22:19:44 +02:00
Ilia Ross
a10de5a9dc Fix updating unix_socket plugin in default mode 2025-03-29 21:05:37 +02:00
104 changed files with 1442 additions and 423 deletions

File diff suppressed because one or more lines are too long

View File

@@ -104,6 +104,7 @@ while(my $l = <$fh>) {
[ split(/\s+/, $gconfig{"ownmods_$user[0]"} || "") ];
$user{'logouttime'} = $logout{$user[0]};
$user{'real'} = $gconfig{"realname_$user[0]"};
$user{'email'} = $user[14];
push(@rv, \%user);
}
}
@@ -482,7 +483,8 @@ else {
($user->{'temppass'} || ""),":",
($user->{'twofactor_provider'} || ""),":",
($user->{'twofactor_id'} || ""),":",
($user->{'twofactor_apikey'} || ""),
($user->{'twofactor_apikey'} || ""),":",
($user->{'email'} || ""),
"\n");
&close_tempfile($fh);
&unlock_file($miniserv{'userfile'});
@@ -672,7 +674,8 @@ else {
$user->{'temppass'},":",
$user->{'twofactor_provider'},":",
$user->{'twofactor_id'},":",
$user->{'twofactor_apikey'},
$user->{'twofactor_apikey'},":",
$user->{'email'},
"\n");
}
else {
@@ -1714,7 +1717,7 @@ elsif ($mode == 2) {
}
else {
# Try detecting system default first
if (&foreign_available('useradmin')) {
if (&foreign_installed('useradmin')) {
&foreign_require('useradmin');
return &useradmin::encrypt_password($pass, $salt, 1);
}

View File

@@ -159,6 +159,10 @@ print &ui_table_row($text{'edit_pass'},
print &ui_table_row($text{'edit_real'},
&ui_textbox("real", $user{'real'}, 60));
# Contact email for recovery
print &ui_table_row($text{'edit_email'},
&ui_textbox("email", $user{'email'}, 60));
# Storage type
if ($in{'user'}) {
print &ui_table_row($text{'edit_proto'},
@@ -392,7 +396,6 @@ foreach my $c (sort { $b cmp $a } @cats) {
my @grid = ( );
my $sw = 0;
foreach my $m (@cmlist) {
next if ($m->{'noacl'});
my $md = $m->{'dir'};
my $fromgroup = $memg &&
&indexof($md, @{$memg->{'modules'}}) >= 0;
@@ -405,7 +408,7 @@ foreach my $c (sort { $b cmp $a } @cats) {
elsif ($mcan{$md}) {
my $label;
if ($access{'acl'} && $in{'user'} && !$safe &&
&can_module_acl($m)) {
&can_module_acl($m) && !$m->{'noacl'}) {
# Show link for editing ACL
$label = ui_link("edit_acl.cgi?" .
"mod=" . urlize($m->{'dir'}) .

View File

@@ -280,16 +280,18 @@ print &ui_links_row(\@rowlinks);
}
# user_link(user, cgi, param)
# Return HTML for a link to edit one user
sub user_link
{
my $lck = $_[0]->{'pass'} =~ /^\!/ ? 1 : 0;
my $ro = $_[0]->{'readonly'};
return &ui_checkbox("d", $_[0]->{'name'}, "", 0).
my ($user, $cgi, $param) = @_;
my $lck = $user->{'pass'} =~ /^\!/ ? 1 : 0;
my $ro = $user->{'readonly'};
return &ui_checkbox("d", $user->{'name'}, "", 0).
($lck ? "<i>" : "").
($ro ? "<b>" : "").
ui_link("$_[1]?$_[2]=".&urlize($_[0]->{'name'}),
$_[0]->{'name'}).
($_[0]->{'twofactor_id'} ? "*" : "").
&ui_link("$cgi?$param=".&urlize($user->{'name'}),
$user->{'name'}).
($user->{'twofactor_id'} ? "*" : "").
($ro ? "</b>" : "").
($lck ? "</i>" : "");
}

View File

@@ -36,6 +36,7 @@ edit_rights=Zugriffsrechte für Webmin-Benutzer
edit_user=Benutzername
edit_cloneof=Webmin-Benutzer klonen
edit_real=Echter Name
edit_email=E-Mail-Adresse
edit_group=Mitglied der Gruppe
edit_pass=Passwort
edit_same=Gleich wie Unix
@@ -148,6 +149,7 @@ save_edays=Keine Tage ausgewählt
save_ehours=Fehlende oder ungültige Zeiten
save_ehours2=Startzeit muss vor Endzeit liegen
save_etemp=Die Option, das Passwort beim nächsten Login zu ändern, kann nur verwendet werden, wenn <a href='$1'>Benutzer aufgefordert werden, neue Passwörter einzugeben</a> aktiviert ist
save_eemail=Die E-Mail-Adresse darf das Zeichen ":" nicht enthalten
delete_err=Fehler beim Löschen des Benutzers
delete_eself=Sie können sich nicht selbst löschen

View File

@@ -36,6 +36,7 @@ edit_rights=Webmin user access rights
edit_user=Username
edit_cloneof=Cloning Webmin user
edit_real=Real name
edit_email=Contact email
edit_group=Member of group
edit_pass=Password
edit_same=Same as Unix
@@ -148,6 +149,7 @@ save_edays=No days to allow selected
save_ehours=Missing or invalid times to allow
save_ehours2=Start time to allow must be before end
save_etemp=The option to force a password change at next login cannot be used unless <a href='$1'>prompting users to enter new passwords</a> is enabled
save_eemail=Email address cannot contain the : character
delete_err=Failed to delete user
delete_eself=You cannot delete yourself
@@ -247,6 +249,8 @@ log_sync=Changed unix user synchronization
log_sql=Changed user and group database
log_twofactor=Enrolled user $1 with two-factor provider $2
log_onefactor=Dis-enrolled user $1 for two-factor authentication
log_forgot_send=Sent password reset email for user $1 to $2
log_forgot_reset=Reset password for user $1 with email $2
gedit_ecannot=You are not allowed to edit groups
gedit_title=Edit Webmin Group

View File

@@ -62,6 +62,10 @@ elsif ($action eq 'switch') {
elsif ($action eq 'twofactor') {
return &text('log_twofactor', $object, $p->{'provider'}, $p->{'id'});
}
elsif ($action eq 'forgot') {
return &text('log_forgot_'.$type, &html_escape($p->{'user'}),
&html_escape($p->{'email'}));
}
else {
return $text{'log_'.$action};
}

View File

@@ -225,6 +225,8 @@ $user{'nochange'} = !$access{'nochange'} || !defined($in{'nochange'}) ?
$user{'lastchange'} = $old->{'lastchange'};
$user{'olds'} = $old->{'olds'};
$user{'real'} = $in{'real'} =~ /\S/ ? $in{'real'} : undef;
$in{'email'} =~ /:/ && &error($text{'save_eemail'});
$user{'email'} = $in{'email'};
my $raddr = $ENV{'REMOTE_ADDR'};
my @ips;
if ($access{'ips'}) {

View File

@@ -153,5 +153,18 @@ else {
}
}
# get_init_status()
# If the init module is installed and there is an atd bootup action, return
# its name, current running status and boot status
sub get_init_status
{
return () if (!&foreign_available("init"));
my $init = defined(&get_init_name) ? &get_init_name() : undef;
return () if (!$init);
my $r = &init::status_action($init);
my $atboot = &init::action_status($init);
return ($init, $r, $atboot);
}
1;

View File

@@ -138,34 +138,31 @@ if ($access{'allow'} && $config{'allow_file'}) {
}
# If there is an init script that runs an atd server, show status
if (&foreign_available("init")) {
&foreign_require("init");
my $init = defined(&get_init_name) ? &get_init_name() : undef;
if ($access{'stop'} && $init) {
print &ui_hr();
print &ui_buttons_start();
my ($init, $r, $atboot) = &get_init_status();
if ($access{'stop'} && $init) {
print &ui_hr();
print &ui_buttons_start();
# Running now?
my $r = &init::status_action($init);
if ($r == 1) {
print &ui_buttons_row("stop.cgi", $text{'index_stop'},
$text{'index_stopdesc'});
}
elsif ($r == 0) {
print &ui_buttons_row("start.cgi", $text{'index_start'},
$text{'index_startdesc'});
}
# Start at boot?
my $atboot = &init::action_status($init);
print &ui_buttons_row("bootup.cgi", $text{'index_boot'},
$text{'index_bootdesc'}, undef,
&ui_radio("boot", $atboot == 2 ? 1 : 0,
[ [ 1, $text{'yes'} ],
[ 0, $text{'no'} ] ]));
print &ui_buttons_end();
# Running now?
my $r = &init::status_action($init);
if ($r == 1) {
print &ui_buttons_row("stop.cgi", $text{'index_stop'},
$text{'index_stopdesc'});
}
elsif ($r == 0) {
print &ui_buttons_row("start.cgi", $text{'index_start'},
$text{'index_startdesc'});
}
# Start at boot?
my $atboot = &init::action_status($init);
print &ui_buttons_row("bootup.cgi", $text{'index_boot'},
$text{'index_bootdesc'}, undef,
&ui_radio("boot", $atboot == 2 ? 1 : 0,
[ [ 1, $text{'yes'} ],
[ 0, $text{'no'} ] ]));
print &ui_buttons_end();
}
&ui_print_footer("/", $text{'index'});

View File

@@ -63,16 +63,21 @@ if ($bind_version && $bind_version =~ /^(\d+\.\d+)\./) {
our $dnssec_dlv_zone = "dlv.isc.org.";
our @dnssec_dlv_key = ( 257, 3, 5, '"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URkY62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboMQKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VStTDN0YUuWrBNh"' );
my $rand_flag;
# get_rand_flag()
# Return a flag to read from a randomness source
sub get_rand_flag
{
if ($gconfig{'os_type'} =~ /-linux$/ &&
$config{'force_random'} eq '0' &&
-r "/dev/urandom" &&
$bind_version =~ /^9\./ &&
&compare_version_numbers($bind_version, '<', '9.14.2')) {
&compare_version_numbers($bind_version, 9) >= 0 &&
&compare_version_numbers($bind_version, '9.14.2') < 0) {
# Version: 9.14.2 deprecated the use of -r option
# in favor of using /dev/random [bugs:#5370]
$rand_flag = "-r /dev/urandom";
return "-r /dev/urandom";
}
return "";
}
# have_dnssec_tools_support()
# Returns 1 if dnssec-tools support is available and we meet minimum version
@@ -2481,22 +2486,22 @@ sub list_zone_names
{
# Check if any files have changed, or if the master config has changed, or
# the PID file.
my (%files, %znc);
my ($changed, $filecount, %donefile);
my (%files, %znc, $changed);
my @st = stat($zone_names_cache);
if (@st) {
&read_file_cached_with_stat($zone_names_cache, \%znc);
my $filecount = 0;
foreach my $k (keys %znc) {
if ($k =~ /^file_(.*)$/) {
$filecount++;
$donefile{$1}++;
my @fst = stat($1);
if (!@fst || $fst[9] > $st[9] ||
$znc{'size_'.$1} != $fst[7]) {
$changed = 1;
}
$filecount++;
}
}
$changed = 1 if (!$filecount);
}
else {
$changed = 1;
@@ -2510,7 +2515,7 @@ if ($changed || !$znc{'version'} ||
my $conf = &get_config();
my $gau;
my $opts = &find("options", $conf);
if ($opts && &find("update", $opts->{'members'})) {
if ($opts && &find("allow-update", $opts->{'members'})) {
$gau = 1;
}
my @views = &find("view", $conf);
@@ -2524,7 +2529,7 @@ if ($changed || !$znc{'version'} ||
my $file = &find_value("file", $z->{'members'});
my $up = &find("update-policy", $z->{'members'});
my $au = &find("allow-update", $z->{'members'});
my $dynamic = $up || $au ? 1 : 0;
my $dynamic = $up || $au || $gau ? 1 : 0;
$znc{"zone_".($n++)} = join("\t", $z->{'value'},
$z->{'index'}, $type, $v->{'value'}, $dynamic, $file);
$files{$z->{'file'}}++;
@@ -3156,6 +3161,14 @@ sub supports_check_zone
return $config{'checkzone'} && &has_command($config{'checkzone'});
}
# supports_tls()
# Returns 1 if DNS over TLS is supported
sub supports_tls
{
return 1; # XXX fix me
return &compare_version_numbers($bind_version, 9.17) >= 0 ? 1 : 0;
}
# check_zone_records(&zone-name|&zone)
# Returns a list of errors from checking some zone file, if any
sub check_zone_records
@@ -3372,10 +3385,8 @@ return &has_command($config{'signzone'}) &&
# dnssec-validation directive is not supported, 0 otherwise
sub supports_dnssec_client
{
my ($bind_major, $bind_minor) = split(/\./, $bind_version);
return $bind_major > 9 ? 2 :
$bind_major == 9 ? ($bind_minor >= 4 ? 2 : 1) : 0;
return &compare_version_numbers($bind_version, 9.4) >= 0 ? 2 :
&compare_version_numbers($bind_version, 9) >= 0 ? 1 : 0;
}
# dnssec_size_range(algorithm)
@@ -3441,7 +3452,7 @@ closedir(ZONEDIR);
# Fork a background job to do lots of IO, to generate entropy
my $pid;
if (!$rand_flag) {
if (!&get_rand_flag()) {
$pid = fork();
if (!$pid) {
exec("find / -type f >/dev/null 2>&1");
@@ -3490,7 +3501,7 @@ else {
"cd ".quotemeta($fn)." && ".
"$config{'keygen'} -a ".quotemeta($alg).
" -b ".quotemeta($zonesize).
" -n ZONE $rand_flag $dom 2>&1");
" -n ZONE ".&get_rand_flag()." $dom 2>&1");
if ($?) {
kill('KILL', $pid) if ($pid);
return $out;
@@ -3502,7 +3513,7 @@ else {
"cd ".quotemeta($fn)." && ".
"$config{'keygen'} -a ".quotemeta($alg).
" -b ".quotemeta($size).
" -n ZONE -f KSK $rand_flag $dom 2>&1");
" -n ZONE -f KSK ".&get_rand_flag()." $dom 2>&1");
kill('KILL', $pid) if ($pid);
if ($?) {
return $out;
@@ -3572,7 +3583,7 @@ $zonekey || return "Could not find DNSSEC zone key";
# Fork a background job to do lots of IO, to generate entropy
my $pid;
if (!$rand_flag) {
if (!&get_rand_flag()) {
$pid = fork();
if (!$pid) {
exec("find / -type f >/dev/null 2>&1");
@@ -3589,7 +3600,7 @@ my $alg = $zonekey->{'algorithm'};
my $out = &backquote_logged(
"cd ".quotemeta($dir)." && ".
"$config{'keygen'} -a ".quotemeta($alg)." -b ".quotemeta($zonesize).
" -n ZONE $rand_flag $dom 2>&1");
" -n ZONE ".&get_rand_flag()." $dom 2>&1");
kill('KILL', $pid) if ($pid);
if ($?) {
return "Failed to generate new zone key : $out";
@@ -4527,4 +4538,23 @@ if ($zone) {
return $r;
}
# find_tls_users(&conf, name)
# Find all listen-on or other directives that use a given TLS key name
sub find_tls_users
{
my ($conf, $name) = @_;
my @rv;
my $opts = &find("optons", $conf);
if ($opts) {
my @listen = &find("listen-on", $opts->{'members'});
foreach my $l (@listen) {
my $idx = &indexof("tls", @{$l->{'values'}});
if ($idx >= 0 && $l->{'values'}->[$idx+1] eq $name) {
push(@rv, $l);
}
}
}
return @rv;
}
1;

63
bind8/edit_tls.cgi Normal file
View File

@@ -0,0 +1,63 @@
#!/usr/local/bin/perl
# Show a form to edit or create a TLS key and cert
use strict;
use warnings;
no warnings 'redefine';
no warnings 'uninitialized';
our (%access, %text, %in);
require './bind8-lib.pl';
$access{'defaults'} || &error($text{'tls_ecannot'});
&supports_tls() || &error($text{'tls_esupport'});
&ReadParse();
# Get the TLS config being edited
my $tls;
if (!$in{'new'}) {
my $conf = &get_config();
my @tls = &find("tls", $conf);
($tls) = grep { $_->{'values'}->[0] eq $in{'name'} } @tls;
$tls || &error($text{'tls_egone'});
}
else {
$tls = { 'values' => [],
'members' => [] };
}
my $mems = $tls->{'members'};
&ui_print_header(undef, $in{'new'} ? $text{'tls_title1'}
: $text{'tls_title2'}, "");
print &ui_form_start("save_tls.cgi", "post");
print &ui_hidden("new", $in{'new'});
print &ui_hidden("oldname", $in{'name'});
print &ui_table_start($text{'tls_header'}, undef, 2);
# Name of this key
print &ui_table_row($text{'tls_name'},
&ui_textbox("name", $tls->{'values'}->[0], 30));
# Key file
print &ui_table_row($text{'tls_key'},
&ui_filebox("key", &find_value("key-file", $mems), 60));
# Cert file
print &ui_table_row($text{'tls_cert'},
&ui_filebox("cert", &find_value("cert-file", $mems), 60));
# CA cert file
my $ca = &find_value("ca-file", $mems);
print &ui_table_row($text{'tls_ca'},
&ui_radio("ca_def", $ca ? 0 : 1,
[ [ 1, $text{'tls_ca_def'} ],
[ 0, &ui_filebox("ca", $ca, 60) ] ]));
print &ui_table_end();
print &ui_form_end(
$in{'new'} ? [ [ undef, $text{'create'} ] ]
: [ [ undef, $text{'save'} ],
[ 'delete', $text{'delete'} ] ]
);
&ui_print_footer("list_tls.cgi", $text{'tls_return'});

BIN
bind8/images/tls.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

View File

@@ -118,16 +118,19 @@ if ($access{'defaults'}) {
if ($access{'defaults'}) {
# display global options
print &ui_subheading($text{'index_opts'});
my @olinks = ("conf_servers.cgi", "conf_logging.cgi", "conf_acls.cgi",
"conf_files.cgi", "conf_forwarding.cgi", "conf_net.cgi",
"conf_misc.cgi", "conf_controls.cgi", "conf_keys.cgi",
"conf_zonedef.cgi", "list_slaves.cgi",
$bind_version >= 9 ? ( "conf_rndc.cgi" ) : ( ),
&supports_dnssec_client() ? ( "conf_trusted.cgi" ) : ( ),
((&supports_dnssec()) && (&have_dnssec_tools_support())) ? ( "conf_dnssectools.cgi" ) : ( ),
&supports_dnssec() ? ( "conf_dnssec.cgi" ) : ( ),
&supports_check_conf() ? ( "conf_ncheck.cgi" ) : ( ),
"conf_manual.cgi" );
my @olinks = (
"conf_servers.cgi", "conf_logging.cgi", "conf_acls.cgi",
"conf_files.cgi", "conf_forwarding.cgi", "conf_net.cgi",
"conf_misc.cgi", "conf_controls.cgi", "conf_keys.cgi",
"conf_zonedef.cgi", "list_slaves.cgi", "conf_rndc.cgi",
&supports_dnssec_client() ? ( "conf_trusted.cgi" ) : ( ),
&supports_dnssec() && &have_dnssec_tools_support() ?
( "conf_dnssectools.cgi" ) : ( ),
&supports_dnssec() ? ( "conf_dnssec.cgi" ) : ( ),
&supports_tls() ? ( "list_tls.cgi" ) : ( ),
&supports_check_conf() ? ( "conf_ncheck.cgi" ) : ( ),
"conf_manual.cgi",
);
my @otitles = map { /(conf|list)_(\S+).cgi/; $text{$2."_title"} } @olinks;
my @oicons = map { /^(conf|list)_(\S+).cgi/; "images/$2.gif"; } @olinks;
&icons_table(\@olinks, \@otitles, \@oicons, 6);
@@ -453,7 +456,7 @@ else {
print &ui_links_row(\@crlinks);
}
if ($access{'views'} && $bind_version >= 9) {
if ($access{'views'}) {
# Display list of views
print &ui_hr();
print &ui_subheading($text{'index_views'});

View File

@@ -1349,4 +1349,30 @@ xfer_done=.. from $1 : Completed OK
xfer_count=Test transfer successfully fetched $1 records from at least one nameserver. Actual transfers by BIND should also succeed.
xfer_none=Test transfer appeared to succeed, but didn't actually fetch any records!
tls_title=SSL Keys And Certificates
tls_ecannot=You are not allowed to edit SSL keys and certificates
tls_esupport=SSL keys and certificates are not supported on this system
tls_name=Key name
tls_key=Key file
tls_cert=Certificate file
tls_ca=CA certificate file
tls_ca_def=None required
tls_ecannot=You are not allowed to edit SSL keys and certificates
tls_esupport=DNS over SSL is not supported on this system
tls_none=No SSL keys have been added yet.
tls_add=Add a new SSL key.
tls_desc=The SSL keys and certificates listed on this page can be used to enable DNS over SSL/TLS.
tls_title1=Add SSL Key
tls_title2=Edit SSL Key
tls_egone=SSL key no longer exists!
tls_header=Key and certificate details
tls_cerr=Failed to create SSL key
tls_derr=Failed to delete SSL key
tls_err=Failed to save SSL key
tls_ename=SSL key name can only contain letters, numbers, underscore and dash
tls_ekey=Missing or non-existent SSL key file
tls_ecert=Missing or non-existent SSL certificate file
tls_eca=Missing or non-existent SSL CA certificate file
tls_eusers=SSL certificate is still in use by BIND
__norefs=1

44
bind8/list_tls.cgi Normal file
View File

@@ -0,0 +1,44 @@
#!/usr/local/bin/perl
# Show all registered TLS keys
use strict;
use warnings;
no warnings 'redefine';
no warnings 'uninitialized';
our (%access, %text);
require './bind8-lib.pl';
$access{'defaults'} || &error($text{'tls_ecannot'});
&supports_tls() || &error($text{'tls_esupport'});
my $conf = &get_config();
&ui_print_header(undef, $text{'tls_title'}, "");
print $text{'tls_desc'},"<p>\n";
# Show a table of TLS keys
my @tls = &find("tls", $conf);
my @links = ( &ui_link("edit_tls.cgi?new=1", $text{'tls_add'}) );
if (@tls) {
print &ui_links_row(\@links);
print &ui_columns_start([ $text{'tls_name'},
$text{'tls_key'},
$text{'tls_cert'} ], 100);
foreach my $tls (@tls) {
my $mems = $tls->{'members'};
print &ui_columns_row([
&ui_link("edit_tls.cgi?name=".
&urlize($tls->{'values'}->[0]),
$tls->{'values'}->[0]),
&html_escape(&find_value("key-file", $mems)),
&html_escape(&find_value("cert-file", $mems)),
]);
}
print &ui_columns_end();
}
else {
print "<b>$text{'tls_none'}</b> <p>\n";
}
print &ui_links_row(\@links);
&ui_print_footer("", $text{'index_return'});

90
bind8/save_tls.cgi Normal file
View File

@@ -0,0 +1,90 @@
#!/usr/local/bin/perl
# Create, update or delete a TLS key and cert
use strict;
use warnings;
no warnings 'redefine';
no warnings 'uninitialized';
our (%access, %text, %in, %config);
require './bind8-lib.pl';
$access{'defaults'} || &error($text{'tls_ecannot'});
&supports_tls() || &error($text{'tls_esupport'});
&ReadParse();
&error_setup($in{'new'} ? $text{'tls_cerr'} :
$in{'delete'} ? $text{'tls_derr'} : $text{'tls_err'});
# Get the TLS config being edited
my $parent = &get_config_parent();
my $conf = &get_config();
my @tls = &find("tls", $conf);
my $tls;
if (!$in{'new'}) {
($tls) = grep { $_->{'values'}->[0] eq $in{'oldname'} } @tls;
$tls || &error($text{'tls_egone'});
}
&lock_file(&make_chroot($config{'named_conf'}));
if ($in{'delete'}) {
# Just remove this one TLS key, if unused
my @users = &find_tls_users($conf, $tls->{'values'}->[0]);
@users && &error($text{'tls_eusers'});
&save_directive($parent, [ $tls ], [ ]);
}
else {
# Validate inputs
$in{'name'} =~ /^[a-z0-9\-\_]+$/i || &error($text{'tls_ename'});
-r $in{'key'} || &error($text{'tls_ekey'});
-r $in{'cert'} || &error($text{'tls_ecert'});
if (!$in{'ca_def'}) {
-r $in{'ca'} || &error($text{'tls_eca'});
}
&foreign_require("webmin");
&webmin::validate_key_cert($in{'key'}, $in{'cert'});
if (!$in{'ca_def'}) {
&webmin::validate_key_cert($in{'key'}, $in{'ca'});
}
if ($in{'new'}) {
# Create the TLS object
$tls = { 'name' => 'tls',
'values' => [ $in{'name'} ],
'type' => 1,
'members' => [
{ 'name' => 'key-file',
'values' => [ $in{'key'} ]
},
{ 'name' => 'cert-file',
'values' => [ $in{'cert'} ]
},
]
};
if (!$in{'ca_def'}) {
push(@{$tls->{'members'}},
{ 'name' => 'ca-file',
'values' => [ $in{'ca'} ]
});
}
&save_directive($parent, [ ], [ $tls ]);
}
else {
# Update the existing object
$tls->{'values'}->[0] = $in{'name'};
&save_directive($parent, [ $tls ], [ $tls ]);
&save_directive($tls, "key-file",
[ { 'name' => 'key-file',
'values' => [ $in{'key'} ] } ]);
&save_directive($tls, "cert-file",
[ { 'name' => 'cert-file',
'values' => [ $in{'cert'} ] } ]);
&save_directive($tls, "ca-file", $in{'ca_def'} ? [ ] :
[ { 'name' => 'ca-file',
'values' => [ $in{'ca'} ] } ]);
}
}
&flush_file_lines();
&unlock_file(&make_chroot($config{'named_conf'}));
&webmin_log($in{'new'} ? 'create' : $in{'delete'} ? 'delete' : 'modify',
'tls', $tls->{'values'}->[0]);
&redirect("list_tls.cgi");

View File

@@ -78,17 +78,17 @@ return \%rv;
# or error message
sub run_cluster_job
{
local @rv;
local $func = $_[1];
my ($job, $func) = @_;
my @rv;
# Work out which servers to run on
local @servers = &servers::list_servers_sorted();
local @groups = &servers::list_all_groups(\@servers);
local @run;
foreach $s (split(/\s+/, $_[0]->{'cluster_server'})) {
foreach my $s (split(/\s+/, $job->{'cluster_server'})) {
if ($s =~ /^group_(.*)$/) {
# All members of a group
($group) = grep { $_->{'name'} eq $1 } @groups;
my ($group) = grep { $_->{'name'} eq $1 } @groups;
foreach $m (@{$group->{'members'}}) {
push(@run, grep { $_->{'host'} eq $m && $_->{'user'} }
@servers);
@@ -96,7 +96,7 @@ foreach $s (split(/\s+/, $_[0]->{'cluster_server'})) {
}
elsif ($s eq '*') {
# This server
push(@run, ( { 'desc' => $text{'edit_this'} } ));
push(@run, ( { 'id' => 0, 'desc' => $text{'edit_this'} } ));
}
elsif ($s eq 'ALL') {
# All servers with users
@@ -107,7 +107,10 @@ foreach $s (split(/\s+/, $_[0]->{'cluster_server'})) {
push(@run, grep { $_->{'host'} eq $s } @servers);
}
}
@run = &unique(@run);
# Run once per host
my %done;
@run = grep { !$done{$_->{'id'}}++ } @run;
# Setup error handler for down hosts
sub inst_error
@@ -119,7 +122,7 @@ $inst_error_msg = join("", @_);
# Create a local temp file containing input
local $ltemp = &transname();
open(TEMP, ">$ltemp");
local $inp = $_[0]->{'cluster_input'};
local $inp = $job->{'cluster_input'};
$inp =~ s/\\%/\0/g;
@lines = split(/%/, $inp);
foreach $l (@lines) {
@@ -129,8 +132,8 @@ foreach $l (@lines) {
close(TEMP);
# Run one each one in parallel and display the output
$p = 0;
foreach $s (@run) {
my $p = 0;
foreach my $s (@run) {
local ($rh = "READ$p", $wh = "WRITE$p");
pipe($rh, $wh);
select($wh); $| = 1; select(STDOUT);
@@ -150,16 +153,16 @@ foreach $s (@run) {
local $rtemp = &remote_write($s->{'host'}, $ltemp);
# Run the command and capture output
local $q = quotemeta($_[0]->{'cluster_command'});
local $q = quotemeta($job->{'cluster_command'});
local $rv;
if ($_[0]->{'cluster_user'} eq 'root') {
if ($job->{'cluster_user'} eq 'root') {
$rv = &remote_eval($s->{'host'}, "webmin",
"\$x=&backquote_command('($_[0]->{'cluster_command'}) <$rtemp 2>&1')");
"\$x=&backquote_command('($job->{'cluster_command'}) <$rtemp 2>&1')");
}
else {
$q = quotemeta($q);
$rv = &remote_eval($s->{'host'}, "webmin",
"\$x=&backquote_command(&command_as_user('$_[0]->{'cluster_user'}', 0, '$_[0]->{'cluster_command'}').' <$rtemp 2>&1')");
"\$x=&backquote_command(&command_as_user('$job->{'cluster_user'}', 0, '$job->{'cluster_command'}').' <$rtemp 2>&1')");
}
&remote_eval($s->{'host'}, "webmin", "unlink('$rtemp')");
@@ -177,12 +180,11 @@ foreach $s (@run) {
local $rh = "READ$p";
local $line = <$rh>;
close($rh);
local $rv = &unserialise_variable($line);
if (!$line) {
&$func(0, $s, "Unknown reason");
}
else {
my $rv = &unserialise_variable($line);
&$func($rv->[0], $s, $rv->[1]);
}
$p++;

View File

@@ -23,20 +23,22 @@ $job->{'run'} = [ map { $_->{'host'} } @run ]; # for logging
&ui_print_footer("edit.cgi?id=$in{'id'}", $cron::text{'edit_return'},
"", $text{'index_return'});
# callback(error, &server, message)
# callback(ok, &server, message)
# Called back to print results for each host the job is run on
sub callback
{
local $d = ($_[1]->{'host'} || &get_system_hostname()).
($_[1]->{'desc'} ? " ($_[1]->{'desc'})" : "");
if (!$_[0]) {
my ($ok, $s, $msg) = @_;
my $d = ($s->{'host'} || &get_system_hostname()).
($s->{'desc'} ? " ($s->{'desc'})" : "");
if (!$ok) {
# Failed - show error
print "<b>",&text('exec_failed', $d, $_[2]),"</b><p>\n";
print "<b>",&text('exec_failed', $d, &html_escape($msg)),"</b><p>\n";
}
else {
# Show output if any
print "<b>",&text('exec_success', $d),"</b>\n";
if ($_[2]) {
print "<ul><pre>$_[2]</pre></ul><p>\n";
if ($ok) {
print "<ul><pre>",&html_escape($msg),"</pre></ul><p>\n";
}
else {
print "<br><ul><i>$cron::text{'exec_none'}</i></ul><p>\n";

5
cron/cleanup.pl Executable file
View File

@@ -0,0 +1,5 @@
#!/usr/bin/perl
# Manually run the temp files cleanup function
require './cron-lib.pl';
&cleanup_temp_files();

View File

@@ -1573,41 +1573,58 @@ if ($gconfig{'tempdir'} && !$gconfig{'tempdirdelete'}) {
print STDERR "Temp file clearing is not done for the custom directory $gconfig{'tempdir'}\n";
}
else {
local $tempdir = &transname();
my $tempdir = &transname();
$tempdir =~ s/\/([^\/]+)$//;
if (!$tempdir || $tempdir eq "/") {
$tempdir = "/tmp/.webmin";
}
local $cutoff = time() - $gconfig{'tempdelete_days'}*24*60*60;
opendir(DIR, $tempdir);
my $cutoff = time() - $gconfig{'tempdelete_days'}*24*60*60;
if (opendir(DIR, $tempdir)) {
foreach my $f (readdir(DIR)) {
next if ($f eq "." || $f eq "..");
my @st = lstat("$tempdir/$f");
if ($st[9] < $cutoff) {
&unlink_file("$tempdir/$f");
}
}
closedir(DIR);
}
}
# Delete stale lock files
my $lockdir = $var_directory."/locks";
if (opendir(DIR, $lockdir)) {
foreach my $f (readdir(DIR)) {
next if ($f eq "." || $f eq "..");
local @st = lstat("$tempdir/$f");
if ($st[9] < $cutoff) {
&unlink_file("$tempdir/$f");
next if ($f !~ /^\d+$/);
if (!kill(0, $f)) {
# Process is gone, but never cleaned up!
&unlink_file("$lockdir/$f");
}
}
closedir(DIR);
}
# Delete stale lock files
my $lockdir = $var_directory."/locks";
opendir(DIR, $lockdir);
foreach my $f (readdir(DIR)) {
next if ($f eq "." || $f eq "..");
next if ($f !~ /^\d+$/);
if (!kill(0, $f)) {
# Process is gone, but never cleaned up!
&unlink_file("$lockdir/$f");
}
}
closedir(DIR);
# Cleanup old websockets
foreach (&get_miniserv_websockets_modules()) {
&cleanup_miniserv_websockets(undef, $_);
}
# Delete forgot-password files older than 1 day
if (opendir(DIR, $main::forgot_password_link_dir)) {
my $cutoff = time() - 24*60*60;
foreach my $f (readdir(DIR)) {
next if ($f eq "." || $f eq "..");
next if ($f eq "ratelimit");
my $path = $main::forgot_password_link_dir."/".$f;
my @st = stat($path);
if ($st[9] < $cutoff) {
&unlink_file($path);
}
}
closedir(DIR);
}
}
=head2 list_cron_files()

View File

@@ -1,4 +1,4 @@
index_title=Időzitett futtatások (Cron munkák)
index_title=Időzített futtatások (Cron)
index_user=Felhasználó
index_active=Érvényes?
index_command=Parancs

View File

@@ -1,2 +1,2 @@
longdesc_hu=IdĂľzitett futtatĂĄsok lĂŠtrehozĂĄsa, mĂłdosĂ­tĂĄsa ĂŠs tĂśrlĂŠse
desc_hu=IdĂľzitett futtatĂĄsok (Cron)
longdesc_hu=Időzített futtatások létrehozása, módosítása és törlése
desc_hu=Időzített futtatások (Cron)

View File

@@ -11,6 +11,8 @@ eval {
'func' => 'cleanup_temp_files',
'interval' => 3600 };
&webmincron::create_webmin_cron($cron, $temp_delete_cmd);
&create_wrapper($module_config_directory."/cleanup.pl",
$module_name, "cleanup.pl");
};
if ($@) {
print STDERR "Failed to setup /tmp cleanup cron job : $@\n";

145
forgot.cgi Executable file
View File

@@ -0,0 +1,145 @@
#!/usr/local/bin/perl
# Linked to from the forgotten password email
BEGIN { push(@INC, "."); };
use WebminCore;
$no_acl_check++;
$trust_unknown_referers = 1;
&init_config();
&ReadParse();
&load_theme_library();
&error_setup($text{'forgot_err'});
$gconfig{'forgot_pass'} || &error($text{'forgot_ecannot'});
&theme_forgot_handler($0) if (defined(&theme_forgot_handler));
my $forgot_timeout = 10;
$remote_user && &error($text{'forgot_elogin'});
# Check that the random ID is valid
$in{'id'} =~ /^[a-f0-9]+$/i || &error($text{'forgot_eid'});
my %link;
&read_file("$main::forgot_password_link_dir/$in{'id'}", \%link) ||
&error($text{'forgot_eid2'});
time() - $link{'time'} > 60*$forgot_timeout &&
&error(&text('forgot_etime', $forgot_timeout));
# Get the Webmin user
&foreign_require("acl");
my ($wuser) = grep { $_->{'name'} eq $link{'user'} } &acl::list_users();
$wuser || &error(&text('forgot_euser2',
"<tt>".&html_escape($link{'user'})."</tt>"));
&ui_print_header(undef, $text{'forgot_title'}, "", undef, undef, 1, 1);
if (defined($in{'newpass'})) {
# Validate the password
$in{'newpass'} =~ /\S/ || &error($text{'forgot_enewpass'});
$in{'newpass'} eq $in{'newpass2'} ||
&error($text{'forgot_enewpass2'});
my $perr = &acl::check_password_restrictions(
$wuser->{'name'}, $in{'newpass'});
$perr && &error(&text('forgot_equality', $perr));
# Actually update the password
my $d;
if (&foreign_check("virtual-server")) {
# Is this a Virtualmin domain owner?
&foreign_require("virtual-server");
$d = &virtual_server::get_domain_by("user", $link{'user'},
"parent", "");
$d && $d->{'disabled'} && &error($text{'forgot_edisabled'});
}
if ($d) {
# Update in Virtualmin
print &text('forgot_vdoing',
&virtual_server::show_domain_name($d)),"<br>\n";
&virtual_server::push_all_print();
&virtual_server::set_all_null_print();
foreach my $d (&virtual_server::get_domain_by("user", $link{'user'})) {
&virtual_server::lock_domain($d);
my $oldd = { %$d };
$d->{'pass'} = $in{'newpass'};
$d->{'pass_set'} = 1;
&virtual_server::generate_domain_password_hashes($d, 0);
# Update all features
foreach my $f (&virtual_server::domain_features($d)) {
if ($virtual_server::config{$f} && $d->{$f}) {
my $mfunc = "virtual_server::modify_".$f;
&$mfunc($d, $oldd);
}
}
# Update all plugins
foreach my $f (&virtual_server::list_feature_plugins()) {
if ($d->{$f}) {
&virtual_server::plugin_call(
$f, "feature_modify", $d, $oldd);
}
}
&virtual_server::save_domain($d);
&virtual_server::unlock_domain($d);
}
&virtual_server::run_post_actions();
&virtual_server::pop_all_print();
print $text{'forgot_done'},"<p>\n";
}
elsif ($wuser->{'pass'} eq 'x') {
# Update in Users and Groups
print &text('forgot_udoing',
"<tt>".&html_escape($link{'user'})."</tt>"),"<br>\n";
&foreign_require("useradmin");
my ($user) = grep { $_->{'user'} eq $link{'user'} }
&useradmin::list_users();
$user || &error($text{'forgot_eunix'});
$user->{'pass'} eq $useradmin::config{'lock_string'} &&
&error($text{'forgot_eunixlock'});
my $olduser = { %$user };
$user->{'name'} = $link{'user'};
$user->{'passmode'} = 3;
$user->{'plainpass'} = $in{'newpass'};
$user->{'pass'} = &useradmin::encrypt_password($in{'newpass'},
undef, 1);
&useradmin::modify_user($olduser, $user);
&useradmin::other_modules("useradmin_modify_user", $user,
$olduser);
&reload_miniserv();
print $text{'forgot_done'},"<p>\n";
}
else {
# Update in Webmin
print &text('forgot_wdoing',
"<tt>".&html_escape($link{'user'})."</tt>"),"<br>\n";
$wuser->{'pass'} = &acl::encrypt_password($in{'newpass'});
&acl::modify_user($wuser->{'name'}, $wuser);
&reload_miniserv();
print $text{'forgot_done'},"<p>\n";
}
print &text('forgot_retry', '/'),"<p>\n";
&webmin_log("forgot", "reset", undef,
{ 'user' => $wuser->{'name'},
'email' => $wuser->{'email'} }, "acl");
&unlink_file("$main::forgot_password_link_dir/$in{'id'}");
}
else {
# Show password selection form
print "<center>\n";
print &ui_form_start("forgot.cgi", "post");
print &ui_hidden("id", $in{'id'});
print &ui_table_start(undef, undef, 2);
print &ui_table_row(
&text('forgot_newpass',
"<tt>".&html_escape($link{'user'})."</tt>"),
&ui_password("newpass", undef, 30));
print &ui_table_row(
$text{'forgot_newpass2'},
&ui_password("newpass2", undef, 30));
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'forgot_passok'} ] ]);
print "</center>\n";
}
&ui_print_footer();

27
forgot_form.cgi Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/local/bin/perl
# Display the forgotten password form
BEGIN { push(@INC, "."); };
use WebminCore;
$no_acl_check++;
&init_config();
&ReadParse();
&load_theme_library();
&error_setup($text{'forgot_err'});
$gconfig{'forgot_pass'} || &error($text{'forgot_ecannot'});
&theme_forgot_handler($0) if (defined(&theme_forgot_handler));
$remote_user && &error($text{'forgot_elogin'});
&ui_print_header(undef, $text{'forgot_title'}, "", undef, undef, 1, 1);
print "<center>\n";
print $text{'forgot_desc'},"<p>\n";
print &ui_form_start("forgot_send.cgi", "post");
print "<b>$text{'forgot_user'}</b>\n",
&ui_textbox("forgot", $in{'failed'}, 40),"<br>\n";
print &ui_form_end([ [ undef, $text{'forgot_ok'} ] ]);
print "</center>\n";
&ui_print_footer();

140
forgot_send.cgi Executable file
View File

@@ -0,0 +1,140 @@
#!/usr/local/bin/perl
# Send a forgotten password reset email
BEGIN { push(@INC, "."); };
use WebminCore;
$no_acl_check++;
&init_config();
&ReadParse();
&load_theme_library();
&error_setup($text{'forgot_err'});
$gconfig{'forgot_pass'} || &error($text{'forgot_ecannot'});
&theme_forgot_handler($0) if (defined(&theme_forgot_handler));
$remote_user && &error($text{'forgot_elogin'});
# Lookup the Webmin user
&foreign_require("acl");
my ($wuser) = grep { lc($_->{'name'}) eq lc($in{'forgot'}) } &acl::list_users();
my $email = $wuser ? $wuser->{'email'} : undef;
# Check if the IP or Webmin user is over it's rate limit
&make_dir($main::forgot_password_link_dir, 0700);
my $ratelimit_file = $main::forgot_password_link_dir."/ratelimit";
&lock_file($ratelimit_file);
my %ratelimit;
&read_file($ratelimit_file, \%ratelimit);
my $now = time();
my $rlerr;
my $maxtries = 0;
foreach my $key ($ENV{'REMOTE_ADDR'},
$wuser ? ( $wuser->{'name'} ) : ( ),
$email ? ( $email ) : ( )) {
if (!$ratelimit{$key."_last"} ||
$ratelimit{$key."_last"} < $now-5*60) {
# More than 5 mins since the last try, so reset counter
$ratelimit{$key} = 1;
}
else {
$ratelimit{$key}++;
}
$maxtries = $ratelimit{$key} if ($ratelimit{$key} > $maxtries);
$ratelimit{$key."_last"} = $now;
if ($ratelimit{$key} > 10) {
# More than 10 attempts in the last 5 minutes!
$rlerr = &text('forgot_erate',
"<tt>".&html_escape($key)."</tt>");
last;
}
}
# Clean up old ratelimit entries
my $cutoff = $now - 24*60*60;
my @cleanup;
foreach my $k (keys %ratelimit) {
if ($k =~ /^(.*)_last$/ && $ratelimit{$k} < $cutoff) {
push(@cleanup, $k);
push(@cleanup, $1);
}
}
foreach my $k (@cleanup) {
delete($ratelimit{$k});
}
&write_file($ratelimit_file, \%ratelimit);
&unlock_file($ratelimit_file);
sleep($maxtries);
&error($rlerr) if ($rlerr);
# Make sure the Webmin user exists and is eligible for a reset
$wuser && $wuser->{'email'} || &error($text{'forgot_euser'});
($wuser->{'sync'} || $wuser->{'pass'} eq 'e') && &error($text{'forgot_esync'});
$wuser->{'pass'} eq '*LK*' && &error($text{'forgot_elock'});
# Generate a random ID for this password reset
my %link = ( 'id' => &generate_random_id(),
'remote' => $ENV{'REMOTE_ADDR'},
'time' => $now,
'user' => $wuser->{'name'} );
$link{'id'} || &error($text{'forgot_erandom'});
&write_file("$main::forgot_password_link_dir/$link{'id'}", \%link);
my $baseurl = &get_webmin_email_url();
my $url = $baseurl.'/forgot.cgi?id='.&urlize($link{'id'});
$url = &theme_forgot_url($baseurl, $link{'id'}, $link{'user'})
if (defined(&theme_forgot_url));
&ui_print_header(undef, $text{'forgot_title'}, "", undef, undef, 1, 1);
# Send email with a link to generate the reset form
&foreign_require("mailboxes");
my $msg = &text('forgot_msg', $wuser->{'name'}, $url, $ENV{'REMOTE_HOST'},
$baseurl);
$msg =~ s/\\n/\n/g;
$msg = join("\n", &mailboxes::wrap_lines($msg, 75))."\n";
my $subject = &text('forgot_subject', $wuser->{'name'});
&mailboxes::send_text_mail(&mailboxes::get_from_address(),
$email,
undef,
$subject,
$msg);
# Tell the user
print "<center>\n";
print &text('forgot_sent',
"<tt>".&html_escape(&obsfucate_email($email))."</tt>",
"<tt>".&html_escape($wuser->{'name'})."</tt>"),"\n";
print "</center>\n";
&webmin_log("forgot", "send", undef,
{ 'user' => $wuser->{'name'},
'email' => $email }, "acl");
&ui_print_footer();
# generate_random_id()
# Generate an ID string that can be used for a password reset link
sub generate_random_id
{
if (open(my $RANDOM, "</dev/urandom")) {
my $sid;
my $tmpsid;
if (read($RANDOM, $tmpsid, 16) == 16) {
$sid = lc(unpack('h*',$tmpsid));
}
close($RANDOM);
return $sid;
}
return undef;
}
# obsfucate_email(email)
# Convert an email like foo@bar.com to f**@b**.com
sub obsfucate_email
{
my ($email) = @_;
my ($mailbox, $dom) = split(/\@/, $email);
$mailbox = substr($mailbox, 0, 1) . ("*" x (length($mailbox)-1));
my @doms;
foreach my $d (split(/\./, $dom)) {
push(@doms, substr($d, 0, 1) . ("*" x (length($d)-1)));
}
return $mailbox."\@".join(".", @doms);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

28
lang/de
View File

@@ -144,6 +144,32 @@ session_twofailed=Zwei-Faktor-Authentifizierung fehlgeschlagen: $1
session_logout=Abmeldung erfolgreich. Verwenden Sie das untenstehende Formular, um sich erneut anzumelden.
session_timed_out=Sitzung nach $1 Minuten Inaktivität abgelaufen.
session_save=Login dauerhaft speichern?
session_forgot=Passwort vergessen?
forgot_title=Zurücksetzen eines vergessenen Passworts
forgot_user=Webmin-Benutzer:innenname:
forgot_desc=Wenn Ihr Webmin-Login mit einer Wiederherstellungs-E-Mail-Adresse verknüpft ist, können Sie auf dieser Seite einen Link anfordern, um das Passwort zurückzusetzen.
forgot_ok=Link zum Zurücksetzen des Passworts senden
forgot_ecannot=Die Wiederherstellung vergessener Passwörter ist nicht aktiviert!
forgot_euser=Der Benutzer:innenname existiert entweder nicht oder es ist keine Wiederherstellungs-E-Mail-Adresse konfiguriert.
forgot_msg=Sie erhalten diese E-Mail aufgrund einer Anfrage zur Passwortwiederherstellung im Webmin-System auf $4 von $3 für den Login $1.\n\nWenn Sie das Passwort zurücksetzen möchten, folgen Sie diesem Link:\n$2
forgot_subject=Webmin Passwort-Zurücksetzung
forgot_sent=Ein Link zum Zurücksetzen des Webmin-Passworts für den Login $2 wurde an die Wiederherstellungs-E-Mail-Adresse $1 gesendet.
forgot_erandom=Zufällige ID konnte nicht generiert werden!
forgot_eid=Fehlende oder ungültig aussehende Zurücksetz-ID!
forgot_eid2=Die Zurücksetz-ID ist ungültig!
forgot_etime=Die E-Mail zur Passwort-Zurücksetzung ist älter als $1 Minuten.
forgot_newpass=Geben Sie ein neues Passwort für Webmin-Benutzer:in $1 ein:
forgot_passok=Passwort ändern
forgot_euser2=Webmin-Benutzer:in $1 existiert nicht!
forgot_esync=Das Passwort kann für diese:n Benutzer:in nicht geändert werden
forgot_elock=Das Passwort für diese:n Benutzer:in ist gesperrt
forgot_err=Passwortänderung fehlgeschlagen
forgot_enewpass=Kein neues Passwort eingegeben!
forgot_equality=Die Passwortanforderungen wurden nicht erfüllt: $1
forgot_wdoing=Ändere Passwort für Webmin-Benutzer:in $1 ..
forgot_done=.. Passwortänderung abgeschlossen.
forgot_retry=Sie können sich nun mit Ihrem neuen Passwort <a href='$1'>bei Webmin anmelden</a>.
pam_header=Bei Webmin anmelden
pam_mesg=Sie müssen die untenstehende Frage beantworten, um sich beim Webmin-Server auf $1 anzumelden.
@@ -267,7 +293,7 @@ progress_size2=Herunterladen von $1 ($2) ..
progress_nosize=Herunterladen von $1 ..
progress_datan=Empfangen von $1 ($2 %)
progress_data2n=Empfangen von $1
progress_done=.. Download abgeschlossen.
progress_done=.. Download abgeschlossen
progress_incache=Gefunden $1 im Cache ..
readparse_cdheader=Fehlender Content-Disposition Header

37
lang/en
View File

@@ -144,6 +144,41 @@ session_twofailed=Two-factor authentication failed : $1
session_logout=Logout successful. Use the form below to login again.
session_timed_out=Session timed out after $1 minutes of inactivity.
session_save=Remember login permanently?
session_forgot=Forgot Password?
forgot_title=Reset Forgotten Password
forgot_user=Webmin username:
forgot_desc=If your Webmin login has a recovery email address associated with it, you can use this page to send a link that can be used to reset the password.
forgot_ok=Send Password Reset Link
forgot_ecannot=Forgotten password recovery is not enabled!
forgot_euser=The username either does not exist or does not have a recovery email configured.
forgot_msg=You are receiving this email due to a request for password recovery from the Webmin system at $4 from $3, for the login $1.\n\nIf you would like to proceed with resetting the password, follow this link :\n$2
forgot_subject=Webmin password reset for $1
forgot_sent=A link to reset your Webmin password for login $2 has been sent to the recovery email address $1.
forgot_erandom=Failed to generate random ID!
forgot_eid=Missing or invalid-looking reset ID!
forgot_eid2=Reset ID is not valid!
forgot_etime=Password reset email is more than $1 minutes old.
forgot_newpass=New password for Webmin user $1
forgot_newpass2=New password again
forgot_passok=Change Password
forgot_euser2=Webmin user $1 does not exist!
forgot_esync=The password cannot be changed for this user
forgot_elock=The password for this user is locked
forgot_err=Failed to reset password
forgot_enewpass=No new password entered!
forgot_enewpass2=New passwords do not match!
forgot_equality=Password requirements were not met : $1
forgot_wdoing=Changing password for Webmin user $1 ..
forgot_done=.. password change complete.
forgot_retry=You can now <a href='$1'>login to Webmin</a> using your new password.
forgot_edisabled=The password for a disabled Virtualmin domain cannot be reset
forgot_vdoing=Changing password for Virtualmin domain $1 ..
forgot_udoing=Changing password for Unix user $1 ..
forgot_eunix=Unix user does not exist!
forgot_eunixlock=User user's password is locked!
forgot_elogin=Forgotted password pages cannot be used when you are already logged in to Webmin!
forgot_erate=Too many password reset attempts for $1! Please try again later.
pam_header=Login to Webmin
pam_mesg=You must respond to the question below to login to Webmin server on $1.
@@ -267,7 +302,7 @@ progress_size2=Downloading $1 ($2) ..
progress_nosize=Downloading $1 ..
progress_datan=Received $1 ($2 %)
progress_data2n=Received $1
progress_done=.. download complete.
progress_done=.. download complete
progress_incache=Found $1 in cache ..
readparse_cdheader=Missing Content-Disposition header

View File

@@ -9,7 +9,7 @@ use WebminCore;
&init_config();
&ReadParse();
&switch_to_remote_user();
&webmin_user_is_admin() or &switch_to_remote_user();
do "./xhr-lib.pl";
xhr();

View File

@@ -60,7 +60,8 @@ $vers || usage();
"webmin-search-lib.pl", "WebminCore.pm",
"record-login.pl", "record-logout.pl", "record-failed.pl",
"robots.txt", "unauthenticated", "bin", "html-editor-lib.pl",
"switch_theme.cgi", "os_eol.json",
"switch_theme.cgi", "os_eol.json", "forgot_form.cgi",
"forgot_send.cgi", "forgot.cgi",
);
if ($min) {
# Only those required by others

View File

@@ -1842,13 +1842,16 @@ if ($config{'session'} && !$deny_authentication &&
&http_error(500, "Invalid password",
"Password contains invalid characters");
}
local $twofactor_probe = 0;
local ($vu, $expired, $nonexist, $wvu) =
&validate_user_caseless($in{'user'}, $in{'pass'}, $host,
$acptip, $port);
if ($vu && $wvu) {
my $uinfo = &get_user_details($wvu, $vu);
if ($uinfo && $uinfo->{'twofactor_provider'}) {
my $can2fa = $uinfo && $uinfo->{'twofactor_provider'};
$twofactor_probe = 1 if ($in{'twofprobe'} && $can2fa);
if ($can2fa && !$twofactor_probe) {
# Check two-factor token ID
$err = &validate_twofactor(
$wvu, $in{'twofactor'}, $vu);
@@ -1857,7 +1860,8 @@ if ($config{'session'} && !$deny_authentication &&
$vu, 'twofactor',
$loghost, $localip);
$twofactor_msg = $err;
$twofactor_nolog = 'nolog' if (!$in{'twofactor'});
$twofactor_nolog = 'nolog'
if (!$in{'twofactor'});
$vu = undef;
}
}
@@ -1865,7 +1869,8 @@ if ($config{'session'} && !$deny_authentication &&
local $hrv = &handle_login(
$vu || $in{'user'}, $vu ? 1 : 0,
$expired, $nonexist, $in{'pass'},
$in{'notestingcookie'}, $twofactor_nolog);
$in{'notestingcookie'}, $twofactor_nolog,
$twofactor_probe);
return $hrv if (defined($hrv));
}
}
@@ -2052,13 +2057,16 @@ if (!$validated) {
if (!$validated) {
# Check if this path allows unauthenticated access
local ($u, $unauth);
foreach $u (@unauth) {
$unauth++ if ($simple =~ /$u/);
my $unauth;
foreach my $u (@unauth) {
$unauth = 4 if ($simple =~ /$u/);
}
foreach my $u (@unauthcgi) {
$unauth = 3 if ($simple =~ /$u/);
}
if (!$bogus && $unauth) {
# Unauthenticated directory or file request - approve it
$validated = 4;
$validated = $unauth;
$baseauthuser = $authuser = undef;
}
}
@@ -2098,12 +2106,8 @@ if (!$validated) {
$method = "GET";
$querystring .= "&failed=".&urlize($failed_user)
if ($failed_user);
if ($twofactor_msg) {
$querystring .= "&failed_save=".&urlize($failed_save);
$querystring .= "&failed_pass=".&urlize($failed_pass);
$querystring .= "&failed_twofactor_attempt=".&urlize($failed_twofactor_attempt);
$querystring .= "&twofactor_msg=".&urlize($twofactor_msg);
}
$querystring .= "&twofactor_msg=".&urlize($twofactor_msg)
if ($twofactor_msg);
$querystring .= "&timed_out=$timed_out"
if ($timed_out);
$queryargs = "";
@@ -4240,11 +4244,12 @@ if (!$sid && !$force_urandom) {
return $sid;
}
# handle_login(username, ok, expired, not-exists, password, [no-test-cookie], [no-log])
# handle_login(username, ok, expired, not-exists, password,
# [no-test-cookie], [no-log], [twofactor-probe])
# Called from handle_session to either mark a user as logged in, or not
sub handle_login
{
local ($vu, $ok, $expired, $nonexist, $pass, $notest, $nolog) = @_;
local ($vu, $ok, $expired, $nonexist, $pass, $notest, $nolog, $twof_probe) = @_;
$authuser = $vu if ($ok);
# check if the test cookie is set
@@ -4268,6 +4273,19 @@ if ($config{'passdelay'} && $vu) {
if ($ok && (!$expired ||
$config{'passwd_mode'} == 1)) {
# Log in creds were OK but two-factor auth is still pending
if ($twof_probe) {
# Two-factor auth is required
$validated = $already_session_id = undef;
$authuser = $baseauthuser = undef;
$querystring = $method = $page = $request_uri = undef;
$logged_code = undef;
$queryargs = "";
# Write response
&http_error(401, "Two-factor authentication is required");
return undef;
}
# Logged in OK! Tell the main process about
# the new SID
local $sid = &generate_random_id();
@@ -4349,10 +4367,7 @@ else {
$expired ? 'expiredpass' : 'wrongpass',
$loghost, $localip);
$failed_user = $vu;
$failed_pass = $pass;
$failed_save = $in{'save'};
$failed_twofactor_attempt = $in{'failed_twofactor_attempt'} || 0;
$failed_twofactor_attempt++;
$request_uri = $in{'page'};
$already_session_id = undef;
$method = "GET";
@@ -4915,6 +4930,7 @@ my %vital = ("port", 80,
"pam", "webmin",
"sidname", "sid",
"unauth", "^/unauthenticated/ ^/robots.txt\$ ^[A-Za-z0-9\\-/_]+\\.jar\$ ^[A-Za-z0-9\\-/_]+\\.class\$ ^[A-Za-z0-9\\-/_]+\\.gif\$ ^[A-Za-z0-9\\-/_]+\\.png\$ ^[A-Za-z0-9\\-/_]+\\.conf\$ ^[A-Za-z0-9\\-/_]+\\.ico\$ ^/robots.txt\$ ^/service-worker.js\$",
"unauthcgi", "^/forgot_form.cgi\$ ^/forgot_send.cgi\$ ^/forgot.cgi\$",
"max_post", 10000,
"expires", 7*24*60*60,
"pam_test_user", "root",
@@ -5400,6 +5416,7 @@ foreach my $a (split(/\s+/, $config{'ipaccess'})) {
# build unauthenticated URLs list
@unauth = split(/\s+/, $config{'unauth'});
@unauthcgi = split(/\s+/, $config{'unauthcgi'});
# build redirect mapping
undef(%redirect);

View File

@@ -63,7 +63,7 @@ my $plugin = $fieldmap{'plugin'};
my $unixsocket = $plugin && $u->[$plugin] eq 'unix_socket';
my $nopass = ((!defined($epassfield1) || !$u->[$epassfield1]) &&
(!defined($epassfield2) || !$u->[$epassfield2]));
my $hashpass = $u->[$epassfield1] || $u->[$epassfield2];
my $hashpass = $u->[$epassfield2] || $u->[$epassfield1];
my $lock_supported = &get_account_lock_support();
# Old way for checking account locking
my $locked = $u->[$fieldmap{'account_locked'}] eq 'Y';
@@ -84,6 +84,8 @@ print &ui_table_row($text{'user_pass'},
# Current hashed password
if (!$in{'new'} && $hashpass) {
$hashpass =~ s/[^[:print:]\n]//g; # keep printable and newline
$hashpass =~ s/\n/\\n/g; # display newline as literal '\n'
print &ui_table_row($text{'user_hashpass'},
"<tt>".&html_escape($hashpass)."</tt>");
}

View File

@@ -650,13 +650,14 @@ return $rv;
sub quote_table
{
return &quotestr($_[0]);
my ($rv) = @_;
return &quotestr($rv);
}
# quotestr(string)
sub quotestr
{
local $rv = $_[0];
my ($rv) = @_;
if (&supports_quoting()) {
return "`$rv`";
}
@@ -677,18 +678,19 @@ return $db;
# unquote_mysql_database(name)
# Returns a MySQL database name with \% and \_ characters unescaped
sub unquote_mysql_database {
my ($db) = @_;
$db =~ s/\\%/%/g;
$db =~ s/\\_/_/g;
return $db;
sub unquote_mysql_database
{
my ($db) = @_;
$db =~ s/\\%/%/g;
$db =~ s/\\_/_/g;
return $db;
}
# escapestr(string)
# Returns a string with quotes escaped, for use in SQL
sub escapestr
{
local $rv = $_[0];
my ($rv) = @_;
$rv =~ s/'/''/g;
return $rv;
}
@@ -697,8 +699,8 @@ return $rv;
# Escapes backslashes, but only inside quoted strings
sub escape_backslashes_in_quotes
{
local ($str) = @_;
local $rv;
my ($str) = @_;
my $rv;
while($str =~ /^([^"]*)"([^"]*)"(.*)$/) {
local ($before, $quoted, $after) = ($1, $2, $3);
$quoted =~ s/\\/\\\\/g;
@@ -724,6 +726,14 @@ sub supports_mysqldump_events
return &compare_version_numbers($mysql_version, "5.1.8") >= 0;
}
# supports_mysqldump_setgtid()
# Returns 1 if mysqldump supports --set-gtid-purged flag
sub supports_mysqldump_setgtid
{
my $out = &backquote_command("$config{'mysqldump'} --help 2>&1 </dev/null");
return $out =~ /--set-gtid-purged/ ? 1 : 0;
}
# supports_routines()
# Returns 1 if mysqldump supports routines
sub supports_routines
@@ -1681,15 +1691,21 @@ my $routinessql = &supports_routines() ? "--routines" : "";
my $tablessql = join(" ", map { quotemeta($_) } @$tables);
my $eventssql = &supports_mysqldump_events() ? "--events" : "";
my $gtidsql = "";
eval {
local $main::error_must_die = 1;
my $d = &execute_sql($master_db, "show variables like 'gtid_mode'");
if (@{$d->{'data'}} && uc($d->{'data'}->[0]->[1]) eq 'ON' &&
&compare_version_numbers($mysql_version, "5.6") >= 0) {
# Add flag to support GTIDs
$gtidsql = "--set-gtid-purged=OFF";
}
};
if (&supports_mysqldump_setgtid() &&
$config{'mysqldump'} !~ /--set-gtid-purged/) {
eval {
local $main::error_must_die = 1;
my $d = &execute_sql($master_db,
"show variables like 'gtid_mode'");
my ($ver, $variant) = &get_remote_mysql_variant();
if (@{$d->{'data'}} && uc($d->{'data'}->[0]->[1]) eq 'ON' &&
$variant eq 'mysql' &&
&compare_version_numbers($ver, "5.6") >= 0) {
# Add flag to support GTIDs
$gtidsql = "--set-gtid-purged=OFF";
}
};
}
if ($user && $user ne "root") {
# Actual writing of output is done as another user
$writer = &command_as_user($user, 0, $writer);

View File

@@ -77,6 +77,11 @@ else {
&change_user_password(undef, $olduser, $oldhost,
$in{'plugin'});
}
elsif ($in{'mysqlpass_mode'} == 1 &&
$in{'plugin'} eq "unix_socket") {
&change_user_password('', $olduser, $oldhost,
$in{'plugin'});
}
elsif ($in{'mysqlpass_mode'} != 1) {
($in{'mysqlpass_mode'} eq '0' && !$in{'mysqlpass'}) && &error($text{'root_epass1'});
my $pass = $in{'mysqlpass'} || '';

62
phpini/delete_pkgs.cgi Executable file
View File

@@ -0,0 +1,62 @@
#!/usr/local/bin/perl
# Remove some PHP versions
require './phpini-lib.pl';
&error_setup($text{'dpkgs_err'});
$access{'global'} || &error($text{'pkgs_ecannot'});
&foreign_available("software") || &error($text{'pkgs_ecannot2'});
&ReadParse();
my @d = split(/\0/, $in{'d'});
@d || &error($text{'dpkgs_enone'});
my $vmap = &get_virtualmin_php_map();
# Find all packages and check that they can be safely removed
my @pkgs = &list_php_base_packages();
my @delpkgs;
foreach my $name (@d) {
($pkg) = grep { $_->{'name'} eq $name } @pkgs;
$pkg || &error($text{'dpkgs_eexists'});
if ($vmap) {
$ulist = $vmap->{$pkg->{'shortver'}};
if ($ulist && @$ulist) {
&error(&text('dpkg_eusers', $pkg->{'phpver'},
scalar(@$ulist)));
}
}
push(@delpkgs, $pkg);
}
&ui_print_unbuffered_header(undef, $text{'dpkgs_title'}, "");
if (!$in{'confirm'}) {
# Find the packages first
print &ui_form_start("delete_pkgs.cgi");
foreach my $d (@d) {
print &ui_hidden("d", $d);
}
my @alldel;
foreach my $pkg (@delpkgs) {
push(@alldel, &list_all_php_version_packages($pkg));
}
print &text('dpkgs_rusure',
join(" ", map { "<tt>$_</tt>" } @alldel)),"<p>\n";
print &ui_form_end([ [ 'confirm', $text{'pkgs_delete'} ] ]);
}
else {
# Actually do the deletion
foreach my $pkg (@delpkgs) {
print &text('dpkgs_doing', "<tt>$pkg->{'name'}</tt>",
$pkg->{'phpver'}),"<br>\n";
$err = &delete_php_base_package($pkg);
if ($err) {
print &text('dpkgs_failed', $err),"<p>\n";
}
else {
print $text{'dpkgs_done'},"<p>\n";
}
}
&webmin_log("delete", "pkgs", scalar(@delpkgs));
}
&ui_print_footer("list_pkgs.cgi", $text{'pkgs_return'});

View File

@@ -61,6 +61,16 @@ else {
print &ui_form_end();
}
# Show button to install PHP versions
if ($access{'global'} && &foreign_available("software")) {
print &ui_hr();
print &ui_buttons_start();
print &ui_buttons_row("list_pkgs.cgi",
$text{'index_pkgs'},
$text{'index_pkgsdesc'});
print &ui_buttons_end();
}
&ui_print_footer("/", $text{'index'});
}

View File

@@ -9,6 +9,8 @@ index_edit=Verwalten
index_manual=Manuell bearbeiten
index_anyfile=Andere PHP-Konfigurationsdatei bearbeiten
index_return=Konfigurationsdateien
index_pkgs=PHP-Pakete verwalten
index_pkgsdesc=Installieren und entfernen Sie PHP-Versionen aus dem Softwarepaket-Repository Ihres Systems, sodass sie hier konfiguriert und in Virtualmin verwendet werden können.
file_global=Globale PHP-Konfiguration
file_eread=Lesen von $1 fehlgeschlagen: $2
@@ -204,6 +206,7 @@ log_errors=Fehlerprotokollierung in $1 geändert
log_misc=Weitere Einstellungen in $1 geändert
log_mods=Aktivierte Module in $1 aktualisiert
log_imod=PHP-Modul $2 in $1 installiert
log_delete_dpkgs=Deinstallation von $1 PHP-Paketen abgeschlossen
acl_global=Globale PHP-Konfiguration bearbeiten dürfen?
acl_anyfile=Beliebige Datei als PHP-Konfiguration bearbeiten dürfen?
@@ -213,3 +216,29 @@ acl_user=Dateien im Kontext von Benutzer:innen lesen und schreiben
opt_default=Standardwert: <tt>$1</tt>
opt_default_unknown=Unbekannt
pkgs_title=PHP-Pakete
pkgs_name=Paketname
pkgs_ver=Paketversion
pkgs_phpver=PHP-Version
pkgs_shortver=Kurze Version
pkgs_users=Verwendet von
pkgs_delete=Ausgewählte Pakete löschen
pkgs_none=Auf Ihrem System wurden keine PHP-Pakete gefunden!
pkgs_ecannot=Sie haben keine Berechtigung, PHP-Pakete zu verwalten!
pkgs_ecannot2=Softwarepakete können auf diesem System nicht verwaltet werden
pkgs_nousers=Keine Domains
pkgs_ucount=$1 Domains
pkgs_newver=Zu installierendes PHP-Paket:
pkgs_install=Jetzt installieren
pkgs_return=PHP-Pakete
dpkgs_err=Fehler beim Löschen der PHP-Pakete
dpkgs_title=PHP-Pakete werden gelöscht
dpkgs_doing=Deinstalliere Paket $1 und Module für PHP-Version $2 ..
dpkgs_failed=.. fehlgeschlagen : $1
dpkgs_done=.. erfolgreich deinstalliert
dpkgs_enone=Keine Pakete ausgewählt
dpkgs_eexists=Das Paket existiert nicht!
dpkg_eusers=Das Paket für PHP-Version $1 kann nicht deinstalliert werden, da es noch von $2 Domain(s) verwendet wird
dpkgs_rusure=Möchten Sie die ausgewählten PHP-Pakete wirklich entfernen: $1

View File

@@ -9,6 +9,8 @@ index_edit=Manage
index_manual=Edit Manually
index_anyfile=Edit other PHP configuration file
index_return=configuration files
index_pkgs=Manage PHP Packages
index_pkgsdesc=Install and remove PHP versions from your system's software package repository, so that they can be configured here any used in Virtualmin.
file_global=Global PHP configuration
file_eread=Failed to read $1 : $2
@@ -204,6 +206,7 @@ log_errors=Changed error logging in $1
log_misc=Changed other settings in $1
log_mods=Updated enabled modules in $1
log_imod=Installed PHP module $2 in $1
log_delete_dpkgs=Uninstalled $1 PHP packages
acl_global=Can edit global PHP configuration?
acl_anyfile=Can edit any file as a PHP configuration?
@@ -214,4 +217,31 @@ acl_user=Read and write files as user
opt_default=Default Value: <tt>$1</tt>
opt_default_unknown=Unknown
pkgs_title=PHP Packages
pkgs_name=Package name
pkgs_ver=Package version
pkgs_phpver=PHP version
pkgs_bin=Executable
pkgs_shortver=Short version
pkgs_users=Used by
pkgs_delete=Delete Selected Packages
pkgs_none=No PHP packages were found on your system!
pkgs_ecannot=You are not allowed to manage PHP packages!
pkgs_ecannot2=Software packages cannot be managed on this system
pkgs_nousers=No domains
pkgs_ucount=$1 domains
pkgs_newver=PHP package to install:
pkgs_install=Install Now
pkgs_return=PHP packages
dpkgs_err=Failed to delete PHP packages
dpkgs_title=Deleting PHP Packages
dpkgs_doing=Uninstalling package $1 and modules for PHP version $2 ..
dpkgs_failed=.. failed : $1
dpkgs_done=.. uninstalled successfully
dpkgs_enone=No packages selected
dpkgs_eexists=Package does not exist!
dpkg_eusers=Package for PHP version $1 cannot be uninstalled, as it is still being used by $2 domains
dpkgs_rusure=Are you sure you want to remove the selected PHP packages : $1
__norefs=1

67
phpini/list_pkgs.cgi Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/local/bin/perl
# Show all installed PHP versions
require './phpini-lib.pl';
$access{'global'} || &error($text{'pkgs_ecannot'});
&foreign_available("software") || &error($text{'pkgs_ecannot2'});
&ui_print_header(undef, $text{'pkgs_title'}, "");
my @pkgs = &list_php_base_packages();
my %got;
if (@pkgs) {
my $vmap = &get_virtualmin_php_map();
my @tds = ( "width=5" );
print &ui_form_start("delete_pkgs.cgi", "post");
print &ui_columns_start([ "", $text{'pkgs_name'},
$text{'pkgs_ver'},
$text{'pkgs_phpver'},
$text{'pkgs_bin'},
$vmap ? (
$text{'pkgs_shortver'},
$text{'pkgs_users'} ) : ( ),
], \@tds);
foreach my $pkg (@pkgs) {
my $users;
if ($vmap) {
my $ulist = $vmap->{$pkg->{'shortver'}};
$users = !$ulist || !@$ulist ? $text{'pkgs_nousers'} :
@$ulist > 5 ? &text('pkgs_ucount',
scalar(@$ulist)) :
join(", ", map { "<tt>$_->{'dom'}</tt>" }
@$ulist);
}
print &ui_checked_columns_row([
$pkg->{'name'},
$pkg->{'ver'},
$pkg->{'phpver'},
$pkg->{'binary'},
$vmap ? ( $pkg->{'shortver'}, $users ) : ( ),
], \@tds, "d", $pkg->{'name'});
$got{$pkg->{'name'}}++;
}
print &ui_columns_end();
print &ui_form_end([ [ undef, $text{'pkgs_delete'} ] ]);
}
else {
print "<b>$text{'pkgs_none'}</b> <p>\n";
}
if (&foreign_installed("package-updates")) {
# Show form to install a new version
@newpkgs = grep { !$got{$_->{'name'}} } &list_available_php_packages();
print &ui_hr();
print &ui_form_start(
&get_webprefix()."/package-updates/update.cgi", "post");
print "<b>$text{'pkgs_newver'}</b>\n";
print &ui_select("u", undef,
[ map { [ $_->{'name'},
$_->{'name'}." (".$_->{'ver'}.")" ] } @newpkgs ]);
print &ui_hidden(
"redir", &get_webprefix()."/$module_name/list_pkgs.cgi");
print &ui_hidden("redirdesc", $text{'pkgs_title'});
print &ui_hidden("mode", "new");
print &ui_form_end([ [ undef, $text{'pkgs_install'} ] ]);
}
&ui_print_footer("", $text{'index_return'});

View File

@@ -12,6 +12,11 @@ if ($action eq "imod") {
return &text('log_'.$action, "<tt>".&html_escape($object)."</tt>",
"<tt>".&html_escape($p->{'mod'})."</tt>");
}
return &text('log_'.$action, "<tt>".&html_escape($object)."</tt>");
elsif ($type eq "pkgs") {
return &text('log_'.$action.'_pkgs', $object);
}
else {
return &text('log_'.$action, "<tt>".&html_escape($object)."</tt>");
}
}

View File

@@ -866,5 +866,157 @@ else {
return @poss;
}
# list_php_base_packages()
# Returns a list of hash refs, one per PHP version installed, with the
# following keys :
# name - Package name
# system - Package system
# ver - Package version
# phpver - PHP version
sub list_php_base_packages
{
&foreign_require("software");
my $n = &software::list_packages();
my @rv;
my %done;
for(my $i=0; $i<$n; $i++) {
my $name = $software::packages{$i,'name'};
next if ($name !~ /^(php\d*)(-php|-runtime)?$/);
$name = $1;
my $phpver = $software::packages{$i,'version'};
$phpver =~ s/\-.*$//;
my $bin;
foreach my $b ($name, $name."-cgi", "php-".$phpver) {
if ($bin = &has_command($b)) {
last;
}
}
if ($bin) {
my $out = &backquote_command("$bin -v 2>&1");
if ($out =~ /(^|\n)PHP\s+([\d\.]+)/) {
$phpver = $2;
}
}
my $shortver = $phpver;
$shortver =~ s/^(\d+\.\d+).*$/$1/;
if ($shortver =~ /^5\./) {
$shortver = "5";
}
push(@rv, { 'name' => $software::packages{$i,'name'},
'system' => $software::packages{$i,'system'},
'ver' => $software::packages{$i,'version'},
'shortver' => $shortver,
'phpver' => $phpver,
'binary' => $bin, });
}
@rv = sort { $a->{'name'} cmp $b->{'name'} } @rv;
@rv = grep { !$done{$_->{'shortver'}}++ } @rv;
return sort { &compare_version_numbers($a->{'ver'}, $b->{'ver'}) } @rv;
}
# list_all_php_module_packages(base-package)
# Returns all install packages for PHP extensions of a given base package
sub list_all_php_module_packages
{
my ($base) = @_;
$base =~ s/(-php|-runtime)$//;
my @rv;
&foreign_require("software");
my $n = &software::list_packages();
for(my $i=0; $i<$n; $i++) {
my $name = $software::packages{$i,'name'};
next if ($name !~ /^\Q$base\E-/);
push(@rv, { 'name' => $software::packages{$i,'name'},
'system' => $software::packages{$i,'system'},
'ver' => $software::packages{$i,'version'},
});
}
return @rv;
}
# list_available_php_packages()
# Returns a list of hash refs, one per PHP version available, with the
# following keys :
# name - Package name
# ver - Package version
# phpver - PHP version
sub list_available_php_packages
{
&foreign_require("package-updates");
my @rv;
foreach my $pkg (&package_updates::list_available()) {
my $name = $pkg->{'name'};
next if ($name !~ /^php(\d*)$/);
my $phpver = $pkg->{'version'};
$phpver =~ s/\-.*$//;
my $shortver = $phpver;
$shortver =~ s/^(\d+\.\d+).*$/$1/;
if ($shortver =~ /^5\./) {
$shortver = "5";
}
push(@rv, { 'name' => $pkg->{'name'},
'ver' => $pkg->{'version'},
'shortver' => $shortver,
'phpver' => $phpver,
});
}
return sort { &compare_version_numbers($a->{'ver'}, $b->{'ver'}) } @rv;
}
# get_virtualmin_php_map()
# Return a hash mapping PHP versions like 5 or 7.2 to a list of domains, or
# undef if Virtualmin isn't installed
sub get_virtualmin_php_map
{
my %vmap;
&foreign_check("virtual-server") || return undef;
&foreign_require("virtual-server");
foreach my $d (&virtual_server::list_domains()) {
my $v = $d->{'php_mode'} eq 'fpm' ? $d->{'php_fpm_version'}
: $d->{'php_version'};
if ($v) {
$vmap{$v} ||= [ ];
push(@{$vmap{$v}}, $d);
}
}
return \%vmap;
}
# list_all_php_version_packages(&base-pkg)
# Returns all package names for installed packages related to one PHP package,
# such as those for extensions
sub list_all_php_version_packages
{
my ($pkg) = @_;
&foreign_require("software");
my @rv = map { $_->{'name'} }
&list_all_php_module_packages($pkg->{'name'});
my $base = $pkg->{'name'};
$base =~ s/-php$//;
my @poss = ( @modpkgs, $base."-php", $base."-runtime", $base );
foreach my $p (@poss) {
my @info = &software::package_info($p, $pkg->{'ver'});
next if (!@info);
push(@rv, $p);
}
return @rv;
}
# delete_php_base_package(&package)
# Delete a PHP package, and return undef on success or an error on failure
sub delete_php_base_package
{
my ($pkg) = @_;
foreach my $p (&list_all_php_version_packages($pkg)) {
my @info = &software::package_info($p);
next if (!@info);
my $err = &software::delete_package($p, { 'nodeps' => 1 });
if ($err) {
return &html_strip($err);
}
}
return undef;
}
1;

View File

@@ -3,7 +3,7 @@ scan_time=5
display_mode=0
sort_mode=0
show_status=1
deflink=0
deffast=2
deflink=1
deffast=1
show_ip=0
max_servers=100

View File

@@ -4,7 +4,7 @@ display_mode=0
sort_mode=0
show_status=1
deflink=0
deffast=2
deffast=1
show_ip=0
max_servers=100
capath=/usr/share/ca-certificates /etc/ssl/certs

View File

@@ -4,7 +4,7 @@ display_mode=0
sort_mode=0
show_status=1
deflink=0
deffast=2
deffast=1
show_ip=0
max_servers=100
capath=/etc/pki/tls/certs/ca-bundle.crt

View File

@@ -1,4 +1,4 @@
deffast=2
deffast=1
max_servers=100
resolve=1
deflink=0

View File

@@ -7,7 +7,7 @@ sort_mode=Sort servers by,4,4-IP Address,1-Hostname,2-Description,3-OS,5-Group,0
show_status=Show status for servers,1,1-Yes,0-No
show_ip=Always show address and port on main page?,1,1-Yes,0-No
deflink=Default login mode,4,0-Normal link to server,1-Login via Webmin,2-Login when icon is clicked,3-Login with same username and password
deffast=Default RPC mode,1,1-Fast,2-Automatic,0-Slow
deffast=Default RPC mode,1,2-Automatic,1-Fast,0-Slow
auto_type=Default system type,14,show_deftype
skipips=IPs or hostnames of systems to not detect,9,50,5,\t
skipifaces=Network interfaces to not detect,0

View File

@@ -8,7 +8,7 @@ our (%config, %text);
sub show_deftype
{
return ( $text{'config_typeauto'}, 4,
return ( $text{'config_deftype'}, 4,
"-$text{'default'}",
map { $_->[0]."-".$_->[1] } &get_server_types() );
}

View File

@@ -103,17 +103,22 @@ if ($access{'forcelink'}) {
}
else {
# Login mode
my $qulbl = &quote_escape($text{'edit_user'}, '"');
my $qplbl = &quote_escape($text{'edit_pass'}, '"');
my $linksel = &ui_radio("mode", $mode,
[ [ 0, "$text{'edit_mode0'}<br>" ],
[ 1, $text{'edit_mode1'}." ".$text{'edit_user'}." ".
&ui_textbox("wuser", $mode == 1 ? $s->{'user'} : "", 10).
" ".$text{'edit_pass'}.
&ui_password("wpass", $s->{'pass'}, 10)."<br>" ],
[ 1, &text('edit_mode12',
&ui_textbox("wuser", $mode == 1 ? $s->{'user'} : "", 8,
undef, undef,
" aria-label=\"$qulbl\" placeholder=\"$qulbl\""),
&ui_password("wpass", $s->{'pass'}, 8, undef, undef,
" aria-label=\"$qplbl\" placeholder=\"$qplbl\"")).
"<br>" ],
[ 2, "$text{'edit_mode2'}<br>" ],
($access{'pass'} && !$main::session_id || $mode == 3 ?
( [ 3, "$text{'edit_mode3'}<br>".
(defined($main::remote_pass) ? "" :
"<font size=-1>($text{'edit_same'})</font><br>") ] )
&ui_note($text{'edit_same'})."<br>") ] )
: ( ) ) ]);
print &ui_table_row($text{'edit_link'}, $linksel);
}
@@ -124,14 +129,14 @@ if ($access{'forcefast'}) {
: $s->{'fast'});
}
else {
if ($in{'new'} || $s->{'fast'} == 2) {
if (($in{'new'} && $config{'deffast'} != 1) || $s->{'fast'} == 2) {
print &ui_table_row($text{'edit_fast'},
&ui_radio("fast", $config{'deffast'},
[ [ 1, $text{'yes'} ],
[ 2, $text{'edit_auto'} ],
[ 0, $text{'no'} ] ]));
}
else {
elsif (!$in{'new'} && $s->{'fast'} != 1) {
print &ui_table_row($text{'edit_fast'},
&ui_radio("fast", int($s->{'fast'}),
[ [ 1, $text{'yes'} ],

View File

@@ -52,12 +52,12 @@ if (@servers && $config{'display_mode'}) {
$text{'index_os'} ], 100);
foreach my $s (@servers) {
my @cols;
my $table = "<table cellpadding=0 cellspacing=0 width=100%><tr>\n";
my $table = "";
if (!$access{'links'} || !$s->{'port'}) {
$table .= "<td>\n";
$table .= "<span>\n";
$table .= &html_escape($s->{'realhost'} ||$s->{'host'});
$table .= ":$s->{'port'}" if ($s->{'port'});
$table .= "</td>\n";
$table .= "</span>\n";
}
else {
my $link = "";
@@ -67,13 +67,13 @@ if (@servers && $config{'display_mode'}) {
else {
$link = &make_url($s);
}
$table .= "<td>\n";
$table .= "<span>\n";
$table .= &ui_link($link,
&html_escape($s->{'realhost'} || $s->{'host'} ).
":".$s->{'port'}, undef, "target=_top");
$table .= "</td>\n";
$table .= "</span>\n";
}
$table .= "<td align=right>";
$table .= "<span style=\"float: right;\">";
if ($s->{'autouser'} && &logged_in($s)) {
$table .= &ui_link("logout.cgi?id=".$s->{'id'},
"(".$text{'index_logout'}.")");
@@ -82,7 +82,7 @@ if (@servers && $config{'display_mode'}) {
$table .= &ui_link("edit_serv.cgi?id=".$s->{'id'},
"(".$text{'index_edit'}.")");
}
$table .= "</td></tr></table>\n";
$table .= "</span>\n";
push(@cols, $table);
push(@cols, &html_escape($s->{'desc'}));
push(@cols, &html_escape($s->{'group'}) || $text{'index_none'});
@@ -155,13 +155,14 @@ if ($access{'find'} || $access{'auto'}) {
print &ui_buttons_row("find.cgi", $text{'index_broad'},
$text{'index_findmsg'});
my $t = &ui_buttons_row("find.cgi", $text{'index_scan'},
&text('index_scanmsg', &ui_textbox("scan", $myscan, 15)).
&text('index_scanmsg', "&nbsp;".
&ui_textbox("scan", $myscan, 15)."&nbsp;").
"<br><table>\n".
"<tr><td valign=middle><b>$text{'index_defuser'}</b></td>\n".
"<tr><td valign=middle>$text{'index_defuser'}&nbsp;</td>\n".
"<td valign=middle>".&ui_textbox("defuser", undef, 20)."</td> </tr>".
"<tr> <td><b>$text{'index_defpass'}</b></td>\n".
"<tr> <td>$text{'index_defpass'}&nbsp;</td>\n".
"<td valign=middle>".&ui_password("defpass", undef, 20)."</td> </tr>".
"<tr> <td><b>$text{'index_defport'}</b></td>\n".
"<tr> <td>$text{'index_defport'}&nbsp;</td>\n".
"<td valign=middle>".&ui_textbox("port", $port, 20)."</td> </tr>".
"</table>\n"
);

View File

@@ -36,6 +36,7 @@ edit_checkssl=Check remote SSL certificate?
edit_link=Link type
edit_mode0=Normal link to server
edit_mode1=Login via Webmin with
edit_mode12=Login via Webmin with $1 and $2
edit_mode2=Login when icon is clicked on
edit_mode3=Login with username and password from this server
edit_user=username
@@ -154,7 +155,6 @@ auto_esmtp=Missing or invalid SMTP server
auto_findself=Register this system too?
config_deftype=Default system type
config_typeauto=Automatic
email_regsubject=System $1 registered
email_reg=The system $1 has been automatically registered.

View File

@@ -98,7 +98,7 @@ else {
$serv->{'checkssl'} = $in{'checkssl'};
$serv->{'desc'} = $in{'desc_def'} ? undef : $in{'desc'};
$serv->{'group'} = join("\t", @groups);
$serv->{'fast'} = $in{'fast'};
$serv->{'fast'} = $in{'fast'} // 1;
delete($serv->{'user'});
delete($serv->{'pass'});
delete($serv->{'autouser'});

View File

@@ -27,7 +27,7 @@ if ($gconfig{'loginbanner'} && $ENV{'HTTP_COOKIE'} !~ /banner=1/ &&
$sec = uc($ENV{'HTTPS'}) eq 'ON' ? "; secure" : "";
if (!$miniserv{'no_httponly'}) {
$sec .= "; httpOnly";
}
}
$sidname = $miniserv{'sidname'} || "sid";
print "Set-Cookie: banner=0; path=/$sec\r\n" if ($gconfig{'loginbanner'});
print "Set-Cookie: $sidname=x; path=/$sec\r\n" if ($in{'logout'});
@@ -48,8 +48,9 @@ if ($tconfig{'inframe'}) {
print "<center>\n";
if (&miniserv_using_default_cert()) {
print "<h3>",&text('defcert_error',
ucfirst(&get_product_name()), ($ENV{'MINISERV_KEYFILE'} || $miniserv{'keyfile'})),"</h3><p></p>\n";
print &ui_alert_box(&text('defcert_error',
ucfirst(&get_product_name()),
($ENV{'MINISERV_KEYFILE'} || $miniserv{'keyfile'})), 'warn');
}
if (defined($in{'failed'})) {
if ($in{'twofactor_msg'}) {
@@ -110,8 +111,15 @@ print &ui_table_end(),"\n";
print &ui_submit($text{'session_login'});
print &ui_reset($text{'session_clear'});
print &ui_form_end();
print "</center>\n";
if ($in{'failed'} && $gconfig{'forgot_pass'}) {
# Show forgotten password link
print &ui_form_start("forgot_form.cgi", "post");
print &ui_hidden("failed", $in{'failed'});
print &ui_form_end([ [ undef, $text{'session_forgot'} ] ]);
}
print "</center>\n";
print "$text{'session_postfix'}\n";
# Output frame-detection Javascript, if theme uses frames

View File

@@ -3337,5 +3337,18 @@ if ($head) {
}
}
=head2 ui_note(text)
Returns a note as a small font size text
=cut
sub ui_note
{
return &theme_ui_note(@_) if (defined(&theme_ui_note));
my ($text) = @_;
return "<font style='font-size:92%;opacity:0.66'>&nbsp;&nbsp;ⓘ&nbsp;&nbsp;".
"$text</font>";
}
1;

View File

@@ -64,7 +64,7 @@ else {
$download{'gid'} = $uinfo[3];
}
}
if ($in{'bg'} && $can_schedule) {
if ($in{'bg'} == 1 && $can_schedule) {
# Validate time
$in{'hour'} =~ /^\d+$/ && $in{'min'} =~ /^\d+$/ &&
$in{'day'} =~ /^\d+$/ && $in{'year'} =~ /^\d+$/ ||
@@ -72,6 +72,15 @@ if ($in{'bg'} && $can_schedule) {
eval { $download{'time'} = timelocal(0, $in{'min'}, $in{'hour'},
$in{'day'}, $in{'month'}, $in{'year'}-1900) };
$@ && &error($text{'download_edate2'});
# Validate that atd is running, if needed
if (&foreign_installed("at") && !$module_info{'usermin'}) {
&foreign_require("at");
my ($init, $r, $atboot) = &at::get_init_status();
if ($init && $r == 0) {
&error(&text('download_eatd', &get_webprefix().'/at/'));
}
}
}
if (defined($in{'email_def'}) && !$in{'email_def'}) {
# Validate email
@@ -111,27 +120,24 @@ if ($in{'bg'} && $can_background) {
&unlock_file($atjob_cmd);
&save_download(\%download);
if (!$can_schedule) {
if (!$can_schedule || $in{'bg'} == 2) {
# Just run this script right now
&execute_command("$atjob_cmd $download{'id'} &");
}
else {
# Create an At job to do the download
&foreign_require("at", "at-lib.pl");
{
local %ENV;
delete($ENV{'FOREIGN_MODULE_NAME'});
delete($ENV{'FOREIGN_ROOT_DIRECTORY'});
&clean_environment();
$ENV{'REMOTE_USER'} = $remote_user; # For usermin
$ENV{'BASE_REMOTE_USER'} = $base_remote_user;
&at::create_atjob(
$module_info{'usermin'} ? $remote_user : "root",
$download{'time'},
"$atjob_cmd $download{'id'}",
"/");
&reset_environment();
}
&clean_environment();
delete($ENV{'FOREIGN_MODULE_NAME'});
delete($ENV{'FOREIGN_ROOT_DIRECTORY'});
$ENV{'REMOTE_USER'} = $remote_user; # For usermin
$ENV{'BASE_REMOTE_USER'} = $base_remote_user;
&at::create_atjob(
$module_info{'usermin'} ? $remote_user : "root",
$download{'time'},
"$atjob_cmd $download{'id'}",
"/");
&reset_environment();
}
&redirect("index.cgi?mode=download");

View File

@@ -56,8 +56,10 @@ if ($can_download) {
# Download time can be selected, for scheduling with At
@now = localtime(time());
print &ui_table_row($text{'index_bg'},
&ui_radio("bg", 0, [ [ 0, $text{'index_bg0'}."<br>" ],
[ 1, $text{'index_bg1'} ] ])." ".
&ui_radio("bg", 0,
[ [ 0, $text{'index_bg0'}."<br>" ],
[ 2, $text{'index_bg1u'}."<br>" ],
[ 1, $text{'index_bg1'} ] ])." ".
&ui_textbox("day", $now[3], 2)."/".
&ui_select("month", $now[4],
[ map { [ $_, $text{"smonth_".($_+1)} ] }
@@ -72,7 +74,7 @@ if ($can_download) {
# Download must be immediate, but can be backgrounded
print &ui_table_row($text{'index_bg'},
&ui_radio("bg", 0, [ [ 0, $text{'index_bg0'} ],
[ 1, $text{'index_bg1u'} ] ]));
[ 2, $text{'index_bg1u'} ] ]));
}
else {
# Download is always right now

View File

@@ -78,6 +78,7 @@ download_failed=Download failed : $1
download_eaccess=You are not allowed to download files to $1
download_eucannot=You are not allowed to download files as user $1
download_egcannot=The selected group does not contain the selected user
download_eatd=Scheduled downloads are not possible unless the At daemon is running. It can be started in the <a href='$1'>scheduled commands</a> module.
cancel_err=Failed to cancel downloads
cancel_enone=None selected

View File

@@ -1 +1 @@
2.303
2.304

View File

@@ -1193,7 +1193,7 @@ my $bgimage = defined($tconfig{'bgimage'}) ? "background=$tconfig{'bgimage'}" :
my $dir = $current_lang_info->{'dir'} ? "dir=\"$current_lang_info->{'dir'}\"" : "";
my $html_body = "<body bgcolor=\"#$bgcolor\" link=\"#$link\" vlink=\"#$link\" text=\"#$text\" style=\"height:100%\" $bgimage $tconfig{'inbody'} $dir $_[8]>\n";
print &ui_switch_theme_javascript()
if (defined(&ui_switch_theme_javascript));
if ($main::session_id && defined(&ui_switch_theme_javascript));
$html_body =~ s/\s+\>/>/g;
print $html_body;
print "<script>function _document_cookie_set_client_height(){document.cookie='client_height='+document.documentElement.clientHeight+'';}_document_cookie_set_client_height();window.onresize=_document_cookie_set_client_height</script>\n";
@@ -1785,28 +1785,16 @@ for(my $i=0; my @stack_ = caller($i); $i++) {
push(@stack, \@stack_);
}
my $err_caller;
$err_caller = "$stack[0]->[1] (line $stack[0]->[2])"
if ($stack[0]->[1] && $stack[0]->[2]);
if ($err_caller) {
if ($stack[0]->[1] && $stack[0]->[2]) {
$err_caller = "$stack[0]->[1] (line $stack[0]->[2])";
$err_caller =~ s/$root_directory\///;
my $err_caller_msg_esc = &quote_escape($err_caller, '"');
my $err_caller_msg;
if (defined(&ui_help)) {
$err_caller_msg = &ui_help($err_caller_msg_esc);
}
else {
$err_caller_msg = $err_caller_msg_esc;
}
my $err_caller_ =
$main::webmin_script_type =~ /^(cmd|cron)$/ ?
$err_caller : $err_caller_msg;
$msg = $msg ? "$msg $err_caller_" : $err_caller_;
push(@msg, $err_caller_);
$err_caller = $msg ? "$msg $err_caller" : $err_caller;
}
my $error_details = (($ENV{'WEBMIN_DEBUG'} || $gconfig{'debug_enabled'}) ? "" : "\n");
my $error_output_right = sub {
my ($err_msg) = @_;
return $main::webmin_script_type eq 'cmd' ? entities_to_ascii($err_msg) : $err_msg;
return $main::webmin_script_type ne 'web' ?
&html_strip(&entities_to_ascii($err_msg)) : $err_msg;
};
if (!$main::error_must_die) {
&error_stderr(&$error_output_right($msg));
@@ -1842,7 +1830,7 @@ elsif ($ENV{'REQUEST_URI'} =~ /json-error=1/) {
print_json(\%jerror);
}
else {
&header($text{'error'}, "");
&header($text{'error'}, "", undef, 0, &get_module_name() ? 0 : 1);
my $hh = $miniserv::page_capture ? " captured" : "";
my $err_style = &read_file_contents("$root_directory/unauthenticated/errors.css");
if ($err_style) {
@@ -1924,7 +1912,7 @@ $make_datestr =
$tm[2], $tm[1], $tm[0], $timezone);
$remote_host = $ENV{"REMOTE_HOST"};
$page = $ENV{"REQUEST_URI"};
$err = &html_strip($err);
$err = &html_strip(&entities_to_ascii($err));
$err =~ s/[\n\r]+/ /g;
$err =~ s/\s\?$//g;
$err =
@@ -5228,8 +5216,9 @@ if (!defined($ENV{'WEBMIN_VAR'})) {
else {
$var_directory = $ENV{'WEBMIN_VAR'};
}
$main::http_cache_directory = $ENV{'WEBMIN_VAR'}."/cache";
$main::default_debug_log_file = $ENV{'WEBMIN_VAR'}."/webmin.debug";
$main::http_cache_directory = $var_directory."/cache";
$main::default_debug_log_file = $var_directory."/webmin.debug";
$main::forgot_password_link_dir = $var_directory."/forgot-password";
if ($ENV{'SESSION_ID'}) {
# Hide this variable from called programs, but keep it for internal use
@@ -5255,8 +5244,11 @@ $config_file = "$config_directory/config";
%gconfig = ( );
&read_file_cached($config_file, \%gconfig);
$gconfig{'webprefix'} = '' if (!exists($gconfig{'webprefix'}));
if (!$gconfig{'webprefix'} && $gconfig{'webprefix_remote'}) {
if (!$gconfig{'webprefix'} && $gconfig{'webprefix_remote'} &&
defined($ENV{'HTTP_X_WEBMIN_WEBPREFIX'})) {
$gconfig{'webprefix'} = $ENV{'HTTP_X_WEBMIN_WEBPREFIX'};
# Filter out potentially dangerous characters
$gconfig{'webprefix'} =~ s/[^a-zA-Z0-9\.\-_\/]//g;
}
$null_file = $gconfig{'os_type'} eq 'windows' ? "NUL" : "/dev/null";
$path_separator = $gconfig{'os_type'} eq 'windows' ? ';' : ':';
@@ -5685,7 +5677,6 @@ else {
if ($ENV{'HTTP_X_REQUESTED_WITH'} ne "XMLHttpRequest" &&
$ENV{'REQUEST_URI'} !~ /xhr/ &&
$ENV{'REQUEST_URI'} !~ /pjax/ &&
$ENV{'REQUEST_URI'} !~ /link\.cgi\/\d+/ &&
$ENV{'REQUEST_URI'} =~ /xnavigation=1/) {
# Store request URI, if safe
@@ -13749,8 +13740,8 @@ while(<CONF>) {
close(CONF);
\$root || die "No root= line found in $config_directory/miniserv.conf";
\$ENV{'PERLLIB'} = "\$root";
\$ENV{'WEBMIN_CONFIG'} = "$ENV{'WEBMIN_CONFIG'}";
\$ENV{'WEBMIN_VAR'} = "$ENV{'WEBMIN_VAR'}";
\$ENV{'WEBMIN_CONFIG'} = "$config_directory";
\$ENV{'WEBMIN_VAR'} = "$var_directory";
delete(\$ENV{'MINISERV_CONFIG'});
EOF
);

View File

@@ -152,7 +152,16 @@ elsif ($in{'md5pass'} == 3) {
$need = &acl::check_yescrypt();
$need && &error(&text('session_eyescrypt', "<tt>$need</tt>"));
}
$gconfig{'md5pass'} = $in{'md5pass'};
# Save forgotten password mode
if ($in{'forgot'} && &foreign_installed("virtualmin-password-recovery") &&
$text{'session_postfix'} =~ /virtualmin-password-recovery/) {
&error(&text('session_eforgot', 'edit_mods.cgi?tab=delete'));
}
$gconfig{'forgot_pass'} = $in{'forgot'};
&write_file("$config_directory/config", \%gconfig);
&unlock_file("$config_directory/config");

View File

@@ -7,4 +7,5 @@ osdn=1
warn_days=7
letsencrypt_dns_wait=10
letsencrypt_algo=rsa
letsencrypt_reuse=1
letsencrypt_reuse=1
letsencrypt_nouse=0

View File

@@ -150,6 +150,10 @@ print &ui_table_row($text{'session_passapi'},
[ 1, $text{'session_passapi1'} . "&nbsp;" .
&ui_help(&text('session_passurl', "<tt>$url</tt>")) ] ]));
# Enable forgotten password recovery
print &ui_table_row($text{'session_forgot'},
&ui_yesno_radio("forgot", $gconfig{'forgot_pass'}));
print ui_table_end();
print ui_form_end([ [ "save", $text{'save'} ] ]);

View File

@@ -326,7 +326,7 @@ else {
# Install in Webmin now?
print &ui_table_row($text{'ssl_usewebmin'},
&ui_yesno_radio("use", 1));
&ui_yesno_radio("use", !$config{'letsencrypt_nouse'}));
# SSL key size
print &ui_table_row($text{'ssl_size'},

View File

@@ -1 +1 @@
<header> توثيق ذو عاملين </header> يمكن استخدام المصادقة ذات العاملين لإضافة طبقة أمان إضافية إلى حساب Webmin ، بالإضافة إلى اسم المستخدم وكلمة المرور العاديين. عند التمكين ، سيحتاج المستخدم إلى تقديم رمز مصادقة إضافي يأتي عادةً من تطبيق هاتف ذكي أو منشئ OTP للأجهزة أو SMS. <p style=";text-align:right;direction:rtl"> تتيح لك هذه الصفحة تحديد موفر مصادقة لمستخدمي Webmin على نظامك. بمجرد التمكين ، يمكن لكل مستخدم التسجيل في عاملين اثنين في وحدة <b>Webmin Users</b> . الموفرون العاملون المتاحون هم: <dl style=";text-align:right;direction:rtl"><dt> <b>Authy</b> <dd> هذه خدمة تجارية توفر تطبيقًا للهاتف الذكي وموقعًا إلكترونيًا لإدارة المستخدمين بعاملين. يجب على كل مستخدم إنشاء حساب على موقع Authy على الويب وربطه بهاتفه الذكي. <p style=";text-align:right;direction:rtl"><dt> <b>أداة مصادقة Google</b> <dd> هذا هو تطبيق هاتف ذكي يقوم بتنفيذ بروتوكول TOTP القياسي. يجب على كل مستخدم مسح رمز الاستجابة السريعة باستخدام التطبيق لربط الرموز المميزة الخاصة به بخادم Webmin. <p style=";text-align:right;direction:rtl"></dl><footer>
<header>المصادقة الثنائية</header> تُضيف المصادقة الثنائية طبقة أمان إضافية لحساب Webmin. عند تفعيلها، يجب على المستخدم إدخال رمز مصادقة لمرة واحدة، والذي عادةً ما يُولّده تطبيق، أو جهاز OTP، أو يُرسَل عبر رسالة نصية قصيرة.<p style=";text-align:right;direction:rtl"> تتيح لك هذه الصفحة اختيار مزوّد مصادقة لمستخدمي Webmin على نظامك. بعد تفعيله، يُمكن لكل مستخدم التسجيل للمصادقة الثنائية في وحدة &quot;مستخدمو Webmin&quot;. مزوّدو المصادقة الثنائية المتاحون هم:<ul style=";text-align:right;direction:rtl"><li style=";text-align:right;direction:rtl"> <b>مُصادق TOTP</b><br> هذا تطبيق حاسوبي أو هاتف ذكي يُطبّق بروتوكول TOTP القياسي. يجب على كل مستخدم مسح رمز الاستجابة السريعة (QR) باستخدام التطبيق لربط رموزه بخادم Webmin.</li><li style=";text-align:right;direction:rtl"> <b>أوثى</b><br> هذه خدمة تجارية تُقدّم تطبيقًا وموقعًا إلكترونيًا للهواتف الذكية لإدارة مستخدمي المصادقة الثنائية. يجب على كل مستخدم إنشاء حساب على موقع Authy الإلكتروني وربطه بهاتفه الذكي.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Двуфакторна автентификация </header> Двуфакторната автентификация може да се използва за добавяне на допълнителен слой сигурност към акаунт в Webmin, както и към обикновеното потребителско име и парола. Когато е активирана, потребителят ще трябва да предостави допълнителен маркер за удостоверяване, който обикновено идва от приложение за смартфон, хардуерен OTP генератор или SMS. <p> Тази страница ви позволява да изберете доставчик на удостоверяване за потребителите на Webmin във вашата система. След като бъде активиран, всеки потребител може след това да се запише за двуфактор в модула <b>Webmin Потребители</b> . Наличните доставчици с два фактора са: <dl><dt> <b>Authy</b> <dd> Това е търговска услуга, която осигурява приложение за смартфон и уебсайт за управление на двуфакторни потребители. Всеки потребител трябва да създаде акаунт на уебсайта на Authy и да го свърже със своя смартфон. <p><dt> <b>Google Удостоверител</b> <dd> Това е приложение за смартфони, което реализира стандартния протокол TOTP. Всеки потребител трябва да сканира QR код, използвайки приложението, за да свърже маркерите си със сървъра на Webmin. <p></dl><footer>
<header>Двуфакторно удостоверяване</header> Двуфакторното удостоверяване добавя допълнителен слой сигурност към акаунта в Webmin. Когато е активирано, потребителят трябва да въведе еднократен токен за удостоверяване, обикновено генериран от приложение, хардуерно OTP устройство или изпратен чрез SMS.<p> Тази страница ви позволява да изберете доставчик на удостоверяване за потребителите на Webmin във вашата система. Веднъж активиран, всеки потребител може да се запише за двуфакторно удостоверяване в модула „Потребители на Webmin“. Наличните двуфакторни доставчици са:<ul><li> <b>TOTP автентификатор</b><br> Това е приложение за настолен компютър или смартфон, което прилага стандартния протокол TOTP. Всеки потребител трябва да сканира QR код с помощта на приложението, за да свърже своите токени със сървъра на Webmin.</li><li> <b>Authy</b><br> Това е търговска услуга, която предоставя приложение за смартфон и уебсайт за управление на двуфакторни потребители. Всеки потребител трябва да създаде акаунт на уебсайта на Authy и да го свърже със своя смартфон.</li></ul><footer>

View File

@@ -0,0 +1 @@
<header>Autenticació de dos factors</header> L&#39;autenticació de dos factors afegeix una capa addicional de seguretat a un compte de Webmin. Quan està activat, l&#39;usuari ha d&#39;introduir un testimoni d&#39;autenticació únic generat normalment per una aplicació, un dispositiu OTP de maquinari o enviat per SMS.<p> Aquesta pàgina us permet seleccionar un proveïdor d&#39;autenticació per als usuaris de Webmin del vostre sistema. Un cop habilitat, cada usuari es pot inscriure per a l&#39;autenticació de dos factors al mòdul &quot;Usuaris de Webmin&quot;. Els proveïdors de dos factors disponibles són:<ul><li> <b>Autenticador TOTP</b><br> Aquesta és una aplicació d&#39;escriptori o telèfon intel·ligent que implementa el protocol estàndard TOTP. Cada usuari ha d&#39;escanejar un codi QR mitjançant l&#39;aplicació per enllaçar els seus testimonis amb el servidor Webmin.</li><li> <b>Authy</b><br> Es tracta d&#39;un servei comercial que ofereix una aplicació per a telèfons intel·ligents i un lloc web per gestionar usuaris de dos factors. Cada usuari ha de crear un compte al lloc web d&#39;Authy i enllaçar-lo al seu telèfon intel·ligent.</li></ul><footer>

View File

@@ -1,26 +0,0 @@
<header>Autenticació de Dos Factors</header>
L'autenticació de dos factors es pot utilitzar per a afegir una capa extra de
seguretat a un compte de Webmin, a més a més dels habituals nom d'usuari i contrasenya.
Quan s'activa, els usuaris hauran de donar un testimoni d'autenticació extra
que típicament prové d'una aplicació smartphone, un generador OTP de maquinari o un SMS. <p>
Aquesta pàgina permet seleccionar un proveïdor d'autenticació per als usuaris
Webmin del sistema. Un cop activat, cada usuari podrà ser assignat amb dos
factors al mòdul d'<b>Usuaris de Webmin</b>. Els proveïdors disponibles són:
<dl>
<dt><b>Authy</b>
<dd>Aquest és un servei comercial que proporciona una aplicació smartphone i un
lloc web per a gestionar els usuaris de dos factors. Cada usuari ha de crear
un compte al lloc web d'Authy i enllaçar-lo al seu smartphone. <p>
<dt><b>Google Authenticator</b>
<dd>Aquesta és una aplicació que implementa el protocol estàndard TOTP.
Cada usuari ha d'escanejar un codi QR utilitzant l'aplicació per enllaçar
els seus testimonis amb el servidor Webmin. <p>
</dl>
<footer>

View File

@@ -1 +1 @@
<header> Dvoufaktorové ověření </header> Pomocí dvoufaktorové autentizace lze přidat další vrstvu zabezpečení k účtu Webmin, jakož i běžné uživatelské jméno a heslo. Pokud je tato možnost povolena, bude uživatel muset poskytnout další ověřovací token, který obvykle pochází z aplikace smartphonu, hardwarového OTP generátoru nebo SMS. <p> Tato stránka umožňuje vybrat poskytovatele ověřování pro uživatele Webmin ve vašem systému. Jakmile je povolen, může se každý uživatel přihlásit do modulu <b>Webmin Users</b> pro dva faktory. K dispozici jsou dva poskytovatelé dvou faktorů: <dl><dt> <b>Authy</b> <dd> Jedná se o komerční službu, která poskytuje aplikaci pro chytré telefony a web pro správu dvoufaktorových uživatelů. Každý uživatel si musí vytvořit účet na webové stránce společnosti Authy a propojit jej s chytrým telefonem. <p><dt> <b>Google Authenticator</b> <dd> Toto je aplikace pro chytré telefony, která implementuje standardní protokol TOTP. Každý uživatel musí naskenovat QR kód pomocí aplikace, aby propojil své tokeny se serverem Webmin. <p></dl><footer>
<header>Dvoufaktorová autentizace</header> Dvoufaktorová autentizace přidává k účtu Webmin další vrstvu zabezpečení. Když je tato možnost povolena, uživatel musí zadat jednorázový ověřovací token, který je obvykle vygenerován aplikací, hardwarovým OTP zařízením nebo odeslaný prostřednictvím SMS.<p> Tato stránka vám umožňuje vybrat poskytovatele ověření pro uživatele Webmin ve vašem systému. Po aktivaci se každý uživatel může přihlásit k dvoufaktorové autentizaci v modulu „Webmin Users“. Dostupní dvoufaktoroví poskytovatelé jsou:<ul><li> <b>TOTP Authenticator</b><br> Jedná se o aplikaci pro stolní počítače nebo chytré telefony, která implementuje standardní protokol TOTP. Každý uživatel musí pomocí aplikace naskenovat QR kód, aby propojil své tokeny se serverem Webmin.</li><li> <b>Authy</b><br> Jedná se o komerční službu, která poskytuje aplikaci pro chytré telefony a webové stránky pro správu dvoufaktorových uživatelů. Každý uživatel si musí vytvořit účet na webu Authy a propojit jej se svým chytrým telefonem.</li></ul><footer>

View File

@@ -1 +1 @@
<header> To-faktor godkendelse </header> To-faktor-godkendelse kan bruges til at tilføje et ekstra lag af sikkerhed til en Webmin-konto samt det almindelige brugernavn og adgangskode. Når den er aktiveret, skal en bruger give et ekstra autentificeringstoken, der typisk kommer fra en smartphone-app, hardware OTP-generator eller SMS. <p> Denne side giver dig mulighed for at vælge en godkendelsesudbyder til Webmin-brugere på dit system. Når den er aktiveret, kan hver bruger derefter tilmelde sig to-faktor i <b>Webmin-brugermodulet</b> . De tilgængelige tofaktorudbydere er: <dl><dt> <b>Authy</b> <dd> Dette er en kommerciel service, der leverer en smartphone-app og et websted til styring af to-faktor-brugere. Hver bruger skal oprette en konto på Authys websted og linke den til deres smartphone. <p><dt> <b>Google Authenticator</b> <dd> Dette er en smartphone-app, der implementerer standard TOTP-protokollen. Hver bruger skal scanne en QR-kode vha. Appen for at linke deres tokens med Webmin-serveren. <p></dl><footer>
<header>To-faktor-godkendelse</header> To-faktor-godkendelse tilføjer et ekstra lag af sikkerhed til en Webmin-konto. Når det er aktiveret, skal brugeren indtaste et engangsgodkendelsestoken, der normalt genereres af en app, en hardware OTP-enhed eller sendes via SMS.<p> Denne side giver dig mulighed for at vælge en godkendelsesudbyder for Webmin-brugere på dit system. Når den er aktiveret, kan hver bruger tilmelde sig to-faktor-godkendelse i modulet &quot;Webmin-brugere&quot;. De tilgængelige to-faktor udbydere er:<ul><li> <b>TOTP Authenticator</b><br> Dette er en desktop- eller smartphone-app, der implementerer standard TOTP-protokollen. Hver bruger skal scanne en QR-kode ved hjælp af appen for at forbinde deres tokens med Webmin-serveren.</li><li> <b>Authy</b><br> Dette er en kommerciel tjeneste, der leverer en smartphone-app og et websted til styring af tofaktorbrugere. Hver bruger skal oprette en konto på Authys hjemmeside og knytte den til deres smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header>Zwei-Faktor-Authentifizierung</header>Die Zwei-Faktor-Authentifizierung kann verwendet werden, um ein zusätzliches Sicherheitselement zu einem Webmin-Konto hinzuzufügen, neben dem normalen Benutzernamen und Passwort. Wenn sie aktiviert ist, muss der Benutzer ein zusätzliches Authentifizierungs-Token angeben, das typischerweise von einer Smartphone-App, einem Hardware-OTP-Generator oder SMS stammt.<p>Diese Seite ermöglicht es Ihnen, einen Authentifizierungsanbieter für Webmin-Benutzer:innen auf Ihrem System auszuwählen. Nach der Aktivierung kann sich jeder Benutzer:in im Modul <b>Webmin-Benutzer:innen</b> für die Zwei-Faktor-Authentifizierung anmelden. Die verfügbaren Zwei-Faktor-Anbieter sind:<dl><dt><b>Authy</b><dd>Dies ist ein kommerzieller Dienst, der eine Smartphone-App und eine Website zur Verwaltung von Zwei-Faktor-Benutzern bereitstellt. Jeder Benutzer muss ein Konto auf der Authy-Website erstellen und es mit seinem Smartphone verknüpfen.<p><dt><b>Google Authenticator</b><dd>Dies ist eine Smartphone-App, die das standardmäßige TOTP-Protokoll implementiert. Jeder Benutzer muss einen QR-Code mit der App scannen, um seine Tokens mit dem Webmin-Server zu verknüpfen.<p></dl><footer>
<header>Zwei-Faktor-Authentifizierung</header>Die Zwei-Faktor-Authentifizierung bietet eine zusätzliche Sicherheitsebene für ein Webmin-Konto. Wenn sie aktiviert ist, muss der/die Benutzer:in ein einmaliges Authentifizierungs-Token eingeben dieses wird in der Regel von einer App, einem Hardware-OTP-Gerät oder per SMS generiert.<p>Auf dieser Seite können Sie einen Authentifizierungsanbieter für Webmin-Benutzer:innen auf Ihrem System auswählen. Nach der Aktivierung kann sich jede:r Benutzer:in im Modul Webmin-Benutzer:innen für die Zwei-Faktor-Authentifizierung registrieren. Die verfügbaren Zwei-Faktor-Anbieter sind:<ul><li><b>TOTP-Authenticator</b><br>Dies ist eine Desktop- oder Smartphone-App, die das standardisierte TOTP-Protokoll implementiert. Jede:r Benutzer:in muss mit der App einen QR-Code scannen, um die Token mit dem Webmin-Server zu verknüpfen.</li><li><b>Authy</b><br>Dies ist ein kommerzieller Dienst, der eine Smartphone-App und eine Website zur Verwaltung von Zwei-Faktor-Benutzer:innen bereitstellt. Jede:r Benutzer:in muss ein Konto auf der Authy-Website erstellen und dieses mit dem eigenen Smartphone verknüpfen.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Έλεγχος ταυτότητας δύο παραγόντων </header> Ο έλεγχος ταυτότητας δύο παραγόντων μπορεί να χρησιμοποιηθεί για να προσθέσετε ένα επιπλέον επίπεδο ασφάλειας σε έναν λογαριασμό Webmin, καθώς και το κανονικό όνομα χρήστη και τον κωδικό πρόσβασης. Όταν είναι ενεργοποιημένος, ένας χρήστης θα πρέπει να παρέχει ένα επιπλέον διακριτικό ελέγχου ταυτότητας που συνήθως προέρχεται από μια εφαρμογή smartphone, μια γεννήτρια OTP υλικού ή SMS. <p> Αυτή η σελίδα σάς επιτρέπει να επιλέξετε έναν πάροχο ελέγχου ταυτότητας για χρήστες Webmin στο σύστημά σας. Μόλις ενεργοποιηθεί, κάθε χρήστης μπορεί στη συνέχεια να εγγραφεί για δύο παράγοντες στη λειτουργική μονάδα <b>Webmin Users</b> . Οι διαθέσιμοι πάροχοι δύο παραγόντων είναι: <dl><dt> <b>Αυθεντικά</b> <dd> Πρόκειται για μια εμπορική υπηρεσία που παρέχει μια εφαρμογή smartphone και έναν ιστότοπο για τη διαχείριση χρηστών δύο παραγόντων. Κάθε χρήστης πρέπει να δημιουργήσει έναν λογαριασμό στον ιστότοπο της Authy και να τον συνδέσει με το smartphone του. <p><dt> <b>Επαληθευτής Google</b> <dd> Πρόκειται για μια εφαρμογή smartphone που εφαρμόζει το τυπικό πρωτόκολλο TOTP. Κάθε χρήστης πρέπει να σαρώσει έναν κωδικό QR χρησιμοποιώντας την εφαρμογή για να συνδέσει τα διακριτικά του με τον διακομιστή Webmin. <p></dl><footer>
<header>Έλεγχος ταυτότητας δύο παραγόντων</header> Ο έλεγχος ταυτότητας δύο παραγόντων προσθέτει ένα επιπλέον επίπεδο ασφάλειας σε έναν λογαριασμό Webmin. Όταν είναι ενεργοποιημένο, ο χρήστης πρέπει να εισαγάγει ένα διακριτικό ελέγχου ταυτότητας μίας χρήσης που συνήθως δημιουργείται από μια εφαρμογή, μια συσκευή OTP υλικού ή αποστέλλεται μέσω SMS.<p> Αυτή η σελίδα σάς επιτρέπει να επιλέξετε έναν πάροχο ελέγχου ταυτότητας για χρήστες Webmin στο σύστημά σας. Αφού ενεργοποιηθεί, κάθε χρήστης μπορεί να εγγραφεί για έλεγχο ταυτότητας δύο παραγόντων στη λειτουργική μονάδα &quot;Χρήστες Webmin&quot;. Οι διαθέσιμοι πάροχοι δύο παραγόντων είναι:<ul><li> <b>Επαληθευτής TOTP</b><br> Αυτή είναι μια εφαρμογή για επιτραπέζιους υπολογιστές ή smartphone που εφαρμόζει το τυπικό πρωτόκολλο TOTP. Κάθε χρήστης πρέπει να σαρώσει έναν κωδικό QR χρησιμοποιώντας την εφαρμογή για να συνδέσει τα διακριτικά του με τον διακομιστή Webmin.</li><li> <b>Authy</b><br> Αυτή είναι μια εμπορική υπηρεσία που παρέχει μια εφαρμογή και ιστότοπο για smartphone για τη διαχείριση χρηστών δύο παραγόντων. Κάθε χρήστης πρέπει να δημιουργήσει έναν λογαριασμό στον ιστότοπο της Authy και να τον συνδέσει με το smartphone του.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Autenticación de dos factores </header> La autenticación de dos factores se puede usar para agregar una capa adicional de seguridad a una cuenta de Webmin, así como el nombre de usuario y contraseña normales. Cuando está habilitado, un usuario deberá proporcionar un token de autenticación adicional que generalmente proviene de una aplicación de teléfono inteligente, generador de OTP de hardware o SMS. <p> Esta página le permite seleccionar un proveedor de autenticación para usuarios de Webmin en su sistema. Una vez habilitado, cada usuario puede inscribirse para dos factores en el módulo <b>Usuarios de Webmin</b> . Los proveedores de dos factores disponibles son: <dl><dt> <b>Authy</b> <dd> Este es un servicio comercial que proporciona una aplicación de teléfono inteligente y un sitio web para administrar usuarios de dos factores. Cada usuario debe crear una cuenta en el sitio web de Authy y vincularla a su teléfono inteligente. <p><dt> <b>Autenticador de Google</b> <dd> Esta es una aplicación para teléfonos inteligentes que implementa el protocolo TOTP estándar. Cada usuario debe escanear un código QR utilizando la aplicación para vincular sus tokens con el servidor Webmin. <p></dl><footer>
<header>Autenticación de dos factores</header> La autenticación de dos factores añade una capa adicional de seguridad a una cuenta de Webmin. Al activarse, el usuario debe introducir un token de autenticación de un solo uso, generalmente generado por una aplicación, un dispositivo OTP de hardware o enviado por SMS.<p> Esta página le permite seleccionar un proveedor de autenticación para los usuarios de Webmin en su sistema. Una vez habilitada, cada usuario puede registrarse para la autenticación de dos factores en el módulo &quot;Usuarios de Webmin&quot;. Los proveedores de autenticación de dos factores disponibles son:<ul><li> <b>Autenticador TOTP</b><br> Esta es una aplicación para computadoras de escritorio o teléfonos inteligentes que implementa el protocolo TOTP estándar. Cada usuario debe escanear un código QR con la aplicación para vincular sus tokens con el servidor Webmin.</li><li> <b>Authy</b><br> Este es un servicio comercial que ofrece una aplicación para smartphones y un sitio web para gestionar usuarios con autenticación de dos factores. Cada usuario debe crear una cuenta en el sitio web de Authy y vincularla a su smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Bi faktoreen autentikazioa </header> Bi faktoreren autentikazioa erabil daiteke segurtasun geruza gehigarria Webmin kontu batean, baita ohiko erabiltzaile izena eta pasahitza ere. Gaituta dagoenean, erabiltzaileak smartphone aplikazio batetik, hardware OTP sorgailutik edo SMS batetik datorren autentikazio gehigarri bat eman beharko du. <p> Orrialde honek zure sisteman Webmin erabiltzaileentzako autentikazio hornitzaile bat hautatzeko aukera ematen du. Behin gaituta, erabiltzaile bakoitza bi faktoreren bila sar daiteke <b>Webmin Erabiltzaileen</b> moduluan. Bi faktore eskuragarri daude: <dl><dt> <b>Authy</b> <dd> Bi faktoreko erabiltzaileak kudeatzeko smartphone aplikazioa eta webgunea eskaintzen dituen zerbitzu komertziala da. Erabiltzaile bakoitzak kontu bat sortu behar du Authy-ren webgunean eta bere telefonoarekin lotu. <p><dt> <b>Google Authenticator</b> <dd> TOTP protokolo estandarra ezartzen duen smartphone aplikazioa da. Erabiltzaile bakoitzak QR kode bat eskaneatu behar du aplikazioa erabiliz bere tokenak Webmin zerbitzariarekin lotzeko. <p></dl><footer>
<header>Bi faktoreko autentifikazioa</header> Bi faktoreko autentifikazioak segurtasun-geruza gehigarri bat gehitzen dio Webmin kontu bati. Gaituta dagoenean, erabiltzaileak normalean aplikazio batek, hardware OTP gailu batek edo SMS bidez bidalitako behin-behineko autentifikazio-token bat sartu behar du.<p> Orrialde honek zure sistemako Webmin erabiltzaileentzako autentifikazio-hornitzaile bat hautatzeko aukera ematen du. Gaituta dagoenean, erabiltzaile bakoitzak bi faktoreko autentifikaziorako izena eman dezake &quot;Webmin Erabiltzaileak&quot; moduluan. Eskuragarri dauden bi faktoreen hornitzaileak hauek dira:<ul><li> <b>TOTP autentifikatzailea</b><br> Hau mahaigaineko edo telefono mugikorreko aplikazio bat da, TOTP protokolo estandarra ezartzen duena. Erabiltzaile bakoitzak QR kode bat eskaneatu behar du aplikazioa erabiliz bere tokenak Webmin zerbitzariarekin lotzeko.</li><li> <b>Authy</b><br> Bi faktoreko erabiltzaileak kudeatzeko smartphone-aren aplikazioa eta webgunea eskaintzen duen zerbitzu komertziala da. Erabiltzaile bakoitzak Authyren webgunean kontu bat sortu behar du eta bere telefonoarekin lotu.</li></ul><footer>

View File

@@ -1 +1 @@
<header> احراز هویت دو عاملی </header> از تأیید هویت دو عاملی می توان برای افزودن یک لایه امنیتی بیشتر به یک حساب وبمین و همچنین نام کاربری و رمزعبور معمولی استفاده کرد. در صورت فعال شدن ، یک کاربر باید یک شناسنامه اضافی تهیه کند که معمولاً از طریق یک برنامه تلفن هوشمند ، ژنراتور OTP سخت افزاری یا پیامک تهیه می شود. <p style=";text-align:right;direction:rtl"> این صفحه به شما امکان می دهد ارائه دهنده تأیید اعتبار را برای کاربران وبمین روی سیستم خود انتخاب کنید. پس از فعال کردن ، هر کاربر می تواند برای دو عامل در ماژول <b>کاربران وبمین</b> ثبت نام کند. ارائه دهندگان دو عاملی موجود عبارتند از: <dl style=";text-align:right;direction:rtl"><dt> <b>باطل</b> <dd> این یک سرویس تجاری است که یک برنامه تلفن همراه و وب سایت برای مدیریت کاربران دو عاملی فراهم می کند. هر کاربر باید یک حساب کاربری در وب سایت Authy ایجاد کند و آن را به تلفن هوشمند خود پیوند دهد. <p style=";text-align:right;direction:rtl"><dt> <b>Google Authenticator</b> <dd> این یک برنامه هوشمند است که پروتکل TOTP استاندارد را پیاده سازی می کند. هر کاربر باید کد QR را با استفاده از برنامه اسکن کند تا نشانه های خود را با سرور وبمین مرتبط کند. <p style=";text-align:right;direction:rtl"></dl><footer>
<header>احراز هویت دو مرحله ای</header> احراز هویت دو مرحله ای یک لایه امنیتی اضافی به حساب وبمین اضافه می کند. هنگامی که فعال است، کاربر باید یک رمز احراز هویت یک بار مصرف را وارد کند که معمولاً توسط یک برنامه، یک دستگاه OTP سخت افزاری تولید می شود یا از طریق پیامک ارسال می شود.<p style=";text-align:right;direction:rtl"> این صفحه به شما امکان می دهد یک ارائه دهنده احراز هویت برای کاربران وبمین در سیستم خود انتخاب کنید. پس از فعال شدن، هر کاربر می تواند برای احراز هویت دو مرحله ای در ماژول &quot;کاربران وبمین&quot; ثبت نام کند. ارائه دهندگان دو عاملی موجود عبارتند از:<ul style=";text-align:right;direction:rtl"><li style=";text-align:right;direction:rtl"> <b>TOTP Authenticator</b><br> این یک برنامه دسکتاپ یا گوشی هوشمند است که پروتکل استاندارد TOTP را پیاده سازی می کند. هر کاربر باید یک کد QR را با استفاده از برنامه اسکن کند تا توکن های خود را با سرور وبمین پیوند دهد.</li><li style=";text-align:right;direction:rtl"> <b>معتبر</b><br> این یک سرویس تجاری است که یک برنامه و وب سایت گوشی هوشمند را برای مدیریت کاربران دو عاملی ارائه می دهد. هر کاربر باید یک حساب کاربری در وب سایت Authy ایجاد کند و آن را به گوشی هوشمند خود پیوند دهد.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Kahden tekijän todennus </header> Kaksikerroista todennusta voidaan käyttää lisäämään ylimääräinen tietoturva Webmin-tilille sekä tavallinen käyttäjänimi ja salasana. Kun tämä asetus on käytössä, käyttäjän on annettava ylimääräinen todennustunnus, joka tyypillisesti tulee älypuhelinsovelluksesta, laitteiston OTP-generaattorista tai tekstiviestistä. <p> Tällä sivulla voit valita todentamispalvelun järjestelmän Webmin-käyttäjille. Kun se on otettu käyttöön, jokainen käyttäjä voi sitten ilmoittautua kaksikerroiseksi <b>Webmin-käyttäjien</b> moduuliin. Saatavilla olevat kaksi tekijää tarjoajat ovat: <dl><dt> <b>Authy</b> <dd> Tämä on kaupallinen palvelu, joka tarjoaa älypuhelinsovelluksen ja verkkosivun kahden tekijän käyttäjien hallintaan. Jokaisen käyttäjän on luotava tili Authyn verkkosivuilla ja linkitettävä se älypuhelimeen. <p><dt> <b>Google Authenticator</b> <dd> Tämä on älypuhelinsovellus, joka toteuttaa standardin TOTP-protokollan. Jokaisen käyttäjän on skannattava QR-koodi sovelluksen avulla linkittääkseen tunnuksensa Webmin-palvelimeen. <p></dl><footer>
<header>Kaksitekijäinen todennus</header> Kaksivaiheinen todennus lisää Webmin-tiliin ylimääräisen suojauskerroksen. Kun tämä on käytössä, käyttäjän on syötettävä kertaluonteinen todennustunnus, jonka yleensä luo sovellus, laitteisto OTP-laite tai lähetetään tekstiviestillä.<p> Tällä sivulla voit valita todennuspalvelun Webmin-käyttäjille järjestelmässäsi. Kun se on otettu käyttöön, jokainen käyttäjä voi rekisteröityä kaksivaiheiseen todennustilaan &quot;Webmin Users&quot; -moduulissa. Käytettävissä olevat kaksitekijäiset toimittajat ovat:<ul><li> <b>TOTP Authenticator</b><br> Tämä on työpöytä- tai älypuhelinsovellus, joka toteuttaa standardin TOTP-protokollan. Jokaisen käyttäjän on skannattava QR-koodi sovelluksella linkittääkseen tunnuksensa Webmin-palvelimeen.</li><li> <b>Authy</b><br> Tämä on kaupallinen palvelu, joka tarjoaa älypuhelinsovelluksen ja -sivuston kahden tekijän käyttäjien hallintaan. Jokaisen käyttäjän on luotava tili Authyn verkkosivuilla ja linkitetvä se älypuhelimeesi.</li></ul><footer>

View File

@@ -0,0 +1 @@
<header>Authentification à deux facteurs</header> L&#39;authentification à deux facteurs renforce la sécurité d&#39;un compte Webmin. Lorsqu&#39;elle est activée, l&#39;utilisateur doit saisir un jeton d&#39;authentification à usage unique, généralement généré par une application, un dispositif OTP matériel ou envoyé par SMS.<p> Cette page vous permet de sélectionner un fournisseur d&#39;authentification pour les utilisateurs Webmin de votre système. Une fois cette option activée, chaque utilisateur peut s&#39;inscrire à l&#39;authentification à deux facteurs dans le module « Utilisateurs Webmin ». Les fournisseurs d&#39;authentification à deux facteurs disponibles sont :<ul><li> <b>Authentificateur TOTP</b><br> Il s&#39;agit d&#39;une application pour ordinateur ou smartphone qui implémente le protocole TOTP standard. Chaque utilisateur doit scanner un code QR avec l&#39;application pour lier ses jetons au serveur Webmin.</li><li> <b>Authy</b><br> Il s&#39;agit d&#39;un service commercial proposant une application pour smartphone et un site web permettant de gérer les utilisateurs utilisant la double authentification. Chaque utilisateur doit créer un compte sur le site web d&#39;Authy et l&#39;associer à son smartphone.</li></ul><footer>

View File

@@ -1,16 +0,0 @@
<header>Authentification à deux facteurs</header>
L&#39;authentification à deux facteurs peut être utilisée pour ajouter une couche de sécurité supplémentaire à un compte Webmin, ainsi que le nom d&#39;utilisateur et le mot de passe habituels.<br>
Lorsqu&#39;il est activé, un utilisateur devra fournir un jeton d&#39;authentification supplémentaire qui provient généralement d&#39;une application pour smartphone, d&#39;un générateur OTP matériel ou d&#39;un SMS.<br>
Cette page vous permet de sélectionner un fournisseur d'authentification pour les utilisateurs Webmin sur votre système.<br>
Une fois activé, chaque utilisateur peut alors s&#39;inscrire pour deux facteurs dans le module <b>Utilisateurs Webmin</b>.<br>
Les fournisseurs à deux facteurs disponibles sont:<br>
<dl>
<dt><br>
<b>Authy</b>
<dd>Il s&#39;agit d&#39;un service commercial qui fournit une application pour smartphone et un site Web pour gérer les utilisateurs à deux facteurs.<br>
Chaque utilisateur doit créer un compte sur le site Web d'Authy et le lier à son smartphone.<br>
<dt><br>
<b>Google Authenticator</b>
<dd>Il s'agit d'une application pour smartphone qui implémente le protocole TOTP standard.<br>
Chaque utilisateur doit scanner un code QR à l'aide de l'application pour lier ses jetons au serveur Webmin.<br>
</dl>

View File

@@ -1 +1 @@
<header> Dvofaktorska provjera autentičnosti </header> Dvofaktorska provjera identiteta može se koristiti za dodavanje dodatnog sloja sigurnosti Webmin računu, kao i uobičajeno korisničko ime i lozinku. Kad je omogućeno, korisnik će morati osigurati dodatni žeton za provjeru autentičnosti koji obično dolazi iz aplikacije za pametne telefone, hardvera OTP generatora ili SMS-a. <p> Ova vam stranica omogućuje odabir davatelja autentifikacije za korisnike Webmin-a na vašem sustavu. Nakon aktiviranja svaki se korisnik tada može prijaviti za dva faktora u modulu <b>Webmin korisnici</b> . Dostupni pružatelji dva faktora su: <dl><dt> <b>Authy</b> <dd> Ovo je komercijalna usluga koja pruža aplikaciju za pametne telefone i web mjesto za upravljanje korisnicima s dva faktora. Svaki korisnik mora stvoriti račun na web lokaciji Authy i povezati ga sa svojim pametnim telefonom. <p><dt> <b>Google Autentifikator</b> <dd> Ovo je pametna aplikacija koja implementira standardni TOTP protokol. Svaki korisnik mora skenirati QR kôd pomoću aplikacije kako bi povezao svoje tokene s Webmin poslužiteljem. <p></dl><footer>
<header>Autentifikacija u dva faktora</header> Dvofaktorska autentifikacija dodaje dodatni sloj sigurnosti Webmin računu. Kada je omogućeno, korisnik mora unijeti jednokratni token za autentifikaciju koji obično generira aplikacija, hardverski OTP uređaj ili se šalje putem SMS-a.<p> Ova vam stranica omogućuje odabir pružatelja usluge provjere autentičnosti za korisnike Webmina na vašem sustavu. Nakon što je omogućeno, svaki se korisnik može prijaviti za dvofaktorsku autentifikaciju u modulu &quot;Webmin Users&quot;. Dostupni dvofaktorski pružatelji usluga su:<ul><li> <b>TOTP autentifikator</b><br> Ovo je aplikacija za stolna računala ili pametne telefone koja implementira standardni TOTP protokol. Svaki korisnik mora skenirati QR kod pomoću aplikacije kako bi povezao svoje tokene s Webmin poslužiteljem.</li><li> <b>Authy</b><br> Ovo je komercijalna usluga koja pruža aplikaciju za pametne telefone i web mjesto za upravljanje dvofaktorskim korisnicima. Svaki korisnik mora kreirati račun na web stranici Authyja i povezati ga sa svojim pametnim telefonom.</li></ul><footer>

View File

@@ -1,26 +1,26 @@
<header>Two-Factor Authentication</header>
Two-factor authentication can be used to add an extra layer of security
to a Webmin account, as well as the regular username and password. When enabled,
a user will need to provide an extra authentication token which typically
comes from a smartphone app, hardware OTP generator or SMS. <p>
Two-factor authentication adds an extra layer of security to a Webmin account.
When enabled, the user must enter a one-time authentication token—usually
generated by an app, a hardware OTP device, or sent via SMS. <p>
This page allows you to select an authentication provider for Webmin users
on your system. Once enabled, each user can then enroll for two-factor
in the <b>Webmin Users</b> module. The available two-factor providers are :
<dl>
<dt><b>Authy</b>
<dd>This is a commercial service that provides a smartphone app and website
for managing two-factor users. Each user must create an account on Authy's
website and link it to their smartphone. <p>
<dt><b>Google Authenticator</b>
<dd>This is a smartphone app that implements the standard TOTP protocol. Each
user must scan a QR code using the app to link their tokens with the
Webmin server. <p>
</dl>
on your system. Once enabled, each user can enroll for two-factor
authentication in the "Webmin Users" module. The available two-factor
providers are:
<ul>
<li>
<b>TOTP Authenticator</b><br>
This is a desktop or smartphone app that
implements the standard TOTP protocol. Each user must scan a QR code using
the app to link their tokens with the Webmin server.
</li>
<li>
<b>Authy</b><br>
This is a commercial service that provides a smartphone app and
website for managing two-factor users. Each user must create an account on
Authy's website and link it to their smartphone.
</li>
</ul>
<footer>

View File

@@ -1 +1 @@
<header> Két tényezős hitelesítés </header> Két tényezős hitelesítés használható egy extra biztonsági szint hozzáadására a Webmin-fiókhoz, valamint a szokásos felhasználónévhez és jelszóhoz. Ha engedélyezve van, a felhasználónak külön hitelesítési jogkivonatot kell biztosítania, amely általában okostelefon-alkalmazásból, hardver OTP generátorból vagy SMS-ből származik. <p> Ezen az oldalon kiválaszthatja a hitelesítési szolgáltatót a rendszer Webmin felhasználói számára. Ha engedélyezve van, akkor minden felhasználó beléphet két tényezőbe a <b>Webmin felhasználók</b> modulban. A rendelkezésre álló két tényezővel rendelkező szolgáltatók: <dl><dt> <b>Authy</b> <dd> Ez egy olyan kereskedelmi szolgáltatás, amely okostelefon-alkalmazást és weboldalt biztosít a két tényezővel rendelkező felhasználók kezelésére. Minden felhasználónak létre kell hoznia egy fiókot az Authy webhelyén, és össze kell kapcsolnia azt okostelefonjával. <p><dt> <b>Google Authenticator</b> <dd> Ez egy okostelefon alkalmazás, amely végrehajtja a szokásos TOTP protokollt. Minden felhasználónak be kell szkennelnie egy QR-kódot az alkalmazás segítségével, hogy összekapcsolja tokeneit a Webmin szerverrel. <p></dl><footer>
<header>Kéttényezős hitelesítés</header> A kéttényezős hitelesítés további biztonsági réteget ad a Webmin-fióknak. Ha engedélyezve van, a felhasználónak meg kell adnia egy egyszeri hitelesítési tokent, amelyet általában egy alkalmazás, egy hardveres OTP-eszköz generál, vagy SMS-ben küld el.<p> Ezen az oldalon választhat hitelesítési szolgáltatót a Webmin felhasználói számára a rendszeren. Ha engedélyezve van, minden felhasználó regisztrálhat kétfaktoros hitelesítésre a „Webmin Users” modulban. Az elérhető kéttényezős szolgáltatók a következők:<ul><li> <b>TOTP hitelesítő</b><br> Ez egy asztali vagy okostelefon-alkalmazás, amely megvalósítja a szabványos TOTP protokollt. Minden felhasználónak be kell olvasnia egy QR-kódot az alkalmazás segítségével, hogy összekapcsolja tokenjeit a Webmin szerverrel.</li><li> <b>Authy</b><br> Ez egy kereskedelmi szolgáltatás, amely okostelefonos alkalmazást és weboldalt biztosít a kétfaktoros felhasználók kezeléséhez. Minden felhasználónak létre kell hoznia egy fiókot az Authy webhelyén, és össze kell kapcsolnia okostelefonjával.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Autenticazione a due fattori </header> L&#39;autenticazione a due fattori può essere utilizzata per aggiungere un ulteriore livello di sicurezza a un account Webmin, nonché il nome utente e la password regolari. Se abilitato, un utente dovrà fornire un token di autenticazione aggiuntivo che in genere proviene da un&#39;app per smartphone, un generatore OTP hardware o SMS. <p> Questa pagina consente di selezionare un provider di autenticazione per gli utenti Webmin sul proprio sistema. Una volta abilitato, ogni utente può quindi registrarsi per due fattori nel modulo <b>Utenti Webmin</b> . I provider a due fattori disponibili sono: <dl><dt> <b>Authy</b> <dd> Questo è un servizio commerciale che fornisce un&#39;app per smartphone e un sito Web per la gestione di utenti a due fattori. Ogni utente deve creare un account sul sito Web di Authy e collegarlo al proprio smartphone. <p><dt> <b>Google Authenticator</b> <dd> Questa è un&#39;app per smartphone che implementa il protocollo TOTP standard. Ogni utente deve eseguire la scansione di un codice QR utilizzando l&#39;app per collegare i propri token al server Webmin. <p></dl><footer>
<header>Autenticazione a due fattori</header> L&#39;autenticazione a due fattori aggiunge un ulteriore livello di sicurezza a un account Webmin. Quando abilitata, l&#39;utente deve immettere un token di autenticazione monouso, solitamente generato da un&#39;app, un dispositivo hardware OTP o inviato tramite SMS.<p> Questa pagina consente di selezionare un provider di autenticazione per gli utenti Webmin sul sistema. Una volta abilitato, ogni utente può registrarsi per l&#39;autenticazione a due fattori nel modulo &quot;Utenti Webmin&quot;. I provider a due fattori disponibili sono:<ul><li> <b>Autenticatore TOTP</b><br> Questa è un&#39;app per desktop o smartphone che implementa il protocollo TOTP standard. Ogni utente deve scansionare un codice QR utilizzando l&#39;app per collegare i propri token al server Webmin.</li><li> <b>Autenticità</b><br> Si tratta di un servizio commerciale che fornisce un&#39;app per smartphone e un sito Web per la gestione degli utenti a due fattori. Ogni utente deve creare un account sul sito Web di Authy e collegarlo al proprio smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header>要素認証</header> 2要素認証を使用して、通常のユーザー名とパスワードだけでなく、Webminアカウントにセキュリティの層を追加できます。有効にすると、ユーザーは通常、スマートフォンアプリ、ハードウェアOTPジェネレーター、またはSMSから取得する追加の認証トークンを提供する必要があります。 <p>このページでは、システム上のWebminユーザーの認証プロバイダーを選択できます。有効にすると、各ユーザーは<b>Webminユーザー</b>モジュールで2要素に登録できます。用可能な2要素プロバイダーは次のとおりです。 <dl><dt> <b>Authy</b> <dd>これは、二要素ユーザーを管理するためのスマートフォンアプリとWebサイトを提供する商用サービスです。各ユーザーは、AuthyのWebサイトでアカウントを作成し、スマートフォンにリンクする必要があります。 <p><dt> <b>Googleオーセンティケータ</b> <dd>これは、標準のTOTPプロトコルを実装するスマートフォンアプリです。各ユーザーはアプリを使用してQRコードをスキャンし、トークンをWebminサーバーにリンクする必要があります。 <p></dl><footer>
<header>2要素認証</header>2 要素認証、Webmin アカウントにセキュリティの層を追加ます。有効にすると、ユーザーは通常、アプリ、ハードウェア OTP デバイスによって生成されるか、SMS 経由で送信されるワンタイム認証トークンを入力する必要があります。<p>このページでは、システム上の Webmin ユーザーの認証プロバイダーを選択できます。有効にすると、各ユーザーはWebmin ユーザー」モジュールで 2 要素認証を登録できます。使用可能な 2 要素プロバイダーは次のとおりです。<ul><li> <b>TOTP 認証システム</b><br>これは、標準の TOTP プロトコルを実装するデスクトップまたはスマートフォン アプリです。各ユーザーは、アプリを使用して QR コードをスキャンし、トークンを Webmin サーバーにリンクする必要があります。</li><li><b>オーシ</b><br>これは、2 要素認証ユーザーを管理するためのスマートフォン アプリと Web サイトを提供する商用サービスです。各ユーザーは、Authy の Web サイトでアカウントを作成し、それをスマートフォンにリンクする必要があります。</li></ul><footer>

View File

@@ -1 +1 @@
<header> 2 단계 인증 </header> 2 단계 인증을 사용하면 Webmin 계정과 일반 사용자 이름 및 비밀번호에 보안 계층을 추가 할 수 있습니다. 활성화되면 사용자는 일반적으로 스마트 폰 앱, 하드웨어 OTP 생성기 또는 SMS에서 제공되는 추가 인증 토큰을 제공해야합니다. <p> 이 페이지에서 시스템의 Webmin 사용자를위한 인증 공급자를 선택할 수 있습니다. 활성화되면 각 사용자는 <b>Webmin 사용자</b> 모듈에 2 단계 등록 할 수 있습니다. 사용 가능한 2 단계 공급자는 다음과 같습니다. <dl><dt> <b>Authy</b> <dd> 2 단계 사용자를 관리하기위한 스마트 폰 앱 및 웹 사이트를 제공하는 상용 서비스입니다. 각 사용자는 Authy 웹 사이트에서 계정을 만들어 스마트 폰에 연결해야합니다. <p><dt> <b>구글 인증 기</b> <dd> 표준 TOTP 프로토콜을 구현하는 스마트 폰 앱입니다. 각 사용자는 앱을 사용하여 QR 코드를 스캔하여 토큰을 Webmin 서버와 연결해야합니다. <p></dl><footer>
<header>2단계 인증</header> 2단계 인증 Webmin 계정에 보안 계층을 추가니다. 활성화된 경우 사용자는 일반적으로 앱, 하드웨어 OTP 장치에서 생성되거나 SMS를 통해 전송되는 일회성 인증 토큰을 입력해야 합니다.<p> 이 페이지에서 시스템의 Webmin 사용자에 대한 인증 공급자를 선택할 수 있습니다. 활성화되면 각 사용자는 &quot;Webmin 사용자&quot; 모듈에 2단계 인증에 등록할 수 있습니다. 사용 가능한 2단계 공급자는 다음과 같습니다.<ul><li> <b>TOTP 인증기</b><br> 이것은 표준 TOTP 프로토콜을 구현하는 데스크톱 또는 스마트폰 앱입니다. 각 사용자는 앱을 사용하여 QR 코드를 스캔하여 토큰을 Webmin 서버와 연결해야 합니다.</li><li> <b>인증</b><br> 이것은 2단계 인증 사용자를 관리하기 위한 스마트폰 앱과 웹사이트를 제공하는 상업적 서비스입니다. 각 사용자는 Authy 웹사이트에서 계정을 만들고 스마트폰에 연결해야 합니다.</li></ul><footer>

View File

@@ -0,0 +1 @@
<header>Pengesahan Dua Faktor</header> Pengesahan dua faktor menambah lapisan keselamatan tambahan pada akaun Webmin. Apabila didayakan, pengguna mesti memasukkan token pengesahan sekali yang biasanya dijana oleh aplikasi, peranti OTP perkakasan atau dihantar melalui SMS.<p> Halaman ini membolehkan anda memilih pembekal pengesahan untuk pengguna Webmin pada sistem anda. Setelah didayakan, setiap pengguna boleh mendaftar untuk pengesahan dua faktor dalam modul &quot;Pengguna Webmin&quot;. Pembekal dua faktor yang tersedia ialah:<ul><li> <b>Pengesah TOTP</b><br> Ini ialah aplikasi desktop atau telefon pintar yang melaksanakan protokol TOTP standard. Setiap pengguna mesti mengimbas kod QR menggunakan aplikasi untuk memautkan token mereka dengan pelayan Webmin.</li><li> <b>Authy</b><br> Ini adalah perkhidmatan komersial yang menyediakan aplikasi telefon pintar dan tapak web untuk mengurus pengguna dua faktor. Setiap pengguna mesti membuat akaun di tapak web Authy dan memautkannya ke telefon pintar mereka.</li></ul><footer>

View File

@@ -1,24 +0,0 @@
<header>Pengesahan Dua-Faktor</header>
Pengesahan dua-faktor boleh digunakan untuk menambah lapisan keselamatan tambahan
pada akaun Webmin, juga kepada pengguna dan kata laluan biasa. Apabila diaktifkan,
pengguna perlu untuk menyediakan token pengesahan tambahan yang biasanya
datang dari aplikasi telefon pintar, perkakasanpenjana OTP atau SMS.<p>
Laman ini membolehkan anda untuk memilih pembekal pengesahan untuk pengguna Webmin
pada sistem anda. Sebaik sahaja diaktifkan, setiap pengguna boleh mendaftar untuk dua-faktor
dalam modul <b>Webmin Pengguna</b>. Pembekal dua-faktor yang sedia ada ialah:
<dl>
<dt><b>Authy</b></dt>
<dd>Ini adalah perkhidmatan komersial yang menyediakan aplikasi telefon pintar dan laman web
     untuk menguruskan pengguna dua-faktor. Setiap pengguna perlu mewujudkan akaun pada laman web Authy dan menghubungkan kepada telefon pintar mereka. <p></dd>
<dt><b>Pengesah Google</b></dt>
<dd>Ini adalah satu aplikasi telefon pintar yang melaksanakan protokol TOTP standard. setiap
     pengguna perlu mengimbas kod QR dengan menggunakan aplikasi bagi menghubungkan token mereka dengan Pelayan Webmin. <p></dd>
</dl>
<footer>

View File

@@ -1 +1 @@
<header> Twee-factorenauthenticatie </header> Tweefactorauthenticatie kan worden gebruikt om een extra beveiligingslaag toe te voegen aan een Webmin-account, evenals de normale gebruikersnaam en wachtwoord. Indien ingeschakeld, moet een gebruiker een extra authenticatietoken verstrekken die doorgaans afkomstig is van een smartphone-app, hardware-OTP-generator of sms. <p> Op deze pagina kunt u een authenticatieleverancier selecteren voor Webmin-gebruikers op uw systeem. Eenmaal ingeschakeld, kan elke gebruiker zich vervolgens inschrijven voor twee factoren in de module <b>Webmin-gebruikers</b> . De beschikbare tweeledige providers zijn: <dl><dt> <b>Authy</b> <dd> Dit is een commerciële dienst die een smartphone-app en website biedt voor het beheer van twee-factorgebruikers. Elke gebruiker moet een account maken op de website van Authy en deze koppelen aan zijn smartphone. <p><dt> <b>Google Authenticator</b> <dd> Dit is een smartphone-app die het standaard TOTP-protocol implementeert. Elke gebruiker moet een QR-code scannen met behulp van de app om zijn tokens aan de Webmin-server te koppelen. <p></dl><footer>
<header>Twee-factorauthenticatie</header> Twee-factorauthenticatie voegt een extra beveiligingslaag toe aan een Webmin-account. Wanneer ingeschakeld, moet de gebruiker een eenmalige authenticatietoken invoeren die meestal wordt gegenereerd door een app, een hardware-OTP-apparaat of wordt verzonden via sms.<p> Op deze pagina kunt u een authenticatieprovider selecteren voor Webmin-gebruikers op uw systeem. Zodra dit is ingeschakeld, kan elke gebruiker zich inschrijven voor tweefactorauthenticatie in de module &quot;Webmin-gebruikers&quot;. De beschikbare tweefactorproviders zijn:<ul><li> <b>TOTP-authenticator</b><br> Dit is een desktop- of smartphone-app die het standaard TOTP-protocol implementeert. Elke gebruiker moet een QR-code scannen met de app om hun tokens te koppelen aan de Webmin-server.</li><li> <b>authentiek</b><br> Dit is een commerciële service die een smartphone-app en website biedt voor het beheren van two-factor-gebruikers. Elke gebruiker moet een account aanmaken op de website van Authy en deze koppelen aan zijn smartphone.</li></ul><footer>

View File

@@ -0,0 +1 @@
<header>Tofaktorautentisering</header> Tofaktorautentisering legger til et ekstra lag med sikkerhet til en Webmin-konto. Når aktivert, må brukeren angi et engangsgodkjenningstoken som vanligvis genereres av en app, en maskinvare-OTP-enhet eller sendes via SMS.<p> Denne siden lar deg velge en autentiseringsleverandør for Webmin-brukere på systemet ditt. Når den er aktivert, kan hver bruker registrere seg for tofaktorautentisering i &quot;Webmin-brukere&quot;-modulen. De tilgjengelige tofaktorleverandørene er:<ul><li> <b>TOTP Authenticator</b><br> Dette er en desktop- eller smarttelefonapp som implementerer standard TOTP-protokoll. Hver bruker må skanne en QR-kode ved å bruke appen for å koble sine tokens til Webmin-serveren.</li><li> <b>Authy</b><br> Dette er en kommersiell tjeneste som tilbyr en smarttelefonapp og et nettsted for å administrere tofaktorbrukere. Hver bruker må opprette en konto på Authys nettside og koble den til sin smarttelefon.</li></ul><footer>

View File

@@ -1,26 +0,0 @@
<header>To-faktor autentisering</header>
To-faktor autentisering kan brukes til å legge til et ekstra lag med sikkerhet
til en Webmin konto, i tillegg til ordinært brukernavn og passord. Når den er aktivert,
må en bruker angi et ekstra godkjenningstoken som typisk
kommer fra en smarttelefon-app, maskinvare OTP generator eller SMS. <p>
Denne siden lar deg velge en godkjenningsleverandør for Webmin brukere
på systemet. Når aktivert, kan hver bruker deretter melde seg på to-faktor
i <b> Webmin Brukere </ b> modulen. De tilgjengelige to-faktor-leverandører er :
<dl>
<dt><b>Authy</b>
<dd>Dette er en kommersiell tjeneste som gir en smarttelefon-app og nettside
     for å håndtere to-faktor brukere. Hver bruker må opprette en konto på Authy s
     nettside og koble det til sin smarttelefon. <p>
<dt><b>Google Authenticator</b>
<dd>Dette er en smarttelefon-app som implementerer standarden TOTP protokollen. Hver
     Brukeren må skanne en QR-kode ved hjelp av appen for å koble sine tokens med
     Webmin serveren.<p>
</dl>
<footer>

View File

@@ -0,0 +1 @@
<header>Uwierzytelnianie dwuskładnikowe</header> Uwierzytelnianie dwuskładnikowe dodaje dodatkową warstwę zabezpieczeń do konta Webmin. Po włączeniu użytkownik musi wprowadzić jednorazowy token uwierzytelniający, zwykle generowany przez aplikację, sprzętowe urządzenie OTP lub wysyłany za pośrednictwem wiadomości SMS.<p> Ta strona umożliwia wybranie dostawcy uwierzytelniania dla użytkowników Webmin w systemie. Po włączeniu każdy użytkownik może zapisać się na uwierzytelnianie dwuskładnikowe w module „Użytkownicy Webmin”. Dostępni dostawcy uwierzytelniania dwuskładnikowego to:<ul><li> <b>Uwierzytelniacz TOTP</b><br> Jest to aplikacja na komputer lub smartfon, która implementuje standardowy protokół TOTP. Każdy użytkownik musi zeskanować kod QR za pomocą aplikacji, aby połączyć swoje tokeny z serwerem Webmin.</li><li> <b>Authy</b><br> Jest to usługa komercyjna, która zapewnia aplikację na smartfony i witrynę internetową do zarządzania użytkownikami dwuskładnikowymi. Każdy użytkownik musi utworzyć konto na stronie internetowej Authy i połączyć je ze swoim smartfonem.</li></ul><footer>

View File

@@ -1,28 +0,0 @@
<header>Dwustopniowe uwierzytelnianie</header>
Dwustopniowe uwierzytelnianie pozwala na zwiększenie bezpieczeństwa logowanie
poprzez wprowadzenie dodatkowej weryfikacji. Po włączeniu użytkownik potrzebuje
dostawcy dwuskładnikowego/dwustopniowego uwierzytelniania, który dostarcza
token (kod) przez np. SMS.<p>
Ta strona pozwala na wybranie dostawcy uwierzytelniania dla użytkowników
Webmina na tym systemie. Po włączeniu każdy użytkownik może zarejestrować
się do dwustopniowego uwierzytelniania poprzez moduł <b>użytkownicy Webmina</b>
Dostępni dostawcy dwustopniowego uwierzytelniania:
<dl>
<dt><b>Authy</b>
<dd>Jest to aplikacja komercyjna. Dostarcza aplikację na smartfon i
stronę internetową do zarządzania. Każdy użytkownik musi utworzyć
konto na stronie Authy i połączeniu go ze swoim smartfonem.<p>
<dt><b>Google Authenticator</b>
<dd>Jest to aplikacja na smartfon, która implementuje standardowy protokół
TOTP. Każdy użytkownik musi zeskanować kod QR korzystając z aplikacji, aby
połączyć swój token z serwerem Webmina. <p>
</dl>
<footer>

View File

@@ -1 +1 @@
<header> Autenticação de dois fatores </header> A autenticação de dois fatores pode ser usada para adicionar uma camada extra de segurança a uma conta Webmin, além do nome de usuário e senha regulares. Quando ativado, o usuário precisará fornecer um token de autenticação extra, geralmente proveniente de um aplicativo para smartphone, gerador de OTP de hardware ou SMS. <p> Esta página permite selecionar um provedor de autenticação para usuários Webmin no seu sistema. Depois de ativado, cada usuário pode se inscrever para dois fatores no módulo <b>Usuários Webmin</b> . Os provedores de dois fatores disponíveis são: <dl><dt> <b>Authy</b> <dd> Este é um serviço comercial que fornece um aplicativo para smartphone e site para gerenciar usuários de dois fatores. Cada usuário deve criar uma conta no site da Authy e vinculá-la ao seu smartphone. <p><dt> <b>Google Authenticator</b> <dd> Este é um aplicativo para smartphone que implementa o protocolo TOTP padrão. Cada usuário deve escanear um código QR usando o aplicativo para vincular seus tokens ao servidor Webmin. <p></dl><footer>
<header>Autenticação de dois fatores</header> A autenticação de dois fatores adiciona uma camada extra de segurança a uma conta Webmin. Quando habilitada, o usuário deve inserir um token de autenticação único, geralmente gerado por um aplicativo, um dispositivo OTP de hardware ou enviado via SMS.<p> Esta página permite que você selecione um provedor de autenticação para usuários do Webmin no seu sistema. Uma vez habilitado, cada usuário pode se registrar para autenticação de dois fatores no módulo &quot;Usuários do Webmin&quot;. Os provedores de dois fatores disponíveis são:<ul><li> <b>Autenticador TOTP</b><br> Este é um aplicativo para desktop ou smartphone que implementa o protocolo TOTP padrão. Cada usuário deve escanear um código QR usando o aplicativo para vincular seus tokens ao servidor Webmin.</li><li> <b>Autor</b><br> Este é um serviço comercial que fornece um aplicativo para smartphone e um site para gerenciar usuários de dois fatores. Cada usuário deve criar uma conta no site da Authy e vinculá-la ao seu smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Autenticação de dois fatores </header> A autenticação de dois fatores pode ser usada para adicionar uma camada extra de segurança a uma conta Webmin, além do nome de usuário e senha regulares. Quando ativado, o usuário precisará fornecer um token de autenticação extra, geralmente proveniente de um aplicativo para smartphone, gerador de OTP de hardware ou SMS. <p> Esta página permite selecionar um provedor de autenticação para usuários Webmin no seu sistema. Depois de ativado, cada usuário pode se inscrever para dois fatores no módulo <b>Usuários Webmin</b> . Os provedores de dois fatores disponíveis são: <dl><dt> <b>Authy</b> <dd> Este é um serviço comercial que fornece um aplicativo para smartphone e site para gerenciar usuários de dois fatores. Cada usuário deve criar uma conta no site da Authy e vinculá-la ao seu smartphone. <p><dt> <b>Google Authenticator</b> <dd> Este é um aplicativo para smartphone que implementa o protocolo TOTP padrão. Cada usuário deve escanear um código QR usando o aplicativo para vincular seus tokens ao servidor Webmin. <p></dl><footer>
<header>Autenticação de dois fatores</header> A autenticação de dois fatores adiciona uma camada extra de segurança a uma conta Webmin. Quando habilitada, o usuário deve inserir um token de autenticação único, geralmente gerado por um aplicativo, um dispositivo OTP de hardware ou enviado via SMS.<p> Esta página permite que você selecione um provedor de autenticação para usuários do Webmin no seu sistema. Uma vez habilitado, cada usuário pode se registrar para autenticação de dois fatores no módulo &quot;Usuários do Webmin&quot;. Os provedores de dois fatores disponíveis são:<ul><li> <b>Autenticador TOTP</b><br> Este é um aplicativo para desktop ou smartphone que implementa o protocolo TOTP padrão. Cada usuário deve escanear um código QR usando o aplicativo para vincular seus tokens ao servidor Webmin.</li><li> <b>Autor</b><br> Este é um serviço comercial que fornece um aplicativo para smartphone e um site para gerenciar usuários de dois fatores. Cada usuário deve criar uma conta no site da Authy e vinculá-la ao seu smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Двухфакторная аутентификация </header> Двухфакторная аутентификация может использоваться для добавления дополнительного уровня безопасности к учетной записи Webmin, а также обычного имени пользователя и пароля. При включении пользователю необходимо будет предоставить дополнительный токен аутентификации, который обычно приходит из приложения для смартфона, аппаратного генератора OTP или SMS. <p> Эта страница позволяет вам выбрать провайдера аутентификации для пользователей Webmin в вашей системе. После включения каждый пользователь может зарегистрировать двухфакторный модуль в модуле <b>Webmin Users</b> . Доступны двухфакторные поставщики: <dl><dt> <b>Authy</b> <dd> Это коммерческий сервис, который предоставляет приложение для смартфона и веб-сайт для управления двухфакторными пользователями. Каждый пользователь должен создать учетную запись на сайте Authy и связать ее со своим смартфоном. <p><dt> <b>Google Authenticator</b> <dd> Это приложение для смартфонов, которое реализует стандартный протокол TOTP. Каждый пользователь должен отсканировать QR-код, используя приложение, чтобы связать свои токены с сервером Webmin. <p></dl><footer>
<header>Двухфакторная аутентификация</header> Двухфакторная аутентификация добавляет дополнительный уровень безопасности учетной записи Webmin. При включении пользователь должен ввести одноразовый токен аутентификации, который обычно генерируется приложением, аппаратным устройством OTP или отправляется по SMS.<p> Эта страница позволяет вам выбрать поставщика аутентификации для пользователей Webmin в вашей системе. После включения каждый пользователь может зарегистрироваться для двухфакторной аутентификации в модуле &quot;Webmin Users&quot;. Доступны следующие поставщики двухфакторной аутентификации:<ul><li> <b>TOTP-аутентификатор</b><br> Это приложение для настольного компьютера или смартфона, реализующее стандартный протокол TOTP. Каждый пользователь должен отсканировать QR-код с помощью приложения, чтобы связать свои токены с сервером Webmin.</li><li> <b>Аути</b><br> Это коммерческий сервис, который предоставляет приложение для смартфона и веб-сайт для управления двухфакторными пользователями. Каждый пользователь должен создать учетную запись на веб-сайте Authy и привязать ее к своему смартфону.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Dvojfaktorové overenie </header> Dvojfaktorové overenie sa dá použiť na pridanie ďalšej úrovne zabezpečenia k účtu Webmin, ako aj k bežnému používateľskému menu a heslu. Ak je povolený, používateľ bude musieť poskytnúť ďalší token autentifikácie, ktorý zvyčajne pochádza z aplikácie smartfónu, hardvérového generátora OTP alebo SMS. <p> Táto stránka vám umožňuje vybrať poskytovateľa autentifikácie pre používateľov Webminu vo vašom systéme. Po povolení sa každý používateľ môže prihlásiť do modulu <b>Webmin Users</b> pre dva faktory. K dispozícii sú dvaja faktori poskytovatelia: <dl><dt> <b>aUTH</b> <dd> Toto je komerčná služba, ktorá poskytuje aplikáciu pre smartfóny a webovú stránku na správu dvojfaktorových používateľov. Každý užívateľ si musí vytvoriť účet na webovej stránke Authy a prepojiť ho so svojím smartfónom. <p><dt> <b>Google Authenticator</b> <dd> Toto je aplikácia pre smartfóny, ktorá implementuje štandardný protokol TOTP. Každý užívateľ musí naskenovať QR kód pomocou aplikácie, aby prepojil svoje tokeny so serverom Webmin. <p></dl><footer>
<header>Dvojfaktorová autentifikácia</header> Dvojfaktorová autentifikácia pridáva účtu Webmin ďalšiu vrstvu zabezpečenia. Keď je táto možnosť povolená, používateľ musí zadať jednorazový overovací token, ktorý je zvyčajne vygenerovaný aplikáciou, hardvérovým zariadením OTP alebo odoslaným prostredníctvom SMS.<p> Táto stránka vám umožňuje vybrať poskytovateľa autentifikácie pre používateľov Webmin vo vašom systéme. Po povolení sa každý používateľ môže prihlásiť na dvojfaktorovú autentifikáciu v module „Používatelia Webminu“. Dostupní dvojfaktoroví poskytovatelia sú:<ul><li> <b>TOTP Authenticator</b><br> Ide o aplikáciu pre stolný počítač alebo smartfón, ktorá implementuje štandardný protokol TOTP. Každý používateľ musí pomocou aplikácie naskenovať QR kód, aby prepojil svoje tokeny so serverom Webmin.</li><li> <b>Authy</b><br> Ide o komerčnú službu, ktorá poskytuje aplikáciu pre smartfóny a webovú stránku na správu dvojfaktorových používateľov. Každý používateľ si musí vytvoriť účet na webovej stránke Authy a prepojiť ho so svojím smartfónom.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Tvåfaktorautentisering </header> Tvåfaktorsautentisering kan användas för att lägga till ett extra lager av säkerhet till ett Webmin-konto, liksom det vanliga användarnamnet och lösenordet. När den är aktiverad måste en användare tillhandahålla ett extra autentiserings-token som vanligtvis kommer från en smartphone-app, hårdvaru-OTP-generator eller SMS. <p> På den här sidan kan du välja en autentiseringsleverantör för Webmin-användare på ditt system. När den är aktiverad kan varje användare sedan registrera sig för <b>tvåfaktorer</b> i <b>Webmin Users-</b> modulen. De tillgängliga leverantörerna av två faktorer är: <dl><dt> <b>Authy</b> <dd> Detta är en kommersiell tjänst som tillhandahåller en smartphone-app och webbplats för hantering av tvåfaktoranvändare. Varje användare måste skapa ett konto på Authys webbplats och länka det till sin smartphone. <p><dt> <b>Google Authenticator</b> <dd> Detta är en smartphone-app som implementerar det vanliga TOTP-protokollet. Varje användare måste skanna en QR-kod med hjälp av appen för att länka sina tokens till Webmin-servern. <p></dl><footer>
<header>Tvåfaktorsautentisering</header> Tvåfaktorsautentisering lägger till ett extra lager av säkerhet till ett Webmin-konto. När det är aktiverat måste användaren ange en engångsautentiseringstoken som vanligtvis genereras av en app, en hårdvaru-OTP-enhet eller skickas via SMS.<p> På den här sidan kan du välja en autentiseringsleverantör för Webmin-användare på ditt system. När det är aktiverat kan varje användare registrera sig för tvåfaktorsautentisering i modulen &quot;Webmin-användare&quot;. De tillgängliga tvåfaktorsleverantörerna är:<ul><li> <b>TOTP Authenticator</b><br> Detta är en stationär eller smartphone-app som implementerar standard TOTP-protokoll. Varje användare måste skanna en QR-kod med appen för att länka sina tokens till Webmin-servern.</li><li> <b>Authy</b><br> Detta är en kommersiell tjänst som tillhandahåller en smartphone-app och webbplats för att hantera tvåfaktorsanvändare. Varje användare måste skapa ett konto på Authys hemsida och länka det till sin smartphone.</li></ul><footer>

View File

@@ -1 +1 @@
<header> İki Faktörlü Kimlik Doğrulama </header> İki faktörlü kimlik doğrulama, bir Webmin hesabına ek bir güvenlik katmanının yanı sıra normal kullanıcı adı ve parola eklemek için kullanılabilir. Etkinleştirildiğinde, kullanıcının genellikle bir akıllı telefon uygulaması, donanım OTP jeneratörü veya SMS&#39;den gelen ekstra bir kimlik doğrulama belirteci sağlaması gerekir. <p> Bu sayfa, sisteminizdeki Webmin kullanıcıları için bir kimlik doğrulama sağlayıcısı seçmenizi sağlar. Etkinleştirildiğinde, her kullanıcı <b>Webmin Kullanıcıları</b> modülüne iki faktörlü kayıt yaptırabilir. Mevcut iki faktörlü sağlayıcılar: <dl><dt> <b>Authy</b> <dd> Bu, iki faktörlü kullanıcıları yönetmek için bir akıllı telefon uygulaması ve web sitesi sağlayan ticari bir hizmettir. Her kullanıcı Authy&#39;nin web sitesinde bir hesap oluşturmalı ve bunu akıllı telefonuna bağlamalıdır. <p><dt> <b>Google Şifrematik</b> <dd> Bu standart TOTP protokolünü uygulayan bir akıllı telefon uygulaması. Her kullanıcı, belirteçlerini Webmin sunucusuna bağlamak için uygulamayı kullanarak bir QR kodu taramalıdır. <p></dl><footer>
<header>İki Faktörlü Kimlik Doğrulama</header> İki faktörlü kimlik doğrulama, bir Webmin hesabına fazladan bir güvenlik katmanı ekler. Etkinleştirildiğinde, kullanıcı genellikle bir uygulama, bir donanım OTP aygıtı tarafından oluşturulan veya SMS yoluyla gönderilen tek seferlik bir kimlik doğrulama belirtecini girmelidir.<p> Bu sayfa, sisteminizdeki Webmin kullanıcıları için bir kimlik doğrulama sağlayıcısı seçmenize olanak tanır. Etkinleştirildikten sonra, her kullanıcı &quot;Webmin Kullanıcıları&quot; modülünde iki faktörlü kimlik doğrulamaya kaydolabilir. Mevcut iki faktörlü sağlayıcılar şunlardır:<ul><li> <b>TOTP Kimlik Doğrulayıcı</b><br> Bu, standart TOTP protokolünü uygulayan bir masaüstü veya akıllı telefon uygulamasıdır. Her kullanıcı, token&#39;larını Webmin sunucusuyla bağlamak için uygulamayı kullanarak bir QR kodunu taramalıdır.</li><li> <b>Yetkili</b><br> Bu, iki faktörlü kullanıcıları yönetmek için bir akıllı telefon uygulaması ve web sitesi sağlayan ticari bir hizmettir. Her kullanıcı Authy&#39;nin web sitesinde bir hesap oluşturmalı ve bunu akıllı telefonuna bağlamalıdır.</li></ul><footer>

View File

@@ -1 +1 @@
<header> Двофакторна автентифікація </header> Двофакторну автентифікацію можна використовувати для додавання додаткового рівня безпеки до облікового запису Webmin, а також до звичайного імені користувача та пароля. Якщо ввімкнено, користувачеві потрібно буде надати додатковий маркер аутентифікації, який зазвичай надходить із програми для смартфонів, апаратного генератора OTP або SMS. <p> Ця сторінка дозволяє вибрати постачальника аутентифікації для користувачів Webmin у вашій системі. Після ввімкнення кожен користувач може потім записатись на двофакторний модуль <b>користувачів Webmin</b> . Доступними двофакторними постачальниками є: <dl><dt> <b>Ауті</b> <dd> Це комерційна послуга, яка забезпечує додаток для смартфонів та веб-сайт для управління двофакторними користувачами. Кожен користувач повинен створити обліковий запис на веб-сайті Authy та пов’язати його зі своїм смартфоном. <p><dt> <b>Google Authenticator</b> <dd> Це додаток для смартфонів, що реалізує стандартний протокол TOTP. Кожен користувач повинен сканувати QR-код за допомогою програми, щоб зв’язати свої маркери з сервером Webmin. <p></dl><footer>
<header>Двофакторна автентифікація</header> Двофакторна автентифікація додає додатковий рівень безпеки до облікового запису Webmin. Якщо ввімкнено, користувач має ввести одноразовий маркер автентифікації, який зазвичай створюється програмою, апаратним пристроєм OTP або надсилається через SMS.<p> Ця сторінка дозволяє вибрати постачальника автентифікації для користувачів Webmin у вашій системі. Після ввімкнення кожен користувач може зареєструватися для двофакторної автентифікації в модулі «Користувачі Webmin». Доступні двофакторні постачальники:<ul><li> <b>Автентифікатор TOTP</b><br> Це програма для комп’ютера або смартфона, яка реалізує стандартний протокол TOTP. Кожен користувач повинен відсканувати QR-код за допомогою програми, щоб зв’язати свої маркери з сервером Webmin.</li><li> <b>Authy</b><br> Це комерційна послуга, яка надає додаток для смартфона та веб-сайт для керування двофакторними користувачами. Кожен користувач повинен створити обліковий запис на веб-сайті Authy і прив’язати його до свого смартфона.</li></ul><footer>

View File

@@ -1 +1 @@
<header>两要素认</header>双重身份验证可以用来为Webmin帐户以及常规的用户名和密码添加额外的安全保护。启用后,用户将需要提供额外的身份验证令牌,该令牌通常来自智能手机应用,硬件OTP生成器或SMS。 <p>页面允许您为系统上的Webmin用户选择身份验证提供程序。启用后每个用户都可以在<b>Webmin用户</b>模块中注册两个因素。可用的因素提供者是: <dl><dt> <b>Authy</b> <dd>这是一项商业服务,提供用于管理两因素用户的智能手机应用程序和网站。每个用户都必须在Authy网站上创建一个帐户并将其链接到他们的智能手机。 <p><dt> <b>Google身份验证器</b> <dd>这是一个实现标准TOTP协议的智能手机应用程序。每用户都必须使用该应用程序扫描QR码以将其令牌与Webmin服务器链接。 <p></dl><footer>
<header>双重身份验</header>双重身份验证为 Webmin 帐户增加了一层额外的安全保护。启用后,用户必须输入一次性身份验证令牌,该令牌通常由应用程序、硬件 OTP 设备生成或通过短信发送。<p>页面允许您为系统上的 Webmin 用户选择身份验证提供程序。启用后,每个用户都可以在Webmin 用户”模块中注册双因素身份验证。可用的因素提供程序包括:<ul><li> <b>TOTP 认证器</b><br>这是一款实现标准 TOTP 协议的桌面或智能手机应用程序。每个用户都必须使用该应用程序扫描二维码,以将其令牌与 Webmin 服务器链接起来。</li><li><b>奥西</b><br>这是一项商业服务,提供智能手机应用程序和网站来管理双因素用户。每用户都必须在 Authy 网站上创建一个帐户并将其链接到自己的智能手机。</li></ul><footer>

View File

@@ -1 +1 @@
<header>兩要素認</header>雙重身份驗證可以用來為Webmin帳戶以及常規的用戶名和密碼添加額外的安全保護。啟用後,用戶將需要提供額外的身份驗證令牌該令牌通常來自智能手機應用硬件OTP生成器或SMS。 <p>頁面允許您為系統上的Webmin用戶選擇身份驗證提供程序。啟用,每個用戶都可以在<b>Webmin用戶</b>模塊中註冊兩個因素。可用的因素提供者是: <dl><dt> <b>Authy</b> <dd>這是一項商業服務,提供用於管理兩因素用戶的智能手機應用程序和網站。每個用戶都必須在Authy網站上創建一個帳戶並將其鏈接到他們的智能手機。 <p><dt> <b>Google身份驗證器</b> <dd>這是一個實現標準TOTP協議的智能手機應用程。每個用戶都必須使用該應用程序掃描QR碼以將其令牌與Webmin服務器鏈接。 <p></dl><footer>
<header>雙重身分驗</header>雙重驗證為 Webmin 帳戶增加了一層額外的安全保護。啟用後,使用者必須輸入通常由應用程式、硬體 OTP 裝置產生或透過簡訊發送的一次性身份驗證令牌。<p>頁面可讓您為系統上的 Webmin 使用者選擇身份驗證提供者。一旦啟用,每個使用者都可以在「Webmin 使用者」模組中註冊雙重認證。可用的因素提供者包括:<ul><li> <b>TOTP 認證器</b><br>這是一個實現標準 TOTP 協定的桌面或智慧型手機應用程。每個用戶都必須使用該應用程式掃描二維碼,以將他們的令牌與 Webmin 伺服器連結。</li><li><b>奧西</b><br>這是一項商業服務,提供用於管理雙因素用戶的智慧型手機應用程式和網站。每個用戶都必須在 Authy 的網站上建立帳戶並將其連結到他們的智慧型手機。</li></ul><footer>

Some files were not shown because too many files have changed in this diff Show More