mirror of
https://github.com/webmin/webmin.git
synced 2026-02-08 00:12:14 +00:00
Compare commits
127 Commits
dev/fix-li
...
dev/minise
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff4e0ae386 | ||
|
|
19bfe18e0f | ||
|
|
b48f6d3406 | ||
|
|
172c504abb | ||
|
|
b92d8d11d6 | ||
|
|
d073280e80 | ||
|
|
ebf1138788 | ||
|
|
3706f7862b | ||
|
|
9bd96b6448 | ||
|
|
7ff37cd12f | ||
|
|
55fd013b35 | ||
|
|
014f949fdb | ||
|
|
cb3bde5374 | ||
|
|
4fbc57350f | ||
|
|
924e7e8ff5 | ||
|
|
cb7de4edec | ||
|
|
f17be6a383 | ||
|
|
bcfb698ac6 | ||
|
|
8bd079f52f | ||
|
|
cef76798f8 | ||
|
|
4f046c1d6d | ||
|
|
cc83641c11 | ||
|
|
971c526ade | ||
|
|
717f0b1100 | ||
|
|
6ff0e50e94 | ||
|
|
0de1844755 | ||
|
|
e55f3bdb74 | ||
|
|
25d2edeeaf | ||
|
|
201d817e9d | ||
|
|
b2626ca9c1 | ||
|
|
0553cae4e3 | ||
|
|
740368fc0d | ||
|
|
7c932d3cb0 | ||
|
|
b46043de84 | ||
|
|
69e3844cec | ||
|
|
215b1332fc | ||
|
|
bb8b926d52 | ||
|
|
967d519943 | ||
|
|
c84ef98016 | ||
|
|
fd153b28f3 | ||
|
|
7a3210849d | ||
|
|
fb8339a3ca | ||
|
|
e0b6ae7691 | ||
|
|
3f5ae24beb | ||
|
|
8cd74c1c35 | ||
|
|
e983ded21e | ||
|
|
0037d9a9ca | ||
|
|
a49b5fc0cb | ||
|
|
e87fc560c9 | ||
|
|
ac21e39a88 | ||
|
|
d070176535 | ||
|
|
4c60aa1865 | ||
|
|
590a3218be | ||
|
|
cf50dd2431 | ||
|
|
a04646e785 | ||
|
|
5d2debca26 | ||
|
|
79e5d72393 | ||
|
|
410d240e8b | ||
|
|
c074e150f6 | ||
|
|
2916f5b723 | ||
|
|
167e8f2b1f | ||
|
|
f71c413b6d | ||
|
|
a664809bf4 | ||
|
|
d8513dbd9e | ||
|
|
268b72917d | ||
|
|
4082701c48 | ||
|
|
4018977aeb | ||
|
|
ff0da2ca90 | ||
|
|
badb5b60f7 | ||
|
|
a9652f4c88 | ||
|
|
2febc12586 | ||
|
|
625fff0c6f | ||
|
|
ea973b571b | ||
|
|
ba6da02850 | ||
|
|
f15b147bd0 | ||
|
|
4b927ed588 | ||
|
|
8894ca18cf | ||
|
|
d9dbcd9746 | ||
|
|
00ad7fec7a | ||
|
|
f76451975c | ||
|
|
315664a1e1 | ||
|
|
18a4c86e2f | ||
|
|
f65625047b | ||
|
|
8d0f19f64d | ||
|
|
a768e731cf | ||
|
|
535accda63 | ||
|
|
a6c3cccbac | ||
|
|
d2d16608dc | ||
|
|
196e3ed6c4 | ||
|
|
acdc65c5d7 | ||
|
|
dffdd66fb4 | ||
|
|
f6fc4490db | ||
|
|
73a882b7a0 | ||
|
|
5de2d599a2 | ||
|
|
cf2806edac | ||
|
|
0bf83ea2a8 | ||
|
|
544db4b1a9 | ||
|
|
f7e4b57c42 | ||
|
|
9e9fc9bc87 | ||
|
|
23dff016cd | ||
|
|
c191caf04b | ||
|
|
05f4b8ff96 | ||
|
|
f30275b49e | ||
|
|
3e1b07f823 | ||
|
|
49990e5949 | ||
|
|
434d46643b | ||
|
|
33ed262ff0 | ||
|
|
0bc1dae232 | ||
|
|
2760336b40 | ||
|
|
18bd46fe93 | ||
|
|
fde1b02880 | ||
|
|
f94dabb88c | ||
|
|
9e9d674206 | ||
|
|
bd5c0bfa54 | ||
|
|
b1fdf42530 | ||
|
|
f2cba6af00 | ||
|
|
e5beb7f022 | ||
|
|
99f6638194 | ||
|
|
aa55e33b7e | ||
|
|
b3f28ee4f7 | ||
|
|
2ce1157190 | ||
|
|
d40dbe391e | ||
|
|
0fc1bea55e | ||
|
|
225d113d38 | ||
|
|
663640d801 | ||
|
|
8bc5ba7a32 | ||
|
|
a10de5a9dc |
File diff suppressed because one or more lines are too long
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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'}) .
|
||||
|
||||
@@ -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>" : "");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
@@ -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'}) {
|
||||
|
||||
13
at/at-lib.pl
13
at/at-lib.pl
@@ -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;
|
||||
|
||||
|
||||
49
at/index.cgi
49
at/index.cgi
@@ -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'});
|
||||
|
||||
@@ -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
63
bind8/edit_tls.cgi
Normal 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
BIN
bind8/images/tls.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 364 B |
@@ -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'});
|
||||
|
||||
@@ -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
44
bind8/list_tls.cgi
Normal 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
90
bind8/save_tls.cgi
Normal 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");
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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
5
cron/cleanup.pl
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/perl
|
||||
# Manually run the temp files cleanup function
|
||||
|
||||
require './cron-lib.pl';
|
||||
&cleanup_temp_files();
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
145
forgot.cgi
Executable 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
27
forgot_form.cgi
Executable 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
140
forgot_send.cgi
Executable 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);
|
||||
}
|
||||
BIN
gray-theme/bind8/images/tls.gif
Normal file
BIN
gray-theme/bind8/images/tls.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
28
lang/de
28
lang/de
@@ -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
37
lang/en
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
55
miniserv.pl
55
miniserv.pl
@@ -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);
|
||||
|
||||
@@ -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>");
|
||||
}
|
||||
|
||||
@@ -650,13 +650,14 @@ return $rv;
|
||||
|
||||
sub quote_table
|
||||
{
|
||||
return "estr($_[0]);
|
||||
my ($rv) = @_;
|
||||
return "estr($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);
|
||||
|
||||
@@ -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
62
phpini/delete_pkgs.cgi
Executable 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'});
|
||||
@@ -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'});
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
67
phpini/list_pkgs.cgi
Executable 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'});
|
||||
@@ -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>");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
deffast=2
|
||||
deffast=1
|
||||
max_servers=100
|
||||
resolve=1
|
||||
deflink=0
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() );
|
||||
}
|
||||
|
||||
@@ -103,17 +103,22 @@ if ($access{'forcelink'}) {
|
||||
}
|
||||
else {
|
||||
# Login mode
|
||||
my $qulbl = "e_escape($text{'edit_user'}, '"');
|
||||
my $qplbl = "e_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'} ],
|
||||
|
||||
@@ -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', " ".
|
||||
&ui_textbox("scan", $myscan, 15)." ").
|
||||
"<br><table>\n".
|
||||
"<tr><td valign=middle><b>$text{'index_defuser'}</b></td>\n".
|
||||
"<tr><td valign=middle>$text{'index_defuser'} </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'} </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'} </td>\n".
|
||||
"<td valign=middle>".&ui_textbox("port", $port, 20)."</td> </tr>".
|
||||
"</table>\n"
|
||||
);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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'});
|
||||
|
||||
@@ -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
|
||||
|
||||
13
ui-lib.pl
13
ui-lib.pl
@@ -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'> ⓘ ".
|
||||
"$text</font>";
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "e_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
|
||||
);
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -150,6 +150,10 @@ print &ui_table_row($text{'session_passapi'},
|
||||
[ 1, $text{'session_passapi1'} . " " .
|
||||
&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'} ] ]);
|
||||
|
||||
|
||||
@@ -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'},
|
||||
|
||||
@@ -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 على نظامك. بعد تفعيله، يُمكن لكل مستخدم التسجيل للمصادقة الثنائية في وحدة "مستخدمو Webmin". مزوّدو المصادقة الثنائية المتاحون هم:<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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
1
webmin/help/twofactor.ca.auto.html
Normal file
1
webmin/help/twofactor.ca.auto.html
Normal file
@@ -0,0 +1 @@
|
||||
<header>Autenticació de dos factors</header> L'autenticació de dos factors afegeix una capa addicional de seguretat a un compte de Webmin. Quan està activat, l'usuari ha d'introduir un testimoni d'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'autenticació per als usuaris de Webmin del vostre sistema. Un cop habilitat, cada usuari es pot inscriure per a l'autenticació de dos factors al mòdul "Usuaris de Webmin". Els proveïdors de dos factors disponibles són:<ul><li> <b>Autenticador TOTP</b><br> Aquesta és una aplicació d'escriptori o telèfon intel·ligent que implementa el protocol estàndard TOTP. Cada usuari ha d'escanejar un codi QR mitjançant l'aplicació per enllaçar els seus testimonis amb el servidor Webmin.</li><li> <b>Authy</b><br> Es tracta d'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'Authy i enllaçar-lo al seu telèfon intel·ligent.</li></ul><footer>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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 "Webmin-brugere". 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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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 στο σύστημά σας. Αφού ενεργοποιηθεί, κάθε χρήστης μπορεί να εγγραφεί για έλεγχο ταυτότητας δύο παραγόντων στη λειτουργική μονάδα "Χρήστες Webmin". Οι διαθέσιμοι πάροχοι δύο παραγόντων είναι:<ul><li> <b>Επαληθευτής TOTP</b><br> Αυτή είναι μια εφαρμογή για επιτραπέζιους υπολογιστές ή smartphone που εφαρμόζει το τυπικό πρωτόκολλο TOTP. Κάθε χρήστης πρέπει να σαρώσει έναν κωδικό QR χρησιμοποιώντας την εφαρμογή για να συνδέσει τα διακριτικά του με τον διακομιστή Webmin.</li><li> <b>Authy</b><br> Αυτή είναι μια εμπορική υπηρεσία που παρέχει μια εφαρμογή και ιστότοπο για smartphone για τη διαχείριση χρηστών δύο παραγόντων. Κάθε χρήστης πρέπει να δημιουργήσει έναν λογαριασμό στον ιστότοπο της Authy και να τον συνδέσει με το smartphone του.</li></ul><footer>
|
||||
|
||||
@@ -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 "Usuarios de Webmin". 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>
|
||||
|
||||
@@ -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 "Webmin Erabiltzaileak" 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>
|
||||
|
||||
@@ -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"> این صفحه به شما امکان می دهد یک ارائه دهنده احراز هویت برای کاربران وبمین در سیستم خود انتخاب کنید. پس از فعال شدن، هر کاربر می تواند برای احراز هویت دو مرحله ای در ماژول "کاربران وبمین" ثبت نام کند. ارائه دهندگان دو عاملی موجود عبارتند از:<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>
|
||||
|
||||
@@ -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 "Webmin Users" -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 linkitettävä se älypuhelimeesi.</li></ul><footer>
|
||||
|
||||
1
webmin/help/twofactor.fr.auto.html
Normal file
1
webmin/help/twofactor.fr.auto.html
Normal file
@@ -0,0 +1 @@
|
||||
<header>Authentification à deux facteurs</header> L'authentification à deux facteurs renforce la sécurité d'un compte Webmin. Lorsqu'elle est activée, l'utilisateur doit saisir un jeton d'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'authentification pour les utilisateurs Webmin de votre système. Une fois cette option activée, chaque utilisateur peut s'inscrire à l'authentification à deux facteurs dans le module « Utilisateurs Webmin ». Les fournisseurs d'authentification à deux facteurs disponibles sont :<ul><li> <b>Authentificateur TOTP</b><br> Il s'agit d'une application pour ordinateur ou smartphone qui implémente le protocole TOTP standard. Chaque utilisateur doit scanner un code QR avec l'application pour lier ses jetons au serveur Webmin.</li><li> <b>Authy</b><br> Il s'agit d'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'Authy et l'associer à son smartphone.</li></ul><footer>
|
||||
@@ -1,16 +0,0 @@
|
||||
<header>Authentification à deux facteurs</header>
|
||||
L'authentification à deux facteurs peut être utilisée pour ajouter une couche de sécurité supplémentaire à un compte Webmin, ainsi que le nom d'utilisateur et le mot de passe habituels.<br>
|
||||
Lorsqu'il est activé, un utilisateur devra fournir un jeton d'authentification supplémentaire qui provient généralement d'une application pour smartphone, d'un générateur OTP matériel ou d'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'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'agit d'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>
|
||||
@@ -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 "Webmin Users". 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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> moduljában. 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>
|
||||
|
||||
@@ -1 +1 @@
|
||||
<header> Autenticazione a due fattori </header> L'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'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'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'app per smartphone che implementa il protocollo TOTP standard. Ogni utente deve eseguire la scansione di un codice QR utilizzando l'app per collegare i propri token al server Webmin. <p></dl><footer>
|
||||
<header>Autenticazione a due fattori</header> L'autenticazione a due fattori aggiunge un ulteriore livello di sicurezza a un account Webmin. Quando abilitata, l'utente deve immettere un token di autenticazione monouso, solitamente generato da un'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'autenticazione a due fattori nel modulo "Utenti Webmin". I provider a due fattori disponibili sono:<ul><li> <b>Autenticatore TOTP</b><br> Questa è un'app per desktop o smartphone che implementa il protocollo TOTP standard. Ogni utente deve scansionare un codice QR utilizzando l'app per collegare i propri token al server Webmin.</li><li> <b>Autenticità</b><br> Si tratta di un servizio commerciale che fornisce un'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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 사용자에 대한 인증 공급자를 선택할 수 있습니다. 활성화되면 각 사용자는 "Webmin 사용자" 모듈에서 2단계 인증에 등록할 수 있습니다. 사용 가능한 2단계 공급자는 다음과 같습니다.<ul><li> <b>TOTP 인증기</b><br> 이것은 표준 TOTP 프로토콜을 구현하는 데스크톱 또는 스마트폰 앱입니다. 각 사용자는 앱을 사용하여 QR 코드를 스캔하여 토큰을 Webmin 서버와 연결해야 합니다.</li><li> <b>인증</b><br> 이것은 2단계 인증 사용자를 관리하기 위한 스마트폰 앱과 웹사이트를 제공하는 상업적 서비스입니다. 각 사용자는 Authy 웹사이트에서 계정을 만들고 스마트폰에 연결해야 합니다.</li></ul><footer>
|
||||
|
||||
1
webmin/help/twofactor.ms.auto.html
Normal file
1
webmin/help/twofactor.ms.auto.html
Normal 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 "Pengguna Webmin". 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>
|
||||
@@ -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>
|
||||
@@ -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 "Webmin-gebruikers". 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>
|
||||
|
||||
1
webmin/help/twofactor.no.auto.html
Normal file
1
webmin/help/twofactor.no.auto.html
Normal 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 "Webmin-brukere"-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>
|
||||
@@ -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>
|
||||
1
webmin/help/twofactor.pl.auto.html
Normal file
1
webmin/help/twofactor.pl.auto.html
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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 "Usuários do Webmin". 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>
|
||||
|
||||
@@ -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 "Usuários do Webmin". 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>
|
||||
|
||||
@@ -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 в вашей системе. После включения каждый пользователь может зарегистрироваться для двухфакторной аутентификации в модуле "Webmin Users". Доступны следующие поставщики двухфакторной аутентификации:<ul><li> <b>TOTP-аутентификатор</b><br> Это приложение для настольного компьютера или смартфона, реализующее стандартный протокол TOTP. Каждый пользователь должен отсканировать QR-код с помощью приложения, чтобы связать свои токены с сервером Webmin.</li><li> <b>Аути</b><br> Это коммерческий сервис, который предоставляет приложение для смартфона и веб-сайт для управления двухфакторными пользователями. Каждый пользователь должен создать учетную запись на веб-сайте Authy и привязать ее к своему смартфону.</li></ul><footer>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 "Webmin-användare". 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>
|
||||
|
||||
@@ -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'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'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ı "Webmin Kullanıcıları" 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'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'nin web sitesinde bir hesap oluşturmalı ve bunu akıllı telefonuna bağlamalıdır.</li></ul><footer>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user