Merge branch 'master' of github.com:webmin/webmin
Some checks failed
webmin.dev: webmin/webmin / build (push) Has been cancelled

This commit is contained in:
Jamie Cameron
2026-04-22 08:29:59 -07:00
136 changed files with 7773 additions and 766 deletions

1
.gitignore vendored
View File

@@ -22,3 +22,4 @@ tarballs/
minimal/
.DS_Store
.vscode/settings.json
debug.cgi

View File

@@ -11,7 +11,8 @@ print $text{'defines_desc'},"<p>\n";
@defs = &get_httpd_defines(1);
if (@defs) {
print &text('defines_config',
"<tt><b>".join(" ", @defs)."</b></tt>"),"<p>\n";
"<tt><b>".&html_escape(join(" ", @defs))."</b></tt>"),
"<p>\n";
}
print &ui_form_start("save_defines.cgi", "post");

View File

@@ -28,7 +28,7 @@ if ($in{'type'} == 6) {
print &ui_hr();
print &ui_subheading($text{'global_mime'});
print "$text{'global_mimedesc'}<p>\n";
@links = ( &ui_link("edit_gmime_type.cgi?file=$mfile",
@links = ( &ui_link("edit_gmime_type.cgi?file=".&urlize($mfile),
$text{'global_add'}) );
print &ui_links_row(\@links);
print &ui_columns_start([ $text{'global_type'},
@@ -41,7 +41,8 @@ if ($in{'type'} == 6) {
if (/^\s*(\S+)\s*(.*)$/) {
print &ui_columns_row([
&ui_link("edit_gmime_type.cgi?line=$line".
"&file=$mfile", $1), $2 ]);
"&file=".&urlize($mfile), &html_escape($1)),
&html_escape($2) ]);
}
$line++;
}

View File

@@ -1,3 +1,3 @@
allowed_paths=$HOME
work_as_root=1
allowed_for_edit=application-x-php application-x-ruby application-xml application-xslt+xml application-javascript application-x-shellscript application-x-perl application-x-yaml application-x-toml application-json application-x-x509-ca-cert application-pkix-cert application-x-sql application-x-asp application-x-aspx application-xhtml+xml
allowed_for_edit=application-x-php application-x-ruby application-xml application-xslt+xml application-javascript application-x-shellscript application-x-perl application-x-yaml application-x-toml application-json application-x-x509-ca-cert application-pkix-cert application-x-sql application-x-asp application-x-aspx application-xhtml+xml application-mathml+xml

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1022 B

After

Width:  |  Height:  |  Size: 913 B

View File

@@ -15,6 +15,111 @@ use Time::Local;
$dbm_index_min = 1000000;
$dbm_index_version = 3;
# supports_tnef_module()
# Returns 1 if the Convert::TNEF module is available for decoding winmail.dat
my $supports_tnef_module;
sub supports_tnef_module
{
if (!defined($supports_tnef_module)) {
$supports_tnef_module = eval { require Convert::TNEF; 1; } ? 1 : 0;
}
return $supports_tnef_module;
}
# decode_tnef_attachment(&attach)
# Expands a TNEF attachment into a list of normal attachments, or returns
# an error string if decoding is not possible
sub decode_tnef_attachment
{
my ($attach) = @_;
my @rv;
return (undef, "Convert::TNEF module not installed")
if (!&supports_tnef_module());
my $tempdir = &transname();
mkdir($tempdir, 0700) || return (undef, $!);
# Only try to de-privilege the parser when we are currently fully root;
# In Usermin or already-switched contexts, just decode as the current user
my $parse_user = !$< && !$> ? &get_mail_parse_user($attach) : undef;
my $tnef;
if ($parse_user) {
# Convert::TNEF may create temp files under output_dir, so hand it a
# private directory owned by the mailbox user and run the parser as
# that user instead of root
local $main::mail_open_user = $parse_user;
my @uinfo = &get_switch_user_info();
@uinfo || return (undef, "Mail open user $parse_user does not exist");
&set_ownership_permissions($uinfo[2], $uinfo[3], 0700, $tempdir);
my $switched = &switch_to_mail_user();
my $io;
my $ok = eval {
open($io, "<", \$attach->{'data'}) || die "$!";
binmode($io);
$tnef = Convert::TNEF->read($io,
{ 'output_dir' => $tempdir,
'buffer_size' => &get_buffer_size() });
close($io) || die "$!";
1;
};
if ($switched) {
# Restore root after decoding so the rest of the mailbox code
# keeps running with its original privileges
$) = 0;
$> = 0;
}
return (undef, $@) if (!$ok);
}
else {
my $io;
if (!open($io, "<", \$attach->{'data'})) {
return (undef, $!);
}
binmode($io);
$tnef = eval {
Convert::TNEF->read($io,
{ 'output_dir' => $tempdir,
'buffer_size' => &get_buffer_size() })
};
close($io);
}
if ($@) {
return (undef, $@);
}
if (!$tnef) {
return (undef, $Convert::TNEF::errstr ||
"failed to decode winmail.dat");
}
foreach my $ta ($tnef->attachments) {
my $fn = $ta->longname() || $ta->name();
$fn =~ s/\x00+$// if (defined($fn));
my $data = $ta->data();
next if (!defined($data));
my $ct = $fn ? &guess_mime_type($fn)
: "application/octet-stream";
push(@rv,
{ 'type' => $ct,
'header' => { 'content-type' => $ct },
'headers' => [ [ 'Content-Type', $ct ] ],
'filename' => $fn,
'data' => $data });
}
$tnef->purge();
return (\@rv, undef);
}
# get_mail_parse_user(&mail-or-attach)
# Returns the Unix user, if any, that should be used for unsafe mail parsing
sub get_mail_parse_user
{
my ($obj) = @_;
while ($obj) {
return $obj->{'open_user'} if ($obj->{'open_user'});
$obj = $obj->{'parent'};
}
return undef;
}
# list_mails(user|file, [start], [end])
# Returns a subset of mail from a mbox format file
sub list_mails
@@ -540,49 +645,18 @@ if ($ct =~ /boundary="([^"]+)"/i || $ct =~ /boundary=([^;\s]+)/i) {
elsif (lc($attach->{'type'}) eq 'application/ms-tnef') {
# This attachment is a winmail.dat file, which may
# contain multiple other attachments!
local ($opentnef, $tnef);
if (!($opentnef = &has_command("opentnef")) &&
!($tnef = &has_command("tnef"))) {
$attach->{'error'} = "tnef command not installed";
local ($tattach, $terror) =
&decode_tnef_attachment($attach);
if ($tattach && @{$tattach}) {
pop(@attach); # lose winmail.dat
foreach my $ta (@{$tattach}) {
$ta->{'idx'} = scalar(@attach);
push(@attach, $ta);
}
}
else {
# Can actually decode
local $tempfile = &transname();
open(TEMPFILE, ">$tempfile");
print TEMPFILE $attach->{'data'};
close(TEMPFILE);
local $tempdir = &transname();
mkdir($tempdir, 0700);
if ($opentnef) {
system("$opentnef -d $tempdir -i $tempfile >/dev/null 2>&1");
}
else {
system("$tnef -C $tempdir -f $tempfile >/dev/null 2>&1");
}
pop(@attach); # lose winmail.dat
opendir(DIR, $tempdir);
while($f = readdir(DIR)) {
next if ($f eq '.' || $f eq '..');
local $data;
open(FILE, "<$tempdir/$f");
while(<FILE>) {
$data .= $_;
}
close(FILE);
local $ct = &guess_mime_type($f);
push(@attach,
{ 'type' => $ct,
'idx' => scalar(@attach),
'header' =>
{ 'content-type' => $ct },
'headers' =>
[ [ 'Content-Type', $ct ] ],
'filename' => $f,
'data' => $data });
}
closedir(DIR);
unlink(glob("$tempdir/*"), $tempfile);
rmdir($tempdir);
$attach->{'error'} = $terror ||
"failed to decode winmail.dat";
}
}
last if ($l >= $max || $lines[$l] eq "$bound--");
@@ -3194,12 +3268,13 @@ return 0;
# Returns the getpw* function array for the user to switch to
sub get_switch_user_info
{
if ($main::mail_open_user =~ /^\d+$/) {
my $user = @_ ? $_[0] : $main::mail_open_user;
if ($user =~ /^\d+$/) {
# Could be by UID .. but fall back to by name if there is no such UID
my @rv = getpwuid($main::mail_open_user);
my @rv = getpwuid($user);
return @rv if (@rv > 0);
}
return getpwnam($main::mail_open_user);
return getpwnam($user);
}
# is_ascii()

View File

@@ -310,6 +310,10 @@ elsif ($_[2]->{'type'} == 7) {
print DEBUG "listing MBX $_[2]->{'file'}\n";
@mail = &list_mbxfile($_[2]->{'file'}, $_[0], $_[1]);
}
foreach my $mail (@mail) {
$mail->{'open_user'} ||= $_[2]->{'user'}
if ($mail && $_[2]->{'user'});
}
&switch_from_folder_user($_[2]);
return @mail;
}
@@ -559,6 +563,9 @@ elsif ($folder->{'type'} == 7) {
# MBX folder
@mail = &select_mbxfile($folder->{'file'}, $ids, $headersonly);
}
foreach my $mail (@mail) {
$mail->{'open_user'} ||= $folder->{'user'} if ($mail && $folder->{'user'});
}
&switch_from_folder_user($_[0]);
return @mail;
}

16
nftables/apply.cgi Executable file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/perl
# apply.cgi
# Apply the current configuration
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'apply_err'});
my @tables = get_nftables_save();
my $err = apply_restore();
error($err) if ($err);
redirect("index.cgi");

12
nftables/config.info Normal file
View File

@@ -0,0 +1,12 @@
line0=Configurable global options,11
perpage=Number of rules to display per page,3,Default (50)
view_condition=Display condition in rules list?,1,1-Yes,0-No
view_comment=Display comment in rules list?,1,1-Yes,0-No
before_cmd=Command to run before changing rules,3,None
after_cmd=Command to run after changing rules,3,None
before_apply_cmd=Command to run before applying configuration,3,None
after_apply_cmd=Command to run after applying configuration,3,None
line2=NFTables configuration,11
nft_cmd=Full path to nft command,0
save_file=File to save/edit NFTables rules,3,Use operating system or Webmin default
direct=Directly edit firewall rules instead of save file?,1,1-Yes,0-No

55
nftables/create_table.cgi Executable file
View File

@@ -0,0 +1,55 @@
#!/usr/bin/perl
# create_table.cgi
# Create a new nftables table
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'create_err'});
my @families = qw(ip ip6 inet arp bridge netdev);
my %family_ok = map { $_ => 1 } @families;
if ($in{'create'}) {
my $name = $in{'name'};
my $family = $in{'family'};
$name =~ /^\w[\w-]*$/ || error($text{'create_ename'});
$family_ok{$family} || error($text{'create_efamily'});
my @tables = get_nftables_save();
foreach my $t (@tables) {
if ($t->{'name'} eq $name && $t->{'family'} eq $family) {
error($text{'create_edup'});
}
}
push(@tables, { 'name' => $name,
'family' => $family,
'rules' => [],
'chains' => {},
'sets' => {} });
my $err = save_configuration(@tables);
error(text('create_failed', $err)) if ($err);
webmin_log("create", "table", $name, { 'family' => $family });
my $idx = $#tables;
redirect("index.cgi?table=$idx");
}
ui_print_header(undef, $text{'create_title'}, "", "intro", 1, 1);
print ui_form_start("create_table.cgi");
print ui_hidden("create", 1);
print ui_table_start($text{'create_header'}, "width=100%", 2);
print ui_table_row($text{'create_family'},
ui_select("family", $in{'family'} || "inet",
[ map { [ $_, $_ ] } @families ]));
print ui_table_row($text{'create_name'},
ui_textbox("name", $in{'name'}, 20));
print ui_table_end();
print ui_form_end([ [ undef, $text{'create_ok'} ] ]);
ui_print_footer("index.cgi", $text{'index_return'});

54
nftables/delete_chain.cgi Normal file
View File

@@ -0,0 +1,54 @@
#!/usr/bin/perl
# delete_chain.cgi
# Delete an existing nftables chain
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'delete_chain_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'chain_notable'});
my $chain = $table->{'chains'}->{$in{'chain'}};
$chain || error($text{'chain_nochain'});
my @refs = grep {
($_->{'jump'} && $_->{'jump'} eq $in{'chain'}) ||
($_->{'goto'} && $_->{'goto'} eq $in{'chain'})
} @{$table->{'rules'}};
if ($in{'confirm'}) {
@refs && error(text('delete_chain_inuse', $in{'chain'}, scalar(@refs)));
@{$table->{'rules'}} = grep { $_->{'chain'} ne $in{'chain'} } @{$table->{'rules'}};
delete($table->{'chains'}->{$in{'chain'}});
my $err = save_configuration(@tables);
error(text('delete_chain_failed', $err)) if ($err);
webmin_log("delete", "chain", $in{'chain'},
{ 'table' => $table->{'name'}, 'family' => $table->{'family'} });
redirect("index.cgi?table=$in{'table'}");
}
ui_print_header(undef, $text{'delete_chain_title'}, "", "intro", 1, 1);
print ui_form_start("delete_chain.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("chain", $in{'chain'});
print "<center><b>",
text('delete_chain_confirm',
"<tt>$in{'chain'}</tt>",
"<tt>$table->{'family'} $table->{'name'}</tt>"),
"</b>";
if (@refs) {
print "<br><br>", text('delete_chain_inuse', $in{'chain'}, scalar(@refs));
}
print "<p>\n";
print ui_submit($text{'delete'}, "confirm");
print "</center>\n";
print ui_form_end();
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

48
nftables/delete_set.cgi Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/perl
# delete_set.cgi
# Delete an existing nftables set
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'delete_set_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'set_notable'});
my $set = $table->{'sets'}->{$in{'set'}};
$set || error($text{'set_noset'});
my $refs = count_set_references($table, $in{'set'});
if ($in{'confirm'}) {
$refs && error(text('delete_set_inuse', $in{'set'}, $refs));
delete($table->{'sets'}->{$in{'set'}});
my $err = save_configuration(@tables);
error(text('delete_set_failed', $err)) if ($err);
webmin_log("delete", "set", $in{'set'},
{ 'table' => $table->{'name'}, 'family' => $table->{'family'} });
redirect("index.cgi?table=$in{'table'}");
}
ui_print_header(undef, $text{'delete_set_title'}, "", "intro", 1, 1);
print ui_form_start("delete_set.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("set", $in{'set'});
print "<center><b>",
text('delete_set_confirm',
"<tt>$in{'set'}</tt>",
"<tt>$table->{'family'} $table->{'name'}</tt>"),
"</b>";
if ($refs) {
print "<br><br>", text('delete_set_inuse', $in{'set'}, $refs);
}
print "<p>\n";
print ui_submit($text{'delete'}, "confirm");
print "</center>\n";
print ui_form_end();
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

36
nftables/delete_table.cgi Executable file
View File

@@ -0,0 +1,36 @@
#!/usr/bin/perl
# delete_table.cgi
# Delete an existing nftables table
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'delete_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'delete_notable'});
if ($in{'confirm'}) {
splice(@tables, $in{'table'}, 1);
my $err = save_configuration(@tables);
error(text('delete_failed', $err)) if ($err);
webmin_log("delete", "table", $table->{'name'},
{ 'family' => $table->{'family'} });
redirect("index.cgi");
}
ui_print_header(undef, $text{'delete_title'}, "", "intro", 1, 1);
print ui_form_start("delete_table.cgi");
print ui_hidden("table", $in{'table'});
print "<center><b>",
text('delete_confirm',
"<tt>$table->{'family'} $table->{'name'}</tt>"),
"</b><p>\n";
print ui_submit($text{'delete'}, "confirm");
print "</center>\n";
print ui_form_end();
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

87
nftables/edit_chain.cgi Normal file
View File

@@ -0,0 +1,87 @@
#!/usr/bin/perl
# edit_chain.cgi
# Display a form for creating or editing a chain
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'chain_notable'});
my $chain = { };
my $chain_name = "";
my $is_new = $in{'new'} ? 1 : 0;
if ($is_new) {
ui_print_header(undef, $text{'chain_title_new'}, "", "intro", 1, 1);
} else {
$chain_name = $in{'chain'};
$chain = $table->{'chains'}->{$chain_name};
$chain || error($text{'chain_nochain'});
ui_print_header(undef, $text{'chain_title_edit'}, "", "intro", 1, 1);
}
my @type_opts = (
[ "", $text{'chain_type_none'} ],
map { [ $_, $_ ] } qw(filter nat route)
);
my @hook_opts = (
[ "", $text{'chain_hook_none'} ],
map { [ $_, $_ ] } qw(prerouting input forward output postrouting ingress)
);
my @policy_opts = (
[ "", $text{'chain_policy_none'} ],
map { [ $_, $_ ] } qw(accept drop reject return queue continue)
);
print ui_form_start("save_chain.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("new", $is_new);
print ui_table_start($text{'chain_header'}, "width=100%", 2);
my $name_tags = $is_new ? undef : "readonly";
print ui_table_row(hlink($text{'chain_name'}, "chain_name"),
ui_textbox("chain_name", $chain_name, 20, 0, undef, $name_tags));
print ui_table_row(hlink($text{'chain_type'}, "chain_type"),
ui_select("chain_type", $chain->{'type'}, \@type_opts, 1, 0, 1, 0,
"onchange='toggle_chain_base()'"));
print ui_table_row(hlink($text{'chain_hook'}, "chain_hook"),
ui_select("chain_hook", $chain->{'hook'}, \@hook_opts, 1, 0, 1));
print ui_table_row(hlink($text{'chain_priority'}, "chain_priority"),
ui_textbox("chain_priority", $chain->{'priority'}, 10));
print ui_table_row(hlink($text{'chain_policy'}, "chain_policy"),
ui_select("chain_policy", $chain->{'policy'}, \@policy_opts, 1, 0, 1));
print ui_table_end();
print ui_form_end([ [ undef, $text{$is_new ? 'create' : 'save'} ] ]);
print <<'EOF';
<script>
function toggle_chain_base() {
var type = document.getElementById('chain_type');
var disabled = !type || !type.value;
var ids = ['chain_hook', 'chain_priority', 'chain_policy'];
for (var i = 0; i < ids.length; i++) {
var el = document.getElementById(ids[i]);
if (el) {
el.disabled = disabled;
}
}
}
if (window.addEventListener) {
window.addEventListener('load', toggle_chain_base);
} else if (window.attachEvent) {
window.attachEvent('onload', toggle_chain_base);
}
</script>
EOF
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

646
nftables/edit_rule.cgi Executable file
View File

@@ -0,0 +1,646 @@
#!/usr/bin/perl
# edit_rule.cgi
# Display a form for creating or editing a rule
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text, %config);
ReadParse();
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
my $rule;
my $chain_def;
my $chain_hook;
my $action_sel;
my $proto_sel;
my $icmp_type;
my $log_enabled;
my $raw_extra = "";
my $ct_state_sel;
my $tcp_flags_sel;
my $advanced_open;
my $saddr_set;
my $daddr_set;
my $sport_set;
my $dport_set;
my $saddr_val;
my $daddr_val;
my $sport_val;
my $dport_val;
my @addr_set_opts;
my @port_set_opts;
my %set_families;
sub split_multi_value
{
my ($v) = @_;
return if (!defined($v) || $v eq '');
$v =~ s/^\s*\{//;
$v =~ s/\}\s*$//;
$v =~ s/^\s+//;
$v =~ s/\s+$//;
return if ($v eq '');
my @vals = split(/\s*,\s*/, $v);
@vals = grep { $_ ne '' } @vals;
return \@vals;
}
if ($in{'new'}) {
ui_print_header(undef, $text{'edit_title_new'}, "", "intro", 1, 1);
$rule = { 'chain' => $in{'chain'} };
} else {
ui_print_header(undef, $text{'edit_title_edit'}, "", "intro", 1, 1);
$rule = $table->{'rules'}->[$in{'idx'}];
}
if ($table && $rule->{'chain'}) {
$chain_def = $table->{'chains'}->{$rule->{'chain'}};
$chain_hook = $chain_def ? $chain_def->{'hook'} : undef;
}
if ($rule) {
if ($rule->{'exprs'} && ref($rule->{'exprs'}) eq 'ARRAY') {
my @raw = map { $_->{'text'} }
grep { $_->{'type'} && $_->{'type'} eq 'raw' }
@{$rule->{'exprs'}};
$raw_extra = join(" ", @raw);
}
if ($rule->{'jump'}) {
$action_sel = 'jump';
}
elsif ($rule->{'goto'}) {
$action_sel = 'goto';
}
else {
$action_sel = $rule->{'action'};
}
$action_sel ||= 'accept';
$proto_sel = $rule->{'proto'} || $rule->{'l4proto'};
if (!$proto_sel) {
$proto_sel = 'icmp' if ($rule->{'icmp_type'});
$proto_sel = 'icmpv6' if ($rule->{'icmpv6_type'});
}
$proto_sel ||= 'tcp' if ($in{'new'});
$icmp_type = $rule->{'icmp_type'} || $rule->{'icmpv6_type'};
$ct_state_sel = split_multi_value($rule->{'ct_state'});
$tcp_flags_sel = split_multi_value($rule->{'tcp_flags'});
$log_enabled = $rule->{'log'} || $rule->{'log_prefix'} || $rule->{'log_level'};
}
$saddr_set = set_name_from_value($rule->{'saddr'});
$daddr_set = set_name_from_value($rule->{'daddr'});
$sport_set = set_name_from_value($rule->{'sport'});
$dport_set = set_name_from_value($rule->{'dport'});
$saddr_val = $saddr_set ? "" : $rule->{'saddr'};
$daddr_val = $daddr_set ? "" : $rule->{'daddr'};
$sport_val = $sport_set ? "" : $rule->{'sport'};
$dport_val = $dport_set ? "" : $rule->{'dport'};
@addr_set_opts = ( [ "", $text{'edit_set_none'} ] );
@port_set_opts = ( [ "", $text{'edit_set_none'} ] );
my %addr_set_seen;
my %port_set_seen;
if ($table && $table->{'sets'} && ref($table->{'sets'}) eq 'HASH') {
foreach my $s (sort keys %{$table->{'sets'}}) {
my $set = $table->{'sets'}->{$s} || { };
my $label = $s;
$label .= " ($set->{'type'})" if ($set->{'type'});
my $kind = set_type_kind($set->{'type'});
if (!$kind || $kind eq 'addr') {
push(@addr_set_opts, [ $s, $label ]);
$addr_set_seen{$s} = 1;
}
if (!$kind || $kind eq 'port') {
push(@port_set_opts, [ $s, $label ]);
$port_set_seen{$s} = 1;
}
my $fam = set_type_family($set->{'type'});
$set_families{$s} = $fam if ($fam);
}
}
if ($saddr_set && !$addr_set_seen{$saddr_set}) {
push(@addr_set_opts, [ $saddr_set, $saddr_set ]);
}
if ($daddr_set && !$addr_set_seen{$daddr_set}) {
push(@addr_set_opts, [ $daddr_set, $daddr_set ]);
}
if ($sport_set && !$port_set_seen{$sport_set}) {
push(@port_set_opts, [ $sport_set, $sport_set ]);
}
if ($dport_set && !$port_set_seen{$dport_set}) {
push(@port_set_opts, [ $dport_set, $dport_set ]);
}
$advanced_open = 1 if ($action_sel && ($action_sel eq 'jump' || $action_sel eq 'goto'));
$advanced_open = 1 if ($rule && (
$rule->{'jump'} || $rule->{'goto'} ||
$rule->{'iif'} || $rule->{'oif'} ||
$icmp_type ||
$rule->{'ct_state'} ||
$rule->{'tcp_flags'} || $rule->{'tcp_flags_mask'} ||
$rule->{'limit_rate'} || $rule->{'limit_burst'} ||
$log_enabled ||
$rule->{'counter'}
));
my @icmp_types = qw(
echo-reply destination-unreachable source-quench redirect echo-request
router-advertisement router-solicitation time-exceeded parameter-problem
timestamp-request timestamp-reply info-request info-reply
address-mask-request address-mask-reply
);
my @icmpv6_types = qw(
destination-unreachable packet-too-big time-exceeded parameter-problem
echo-request echo-reply mld-listener-query mld-listener-report
mld-listener-done mld-listener-reduction nd-router-solicit
nd-router-advert nd-neighbor-solicit nd-neighbor-advert nd-redirect
router-renumbering ind-neighbor-solicit ind-neighbor-advert
mld2-listener-report
);
my %icmp_seen;
my @icmp_type_opts = ( [ "", $text{'edit_proto_any'} ] );
foreach my $t (@icmp_types, @icmpv6_types) {
next if ($icmp_seen{$t}++);
push(@icmp_type_opts, [ $t, $t ]);
}
my @ct_state_opts = (
[ "", $text{'edit_proto_any'} ],
map { [ $_, $_ ] } qw(invalid new established related untracked),
);
my @tcp_flags_opts = (
[ "", $text{'edit_proto_any'} ],
map { [ $_, $_ ] } qw(fin syn rst psh ack urg ecn cwr),
);
print ui_form_start("save_rule.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("idx", $in{'idx'});
print ui_hidden("chain", $rule->{'chain'});
print ui_hidden("new", $in{'new'});
print ui_hidden("raw_extra", $raw_extra);
print ui_table_start($text{'edit_header'}, "width=100%", 2);
# Rule comment
print ui_table_row(hlink($text{'edit_comment'}, "comment"),
ui_textbox("comment", $rule->{'comment'}, 50));
# Action
print ui_table_row(hlink($text{'edit_action'}, "action"),
ui_select("action", $action_sel,
[
[ "accept", $text{'index_accept'} ],
[ "drop", $text{'index_drop'} ],
[ "reject", $text{'index_reject'} ],
[ "return", $text{'edit_return'} ],
[ "jump", $text{'edit_jump_action'} ],
[ "goto", $text{'edit_goto_action'} ],
]));
# Addresses
my $saddr_row = ui_textbox("saddr", $saddr_val, 30);
if (@addr_set_opts > 1) {
$saddr_row .= "<br>".text('edit_saddr_set',
ui_select("saddr_set", $saddr_set, \@addr_set_opts, 1, 0, 1));
}
print ui_table_row(hlink($text{'edit_saddr'}, "saddr"), $saddr_row);
my $daddr_row = ui_textbox("daddr", $daddr_val, 30);
if (@addr_set_opts > 1) {
$daddr_row .= "<br>".text('edit_daddr_set',
ui_select("daddr_set", $daddr_set, \@addr_set_opts, 1, 0, 1));
}
print ui_table_row(hlink($text{'edit_daddr'}, "daddr"), $daddr_row);
# Protocol
print ui_table_row(hlink($text{'edit_proto'}, "proto"),
ui_select("proto", $proto_sel,
[
[ "", $text{'edit_proto_any'} ],
[ "tcp", "TCP" ],
[ "udp", "UDP" ],
[ "icmp", "ICMP" ],
[ "icmpv6", "ICMPv6" ],
]));
# Ports
my $sport_row = ui_textbox("sport", $sport_val, 10);
if (@port_set_opts > 1) {
$sport_row .= "<br>".text('edit_sport_set',
ui_select("sport_set", $sport_set, \@port_set_opts, 1, 0, 1));
}
print ui_table_row(hlink($text{'edit_sport'}, "sport"), $sport_row);
my $dport_row = ui_textbox("dport", $dport_val, 10);
if (@port_set_opts > 1) {
$dport_row .= "<br>".text('edit_dport_set',
ui_select("dport_set", $dport_set, \@port_set_opts, 1, 0, 1));
}
print ui_table_row(hlink($text{'edit_dport'}, "dport"), $dport_row);
print ui_table_end();
print ui_hidden_table_start($text{'edit_advanced'}, "width=100%", 2,
"advanced", $advanced_open ? 1 : 0);
# Jump/Goto target chain
print ui_table_row(hlink($text{'edit_jump'}, "jump"),
ui_textbox("jump", $rule->{'jump'}, 20));
print ui_table_row(hlink($text{'edit_goto'}, "goto"),
ui_textbox("goto", $rule->{'goto'}, 20));
# Interfaces
if ($chain_hook && $chain_hook eq 'input') {
# Incoming interface
print ui_table_row(hlink($text{'edit_iif'}, "iif"),
interface_choice("iif", $rule->{'iif'}, $text{'edit_if_any'}));
}
elsif ($chain_hook && $chain_hook eq 'output') {
# Outgoing interface
print ui_table_row(hlink($text{'edit_oif'}, "oif"),
interface_choice("oif", $rule->{'oif'}, $text{'edit_if_any'}));
}
else {
# Forward or unknown chain - allow both
print ui_table_row(hlink($text{'edit_iif'}, "iif"),
interface_choice("iif", $rule->{'iif'}, $text{'edit_if_any'}));
print ui_table_row(hlink($text{'edit_oif'}, "oif"),
interface_choice("oif", $rule->{'oif'}, $text{'edit_if_any'}));
}
# ICMP type
print ui_table_row(hlink($text{'edit_icmp_type'}, "icmp_type"),
ui_select("icmp_type", $icmp_type, \@icmp_type_opts, 1, 0, 1));
# Conntrack state
print ui_table_row(hlink($text{'edit_ct_state'}, "ct_state"),
ui_select("ct_state", $ct_state_sel, \@ct_state_opts, 5, 1, 1));
# TCP flags
print ui_table_row(hlink($text{'edit_tcp_flags'}, "tcp_flags"),
ui_select("tcp_flags", $tcp_flags_sel, \@tcp_flags_opts, 8, 1, 1));
print ui_table_row(hlink($text{'edit_tcp_flags_mask'}, "tcp_flags_mask"),
ui_textbox("tcp_flags_mask", $rule->{'tcp_flags_mask'}, 20));
# Limit
print ui_table_row(hlink($text{'edit_limit_rate'}, "limit_rate"),
ui_textbox("limit_rate", $rule->{'limit_rate'}, 20));
print ui_table_row(hlink($text{'edit_limit_burst'}, "limit_burst"),
ui_textbox("limit_burst", $rule->{'limit_burst'}, 10));
# Log
my $log_row = ui_checkbox("log", 1, hlink($text{'edit_log_enable'}, "log_enable"), $log_enabled);
$log_row .= "<br>".text('edit_log_prefix', ui_textbox("log_prefix", $rule->{'log_prefix'}, 20));
$log_row .= " ".text('edit_log_level', ui_textbox("log_level", $rule->{'log_level'}, 10));
print ui_table_row($text{'edit_log'}, $log_row);
# Counter
print ui_table_row(hlink($text{'edit_counter'}, "counter"),
ui_checkbox("counter", 1, $text{'edit_counter_enable'}, $rule->{'counter'}));
print ui_hidden_table_end("advanced");
print ui_table_start($text{'edit_rule'}, "width=100%", 2);
# Raw rule (read-only unless edit direct is checked)
my $raw_controls = ui_checkbox("edit_direct", 1, $text{'edit_raw_rule_direct'}, 0);
my $raw_area = ui_textarea("raw_rule", $rule->{'text'}, 4, 60, undef, undef,
"readonly='true'");
print ui_table_row(hlink($text{'edit_raw_rule'}, "raw_rule"), $raw_controls."<br>".$raw_area,
undef, undef, ["data-column-span='all' data-column-locked='1'"]);
print ui_table_end();
my @buttons;
if ($in{'new'}) {
push(@buttons, [ undef, $text{'create'} ]);
} else {
push(@buttons, [ undef, $text{'save'} ]);
push(@buttons, [ 'delete', $text{'delete'} ]);
}
print ui_form_end(\@buttons);
sub js_array
{
my (@vals) = @_;
return "[".join(",", map {
my $v = $_;
$v =~ s/\\/\\\\/g;
$v =~ s/"/\\"/g;
"\"$v\"";
} @vals)."]";
}
sub js_object
{
my (%vals) = @_;
return "{".join(",", map {
my $k = $_;
my $v = $vals{$k};
$k =~ s/\\/\\\\/g;
$k =~ s/"/\\"/g;
$v =~ s/\\/\\\\/g if (defined($v));
$v =~ s/"/\\"/g if (defined($v));
"\"$k\":\"$v\"";
} sort keys %vals)."}";
}
my $icmp_js = js_array(@icmp_types);
my $icmpv6_js = js_array(@icmpv6_types);
my $icmp_any = $text{'edit_proto_any'};
$icmp_any =~ s/\\/\\\\/g;
$icmp_any =~ s/"/\\"/g;
my $set_fam_js = js_object(%set_families);
print "<script>\n";
print "(function() {\n";
print " var icmpTypes = $icmp_js;\n";
print " var icmpv6Types = $icmpv6_js;\n";
print " var icmpAnyLabel = \"$icmp_any\";\n";
print " var setFamilies = $set_fam_js;\n";
print <<'EOF';
function byName(name) {
var els = document.getElementsByName(name);
return els && els.length ? els[0] : null;
}
function val(name) {
var el = byName(name);
if (!el) return "";
if (el.tagName === "SELECT" && el.multiple) {
var vals = [];
var sawEmpty = false;
for (var i = 0; i < el.options.length; i++) {
var opt = el.options[i];
if (opt.selected) {
if (opt.value === "") sawEmpty = true;
else vals.push(opt.value);
}
}
if (vals.length && sawEmpty) {
for (var j = 0; j < el.options.length; j++) {
if (el.options[j].value === "") el.options[j].selected = false;
}
}
return vals.join(",");
}
if (el.type === "checkbox") {
return el.checked ? (el.value || "1") : "";
}
return el.value || "";
}
function ifaceVal(name) {
var v = val(name);
if (v === "other") {
return val(name + "_other");
}
return v;
}
function escapeNft(s) {
return s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
}
function isNumeric(s) {
return /^[0-9]+$/.test(s);
}
function guessFamily(addr) {
return addr.indexOf(":") >= 0 ? "ip6" : "ip";
}
function familyForSet(name) {
return setFamilies && setFamilies[name] ? setFamilies[name] : "";
}
function familyForValue(val) {
if (!val) return "";
if (val.charAt(0) === "@") {
var fam = familyForSet(val.substr(1));
if (fam) return fam;
}
return guessFamily(val);
}
function buildRule() {
var direct = byName("edit_direct");
if (direct && direct.checked) return;
var parts = [];
var iif = ifaceVal("iif");
if (iif) parts.push("iif \"" + escapeNft(iif) + "\"");
var oif = ifaceVal("oif");
if (oif) parts.push("oif \"" + escapeNft(oif) + "\"");
var saddrSet = val("saddr_set");
var saddr = val("saddr");
if (saddrSet) {
var sf = familyForSet(saddrSet) || guessFamily("@" + saddrSet);
parts.push(sf + " saddr @" + saddrSet);
} else if (saddr) {
parts.push(familyForValue(saddr) + " saddr " + saddr);
}
var daddrSet = val("daddr_set");
var daddr = val("daddr");
if (daddrSet) {
var df = familyForSet(daddrSet) || guessFamily("@" + daddrSet);
parts.push(df + " daddr @" + daddrSet);
} else if (daddr) {
parts.push(familyForValue(daddr) + " daddr " + daddr);
}
var proto = val("proto");
var sportSet = val("sport_set");
var dportSet = val("dport_set");
var sport = sportSet ? ("@" + sportSet) : val("sport");
var dport = dportSet ? ("@" + dportSet) : val("dport");
var icmpType = val("icmp_type");
if (!proto && (sport || dport)) {
proto = "tcp";
}
var l4proto = "";
var portProto = "";
if (proto && (proto === "tcp" || proto === "udp")) {
portProto = proto;
if (!sport && !dport) {
l4proto = proto;
}
}
else if (proto) {
l4proto = proto;
}
if (l4proto) {
parts.push("meta l4proto " + l4proto);
}
if (sport && portProto) parts.push(portProto + " sport " + sport);
if (dport && portProto) parts.push(portProto + " dport " + dport);
if (proto === "icmp" && icmpType) parts.push("icmp type " + icmpType);
if (proto === "icmpv6" && icmpType) parts.push("icmpv6 type " + icmpType);
if (!proto && icmpType) {
var inIcmp = icmpTypes.indexOf(icmpType) >= 0;
var inIcmpv6 = icmpv6Types.indexOf(icmpType) >= 0;
if (inIcmpv6 && !inIcmp) {
parts.push("meta l4proto icmpv6");
parts.push("icmpv6 type " + icmpType);
} else {
parts.push("meta l4proto icmp");
parts.push("icmp type " + icmpType);
}
}
var tcpFlags = val("tcp_flags");
var tcpMask = val("tcp_flags_mask");
if (tcpFlags) {
if (tcpMask) parts.push("tcp flags & " + tcpMask + " == " + tcpFlags);
else parts.push("tcp flags " + tcpFlags);
}
var ctState = val("ct_state");
if (ctState) parts.push("ct state " + ctState);
var limitRate = val("limit_rate");
var limitBurst = val("limit_burst");
if (limitRate) {
var lim = "limit rate " + limitRate;
if (limitBurst) {
lim += " burst " + limitBurst;
if (isNumeric(limitBurst)) lim += " packets";
}
parts.push(lim);
}
var logBox = byName("log");
var logEnabled = logBox && logBox.checked;
var logPrefix = val("log_prefix");
var logLevel = val("log_level");
if (logEnabled || logPrefix || logLevel) {
var lp = ["log"];
if (logPrefix) lp.push("prefix \"" + escapeNft(logPrefix) + "\"");
if (logLevel) lp.push("level " + logLevel);
parts.push(lp.join(" "));
}
var counter = byName("counter");
if (counter && counter.checked) parts.push("counter");
var action = val("action");
var jump = val("jump");
var go = val("goto");
if (action === "jump" && jump) parts.push("jump " + jump);
else if (action === "goto" && go) parts.push("goto " + go);
else if (action && action !== "jump" && action !== "goto") parts.push(action);
var comment = val("comment");
if (comment) parts.push("comment \"" + escapeNft(comment) + "\"");
var extra = val("raw_extra");
if (extra) parts.push(extra);
var raw = parts.join(" ").replace(/^\s+|\s+$/g, "");
var rawEl = byName("raw_rule");
if (rawEl) rawEl.value = raw;
}
function toggleDirect() {
var direct = byName("edit_direct");
var on = direct && direct.checked;
var form = direct ? direct.form : document.forms[0];
if (!form) return;
var els = form.querySelectorAll("input, select, textarea");
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (el.name === "edit_direct" || el.name === "raw_rule") continue;
if (el.type === "hidden" || el.type === "submit" || el.type === "button") continue;
el.disabled = on;
}
var rawEl = byName("raw_rule");
if (rawEl) rawEl.readOnly = !on;
if (!on) buildRule();
}
function uniqList(list) {
var seen = {};
var out = [];
for (var i = 0; i < list.length; i++) {
var v = list[i];
if (seen[v]) continue;
seen[v] = true;
out.push(v);
}
return out;
}
function updateIcmpTypes() {
var el = byName("icmp_type");
if (!el) return;
var proto = val("proto");
var current = el.value || "";
var list;
if (proto === "icmp") list = icmpTypes;
else if (proto === "icmpv6") list = icmpv6Types;
else list = uniqList(icmpTypes.concat(icmpv6Types));
while (el.options.length) {
el.remove(0);
}
var optAny = document.createElement("option");
optAny.value = "";
optAny.text = icmpAnyLabel;
el.add(optAny);
for (var i = 0; i < list.length; i++) {
var opt = document.createElement("option");
opt.value = list[i];
opt.text = list[i];
el.add(opt);
}
if (current && list.indexOf(current) >= 0) el.value = current;
else el.value = "";
}
function maybeSetProtoFromIcmp() {
var protoEl = byName("proto");
if (!protoEl || protoEl.value) return;
var t = val("icmp_type");
if (!t) return;
var inIcmp = icmpTypes.indexOf(t) >= 0;
var inIcmpv6 = icmpv6Types.indexOf(t) >= 0;
if (inIcmp && !inIcmpv6) protoEl.value = "icmp";
else if (inIcmpv6 && !inIcmp) protoEl.value = "icmpv6";
if (protoEl.value) updateIcmpTypes();
}
function bind() {
var direct = byName("edit_direct");
var form = direct ? direct.form : document.forms[0];
if (!form) return;
var els = form.querySelectorAll("input, select, textarea");
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (el.name === "raw_rule") continue;
if (el.name === "edit_direct") {
el.addEventListener("change", toggleDirect);
continue;
}
if (el.name === "proto") {
el.addEventListener("change", function() {
updateIcmpTypes();
buildRule();
});
continue;
}
if (el.name === "icmp_type") {
el.addEventListener("change", function() {
maybeSetProtoFromIcmp();
buildRule();
});
continue;
}
el.addEventListener("input", buildRule);
el.addEventListener("change", buildRule);
}
updateIcmpTypes();
toggleDirect();
buildRule();
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", bind);
} else {
bind();
}
})();
</script>
EOF
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

86
nftables/edit_set.cgi Executable file
View File

@@ -0,0 +1,86 @@
#!/usr/bin/perl
# edit_set.cgi
# Display a form for creating or editing a set
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'set_notable'});
my $set = { };
my $set_name = "";
my $is_new = $in{'new'} ? 1 : 0;
if ($is_new) {
ui_print_header(undef, $text{'set_title_new'}, "", "intro", 1, 1);
}
else {
$set_name = $in{'set'};
$set = $table->{'sets'}->{$set_name};
$set || error($text{'set_noset'});
ui_print_header(undef, $text{'set_title_edit'}, "", "intro", 1, 1);
}
my $elements_text = set_elements_text($set);
my @type_opts = (
[ "", $text{'set_type_select'} ],
[ "ipv4_addr", "ipv4_addr" ],
[ "ipv6_addr", "ipv6_addr" ],
[ "ether_addr", "ether_addr" ],
[ "inet_proto", "inet_proto" ],
[ "inet_service", "inet_service" ],
[ "mark", "mark" ],
);
my %type_seen = map { $_->[0] => 1 } @type_opts;
if ($set->{'type'} && !$type_seen{$set->{'type'}}) {
push(@type_opts, [ $set->{'type'}, $set->{'type'} ]);
}
my @flag_opts = (
[ "constant", "constant" ],
[ "dynamic", "dynamic" ],
[ "interval", "interval" ],
[ "timeout", "timeout" ],
);
my @flags_sel;
my $flags_sel;
if ($set->{'flags'}) {
@flags_sel = split(/\s+|,\s*/, $set->{'flags'});
@flags_sel = grep { $_ ne '' } @flags_sel;
my %flag_seen = map { $_->[0] => 1 } @flag_opts;
foreach my $f (@flags_sel) {
push(@flag_opts, [ $f, $f ]) if (!$flag_seen{$f}++);
}
}
$flags_sel = @flags_sel ? \@flags_sel : undef;
print ui_form_start("save_set.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("new", $is_new);
print ui_hidden("set", $set_name) if (!$is_new);
print ui_table_start($text{'set_header'}, "width=100%", 2);
my $name_tags = $is_new ? undef : "readonly";
print ui_table_row(hlink($text{'set_name'}, "set_name"),
ui_textbox("set_name", $set_name, 20, 0, undef, $name_tags));
print ui_table_row(hlink($text{'set_type'}, "set_type"),
ui_select("set_type", $set->{'type'}, \@type_opts, 1, 0, 1));
print ui_table_row(hlink($text{'set_flags'}, "set_flags"),
ui_select("set_flags", $flags_sel, \@flag_opts, 5, 1, 1));
my $elem_field = ui_textarea("set_elements", $elements_text, 6, 60);
$elem_field .= "<br><small>$text{'set_elements_desc'}</small>";
print ui_table_row(hlink($text{'set_elements'}, "set_elements"),
$elem_field);
print ui_table_end();
print ui_form_end([ [ undef, $text{$is_new ? 'create' : 'save'} ] ]);
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

View File

@@ -0,0 +1,7 @@
<header>Action</header>
<p>Verdict or control action for matching packets.</p>
<ul>
<li>Accept, Drop, Reject, Return</li>
<li>Jump or Goto to another chain</li>
</ul>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Hook</header>
<p>Base chain hook point, such as <tt>prerouting</tt>, <tt>input</tt>, <tt>forward</tt>, <tt>output</tt>, <tt>postrouting</tt>, or <tt>ingress</tt>.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Chain name</header>
<p>Unique name for the chain within this table. Use letters, numbers, underscores, and dashes.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Policy</header>
<p>Default action for this base chain, such as <tt>accept</tt>, <tt>drop</tt>, <tt>reject</tt>, <tt>queue</tt>, or <tt>continue</tt>.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Priority</header>
<p>Priority for this base chain. Lower values run earlier. Common values include <tt>-300</tt>, <tt>-150</tt>, <tt>0</tt>, or <tt>100</tt>.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Chain type</header>
<p>Base chain type, such as <tt>filter</tt>, <tt>nat</tt>, or <tt>route</tt>. Leave blank to create a regular chain with no hook.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,6 @@
<header>Comment</header>
Optional note stored with the rule.<p>
Saved as comment "text"; quotes and backslashes are escaped.<p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Counter</header>
<p>Add a counter to track packets and bytes.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Counter</header>
<p>Add a counter to track packets and bytes.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,10 @@
<header>Conntrack state</header>
<p>Select one or more states to match.</p>
<ul>
<li>invalid</li>
<li>new</li>
<li>established</li>
<li>related</li>
<li>untracked</li>
</ul>
<footer>nft(8)</footer>

3
nftables/help/daddr.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Destination address</header>
<p>IPv4/IPv6 address or CIDR (e.g., 2001:db8::/32).</p>
<footer>nft(8)</footer>

3
nftables/help/dport.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Destination port</header>
<p>TCP/UDP destination port number or range (e.g., 80 or 1000-2000).</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,4 @@
<header>Edit directly</header>
<p>Disable structured fields and edit the raw rule line.</p>
<p>Validation occurs on save.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,4 @@
<header>Edit directly</header>
<p>Disable structured fields and edit the raw rule line.</p>
<p>Validation occurs on save.</p>
<footer>nft(8)</footer>

4
nftables/help/goto.html Normal file
View File

@@ -0,0 +1,4 @@
<header>Goto target chain</header>
<p>Name of the chain to transfer control to.</p>
<p>Does not return to the calling chain.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,5 @@
<header>ICMP/ICMPv6 type</header>
<p>Select a type name (or leave blank for any). The valid names depend on the protocol.</p>
<p>ICMP types: echo-reply, destination-unreachable, source-quench, redirect, echo-request, router-advertisement, router-solicitation, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply.</p>
<p>ICMPv6 types: destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-done, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, router-renumbering, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report.</p>
<footer>nft(8)</footer>

3
nftables/help/iif.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Incoming interface</header>
<p>Match the incoming interface name (e.g., eth0).</p>
<footer>nft(8)</footer>

4
nftables/help/intro.html Normal file
View File

@@ -0,0 +1,4 @@
<header>Introduction</header>
<p>nftables stores firewall rules in tables. Each table belongs to a family (such as <tt>inet</tt>, <tt>ip</tt>, or <tt>ip6</tt>) and contains one or more chains. Chains contain rules, and each rule is a sequence of tests (matches) followed by an action like <tt>accept</tt>, <tt>drop</tt>, <tt>jump</tt>, or <tt>log</tt>. Named sets can group addresses or services for reuse in multiple rules.</p>
<p>To get started, use the Setup page to create a default ruleset, or create a table and chain manually. Then add rules (and sets) from the table view. When you are ready to activate your changes, click Apply Configuration to load the ruleset into the kernel.</p>
<footer>nft(8)</footer>

4
nftables/help/jump.html Normal file
View File

@@ -0,0 +1,4 @@
<header>Jump target chain</header>
<p>Name of the chain to call.</p>
<p>Control returns to the next rule after the jump.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Limit burst</header>
<p>Optional burst size in packets.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Limit rate</header>
<p>Rate limit (e.g., 10/second, 5/minute, 100/hour).</p>
<footer>nft(8)</footer>

4
nftables/help/log.html Normal file
View File

@@ -0,0 +1,4 @@
<header>Logging</header>
<p>Add a log statement before the verdict.</p>
<p>Use prefix and level to customize.</p>
<footer>nft(8)</footer>

4
nftables/help/log_1.html Normal file
View File

@@ -0,0 +1,4 @@
<header>Logging</header>
<p>Add a log statement before the verdict.</p>
<p>Use prefix and level to customize.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Log level</header>
<p>Common values: emerg, alert, crit, err, warning, notice, info, debug.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Log prefix</header>
<p>String prepended to the log message.</p>
<footer>nft(8)</footer>

3
nftables/help/oif.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Outgoing interface</header>
<p>Match the outgoing interface name (e.g., eth1).</p>
<footer>nft(8)</footer>

7
nftables/help/proto.html Normal file
View File

@@ -0,0 +1,7 @@
<header>Protocol</header>
<p>Select a protocol to match.</p>
<ul>
<li>Any, TCP, UDP, ICMP, ICMPv6</li>
</ul>
<p>Ports apply to TCP/UDP; ICMP uses the type field.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,4 @@
<header>Raw rule</header>
<p>Generated rule line.</p>
<p>In Edit directly mode, this is the rule that will be saved.</p>
<footer>nft(8)</footer>

3
nftables/help/saddr.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Source address</header>
<p>IPv4/IPv6 address or CIDR (e.g., 192.168.1.0/24).</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Set elements</header>
<p>Elements to store in the set. Separate entries with commas or newlines. Use nftables syntax, such as IPs/CIDR for address sets or ports for service sets.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Set flags</header>
<p>Optional flags for the set, like <tt>interval</tt> or <tt>timeout</tt>. Use the same syntax as nftables, separated by spaces if multiple.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Set name</header>
<p>Unique name for the set within the table. Use letters, numbers, underscores, or dashes. Rules reference a set as <tt>@name</tt>.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,3 @@
<header>Set type</header>
<p>Type of elements stored in the set, such as <tt>ipv4_addr</tt>, <tt>ipv6_addr</tt>, or <tt>inet_service</tt>. This must match the elements you enter.</p>
<footer>nft(8)</footer>

3
nftables/help/sport.html Normal file
View File

@@ -0,0 +1,3 @@
<header>Source port</header>
<p>TCP/UDP source port number or range (e.g., 22 or 1000-2000).</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,14 @@
<header>TCP flags</header>
<p>Select one or more TCP flags to match.</p>
<ul>
<li>fin</li>
<li>syn</li>
<li>rst</li>
<li>psh</li>
<li>ack</li>
<li>urg</li>
<li>ecn</li>
<li>cwr</li>
</ul>
<p>Use the mask field for a bitmask match.</p>
<footer>nft(8)</footer>

View File

@@ -0,0 +1,4 @@
<header>TCP flags mask</header>
<p>Optional mask used with tcp flags &amp; mask == value.</p>
<p>Example mask: syn|rst.</p>
<footer>nft(8)</footer>

BIN
nftables/images/icon.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

206
nftables/index.cgi Executable file
View File

@@ -0,0 +1,206 @@
#!/usr/bin/perl
# index.cgi
# Display current nftables configuration
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text, %config);
ReadParse();
my $partial = $in{'partial'};
if (!$partial) {
ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1);
}
# Check for nft command
my $cmd = $config{'nft_cmd'} || has_command("nft");
if (!$cmd) {
print text('index_ecommand', "<tt>nft</tt>");
if (!$partial) {
ui_print_footer("/", $text{'index'});
}
exit;
}
# Check if kernel supports it (basic check)
my $out = backquote_command("$cmd list ruleset 2>&1");
if ($? && $out !~ /no ruleset/i) {
# If it fails and not just empty
print text('index_ekernel', "<pre>$out</pre>");
if (!$partial) {
ui_print_footer("/", $text{'index'});
}
exit;
}
# Load tables
my @tables = get_nftables_save();
my $rules_html = "";
if (!@tables) {
$rules_html .= "<b>$text{'index_none'}</b><p>\n";
$rules_html .= ui_buttons_start();
$rules_html .= ui_buttons_row("setup.cgi", $text{'index_setup'}, $text{'index_setupdesc'});
$rules_html .= ui_buttons_row("create_table.cgi", $text{'index_table_create'},
$text{'index_table_createdesc'});
$rules_html .= ui_buttons_end();
} else {
# Select table
if (!defined($in{'table'}) || $in{'table'} !~ /^\d+$/ ||
$in{'table'} > $#tables) {
$in{'table'} = 0;
}
my @table_opts;
for (my $i = 0; $i <= $#tables; $i++) {
my $t = $tables[$i];
push(@table_opts, [ $i, $t->{'family'}." ".$t->{'name'} ]);
}
if (!$partial) {
print ui_form_start("index.cgi");
print "<div class='nftables_table_select'>\n";
print text('index_change')," ";
print ui_select("table", $in{'table'}, \@table_opts, 1, 0, 1, 0,
"onchange='this.form.querySelector(\"[name=nft_submit]\").click()'");
print ui_submit("", "nft_submit", 0, "style='display:none'");
print "</div>\n";
print ui_form_end();
}
# Identify current table
my $curr = $tables[$in{'table'}];
if ($curr) {
# Show sets
$rules_html .= ui_hr();
$rules_html .= "<b>$text{'index_sets'}</b><br>\n";
if ($curr->{'sets'} && ref($curr->{'sets'}) eq 'HASH' &&
keys %{$curr->{'sets'}}) {
$rules_html .= ui_columns_start(
[ $text{'index_set_name'}, $text{'index_set_type'},
$text{'index_set_flags'}, $text{'index_set_elements'},
$text{'index_set_actions'} ], 100);
foreach my $s (sort keys %{$curr->{'sets'}}) {
my $set = $curr->{'sets'}->{$s} || { };
my $actions_html =
ui_link("edit_set.cgi?table=$in{'table'}&set=".
urlize($s), $text{'index_set_edit'})."<br>".
ui_link("delete_set.cgi?table=$in{'table'}&set=".
urlize($s), $text{'index_set_delete'});
$rules_html .= ui_columns_row([
$s,
$set->{'type'} || "-",
$set->{'flags'} || "-",
set_elements_summary($set),
$actions_html
]);
}
$rules_html .= ui_columns_end();
}
else {
$rules_html .= "<i>$text{'index_sets_none'}</i><br>\n";
}
$rules_html .= ui_buttons_start();
$rules_html .= ui_buttons_row(
"edit_set.cgi?table=$in{'table'}&new=1",
$text{'index_set_create'},
$text{'index_set_createdesc'});
$rules_html .= ui_buttons_end();
# Show chains and rules
$rules_html .= ui_hr();
$rules_html .= ui_columns_start(
[ $text{'index_chain_col'}, $text{'index_type'},
$text{'index_hook'}, $text{'index_priority'},
$text{'index_policy_col'}, $text{'index_rules'},
$text{'index_actions'} ], 100);
foreach my $c (sort keys %{$curr->{'chains'}}) {
my $chain_def = $curr->{'chains'}->{$c} || { };
my $policy = $chain_def->{'policy'};
my $policy_label = $policy ?
($text{'index_policy_'.lc($policy)} || uc($policy)) : "-";
my @rules = grep { $_->{'chain'} eq $c } @{$curr->{'rules'}};
my $rules_html_row;
if (@rules) {
my $ri = 0;
$rules_html_row = "<table class='nftables_rules_table' width='100%'>\n";
foreach my $r (@rules) {
my $desc = describe_rule($r);
my $rule_link = ui_link(
"edit_rule.cgi?table=$in{'table'}&chain=".
urlize($c)."&idx=$r->{'index'}",
$desc);
my $move = ui_up_down_arrows(
"move_rule.cgi?table=$in{'table'}&chain=".
urlize($c)."&idx=$r->{'index'}&dir=up",
"move_rule.cgi?table=$in{'table'}&chain=".
urlize($c)."&idx=$r->{'index'}&dir=down",
$ri > 0,
$ri < $#rules);
$rules_html_row .= "<tr><td>$rule_link</td>".
"<td align='right' style='white-space:nowrap'>$move</td></tr>\n";
$ri++;
}
$rules_html_row .= "<tr><td colspan='2'>".
ui_link("edit_rule.cgi?table=$in{'table'}&chain=".
urlize($c)."&new=1", $text{'index_radd'}).
"</td></tr>\n";
$rules_html_row .= "</table>";
} else {
$rules_html_row = "<i>$text{'index_rules_none'}</i>";
$rules_html_row .= "<br>".
ui_link("edit_rule.cgi?table=$in{'table'}&chain=".
urlize($c)."&new=1", $text{'index_radd'});
}
my $actions_html =
ui_link("edit_chain.cgi?table=$in{'table'}&chain=".
urlize($c), $text{'index_cedit'})."<br>".
ui_link("rename_chain.cgi?table=$in{'table'}&chain=".
urlize($c), $text{'index_crename'})."<br>".
ui_link("delete_chain.cgi?table=$in{'table'}&chain=".
urlize($c), $text{'index_cdelete'});
$rules_html .= ui_columns_row([
$c,
$chain_def->{'type'} || "-",
$chain_def->{'hook'} || "-",
defined($chain_def->{'priority'}) ? $chain_def->{'priority'} : "-",
$policy_label,
$rules_html_row,
$actions_html
]);
}
$rules_html .= ui_columns_end();
$rules_html .= ui_hr();
$rules_html .= ui_buttons_start();
$rules_html .= ui_buttons_row(
"edit_chain.cgi?table=$in{'table'}&new=1",
$text{'index_chain_create'},
$text{'index_chain_createdesc'});
$rules_html .= ui_buttons_row("delete_table.cgi?table=$in{'table'}",
$text{'index_table_delete'},
$text{'index_table_deletedesc'});
$rules_html .= ui_buttons_end();
}
}
if ($partial) {
print $rules_html;
exit;
}
print "<div id='nftables_ruleset'>\n";
print $rules_html;
print "</div>\n";
if (@tables) {
print ui_hr();
print ui_buttons_start();
print ui_buttons_row("create_table.cgi", $text{'index_table_create'},
$text{'index_table_createdesc'});
print ui_buttons_row("apply.cgi", $text{'index_apply'}, $text{'index_applydesc'});
print ui_buttons_end();
}
ui_print_footer("/", $text{'index'});

18
nftables/install_check.pl Normal file
View File

@@ -0,0 +1,18 @@
# install_check.pl
use strict;
use warnings;
our %config;
do './nftables-lib.pl';
# is_installed(mode)
# For mode 1, returns 2 if the server is installed and configured for use by
# Webmin, 1 if installed but not configured, or 0 otherwise.
# For mode 0, returns 1 if installed, 0 if not
sub is_installed {
my ($mode) = @_;
# Available config file in the default location?
return 0 if (!-x $config{'nft_cmd'});
return $mode ? 2 : 0;
}

222
nftables/lang/en Normal file
View File

@@ -0,0 +1,222 @@
index_title=NFTables Firewall
index_editing=Rules file $1
index_ecommand=The NFTables command $1 was not found on your system.
index_ekernel=An error occurred checking your current NFTables configuration: $1
index_header=Existing NFTables Rules
index_change=Show table:
index_table_filter=Packet filtering
index_table_nat=Network address translation
index_table_mangle=Packet alteration
index_table_ok=Display table
index_chain=Chain $1
index_action=Action
index_desc=Condition
index_comm=Comment
index_move=Move
index_add=Add
index_none=No rules defined for this chain.
index_policy=Set default action:
index_policy_accept=Accept
index_policy_drop=Drop
index_policy_queue=Userspace
index_policy_return=Return
index_chain_col=Chain
index_type=Type
index_hook=Hook
index_priority=Priority
index_policy_col=Policy
index_rules=Rules
index_rules_none=No rules
index_actions=Actions
index_sets=Sets
index_sets_none=No sets defined.
index_set_name=Name
index_set_type=Type
index_set_flags=Flags
index_set_elements=Elements
index_set_actions=Actions
index_set_create=Create set
index_set_createdesc=Add a new set to this table.
index_set_edit=Edit set
index_set_delete=Delete set
index_chain_create=Create chain
index_chain_createdesc=Add a new chain to this table.
index_cedit=Edit Chain
index_cdelete=Delete Chain
index_crename=Rename Chain
index_cclear=Clear All Rules
index_cdeletesel=Delete Selected
index_cmovesel=Move Selected
index_radd=Add Rule
index_apply=Apply Configuration
index_applydesc=Click this button to make the firewall configuration listed above active. Any current firewall rules will be flushed and replaced
index_unapply=Revert Configuration
index_unapplydesc=Click this button to reset the configuration listed above to the one that is currently active.
index_bootup=Activate at Boot
index_bootupdesc=Change whether this firewall is activated at boot time or not.
index_return=rules list
edit_title=Edit Rule
edit_header=Rule Details
edit_rule=Rule definition
create=Create
save=Save
delete=Delete
save_err=Failed to save rule
apply_err=Failed to apply configuration
setup_title=Setup Default Ruleset
setup_header=Create Default Ruleset
setup_desc=This page allows you to create a default nftables ruleset. Select one of the options below and click 'Create'.
setup_deny_note=Deny options will still allow SSH (port 22), Webmin (port $1), and localhost (loopback).
setup_allow_all=Allow all traffic
setup_deny_incoming=Deny all incoming traffic (except SSH and Webmin), allow all outgoing
setup_deny_all=Deny all traffic (except SSH and Webmin)
setup_create=Create
setup_invalid_type=Invalid ruleset type selected.
setup_failed=Failed to create default ruleset: <pre>$1</pre>
index_setup=Create Default Ruleset
index_setupdesc=Create a default set of rules, for example to allow all traffic.
index_table_create=Create table
index_table_createdesc=Add a new nftables table.
index_table_delete=Delete table
index_table_deletedesc=Remove the currently selected table.
index_rule_desc=Action $1 for protocol $2 and destination port $3
index_rule_desc2=Action $1 for outgoing interface $2
index_rule_desc3=Action $1 for incoming interface $2
index_rule_desc4=Action $1 for incoming interface $2 and outgoing interface $3
index_rule_desc_generic=Action $1 for $2
index_rule_desc_action=Action $1
index_rule_iif=Incoming interface $1
index_rule_oif=Outgoing interface $1
index_rule_saddr=Source $1
index_rule_daddr=Destination $1
index_rule_proto=Protocol $1
index_rule_sport=Source port $1
index_rule_dport=Destination port $1
index_rule_icmp=ICMP type $1
index_rule_icmpv6=ICMPv6 type $1
index_rule_ct=Conntrack state $1
index_rule_tcpflags=TCP flags $1
index_rule_limit=Limit $1
index_rule_log=Log
index_rule_log_prefix=Log prefix $1
index_rule_log_level=Log level $1
index_rule_counter=Counter
index_rule_jump=Jump $1
index_rule_goto=Goto $1
index_accept=Accept
index_drop=Drop
index_reject=Reject
index_return_action=Return
edit_title_new=Create Rule
edit_title_edit=Edit Rule
edit_comment=Comment
edit_action=Action
edit_return=Return
edit_jump_action=Jump
edit_goto_action=Goto
edit_jump=Jump target chain
edit_goto=Goto target chain
edit_proto=Protocol
edit_proto_any=Any
edit_saddr=Source address
edit_daddr=Destination address
edit_sport=Source Port
edit_dport=Destination Port
edit_set_none=None
edit_saddr_set=Use set $1
edit_daddr_set=Use set $1
edit_sport_set=Use set $1
edit_dport_set=Use set $1
edit_icmp_type=ICMP/ICMPv6 type
edit_ct_state=Conntrack state
edit_tcp_flags=TCP flags
edit_tcp_flags_mask=TCP flags mask
edit_limit_rate=Limit rate
edit_limit_burst=Limit burst
edit_log=Logging
edit_log_enable=Enable logging
edit_log_prefix=Prefix $1
edit_log_level=Level $1
edit_counter=Counter
edit_counter_enable=Enable counter
edit_raw_rule=Raw rule
edit_raw_rule_direct=Edit directly
edit_advanced=Advanced options
edit_oif=Outgoing Interface
edit_iif=Incoming Interface
edit_if_any=Any
chain_title_new=Create chain
chain_title_edit=Edit chain
chain_header=Chain Details
chain_name=Chain name
chain_type=Type
chain_hook=Hook
chain_priority=Priority
chain_policy=Policy
chain_type_none=Regular (no hook)
chain_hook_none=None
chain_policy_none=None
chain_err=Failed to save chain
chain_failed=Failed to save chain: <pre>$1</pre>
chain_ename=Chain name is invalid
chain_edup=A chain with that name already exists
chain_notable=No such table selected
chain_nochain=No such chain selected
chain_ebase=Base chains require type, hook, priority, and policy.
delete_chain_title=Delete chain
delete_chain_err=Failed to delete chain
delete_chain_failed=Failed to delete chain: <pre>$1</pre>
delete_chain_confirm=Are you sure you want to delete chain $1 from table $2?
delete_chain_inuse=Chain $1 is referenced by $2 rule(s) via jump/goto. Remove those rules first.
rename_chain_title=Rename chain
rename_chain_header=Rename chain
rename_chain_old=Current name
rename_chain_new=New name
rename_chain_ok=Rename
rename_chain_failed=Failed to rename chain: <pre>$1</pre>
create_title=Create table
create_header=Create a new table
create_family=Table family
create_name=Table name
create_ok=Create
create_err=Failed to create table
create_failed=Failed to create table: <pre>$1</pre>
create_ename=Table name is invalid
create_edup=A table with that name and family already exists
create_efamily=Invalid table family selected
delete_title=Delete table
delete_err=Failed to delete table
delete_failed=Failed to delete table: <pre>$1</pre>
delete_confirm=Are you sure you want to delete table $1?
delete_notable=No such table selected
save_failed=Failed to save rule: <pre>$1</pre>
save_raw_empty=Raw rule cannot be empty.
save_raw_multiline=Raw rule must be a single line.
save_invalid_rule=Raw rule is invalid: $1
save_set_missing=Selected set $1 does not exist.
move_err=Failed to move rule
move_failed=Failed to move rule: <pre>$1</pre>
move_notable=No such table selected
move_nochain=No such chain selected
move_norule=No such rule selected
set_title_new=Create set
set_title_edit=Edit set
set_header=Set Details
set_name=Set name
set_type=Type
set_type_select=Select type
set_flags=Flags
set_elements=Elements
set_elements_desc=Separate elements with commas or newlines.
set_err=Failed to save set
set_failed=Failed to save set: <pre>$1</pre>
set_ename=Set name is invalid
set_edup=A set with that name already exists
set_etype=Set type is required
set_notable=No such table selected
set_noset=No such set selected
delete_set_title=Delete set
delete_set_err=Failed to delete set
delete_set_failed=Failed to delete set: <pre>$1</pre>
delete_set_confirm=Are you sure you want to delete set $1 from table $2?
delete_set_inuse=Set $1 is referenced by $2 rule(s). Remove those rules first.

5
nftables/module.info Normal file
View File

@@ -0,0 +1,5 @@
name=Nftables
desc=NFTables Firewall
os_support=*-linux
category=net
longdesc=Configure a Linux firewall using NFTables. Allows the editing of all tables, chains, and rules.

40
nftables/move_rule.cgi Executable file
View File

@@ -0,0 +1,40 @@
#!/usr/bin/perl
# move_rule.cgi
# Move a rule up or down within a chain
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'move_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'move_notable'});
my $chain = $in{'chain'};
$chain || error($text{'move_nochain'});
my $dir = $in{'dir'};
$dir = '' if (!defined($dir));
my $idx = $in{'idx'};
$idx =~ /^\d+$/ || error($text{'move_norule'});
my $rv = move_rule_in_chain($table, $chain, $idx, $dir);
if (!defined($rv)) {
error($text{'move_norule'});
}
if ($rv) {
my $err = save_configuration(@tables);
error(text('move_failed', $err)) if ($err);
webmin_log("move", "rule", undef,
{ 'table' => $table->{'name'},
'family' => $table->{'family'},
'chain' => $chain,
'dir' => $dir });
}
redirect("index.cgi?table=$in{'table'}");

1140
nftables/nftables-lib.pl Normal file

File diff suppressed because it is too large Load Diff

33
nftables/rename_chain.cgi Normal file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/perl
# rename_chain.cgi
# Rename an existing chain
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'chain_notable'});
my $chain = $table->{'chains'}->{$in{'chain'}};
$chain || error($text{'chain_nochain'});
ui_print_header(undef, $text{'rename_chain_title'}, "", "intro", 1, 1);
print ui_form_start("save_chain.cgi");
print ui_hidden("table", $in{'table'});
print ui_hidden("rename", 1);
print ui_hidden("chain_old", $in{'chain'});
print ui_table_start($text{'rename_chain_header'}, "width=100%", 2);
print ui_table_row($text{'rename_chain_old'},
"<tt>".html_escape($in{'chain'})."</tt>");
print ui_table_row(hlink($text{'rename_chain_new'}, "chain_name"),
ui_textbox("chain_name", $in{'chain'}, 20));
print ui_table_end();
print ui_form_end([ [ undef, $text{'rename_chain_ok'} ] ]);
ui_print_footer("index.cgi?table=$in{'table'}", $text{'index_return'});

99
nftables/save_chain.cgi Normal file
View File

@@ -0,0 +1,99 @@
#!/usr/bin/perl
# save_chain.cgi
# Save a new or existing chain
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'chain_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'chain_notable'});
my $is_new = $in{'new'} ? 1 : 0;
my $is_rename = $in{'rename'} ? 1 : 0;
my $name = $in{'chain_name'};
$name =~ s/^\s+// if (defined($name));
$name =~ s/\s+$// if (defined($name));
$name =~ /^\w[\w-]*$/ || error($text{'chain_ename'});
my $old = $is_rename ? $in{'chain_old'} : $name;
$old =~ s/^\s+// if (defined($old));
$old =~ s/\s+$// if (defined($old));
if ($is_new) {
$table->{'chains'}->{$name} && error($text{'chain_edup'});
} elsif ($is_rename) {
$table->{'chains'}->{$old} || error($text{'chain_nochain'});
if ($name ne $old && $table->{'chains'}->{$name}) {
error($text{'chain_edup'});
}
} else {
$table->{'chains'}->{$name} || error($text{'chain_nochain'});
}
if ($is_rename) {
if ($name eq $old) {
redirect("index.cgi?table=$in{'table'}");
}
if ($name ne $old) {
$table->{'chains'}->{$name} = $table->{'chains'}->{$old};
delete($table->{'chains'}->{$old});
foreach my $r (@{$table->{'rules'}}) {
$r->{'chain'} = $name if ($r->{'chain'} && $r->{'chain'} eq $old);
my $changed = 0;
if ($r->{'jump'} && $r->{'jump'} eq $old) {
$r->{'jump'} = $name;
$changed = 1;
}
if ($r->{'goto'} && $r->{'goto'} eq $old) {
$r->{'goto'} = $name;
$changed = 1;
}
$r->{'text'} = format_rule_text($r) if ($changed);
}
}
my $err = save_configuration(@tables);
error(text('rename_chain_failed', $err)) if ($err);
webmin_log("rename", "chain", $old,
{ 'new' => $name,
'table' => $table->{'name'},
'family' => $table->{'family'} });
redirect("index.cgi?table=$in{'table'}");
}
my $type = $in{'chain_type'};
my $hook = $in{'chain_hook'};
my $priority = $in{'chain_priority'};
my $policy = $in{'chain_policy'};
for my $v (\$type, \$hook, \$priority, \$policy) {
$$v =~ s/^\s+// if (defined($$v));
$$v =~ s/\s+$// if (defined($$v));
}
$type = undef if (!defined($type) || $type eq '');
$hook = undef if (!defined($hook) || $hook eq '');
$priority = undef if (!defined($priority) || $priority eq '');
$policy = undef if (!defined($policy) || $policy eq '');
validate_chain_base($type, $hook, $priority, $policy) ||
error($text{'chain_ebase'});
my $chain = $table->{'chains'}->{$name} || { };
$chain->{'type'} = $type;
$chain->{'hook'} = $hook;
$chain->{'priority'} = $priority;
$chain->{'policy'} = $policy;
$table->{'chains'}->{$name} = $chain;
my $err = save_configuration(@tables);
error(text('chain_failed', $err)) if ($err);
webmin_log($is_new ? "create" : "modify", "chain", $name,
{ 'table' => $table->{'name'}, 'family' => $table->{'family'} });
redirect("index.cgi?table=$in{'table'}");

180
nftables/save_rule.cgi Executable file
View File

@@ -0,0 +1,180 @@
#!/usr/bin/perl
# save_rule.cgi
# Save a new or existing rule
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text, %config);
ReadParse();
error_setup($text{'save_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
foreach my $sfield (qw(saddr_set daddr_set sport_set dport_set)) {
if ($in{$sfield}) {
$table->{'sets'}->{$in{$sfield}} ||
error(text('save_set_missing', $in{$sfield}));
}
}
sub join_multi_value
{
my ($v) = @_;
return if (!defined($v) || $v eq '');
my @vals = split(/\0/, $v);
@vals = grep { defined($_) && $_ ne '' } @vals;
return if (!@vals);
return join(",", @vals);
}
if ($in{'delete'}) {
# Delete the rule
my $rule = $table->{'rules'}->[$in{'idx'}];
splice(@{$table->{'rules'}}, $in{'idx'}, 1);
webmin_log("delete", "rule", $rule ? $rule->{'text'} : undef);
} else {
my $rule = {};
if ($in{'new'}) {
$rule->{'chain'} = $in{'chain'};
$rule->{'index'} = scalar(@{$table->{'rules'}});
} else {
$rule = $table->{'rules'}->[$in{'idx'}];
}
if ($in{'edit_direct'}) {
my $raw = $in{'raw_rule'};
$raw =~ s/\r//g if (defined($raw));
$raw =~ s/^\s+// if (defined($raw));
$raw =~ s/\s+$// if (defined($raw));
error($text{'save_raw_empty'}) if (!defined($raw) || $raw eq '');
error($text{'save_raw_multiline'}) if ($raw =~ /[\r\n]/);
$rule->{'text'} = $raw;
}
else {
$rule->{'comment'} = $in{'comment'};
my $action = $in{'action'} || 'accept';
$rule->{'action'} = undef;
$rule->{'jump'} = undef;
$rule->{'goto'} = undef;
if ($action eq 'jump') {
$rule->{'jump'} = $in{'jump'};
}
elsif ($action eq 'goto') {
$rule->{'goto'} = $in{'goto'};
}
else {
$rule->{'action'} = $action;
}
my $saddr = $in{'saddr'};
my $daddr = $in{'daddr'};
$saddr = '@'.$in{'saddr_set'} if ($in{'saddr_set'});
$daddr = '@'.$in{'daddr_set'} if ($in{'daddr_set'});
$rule->{'saddr'} = (defined($saddr) && $saddr ne '') ? $saddr : undef;
$rule->{'daddr'} = (defined($daddr) && $daddr ne '') ? $daddr : undef;
$rule->{'saddr_family'} = $rule->{'saddr'} ? guess_addr_family($rule->{'saddr'}) : undef;
$rule->{'daddr_family'} = $rule->{'daddr'} ? guess_addr_family($rule->{'daddr'}) : undef;
if ($rule->{'saddr'} && $rule->{'saddr'} =~ /^\@(\S+)/) {
my $fam = set_type_family($table->{'sets'}->{$1}->{'type'});
$rule->{'saddr_family'} = $fam if ($fam);
}
if ($rule->{'daddr'} && $rule->{'daddr'} =~ /^\@(\S+)/) {
my $fam = set_type_family($table->{'sets'}->{$1}->{'type'});
$rule->{'daddr_family'} = $fam if ($fam);
}
my $proto = $in{'proto'};
$proto = undef if (defined($proto) && $proto eq '');
my $sport = $in{'sport'};
my $dport = $in{'dport'};
$sport = '@'.$in{'sport_set'} if ($in{'sport_set'});
$dport = '@'.$in{'dport_set'} if ($in{'dport_set'});
$rule->{'sport'} = (defined($sport) && $sport ne '') ? $sport : undef;
$rule->{'dport'} = (defined($dport) && $dport ne '') ? $dport : undef;
if (!$proto && ($rule->{'sport'} || $rule->{'dport'})) {
$proto = 'tcp';
}
$rule->{'l4proto'} = undef;
$rule->{'l4proto_family'} = undef;
$rule->{'proto'} = undef;
$rule->{'sport_proto'} = undef;
if ($proto && ($proto eq 'tcp' || $proto eq 'udp')) {
$rule->{'proto'} = $proto if ($rule->{'sport'} || $rule->{'dport'});
$rule->{'sport_proto'} = $proto if ($rule->{'sport'});
}
elsif ($proto && $proto !~ /^(tcp|udp)$/) {
$rule->{'sport'} = undef;
$rule->{'dport'} = undef;
}
if ($proto) {
if (($proto eq 'tcp' || $proto eq 'udp') && ($rule->{'sport'} || $rule->{'dport'})) {
# L4 proto implied by port match
}
else {
$rule->{'l4proto'} = $proto;
$rule->{'l4proto_family'} = 'meta';
}
}
my $icmp_type = $in{'icmp_type'};
$rule->{'icmp_type'} = undef;
$rule->{'icmpv6_type'} = undef;
if ($proto && $proto eq 'icmp') {
$rule->{'icmp_type'} = $icmp_type if (defined($icmp_type) && $icmp_type ne '');
}
elsif ($proto && $proto eq 'icmpv6') {
$rule->{'icmpv6_type'} = $icmp_type if (defined($icmp_type) && $icmp_type ne '');
}
elsif (!$proto && defined($icmp_type) && $icmp_type ne '') {
$rule->{'icmp_type'} = $icmp_type;
$rule->{'l4proto'} = 'icmp';
$rule->{'l4proto_family'} = 'meta';
}
my $ct_state = join_multi_value($in{'ct_state'});
my $tcp_flags = join_multi_value($in{'tcp_flags'});
$rule->{'ct_state'} = defined($ct_state) ? $ct_state : undef;
$rule->{'tcp_flags'} = defined($tcp_flags) ? $tcp_flags : undef;
$rule->{'tcp_flags_mask'} = (defined($in{'tcp_flags_mask'}) && $in{'tcp_flags_mask'} ne '') ? $in{'tcp_flags_mask'} : undef;
$rule->{'limit_rate'} = (defined($in{'limit_rate'}) && $in{'limit_rate'} ne '') ? $in{'limit_rate'} : undef;
$rule->{'limit_burst'} = (defined($in{'limit_burst'}) && $in{'limit_burst'} ne '') ? $in{'limit_burst'} : undef;
my $log_enabled = $in{'log'} || $in{'log_prefix'} || $in{'log_level'};
$rule->{'log'} = $log_enabled ? 1 : undef;
$rule->{'log_prefix'} = $log_enabled && defined($in{'log_prefix'}) && $in{'log_prefix'} ne '' ? $in{'log_prefix'} : undef;
$rule->{'log_level'} = $log_enabled && defined($in{'log_level'}) && $in{'log_level'} ne '' ? $in{'log_level'} : undef;
$rule->{'counter'} = $in{'counter'} ? 1 : undef;
my $iif = $in{'iif'};
my $oif = $in{'oif'};
$iif = $in{'iif_other'} if (defined($iif) && $iif eq 'other');
$oif = $in{'oif_other'} if (defined($oif) && $oif eq 'other');
$rule->{'iif'} = (defined($iif) && $iif ne '') ? $iif : undef;
$rule->{'oif'} = (defined($oif) && $oif ne '') ? $oif : undef;
$rule->{'text'} = format_rule_text($rule);
}
if ($in{'new'}) {
push(@{$table->{'rules'}}, $rule);
}
if ($in{'edit_direct'}) {
my $cmd = $config{'nft_cmd'} || has_command("nft");
if ($cmd) {
my $tmp = tempname();
open_tempfile(my $fh, ">$tmp");
print_tempfile($fh, dump_nftables_save(@tables));
close_tempfile($fh);
my $out = backquote_logged("$cmd -c -f $tmp 2>&1");
unlink_file($tmp);
error(text('save_invalid_rule', "<pre>$out</pre>")) if ($?);
}
}
webmin_log("save", $in{'new'} ? "create" : "modify", $rule->{'text'});
}
my $err = save_configuration(@tables);
error(text('save_failed', $err)) if ($err);
redirect("index.cgi?table=$in{'table'}");

62
nftables/save_set.cgi Executable file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/perl
# save_set.cgi
# Save a new or existing set
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text);
ReadParse();
error_setup($text{'set_err'});
my @tables = get_nftables_save();
my $table = $tables[$in{'table'}];
$table || error($text{'set_notable'});
my $is_new = $in{'new'} ? 1 : 0;
my $name = $in{'set_name'};
$name =~ /^\w[\w-]*$/ || error($text{'set_ename'});
if ($is_new && $table->{'sets'}->{$name}) {
error($text{'set_edup'});
}
my $type = $in{'set_type'};
$type = undef if (defined($type) && $type =~ /^\s*$/);
error($text{'set_etype'}) if (!$type);
my $flags = $in{'set_flags'};
if (defined($flags) && $flags ne '') {
my @vals = split(/\0/, $flags);
@vals = grep { defined($_) && $_ ne '' } @vals;
$flags = @vals ? join(" ", @vals) : undef;
}
$flags = undef if (defined($flags) && $flags =~ /^\s*$/);
my $elements = parse_set_elements_input($in{'set_elements'});
my $set;
if ($is_new) {
$set = { 'name' => $name, 'raw_lines' => [ ] };
}
else {
my $orig = $in{'set'};
$set = $table->{'sets'}->{$orig};
$set || error($text{'set_noset'});
$name = $orig;
}
$set->{'name'} = $name;
$set->{'type'} = $type;
$set->{'flags'} = $flags;
$set->{'elements'} = $elements;
$set->{'raw_lines'} ||= [ ];
$table->{'sets'}->{$name} = $set;
my $err = save_configuration(@tables);
error(text('set_failed', $err)) if ($err);
webmin_log($is_new ? "create" : "save", "set", $name,
{ 'table' => $table->{'name'}, 'family' => $table->{'family'} });
redirect("index.cgi?table=$in{'table'}");

197
nftables/setup.cgi Normal file
View File

@@ -0,0 +1,197 @@
#!/usr/bin/perl
# setup.cgi
# Create a default nftables ruleset
require './nftables-lib.pl'; ## no critic
use strict;
use warnings;
our (%in, %text, %config);
ReadParse();
if ($in{'action'} eq 'create') {
my $type = $in{'type'};
my @tables;
if ($type eq 'allow_all') {
@tables = create_allow_all_ruleset();
}
elsif ($type eq 'deny_incoming') {
@tables = create_deny_incoming_ruleset();
}
elsif ($type eq 'deny_all') {
@tables = create_deny_all_ruleset();
}
else {
error($text{'setup_invalid_type'});
}
my $error = save_configuration(@tables);
if ($error) {
error(text('setup_failed', $error));
}
$error = apply_restore();
if ($error) {
error(text('setup_failed', $error));
}
webmin_log("setup", "create", $type);
redirect("index.cgi");
}
ui_print_header(undef, $text{'setup_title'}, "", "intro", 1, 1);
print "<h3>$text{'setup_header'}</h3>";
my $webmin_port = get_webmin_port();
print "<p>$text{'setup_desc'}</p>";
print "<p>",text('setup_deny_note', $webmin_port),"</p>";
print ui_form_start("setup.cgi");
print ui_hidden("action", "create");
my @type_opts = (
[ 'allow_all', $text{'setup_allow_all'} . "<br>" ],
[ 'deny_incoming', $text{'setup_deny_incoming'} . "<br>" ],
[ 'deny_all', $text{'setup_deny_all'} ],
);
print ui_radio("type", "allow_all", \@type_opts);
print ui_form_end([ [ undef, $text{'setup_create'} ] ]);
sub create_allow_all_ruleset
{
my @tables;
my $table = {
'name' => 'inet_filter',
'family' => 'inet',
'rules' => [],
'sets' => {},
'chains' => {
'input' => {
'type' => 'filter',
'hook' => 'input',
'priority' => 0,
'policy' => 'accept'
},
'forward' => {
'type' => 'filter',
'hook' => 'forward',
'priority' => 0,
'policy' => 'accept'
},
'output' => {
'type' => 'filter',
'hook' => 'output',
'priority' => 0,
'policy' => 'accept'
}
}
};
push(@tables, $table);
return @tables;
}
sub create_deny_incoming_ruleset
{
my @tables;
my $webmin_port = get_webmin_port();
my $table = {
'name' => 'inet_filter',
'family' => 'inet',
'rules' => [
{
'text' => 'ct state established,related accept',
'chain' => 'input'
},
{
'text' => 'iif "lo" accept',
'chain' => 'input'
},
{
'text' => 'tcp dport 22 accept',
'chain' => 'input'
},
{
'text' => "tcp dport $webmin_port accept",
'chain' => 'input'
}
],
'sets' => {},
'chains' => {
'input' => {
'type' => 'filter',
'hook' => 'input',
'priority' => 0,
'policy' => 'drop'
},
'forward' => {
'type' => 'filter',
'hook' => 'forward',
'priority' => 0,
'policy' => 'accept'
},
'output' => {
'type' => 'filter',
'hook' => 'output',
'priority' => 0,
'policy' => 'accept'
}
}
};
push(@tables, $table);
return @tables;
}
sub create_deny_all_ruleset
{
my @tables;
my $webmin_port = get_webmin_port();
my $table = {
'name' => 'inet_filter',
'family' => 'inet',
'rules' => [],
'sets' => {},
'chains' => {
'input' => {
'type' => 'filter',
'hook' => 'input',
'priority' => 0,
'policy' => 'drop'
},
'forward' => {
'type' => 'filter',
'hook' => 'forward',
'priority' => 0,
'policy' => 'drop'
},
'output' => {
'type' => 'filter',
'hook' => 'output',
'priority' => 0,
'policy' => 'drop'
}
}
};
$table->{'rules'} = [
{
'text' => 'ct state established,related accept',
'chain' => 'output'
},
{
'text' => 'iif "lo" accept',
'chain' => 'input'
},
{
'text' => 'oif "lo" accept',
'chain' => 'output'
},
{
'text' => 'tcp dport 22 accept',
'chain' => 'input'
},
{
'text' => "tcp dport $webmin_port accept",
'chain' => 'input'
}
];
push(@tables, $table);
return @tables;
}
ui_print_footer("/", $text{'index'});

61
nftables/t/perlcritic.t Normal file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
BEGIN {
eval { require Perl::Critic; 1 }
or plan skip_all => 'Perl::Critic not installed';
}
use File::Find;
sub script_dir
{
my $path = $0;
if ($path =~ m{^/}) {
$path =~ s{/[^/]+$}{};
return $path;
}
my $cwd = `pwd`;
chomp($cwd);
if ($path =~ m{/}) {
$path =~ s{/[^/]+$}{};
return $cwd.'/'.$path;
}
return $cwd;
}
my $bindir = script_dir();
my $module_dir = "$bindir/..";
chdir($module_dir) or die "chdir: $!";
my @files;
find(
sub {
return if -d;
return unless /\.(pl|cgi)\z/;
push(@files, $File::Find::name);
},
'.'
);
@files = sort @files;
if (!@files) {
plan skip_all => 'no perl files to check';
}
my $critic = Perl::Critic->new(
-severity => 5,
-profile => '',
);
foreach my $file (@files) {
my @violations = $critic->critique($file);
is(scalar @violations, 0, "$file perlcritic");
if (@violations) {
diag join("", @violations);
}
}
done_testing();

View File

@@ -0,0 +1,8 @@
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ip saddr 192.168.1.0/24 tcp dport 22 accept comment "ssh"
ct state established,related accept
}
}

View File

@@ -0,0 +1,18 @@
table inet filter {
set trusted_v4 {
type ipv4_addr;
flags interval;
elements = { 192.168.1.0/24, 10.0.0.1 }
}
set web_ports {
type inet_service;
elements = {
80,
443
}
}
chain input {
type filter hook input priority 0; policy drop;
ip saddr @trusted_v4 tcp dport @web_ports accept
}
}

185
nftables/t/run-tests.t Executable file
View File

@@ -0,0 +1,185 @@
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use File::Temp qw(tempdir);
sub script_dir
{
my $path = $0;
if ($path =~ m{^/}) {
$path =~ s{/[^/]+$}{};
return $path;
}
my $cwd = `pwd`;
chomp($cwd);
if ($path =~ m{/}) {
$path =~ s{/[^/]+$}{};
return $cwd.'/'.$path;
}
return $cwd;
}
my $bindir = script_dir();
my $confdir = tempdir(CLEANUP => 1);
my $vardir = tempdir(CLEANUP => 1);
open(my $cfh, ">", "$confdir/config") or die "config: $!";
print $cfh "os_type=linux\nos_version=0\n";
close($cfh);
open(my $vfh, ">", "$confdir/var-path") or die "var-path: $!";
print $vfh "$vardir\n";
close($vfh);
$ENV{'WEBMIN_CONFIG'} = $confdir;
$ENV{'WEBMIN_VAR'} = $vardir;
$ENV{'FOREIGN_MODULE_NAME'} = 'nftables';
$ENV{'FOREIGN_ROOT_DIRECTORY'} = '/usr/libexec/webmin';
chdir("$bindir/..") or die "chdir: $!";
require "$bindir/../nftables-lib.pl";
sub check_fields
{
my ($name, $got, $expect) = @_;
foreach my $k (sort keys %$expect) {
is($got->{$k}, $expect->{$k}, "$name $k");
}
}
my @cases = (
{
name => 'tcp dport accept',
line => 'tcp dport 22 accept',
expect => { proto => 'tcp', dport => '22', action => 'accept' },
},
{
name => 'iif oif drop',
line => 'iif "eth0" oif "eth1" drop',
expect => { iif => 'eth0', oif => 'eth1', action => 'drop' },
},
{
name => 'comment with quotes',
line => 'tcp dport 80 accept comment "a \\"quote\\""',
expect => { proto => 'tcp', dport => '80', action => 'accept', comment => 'a "quote"' },
},
{
name => 'ct state',
line => 'ct state established,related accept',
expect => { ct_state => 'established,related', action => 'accept' },
},
{
name => 'icmp type',
line => 'icmp type echo-request accept',
expect => { icmp_type => 'echo-request', action => 'accept' },
},
{
name => 'limit log counter',
line => 'tcp dport 22 limit rate 10/second burst 20 packets log prefix "ssh" level info counter accept',
expect => {
proto => 'tcp',
dport => '22',
limit_rate => '10/second',
limit_burst => '20',
log_prefix => 'ssh',
log_level => 'info',
counter => 1,
action => 'accept',
},
},
{
name => 'unknown tokens preserved',
line => 'tcp dport 22 meta skgid 1000 accept',
expect => { proto => 'tcp', dport => '22', action => 'accept' },
preserve => 'meta skgid 1000',
},
);
foreach my $c (@cases) {
my $r = parse_rule_text($c->{line});
ok($r && ref($r) eq 'HASH', "$c->{name} parse hash");
check_fields($c->{name}, $r, $c->{expect});
my $out = format_rule_text($r);
ok($out =~ /\S/, "$c->{name} formatted non-empty");
if ($c->{preserve}) {
like($out, qr/\Q$c->{preserve}\E/, "$c->{name} preserves unknowns");
}
my $r2 = parse_rule_text($out);
check_fields($c->{name}.' roundtrip', $r2, $c->{expect});
}
my $ruleset = "$bindir/rulesets/basic.nft";
my @tables = get_nftables_save($ruleset);
ok(@tables == 1, 'ruleset table count');
my $t = $tables[0];
is($t->{family}, 'inet', 'ruleset family');
is($t->{name}, 'filter', 'ruleset name');
my $chain = $t->{chains}->{input};
ok($chain, 'input chain present');
is($chain->{type}, 'filter', 'chain type');
is($chain->{hook}, 'input', 'chain hook');
is($chain->{priority}, '0', 'chain priority');
is($chain->{policy}, 'drop', 'chain policy');
my @rules = @{$t->{rules}};
check_fields('ruleset r1', $rules[0], { iif => 'lo', action => 'accept' });
check_fields('ruleset r2', $rules[1], { saddr => '192.168.1.0/24', proto => 'tcp', dport => '22', action => 'accept', comment => 'ssh' });
check_fields('ruleset r3', $rules[2], { ct_state => 'established,related', action => 'accept' });
my $ruleset_sets = "$bindir/rulesets/sets.nft";
my @tables_sets = get_nftables_save($ruleset_sets);
ok(@tables_sets == 1, 'sets ruleset table count');
my $ts = $tables_sets[0];
ok($ts->{sets} && $ts->{sets}->{trusted_v4}, 'trusted_v4 set present');
is($ts->{sets}->{trusted_v4}->{type}, 'ipv4_addr', 'trusted_v4 type');
is($ts->{sets}->{trusted_v4}->{flags}, 'interval', 'trusted_v4 flags');
is_deeply($ts->{sets}->{trusted_v4}->{elements},
[ '192.168.1.0/24', '10.0.0.1' ],
'trusted_v4 elements');
ok($ts->{sets}->{web_ports}, 'web_ports set present');
is($ts->{sets}->{web_ports}->{type}, 'inet_service', 'web_ports type');
is_deeply($ts->{sets}->{web_ports}->{elements},
[ '80', '443' ],
'web_ports elements');
my $rset = $ts->{rules}->[0];
check_fields('set rule', $rset,
{ saddr => '@trusted_v4', proto => 'tcp', dport => '@web_ports', action => 'accept' });
my $rset_out = format_rule_text($rset);
like($rset_out, qr/\@trusted_v4/, 'set rule format preserves address set');
like($rset_out, qr/\@web_ports/, 'set rule format preserves port set');
ok(validate_chain_base('filter', 'input', '0', 'accept'),
'chain base allows zero priority');
ok(!validate_chain_base('filter', 'input', undef, 'accept'),
'chain base missing priority invalid');
ok(validate_chain_base(undef, undef, undef, undef),
'chain base none set valid');
my $table_move = {
rules => [
{ chain => 'input', index => 0, text => 'r0' },
{ chain => 'input', index => 1, text => 'r1' },
{ chain => 'forward', index => 2, text => 'r2' },
{ chain => 'input', index => 3, text => 'r3' },
],
};
ok(move_rule_in_chain($table_move, 'input', 1, 'down'),
'move rule down returns true');
is($table_move->{rules}->[1]->{text}, 'r3', 'rule moved down in array');
is($table_move->{rules}->[3]->{text}, 'r1', 'rule swapped down in array');
is($table_move->{rules}->[1]->{index}, 1, 'moved rule index updated');
is($table_move->{rules}->[3]->{index}, 3, 'swapped rule index updated');
my $table_move2 = {
rules => [
{ chain => 'input', index => 0, text => 'r0' },
{ chain => 'input', index => 1, text => 'r1' },
],
};
is(move_rule_in_chain($table_move2, 'input', 0, 'up'), 0,
'top rule cannot move up');
done_testing();

View File

@@ -209,7 +209,8 @@ return $newhash eq $hash;
# Returns undef if SHA512 hashing is supported, or an error message if not
sub check_sha512
{
return &unix_crypt_supports_sha512() ? undef : 'Crypt::SHA';
return &unix_crypt_supports_sha512() ? undef :
'SHA512 is not supported by the system crypt() function';
}
# encrypt_sha512(password, [salt])
@@ -234,7 +235,8 @@ return $newhash eq $hash;
# Returns undef if yescrypt hashing is supported, or an error message if not
sub check_yescrypt
{
return &unix_crypt_supports_yescrypt() ? undef : 'Crypt::NaCl::Sodium';
return &unix_crypt_supports_yescrypt() ? undef :
'yescrypt is not supported by the system crypt() function';
}
# encrypt_yescrypt(password, [salt])
@@ -328,4 +330,3 @@ return 0;
}
1;

735
vendor_perl/Convert/TNEF.pm Normal file
View File

@@ -0,0 +1,735 @@
# Convert::TNEF.pm
#
# Copyright (c) 1999 Douglas Wilson <dougw@cpan.org>. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
package Convert::TNEF;
use strict;
use integer;
use vars qw(
$VERSION
$TNEF_SIGNATURE
$TNEF_PURE
$LVL_MESSAGE
$LVL_ATTACHMENT
$errstr
$g_file_cnt
%dflts
%atp
%att
%att_name
);
use Carp;
use IO::Wrap;
use File::Spec;
use MIME::Body;
$VERSION = '0.18';
# Set some TNEF constants. Everything turned
# out to be in little endian order, so I just added
# 'reverse' everywhere that I needed to
# instead of reversing the hex codes.
$TNEF_SIGNATURE = reverse pack( 'H*', '223E9F78' );
$TNEF_PURE = reverse pack( 'H*', '00010000' );
$LVL_MESSAGE = pack( 'H*', '01' );
$LVL_ATTACHMENT = pack( 'H*', '02' );
%atp = (
Triples => pack( 'H*', '0000' ),
String => pack( 'H*', '0001' ),
Text => pack( 'H*', '0002' ),
Date => pack( 'H*', '0003' ),
Short => pack( 'H*', '0004' ),
Long => pack( 'H*', '0005' ),
Byte => pack( 'H*', '0006' ),
Word => pack( 'H*', '0007' ),
Dword => pack( 'H*', '0008' ),
Max => pack( 'H*', '0009' ),
);
for ( keys %atp ) {
$atp{$_} = reverse $atp{$_};
}
sub _ATT {
my ( $att, $id ) = @_;
return reverse($id) . $att;
}
# The side comments are 'MAPI' equivalents
%att = (
Null => _ATT( pack( 'H*', '0000' ), pack( 'H4', '0000' ) ),
# PR_ORIGINATOR_RETURN_ADDRESS
From => _ATT( $atp{Triples}, pack( 'H*', '8000' ) ),
# PR_SUBJECT
Subject => _ATT( $atp{String}, pack( 'H*', '8004' ) ),
# PR_CLIENT_SUBMIT_TIME
DateSent => _ATT( $atp{Date}, pack( 'H*', '8005' ) ),
# PR_MESSAGE_DELIVERY_TIME
DateRecd => _ATT( $atp{Date}, pack( 'H*', '8006' ) ),
# PR_MESSAGE_FLAGS
MessageStatus => _ATT( $atp{Byte}, pack( 'H*', '8007' ) ),
# PR_MESSAGE_CLASS
MessageClass => _ATT( $atp{Word}, pack( 'H*', '8008' ) ),
# PR_MESSAGE_ID
MessageID => _ATT( $atp{String}, pack( 'H*', '8009' ) ),
# PR_PARENT_ID
ParentID => _ATT( $atp{String}, pack( 'H*', '800A' ) ),
# PR_CONVERSATION_ID
ConversationID => _ATT( $atp{String}, pack( 'H*', '800B' ) ),
Body => _ATT( $atp{Text}, pack( 'H*', '800C' ) ), # PR_BODY
# PR_IMPORTANCE
Priority => _ATT( $atp{Short}, pack( 'H*', '800D' ) ),
# PR_ATTACH_DATA_xxx
AttachData => _ATT( $atp{Byte}, pack( 'H*', '800F' ) ),
# PR_ATTACH_FILENAME
AttachTitle => _ATT( $atp{String}, pack( 'H*', '8010' ) ),
# PR_ATTACH_RENDERING
AttachMetaFile => _ATT( $atp{Byte}, pack( 'H*', '8011' ) ),
# PR_CREATION_TIME
AttachCreateDate => _ATT( $atp{Date}, pack( 'H*', '8012' ) ),
# PR_LAST_MODIFICATION_TIME
AttachModifyDate => _ATT( $atp{Date}, pack( 'H*', '8013' ) ),
# PR_LAST_MODIFICATION_TIME
DateModified => _ATT( $atp{Date}, pack( 'H*', '8020' ) ),
#PR_ATTACH_TRANSPORT_NAME
AttachTransportFilename => _ATT( $atp{Byte}, pack( 'H*', '9001' ) ),
AttachRenddata => _ATT( $atp{Byte}, pack( 'H*', '9002' ) ),
MAPIProps => _ATT( $atp{Byte}, pack( 'H*', '9003' ) ),
# PR_MESSAGE_RECIPIENTS
RecipTable => _ATT( $atp{Byte}, pack( 'H*', '9004' ) ),
Attachment => _ATT( $atp{Byte}, pack( 'H*', '9005' ) ),
TnefVersion => _ATT( $atp{Dword}, pack( 'H*', '9006' ) ),
OemCodepage => _ATT( $atp{Byte}, pack( 'H*', '9007' ) ),
# PR_ORIG_MESSAGE_CLASS
OriginalMessageClass => _ATT( $atp{Word}, pack( 'H*', '0006' ) ),
# PR_RCVD_REPRESENTING_xxx or PR_SENT_REPRESENTING_xxx
Owner => _ATT( $atp{Byte}, pack( 'H*', '0000' ) ),
# PR_SENT_REPRESENTING_xxx
SentFor => _ATT( $atp{Byte}, pack( 'H*', '0001' ) ),
# PR_RCVD_REPRESENTING_xxx
Delegate => _ATT( $atp{Byte}, pack( 'H*', '0002' ) ),
# PR_DATE_START
DateStart => _ATT( $atp{Date}, pack( 'H*', '0006' ) ),
DateEnd => _ATT( $atp{Date}, pack( 'H*', '0007' ) ), # PR_DATE_END
# PR_OWNER_APPT_ID
AidOwner => _ATT( $atp{Long}, pack( 'H*', '0008' ) ),
# PR_RESPONSE_REQUESTED
RequestRes => _ATT( $atp{Short}, pack( 'H*', '0009' ) ),
);
# Create reverse lookup table
%att_name = reverse %att;
# Global counter for creating file names
$g_file_cnt = 0;
# Set some package global defaults for new objects
# which can be overridden for any individual object.
%dflts = (
debug => 0,
debug_max_display => 1024,
debug_max_line_size => 64,
ignore_checksum => 0,
display_after_err => 32,
output_to_core => 4096,
output_dir => File::Spec->curdir,
output_prefix => "tnef",
buffer_size => 1024,
);
# Make a file name
sub _mk_fname {
my $parms = shift;
File::Spec->catfile( $parms->{output_dir},
$parms->{output_prefix} . "-" . $$ . "-"
. ++$g_file_cnt . ".doc" );
}
sub _rtn_err {
my ( $errmsg, $fh, $parms ) = @_;
$errstr = $errmsg;
if ( $parms->{debug} ) {
my $read_size = $parms->{display_after_err} || 32;
my $data;
$fh->read( $data, $read_size );
print "Error: $errstr\n";
print "Data:\n";
print $1, "\n" while $data =~
/([^\r\n]{0,$parms->{debug_max_line_size}})\r?\n?/g;
print "HData:\n";
my $hdata = unpack( "H*", $data );
print $1, "\n"
while $hdata =~ /(.{0,$parms->{debug_max_line_size}})/g;
}
return undef;
}
sub _read_err {
my ( $bytes, $fh, $errmsg ) = @_;
$errstr =
( defined $bytes ) ? "Premature EOF" : "Read Error:" . $errmsg;
return undef;
}
sub read_ent {
croak "Usage: Convert::TNEF->read_ent(entity, parameters) "
unless @_ == 2 or @_ == 3;
my $self = shift;
my ( $ent, $parms ) = @_;
my $io = $ent->open("r") or do {
$errstr = "Can't open entity: $!";
return undef;
};
my $tnef = $self->read( $io, $parms );
$io->close or do {
$errstr = "Error closing handle: $!";
return undef;
};
return $tnef;
}
sub read_in {
croak "Usage: Convert::TNEF->read_in(filename, parameters) "
unless @_ == 2 or @_ == 3;
my $self = shift;
my ( $fname, $parms ) = @_;
open( INFILE, "<$fname" ) or do {
$errstr = "Can't open $fname: $!";
return undef;
};
binmode INFILE;
my $tnef = $self->read( \*INFILE, $parms );
close INFILE or do {
$errstr = "Error closing $fname: $!";
return undef;
};
return $tnef;
}
sub read {
croak "Usage: Convert::TNEF->read(fh, parameters) "
unless @_ == 2 or @_ == 3;
my $self = shift;
my $class = ref($self) || $self;
$self = {};
bless $self, $class;
my ( $fd, $parms ) = @_;
$fd = wraphandle($fd);
my %parms = %dflts;
@parms{ keys %$parms } = values %$parms if defined $parms;
$parms = \%parms;
my $debug = $parms{debug};
my $ignore_checksum = $parms{ignore_checksum};
# Start of TNEF stream
my $data;
my $num_bytes = $fd->read( $data, 4 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 4;
print "TNEF start: ", unpack( "H*", $data ), "\n" if $debug;
return _rtn_err( "Not TNEF-encapsulated", $fd, $parms )
unless $data eq $TNEF_SIGNATURE;
# Key
$num_bytes = $fd->read( $data, 2 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 2;
print "TNEF key: ", unpack( "H*", $data ), "\n" if $debug;
# Start of First Object
$num_bytes = $fd->read( $data, 1 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 1;
my $msg_att = "";
my $is_msg = ( $data eq $LVL_MESSAGE );
my $is_att = ( $data eq $LVL_ATTACHMENT );
print "TNEF object start: ", unpack( "H*", $data ), "\n" if $debug;
return _rtn_err( "Neither a message nor an attachment", $fd,
$parms )
unless $is_msg or $is_att;
my $msg = Convert::TNEF::Data->new;
my @atts;
# Current message or attachment in loop
my $ent = $msg;
# Read message and attachments
LOOP: {
my $type = $is_msg ? 'message' : 'attachment';
print "Reading $type attribute\n" if $debug;
$num_bytes = $fd->read( $data, 4 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 4;
my $att_id = $data;
my $att_name = $att_name{$att_id};
print "TNEF $type attribute: ", unpack( "H*", $data ), "\n"
if $debug;
return _rtn_err( "Bad Attribute found in $type", $fd, $parms )
unless $att_name{$att_id};
if ( $att_id eq $att{TnefVersion} ) {
return _rtn_err( "Version attribute found in attachment", $fd,
$parms )
if $is_att;
} elsif ( $att_id eq $att{MessageClass} ) {
return _rtn_err( "MessageClass attribute found in attachment",
$fd, $parms )
if $is_att;
} elsif ( $att_id eq $att{AttachRenddata} ) {
return _rtn_err( "AttachRenddata attribute found in message",
$fd, $parms )
if $is_msg;
push @atts, ( $ent = Convert::TNEF::Data->new );
} else {
return _rtn_err( "AttachRenddata must be first attribute", $fd,
$parms )
if $is_att
and !@atts
and $att_name ne "AttachRenddata";
}
print "Got attribute:$att_name{$att_id}\n" if $debug;
$num_bytes = $fd->read( $data, 4 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 4;
print "HLength:", unpack( "H8", $data ), "\n" if $debug;
my $length = unpack( "V", $data );
print "Length: $length\n" if $debug;
# Get the attribute data (returns an object since data may
# actually end up in a file)
my $calc_chksum;
$data = _build_data( $fd, $length, \$calc_chksum, $parms )
or return undef;
_debug_print( $length, $att_id, $data, $parms ) if $debug;
$ent->datahandle( $att_name, $data, $length );
$num_bytes = $fd->read( $data, 2 );
return _read_err( $num_bytes, $fd, $! ) unless $num_bytes == 2;
my $file_chksum = $data;
if ($debug) {
print "Calc Chksum:", unpack( "H*", $calc_chksum ), "\n";
print "File Chksum:", unpack( "H*", $file_chksum ), "\n";
}
return _rtn_err( "Bad Checksum", $fd, $parms )
unless $calc_chksum eq $file_chksum
or $ignore_checksum;
my $num_bytes = $fd->read( $data, 1 );
# EOF (0 bytes) is ok
return _read_err( $num_bytes, $fd, $! ) unless defined $num_bytes;
last LOOP if $num_bytes < 1;
print "Next token:", unpack( "H2", $data ), "\n" if $debug;
$is_msg = ( $data eq $LVL_MESSAGE );
return _rtn_err( "Found message data in attachment", $fd, $parms )
if $is_msg and $is_att;
$is_att = ( $data eq $LVL_ATTACHMENT );
redo LOOP if $is_msg or $is_att;
return _rtn_err( "Not a TNEF $type", $fd, $parms );
}
print "EOF\n" if $debug;
$self->{TN_Message} = $msg;
$self->{TN_Attachments} = \@atts;
return $self;
}
sub _debug_print {
my ( $length, $att_id, $data, $parms ) = @_;
if ( $length < $parms->{debug_max_display} ) {
$data = $data->data;
if ( $att_id eq $att{TnefVersion} ) {
$data = unpack( "L", $data );
print "Version: $data\n";
} elsif ( substr( $att_id, 2 ) eq $atp{Date} and $length == 14 ) {
my ( $yr, $mo, $day, $hr, $min, $sec, $dow ) =
unpack( "vvvvvvv", $data );
my $date = join ":", $yr, $mo, $day, $hr, $min, $sec, $dow;
print "Date: $date\n";
print "HDate:", unpack( "H*", $data ), "\n";
} elsif ( $att_id eq $att{AttachRenddata} and $length == 14 ) {
my ( $atyp, $ulPosition, $dxWidth, $dyHeight, $dwFlags ) =
unpack( "vVvvV", $data );
$data = join ":", $atyp, $ulPosition, $dxWidth, $dyHeight,
$dwFlags;
print "AttachRendData: $data\n";
} else {
print "Data:\n";
print $1, "\n" while $data =~
/([^\r\n]{0,$parms->{debug_max_line_size}})\r?\n?/g;
print "HData:\n";
my $hdata = unpack( "H*", $data );
print $1, "\n"
while $hdata =~ /(.{0,$parms->{debug_max_line_size}})/g;
}
} else {
my $io = $data->open("r")
or croak "Error opening attachment data handle: $!";
my $buffer;
$io->read( $buffer, $parms->{debug_max_display} );
$io->close or croak "Error closing attachment data handle: $!";
print "Data:\n";
print $1, "\n" while $buffer =~
/([^\r\n]{0,$parms->{debug_max_line_size}})\r?\n?/sg;
print "HData:\n";
my $hdata = unpack( "H*", $buffer );
print $1, "\n"
while $hdata =~ /(.{0,$parms->{debug_max_line_size}})/g;
}
}
sub _build_data {
my ( $fd, $length, $chksumref, $parms ) = @_;
my $cutoff = $parms->{output_to_core};
my $incore = do {
if ( $cutoff eq 'NONE' ) { 0 } #Everything to files
elsif ( $cutoff eq 'ALL' ) { 1 } #Everything in memory
elsif ( $cutoff < $length ) { 0 } #Large items in files
else { 1 } #Everything else in memory
};
# Just borrow some other objects for the attachment attribute data
my $body =
($incore)
? new MIME::Body::Scalar
: new MIME::Body::File _mk_fname($parms);
$body->binmode(1);
my $io = $body->open("w");
my $bufsiz = $parms->{buffer_size};
$bufsiz = $length if $length < $bufsiz;
my $buffer;
my $chksum = 0;
while ( $length > 0 ) {
my $num_bytes = $fd->read( $buffer, $bufsiz );
return _read_err( $num_bytes, $fd, $! )
unless $num_bytes == $bufsiz;
$io->print($buffer);
$chksum += unpack( "%16C*", $buffer );
$chksum %= 65536;
$length -= $bufsiz;
$bufsiz = $length if $length < $bufsiz;
}
$$chksumref = pack( "v", $chksum );
$io->close;
return $body;
}
sub purge {
my $self = shift;
my $msg = $self->{TN_Message};
my @atts = $self->attachments;
for ( keys %$msg ) {
$msg->{$_}->purge if exists $att{$_};
}
for my $attch (@atts) {
for ( keys %$attch ) {
$attch->{$_}->purge if exists $att{$_};
}
}
}
sub message {
my $self = shift;
$self->{TN_Message};
}
sub attachments {
my $self = shift;
return @{ $self->{TN_Attachments} } if wantarray;
$self->{TN_Attachments};
}
# This is for Messages or Attachments
# since they are essentially the same thing except
# for the leading attribute code
package Convert::TNEF::Data;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{TN_Size} = {};
bless $self, $class;
}
sub data {
my $self = shift;
my $attr = shift || 'AttachData';
return $self->{$attr} && $self->{$attr}->as_string;
}
sub name {
my $self = shift;
my $attr = shift || 'AttachTitle';
my $name = $self->{$attr} && $self->{$attr}->data;
$name =~ s/\x00+$// if $name;
return $name;
}
# Try to get the long filename out of the
# 'Attachment' attribute.
sub longname {
my $self = shift;
my $data = $self->data("Attachment");
return unless $data;
my $pos = index( $data, pack( "H*", "1e00013001" ) );
$pos = index( $data, pack( "H*", "1e00073701" ) ) if ($pos < 0);
return $self->name unless $pos >= 0;
my $len = unpack( "V", substr( $data, $pos + 8, 4 ) );
my $longname = substr( $data, $pos + 12, $len );
$longname =~ s/\x00+$// if $longname;
return $longname || $self->name;
}
sub datahandle {
my $self = shift;
my $attr = shift || 'AttachData';
$self->{$attr} = shift if @_;
$self->size( $attr, shift ) if @_;
return $self->{$attr};
}
sub size {
my $self = shift;
my $attr = shift || 'AttachData';
$self->{TN_Size}->{$attr} = shift if @_;
return $self->{TN_Size}->{$attr};
}
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
=head1 NAME
Convert::TNEF - Perl module to read TNEF files
=head1 SYNOPSIS
use Convert::TNEF;
$tnef = Convert::TNEF->read($iohandle, \%parms)
or die Convert::TNEF::errstr;
$tnef = Convert::TNEF->read_in($filename, \%parms)
or die Convert::TNEF::errstr;
$tnef = Convert::TNEF->read_ent($mime_entity, \%parms)
or die Convert::TNEF::errstr;
$tnef->purge;
$message = $tnef->message;
@attachments = $tnef->attachments;
$attribute_value = $attachments[$i]->data($att_attribute_name);
$attribute_value_size = $attachments[$i]->size($att_attribute_name);
$attachment_name = $attachments[$i]->name;
$long_attachment_name = $attachments[$i]->longname;
$datahandle = $attachments[$i]->datahandle($att_attribute_name);
=head1 DESCRIPTION
TNEF stands for Transport Neutral Encapsulation Format, and if you've
ever been unfortunate enough to receive one of these files as an email
attachment, you may want to use this module.
read() takes as its first argument any file handle open
for reading. The optional second argument is a hash reference
which contains one or more of the following keys:
=head2
output_dir - Path for storing TNEF attribute data kept in files
(default: current directory).
output_prefix - File prefix for TNEF attribute data kept in files
(default: 'tnef').
output_to_core - TNEF attribute data will be saved in core memory unless
it is greater than this many bytes (default: 4096). May also be set to
'NONE' to keep all data in files, or 'ALL' to keep all data in core.
buffer_size - Buffer size for reading in the TNEF file (default: 1024).
debug - If true, outputs all sorts of info about what the read() function
is reading, including the raw ascii data along with the data converted
to hex (default: false).
display_after_err - If debug is true and an error is encountered,
reads and displays this many bytes of data following the error
(default: 32).
debug_max_display - If debug is true then read and display at most
this many bytes of data for each TNEF attribute (default: 1024).
debug_max_line_size - If debug is true then at most this many bytes of
data will be displayed on each line for each TNEF attribute
(default: 64).
ignore_checksum - If true, will ignore checksum errors while parsing
data (default: false).
read() returns an object containing the TNEF 'attributes' read from the
file and the data for those attributes. If all you want are the
attachments, then this is mostly garbage, but if you're interested then
you can see all the garbage by turning on debugging. If the garbage
proves useful to you, then let me know how I can maybe make it more
useful.
If an error is encountered, an undefined value is returned and the
package variable $errstr is set to some helpful message.
read_in() is a convienient front end for read() which takes a filename
instead of a handle.
read_ent() is another convient front end for read() which can take a
MIME::Entity object (or any object with like methods, specifically
open("r"), read($buff,$num_bytes), and close ).
purge() deletes any on-disk data that may be in the attachments of
the TNEF object.
message() returns the message portion of the tnef object, if any.
The thing it returns is like an attachment, but its not an attachment.
For instance, it more than likely does not have a name or any
attachment data.
attachments() returns a list of the attachments that the given TNEF
object contains. Returns a list ref if not called in array context.
data() takes a TNEF attribute name, and returns a string value for that
attribute for that attachment. Its your own problem if the string is too
big for memory. If no argument is given, then the 'AttachData' attribute
is assumed, which is probably the attachment data you're looking for.
name() is the same as data(), except the attribute 'AttachTitle' is
the default, which returns the 8 character + 3 character extension name
of the attachment.
longname() returns the long filename and extension of an attachment. This
is embedded within a MAPI property of the 'Attachment' attribute data, so
we attempt to extract the name out of that.
size() takes an TNEF attribute name, and returns the size in bytes for
the data for that attachment attribute.
datahandle() is a method for attachments which takes a TNEF attribute
name, and returns the data for that attribute as a handle which is
the same as a MIME::Body handle. See MIME::Body for all the applicable
methods. If no argument is given, then 'AttachData' is assumed.
=head1 EXAMPLES
# Here's a rather long example where mail is retrieved
# from a POP3 server based on header information, then
# it is MIME parsed, and then the TNEF contents
# are extracted and converted.
use strict;
use Net::POP3;
use MIME::Parser;
use Convert::TNEF;
my $mail_dir = "mailout";
my $mail_prefix = "mail";
my $pop = new Net::POP3 ( "pop3server_name" );
my $num_msgs = $pop->login("user_name","password");
die "Can't login: $!" unless defined $num_msgs;
# Get mail by sender and subject
my $mail_out_idx = 0;
MESSAGE: for ( my $i=1; $i<= $num_msgs; $i++ ) {
my $header = join "", @{$pop->top($i)};
for ($header) {
next MESSAGE unless
/^from:.*someone\@somewhere.net/im &&
/^subject:\s*important stuff/im
}
my $fname = $mail_prefix."-".$$.++$mail_out_idx.".doc";
open (MAILOUT, ">$mail_dir/$fname")
or die "Can't open $mail_dir/$fname: $!";
# If the get() complains, you need the new libnet bundle
$pop->get($i, \*MAILOUT) or die "Can't read mail";
close MAILOUT or die "Error closing $mail_dir/$fname";
# If you want to delete the mail on the server
# $pop->delete($i);
}
close MAILOUT;
$pop->quit();
# Parse the mail message into separate mime entities
my $parser=new MIME::Parser;
$parser->output_dir("mimemail");
opendir(DIR, $mail_dir) or die "Can't open directory $mail_dir: $!";
my @files = map { $mail_dir."/".$_ } sort
grep { -f "$mail_dir/$_" and /$mail_prefix-$$-/o } readdir DIR;
closedir DIR;
for my $file ( @files ) {
my $entity=$parser->parse_in($file) or die "Couldn't parse mail";
print_tnef_parts($entity);
# If you want to delete the working files
# $entity->purge;
}
sub print_tnef_parts {
my $ent = shift;
if ( $ent->parts ) {
for my $sub_ent ( $ent->parts ) {
print_tnef_parts($sub_ent);
}
} elsif ( $ent->mime_type =~ /ms-tnef/i ) {
# Create a tnef object
my $tnef = Convert::TNEF->read_ent($ent,{output_dir=>"tnefmail"})
or die $Convert::TNEF::errstr;
for ($tnef->attachments) {
print "Title:",$_->name,"\n";
print "Data:\n",$_->data,"\n";
}
# If you want to delete the working files
# $tnef->purge;
}
}
=head1 SEE ALSO
perl(1), IO::Wrap(3), MIME::Parser(3), MIME::Entity(3), MIME::Body(3)
=head1 CAVEATS
The parsing may depend on the endianness (see perlport) and width of
integers on the system where the TNEF file was created. If this proves
to be the case (check the debug output), I'll see what I can do
about it.
=head1 AUTHOR
Douglas Wilson, dougw@cpan.org
=cut

672
vendor_perl/MIME/Body.pm Normal file
View File

@@ -0,0 +1,672 @@
package MIME::Body;
=head1 NAME
MIME::Body - the body of a MIME message
=head1 SYNOPSIS
Before reading further, you should see L<MIME::Tools> to make sure that
you understand where this module fits into the grand scheme of things.
Go on, do it now. I'll wait.
Ready? Ok...
=head2 Obtaining bodies
### Get the bodyhandle of a MIME::Entity object:
$body = $entity->bodyhandle;
### Create a body which stores data in a disk file:
$body = new MIME::Body::File "/path/to/file";
### Create a body which stores data in an in-core array:
$body = new MIME::Body::InCore \@strings;
=head2 Opening, closing, and using IO handles
### Write data to the body:
$IO = $body->open("w") || die "open body: $!";
$IO->print($message);
$IO->close || die "close I/O handle: $!";
### Read data from the body (in this case, line by line):
$IO = $body->open("r") || die "open body: $!";
while (defined($_ = $IO->getline)) {
### do stuff
}
$IO->close || die "close I/O handle: $!";
=head2 Other I/O
### Dump the ENCODED body data to a filehandle:
$body->print(\*STDOUT);
### Slurp all the UNENCODED data in, and put it in a scalar:
$string = $body->as_string;
### Slurp all the UNENCODED data in, and put it in an array of lines:
@lines = $body->as_lines;
=head2 Working directly with paths to underlying files
### Where's the data?
if (defined($body->path)) { ### data is on disk:
print "data is stored externally, in ", $body->path;
}
else { ### data is in core:
print "data is already in core, and is...\n", $body->as_string;
}
### Get rid of anything on disk:
$body->purge;
=head1 DESCRIPTION
MIME messages can be very long (e.g., tar files, MPEGs, etc.) or very
short (short textual notes, as in ordinary mail). Long messages
are best stored in files, while short ones are perhaps best stored
in core.
This class is an attempt to define a common interface for objects
which contain message data, regardless of how the data is
physically stored. The lifespan of a "body" object
usually looks like this:
=over 4
=item 1.
B<Body object is created by a MIME::Parser during parsing.>
It's at this point that the actual MIME::Body subclass is chosen,
and new() is invoked. (For example: if the body data is going to
a file, then it is at this point that the class MIME::Body::File,
and the filename, is chosen).
=item 2.
B<Data is written to the body> (usually by the MIME parser) like this:
The body is opened for writing, via C<open("w")>. This will trash any
previous contents, and return an "I/O handle" opened for writing.
Data is written to this I/O handle, via print().
Then the I/O handle is closed, via close().
=item 3.
B<Data is read from the body> (usually by the user application) like this:
The body is opened for reading by a user application, via C<open("r")>.
This will return an "I/O handle" opened for reading.
Data is read from the I/O handle, via read(), getline(), or getlines().
Then the I/O handle is closed, via close().
=item 4.
B<Body object is destructed.>
=back
You can write your own subclasses, as long as they follow the
interface described below. Implementers of subclasses should assume
that steps 2 and 3 may be repeated any number of times, and in
different orders (e.g., 1-2-2-3-2-3-3-3-3-3-2-4).
In any case, once a MIME::Body has been created, you ask to open it
for reading or writing, which gets you an "i/o handle": you then use
the same mechanisms for reading from or writing to that handle, no matter
what class it is.
Beware: unless you know for certain what kind of body you have, you
should I<not> assume that the body has an underlying filehandle.
=head1 PUBLIC INTERFACE
=over 4
=cut
### Pragmas:
use strict;
use vars qw($VERSION);
### System modules:
use Carp;
use IO::File;
### The package version, both in 1.23 style *and* usable by MakeMaker:
$VERSION = "5.517";
#------------------------------
=item new ARGS...
I<Class method, constructor.>
Create a new body. Any ARGS are sent to init().
=cut
sub new {
my $self = bless {}, shift;
$self->init(@_);
$self;
}
#------------------------------
=item init ARGS...
I<Instance method, abstract, initiallizer.>
This is called automatically by C<new()>, with the arguments given
to C<new()>. The arguments are optional, and entirely up to the
subclass. The default method does nothing,
=cut
sub init { 1 }
#------------------------------
=item as_lines
I<Instance method.>
Return the contents of the body as an array of lines (each terminated
by a newline, with the possible exception of the final one).
Returns empty on failure (NB: indistinguishable from an empty body!).
Note: the default method gets the data via
repeated getline() calls; your subclass might wish to override this.
=cut
sub as_lines {
my $self = shift;
my @lines;
my $io = $self->open("r") || return ();
local $_;
push @lines, $_ while (defined($_ = $io->getline()));
$io->close;
@lines;
}
#------------------------------
=item as_string
I<Instance method.>
Return the body data as a string (slurping it into core if necessary).
Best not to do this unless you're I<sure> that the body is reasonably small!
Returns empty string for an empty body, and undef on failure.
Note: the default method uses print(), which gets the data via
repeated read() calls; your subclass might wish to override this.
=cut
sub as_string {
my $self = shift;
my $str = '';
my $fh = IO::File->new(\$str, '>:') or croak("Cannot open in-memory file: $!");
$self->print($fh);
close($fh);
return $str;
}
*data = \&as_string; ### silently invoke preferred usage
#------------------------------
=item binmode [ONOFF]
I<Instance method.>
With argument, flags whether or not open() should return an I/O handle
which has binmode() activated. With no argument, just returns the
current value.
=cut
sub binmode {
my ($self, $onoff) = @_;
$self->{MB_Binmode} = $onoff if (@_ > 1);
$self->{MB_Binmode};
}
#------------------------------
=item is_encoded [ONOFF]
I<Instance method.>
If set to yes, no decoding is applied on output. This flag is set
by MIME::Parser, if the parser runs in decode_bodies(0) mode, so the
content is handled unmodified.
=cut
sub is_encoded {
my ($self, $yesno) = @_;
$self->{MB_IsEncoded} = $yesno if (@_ > 1);
$self->{MB_IsEncoded};
}
#------------------------------
=item dup
I<Instance method.>
Duplicate the bodyhandle.
I<Beware:> external data in bodyhandles is I<not> copied to new files!
Changing the data in one body's data file, or purging that body,
I<will> affect its duplicate. Bodies with in-core data probably need
not worry.
=cut
sub dup {
my $self = shift;
bless { %$self }, ref($self); ### shallow copy ok for ::File and ::Scalar
}
#------------------------------
=item open READWRITE
I<Instance method, abstract.>
This should do whatever is necessary to open the body for either
writing (if READWRITE is "w") or reading (if mode is "r").
This method is expected to return an "I/O handle" object on success,
and undef on error. An I/O handle can be any object that supports a
small set of standard methods for reading/writing data.
See the IO::Handle class for an example.
=cut
sub open {
undef;
}
#------------------------------
=item path [PATH]
I<Instance method.>
If you're storing the body data externally (e.g., in a disk file), you'll
want to give applications the ability to get at that data, for cleanup.
This method should return the path to the data, or undef if there is none.
Where appropriate, the path I<should> be a simple string, like a filename.
With argument, sets the PATH, which should be undef if there is none.
=cut
sub path {
my $self = shift;
$self->{MB_Path} = shift if @_;
$self->{MB_Path};
}
#------------------------------
=item print FILEHANDLE
I<Instance method.>
Output the body data to the given filehandle, or to the currently-selected
one if none is given.
=cut
sub print {
my ($self, $fh) = @_;
my $nread;
### Get output filehandle, and ensure that it's a printable object:
$fh ||= select;
### Write it:
my $buf = '';
my $io = $self->open("r") || return undef;
$fh->print($buf) while ($nread = $io->read($buf, 8192));
$io->close;
return defined($nread); ### how'd we do?
}
#------------------------------
=item purge
I<Instance method, abstract.>
Remove any data which resides external to the program (e.g., in disk files).
Immediately after a purge(), the path() should return undef to indicate
that the external data is no longer available.
=cut
sub purge {
1;
}
=back
=head1 SUBCLASSES
The following built-in classes are provided:
Body Stores body When open()ed,
class: data in: returns:
--------------------------------------------------------
MIME::Body::File disk file IO::Handle
MIME::Body::Scalar scalar IO::Handle
MIME::Body::InCore scalar array IO::Handle
=cut
#------------------------------------------------------------
package MIME::Body::File;
#------------------------------------------------------------
=head2 MIME::Body::File
A body class that stores the data in a disk file. Invoke the
constructor as:
$body = new MIME::Body::File "/path/to/file";
In this case, the C<path()> method would return the given path,
so you I<could> say:
if (defined($body->path)) {
open BODY, $body->path or die "open: $!";
while (<BODY>) {
### do stuff
}
close BODY;
}
But you're best off not doing this.
=cut
### Pragmas:
use vars qw(@ISA);
use strict;
### System modules:
use IO::File;
### Kit modules:
use MIME::Tools qw(whine);
@ISA = qw(MIME::Body);
#------------------------------
# init PATH
#------------------------------
sub init {
my ($self, $path) = @_;
$self->path($path); ### use it as-is
$self;
}
#------------------------------
# open READWRITE
#------------------------------
sub open {
my ($self, $mode) = @_;
my $path = $self->path;
if( $mode ne 'r' && $mode ne 'w' ) {
die "bad mode: '$mode'";
}
my $IO = IO::File->new($path, $mode) || die "MIME::Body::File->open $path: $!";
$IO->binmode() if $self->binmode;
return $IO;
}
#------------------------------
# purge
#------------------------------
# Unlink the path (and undefine it).
#
sub purge {
my $self = shift;
if (defined($self->path)) {
unlink $self->path or whine "couldn't unlink ".$self->path.": $!";
$self->path(undef);
}
1;
}
#------------------------------------------------------------
package MIME::Body::Scalar;
#------------------------------------------------------------
=head2 MIME::Body::Scalar
A body class that stores the data in-core, in a simple scalar.
Invoke the constructor as:
$body = new MIME::Body::Scalar \$string;
A single scalar argument sets the body to that value, exactly as though
you'd opened for the body for writing, written the value,
and closed the body again:
$body = new MIME::Body::Scalar "Line 1\nLine 2\nLine 3";
A single array reference sets the body to the result of joining all the
elements of that array together:
$body = new MIME::Body::Scalar ["Line 1\n",
"Line 2\n",
"Line 3"];
=cut
use vars qw(@ISA);
use strict;
use Carp;
@ISA = qw(MIME::Body);
#------------------------------
# init DATA
#------------------------------
sub init {
my ($self, $data) = @_;
$data = join('', @$data) if (ref($data) && (ref($data) eq 'ARRAY'));
$self->{MBS_Data} = (defined($data) ? $data : '');
$self;
}
#------------------------------
# as_string
#------------------------------
sub as_string {
shift->{MBS_Data};
}
#------------------------------
# open READWRITE
#------------------------------
sub open {
my ($self, $mode) = @_;
$self->{MBS_Data} = '' if ($mode eq 'w'); ### writing
if ($mode eq 'w') {
$mode = '>:';
} elsif ($mode eq 'r') {
$mode = '<:';
} else {
die "bad mode: $mode";
}
return IO::File->new(\ $self->{MBS_Data}, $mode);
}
#------------------------------------------------------------
package MIME::Body::InCore;
#------------------------------------------------------------
=head2 MIME::Body::InCore
A body class that stores the data in-core.
Invoke the constructor as:
$body = new MIME::Body::InCore \$string;
$body = new MIME::Body::InCore $string;
$body = new MIME::Body::InCore \@stringarray
A simple scalar argument sets the body to that value, exactly as though
you'd opened for the body for writing, written the value,
and closed the body again:
$body = new MIME::Body::InCore "Line 1\nLine 2\nLine 3";
A single array reference sets the body to the concatenation of all
scalars that it holds:
$body = new MIME::Body::InCore ["Line 1\n",
"Line 2\n",
"Line 3"];
=cut
use vars qw(@ISA);
use strict;
use Carp;
@ISA = qw(MIME::Body::Scalar);
#------------------------------
# init DATA
#------------------------------
sub init {
my ($self, $data) = @_;
if (!defined($data)) { ### nothing
$self->{MBS_Data} = '';
}
elsif (!ref($data)) { ### simple scalar
$self->{MBS_Data} = $data;
}
elsif (ref($data) eq 'SCALAR') {
$self->{MBS_Data} = $$data;
}
elsif (ref($data) eq 'ARRAY') {
$self->{MBS_Data} = join('', @$data);
}
else {
croak "I can't handle DATA which is a ".ref($data)."\n";
}
$self;
}
1;
__END__
#------------------------------
=head2 Defining your own subclasses
So you're not happy with files and scalar-arrays?
No problem: just define your own MIME::Body subclass, and make a subclass
of MIME::Parser or MIME::ParserBase which returns an instance of your
body class whenever appropriate in the C<new_body_for(head)> method.
Your "body" class must inherit from MIME::Body (or some subclass of it),
and it must either provide (or inherit the default for) the following
methods...
The default inherited method I<should suffice> for all these:
new
binmode [ONOFF]
path
The default inherited method I<may suffice> for these, but perhaps
there's a better implementation for your subclass.
init ARGS...
as_lines
as_string
dup
print
purge
The default inherited method I<will probably not suffice> for these:
open
=head1 NOTES
One reason I didn't just use IO::Handle objects for message bodies was
that I wanted a "body" object to be a form of completely encapsulated
program-persistent storage; that is, I wanted users to be able to write
code like this...
### Get body handle from this MIME message, and read its data:
$body = $entity->bodyhandle;
$IO = $body->open("r");
while (defined($_ = $IO->getline)) {
print STDOUT $_;
}
$IO->close;
...without requiring that they know anything more about how the
$body object is actually storing its data (disk file, scalar variable,
array variable, or whatever).
Storing the body of each MIME message in a persistently-open
IO::Handle was a possibility, but it seemed like a bad idea,
considering that a single multipart MIME message could easily suck up
all the available file descriptors on some systems. This risk increases
if the user application is processing more than one MIME entity at a time.
=head1 SEE ALSO
L<MIME::Tools>
=head1 AUTHOR
Eryq (F<eryq@zeegee.com>), ZeeGee Software Inc (F<http://www.zeegee.com>).
Dianne Skoll (F<dianne@skoll.ca>)
All rights reserved. This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.
Thanks to Achim Bohnet for suggesting that MIME::Parser not be restricted
to the use of FileHandles.
#------------------------------
1;

1043
vendor_perl/MIME/Tools.pm Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -36,6 +36,7 @@ repo_mode="stable"
download_curl="/usr/bin/curl"
download="$download_curl -q -f -sS -L -O"
force_setup=0
tmp_dir=""
# Colors
NORMAL="$(tput sgr0 2>/dev/null || echo '')"
@@ -44,6 +45,7 @@ RED="$(tput setaf 1 2>/dev/null || echo '')"
BOLD="$(tput bold 2>/dev/null || echo '')"
ITALIC="$(tput sitm 2>/dev/null || echo '')"
# Print the usage message and exit
usage() {
if [ -n "${1-}" ]; then
echo "${RED}Error:${NORMAL} Unknown or invalid argument: $1"
@@ -92,6 +94,7 @@ EOF
exit 1
}
# Print a success or failure status line and exit on failure
post_status() {
status="$1"
message="$2"
@@ -107,6 +110,7 @@ post_status() {
fi
}
# Parse CLI arguments and select the active repository settings
process_args() {
for arg in "$@"; do
case "$arg" in
@@ -224,6 +228,7 @@ process_args() {
esac
}
# Ensure the script is running with root privileges
check_permission() {
if [ "$(id -u)" -ne 0 ]; then
echo "${RED}Error:${NORMAL} \`$(basename "$0")\` must be run as root!" >&2
@@ -231,14 +236,88 @@ check_permission() {
fi
}
# Create a temporary working directory, preferring mktemp when available
create_tmp_dir() {
if command -pv mktemp 1>/dev/null 2>&1; then
tmp_candidate=$(mktemp -d 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$tmp_candidate" ]; then
printf '%s\n' "$tmp_candidate"
return 0
fi
fi
for candidate in "/tmp" "/var/tmp"; do
if [ ! -d "$candidate" ] || [ ! -w "$candidate" ]; then
continue
fi
tmp_try=0
while [ "$tmp_try" -lt 10 ]; do
tmp_candidate="$candidate/webmin-setup-repo.$$"
[ "$tmp_try" -gt 0 ] && tmp_candidate="$tmp_candidate.$tmp_try"
if ( umask 077 && mkdir "$tmp_candidate" ) 2>/dev/null; then
printf '%s\n' "$tmp_candidate"
return 0
fi
tmp_try=$((tmp_try + 1))
done
done
return 1
}
# Create a temporary file in a specific directory for safe replacement writes
create_tmp_file() {
tmp_parent="$1"
tmp_prefix="$2"
if [ ! -d "$tmp_parent" ] || [ ! -w "$tmp_parent" ]; then
return 1
fi
if command -pv mktemp 1>/dev/null 2>&1; then
tmp_candidate=$(mktemp "$tmp_parent/$tmp_prefix.XXXXXX" 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$tmp_candidate" ]; then
printf '%s\n' "$tmp_candidate"
return 0
fi
fi
tmp_try=0
while [ "$tmp_try" -lt 10 ]; do
tmp_candidate="$tmp_parent/$tmp_prefix.$$"
[ "$tmp_try" -gt 0 ] && tmp_candidate="$tmp_candidate.$tmp_try"
if ( umask 077 && set -C && : > "$tmp_candidate" ) 2>/dev/null; then
printf '%s\n' "$tmp_candidate"
return 0
fi
tmp_try=$((tmp_try + 1))
done
return 1
}
# Create and switch into the temporary working directory
prepare_tmp() {
cd "/tmp" 1>/dev/null 2>&1
tmp_dir=$(create_tmp_dir)
if [ $? -ne 0 ] || [ -z "$tmp_dir" ]; then
echo "${RED}Error:${NORMAL} Failed to create temporary working directory!"
exit 1
fi
trap cleanup_tmp EXIT
trap 'cleanup_tmp; exit 1' HUP INT TERM
cd "$tmp_dir" 1>/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "${RED}Error:${NORMAL} Failed to switch to \`/tmp\`!"
echo "${RED}Error:${NORMAL} Failed to switch to temporary working directory!"
exit 1
fi
}
# Remove the temporary working directory on exit
cleanup_tmp() {
if [ -n "$tmp_dir" ] && [ -d "$tmp_dir" ]; then
rm -rf "$tmp_dir"
fi
}
# Detect the current OS family and choose the package manager commands
detect_os() {
osrelease="/etc/os-release"
if [ ! -f "$osrelease" ]; then
@@ -297,6 +376,7 @@ detect_os() {
fi
}
# Derive package-manager-specific repository file paths
set_os_variables() {
# Debian-based
debian_repo_file="/etc/apt/sources.list.d/$active_repo_name.list"
@@ -309,6 +389,7 @@ set_os_variables() {
rpm_repo_file="$rpm_repo_dir/$active_repo_name.repo"
}
# Show the repository mode warning and ask for confirmation when needed
ask_confirmation() {
# Format description so only the first word keeps its case and the rest is
# lowercased
@@ -337,6 +418,7 @@ ask_confirmation() {
fi
}
# Ensure a supported download tool is available
check_downloader() {
if [ ! -x "$download_curl" ]; then
if [ -x "/usr/bin/wget" ]; then
@@ -351,6 +433,7 @@ check_downloader() {
fi
}
# Install GnuPG on Debian-like systems when it is required
check_gpg() {
if [ -n "$osid_debian_like" ]; then
if [ ! -x /usr/bin/gpg ]; then
@@ -362,6 +445,7 @@ check_gpg() {
fi
}
# Parse package preference rules for the requested package manager
enforce_package_priority() {
repo_pkg_pref=$1
disttarget=$2
@@ -405,10 +489,10 @@ enforce_package_priority() {
IFS=$old_ifs
}
# Download the configured repository signing key files
download_key() {
echo " Downloading $repo_key_name key .."
for key in $repo_key; do
rm -f "/tmp/$key"
download_out=$($download "$repo_key_server/$key" 2>&1)
if [ $? -ne 0 ]; then
post_status 1 "$(printf '%s : %s' "$repo_key_server/$key" "$download_out" | tr '\n' ' ')"
@@ -418,6 +502,7 @@ download_key() {
post_status 0 ""
}
# Extract RPM-specific repository preference lines
rpm_repo_prefs() {
for pref in $repo_prefs; do
if echo "$pref" | grep "^rpm:" >/dev/null 2>&1; then
@@ -427,6 +512,7 @@ rpm_repo_prefs() {
done
}
# Install keys, configure repository files, and refresh metadata
setup_repos() {
# Format description so only the first word keeps its case and the rest is
# lowercased
@@ -539,8 +625,31 @@ EOF
post_status $?
# Set correct permissions on the repo key in case the system uses a restrictive umask
chmod 644 "/usr/share/keyrings/$repoid_debian_like-$repo_key_suffix.gpg"
sources_list=$(grep -v "$repo_host" /etc/apt/sources.list)
echo "$sources_list" > /etc/apt/sources.list
# Remove any existing entries for this repo from sources.list to avoid
# conflicts
if [ -f /etc/apt/sources.list ]; then
tmp=$(create_tmp_file "/etc/apt" "sources.list")
if [ $? -ne 0 ] || [ -z "$tmp" ]; then
post_status 1 "Failed to create temporary \`sources.list\`"
fi
grep -vF "$repo_host" /etc/apt/sources.list >"$tmp"
status=$?
if [ "$status" -le 1 ]; then
chmod 644 "$tmp"
if [ $? -ne 0 ]; then
rm -f "$tmp"
post_status 1 "Failed to set permissions on temporary \`sources.list\`"
fi
mv "$tmp" /etc/apt/sources.list
status=$?
if [ "$status" -ne 0 ]; then
post_status "$status" "Failed to replace \`/etc/apt/sources.list\`"
fi
else
rm -f "$tmp"
post_status "$status" "Failed to update \`/etc/apt/sources.list\`"
fi
fi
# Configure packages priority if provided
debian_repo_prefs="/etc/apt/preferences.d/$repoid_debian_like-$repo_dist-package-priority"
if [ -n "$repo_pkg_prefs" ]; then
@@ -626,6 +735,7 @@ $active_repo_download$repo_deb_pathname $repo_dist $repo_component"
esac
}
# Print the final installation hint when Webmin is not yet installed
final_msg() {
if [ "$install_check_binary" != "0" ] && [ ! -x "$install_check_binary" ]; then
echo "$install_message"

View File

@@ -3,7 +3,7 @@
import argparse, subprocess, json, os, sys, base64, binascii, time, hashlib, re, copy, textwrap, logging
try:
from urllib.request import urlopen, Request # Python 3
except ImportError:
except ImportError: # pragma: no cover
from urllib2 import urlopen, Request # Python 2
DEFAULT_CA = "https://acme-v02.api.letsencrypt.org" # DEPRECATED! USE DEFAULT_DIRECTORY_URL INSTEAD
@@ -13,7 +13,7 @@ LOGGER = logging.getLogger(__name__)
LOGGER.addHandler(logging.StreamHandler())
LOGGER.setLevel(logging.INFO)
def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check=False, directory_url=DEFAULT_DIRECTORY_URL, contact=None):
def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check=False, directory_url=DEFAULT_DIRECTORY_URL, contact=None, check_port=None):
directory, acct_headers, alg, jwk = None, None, None, None # global variables
# helper functions - base64 encode for jose spec
@@ -77,8 +77,7 @@ def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check
pub_hex, pub_exp = re.search(pub_pattern, out.decode('utf8'), re.MULTILINE|re.DOTALL).groups()
pub_exp = "{0:x}".format(int(pub_exp))
pub_exp = "0{0}".format(pub_exp) if len(pub_exp) % 2 else pub_exp
alg = "RS256"
jwk = {
alg, jwk = "RS256", {
"e": _b64(binascii.unhexlify(pub_exp.encode("utf-8"))),
"kty": "RSA",
"n": _b64(binascii.unhexlify(re.sub(r"(\s|:)", "", pub_hex).encode("utf-8"))),
@@ -98,7 +97,7 @@ def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check
for san in subject_alt_names.group(1).split(", "):
if san.startswith("DNS:"):
domains.add(san[4:])
log.info("Found domains: {0}".format(", ".join(domains)))
log.info(u"Found domains: {0}".format(", ".join(domains)))
# get the ACME directory of urls
log.info("Getting directory...")
@@ -108,12 +107,12 @@ def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check
# create account, update contact details (if any), and set the global key identifier
log.info("Registering account...")
reg_payload = {"termsOfServiceAgreed": True}
reg_payload = {"termsOfServiceAgreed": True} if contact is None else {"termsOfServiceAgreed": True, "contact": contact}
account, code, acct_headers = _send_signed_request(directory['newAccount'], reg_payload, "Error registering")
log.info("Registered!" if code == 201 else "Already registered!")
log.info("{0} Account ID: {1}".format("Registered!" if code == 201 else "Already registered!", acct_headers['Location']))
if contact is not None:
account, _, _ = _send_signed_request(acct_headers['Location'], {"contact": contact}, "Error updating contact details")
log.info("Updated contact details:\n{0}".format("\n".join(account['contact'])))
log.info("Updated contact details:\n{0}".format("\n".join(account.get('contact') or [])))
# create a new order
log.info("Creating new order...")
@@ -125,6 +124,11 @@ def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check
for auth_url in order['authorizations']:
authorization, _, _ = _send_signed_request(auth_url, None, "Error getting challenges")
domain = authorization['identifier']['value']
# skip if already valid
if authorization['status'] == "valid":
log.info("Already verified: {0}, skipping...".format(domain))
continue
log.info("Verifying {0}...".format(domain))
# find the http-01 challenge and write the challenge file
@@ -137,7 +141,7 @@ def get_crt(account_key, csr, acme_dir, log=LOGGER, CA=DEFAULT_CA, disable_check
# check that the file is in place
try:
wellknown_url = "http://{0}/.well-known/acme-challenge/{1}".format(domain, token)
wellknown_url = "http://{0}{1}/.well-known/acme-challenge/{2}".format(domain, "" if check_port is None else ":{0}".format(check_port), token)
assert (disable_check or _do_request(wellknown_url)[0] == keyauthorization)
except (AssertionError, ValueError) as e:
raise ValueError("Wrote file to {0}, but couldn't download {1}: {2}".format(wellknown_path, wellknown_url, e))
@@ -169,15 +173,11 @@ def main(argv=None):
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description=textwrap.dedent("""\
This script automates the process of getting a signed TLS certificate from Let's Encrypt using
the ACME protocol. It will need to be run on your server and have access to your private
account key, so PLEASE READ THROUGH IT! It's only ~200 lines, so it won't take long.
This script automates the process of getting a signed TLS certificate from Let's Encrypt using the ACME protocol.
It will need to be run on your server and have access to your private account key, so PLEASE READ THROUGH IT!
It's only ~200 lines, so it won't take long.
Example Usage:
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /usr/share/nginx/html/.well-known/acme-challenge/ > signed_chain.crt
Example Crontab Renewal (once per month):
0 0 1 * * python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /usr/share/nginx/html/.well-known/acme-challenge/ > /path/to/signed_chain.crt 2>> /var/log/acme_tiny.log
Example Usage: python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /usr/share/nginx/html/.well-known/acme-challenge/ > signed_chain.crt
""")
)
parser.add_argument("--account-key", required=True, help="path to your Let's Encrypt account private key")
@@ -188,11 +188,12 @@ def main(argv=None):
parser.add_argument("--directory-url", default=DEFAULT_DIRECTORY_URL, help="certificate authority directory url, default is Let's Encrypt")
parser.add_argument("--ca", default=DEFAULT_CA, help="DEPRECATED! USE --directory-url INSTEAD!")
parser.add_argument("--contact", metavar="CONTACT", default=None, nargs="*", help="Contact details (e.g. mailto:aaa@bbb.com) for your account-key")
parser.add_argument("--check-port", metavar="PORT", default=None, help="what port to use when self-checking the challenge file, default is port 80")
args = parser.parse_args(argv)
LOGGER.setLevel(args.quiet or LOGGER.level)
signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca, disable_check=args.disable_check, directory_url=args.directory_url, contact=args.contact)
signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca, disable_check=args.disable_check, directory_url=args.directory_url, contact=args.contact, check_port=args.check_port)
sys.stdout.write(signed_crt)
if __name__ == "__main__": # pragma: no cover
main(sys.argv[1:])
main(sys.argv[1:])

View File

@@ -145,12 +145,12 @@ if ($in{'md5pass'} == 1) {
elsif ($in{'md5pass'} == 2) {
# SHA512 enabled .. check support
$need = &acl::check_sha512();
$need && &error(&text('session_esha512mod', "<tt>$need</tt>"));
$need && &error(&text('session_edigestcrypt', 'SHA512'));
}
elsif ($in{'md5pass'} == 3) {
# yescrypt enabled .. check support
$need = &acl::check_yescrypt();
$need && &error(&text('session_eyescrypt', "<tt>$need</tt>"));
$need && &error(&text('session_edigestcrypt', 'yescrypt'));
}
$gconfig{'md5pass'} = $in{'md5pass'};
@@ -191,4 +191,3 @@ $gconfig{'rpc_timeout'} = $rpc_timeout;
&show_restart_page();
&webmin_log("session", undef, undef, \%in);

View File

@@ -5,6 +5,9 @@ cron_mode=Show update times as,1,0-Simple interface,1-Cron time selector
warn_days=Days before password expiry to warn users,0,5
line2=Let's Encrypt configuration,11
letsencrypt_cmd=Full path to Let's Encrypt client command,3,Find automatically
letsencrypt_directory_url=Custom ACME directory URL,3,Use Let's Encrypt production
letsencrypt_eab_kid=External Account Binding key ID,3,None
letsencrypt_eab_hmac=External Account Binding HMAC key,12
letsencrypt_algo=Encryption algorithm for Let's Encrypt private key,1,rsa-RSA,ecdsa-ECC
letsencrypt_dns_wait=Seconds to wait for Let's Encrypt DNS propagation,0,5
letsencrypt_before=Command to run before Let's Encrypt request,0,60

View File

@@ -261,9 +261,22 @@ print ui_tabs_end_tab();
# Let's Encrypt form
print ui_tabs_start_tab("mode", "lets");
print "$text{'ssl_letsdesc'}<p>\n";
my $err = &check_letsencrypt();
print $text{'ssl_letsdesc'};
if (!$err) {
print &ui_tag('span',
&ui_details({
'class' => 'inline inlined',
'title' => '',
'content' => $text{'ssl_letsdesc2'},
}))."\n".
&ui_tag('style',
".ui--span>details.inline>summary+span {\n".
"margin-top: 0;\n".
"}\n");
}
print "<p>\n";
if ($err) {
print "<b>",&text('ssl_letserr', $err),"</b><p>\n";
print &get_letsencrypt_install_message(
@@ -273,7 +286,6 @@ if ($err) {
}
else {
# Show form to create a cert
print "$text{'ssl_letsdesc2'}<p>\n";
print &ui_form_start("letsencrypt.cgi");
print &ui_table_start($text{'ssl_letsheader'}, undef, 2);
@@ -287,10 +299,18 @@ else {
# Apache vhost or other path
my @opts;
my $certbot_by_webmin = $letsencrypt_cmd
? &is_webmin_listening_on_port(80)
: 0;
my $certbot_warning = $letsencrypt_cmd
? &get_letsencrypt_certbot_port_error()
: undef;
my $webroot = $config{'letsencrypt_webroot'};
my $hasapache = &foreign_installed("apache");
my $mode = $webroot eq 'dns' ? 3 :
my $saved_mode = $config{'letsencrypt_mode'} || "web";
my $mode = $saved_mode eq 'dns' ? 3 :
$saved_mode eq 'certbot' ? 4 :
$webroot ? 2 :
$hasapache ? 0 :
$letsencrypt_cmd ? 4 : 2;
@@ -325,8 +345,23 @@ else {
if ($letsencrypt_cmd) {
push(@opts, [ 4, $text{'ssl_letsmode4'} ]);
}
my $mode_html = &ui_radio_table("webroot_mode", $mode, \@opts);
if ($certbot_warning) {
# Keep the warning aligned with the validation options (hacky as
# we have no API for this yet)
$certbot_warning .= " ".$text{'ssl_certbotprehook'}
if (!$certbot_by_webmin && $config{'letsencrypt_before'});
my $warning_note = &ui_note($certbot_warning, 0);
my $warning_html =
"<tr><td colspan='2'>".
&ui_tag('div', $warning_note,
{ 'style' => 'padding-left: 19px; '.
'margin-top: -8px !important' }).
"</td></tr>\n";
$mode_html =~ s#</table>\s*$#$warning_html</table>#;
}
print &ui_table_row($text{'ssl_letsmode'},
&ui_radio_table("webroot_mode", $mode, \@opts));
$mode_html);
# Install in Webmin now?
print &ui_table_row($text{'ssl_usewebmin'},
@@ -343,6 +378,32 @@ else {
[ [ 0, $text{'ssl_staging0'} ],
[ 1, $text{'ssl_staging1'} ] ]));
my $acme_extra = &ui_table_start(undef, undef, 2);
$acme_extra .= &ui_table_row($text{'ssl_acmedir'},
&ui_textbox("directory_url",
$config{'letsencrypt_directory_url'}, 60)."<br>\n".
&ui_note($text{'ssl_acmedirdesc'}, 0));
$acme_extra .= &ui_table_row($text{'ssl_acmekid'},
&ui_textbox("eab_kid",
$config{'letsencrypt_eab_kid'}, 40)."<br>\n".
&ui_note($text{'ssl_acmekiddesc'}, 0));
$acme_extra .= &ui_table_row($text{'ssl_acmehmac'},
&ui_password("eab_hmac",
$config{'letsencrypt_eab_hmac'}, 50)."<br>\n".
&ui_note($text{'ssl_acmehmacdesc'}, 0));
$acme_extra .= &ui_table_end();
print &ui_table_row($text{'ssl_acmeopts'},
&ui_details({
'class' => 'inline inlined',
'html' => 1,
'title' => $text{'ssl_acmeextra'},
'content' => $acme_extra,
})."\n".
&ui_tag('style',
"tr>td>details.inline>summary+span {\n".
"margin-left: 0;\n".
"}\n"));
# Renewal option
my $job = &find_letsencrypt_cron_job();
my $renew = $job && $job->{'months'} =~ /^\*\/(\d+)$/ ? $1 : undef;
@@ -359,4 +420,3 @@ print ui_tabs_end_tab();
print ui_tabs_end(1);
ui_print_footer("", $text{'index_return'});

View File

@@ -250,7 +250,6 @@ ssl_essl=The Net::SSLeay perl module does not appear to be installed on your sys
ssl_cpan=Alternately, you can have Webmin <a href='$1'>download and install</a> the required Net::SSLeay Perl module for you.
ssl_emessage=The error message from Perl was : $1
ssl_desc1=يبدو أن المضيف الذي يتم تشغيل Webmin عليه تم تثبيت الوحدة النمطية SSLeay Perl. باستخدام هذا ، يدعم Webmin الاتصال المشفر SSL بين المستعرض والخادم. إذا كنت تقوم بالوصول إلى خادم Webmin عبر الإنترنت ، فعليك بالتأكيد التفكير في استخدام طبقة المقابس الآمنة لمنع مهاجم من التقاط كلمة مرور Webmin الخاصة بك.
ssl_desc2=Warning - only turn on SSL support if you have a browser that supports SSL, and there is no firewall blocking <b>https</b> requests between your browser and the Webmin host.
ssl_header=دعم SSL
ssl_on=تمكين SSL؟
ssl_key=ملف المفتاح الخاص
@@ -261,6 +260,7 @@ ssl_deny=إصدارات بروتوكول SSL لرفض
ssl_compression=هل تسمح باتصالات SSL المضغوطة؟
ssl_honorcipherorder=فرض استخدام ترتيب الشفرات المعرفة من قبل الخادم؟
ssl_extracas=Additional certificate files<br>(for chained certificates)
ssl_enforce=فرض استخدام بروتوكول SSL
ssl_hsts=فرض SSL مع رأس HSTS
ssl_redirect=إعادة توجيه طلبات SSL إلى وضع SSL؟
ssl_extracasdef=نفس إعدادات SSL العالمية
@@ -320,7 +320,7 @@ ssl_tabcreate=شهادة موقعة ذاتيا
ssl_tabcsr=طلب توقيع شهادة
ssl_tabupload=تحميل الشهادة
ssl_tabcurrent=الشهادة الحالية
ssl_tablets=دعونا تشفير
ssl_tablets=موفر شهادة SSL
ssl_cheader=تفاصيل الشهادة الحالية
ssl_typeself=موقعة ذاتيا
ssl_typereal=وقعت من قبل كاليفورنيا
@@ -332,14 +332,14 @@ ssl_edownload=فشل في استخراج بيانات PEM من الشهادة
ssl_csralready=عرض آخر مفتاح و CSR ..
ssl_already1=المفتاح الخاص الذي تم إنشاؤه مسبقًا :
ssl_already2=طلب توقيع شهادة تم إنشاؤه مسبقًا :
ssl_letsdesc=Let's Encrypt هي المرجع المصدق المجاني والآلي والمفتوح والذي يمكن استخدامه لإنشاء شهادة SSL للاستخدام بواسطة Webmin.
ssl_letserr=Unfortunately, Let's Encrypt cannot be used on your system : $1.
ssl_letserr2=Alternately, check the <a href='$1'>module configuration</a> page to ensure you are using the correct path to the <tt>letsencrypt</tt> command.
ssl_letsdesc2=يمكن استخدام هذه الصفحة لطلب شهادة جديدة ، والتي ستقوم بالكتابة فوق أي أخرى تم تكوينها حاليًا في Webmin. ومع ذلك ، تتطلب خدمة Let's Encrypt التحقق من ملكيتك لمجال الشهادة بالتحقق من أن هذا النظام يستضيف موقع الويب الخاص بالنطاق. يتم ذلك عن طريق وضع ملف مؤقت صغير في دليل مستندات موقع الويب.
ssl_letsdesc=يتيح لك هذا النموذج طلب شهادة SSL موثوقة لـ Webmin من موفر متوافق مع ACME مثل Let's Encrypt.
ssl_letserr=لسوء الحظ، لا يمكن لهذا النظام طلب شهادات من موفر SSL : $1.
ssl_letserr2=بدلاً من ذلك، تحقق من صفحة <a href='$1'>تكوين الوحدة</a> للتأكد من أنك تستخدم المسار الصحيح لأمر عميل ACME المُكوَّن.
ssl_letsdesc2=ستحل الشهادة الجديدة محل الشهادة المُهيأة حاليًا في Webmin. قبل إصدارها، يجب على موفر ACME التحقق من ملكية كل اسم مضيف باستخدام ملف مؤقت في دليل مستندات الموقع الإلكتروني أو سجل DNS مؤقت من نوع TXT.
ssl_letsheader=خيارات لشهادة SSL جديدة
ssl_letsdoms=أسماء المضيفين للشهادة
ssl_subset=هل تريد تخطي أسماء المضيفين غير القابلة للتحقق؟
ssl_letsmode=دعونا تشفير طريقة التحقق من الصحة
ssl_letsmode=أسلوب التحقق من صحة المجال
ssl_letsmode0=مضيف Apache الظاهري يطابق اسم المضيف
ssl_letsmode1=تم تحديد مضيف افتراضي Apache
ssl_letsmode2=دليل مستندات خادم الويب الآخر
@@ -350,9 +350,17 @@ ssl_letsonly=مجرد تحديث التجديد
ssl_usewebmin=نسخ مفتاح جديد وشهادة إلى Webmin؟
ssl_letsrenew=أشهر بين التجديد التلقائي
ssl_letsnotrenew=تجديد فقط يدويا
ssl_staging=دعونا تشفير الخادم
ssl_staging0=حقيقة
ssl_staging1=التدريج (اختبار فقط)
ssl_staging=خادم المزوّد
ssl_staging0=إنتاج
ssl_staging1=مرحلة الاختبار (للاختبار فقط)
ssl_acmeopts=إعدادات المزوّد
ssl_acmeextra=عرض الإعدادات المتقدمة
ssl_acmedir=عنوان URL مخصص لدليل ACME
ssl_acmedirdesc=في حال تم تعيين هذا الخيار، فإنه يلغي خادم الموفر الافتراضي المذكور أعلاه.
ssl_acmekid=معرّف مفتاح ربط الحساب الخارجي
ssl_acmekiddesc=اختياري. بعض مزودي خدمة ACME يشترطون هذا بالإضافة إلى عنوان URL الخاص بالدليل.
ssl_acmehmac=مفتاح HMAC لربط الحساب الخارجي
ssl_acmehmacdesc=اختياري. يتطلب استخدام عميل Certbot الأصلي.
newkey_err=أخفق إنشاء مفتاح SSL
newkey_ecn=اسم الخادم مفقود أو غير صالح
@@ -571,13 +579,14 @@ session_pmode0=حرمان المستخدمين دائمًا من استخدام
session_pmode1=السماح دائمًا للمستخدمين بكلمات مرور منتهية الصلاحية
session_pmode2=مطالبة المستخدمين باستخدام كلمات مرور منتهية الصلاحية لإدخال كلمة مرور جديدة
session_md5=Webmin كلمة المرور التجزئة شكل
session_rpc_timeout=مهلة جلسة RPC
session_erpc_timeout=مهلة جلسة RPC مفقودة أو يجب أن تكون رقمًا أكبر من 0
session_md5off=تحديد تلقائيا
session_md5on=استخدم تنسيق التجزئة <tt>MD5</tt>
session_sha512=استخدم تنسيق التجزئة <tt>SHA512</tt>
session_yescrypt=استخدم تنسيق التجزئة <tt>yescrypt</tt>
session_emd5mod=لا يمكن استخدام تنسيق تجزئة MD5 ، حيث لم يتم تثبيت الوحدة النمطية Perl$1
session_esha512mod=لا يمكن استخدام تنسيق التجزئة SHA512 ، حيث لم يتم تثبيت الوحدة النمطية Perl$1
session_eyescrypt=لا يمكن استخدام تنسيق تجزئة yescrypt ، حيث لم يتم تثبيت الوحدة النمطية Perl$1
session_edigestcrypt=لا يمكن استخدام تنسيق التجزئة $1، لأن دالة التشفير في النظام لا تدعمه
session_blocklock=قفل المستخدمين أيضًا بتسجيل الدخول الفاشل
session_passapi=تمكين API تغيير كلمة المرور عن بعد؟
session_passapi0=API تعطيل
@@ -652,13 +661,14 @@ log_delete_webmincron=Deleted $1 scheduled functions
log_run_webmincron=Ran $1 scheduled functions
log_save_webmincron=Updated scheduled function in module $1
log_onedelete_webmincron=Deleted scheduled function in module $1
log_letsencrypt=طلب شهادة SSL جديدة من Let's Encrypt
log_letsencryptdns=Created Let's Encrypt DNS record for $1
log_letsencryptcleanup=Removed Let's Encrypt DNS record for $1
log_letsencrypt=طلب شهادة SSL جديدة من مزود ACME
log_letsencryptdns=تم إنشاء سجل ACME DNS لـ $1
log_letsencryptcleanup=تمت إزالة سجل نظام أسماء النطاقات (DNS) الخاص بشركة ACME لـ $1
themes_title=Webmin المواضيع
themes_desc=تتحكم السمات في مظهر واجهة مستخدم Webmin ، بما في ذلك الرموز والألوان والخلفيات وتخطيط الصفحات. يمكن استخدام مربع الاختيار أدناه لاختيار أحد السمات المثبتة على نظامك.
themes_sel=الموضوع الحالي :
themes_configure=افتح صفحة إعدادات القالب
themes_default=موضوع Webmin القديم
themes_none=لا شيء - دع الموضوع يقرر
themes_change=يتغيرون
@@ -988,6 +998,7 @@ sendmail_authdef=الافتراضي (حاليًا Cram-MD5)
sendmail_from=من عنوان البريد الإلكتروني من Webmin
sendmail_fromdef=Default ($1)
sendmail_fromaddr=عنوان
sendmail_name=اسم العرض
sendmail_toaddr=عنوان الوجهة الافتراضي للإشعارات
sendmail_to_def=لم يتم تحديد أي شيء
sendmail_etoaddr=عنوان الوجهة مفقود أو منسق بشكل غير صحيح
@@ -1089,6 +1100,7 @@ twofactor_enrolllink=You can now enroll for two-factor authentication in the <a
twofactor_url=To learn more about $1, see it's website at <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=The Perl module <tt>$1</tt> needed for two-factor authentication is not installed. Use the <a href='$2'>Perl Modules</a> page in Webmin to install it.
twofactor_qrcode=أدخل الرمز السري $1 في تطبيق TOTP، أو قم بمسح رمز الاستجابة السريعة QR أدناه.
twofactor_qrcode_manual=أدخل الرمز السري $1 في تطبيق TOTP وقم بإعداده يدويًا، حيث أن إنشاء رمز الاستجابة السريعة غير مدعوم في هذا النظام.
twofactor_etotpid=سر TOP32 ترميز base32 غير صالح
twofactor_etotptoken=يجب أن يكون رمز TOTP رقمًا
twofactor_etotpmatch=رمز OTP غير صحيح
@@ -1098,9 +1110,9 @@ twofactor_secret0=استخدام مفتاح 16 حرف
twofactor_esecret=يجب أن يكون طول المفتاح السري 16 حرفًا تمامًا وأن يحتوي على أحرف وأرقام فقط
twofactor_esession=لا يمكن استخدام المصادقة الثنائية ما لم تكن المصادقة المستندة إلى الجلسة نشطة
letsencrypt_title=دعونا تشفير طلب الشهادة
letsencrypt_title=طلب شهادة موفر SSL
letsencrypt_err=فشل في طلب الشهادة
letsencrypt_ecmds=Neither the Let's Encrypt client command <tt>certbot</tt> or the <tt>python</tt> command were found on your system
letsencrypt_ecmds=لم يتم العثور على أمر عميل ACME الأصلي <tt>certbot</tt> ولا أمر <tt>python</tt> على نظامك
letsencrypt_epythonmod=The Python module $1 needed by the built-in Let's Encrypt client is not installed
letsencrypt_epythonver=Failed to get the Python version : $1
letsencrypt_epythonver2=Python version $1 or above is required, but you only have version $2.
@@ -1108,6 +1120,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=The Apache virtual host $1 has no document directory!
letsencrypt_edom=اسم مجال مفقود أو غير صالح
letsencrypt_erenew=مفقود أو غير فاصل التجديد الرقمي
letsencrypt_eacmedir=عنوان URL لدليل ACME مفقود أو غير صالح
letsencrypt_eeabdir=يجب إدخال عنوان URL لدليل ACME عند استخدام ربط الحساب الخارجي
letsencrypt_eeabpair=يجب إدخال كل من معرّف مفتاح ربط الحساب الخارجي ومفتاح HMAC
letsencrypt_eeabnative=لا يمكن استخدام ربط الحساب الخارجي إلا عند تثبيت عميل ACME الأصلي
letsencrypt_ewebroot=دليل وثيقة الموقع غير موجود
letsencrypt_evhost=No virtual host matching $1 was found
letsencrypt_efull=Expected full certificate file $1 was not found
@@ -1130,9 +1146,9 @@ letsencrypt_echain=Failed to download chained certificate : $1
letsencrypt_echain2=Chained certificate downloaded from $1 is empty
letsencrypt_ecsr=Failed to generate CSR : $1
letsencrypt_ekeygen=Failed to generate private key : $1
letsencrypt_enative=تم استخدام عميل Let's Encrypt الأصلي (certbot) مسبقًا على هذا النظام ، ويجب استخدامه لجميع طلبات الشهادات المستقبلية
letsencrypt_eacmedns=يدعم العميل Let's Encrypt فقط التحقق القائم على DNS
letsencrypt_eacmecertbot=فقط عميل Let's Encrypt الرسمي هو الذي يدعم التحقق من صحة Certbot
letsencrypt_enative=تم استخدام عميل ACME الأصلي (certbot) سابقًا على هذا النظام، ويجب استخدامه لجميع طلبات الشهادات المستقبلية
letsencrypt_eacmedns=يدعم عميل ACME الأصلي فقط التحقق المستند إلى نظام أسماء النطاقات (DNS)
letsencrypt_eacmecertbot=يدعم عميل ACME الأصلي فقط التحقق من صحة Certbot
announce_hide=إخفاء هذا الإعلان
alert_hide=إخفاء التنبيه

View File

@@ -340,7 +340,6 @@ ssl_essl=Perl модулът Net::SSLeay изглежда не е инстали
ssl_cpan=Алтернативно, можете да имате Webmin <a href='$1'>изтегляне и инсталиране</a> необходимия за вас модул Net::SSLeay Perl.
ssl_emessage=Съобщението за грешка от Perl беше : $1
ssl_desc1=Хостът, на който работи Webmin, изглежда има инсталиран модул SSLeay Perl. Използвайки това, Webmin поддържа SSL криптирана комуникация между вашия браузър и сървъра. Ако осъществявате достъп до вашия сървър на Webmin през Интернет, тогава определено трябва да помислите да използвате SSL, за да предотвратите злоупотребата с нападателя да улови паролата ви за Webmin.
ssl_desc2=Предупреждение - включете поддръжката на SSL само ако имате браузър, който поддържа SSL и няма защитна стена, блокираща <b>https</b> заявки между вашия браузър и хост Webmin.
ssl_header=SSL поддръжка
ssl_on=Да се активира SSL?
ssl_key=Файл с частен ключ
@@ -351,6 +350,7 @@ ssl_deny=Версии на SSL протокол за отхвърляне
ssl_compression=Разрешаване на компресирани SSL връзки?
ssl_honorcipherorder=Принудително използване на дефиниран от сървъра шифров ред?
ssl_extracas=Допълнителни сертификатни файлове <br> (за верижни сертификати)
ssl_enforce=Прилагане на SSL
ssl_hsts=Налагане на SSL с HSTS заглавка
ssl_redirect=Пренасочване на не-SSL заявки към SSL режим?
ssl_extracasdef=Същите като глобалните SSL настройки
@@ -410,7 +410,7 @@ ssl_tabcreate=Самоподписано удостоверение
ssl_tabcsr=Заявка за подписване на сертификат
ssl_tabupload=Качване на сертификат
ssl_tabcurrent=Актуално удостоверение
ssl_tablets=Нека да шифроваме
ssl_tablets=Доставчик на SSL
ssl_cheader=Подробности за текущия сертификат
ssl_typeself=Самоподписаният
ssl_typereal=Подписано от СА
@@ -422,14 +422,14 @@ ssl_edownload=Неуспешно извличане на PEM данни от с
ssl_csralready=Вижте най-новия ключ и CSR ..
ssl_already1=По-рано генериран частен ключ :
ssl_already2=Преди генерирана заявка за подписване на сертификат :
ssl_letsdesc=Нека Encrypt е безплатен, автоматизиран и отворен орган за сертифициране, който може да се използва за генериране на SSL сертификат за използване от Webmin.
ssl_letserr=За съжаление, Нека Encrypt не може да се използва във вашата система: $1.
ssl_letserr2=Алтернативно, проверете страницата на <a href='$1'>конфигурацията на модула</a>, за да се уверите, че използвате правилния път до командата <tt>letsencrypt</tt>.
ssl_letsdesc2=Тази страница може да се използва за заявяване на нов сертификат, който ще презапише всички останали понастоящем конфигурирани в Webmin. Услугата Let's Encrypt обаче изисква вашата собственост върху домейна на сертификат да бъде потвърдена, като проверите дали тази система хоства уебсайта за домейна. Това става, като се постави малък временен файл в директорията с документи на уебсайта.
ssl_letsdesc=Този формуляр ви позволява да заявите надежден SSL сертификат за Webmin от ACME-съвместим доставчик, като например Let's Encrypt.
ssl_letserr=За съжаление, тази система не може да изисква сертификати от SSL доставчик: $1.
ssl_letserr2=Като алтернатива, проверете страницата за <a href='$1'>конфигурация на модула</a>, за да се уверите, че използвате правилния път до конфигурираната команда на ACME клиента.
ssl_letsdesc2=Новият сертификат ще замени този, който е конфигуриран в момента в Webmin. Преди да може да бъде издаден, доставчикът на ACME трябва да провери контрола върху всяко име на хост, използвайки временен файл в директорията с документи на уебсайта или временен DNS TXT запис.
ssl_letsheader=Опции за нов SSL сертификат
ssl_letsdoms=Имена на хостове за сертификат
ssl_subset=Пропускане на неподлежащи на проверка имена на хостове?
ssl_letsmode=Let's Encrypt метод за валидиране
ssl_letsmode=Метод за валидиране на домейн
ssl_letsmode0=Apache виртуален хост, съответстващ на име на хост
ssl_letsmode1=Избран виртуален хост Apache
ssl_letsmode2=Друга директория с документи на уеб сървъра
@@ -440,9 +440,17 @@ ssl_letsonly=Просто актуализирайте подновяванет
ssl_usewebmin=Копиране на нов ключ и сертификат в Webmin?
ssl_letsrenew=Месеци между автоматично подновяване
ssl_letsnotrenew=Обновяване само ръчно
ssl_staging=Нека шифроваме сървъра
ssl_staging0=реален
ssl_staging1=Постановка (само за тест)
ssl_staging=Сървър на доставчика
ssl_staging0=Производство
ssl_staging1=Стадиране (само тест)
ssl_acmeopts=Настройки на доставчика
ssl_acmeextra=Показване на разширени настройки
ssl_acmedir=URL адрес на персонализирана ACME директория
ssl_acmedirdesc=Ако е зададено, това отменя сървъра на доставчика по подразбиране по-горе.
ssl_acmekid=Идентификатор на ключ за свързване на външен акаунт
ssl_acmekiddesc=Незадължително. Някои доставчици на ACME изискват това в допълнение към URL адреса на директорията.
ssl_acmehmac=HMAC ключ за свързване на външен акаунт
ssl_acmehmacdesc=По избор. Изисква вградения Certbot клиент, когато се използва.
newkey_err=Неуспешно създаване на SSL ключ
newkey_ecn=Липсващо или невалидно име на сървъра
@@ -664,13 +672,14 @@ session_pmode0=Винаги отричайте потребителите с и
session_pmode1=Винаги разрешавайте на потребителите с изтекли пароли
session_pmode2=Подкажете потребителите с изтекли пароли да въведат нова
session_md5=Формат на хеширане на паролата за Webmin
session_rpc_timeout=Време за изчакване на RPC сесията
session_erpc_timeout=Времето за изчакване на RPC сесията липсва или трябва да е число, по-голямо от 0
session_md5off=Определяне автоматично
session_md5on=Използвайте хеширащ формат <tt>MD5</tt>
session_sha512=Използвайте хеширащ формат <tt>SHA512</tt>
session_yescrypt=Използвайте хеширащ формат <tt>yescrypt</tt>
session_emd5mod=MD5 форматът за хеширане не може да се използва, тъй като Perl $1 модулът не е инсталиран
session_esha512mod=Хеширащият формат SHA512 не може да се използва, тъй като Perl $1 модулът не е инсталиран
session_eyescrypt=форматът за хеширане на yescrypt не може да се използва, тъй като модулът Perl $1 не е инсталиран
session_edigestcrypt=Хеширащият формат $1 не може да се използва, защото системната функция <tt>crypt</tt> не го поддържа
session_blocklock=Освен това заключвайте потребителите с неуспешни влизания
session_passapi=Активиране на API за отдалечена промяна на паролата?
session_passapi0=API деактивиран
@@ -746,13 +755,14 @@ log_delete_webmincron=Изтрити $1 планирани функции
log_run_webmincron=Ran $1 планирани функции
log_save_webmincron=Актуализирана функция за планиране в модул $1
log_onedelete_webmincron=Изтрита планирана функция в модул $1
log_letsencrypt=Изискван е нов SSL сертификат от Let's Encrypt
log_letsencryptdns=Създаден Да шифроваме DNS запис за $1
log_letsencryptcleanup=Премахнато Нека да шифроваме DNS запис за $1
log_letsencrypt=Заявено е ново SSL удостоверение от ACME доставчик
log_letsencryptdns=Създаден е ACME DNS запис за $1
log_letsencryptcleanup=Премахнат е ACME DNS запис за $1
themes_title=Теми на Webmin
themes_desc=Темите контролират появата на потребителския интерфейс на Webmin, включително икони, цветове, фонове и оформлението на страниците. Полето за избор по-долу може да се използва за избор на една от темите, инсталирани във вашата система.
themes_sel=Тема :
themes_configure=Отваряне на страницата за конфигурация на темата
themes_default=Стара тема на Webmin
themes_none=Няма - оставете темата да реши
themes_change=промяна
@@ -1104,6 +1114,7 @@ sendmail_authdef=По подразбиране (в момента Cram-MD5)
sendmail_from=От адрес за имейл от Webmin
sendmail_fromdef=По подразбиране ($1)
sendmail_fromaddr=адрес
sendmail_name=Показвано име
sendmail_toaddr=Адрес на дестинация по подразбиране за известия
sendmail_to_def=Няма зададени
sendmail_etoaddr=Липсващ или неправилно форматиран целеви адрес
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Вече можете да се регистрирате з
twofactor_url=За да научите повече за $1, вижте неговия уебсайт на <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Модулът Perl <tt>$1</tt>, необходим за двуфакторно удостоверяване, не е инсталиран. Използвайте страницата <a href='$2'>Perl Modules</a> в Webmin, за да я инсталирате.
twofactor_qrcode=Въведете тайния код $1 в приложението TOTP или сканирайте QR кода по-долу.
twofactor_qrcode_manual=Въведете секретния код $1 в приложението TOTP и го настройте ръчно, тъй като генерирането на QR кодове не се поддържа на тази система.
twofactor_etotpid=Невалидна тайна, кодирана от базата TOTP
twofactor_etotptoken=Токенът TOTP трябва да е число
twofactor_etotpmatch=Неправилен OTP код
@@ -1214,9 +1226,9 @@ twofactor_secret0=Използвайте 16-знаков ключ
twofactor_esecret=Тайният ключ трябва да е с дължина точно 16 знака и да съдържа само букви и цифри
twofactor_esession=Двуфакторната автентификация не може да се използва, ако не е активна автентификация на базата на сесия
letsencrypt_title=Нека да шифроваме заявка за сертификат
letsencrypt_title=Заявка за SSL сертификат на доставчик
letsencrypt_err=Заявката за сертификат не бе успешна
letsencrypt_ecmds=Нито командата Let's Encrypt client <tt>certbot</tt>, нито командата <tt>python</tt> не бяха намерени във вашата система
letsencrypt_ecmds=Нито оригиналната команда <tt>certbot</tt> на ACME клиента, нито командата <tt>python</tt> бяха открити във вашата система
letsencrypt_epythonmod=Модулът Python $1, необходим на вградения клиент Let's Encrypt, не е инсталиран
letsencrypt_epythonver=Неуспешно получаване на версията Python : $1
letsencrypt_epythonver2=Необходима е версия на Python $1 или по-висока, но имате само версия $2.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Виртуалният хост на Apache $1 няма директория с документи!
letsencrypt_edom=Липсващо или невалидно име на домейн
letsencrypt_erenew=Липсващ или ненумерен интервал за подновяване
letsencrypt_eacmedir=Липсващ или невалиден URL адрес на директорията ACME
letsencrypt_eeabdir=Трябва да се въведе URL адрес на ACME директория, когато се използва свързване с външен акаунт
letsencrypt_eeabpair=Трябва да бъдат въведени както идентификационният номер на ключа за свързване на външен акаунт, така и HMAC ключът
letsencrypt_eeabnative=Външно свързване на акаунти може да се използва само когато е инсталиран оригиналният ACME клиент
letsencrypt_ewebroot=Директория с документи на уебсайта не съществува
letsencrypt_evhost=Не е намерено съвпадение на виртуален хост $1
letsencrypt_efull=Очакван пълен файл на сертификата $1 не бе намерен
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Неуспешно изтегляне на верижен с
letsencrypt_echain2=Верижният сертификат, изтеглен от $1, е празен
letsencrypt_ecsr=Неуспешно генериране на CSR : $1
letsencrypt_ekeygen=Неуспешно генериране на частен ключ : $1
letsencrypt_enative=Нативният клиент Let's Encrypt (certbot) беше използван преди това в тази система и трябва да се използва за всички бъдещи заявки за сертификати
letsencrypt_eacmedns=Само официалният клиент Let's Encrypt поддържа валидиране на DNS
letsencrypt_eacmecertbot=Само официалният клиент на Let's Encrypt поддържа проверка на Certbot
letsencrypt_enative=Нативният ACME клиент (certbot) е бил използван преди това на тази система и трябва да се използва за всички бъдещи заявки за сертификати
letsencrypt_eacmedns=Само вграденият ACME клиент поддържа DNS-базирана валидация
letsencrypt_eacmecertbot=Само вграденият ACME клиент поддържа валидиране от Certbot
announce_hide=Скриване на това съобщение
alert_hide=Скриване на предупреждение

View File

@@ -306,7 +306,6 @@ ssl_essl=Sembla que el mòdul Net::SSLeay de Perl no està instal·lat al sistem
ssl_cpan=Alternativament, pots fer que Webmin <a href='$1'>descarregui i instal·li</a> el mòdul Perl Net::SSLeay necessari per tu.
ssl_emessage=El missatge d'error de Perl ha estat: $1
ssl_desc1=Sembla que el host on s'està executant Webmin té instal·lat el mòdul Perl SSLeay. Utilitzant-lo, Webmin suporta comunicació xifrada SSL entre el teu navegador i el servidor. Si estàs accedint el servidor Webmin a través d'Internet, llavors hauries de pensar seriosament en utilitzar SSL per evitar que algun atacant capturi la teva contrasenya de Webmin.
ssl_desc2=Atenció - activa el suport SSL només si tens un navegador que suporti SSL, i no hi ha cap tallafoc que bloquegi peticions <b>https</b> entre el teu navegador i el host Webmin.
ssl_header=Suport SSL
ssl_on=Activa SSL
ssl_key=Fitxer de clau privada
@@ -375,7 +374,6 @@ ssl_tabcreate=Creació de Certificat Auto-signat
ssl_tabcsr=Petició de Signatura de Certificat
ssl_tabupload=Puja de Certificat
ssl_tabcurrent=Certificat Actual
ssl_tablets=Let's Encrypt
ssl_cheader=Detalls del certificat actual
ssl_typeself=Autosignat
ssl_typereal=Signat per CA
@@ -387,19 +385,12 @@ ssl_edownload=No s'han pogut extreure les dades PEM del certificat
ssl_csralready=Visualitza la clau i CSR més recent...
ssl_already1=Clau privada generada anteriorment:
ssl_already2=Petició de signatura de certificat generada anteriorment:
ssl_letsdesc=Let's Encrypt és una autoritat de certificats oberta, automatitzada i lliure que es pot utilitzar per a generar un certificat SSL per a Webmin.
ssl_letserr=Desgraciadament, no es pot utilitzar Let's Encrypt al teu sistema: $1.
ssl_letserr2=Comprova la pàgina de <a href='$1'>configuració del mòdul</a> per assegurar que estàs utilitzant el camí correcte de l'ordre <tt>letsencrypt</tt> o <tt>letsencrypt-auto</tt>.
ssl_letsdesc2=Aquesta pàgina es pot utilitzar per a demanar un nou certificat, que sobreescriurà qualsevol altre que estigui actualment configurat a Webmin. No obstant, el servei Let's Encrypt demana que la propietat del domini certificat sigui validada comprovant que aquests sistema allotja el lloc web del domini. Això es fa posant un petit fitxer temporal al directori de documents del lloc web.
ssl_letsheader=Opcions del nou certificat SSL
ssl_letsok=Demana el Certifica
ssl_letsonly=Només Actualitza la Renovació
ssl_usewebmin=Copia la nova clau i el nou certificat a Webmin
ssl_letsrenew=Mesos entre renovació automàtica
ssl_letsnotrenew=Només renovació automàtica
ssl_staging=Servidor Let's Encrypt
ssl_staging0=Real
ssl_staging1=Staging (només proves)
newkey_err=No s'ha pogut crear la clau SSL
newkey_ecn=Hi falta el nom del servidor o bé és invàlid
@@ -674,9 +665,6 @@ log_delete_webmincron=S'han suprimit $1 funcions planificades
log_run_webmincron=S'han executat $1 funcions planificades
log_save_webmincron=S'ha actualitzat la funció planificada al mòdul $1
log_onedelete_webmincron=S'ha suprimit la funció planificada del mòdul $1
log_letsencrypt=S'ha demanat un nou certificat SSL per part de Let's Encrypt
log_letsencryptdns=S'ha creat el registre DNS Let's Encrypt DNS de $1
log_letsencryptcleanup=S'ha eliminat el registre DNS Let's Encrypt de $1
themes_title=Temes Webmin
themes_desc=Temes controla l'aparença de la interfície d'usuari de Webmin, incloent-hi les icones, els colors, els fons i la disposició de les pàgines. La caixa de selecció de sota es pot utilitzar per triar un dels temes instal·lats al sistema.
@@ -1074,9 +1062,6 @@ twofactor_secret0=Utilitza una clau de 16 caràcters
twofactor_esecret=La clau secreta ha de tenir exactament 16 caràcters de llarg i ha de contenir només lletres i números
twofactor_esession=L'autenticació de dos factors no es pot utilitzar si l'autenticació basada en sessió no està activa
letsencrypt_title=Petició de Certificat Let's Encrypt
letsencrypt_err=No s'ha pogut demanar el certificat
letsencrypt_ecmds=No s'ha trobat al sistema l'ordre client de Let's Encrypt <tt>letsencrypt-auto</tt> ni l'ordre <tt>python</tt>
letsencrypt_epythonmod=El mòdul $1 de Python necessari per al client integrat de Let's Encrypt no està instal·lat
letsencrypt_epythonver=No s'ha pogut obtenir la versió de Python: $1
letsencrypt_epythonver2=Cal la versió de Python $1 o superior, però només tens la versió $2.
@@ -1104,6 +1089,5 @@ letsencrypt_echain=No s'ha pogut baixar el certificat encadenat: $1
letsencrypt_echain2=El certificat encadenat descarregat des de $1 està buit
letsencrypt_ecsr=No s'ha pogut generar la petició CSR: $1
letsencrypt_ekeygen=No s'ha pogut generar la clau privada: $1
letsencrypt_enative=S'ha utilitzat anteriorment el client nadiu de Let's Encrypt (certbot) en aquest sistema, i s'ha de seguir utilitzant per a totes les peticions futures de certificats
announce_hide=Amaga Aquest Anunci

View File

@@ -39,15 +39,33 @@ lang_dateformat_dd/mm/yyyy=dd/mm/aaaa (és a dir, 16/09/2001)
lang_dateformat_mm/dd/yyyy=mm/dd/aaaa (és a dir, 16/09/2001)
lang_dateformat_yyyy/mm/dd=aaaa/mm/dd (és a dir, 16/09/2001)
ssl_enforce=Aplicar SSL
ssl_hsts=Apliqueu SSL amb la capçalera HSTS
ssl_tablets=Proveïdor SSL
ssl_letsdesc=Aquest formulari us permet sol·licitar un certificat SSL de confiança per a Webmin d'un proveïdor compatible amb ACME com ara Let's Encrypt.
ssl_letserr=Malauradament, aquest sistema no pot sol·licitar certificats d'un proveïdor SSL: $1.
ssl_letserr2=Alternativament, consulteu la pàgina de <a href='$1'>configuració del mòdul</a> per assegurar-vos que esteu utilitzant la ruta correcta a l'ordre del client ACME configurat.
ssl_letsdesc2=El nou certificat substituirà el que està configurat actualment a Webmin. Abans que es pugui emetre, el proveïdor ACME ha de verificar el control de cada nom d'amfitrió mitjançant un fitxer temporal al directori de documents del lloc web o un registre TXT DNS temporal.
ssl_letsdoms=Noms d'amfitrió del certificat
ssl_subset=Voleu saltar noms d'amfitrió no verificables?
ssl_letsmode=Anem a xifrar el mètode de validació
ssl_letsmode=Mètode de validació de domini
ssl_letsmode0=L'amfitrió virtual d'Apache coincideix amb el nom d'amfitrió
ssl_letsmode1=Amfitrió virtual Apache seleccionat
ssl_letsmode2=Un altre directori de documents del servidor web
ssl_letsmode3=Validació DNS mitjançant BIND
ssl_letsmode4=Servidor web integrat Certbot
ssl_staging=servidor del proveïdor
ssl_staging0=Producció
ssl_staging1=Estadificació (només prova)
ssl_acmeopts=Configuració del proveïdor
ssl_acmeextra=Mostra la configuració avançada
ssl_acmedir=URL del directori ACME personalitzat
ssl_acmedirdesc=Si està definit, això substitueix el servidor proveïdor per defecte anterior.
ssl_acmekid=ID de clau de vinculació de compte extern
ssl_acmekiddesc=Opcional. Alguns proveïdors d'ACME requereixen això a més de l'URL del directori.
ssl_acmehmac=Clau HMAC de vinculació de compte extern
ssl_acmehmacdesc=Opcional. Requereix el client Certbot natiu quan s'utilitza.
upgrade_repo=La darrera versió del repositori $1
upgrade_setup=S'està executant l'script <tt>setup.sh</tt> per actualitzar Webmin ..
@@ -60,20 +78,20 @@ update_webmin=Actualització de webmin.com
session_blockhost=Bloqueja les IP del client amb més de $1 inicis de sessió fallits durant $2 segons.
session_utmp=Enregistrar els inicis de sessió i tancaments de sessió a <tt>utmp</tt>?
session_pmodedesc3=Política de caducitat de contrasenya
session_rpc_timeout=Temps d'espera de la sessió RPC
session_erpc_timeout=Falta el temps d'espera de la sessió RPC o ha de ser un número superior a 0
session_md5off=Determinar automàticament
session_md5on=Utilitzeu el format hashing <tt>MD5</tt>
session_sha512=Utilitzeu el format hashing <tt>SHA512</tt>
session_yescrypt=Utilitzeu el format hashing <tt>yescrypt</tt>
session_emd5mod=El format hashing MD5 no es pot utilitzar, ja que el mòdul Perl $1 no està instal·lat
session_esha512mod=El format hashing SHA512 no es pot utilitzar, ja que el mòdul Perl $1 no està instal·lat
session_eyescrypt=El format hashing yescrypt no es pot utilitzar, ja que el mòdul Perl $1 no està instal·lat
session_edigestcrypt=El format de resum $1 no es pot utilitzar perquè la funció <tt>crypt</tt> del sistema no l'admet
session_passapi=Voleu activar l'API de canvi de contrasenya remota?
session_passapi0=API desactivada
session_passapi1=API habilitada per als usuaris d'Unix
session_passurl=Quan està activat, les contrasenyes d'usuari es poden canviar mitjançant una sol·licitud POST a $1
session_forgot=Permetre la recuperació de la contrasenya oblidada?
session_eforgot=La recuperació de contrasenyes oblidades no es pot activar si no s'elimina primer el mòdul del complement <b>Virtualmin Password Recovery</b>. Això es pot fer a la pàgina <a href='$1'>Mòduls Webmin</a>.
session_passresetdesc=Limitació de recuperació de contrasenya
session_passreset=Bloqueja els clients amb més de $1 sol·licituds durant $2 minuts
session_epassreset_failures=Sol·licituds de bloqueig perdudes o no vàlides
@@ -82,6 +100,11 @@ session_passtimeout=L'enllaç de restabliment de contrasenya caduca en $1 minuts
session_epassreset_timeout=Temps d'espera per restablir la contrasenya no vàlida o que falta
log_fixrepo=S'ha solucionat el repositori Webmin
log_letsencrypt=He sol·licitat un nou certificat SSL a un proveïdor d'ACME
log_letsencryptdns=S'ha creat un registre DNS ACME per a $1
log_letsencryptcleanup=S'ha eliminat el registre DNS ACME per a $1
themes_configure=Obre la pàgina de configuració del tema
themes_ok=El tema s'ha canviat correctament redirigint-se ara. ..
themes_ok2=La superposició del tema s'ha canviat correctament, redirigint-se ara. ..
@@ -137,6 +160,7 @@ sendmail_port=Port SMTP
sendmail_ssl0=Mai xifreu
sendmail_ssl1=Utilitzeu sempre TLS
sendmail_ssl2=Canvieu amb STARTTLS
sendmail_name=Nom de visualització
sendmail_toaddr=Adreça de destinació predeterminada per a les notificacions
sendmail_to_def=Cap establert
sendmail_etoaddr=Falta l'adreça de destinació o amb un format incorrecte
@@ -158,12 +182,21 @@ web_redirssl=Redirigeix SSL
twofactor_totp=Autenticador TOTP
twofactor_qrcode=Introduïu el codi secret $1 a l'aplicació TOTP o escanegeu el codi QR a continuació.
twofactor_qrcode_manual=Introduïu el codi secret $1 a l'aplicació TOTP i configureu-lo manualment, ja que aquest sistema no admet la generació de codis QR.
twofactor_etotptoken=El testimoni TOTP ha de ser un número
letsencrypt_title=Sol·licitud de certificat de proveïdor SSL
letsencrypt_err=No s'ha pogut sol·licitar el certificat
letsencrypt_ecmds=No s'ha trobat ni l' <tt>certbot</tt> del client ACME natiu ni l'ordre <tt>python</tt> al sistema
letsencrypt_certbot=Certbot
letsencrypt_eacmedir=URL del directori ACME que falta o que és no vàlid
letsencrypt_eeabdir=Cal introduir una URL de directori ACME quan s'utilitza la vinculació de comptes externs
letsencrypt_eeabpair=Cal introduir tant l'ID de clau de vinculació de compte extern com la clau HMAC
letsencrypt_eeabnative=La vinculació de comptes externs només es pot utilitzar quan el client ACME natiu està instal·lat
letsencrypt_doingcertbot=Sol·licitant un certificat nou per a $1, utilitzant el servidor web Certbot ..
letsencrypt_eacmedns=Només el client Let's Encrypt oficial és compatible amb la validació basada en DNS
letsencrypt_eacmecertbot=Només el client oficial de Let's Encrypt admet la validació de Certbot
letsencrypt_enative=El client ACME natiu (certbot) s'ha utilitzat anteriorment en aquest sistema i s'ha d'utilitzar per a totes les futures sol·licituds de certificat
letsencrypt_eacmedns=Només el client ACME natiu admet la validació basada en DNS
letsencrypt_eacmecertbot=Només el client ACME natiu admet la validació de Certbot
alert_hide=Amaga l'alerta

View File

@@ -284,7 +284,6 @@ ssl_essl=Vypadá to, že modul Perlu Net::SSLeay není ve vašem systému nainst
ssl_cpan=Případně můžete Webmin <a href='$1'>nahrávat a instalovat</a> s požadavkem na využití modulu Perlu Net::SSLeay.
ssl_emessage=Chybová hláška z Perlu je : $1
ssl_desc1=Host, na kterém běží Webmin, umožňuje nainstalovat modul Perlu SSLe. Pokud toho využijete, Webmin umožní komunikací pomocí SSL kryptování mezi prohlížečem a serverem. Pokud přistupujete k serveru Webminu prostřednictvím Internetu, můžete použitím SSL zásadně vyřešit problém útoků prostřednictvím hesla ve Webminu.
ssl_desc2=POZOR - aktivace SSL je účinná pouze v případě, používáte-li prohlížeč, který podporuje SSL (jako Netscape nebo IE), a jestliže firewall neblokuje <b>https</b> požadavky mezi prohlížečem a hostem s Webminem.
ssl_header=SSL podpora
ssl_on=Zapnout SSL, je-li k dispozici?
ssl_key=Soubor s primárním klíčem

View File

@@ -65,6 +65,7 @@ lang_dateformat_yyyy/mm/dd=rrrr/mm/dd (tj. 2001/09/16)
ssl_deny=Verze protokolu SSL k odmítnutí
ssl_compression=Povolit komprimované připojení SSL?
ssl_honorcipherorder=Vynutit použití serveru definované šifrové objednávky?
ssl_enforce=Vynucení SSL
ssl_hsts=Vynutit SSL s hlavičkou HSTS
ssl_extracasdef=Stejné jako globální nastavení SSL
ssl_extracasnone=Žádné pro tuto IP adresu
@@ -86,19 +87,19 @@ ssl_privchain=Zřetězený text certifikátu
ssl_nochain=Žádný zřetězený certifikát
ssl_leavechain=Použijte existující zřetězený certifikát
ssl_tabcsr=Žádost o podpis certifikátu
ssl_tablets=Pojďme se zašifrovat
ssl_tablets=Poskytovatel SSL
ssl_csralready=Zobrazit poslední klíč a CSR ..
ssl_already1=Dříve generovaný soukromý klíč :
ssl_already2=Dříve vygenerovaná žádost o podpis certifikátu :
ssl_letsdesc=Pojďme šifrovat je bezplatná, automatizovaná a otevřená certifikační autorita, kterou lze použít k vygenerování certifikátu SSL pro použití serverem Webmin.
ssl_letserr=Bohužel, Pojďme se zašifrovat ve vašem systému nelze použít: $1.
ssl_letserr2=Alternativně zkontrolujte stránku <a href='$1'>konfigurace modulu</a> a ujistěte se, že používáte správnou cestu k příkazu <tt>letsencrypt</tt>.
ssl_letsdesc=Tento formulář vám umožňuje požádat o důvěryhodný SSL certifikát pro Webmin od poskytovatele kompatibilního s ACME, jako je Let's Encrypt.
ssl_letserr=Tento systém bohužel nemůže vyžádat certifikáty od poskytovatele SSL: $1.
ssl_letserr2=Případně zkontrolujte stránku <a href='$1'>konfigurace modulu</a> a ujistěte se, že používáte správnou cestu k nakonfigurovanému příkazu klienta ACME.
ssl_letsdesc2=Tuto stránku lze použít k vyžádání nového certifikátu, který přepíše všechny ostatní aktuálně nakonfigurované v systému Webmin. Služba Let's Encrypt však vyžaduje, aby bylo vaše vlastnictví domény certifikátů ověřeno kontrolou, zda tento systém hostuje web pro danou doménu. To se provádí umístěním malého dočasného souboru do adresáře dokumentů na webu.
ssl_letsdesc2=Nový certifikát nahradí certifikát aktuálně nakonfigurovaný ve Webminu. Před jeho vydáním musí poskytovatel ACME ověřit kontrolu nad každým názvem hostitele buď pomocí dočasného souboru v adresáři dokumentů webu, nebo dočasného TXT záznamu DNS.
ssl_letsheader=Možnosti nového certifikátu SSL
ssl_letsdoms=Názvy hostitelů pro certifikát
ssl_subset=Přeskočit neověřitelné názvy hostitelů?
ssl_letsmode=Ověřovací metoda Let's Encrypt
ssl_letsmode=Metoda ověření domény
ssl_letsmode0=Virtuální hostitel Apache odpovídá názvu hostitele
ssl_letsmode1=Vybraný virtuální hostitel Apache
ssl_letsmode2=Jiný adresář dokumentů webového serveru
@@ -109,9 +110,17 @@ ssl_letsonly=Jen aktualizujte obnovení
ssl_usewebmin=Kopírovat nový klíč a certifikát do Webmin?
ssl_letsrenew=Měsíce mezi automatickou obnovou
ssl_letsnotrenew=Obnovujte pouze ručně
ssl_staging=Pojďme šifrovat server
ssl_staging0=Nemovitý
ssl_staging=Server poskytovatele
ssl_staging0=Výroba
ssl_staging1=Staging (pouze test)
ssl_acmeopts=Nastavení poskytovatele
ssl_acmeextra=Zobrazit pokročilá nastavení
ssl_acmedir=Vlastní adresa URL adresáře ACME
ssl_acmedirdesc=Pokud je nastaveno, přepíše výše uvedený výchozí server poskytovatele.
ssl_acmekid=ID klíče pro vazbu externího účtu
ssl_acmekiddesc=Volitelné. Někteří poskytovatelé ACME toto vyžadují kromě adresáře URL.
ssl_acmehmac=Klíč HMAC pro vazbu externího účtu
ssl_acmehmacdesc=Volitelné. Při použití vyžaduje nativního klienta Certbot.
newkey_ecns=Nebyly zadány žádné názvy serverů
@@ -162,13 +171,14 @@ session_cmddef0=Změna hesel pomocí příkazu:
session_ecmd=Chybějící nebo neplatný příkaz ke změně hesla
session_banner=Pre-login banner
session_md5=Formát hashování hesla webmin
session_rpc_timeout=Časový limit relace RPC
session_erpc_timeout=Chybí časový limit relace RPC nebo musí být číslo větší než 0
session_md5off=Určit automaticky
session_md5on=Použijte formát hash <tt>MD5</tt>
session_sha512=Použijte formát hash <tt>SHA512</tt>
session_yescrypt=Použijte formát hash <tt>yescrypt</tt>
session_emd5mod=Formát hash MD5 nelze použít, protože není nainstalován modul Perl $1
session_esha512mod=Formát hash SHA512 nelze použít, protože není nainstalován modul Perl $1
session_eyescrypt=hashovací formát yescrypt nelze použít, protože není nainstalován modul Perl $1
session_edigestcrypt=Formát hashování $1 nelze použít, protože systémová funkce <tt>crypt</tt> jej nepodporuje
session_blocklock=Zamkněte také uživatele pomocí neúspěšných přihlášení
session_passapi=Povolit vzdálenou změnu hesla API?
session_passapi0=API deaktivováno
@@ -195,10 +205,11 @@ log_delete_webmincron=Smazáno $1 naplánované funkce
log_run_webmincron=Spustil naplánované funkce $1
log_save_webmincron=Aktualizovaná naplánovaná funkce v modulu $1
log_onedelete_webmincron=Odstraněná naplánovaná funkce v modulu $1
log_letsencrypt=Požadovaný nový certifikát SSL od Let's Encrypt
log_letsencryptdns=Vytvořeno Pojďme šifrovat záznam DNS pro $1
log_letsencryptcleanup=Odstraněn Pojďme šifrovat záznam DNS pro $1
log_letsencrypt=Požádán nový SSL certifikát od poskytovatele ACME
log_letsencryptdns=Vytvořen záznam ACME DNS pro $1
log_letsencryptcleanup=Odstraněn záznam ACME DNS pro $1
themes_configure=Otevřít stránku s konfigurací motivu
themes_none=Žádné - nechat se rozhodnout téma
themes_overdesc=Překryvy upravují vzhled motivu změnou barev, pozadí a ikon. Nemění rozvržení.
themes_overlay=Aktuální překrytí :
@@ -375,6 +386,7 @@ sendmail_authdef=Výchozí (aktuálně Cram-MD5)
sendmail_from=Z adresy pro e-mail od Webmin
sendmail_fromdef=Výchozí ($1)
sendmail_fromaddr=Adresa
sendmail_name=Zobrazovaný název
sendmail_toaddr=Výchozí cílová adresa pro oznámení
sendmail_to_def=Žádná nastavena
sendmail_etoaddr=Chybějící nebo nesprávně naformátovaná cílová adresa
@@ -476,6 +488,7 @@ twofactor_enrolllink=Nyní se můžete přihlásit k dvoufaktorové autentizaci
twofactor_url=Další informace o $1 naleznete na webových stránkách <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Modul Perl <tt>$1</tt> potřebný pro dvoufaktorovou autentizaci není nainstalován. Chcete-li ji nainstalovat, použijte <a href='$2'>Perl moduly</a> ve Webminu.
twofactor_qrcode=Zadejte tajný kód $1 v aplikaci TOTP nebo naskenujte QR kód níže.
twofactor_qrcode_manual=Zadejte tajný kód $1 do aplikace TOTP a nastavte jej ručně, protože tento systém nepodporuje generování QR kódů.
twofactor_etotpid=Neplatné tajné kódování TOTP base32
twofactor_etotptoken=TOTP token musí být číslo
twofactor_etotpmatch=Nesprávný kód OTP
@@ -485,9 +498,9 @@ twofactor_secret0=Použijte 16místný klíč
twofactor_esecret=Tajný klíč musí mít přesně 16 znaků a musí obsahovat pouze písmena a čísla
twofactor_esession=Dvoufaktorové ověřování nelze použít, pokud není aktivní ověřování založené na relacích
letsencrypt_title=Pojďme zašifrovat žádost o certifikát
letsencrypt_err=Nepodařilo se požádat o certifikát
letsencrypt_ecmds=Ve vašem systému nebyl nalezen příkaz Pojďme šifrovat klienta <tt>certbot</tt> ani příkaz <tt>python</tt>
letsencrypt_title=Žádost o certifikát poskytovatele SSL
letsencrypt_err=Nepodařilo se vyžádat si certifikát
letsencrypt_ecmds=Ve vašem systému nebyl nalezen ani nativní příkaz klienta ACME <tt>certbot</tt>, ani příkaz <tt>python</tt>
letsencrypt_epythonmod=Modul Python $1, který potřebuje vestavěný klient Let's Encrypt, není nainstalován
letsencrypt_epythonver=Nepodařilo se získat verzi Pythonu : $1
letsencrypt_epythonver2=Vyžaduje se verze Python $1 nebo vyšší, ale máte pouze verzi $2.
@@ -495,6 +508,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Virtuální hostitel Apache $1 nemá adresář dokumentů!
letsencrypt_edom=Chybí nebo je neplatný název domény
letsencrypt_erenew=Chybějící nebo nečíselný interval obnovy
letsencrypt_eacmedir=Chybějící nebo neplatná adresa URL adresáře ACME
letsencrypt_eeabdir=Při použití vazby externího účtu je nutné zadat URL adresáře ACME
letsencrypt_eeabpair=Je nutné zadat ID klíče pro vazbu externího účtu i klíč HMAC
letsencrypt_eeabnative=Vazbu externího účtu lze použít pouze tehdy, je-li nainstalován nativní klient ACME
letsencrypt_ewebroot=Adresář dokumentů webových stránek neexistuje
letsencrypt_evhost=Nebyl nalezen žádný virtuální hostitel odpovídající $1
letsencrypt_efull=Očekávaný úplný soubor certifikátů $1 nebyl nalezen
@@ -517,9 +534,9 @@ letsencrypt_echain=Nepodařilo se stáhnout zřetězený certifikát : $1
letsencrypt_echain2=Zřetězený certifikát stažený z $1 je prázdný
letsencrypt_ecsr=Nepodařilo se vygenerovat CSR : $1
letsencrypt_ekeygen=Generování soukromého klíče se nezdařilo : $1
letsencrypt_enative=V tomto systému byl dříve použit nativní klient Encrypt (certbot) a musí být použit pro všechny budoucí žádosti o certifikát
letsencrypt_eacmedns=Pouze oficiální klient Let's Encrypt podporuje ověření založené na DNS
letsencrypt_eacmecertbot=Ověření Certbot podporuje pouze oficiální klient Let's Encrypt
letsencrypt_enative=Nativní klient ACME (certbot) byl v tomto systému dříve používán a musí být použit pro všechny budoucí žádosti o certifikát
letsencrypt_eacmedns=Pouze nativní klient ACME podporuje ověřování založené na DNS
letsencrypt_eacmecertbot=Pouze nativní klient ACME podporuje validaci Certbotu
announce_hide=Skrýt toto oznámení
alert_hide=Skrýt upozornění

View File

@@ -340,7 +340,6 @@ ssl_essl=Net::SSLeay perl-modulet ser ikke ud til at være installeret på dit s
ssl_cpan=Alternativt kan du få Webmin <a href='$1'>til at downloade og installere</a> det krævede Net::SSLeay Perl-modul til dig.
ssl_emessage=Fejlmeddelelsen fra Perl var : $1
ssl_desc1=Værten, som Webmin kører på, ser ud til at have SSLeay Perl-modulet installeret. Ved hjælp af dette understøtter Webmin SSL-krypteret kommunikation mellem din browser og serveren. Hvis du får adgang til din Webmin-server over internettet, skal du bestemt overveje at bruge SSL til at forhindre, at en angriber fanger din Webmin-adgangskode.
ssl_desc2=Advarsel - tænd kun for SSL-support, hvis du har en browser, der understøtter SSL, og der ikke er nogen firewall, der blokerer <b>https</b> anmodninger mellem din browser og Webmin-værten.
ssl_header=SSL support
ssl_on=Aktivér SSL?
ssl_key=Privat nøglefil
@@ -351,6 +350,7 @@ ssl_deny=SSL-protokollversioner, der skal afvises
ssl_compression=Tillad komprimerede SSL-forbindelser?
ssl_honorcipherorder=Tvinge brug af serverdefineret chifferordre?
ssl_extracas=Yderligere certifikatfiler <br> (for kædede certifikater)
ssl_enforce=Håndhæv SSL
ssl_hsts=Håndhæv SSL med HSTS-header
ssl_redirect=Viderestille ikke-SSL-anmodninger til SSL-tilstand?
ssl_extracasdef=Samme som globale SSL-indstillinger
@@ -410,7 +410,7 @@ ssl_tabcreate=Selvunderskrevet certifikat
ssl_tabcsr=Anmodning om certifikatsignering
ssl_tabupload=Upload certifikat
ssl_tabcurrent=Aktuelt certifikat
ssl_tablets=Lad os kryptere
ssl_tablets=SSL-udbyder
ssl_cheader=Detaljer om det aktuelle certifikat
ssl_typeself=Selvsigneret
ssl_typereal=Signeret af CA
@@ -422,14 +422,14 @@ ssl_edownload=Kunne ikke udtrække PEM-data fra certifikatet
ssl_csralready=Se den nyeste nøgle og CSR ..
ssl_already1=Tidligere genereret privat nøgle :
ssl_already2=Tidligere genereret certifikatsigneringsanmodning :
ssl_letsdesc=Let's Encrypt er en gratis, automatiseret og åben certifikatmyndighed, der kan bruges til at generere et SSL-certifikat til brug af Webmin.
ssl_letserr=Desværre kan Let's Encrypt ikke bruges på dit system: $1.
ssl_letserr2=Kontroller alternativt siden <a href='$1'>modulkonfiguration</a> for at sikre, at du bruger den rigtige sti til kommandoen <tt>letsencrypt</tt>.
ssl_letsdesc2=Denne side kan bruges til at anmode om et nyt certifikat, som vil overskrive alle andre aktuelt konfigurerede i Webmin. Let's Encrypt-tjenesten kræver dog, at dit ejerskab af certifikatdomænet valideres ved at kontrollere, at dette system er vært for webstedet for domænet. Dette gøres ved at placere en lille midlertidig fil i webstedets dokumentmappe.
ssl_letsdesc=Denne formular giver dig mulighed for at anmode om et betroet SSL-certifikat til Webmin fra en ACME-kompatibel udbyder, såsom Let's Encrypt.
ssl_letserr=Desværre kan dette system ikke anmode om certifikater fra en SSL-udbyder: $1.
ssl_letserr2=Alternativt kan du tjekke siden <a href='$1'>modulkonfiguration</a> for at sikre, at du bruger den korrekte sti til den konfigurerede ACME-klientkommando.
ssl_letsdesc2=Det nye certifikat erstatter det, der i øjeblikket er konfigureret i Webmin. Før det kan udstedes, skal ACME-udbyderen verificere kontrollen over hvert værtsnavn ved hjælp af enten en midlertidig fil i webstedets dokumentmappe eller en midlertidig DNS TXT-post.
ssl_letsheader=Indstillinger for nyt SSL-certifikat
ssl_letsdoms=Værtsnavne til certifikat
ssl_subset=Vil du springe ikke-verificerbare værtsnavne over?
ssl_letsmode=Lad os kryptere valideringsmetoden
ssl_letsmode=Domænevalideringsmetode
ssl_letsmode0=Apache virtuel vært, der matcher værtsnavn
ssl_letsmode1=Valgt virtuel Apache-vært
ssl_letsmode2=Anden webserver dokumentmappe
@@ -440,9 +440,17 @@ ssl_letsonly=Bare opdater fornyelse
ssl_usewebmin=Kopiere ny nøgle og certifikat til Webmin?
ssl_letsrenew=Måneder mellem automatisk fornyelse
ssl_letsnotrenew=Forny kun manuelt
ssl_staging=Lad os kryptere server
ssl_staging0=Ægte
ssl_staging=Udbyderserver
ssl_staging0=Produktion
ssl_staging1=Iscenesættelse (kun test)
ssl_acmeopts=Udbyderindstillinger
ssl_acmeextra=Vis avancerede indstillinger
ssl_acmedir=Brugerdefineret ACME-mappe-URL
ssl_acmedirdesc=Hvis den er indstillet, tilsidesætter dette standardudbyderserveren ovenfor.
ssl_acmekid=Nøgle-ID for ekstern kontobinding
ssl_acmekiddesc=Valgfrit. Nogle ACME-udbydere kræver dette ud over katalog-URL'en.
ssl_acmehmac=Ekstern kontobinding HMAC-nøgle
ssl_acmehmacdesc=Valgfrit. Kræver den indbyggede Certbot-klient, når den bruges.
newkey_err=Kunne ikke oprette SSL-nøgle
newkey_ecn=Manglende eller ugyldigt servernavn
@@ -664,13 +672,14 @@ session_pmode0=Nægt altid brugere med udløbne adgangskoder
session_pmode1=Tillad altid brugere med udløbne adgangskoder
session_pmode2=Bed brugere med udløbne adgangskoder om at indtaste et nyt
session_md5=Webmin adgangskode hashing format
session_rpc_timeout=RPC-sessionstimeout
session_erpc_timeout=RPC-sessionstimeout mangler eller skal være et tal større end 0
session_md5off=Bestem automatisk
session_md5on=Brug <tt>MD5</tt> hashing-format
session_sha512=Brug <tt>SHA512</tt> hashing-format
session_yescrypt=Brug <tt>yescrypt</tt> hashing-format
session_emd5mod=MD5-hash-format kan ikke bruges, da Perl $1-modulet ikke er installeret
session_esha512mod=SHA512 hashing-format kan ikke bruges, da Perl $1-modulet ikke er installeret
session_eyescrypt=yescrypt hashing-format kan ikke bruges, da Perl $1-modulet ikke er installeret
session_edigestcrypt=Hashingformatet $1 kan ikke bruges, fordi systemets <tt>crypt</tt>-funktion ikke understøtter det
session_blocklock=Lås også brugere med mislykkede login
session_passapi=Vil du aktivere fjernadgangskode til ændring af adgangskode?
session_passapi0=API deaktiveret
@@ -746,13 +755,14 @@ log_delete_webmincron=Slet $1 planlagte funktioner
log_run_webmincron=Ran $1 planlagte funktioner
log_save_webmincron=Opdateret planlagt funktion i modul $1
log_onedelete_webmincron=Slet planlagt funktion i modul $1
log_letsencrypt=Anmodet om nyt SSL-certifikat fra Let's Encrypt
log_letsencryptdns=Oprettet Let's Encrypt DNS-post til $1
log_letsencryptcleanup=Fjernet Lad os kryptere DNS-post for $1
log_letsencrypt=Anmodede om nyt SSL-certifikat fra en ACME-udbyder
log_letsencryptdns=Oprettede ACME DNS-post for $1
log_letsencryptcleanup=Fjernede ACME DNS-post for $1
themes_title=Webmin-temaer
themes_desc=Temaer kontrollerer udseendet af Webmin-brugergrænsefladen, herunder ikoner, farver, baggrunde og layout af sider. Markeringsfeltet nedenfor kan bruges til at vælge et af de temaer, der er installeret på dit system.
themes_sel=Aktuelt tema :
themes_configure=Åbn temakonfigurationssiden
themes_default=Gamle Webmin-tema
themes_none=Ingen - lad temaet bestemme
themes_change=Lave om
@@ -1104,6 +1114,7 @@ sendmail_authdef=Standard (i øjeblikket Cram-MD5)
sendmail_from=Fra adresse til e-mail fra Webmin
sendmail_fromdef=Standard ($1)
sendmail_fromaddr=Adresse
sendmail_name=Vist navn
sendmail_toaddr=Standard destinationsadresse for meddelelser
sendmail_to_def=Ingen sæt
sendmail_etoaddr=Manglende eller forkert formateret destinationsadresse
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Du kan nu tilmelde dig tofaktorautentisering i <a href='$1'
twofactor_url=For at lære mere om $1, se dets websted på <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Perl-modulet <tt>$1</tt> nødvendigt til tofaktorautentisering er ikke installeret. Brug siden <a href='$2'>Perl Modules</a> i Webmin til at installere den.
twofactor_qrcode=Indtast den hemmelige kode $1 i TOTP-appen, eller scan QR-koden nedenfor.
twofactor_qrcode_manual=Indtast den hemmelige kode $1 i TOTP-appen, og opsæt den manuelt, da generering af QR-koder ikke understøttes på dette system.
twofactor_etotpid=Ugyldig TOTP base32-kodet hemmelighed
twofactor_etotptoken=TOTP-token skal være et tal
twofactor_etotpmatch=Forkert OTP-kode
@@ -1214,9 +1226,9 @@ twofactor_secret0=Brug en tast på 16 tegn
twofactor_esecret=Den hemmelige nøgle skal være nøjagtigt 16 tegn lang og kun indeholde bogstaver og tal
twofactor_esession=To-faktor-godkendelse kan ikke bruges, medmindre session-baseret godkendelse er aktiv
letsencrypt_title=Lad os kryptere certifikatanmodning
letsencrypt_title=Anmodning om SSL-udbydercertifikat
letsencrypt_err=Kunne ikke anmode om certifikat
letsencrypt_ecmds=Hverken kommandoen Let's Encrypt-klient <tt>certbot</tt> eller <tt>python</tt> blev fundet på dit system
letsencrypt_ecmds=Hverken den native ACME-klientkommando <tt>certbot</tt> eller <tt>python</tt> kommandoen blev fundet på dit system
letsencrypt_epythonmod=Python-modulet $1 nødvendigt af den indbyggede Let's Encrypt-klient er ikke installeret
letsencrypt_epythonver=Kunne ikke hente Python-versionen : $1
letsencrypt_epythonver2=Python version $1 eller derover er påkrævet, men du har kun version $2.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Den virtuelle Apache-vært $1 har intet dokumentmappe!
letsencrypt_edom=Manglende eller ugyldigt domænenavn
letsencrypt_erenew=Manglende eller ikke-numerisk fornyelsesinterval
letsencrypt_eacmedir=Manglende eller ugyldig ACME-mappe-URL
letsencrypt_eeabdir=En ACME-mappe-URL skal indtastes, når der bruges ekstern kontobinding
letsencrypt_eeabpair=Både nøgle-ID'et for den eksterne kontobinding og HMAC-nøglen skal indtastes
letsencrypt_eeabnative=Ekstern kontobinding kan kun bruges, når den native ACME-klient er installeret
letsencrypt_ewebroot=Webstedets dokumentmappe findes ikke
letsencrypt_evhost=Der blev ikke fundet nogen virtuel vært, der matchede $1
letsencrypt_efull=Forventet fuld certifikatfil $1 blev ikke fundet
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Kunne ikke hente kædet certifikat : $1
letsencrypt_echain2=Kædet certifikat downloadet fra $1 er tomt
letsencrypt_ecsr=Kunne ikke generere CSR : $1
letsencrypt_ekeygen=Kunne ikke generere privat nøgle : $1
letsencrypt_enative=Den oprindelige Let's Encrypt-klient (certbot) blev tidligere brugt på dette system og skal bruges til alle fremtidige certifikatanmodninger
letsencrypt_eacmedns=Kun den officielle Let's Encrypt-klient understøtter DNS-baseret validering
letsencrypt_eacmecertbot=Kun den officielle Let's Encrypt-klient understøtter Certbot-validering
letsencrypt_enative=Den native ACME-klient (certbot) blev tidligere brugt på dette system og skal bruges til alle fremtidige certifikatanmodninger
letsencrypt_eacmedns=Kun den native ACME-klient understøtter DNS-baseret validering
letsencrypt_eacmecertbot=Kun den native ACME-klient understøtter Certbot-validering
announce_hide=Skjul denne meddelelse
alert_hide=Skjul advarsel

View File

@@ -340,7 +340,6 @@ ssl_essl=Das Perl-Modul Net::SSLeay scheint auf Ihrem System nicht installiert z
ssl_cpan=Alternativ kann Webmin <a href='$1'>das erforderliche Perl-Modul Net::SSLeay herunterladen und installieren</a>.
ssl_emessage=Die Fehlermeldung von Perl lautete: $1
ssl_desc1=Auf dem System, auf dem Webmin ausgeführt wird, scheint das Perl-Modul SSLeay installiert zu sein. Damit kann Webmin SSL-verschlüsselte Kommunikation zwischen Ihrem Browser und dem Server ermöglichen. Wenn Sie auf Webmin über das Internet zugreifen, sollten Sie unbedingt SSL aktivieren, um zu verhindern, dass Angreifer Ihr Webmin-Passwort abfangen.
ssl_desc2=Warnung aktivieren Sie SSL nur, wenn Ihr Browser es unterstützt und keine Firewall <b>https</b>-Verbindungen zwischen Browser und Webmin-Host blockiert.
ssl_header=SSL-Unterstützung
ssl_on=SSL aktivieren?
ssl_key=Private Schlüsseldatei
@@ -410,7 +409,6 @@ ssl_tabcreate=Selbstsigniertes Zertifikat
ssl_tabcsr=Zertifikatsanfrage
ssl_tabupload=Zertifikat hochladen
ssl_tabcurrent=Aktuelles Zertifikat
ssl_tablets=Let's Encrypt
ssl_cheader=Details des aktuellen Zertifikats
ssl_typeself=Selbstsigniert
ssl_typereal=Von CA signiert
@@ -422,14 +420,9 @@ ssl_edownload=Extraktion der PEM-Daten aus dem Zertifikat fehlgeschlagen
ssl_csralready=Zuletzt erstellten Schlüssel und CSR anzeigen ..
ssl_already1=Zuvor erstellter privater Schlüssel:
ssl_already2=Zuvor erstellte Zertifikatsanfrage:
ssl_letsdesc=Let's Encrypt ist eine kostenlose, automatisierte und offene Zertifizierungsstelle, mit der ein SSL-Zertifikat für Webmin generiert werden kann.
ssl_letserr=Leider kann Let's Encrypt auf Ihrem System nicht verwendet werden: $1.
ssl_letserr2=Alternativ überprüfen Sie die Seite <a href='$1'>Modulkonfiguration</a>, um sicherzustellen, dass der Pfad zum Befehl <tt>letsencrypt</tt> korrekt ist.
ssl_letsdesc2=Auf dieser Seite kann ein neues Zertifikat angefordert werden, das alle aktuell in Webmin konfigurierten ersetzt. Der Dienst Let's Encrypt erfordert jedoch die Validierung der Inhaberschaft der Domain durch Nachweis, dass dieses System die Website für die Domain hostet. Dies erfolgt durch Platzierung einer kleinen temporären Datei im Dokumentenverzeichnis der Website.
ssl_letsheader=Optionen für neues SSL-Zertifikat
ssl_letsdoms=Hostnamen für das Zertifikat
ssl_subset=Nicht verifizierbare Hostnamen überspringen?
ssl_letsmode=Validierungsmethode von Let's Encrypt
ssl_letsmode0=Apache-virtueller Host, passend zum Hostnamen
ssl_letsmode1=Ausgewählter Apache-virtueller Host
ssl_letsmode2=Dokumentenverzeichnis eines anderen Webservers
@@ -440,9 +433,6 @@ ssl_letsonly=Nur Erneuerung aktualisieren
ssl_usewebmin=Neuen Schlüssel und Zertifikat nach Webmin kopieren?
ssl_letsrenew=Monate zwischen automatischer Erneuerung
ssl_letsnotrenew=Nur manuell erneuern
ssl_staging=Let's-Encrypt-Server
ssl_staging0=Echt
ssl_staging1=Staging (nur Test)
newkey_err=Erstellen des SSL-Schlüssels fehlgeschlagen
newkey_ecn=Fehlender oder ungültiger Servername
@@ -669,8 +659,6 @@ session_md5on=<tt>MD5</tt>-Hash-Format verwenden
session_sha512=<tt>SHA512</tt>-Hash-Format verwenden
session_yescrypt=<tt>yescrypt</tt>-Hash-Format verwenden
session_emd5mod=MD5-Hash-Format kann nicht verwendet werden, da Perl-Modul $1 nicht installiert ist
session_esha512mod=SHA512-Hash-Format kann nicht verwendet werden, da Perl-Modul $1 nicht installiert ist
session_eyescrypt=yescrypt-Hash-Format kann nicht verwendet werden, da Perl-Modul $1 nicht installiert ist
session_blocklock=Auch Benutzer mit fehlgeschlagenen Anmeldungen sperren
session_passapi=Remote-Passwortänderungs-API aktivieren?
session_passapi0=API deaktiviert
@@ -746,9 +734,6 @@ log_delete_webmincron=$1 geplante Funktionen gelöscht
log_run_webmincron=$1 geplante Funktionen ausgeführt
log_save_webmincron=Geplante Funktion im Modul $1 aktualisiert
log_onedelete_webmincron=Geplante Funktion im Modul $1 gelöscht
log_letsencrypt=Neues SSL-Zertifikat von Let's Encrypt angefordert
log_letsencryptdns=Let's-Encrypt-DNS-Eintrag für $1 erstellt
log_letsencryptcleanup=Let's-Encrypt-DNS-Eintrag für $1 entfernt
themes_title=Webmin-Designs
themes_desc=Designs steuern das Erscheinungsbild der Webmin-Oberfläche, einschließlich Symbole, Farben, Hintergründe und Seitenlayout. Mit dem Auswahlfeld unten können Sie eines der auf Ihrem System installierten Designs auswählen.
@@ -1214,9 +1199,6 @@ twofactor_secret0=16-stelligen Schlüssel verwenden
twofactor_esecret=Der geheime Schlüssel muss genau 16 Zeichen lang sein und darf nur Buchstaben und Zahlen enthalten
twofactor_esession=Zwei-Faktor-Authentifizierung kann nur verwendet werden, wenn die sitzungsbasierte Authentifizierung aktiv ist
letsencrypt_title=Let's Encrypt-Zertifikatsanforderung
letsencrypt_err=Zertifikatsanforderung fehlgeschlagen
letsencrypt_ecmds=Weder der Let's Encrypt-Befehl <tt>certbot</tt> noch der Befehl <tt>python</tt> wurde auf Ihrem System gefunden
letsencrypt_epythonmod=Das vom integrierten Let's Encrypt-Client benötigte Python-Modul $1 ist nicht installiert
letsencrypt_epythonver=Abfrage der Python-Version fehlgeschlagen: $1
letsencrypt_epythonver2=Python-Version $1 oder neuer wird benötigt, aber auf Ihrem System ist nur Version $2 vorhanden.
@@ -1246,9 +1228,6 @@ letsencrypt_echain=Herunterladen des verketteten Zertifikats fehlgeschlagen: $1
letsencrypt_echain2=Verkettetes Zertifikat von $1 ist leer
letsencrypt_ecsr=Erzeugen der CSR fehlgeschlagen: $1
letsencrypt_ekeygen=Erzeugen des privaten Schlüssels fehlgeschlagen: $1
letsencrypt_enative=Der native Let's Encrypt-Client (certbot) wurde zuvor auf diesem System verwendet und muss für alle zukünftigen Anfragen genutzt werden
letsencrypt_eacmedns=Nur der offizielle Let's Encrypt-Client unterstützt DNS-basierte Validierung
letsencrypt_eacmecertbot=Nur der offizielle Let's Encrypt-Client unterstützt Certbot-Validierung
announce_hide=Diese Ankündigung ausblenden
alert_hide=Benachrichtigung ausblenden

44
webmin/lang/de.auto Normal file
View File

@@ -0,0 +1,44 @@
ssl_enforce=SSL erzwingen
ssl_tablets=SSL-Anbieter
ssl_letsdesc=Mit diesem Formular können Sie ein vertrauenswürdiges SSL-Zertifikat für Webmin von einem ACME-kompatiblen Anbieter wie Let's Encrypt anfordern.
ssl_letserr=Leider kann dieses System keine Zertifikate von einem SSL-Anbieter anfordern: $1.
ssl_letserr2=Alternativ können Sie auf der <a href='$1'>Modulkonfigurationsseite</a> überprüfen, ob Sie den richtigen Pfad zum konfigurierten ACME-Clientbefehl verwenden.
ssl_letsdesc2=Das neue Zertifikat ersetzt das aktuell in Webmin konfigurierte. Bevor es ausgestellt werden kann, muss der ACME-Anbieter die Kontrolle über jeden Hostnamen entweder mithilfe einer temporären Datei im Dokumentenverzeichnis der Website oder eines temporären DNS-TXT-Eintrags überprüfen.
ssl_letsmode=Domänenvalidierungsmethode
ssl_staging=Provider-Server
ssl_staging0=Produktion
ssl_staging1=Staging (nur Test)
ssl_acmeopts=Anbietereinstellungen
ssl_acmeextra=Erweiterte Einstellungen anzeigen
ssl_acmedir=Benutzerdefinierte ACME-Verzeichnis-URL
ssl_acmedirdesc=Falls diese Option aktiviert ist, wird der oben genannte Standard-Provider-Server überschrieben.
ssl_acmekid=Schlüssel-ID für die externe Kontobindung
ssl_acmekiddesc=Optional. Einige ACME-Anbieter benötigen dies zusätzlich zur Verzeichnis-URL.
ssl_acmehmac=HMAC-Schlüssel für die externe Kontobindung
ssl_acmehmacdesc=Optional. Erfordert bei Verwendung den nativen Certbot-Client.
session_rpc_timeout=RPC-Sitzungstimeout
session_erpc_timeout=Das Timeout für die RPC-Sitzung fehlt oder muss eine Zahl größer als 0 sein
session_edigestcrypt=Das Hash-Format $1 kann nicht verwendet werden, da die Systemfunktion <tt>crypt</tt> es nicht unterstützt
log_letsencrypt=Neues SSL-Zertifikat von einem ACME-Anbieter angefordert
log_letsencryptdns=ACME-DNS-Eintrag für $1 erstellt
log_letsencryptcleanup=ACME-DNS-Eintrag für $1 entfernt
themes_configure=Theme-Konfigurationsseite öffnen
sendmail_name=Anzeigename
twofactor_qrcode_manual=Geben Sie den Geheimcode $1 in der TOTP-App ein und richten Sie ihn manuell ein, da die QR-Code-Generierung auf diesem System nicht unterstützt wird.
letsencrypt_title=SSL-Anbieterzertifikat anfordern
letsencrypt_err=Zertifikat konnte nicht angefordert werden
letsencrypt_ecmds=Weder der native ACME-Clientbefehl <tt>certbot</tt> noch der <tt>python</tt> -Befehl wurden auf Ihrem System gefunden
letsencrypt_eacmedir=Fehlende oder ungültige ACME-Verzeichnis-URL
letsencrypt_eeabdir=Bei Verwendung der externen Kontobindung muss eine ACME-Verzeichnis-URL eingegeben werden
letsencrypt_eeabpair=Sowohl die Schlüssel-ID für die externe Kontobindung als auch der HMAC-Schlüssel müssen eingegeben werden
letsencrypt_eeabnative=Die externe Kontobindung kann nur verwendet werden, wenn der native ACME-Client installiert ist
letsencrypt_enative=Der native ACME-Client (certbot) wurde zuvor auf diesem System verwendet und muss für alle zukünftigen Zertifikatsanforderungen verwendet werden
letsencrypt_eacmedns=Nur der native ACME-Client unterstützt die DNS-basierte Validierung
letsencrypt_eacmecertbot=Nur der native ACME-Client unterstützt die Certbot-Validierung

View File

@@ -340,7 +340,6 @@ ssl_essl=Η μονάδα Net::SSLeay perl δεν φαίνεται να είνα
ssl_cpan=Εναλλακτικά, μπορείτε να κάνετε <a href='$1'>Webmin</a> λήψη και εγκατάσταση </a> της απαιτούμενης μονάδας Net::SSLeay Perl για εσάς.
ssl_emessage=Το μήνυμα σφάλματος από το Perl ήταν : $1
ssl_desc1=Ο κεντρικός υπολογιστής στον οποίο εκτελείται το Webmin φαίνεται να έχει εγκαταστήσει τη μονάδα SSLEay Perl. Χρησιμοποιώντας αυτό το Webmin υποστηρίζει κρυπτογραφημένη επικοινωνία SSL μεταξύ του προγράμματος περιήγησης και του διακομιστή. Εάν έχετε πρόσβαση στο διακομιστή Webmin σας μέσω του Διαδικτύου, τότε σίγουρα θα πρέπει να εξετάσετε τη χρήση SSL για να αποτρέψετε έναν εισβολέα να καταγράψει τον κωδικό σας Webmin.
ssl_desc2=Προειδοποίηση - ενεργοποιήστε την υποστήριξη SSL μόνο εάν διαθέτετε πρόγραμμα περιήγησης που υποστηρίζει SSL και δεν υπάρχει κανένα τείχος προστασίας που να εμποδίζει αιτήσεις <b>https</b> μεταξύ του προγράμματος περιήγησης και του κεντρικού υπολογιστή Webmin.
ssl_header=Υποστήριξη SSL
ssl_on=Ενεργοποίηση SSL;
ssl_key=Αρχείο ιδιωτικού κλειδιού
@@ -351,6 +350,7 @@ ssl_deny=Εκδόσεις πρωτοκόλλου SSL για απόρριψη
ssl_compression=Να επιτρέπονται συμπιεσμένες συνδέσεις SSL;
ssl_honorcipherorder=Δυνατότητα χρήσης κρυπτογραφημένης εντολής από τον διακομιστή;
ssl_extracas=Πρόσθετα αρχεία πιστοποιητικών <br> (για αλυσιδωτά πιστοποιητικά)
ssl_enforce=Επιβολή SSL
ssl_hsts=Επιβολή SSL με κεφαλίδα HSTS
ssl_redirect=Εναλλαγή αιτήσεων SSL σε λειτουργία SSL;
ssl_extracasdef=Ίδια με τις ρυθμίσεις SSL σε παγκόσμιο επίπεδο
@@ -410,7 +410,7 @@ ssl_tabcreate=Πιστοποιητικό αυτοελέγχου
ssl_tabcsr=Αίτημα υπογραφής πιστοποιητικού
ssl_tabupload=Αποστολή πιστοποιητικού
ssl_tabcurrent=Τρέχον πιστοποιητικό
ssl_tablets=Ας κρυπτογραφήσουμε
ssl_tablets=Πάροχος SSL
ssl_cheader=Λεπτομέρειες σχετικά με το τρέχον πιστοποιητικό
ssl_typeself=Αυτο-υπογράφηκε
ssl_typereal=Υπογράφηκε από την CA
@@ -422,14 +422,14 @@ ssl_edownload=Αποτυχία εξαγωγής δεδομένων PEM από π
ssl_csralready=Δείτε το πιο πρόσφατο κλειδί και την ΕΚΕ ..
ssl_already1=Προσωρινά δημιουργημένο ιδιωτικό κλειδί :
ssl_already2=Προηγούμενο αίτημα υπογραφής πιστοποιητικού :
ssl_letsdesc=Το Let's Encrypt είναι μια ελεύθερη, αυτοματοποιημένη και ανοιχτή αρχή πιστοποιητικού που μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός πιστοποιητικού SSL για χρήση από το Webmin.
ssl_letserr=Δυστυχώς, η κρυπτογράφηση Let's δεν μπορεί να χρησιμοποιηθεί στο σύστημά σας: $1.
ssl_letserr2=Εναλλακτικά, ελέγξτε τη σελίδα <a href='$1'>διαμόρφωση μονάδας</a> για να βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή διαδρομή στην εντολή <tt>letsencrypt</tt>.
ssl_letsdesc2=Αυτή η σελίδα μπορεί να χρησιμοποιηθεί για να ζητήσει ένα νέο πιστοποιητικό, το οποίο θα αντικαταστήσει τυχόν άλλες που έχουν ρυθμιστεί στο Webmin. Ωστόσο, η υπηρεσία "Ας κρυπτογραφήσουμε" απαιτεί την επικύρωση της ιδιοκτησίας σας στον τομέα των πιστοποιητικών, ελέγχοντας ότι αυτό το σύστημα φιλοξενεί τον ιστότοπο για τον τομέα. Αυτό γίνεται τοποθετώντας ένα μικρό προσωρινό αρχείο στον κατάλογο εγγράφων του ιστότοπου.
ssl_letsdesc=Αυτή η φόρμα σάς επιτρέπει να ζητήσετε ένα αξιόπιστο πιστοποιητικό SSL για το Webmin από έναν πάροχο συμβατό με ACME, όπως το Let's Encrypt.
ssl_letserr=Δυστυχώς, αυτό το σύστημα δεν μπορεί να ζητήσει πιστοποιητικά από έναν πάροχο SSL: $1.
ssl_letserr2=Εναλλακτικά, ελέγξτε τη σελίδα <a href='$1'>ρύθμισης λειτουργικής μονάδας</a> για να βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή διαδρομή προς την διαμορφωμένη εντολή προγράμματος-πελάτη ACME.
ssl_letsdesc2=Το νέο πιστοποιητικό θα αντικαταστήσει αυτό που έχει ρυθμιστεί αυτήν τη στιγμή στο Webmin. Πριν από την έκδοσή του, ο πάροχος ACME πρέπει να επαληθεύσει τον έλεγχο κάθε ονόματος κεντρικού υπολογιστή χρησιμοποιώντας είτε ένα προσωρινό αρχείο στον κατάλογο εγγράφων του ιστότοπου είτε μια προσωρινή εγγραφή DNS TXT.
ssl_letsheader=Επιλογές για νέο πιστοποιητικό SSL
ssl_letsdoms=Ονόματα κεντρικών υπολογιστών για πιστοποιητικά
ssl_subset=Παράβλεψη μη επαληθεύσιμων ονομάτων κεντρικού υπολογιστή;
ssl_letsmode=Ας κρυπτογραφήσουμε τη μέθοδο επικύρωσης
ssl_letsmode=Μέθοδος επικύρωσης τομέα
ssl_letsmode0=Ο εικονικός κεντρικός υπολογιστής Apache ταιριάζει με το όνομα κεντρικού υπολογιστή
ssl_letsmode1=Επιλεγμένος εικονικός κεντρικός υπολογιστής Apache
ssl_letsmode2=Άλλος κατάλογος εγγράφων διακομιστή ιστού
@@ -440,9 +440,17 @@ ssl_letsonly=Απλά ανανεώστε την ανανέωση
ssl_usewebmin=Αντιγράψτε το νέο κλειδί και το πιστοποιητικό στο Webmin;
ssl_letsrenew=Μήνες μεταξύ αυτόματης ανανέωσης
ssl_letsnotrenew=Ανανεώνεται μόνο χειροκίνητα
ssl_staging=Ας κρυπτογραφήσουμε το διακομιστή
ssl_staging0=Πραγματικός
ssl_staging1=Στάδιο (μόνο για δοκιμή)
ssl_staging=Διακομιστής παρόχου
ssl_staging0=Παραγωγή
ssl_staging1=Σταδιοποίηση (μόνο δοκιμή)
ssl_acmeopts=Ρυθμίσεις παρόχου
ssl_acmeextra=Εμφάνιση σύνθετων ρυθμίσεων
ssl_acmedir=Προσαρμοσμένη διεύθυνση URL καταλόγου ACME
ssl_acmedirdesc=Εάν οριστεί, αυτό παρακάμπτει τον προεπιλεγμένο διακομιστή παρόχου παραπάνω.
ssl_acmekid=Αναγνωριστικό κλειδιού σύνδεσης εξωτερικού λογαριασμού
ssl_acmekiddesc=Προαιρετικό. Ορισμένοι πάροχοι ACME το απαιτούν αυτό επιπλέον της διεύθυνσης URL του καταλόγου.
ssl_acmehmac=Κλειδί HMAC σύνδεσης εξωτερικού λογαριασμού
ssl_acmehmacdesc=Προαιρετικό. Απαιτείται το εγγενές πρόγραμμα-πελάτη Certbot όταν χρησιμοποιείται.
newkey_err=Αποτυχία δημιουργίας κλειδιού SSL
newkey_ecn=Λείπει ή μη έγκυρο όνομα διακομιστή
@@ -664,13 +672,14 @@ session_pmode0=Πάντα να απορρίπτετε τους χρήστες μ
session_pmode1=Να επιτρέπεται πάντα στους χρήστες κωδικοί που έχουν λήξει
session_pmode2=Προτρέψτε τους χρήστες με κωδικούς που έχουν λήξει για να εισαγάγετε έναν νέο
session_md5=Webmin μορφή hashing κωδικό πρόσβασης
session_rpc_timeout=Χρονικό όριο συνεδρίας RPC
session_erpc_timeout=Λείπει το χρονικό όριο της περιόδου λειτουργίας RPC ή πρέπει να είναι αριθμός μεγαλύτερος από 0
session_md5off=Προσδιορίστε αυτόματα
session_md5on=Χρησιμοποιήστε τη μορφή κατακερματισμού <tt>MD5</tt>
session_sha512=Χρησιμοποιήστε τη μορφή κατακερματισμού <tt>SHA512</tt>
session_yescrypt=Χρησιμοποιήστε τη μορφή κατακερματισμού <tt>yescrypt</tt>
session_emd5mod=Η μορφή κατακερματισμού MD5 δεν μπορεί να χρησιμοποιηθεί, καθώς η μονάδα Perl $1 δεν είναι εγκατεστημένη
session_esha512mod=Η μορφή κατακερματισμού SHA512 δεν μπορεί να χρησιμοποιηθεί, καθώς η μονάδα Perl $1 δεν είναι εγκατεστημένη
session_eyescrypt=Η μορφή κατακερματισμού yescrypt δεν μπορεί να χρησιμοποιηθεί, καθώς η μονάδα Perl $1 δεν είναι εγκατεστημένη
session_edigestcrypt=Η μορφή κατακερματισμού $1 δεν μπορεί να χρησιμοποιηθεί, επειδή η συνάρτηση <tt>crypt</tt> του συστήματος δεν την υποστηρίζει
session_blocklock=Επίσης, κλειδώστε τους χρήστες με αποτυχημένες συνδέσεις
session_passapi=Ενεργοποίηση απομακρυσμένου API αλλαγής κωδικού πρόσβασης;
session_passapi0=Απενεργοποιημένο το API
@@ -746,13 +755,14 @@ log_delete_webmincron=Διαγραμμένες προγραμματισμένε
log_run_webmincron=Ran $1 προγραμματισμένες λειτουργίες
log_save_webmincron=Ενημερώθηκε προγραμματισμένη λειτουργία στην ενότητα $1
log_onedelete_webmincron=Διαγραμμένη προγραμματισμένη λειτουργία στην ενότητα $1
log_letsencrypt=Ζητήθηκε νέο πιστοποιητικό SSL από το Let's Encrypt
log_letsencryptdns=Δημιουργήθηκε Ας κρυπτογραφήσουμε την εγγραφή DNS για $1
log_letsencryptcleanup=Καταργήθηκε Να κρυπτογραφήσουμε την εγγραφή DNS για $1
log_letsencrypt=Αίτημα νέου πιστοποιητικού SSL από πάροχο ACME
log_letsencryptdns=Δημιουργήθηκεεγγραφή ACME DNS για το $1
log_letsencryptcleanup=Αφαιρέθηκε η εγγραφή ACME DNS για το $1
themes_title=Webmin Θέματα
themes_desc=Τα θέματα ελέγχουν την εμφάνιση του διεπαφή χρήστη Webmin, συμπεριλαμβανομένων των εικονιδίων, των χρωμάτων, των φόνων και της διάταξης των σελίδων. Το παρακάτω πλαίσιο επιλογής μπορεί να χρησιμοποιηθεί για να επιλέξετε ένα από τα θέματα που είναι εγκατεστημένα στο σύστημά σας.
themes_sel=Τρέχον θέμα :
themes_configure=Άνοιγμα σελίδας διαμόρφωσης θέματος
themes_default=Παλιό θέμα Webmin
themes_none=Κανένα - αφήστε το θέμα να αποφασίσει
themes_change=Αλλαγή
@@ -1104,6 +1114,7 @@ sendmail_authdef=Προεπιλογή (προς το παρόν Cram-MD5)
sendmail_from=Από τη διεύθυνση ηλεκτρονικού ταχυδρομείου από το Webmin
sendmail_fromdef=Προεπιλογή ($1)
sendmail_fromaddr=Διεύθυνση
sendmail_name=Εμφανιζόμενο όνομα
sendmail_toaddr=Προεπιλεγμένη διεύθυνση προορισμού για ειδοποιήσεις
sendmail_to_def=Κανένα σετ
sendmail_etoaddr=Λείπει ή έχει μορφοποιηθεί εσφαλμένα η διεύθυνση προορισμού
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Τώρα μπορείτε να εγγραφείτε για
twofactor_url=Για να μάθετε περισσότερα σχετικά με το $1, ανατρέξτε στον ιστότοπό του στο <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Δεν απαιτείται η υπομονάδα Perl <tt>$1</tt> που απαιτείται για τον έλεγχο ταυτότητας δύο παραγόντων. Χρησιμοποιήστε τη σελίδα <a href='$2'>Perl Modules</a> στο Webmin για να την εγκαταστήσετε.
twofactor_qrcode=Εισαγάγετε τον μυστικό κωδικό $1 στην εφαρμογή TOTP ή σαρώστε τον κωδικό QR παρακάτω.
twofactor_qrcode_manual=Εισαγάγετε τον μυστικό κωδικό $1 στην εφαρμογή TOTP και ρυθμίστε τον χειροκίνητα, καθώς η δημιουργία κωδικού QR δεν υποστηρίζεται σε αυτό το σύστημα.
twofactor_etotpid=Μη έγκυρο μυστικό κωδικοποίησης βασικής βάσης 32 TOTP
twofactor_etotptoken=Το διακριτικό TOTP πρέπει να είναι αριθμός
twofactor_etotpmatch=Λανθασμένος κώδικας OTP
@@ -1214,9 +1226,9 @@ twofactor_secret0=Χρησιμοποιήστε το πλήκτρο 16 χαρακ
twofactor_esecret=Το μυστικό κλειδί πρέπει να έχει μήκος 16 χαρακτήρων και να περιέχει μόνο γράμματα και αριθμούς
twofactor_esession=Ο έλεγχος ταυτότητας δύο παραγόντων δεν μπορεί να χρησιμοποιηθεί εκτός εάν είναι ενεργός ο έλεγχος ταυτότητας βάσει περιόδου σύνδεσης
letsencrypt_title=Ας κρυπτογραφήσουμε το αίτημα πιστοποιητικού
letsencrypt_err=Αποτυχία αίτησης πιστοποιητικού
letsencrypt_ecmds=Δεν βρέθηκε στο σύστημα σας η εντολή Κρυπτογράφηση αιτήματος του πελάτη <tt>certbot</tt> ή η εντολή <tt>python</tt>
letsencrypt_title=Αίτημα Πιστοποιητικού Παρόχου SSL
letsencrypt_err=Αποτυχία αιτήματος πιστοποιητικού
letsencrypt_ecmds=Ούτε η εγγενής <tt>certbot</tt> του προγράμματος-πελάτη ACME ούτε η εντολή <tt>python</tt> βρέθηκαν στο σύστημά σας
letsencrypt_epythonmod=Η μονάδα Python $1 που απαιτείται από το ενσωματωμένο πρόγραμμα κρυπτογράφησης Let's δεν έχει εγκατασταθεί
letsencrypt_epythonver=Αποτυχία λήψης της έκδοσης Python : $1
letsencrypt_epythonver2=Η έκδοση Python $1 ή παραπάνω είναι απαραίτητη, αλλά έχετε μόνο την έκδοση $2.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Ο εικονικός κεντρικός υπολογιστής Apache $1 δεν έχει κατάλογο εγγράφων!
letsencrypt_edom=Λείπει ή μη έγκυρο όνομα τομέα
letsencrypt_erenew=Λείπει ή μη αριθμητικό διάστημα ανανέωσης
letsencrypt_eacmedir=Λείπει ή δεν είναι έγκυρη η διεύθυνση URL του καταλόγου ACME
letsencrypt_eeabdir=Πρέπει να εισαχθεί μια διεύθυνση URL καταλόγου ACME κατά τη χρήση της σύνδεσης εξωτερικού λογαριασμού
letsencrypt_eeabpair=Πρέπει να εισαχθεί τόσο το αναγνωριστικό κλειδιού σύνδεσης εξωτερικού λογαριασμού όσο και το κλειδί HMAC
letsencrypt_eeabnative=Η σύνδεση εξωτερικού λογαριασμού μπορεί να χρησιμοποιηθεί μόνο όταν είναι εγκατεστημένο το εγγενές πρόγραμμα-πελάτης ACME
letsencrypt_ewebroot=Ο κατάλογος εγγράφων για τον ιστότοπο δεν υπάρχει
letsencrypt_evhost=Δεν βρέθηκε εικονικός κεντρικός υπολογιστής που να ταιριάζει $1
letsencrypt_efull=Το αναμενόμενο αρχείο πλήρους πιστοποιητικού $1 δεν βρέθηκε
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Αποτυχία λήψης του αλυσιδωτού πι
letsencrypt_echain2=Το αλυσιδωτό πιστοποιητικό που λήφθηκε από το $1 είναι κενό
letsencrypt_ecsr=Αποτυχία δημιουργίας CSR : $1
letsencrypt_ekeygen=Αποτυχία δημιουργίας ιδιωτικού κλειδιού : $1
letsencrypt_enative=Ο εγγεγραμμένος χρήστης Let's Encrypt (certbot) χρησιμοποιήθηκε στο παρελθόν σε αυτό το σύστημα και πρέπει να χρησιμοποιηθεί για όλα τα μελλοντικά αιτήματα πιστοποιητικών
letsencrypt_eacmedns=Μόνο ο επίσημος πελάτης Let's Encrypt υποστηρίζει επικύρωση βάσει DNS
letsencrypt_eacmecertbot=Μόνο ο επίσημος πελάτης Let's Encrypt υποστηρίζει την επικύρωση Certbot
letsencrypt_enative=Ο εγγενής υπολογιστής-πελάτης ACME (certbot) χρησιμοποιήθηκε προηγουμένως σε αυτό το σύστημα και πρέπει να χρησιμοποιείται για όλα τα μελλοντικά αιτήματα πιστοποιητικών
letsencrypt_eacmedns=Μόνο ο εγγενής πελάτης ACME υποστηρίζει επικύρωση που βασίζεται σε DNS
letsencrypt_eacmecertbot=Μόνο ο εγγενής πελάτης ACME υποστηρίζει την επικύρωση Certbot
announce_hide=Απόκρυψη της Ανακοίνωσης
alert_hide=Απόκρυψη ειδοποίησης

View File

@@ -410,7 +410,7 @@ ssl_tabcreate=Self-Signed Certificate
ssl_tabcsr=Certificate Signing Request
ssl_tabupload=Upload Certificate
ssl_tabcurrent=Current Certificate
ssl_tablets=Let's Encrypt
ssl_tablets=SSL Provider
ssl_cheader=Details of current certificate
ssl_typeself=Self-signed
ssl_typereal=Signed by CA
@@ -422,27 +422,36 @@ ssl_edownload=Failed to extract PEM data from certificate
ssl_csralready=View most recent key and CSR ..
ssl_already1=Previously generated private key :
ssl_already2=Previously generated certificate signing request :
ssl_letsdesc=Let's Encrypt is a free, automated, and open certificate authority that can be used to generate an SSL certificate for use by Webmin.
ssl_letserr=Unfortunately, Let's Encrypt cannot be used on your system : $1.
ssl_letserr2=Alternately, check the <a href='$1'>module configuration</a> page to ensure you are using the correct path to the <tt>letsencrypt</tt> command.
ssl_letsdesc2=This page can be used to request a new certificate, which will overwrite any other currently have configured in Webmin. However, the Let's Encrypt service requires that your ownership of the certificate domain be validated by checking that this system hosts the website for the domain. This is done by placing a small temporary file in the website's document directory.
ssl_letsheader=Options for new SSL certificate
ssl_letsdesc=This form lets you request a trusted SSL certificate for Webmin from an ACME-compatible provider such as Let's Encrypt.
ssl_letserr=Unfortunately, this system cannot request certificates from an SSL provider : $1.
ssl_letserr2=Alternately, check the <a href='$1'>module configuration</a> page to ensure you are using the correct path to the configured ACME client command.
ssl_letsdesc2=The new certificate will replace the one currently configured in Webmin. Before it can be issued, the ACME provider must verify control of each hostname using either a temporary file in the website's document directory or a temporary DNS TXT record.
ssl_letsheader=Certificate request options
ssl_letsdoms=Hostnames for certificate
ssl_subset=Skip unverifiable hostnames?
ssl_letsmode=Let's Encrypt validation method
ssl_letsmode=Domain validation method
ssl_letsmode0=Apache virtual host matching hostname
ssl_letsmode1=Selected Apache virtual host
ssl_letsmode2=Other webserver document directory
ssl_letsmode3=DNS validation using BIND
ssl_letsmode4=Certbot built-in webserver
ssl_certbotprehook=Nevertheless, this warning can be ignored if the pre-request command stops the service using port 80 before Certbot runs.
ssl_letsok=Request Certificate
ssl_letsonly=Just Update Renewal
ssl_usewebmin=Copy new key and certificate to Webmin?
ssl_letsrenew=Months between automatic renewal
ssl_letsnotrenew=Only renew manually
ssl_staging=Let's Encrypt server
ssl_staging0=Real
ssl_staging=Provider server
ssl_staging0=Production
ssl_staging1=Staging (test only)
ssl_acmeopts=Provider settings
ssl_acmeextra=Show advanced settings
ssl_acmedir=Custom ACME directory URL
ssl_acmedirdesc=If set, this overrides the default provider server above.
ssl_acmekid=External Account Binding key ID
ssl_acmekiddesc=Optional. Some ACME providers require this in addition to the directory URL.
ssl_acmehmac=External Account Binding HMAC key
ssl_acmehmacdesc=Optional. Requires the native Certbot client when used.
newkey_err=Failed to create SSL key
newkey_ecn=Missing or invalid server name
@@ -671,8 +680,7 @@ session_md5on=Use <tt>MD5</tt> hashing format
session_sha512=Use <tt>SHA512</tt> hashing format
session_yescrypt=Use <tt>yescrypt</tt> hashing format
session_emd5mod=MD5 hashing format cannot be used, as Perl $1 module is not installed
session_esha512mod=SHA512 hashing format cannot be used, as Perl $1 module is not installed
session_eyescrypt=yescrypt hashing format cannot be used, as Perl $1 module is not installed
session_edigestcrypt=$1 hashing format cannot be used, because the system <tt>crypt</tt> function does not support it
session_blocklock=Also lock users with failed logins
session_passapi=Enable remote password change API?
session_passapi0=API disabled
@@ -748,9 +756,9 @@ log_delete_webmincron=Deleted $1 scheduled functions
log_run_webmincron=Ran $1 scheduled functions
log_save_webmincron=Updated scheduled function in module $1
log_onedelete_webmincron=Deleted scheduled function in module $1
log_letsencrypt=Requested new SSL certificate from Let's Encrypt
log_letsencryptdns=Created Let's Encrypt DNS record for $1
log_letsencryptcleanup=Removed Let's Encrypt DNS record for $1
log_letsencrypt=Requested new SSL certificate from an ACME provider
log_letsencryptdns=Created ACME DNS record for $1
log_letsencryptcleanup=Removed ACME DNS record for $1
themes_title=Webmin Themes
themes_desc=Themes control the appearance of the Webmin user interface, including icons, colours, backgrounds and the layout of pages. The selection box below can be used to choose one of the themes installed on your system.
@@ -1219,16 +1227,22 @@ twofactor_secret0=Use 16-character key
twofactor_esecret=Secret key must be exactly 16 characters long and contain only letters and numbers
twofactor_esession=Two-factor authentication cannot be used unless session-based authentication is active
letsencrypt_title=Let's Encrypt Certificate Request
letsencrypt_title=SSL Provider Certificate Request
letsencrypt_err=Failed to request certificate
letsencrypt_ecmds=Neither the Let's Encrypt client command <tt>certbot</tt> or the <tt>python</tt> command were found on your system
letsencrypt_epythonmod=The Python module $1 needed by the built-in Let's Encrypt client is not installed
letsencrypt_ecmds=Neither the native ACME client command <tt>certbot</tt> nor the <tt>python</tt> command were found on your system
letsencrypt_epythonmod=The Python module $1 needed by the built-in ACME client is not installed
letsencrypt_epythonver=Failed to get the Python version : $1
letsencrypt_epythonver2=Python version $1 or above is required, but you only have version $2.
letsencrypt_certbot=Certbot
letsencrypt_edroot=The Apache virtual host $1 has no document directory!
letsencrypt_edom=Missing or invalid domain name
letsencrypt_erenew=Missing or non-numeric renewal interval
letsencrypt_eacmedir=Missing or invalid ACME directory URL
letsencrypt_eeabdir=An ACME directory URL must be entered when using External Account Binding
letsencrypt_eeabpair=Both the External Account Binding key ID and HMAC key must be entered
letsencrypt_eeabnative=External Account Binding can only be used when the native ACME client is installed
letsencrypt_ecertbotport=Certbot validation requires TCP port 80 to be free, but it is already in use by another service. Stop that service temporarily, or use webroot or DNS validation instead.
letsencrypt_ecertbotwebmin=Certbot validation cannot be used while Webmin is listening on TCP port 80. Use webroot or DNS validation instead, or move Webmin to another port.
letsencrypt_ewebroot=Website document directory does not exist
letsencrypt_evhost=No virtual host matching $1 was found
letsencrypt_efull=Expected full certificate file $1 was not found
@@ -1251,9 +1265,9 @@ letsencrypt_echain=Failed to download chained certificate : $1
letsencrypt_echain2=Chained certificate downloaded from $1 is empty
letsencrypt_ecsr=Failed to generate CSR : $1
letsencrypt_ekeygen=Failed to generate private key : $1
letsencrypt_enative=The native Let's Encrypt client (certbot) was used previously on this system, and must be used for all future certificate requests
letsencrypt_eacmedns=Only the official Let's Encrypt client supports DNS-based validation
letsencrypt_eacmecertbot=Only the official Let's Encrypt client supports Certbot validation
letsencrypt_enative=The native ACME client (certbot) was used previously on this system, and must be used for all future certificate requests
letsencrypt_eacmedns=Only the native ACME client supports DNS-based validation
letsencrypt_eacmecertbot=Only the native ACME client supports Certbot validation
announce_hide=Hide This Announcement
alert_hide=Hide Alert

View File

@@ -228,7 +228,6 @@ ssl_essl=El módulo de perl The Net::SSLeay parece no estar instalado en su sist
ssl_cpan=Como alternativa, puede hacer que Webmin <a href='$1'>descarge e instale</a> el módulo Perl necesario Net::SSLeay
ssl_emessage=El mensaje de error de Perl fue : $1
ssl_desc1=La máquina en que Webmin se está ejecutando parece tener el módulo SSLeay de Perl instalado. Usándolo, Webmin soporta comunicaciones SSL encriptadas entre el navegador y el servidor. Si está accediendo a su servidor Webmin a través de Internet, debe de considerar de manera definitiva el utilizar SSL para prevenir que cualquiera capture su clave de acceso a Webmin.
ssl_desc2=Aviso - active el soporte SSL sólo si tiene un navegador que lo soporte a su vez (como p.ej. Netscape o IE), y no tiene un cortafuegos bloqueando las peticiones <b>https</b> entre su navegador y la máquina de Webmin
ssl_header=Soporte SSL
ssl_on=¿Habilitar SSL si está disponible?
ssl_key=Archivo de clave privada

View File

@@ -122,6 +122,7 @@ lang_dateformat_yyyy/mm/dd=aaaa/mm/dd (es decir, 2001/09/16)
ssl_deny=Versiones de protocolo SSL para rechazar
ssl_compression=¿Permitir conexiones SSL comprimidas?
ssl_honorcipherorder=¿Forzar el uso del orden de cifrado definido por el servidor?
ssl_enforce=Aplicar SSL
ssl_hsts=Hacer cumplir SSL con el encabezado HSTS
ssl_extracasdef=Igual que la configuración global de SSL
ssl_extracasnone=Ninguno para esta dirección IP
@@ -156,7 +157,7 @@ ssl_tabcreate=Certificado autofirmado
ssl_tabcsr=Solicitud de firma de certificado
ssl_tabupload=Subir certificado
ssl_tabcurrent=Certificado Actual
ssl_tablets=Encriptemos
ssl_tablets=Proveedor de SSL
ssl_cheader=Detalles del certificado actual
ssl_typeself=Autofirmado
ssl_typereal=Firmado por CA
@@ -168,15 +169,15 @@ ssl_edownload=Error al extraer datos de PEM del certificado
ssl_csralready=Ver clave más reciente y CSR ..
ssl_already1=Clave privada generada previamente :
ssl_already2=Solicitud de firma de certificado generada previamente :
ssl_letsdesc=Let's Encrypt es una autoridad de certificación gratuita, automatizada y abierta que se puede usar para generar un certificado SSL para uso de Webmin.
ssl_letserr=Desafortunadamente, Let's Encrypt no se puede usar en su sistema: $1.
ssl_letserr2=Alternativamente, revise la página de <a href='$1'>configuración del módulo</a> para asegurarse de que está utilizando la ruta correcta al comando <tt>letsencrypt</tt>.
ssl_letsdesc=Este formulario le permite solicitar un certificado SSL de confianza para Webmin a un proveedor compatible con ACME, como Let's Encrypt.
ssl_letserr=Lamentablemente, este sistema no puede solicitar certificados a un proveedor SSL: $1.
ssl_letserr2=Alternativamente, compruebe la página <a href='$1'>configuración del módulo</a> para asegurarse de que está utilizando la ruta correcta al comando de cliente ACME configurado.
ssl_letsdesc2=Esta página se puede usar para solicitar un nuevo certificado, que sobrescribirá cualquier otro que haya configurado actualmente en Webmin. Sin embargo, el servicio Let's Encrypt requiere que su propiedad del dominio del certificado sea validada verificando que este sistema aloje el sitio web para el dominio. Esto se hace colocando un pequeño archivo temporal en el directorio de documentos del sitio web.
ssl_letsdesc2=El nuevo certificado sustituirá al que está configurado actualmente en Webmin. Antes de su emisión, el proveedor ACME debe verificar el control de cada nombre de host mediante un archivo temporal en el directorio de documentos del sitio web o un registro DNS TXT temporal.
ssl_letsheader=Opciones para el nuevo certificado SSL
ssl_letsdoms=Nombres de host para el certificado
ssl_subset=¿Omitir nombres de host no verificables?
ssl_letsmode=Método de validación Let's Encrypt
ssl_letsmode=Método de validación de dominio
ssl_letsmode0=Host virtual Apache que coincide con el nombre de host
ssl_letsmode1=Host virtual Apache seleccionado
ssl_letsmode2=Otro directorio de documentos del servidor web
@@ -187,9 +188,17 @@ ssl_letsonly=Solo actualiza la renovación
ssl_usewebmin=Copiar nueva clave y certificado a Webmin?
ssl_letsrenew=Meses entre renovación automática
ssl_letsnotrenew=Solo renueve manualmente
ssl_staging=Encriptemos el servidor
ssl_staging0=Real
ssl_staging1=Estadificación (solo prueba)
ssl_staging=Servidor del proveedor
ssl_staging0=Producción
ssl_staging1=Etapas (solo prueba)
ssl_acmeopts=Configuración del proveedor
ssl_acmeextra=Mostrar configuración avanzada
ssl_acmedir=URL de directorio ACME personalizada
ssl_acmedirdesc=Si se configura, esta opción anula el servidor proveedor predeterminado mencionado anteriormente.
ssl_acmekid=ID de clave de enlace de cuenta externa
ssl_acmekiddesc=Opcional. Algunos proveedores de ACME requieren esto además de la URL del directorio.
ssl_acmehmac=Clave HMAC de vinculación de cuenta externa
ssl_acmehmacdesc=Opcional. Requiere el cliente nativo de Certbot para su uso.
newkey_ecns=No se ingresaron nombres de servidores
newkey_ecountry=El código del país debe tener dos letras
@@ -260,13 +269,14 @@ session_ecmd=Comando de cambio de contraseña faltante o no válido
session_banner=Banner previo al inicio de sesión
session_pmodedesc3=Política de caducidad de contraseña
session_md5=Formato de hash de contraseña de Webmin
session_rpc_timeout=Tiempo de espera de la sesión RPC
session_erpc_timeout=Falta el tiempo de espera de la sesión RPC o debe ser un número mayor que 0
session_md5off=Determinar automáticamente
session_md5on=Utilice el formato hash <tt>MD5</tt>
session_sha512=Utilice el formato hash <tt>SHA512</tt>
session_yescrypt=Utilice el formato hash <tt>yescrypt</tt>
session_emd5mod=No se puede usar el formato hash MD5, ya que el módulo Perl $1 no está instalado
session_esha512mod=No se puede usar el formato hash SHA512, ya que el módulo Perl $1 no está instalado
session_eyescrypt=No se puede usar el formato hash yescrypt, ya que el módulo Perl $1 no está instalado
session_edigestcrypt=El formato de hash $1 no se puede utilizar porque la función <tt>crypt</tt> del sistema no lo admite
session_blocklock=También bloquea usuarios con inicios de sesión fallidos
session_passapi=¿Habilitar API de cambio de contraseña remota?
session_passapi0=API deshabilitada
@@ -301,10 +311,11 @@ log_delete_webmincron=$1 funciones programadas eliminadas
log_run_webmincron=Ejecutó $1 funciones programadas
log_save_webmincron=Función programada actualizada en el módulo $1
log_onedelete_webmincron=Función programada eliminada en el módulo $1
log_letsencrypt=Nuevo certificado SSL solicitado de Let's Encrypt
log_letsencryptdns=Se creó el registro DNS de Let's Encrypt para $1
log_letsencryptcleanup=Se eliminó el registro de Let's Encrypt DNS para $1
log_letsencrypt=Solicité un nuevo certificado SSL a un proveedor de ACME
log_letsencryptdns=Se creó un registro DNS ACME para $1
log_letsencryptcleanup=Se eliminó el registro DNS de ACME para $1
themes_configure=Abrir la página de configuración del tema
themes_none=Ninguno: deje que el tema decida
themes_overdesc=Las superposiciones modifican la apariencia de un tema cambiando los colores, fondos e íconos. No cambian el diseño.
themes_overlay=Superposición actual :
@@ -558,6 +569,7 @@ sendmail_authdef=Predeterminado (actualmente Cram-MD5)
sendmail_from=De la dirección de correo electrónico de Webmin
sendmail_fromdef=Predeterminado ($1)
sendmail_fromaddr=Habla a
sendmail_name=Nombre para mostrar
sendmail_toaddr=Dirección de destino predeterminada para notificaciones
sendmail_to_def=Ninguno establecido
sendmail_etoaddr=Dirección de destino faltante o con formato incorrecto
@@ -659,6 +671,7 @@ twofactor_enrolllink=Ahora puede inscribirse para la autenticación de dos facto
twofactor_url=Para obtener más información sobre $1, consulte su sitio web en <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=El módulo Perl <tt>$1</tt> necesario para la autenticación de dos factores no está instalado. Use la página <a href='$2'>Módulos Perl</a> en Webmin para instalarlo.
twofactor_qrcode=Ingrese el código secreto $1 en la aplicación TOTP o escanee el código QR a continuación.
twofactor_qrcode_manual=Introduce el código secreto $1 en la aplicación TOTP y configúralo manualmente, ya que la generación de códigos QR no es compatible con este sistema.
twofactor_etotpid=Secreto codificado en base32 TOTP no válido
twofactor_etotptoken=El token TOTP debe ser un número
twofactor_etotpmatch=Código OTP incorrecto
@@ -668,9 +681,9 @@ twofactor_secret0=Usar clave de 16 caracteres
twofactor_esecret=La clave secreta debe tener exactamente 16 caracteres y contener solo letras y números
twofactor_esession=La autenticación de dos factores no se puede usar a menos que la autenticación basada en sesión esté activa
letsencrypt_title=Cifremos la solicitud de certificado
letsencrypt_err=Error al solicitar el certificado
letsencrypt_ecmds=Ni el comando de cliente Let's Encrypt <tt>certbot</tt> o el comando <tt>python</tt> se encontraron en su sistema
letsencrypt_title=Solicitud de certificado de proveedor SSL
letsencrypt_err=No se pudo solicitar el certificado
letsencrypt_ecmds=Ni el comando cliente nativo ACME <tt>certbot</tt> ni el comando <tt>python</tt> se encontraron en su sistema
letsencrypt_epythonmod=El módulo Python $1 que necesita el cliente integrado Let's Encrypt no está instalado
letsencrypt_epythonver=Error al obtener la versión de Python : $1
letsencrypt_epythonver2=Se requiere la versión de Python $1 o superior, pero solo tiene la versión $2.
@@ -678,6 +691,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=El servidor virtual Apache $1 no tiene directorio de documentos.
letsencrypt_edom=Nombre de dominio faltante o inválido
letsencrypt_erenew=Intervalo de renovación faltante o no numérico
letsencrypt_eacmedir=URL del directorio ACME faltante o no válida
letsencrypt_eeabdir=Se debe introducir una URL de directorio ACME al utilizar la vinculación de cuenta externa
letsencrypt_eeabpair=Se deben introducir tanto el ID de clave de enlace de cuenta externa como la clave HMAC
letsencrypt_eeabnative=La vinculación de cuentas externas solo se puede utilizar cuando el cliente ACME nativo está instalado
letsencrypt_ewebroot=El directorio de documentos del sitio web no existe
letsencrypt_evhost=No se encontró ninguna coincidencia de host virtual $1
letsencrypt_efull=No se encontró el archivo de certificado completo esperado $1
@@ -700,9 +717,9 @@ letsencrypt_echain=Error al descargar el certificado encadenado : $1
letsencrypt_echain2=El certificado encadenado descargado de $1 está vacío
letsencrypt_ecsr=Error al generar CSR : $1
letsencrypt_ekeygen=Error al generar la clave privada : $1
letsencrypt_enative=El cliente nativo Let's Encrypt (certbot) se usó anteriormente en este sistema y debe usarse para todas las solicitudes de certificados futuras
letsencrypt_eacmedns=Solo el cliente oficial Let's Encrypt admite la validación basada en DNS
letsencrypt_eacmecertbot=Solo el cliente oficial Let's Encrypt admite la validación de Certbot
letsencrypt_enative=El cliente nativo de ACME (certbot) se utilizó anteriormente en este sistema y debe utilizarse para todas las solicitudes de certificados futuras
letsencrypt_eacmedns=Solo el cliente nativo de ACME admite la validación basada en DNS
letsencrypt_eacmecertbot=Solo el cliente nativo de ACME admite la validación de Certbot
announce_hide=Ocultar este anuncio
alert_hide=Ocultar alerta

View File

@@ -340,7 +340,6 @@ ssl_essl=Ez dirudi Net::SSLeay perl modulua zure sisteman instalatuta dagoela. O
ssl_cpan=Bestela, Webmin <a href='$1'>deskargatu eta instalatu dezakezu</a> behar duzun Net::SSLeay Perl modulua zuretzat.
ssl_emessage=Perl-en akats mezua honakoa zen : $1
ssl_desc1=Webmin exekutatzen ari den ostalariak SSLeay Perl modulua instalatuta duela dirudi. Hori erabiliz, Webminek SSL enkriptatutako komunikazioa onartzen du zure arakatzailearen eta zerbitzariaren artean. Zure webmin zerbitzaria Interneten sartzen ari bazara, zalantzarik gabe SSL erabiltzea kontuan hartu beharko duzu erasotzaileari zure Webmin pasahitza harrapatzea ekiditeko.
ssl_desc2=Abisua: SSL laguntza soilik aktibatu SSL onartzen duen arakatzailea baldin baduzu eta <b>https</b> eskaerak zure arakatzailearen eta Webmin ostalariaren artean ez dago blokeorik.
ssl_header=SSL laguntza
ssl_on=SSL gaitu?
ssl_key=Gako fitxategi pribatua
@@ -351,6 +350,7 @@ ssl_deny=SSL protokoloaren bertsioak baztertzeko
ssl_compression=Baimendu konprimitutako SSL konexioak?
ssl_honorcipherorder=Zerbitzari definitutako zifratze agindua erabiltzera behartu?
ssl_extracas=Ziurtagiri fitxategi osagarriak <br> (kateatutako ziurtagirientzat)
ssl_enforce=Betearazi SSL
ssl_hsts=Indartu SSL HSTS goiburuarekin
ssl_redirect=SSL ez diren SSL eskaerak birbideratu SSL modura?
ssl_extracasdef=SSL ezarpen globalen berdina
@@ -410,7 +410,7 @@ ssl_tabcreate=Sinatutako ziurtagiria
ssl_tabcsr=Ziurtagiria sinatzeko eskaera
ssl_tabupload=Kargatu ziurtagiria
ssl_tabcurrent=Egungo ziurtagiria
ssl_tablets=Zifratu dezagun
ssl_tablets=SSL hornitzailea
ssl_cheader=Uneko ziurtagiriaren xehetasunak
ssl_typeself=Norberak sinatutako
ssl_typereal=CA-k sinatuta
@@ -422,14 +422,14 @@ ssl_edownload=Ezin izan da PEM datuak ziurtagiririk atera
ssl_csralready=Ikusi azken gakoa eta EGE ..
ssl_already1=Aurretik sortutako gako pribatua :
ssl_already2=Aurretik sortutako ziurtagiria sinatzeko eskaera :
ssl_letsdesc=Let's Encrypt Webmin-ek SSL ziurtagiria sortzeko erabil dezakeen ziurtagiri librea, automatizatua eta irekia da.
ssl_letserr=Zoritxarrez, Dezagun Encrypt ezin da zure sisteman erabili: $1.
ssl_letserr2=Bestela, egiaztatu <a href='$1'>moduluaren konfigurazioa</a> orria <tt>letsencrypt</tt> komandoari bide zuzena erabiltzen ari zarela ziurtatzeko.
ssl_letsdesc2=Orrialde hau Ziurtagiri berri bat eskatzeko erabil daiteke. Webmin konfiguratuta dagoen beste edozein gainidatziko du. Hala ere, Letrak enkriptatu zerbitzuak eskatzen du ziurtagiriaren domeinuaren titulartasuna balioztatzea sistema honek domeinuaren webgunea ostatatzen duela egiaztatuz. Hori egiten da aldi baterako fitxategi txiki bat webgunearen dokumentuen direktorioan jarriz.
ssl_letsdesc=Inprimaki honek Webmin-erako SSL ziurtagiri fidagarri bat eskatzeko aukera ematen dizu ACME-rekin bateragarria den hornitzaile batetik, hala nola Let's Encrypt-etik.
ssl_letserr=Zoritxarrez, sistema honek ezin ditu ziurtagiriak eskatu SSL hornitzaile batetik: $1.
ssl_letserr2=Bestela, egiaztatu <a href='$1'>moduluaren konfigurazioa</a> orria konfiguratutako ACME bezero komandoaren bide zuzena erabiltzen ari zarela ziurtatzeko.
ssl_letsdesc2=Ziurtagiri berriak Webminen konfiguratuta dagoena ordezkatuko du. Jaulki aurretik, ACME hornitzaileak ostalari-izen bakoitzaren kontrola egiaztatu behar du webgunearen dokumentu-direktorioko aldi baterako fitxategi bat edo aldi baterako DNS TXT erregistro bat erabiliz.
ssl_letsheader=SSL ziurtagiri berrirako aukerak
ssl_letsdoms=Ziurtagiriaren ostalariaren izenak
ssl_subset=Egiaztaezinak ostalari-izenak saltatu nahi dituzu?
ssl_letsmode=Enkriptatu dezagun baliozkotze metodoa
ssl_letsmode=Domeinuaren balidazio metodoa
ssl_letsmode0=Apache ostalari birtuala bat datorren ostalari-izena
ssl_letsmode1=Aukeratutako Apache ostalari birtuala
ssl_letsmode2=Webzerbitzariaren beste dokumentuen direktorioa
@@ -440,9 +440,17 @@ ssl_letsonly=Eguneratu berritzea
ssl_usewebmin=Kopiatu gako berria eta ziurtagiria Webmin-en?
ssl_letsrenew=Berritze automatikoaren arteko hilabeteak
ssl_letsnotrenew=Eskuz bakarrik berritu
ssl_staging=Dezagun enkriptatu zerbitzaria
ssl_staging0=Real
ssl_staging=Hornitzaile zerbitzaria
ssl_staging0=Ekoizpena
ssl_staging1=Eszenaratzea (proba bakarrik)
ssl_acmeopts=Hornitzailearen ezarpenak
ssl_acmeextra=Erakutsi ezarpen aurreratuak
ssl_acmedir=ACME direktorio pertsonalizatuaren URLa
ssl_acmedirdesc=Ezartuta badago, honek goiko hornitzaile lehenetsiaren zerbitzaria gainidazten du.
ssl_acmekid=Kanpoko kontuaren lotura-gakoaren IDa
ssl_acmekiddesc=Aukerakoa. ACME hornitzaile batzuek direktorioko URLaz gain, hau eskatzen dute.
ssl_acmehmac=Kanpoko kontuaren lotura HMAC gakoa
ssl_acmehmacdesc=Aukerakoa. Erabiltzean, Certbot bezero natiboa behar du.
newkey_err=Huts egin du SSL gakoa sortzerakoan
newkey_ecn=Zerbitzariaren izen falta edo baliogabea
@@ -664,13 +672,14 @@ session_pmode0=Erabiltzaileei iraungitako pasahitzak ukatu beti
session_pmode1=Beti baimendu pasahitz iraungitako erabiltzaileekin
session_pmode2=Eskatu erabiltzaileei iraungitako pasahitzak dituztela berri bat sartzeko
session_md5=Webmin pasahitza hashing formatua
session_rpc_timeout=RPC saioaren denbora-muga
session_erpc_timeout=RPC saioaren denbora-muga falta da edo 0 baino handiagoa den zenbakia izan behar du
session_md5off=Zehaztu automatikoki
session_md5on=Erabili <tt>MD5</tt> hashing formatua
session_sha512=Erabili <tt>SHA512</tt> hashing formatua
session_yescrypt=Erabili <tt>yescrypt</tt> hashing formatua
session_emd5mod=MD5 hashing formatua ezin da erabili, Perl $1 modulua ez baitago instalatuta
session_esha512mod=SHA512 hashing formatua ezin da erabili, Perl $1 modulua ez baitago instalatuta
session_eyescrypt=yescrypt hashing formatua ezin da erabili, Perl $1 modulua ez baitago instalatuta
session_edigestcrypt=Ezin da $1 hashing formatua erabili, sistemaren <tt>crypt</tt> funtzioak ez duelako onartzen
session_blocklock=Era berean, blokeatu erabiltzaileek huts egin duten saioak
session_passapi=Urruneko pasahitza aldatzeko APIa gaitu nahi duzu?
session_passapi0=APIa desgaituta dago
@@ -746,13 +755,14 @@ log_delete_webmincron=$1 ezarritako funtzioak ezabatu ditu
log_run_webmincron=Rango $1 programatutako funtzioak
log_save_webmincron=Eguneratutako funtzio eguneratua $1 moduluan
log_onedelete_webmincron=Programatutako funtzioa ezabatu da $1 moduluan
log_letsencrypt=SSL ziurtagiri berria eskatu dugu Let's Encrypt-en
log_letsencryptdns=Sortu dezagun DNS erregistroa $1 -rako
log_letsencryptcleanup=Kendu Dezagun enkriptatu DNS erregistroa $1 -rentzat
log_letsencrypt=ACME hornitzaile bati SSL ziurtagiri berria eskatu diot
log_letsencryptdns=$1-erako ACME DNS erregistroa sortu da
log_letsencryptcleanup=$1-erako ACME DNS erregistroa kendu da
themes_title=Webmin Gaiak
themes_desc=Gaiek Webmin erabiltzailearen interfazearen itxura kontrolatzen dute, ikonoak, koloreak, atzeko planoak eta orrien diseinua barne. Beheko hautatutako laukia zure sisteman instalatutako gairen bat aukeratzeko erabil daiteke.
themes_sel=Oraingo gaia :
themes_configure=Ireki gaiaren konfigurazio orria
themes_default=Webmin zaharreko gaia
themes_none=Bat ere ez - utzi gaia erabakitzen
themes_change=Aldaketa
@@ -1104,6 +1114,7 @@ sendmail_authdef=Lehenespenez (gaur egun Cram-MD5)
sendmail_from=Webmin helbide elektronikoa lortzeko
sendmail_fromdef=Lehenespenez ($1)
sendmail_fromaddr=Helbidea
sendmail_name=Bistaratzeko izena
sendmail_toaddr=Jakinarazpenetarako helmuga lehenetsia
sendmail_to_def=Ez dago ezarrita
sendmail_etoaddr=Helmuga helbidea falta da edo formateatu okerra
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Bi faktoreren autentikazioan izena eman dezakezu <a href='$
twofactor_url=$1 buruz gehiago jakiteko, ikusi <a href='$2' target=_blank>$2</a> webgunean.
twofactor_etotpmodule=Ez da instalatu bi faktoreen autentikaziorako behar den <tt>$1</tt>. Erabili <a href='$2'>Perl moduluak</a> orria Webmin-en instalatzeko.
twofactor_qrcode=Sartu $1 kode sekretua TOTP aplikazioan edo eskaneatu beheko QR kodea.
twofactor_qrcode_manual=Sartu $1 kode sekretua TOTP aplikazioan eta konfiguratu eskuz, sistema honek ez baitu QR kodeen sorrera onartzen.
twofactor_etotpid=TOTP base32 kodetutako sekretu baliogabea
twofactor_etotptoken=TOTP tokenak zenbaki bat izan behar du
twofactor_etotpmatch=OTP kode okerra
@@ -1214,9 +1226,9 @@ twofactor_secret0=Erabili 16 karaktere gakoa
twofactor_esecret=Gako sekretuak 16 karaktere luze izan behar ditu eta letrak eta zenbakiak bakarrik eduki behar ditu
twofactor_esession=Bi faktoreren autentikazioa ezin da erabili saioan oinarritutako autentikazioa aktibatuta egon ezean
letsencrypt_title=Zifratu Ziurtagiri Eskaera
letsencrypt_err=Ezin izan da ziurtagiria eskatu
letsencrypt_ecmds=Ez ditzagun zure sistemako Letrak enkriptatu <tt>certbot</tt> edo <tt>python</tt> komandoa
letsencrypt_title=SSL hornitzailearen ziurtagiri eskaera
letsencrypt_err=Ziurtagiria eskatzea huts egin da
letsencrypt_ecmds=Ez da aurkitu zure sisteman ez ACME bezeroaren <tt>certbot</tt> komando natiboa ezta <tt>python</tt> komandoa ere
letsencrypt_epythonmod=Python modulua $1 Dezagun enkriptatutako bezeroak behar duenean ez dago instalatuta
letsencrypt_epythonver=Ezin izan da Python bertsioa eskuratu : $1
letsencrypt_epythonver2=Python bertsioa $1 edo berria beharrezkoa da, baina $2 bertsioa baino ez duzu.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=$1 Apache ostalari birtualak ez du dokumentuen direktoriorik!
letsencrypt_edom=Domeinu izen falta edo baliogabea
letsencrypt_erenew=Falta edo zenbakizko berritze-tartea
letsencrypt_eacmedir=ACME direktorioko URLa falta da edo baliogabea da
letsencrypt_eeabdir=ACME direktorioko URL bat sartu behar da Kanpoko Kontuen Lotura erabiltzean
letsencrypt_eeabpair=Kanpoko Kontuaren Lotura-gakoaren IDa eta HMAC gakoa sartu behar dira
letsencrypt_eeabnative=Kanpoko kontuen lotura ACME bezero natiboa instalatuta dagoenean bakarrik erabil daiteke
letsencrypt_ewebroot=Webgunearen dokumentuen direktoriorik ez dago
letsencrypt_evhost=Ez da aurkitu $1 bat datorren ostalari birtualik
letsencrypt_efull=Ez da espero ziurtagiri osoa $1 fitxategia
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Ezin izan da kateatutako ziurtagiria deskargatu : $1
letsencrypt_echain2=$1 tik kargatutako ziurtagiri kateatua hutsik dago
letsencrypt_ecsr=Huts egin du CSR sortzen denean : $1
letsencrypt_ekeygen=Ezin izan da gako pribatua sortzen : $1
letsencrypt_enative=Let's Encrypt bezero jatorria (certbot) lehenago erabili zen sistema honetan eta etorkizunean ziurtagiri-eskaera guztietarako erabili behar da
letsencrypt_eacmedns=Letrak Encrypt bezero ofizialak soilik onartzen ditu DNSetan oinarritutako balioztapena
letsencrypt_eacmecertbot=Let's Encrypt bezero ofizialak soilik onartzen du Certbot baliozkotzea
letsencrypt_enative=ACME bezero natiboa (certbot) sistema honetan lehenago erabili izan da, eta etorkizuneko ziurtagiri eskaera guztietarako erabili behar da
letsencrypt_eacmedns=ACME bezero natiboak bakarrik onartzen du DNS oinarritutako balidazioa
letsencrypt_eacmecertbot=ACME bezero natiboak bakarrik onartzen du Certbot balidazioa
announce_hide=Ezkutatu iragarki hau
alert_hide=Alerta ezkutatu

View File

@@ -211,7 +211,6 @@ ssl_essl=پيمانه Net::SSLeay پرل به نظر مي‌رسد که در س
ssl_cpan=شما مي‌توانيد وب راداشته باشيد و پيمانه‌هاي پرل Net::SSLeay مورد نياز خود را <a href='$1'>بارگيري و نصب </a>کنيد.
ssl_emessage=پيام خطاي مربوط به پرل $1 بود.
ssl_desc1=به نظر مي‌رسد پيمانه SSLeay پرل در ميزبان وب‌مين شما نصب شده باشد. با استفاده از اين وب‌مين مي‌تواند از ارتباط رمزگذاري شده SSL بين مرورگر شما و کارساز پشتيباني کند. اگر شما به کارساز وب‌مين از طريق اينترنت دستيابي داريد، شما بايد براي جلوگيري از ضبط اسم‌رمز وب‌مين توسط حمله کنندگان از SSLاستفاده کنيد.
ssl_desc2=هشدار-فقط زماني پشتيباني SSL را فعال کنيد که مرورگري داشته باشيد که از SSL پشتيباني کند (مانند Netscape يا IE(، و هيچ دروازه آتشي جهت مسدود کردن درخواستهاي <https>بين مرورگر شما و ميزبان وب وجود نداشته باشد.
ssl_header=پشتيباني از SSL
ssl_on=آيا اگر SSL در دسترس است، فعال شود؟
ssl_key=پرونده کليد اختصاصي

View File

@@ -139,6 +139,7 @@ lang_dateformat_yyyy/mm/dd=yyyy/mm/dd (یعنی 2001/09/16)
ssl_deny=نسخه های پروتکل SSL را رد کنید
ssl_compression=اتصال SSL فشرده شده مجاز است؟
ssl_honorcipherorder=استفاده از سفارش رمزگذار تعریف شده توسط سرور؟
ssl_enforce=اجرای SSL
ssl_hsts=SSL را با هدر HSTS اجرا کنید
ssl_extracasdef=تنظیمات SSL جهانی
ssl_extracasnone=هیچ یک برای این آدرس IP نیست
@@ -176,7 +177,7 @@ ssl_tabcreate=گواهی خود امضا شده
ssl_tabcsr=درخواست امضای گواهی
ssl_tabupload=گواهی بارگذاری کنید
ssl_tabcurrent=گواهی فعلی
ssl_tablets=بیایید رمزگذاری کنیم
ssl_tablets=ارائه دهنده SSL
ssl_cheader=جزئیات گواهی فعلی
ssl_typeself=خود امضا کرد
ssl_typereal=امضا شده توسط CA
@@ -188,15 +189,15 @@ ssl_edownload=استخراج داده های PEM از گواهی انجام نش
ssl_csralready=مشاهده آخرین کلید و CSR ..
ssl_already1=کلید خصوصی قبلی تولید شده :
ssl_already2=درخواست امضای مجوز قبلاً تولید شده :
ssl_letsdesc=Let's Encrypt یک مجوز مجوز رایگان ، خودکار و باز است که می تواند برای تولید گواهینامه SSL برای استفاده توسط Webmin استفاده شود.
ssl_letserr=Unfortunately, Let's Encrypt cannot be used on your system : $1.
ssl_letserr2=Alternately, check the <a href='$1'>module configuration</a> page to ensure you are using the correct path to the <tt>letsencrypt</tt> command.
ssl_letsdesc=این فرم به شما امکان می‌دهد یک گواهی SSL معتبر برای وب‌مین از یک ارائه‌دهنده سازگار با ACME مانند Let's Encrypt درخواست کنید.
ssl_letserr=متأسفانه، این سیستم نمی‌تواند از ارائه‌دهنده SSL درخواست گواهی کند: $1.
ssl_letserr2=همچنین، صفحه <a href='$1'>پیکربندی ماژول</a> را بررسی کنید تا مطمئن شوید که از مسیر صحیح برای دستور پیکربندی‌شده‌ی کلاینت ACME استفاده می‌کنید.
ssl_letsdesc2=از این صفحه می توان برای درخواست گواهی جدید استفاده کرد ، که سایر موارد دیگری را که در حال حاضر در Webmin پیکربندی شده اند بازنویسی می کند. با این حال ، سرویس Let Encrypt نیاز دارد با بررسی اینکه این سیستم میزبان وب سایت دامنه است ، مالکیت شما در حوزه گواهی را تأیید کنید. این کار با قرار دادن یک پرونده موقت کوچک در فهرست اسناد وب سایت انجام می شود.
ssl_letsdesc2=گواهی جدید جایگزین گواهی فعلی پیکربندیشده در Webmin خواهد شد. قبل از صدور، ارائه‌دهنده ACME باید کنترل هر نام میزبان را با استفاده از یک فایل موقت در فهرست اسناد وبسایت یا یک رکورد موقت DNS TXT تأیید کند.
ssl_letsheader=گزینه هایی برای گواهی SSL جدید
ssl_letsdoms=نام میزبان برای گواهی
ssl_subset=از نام‌های میزبان غیرقابل تأیید صرف نظر کنید؟
ssl_letsmode=بیایید روش اعتبار سنجی را رمزگذاری کنیم
ssl_letsmode=روش اعتبارسنجی دامنه
ssl_letsmode0=میزبان مجازی آپاچی مطابق با نام میزبان
ssl_letsmode1=میزبان مجازی آپاچی انتخاب شده است
ssl_letsmode2=دایرکتوری اسناد وب سرور دیگر
@@ -207,9 +208,17 @@ ssl_letsonly=فقط به روزرسانی کنید
ssl_usewebmin=کلید و گواهینامه جدید را به Webmin کپی کنید؟
ssl_letsrenew=ماه بین تجدید خودکار
ssl_letsnotrenew=فقط به صورت دستی تجدید کنید
ssl_staging=بیایید سرور را رمزگذاری کنیم
ssl_staging0=واقعی
ssl_staging1=مرحله بندی (فقط تست)
ssl_staging=سرور ارائه دهنده
ssl_staging0=تولید
ssl_staging1=مرحلهبندی (فقط آزمون)
ssl_acmeopts=تنظیمات ارائه دهنده
ssl_acmeextra=نمایش تنظیمات پیشرفته
ssl_acmedir=آدرس دایرکتوری ACME سفارشی
ssl_acmedirdesc=اگر تنظیم شود، این گزینه، سرور ارائه‌دهنده پیش‌فرض بالا را لغو می‌کند.
ssl_acmekid=شناسه کلید اتصال حساب خارجی
ssl_acmekiddesc=اختیاری. برخی از ارائه‌دهندگان ACME علاوه بر URL دایرکتوری، این را نیز الزامی می‌دانند.
ssl_acmehmac=کلید HMAC اتصال حساب خارجی
ssl_acmehmacdesc=اختیاری. در صورت استفاده، به کلاینت بومی Certbot نیاز دارد.
newkey_ecns=هیچ نام سرور وارد نشده است
newkey_ecountry=کد کشور باید دو حرف باشد
@@ -281,13 +290,14 @@ session_ecmd=فرمان تغییر گذرواژه یا نامعتبر است
session_banner=قبل از ورود بنر
session_pmodedesc3=خط مشی انقضاء رمز ورود
session_md5=قالب هشدار رمز عبور وبمین
session_rpc_timeout=مهلت زمانی جلسه RPC به پایان رسید
session_erpc_timeout=زمان پایان جلسه RPC وجود ندارد یا باید عددی بزرگتر از 0 باشد
session_md5off=به صورت خودکار تعیین کنید
session_md5on=از قالب هش <tt>MD5</tt> استفاده کنید
session_sha512=از قالب هش <tt>SHA512</tt> استفاده کنید
session_yescrypt=از قالب هش <tt>yescrypt</tt> استفاده کنید
session_emd5mod=قالب هش MD5 قابل استفاده نیست، زیرا ماژول Perl $1 نصب نشده است
session_esha512mod=قالب هش SHA512 قابل استفاده نیست، زیرا ماژول Perl $1 نصب نشده است
session_eyescrypt=فرمت هش yescrypt قابل استفاده نیست، زیرا ماژول Perl $1 نصب نشده است
session_edigestcrypt=قالب هشینگ $1 قابل استفاده نیست، زیرا تابع <tt>crypt</tt> سیستم از آن پشتیبانی نمی‌کند
session_blocklock=همچنین کاربران با ورود به سیستم شکست خورده را قفل کنید
session_passapi=API تغییر رمز عبور از راه دور فعال شود؟
session_passapi0=API غیرفعال شده است
@@ -325,10 +335,11 @@ log_delete_webmincron=Deleted $1 scheduled functions
log_run_webmincron=Ran $1 scheduled functions
log_save_webmincron=Updated scheduled function in module $1
log_onedelete_webmincron=Deleted scheduled function in module $1
log_letsencrypt=گواهی SSL جدید را از Let Encrypt درخواست کردیم
log_letsencryptdns=Created Let's Encrypt DNS record for $1
log_letsencryptcleanup=Removed Let's Encrypt DNS record for $1
log_letsencrypt=درخواست گواهی SSL جدید از ارائه دهنده ACME
log_letsencryptdns=رکورد ACME DNS برای $1 ایجاد شد
log_letsencryptcleanup=رکورد ACME DNS برای $1 حذف شد
themes_configure=صفحه پیکربندی قالب را باز کنید
themes_none=هیچ کدام - اجازه دهید موضوع تصمیم بگیرد
themes_overdesc=پوشش ها با تغییر رنگ ها ، پس زمینه ها و نمادها ظاهر یک موضوع را تغییر می دهند. آنها طرح را تغییر نمی دهند.
themes_overlay=پوشش فعلی :
@@ -597,6 +608,7 @@ sendmail_authdef=پیش فرض (در حال حاضر Cram-MD5)
sendmail_from=از آدرس ایمیل برای Webmin
sendmail_fromdef=Default ($1)
sendmail_fromaddr=نشانی
sendmail_name=نام نمایشی
sendmail_toaddr=آدرس مقصد پیش‌فرض برای اعلان‌ها
sendmail_to_def=هیچ کدام تنظیم نشده است
sendmail_etoaddr=آدرس مقصد وجود ندارد یا فرمت نادرست است
@@ -698,6 +710,7 @@ twofactor_enrolllink=You can now enroll for two-factor authentication in the <a
twofactor_url=To learn more about $1, see it's website at <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=The Perl module <tt>$1</tt> needed for two-factor authentication is not installed. Use the <a href='$2'>Perl Modules</a> page in Webmin to install it.
twofactor_qrcode=کد مخفی $1 را در برنامه TOTP وارد کنید، یا کد QR زیر را اسکن کنید.
twofactor_qrcode_manual=کد مخفی $1 را در برنامه TOTP وارد کنید و آن را به صورت دستی تنظیم کنید، زیرا تولید کد QR در این سیستم پشتیبانی نمی‌شود.
twofactor_etotpid=راز رمزگذاری نشده TOTP base32 نامعتبر است
twofactor_etotptoken=توکن TOTP باید یک عدد باشد
twofactor_etotpmatch=کد OTP نادرست است
@@ -707,9 +720,9 @@ twofactor_secret0=از کلید 16 کاراکتر استفاده کنید
twofactor_esecret=کلید مخفی باید دقیقا 16 نویسه داشته باشد و فقط حروف و اعداد را در خود جای دهد
twofactor_esession=احراز هویت دو عاملی نمی تواند مورد استفاده قرار گیرد مگر اینکه احراز هویت مبتنی بر جلسه فعال باشد
letsencrypt_title=بیایید درخواست گواهی را رمزگذاری کنیم
letsencrypt_err=درخواست گواهی انجام نشد
letsencrypt_ecmds=Neither the Let's Encrypt client command <tt>certbot</tt> or the <tt>python</tt> command were found on your system
letsencrypt_title=درخواست گواهی SSL از ارائه دهنده
letsencrypt_err=درخواست گواهی ناموفق بود
letsencrypt_ecmds=نه دستور <tt>certbot</tt> کلاینت ACME و نه دستور <tt>python</tt> هیچ‌کدام در سیستم شما یافت نشدند
letsencrypt_epythonmod=The Python module $1 needed by the built-in Let's Encrypt client is not installed
letsencrypt_epythonver=Failed to get the Python version : $1
letsencrypt_epythonver2=Python version $1 or above is required, but you only have version $2.
@@ -717,6 +730,10 @@ letsencrypt_certbot=گواهی نامه
letsencrypt_edroot=The Apache virtual host $1 has no document directory!
letsencrypt_edom=نام دامنه وجود ندارد یا نامعتبر است
letsencrypt_erenew=فاصله تمدید یا غیر عددی فاصله
letsencrypt_eacmedir=نشانی اینترنتی دایرکتوری ACME موجود نیست یا نامعتبر است
letsencrypt_eeabdir=هنگام استفاده از اتصال حساب خارجی، باید یک آدرس اینترنتی دایرکتوری ACME وارد شود
letsencrypt_eeabpair=هم شناسه کلید اتصال حساب خارجی و هم کلید HMAC باید وارد شوند
letsencrypt_eeabnative=اتصال حساب خارجی فقط زمانی قابل استفاده است که کلاینت ACME بومی نصب شده باشد
letsencrypt_ewebroot=فهرست اسناد وب سایت وجود ندارد
letsencrypt_evhost=No virtual host matching $1 was found
letsencrypt_efull=Expected full certificate file $1 was not found
@@ -739,9 +756,9 @@ letsencrypt_echain=Failed to download chained certificate : $1
letsencrypt_echain2=Chained certificate downloaded from $1 is empty
letsencrypt_ecsr=Failed to generate CSR : $1
letsencrypt_ekeygen=Failed to generate private key : $1
letsencrypt_enative=مشتری بومی Let Encrypt (certbot) قبلاً در این سیستم استفاده شده بود ، و باید برای کلیه درخواست های گواهی آینده مورد استفاده قرار گیرد
letsencrypt_eacmedns=فقط مشتری رسمی Letry Encrypt از اعتبار سنجی مبتنی بر DNS پشتیبانی می کند
letsencrypt_eacmecertbot=فقط مشتری رسمی Let's Encrypt از اعتبارسنجی Certbot پشتیبانی می کند
letsencrypt_enative=کلاینت ACME بومی (certbot) قبلاً در این سیستم استفاده می‌شد و باید برای همه درخواستهای گواهی آینده نیز مورد استفاده قرار گیرد
letsencrypt_eacmedns=فقط کلاینت ACME بومی از اعتبارسنجی مبتنی بر DNS پشتیبانی میکند
letsencrypt_eacmecertbot=فقط کلاینت بومی ACME از اعتبارسنجی Certbot پشتیبانی میکند
announce_hide=پنهان کردن این اعلامیه
alert_hide=هشدار را مخفی کنید

View File

@@ -340,7 +340,6 @@ ssl_essl=Net::SSLeay perl -moduulia ei näytä olevan asennettuna järjestelmä
ssl_cpan=Voit vaihtoehtoisesti antaa Webmin <a href='$1'>ladata ja asentaa</a> vaaditun Net::SSLeay Perl -moduulin.
ssl_emessage=Perlin virheviesti : $1
ssl_desc1=Isäntänä, jolla Webmin toimii, näyttää olevan asennettu SSLeay Perl -moduuli. Tätä käyttämällä Webmin tukee SSL-salattua tiedonsiirtoa selaimesi ja palvelimen välillä. Jos käytät Webmin-palvelinta Internetin kautta, sinun kannattaa ehdottomasti harkita SSL: n käyttöä estämään hyökkääjää sieppaamasta Webmin-salasanaasi.
ssl_desc2=Varoitus - ota SSL-tuki käyttöön vain, jos sinulla on SSL: tä tukeva selain, ja selaimesi ja Webmin-palvelimen välillä ei ole palomuurin estäviä <b>https</b> -pyyntöjä.
ssl_header=SSL-tuki
ssl_on=Ota SSL käyttöön?
ssl_key=Yksityinen avaintiedosto
@@ -351,6 +350,7 @@ ssl_deny=Hylättävät SSL-protokollaversiot
ssl_compression=Sallitaanko pakatut SSL-yhteydet?
ssl_honorcipherorder=Pakota palvelimen määrittämä salausjärjestys?
ssl_extracas=Lisäsertifikaattitiedostot <br> (ketjutettuihin varmenteisiin)
ssl_enforce=Pakota SSL-suojaus
ssl_hsts=Pakota SSL HSTS-otsikolla
ssl_redirect=Ohjaavatko muut kuin SSL-pyynnöt SSL-tilaan?
ssl_extracasdef=Sama kuin globaalit SSL-asetukset
@@ -410,7 +410,7 @@ ssl_tabcreate=Itse allekirjoitettu todistus
ssl_tabcsr=Varmenteen allekirjoituspyyntö
ssl_tabupload=Lataa varmenne
ssl_tabcurrent=Nykyinen varmenne
ssl_tablets=Salatkoon
ssl_tablets=SSL-palveluntarjoaja
ssl_cheader=Tiedot nykyisestä varmenteesta
ssl_typeself=Itse allekirjoitetun
ssl_typereal=CA: n allekirjoittama
@@ -422,14 +422,14 @@ ssl_edownload=PEM-tietojen nouto sertifikaatista epäonnistui
ssl_csralready=Näytä viimeisin avain ja CSR ..
ssl_already1=Aiemmin luotu yksityinen avain :
ssl_already2=Aikaisemmin luotu varmenteen allekirjoituspyyntö :
ssl_letsdesc=Let's Encrypt on ilmainen, automatisoitu ja avoin varmenteen myöntäjä, jota voidaan käyttää luomaan SSL-varmenne Webminin käyttöön.
ssl_letserr=Valitettavasti Let's Encrypt -sovellusta ei voi käyttää järjestelmässäsi: $1.
ssl_letserr2=Tarkista vaihtoehtoisesti <a href='$1'>moduulin kokoonpano</a> -sivu varmistaaksesi, että käytät oikeaa polkua <tt>letsencrypt</tt> -komentoon.
ssl_letsdesc2=Tätä sivua voidaan käyttää uuden varmenteen pyytämiseen, joka korvaa kaikki muut, jotka Webminissä on tällä hetkellä määritetty. Let's Encrypt -palvelu edellyttää kuitenkin, että omistajasi varmennealueelle vahvistetaan tarkistamalla, että tämä järjestelmä isännöi verkkotunnuksen verkkosivustoa. Tämä tehdään sijoittamalla pieni väliaikainen tiedosto verkkosivuston asiakirjahakemistoon.
ssl_letsdesc=Tämän lomakkeen avulla voit pyytää luotettavaa SSL-varmennetta Webminille ACME-yhteensopivalta tarjoajalta, kuten Let's Encryptiltä.
ssl_letserr=Valitettavasti tämä järjestelmä ei voi pyytää varmenteita SSL-palveluntarjoajalta: $1.
ssl_letserr2=Vaihtoehtoisesti voit tarkistaa <a href='$1'>moduulin määrityssivulta</a>, että käytät oikeaa polkua määritettyyn ACME-asiakaskomentoon.
ssl_letsdesc2=Uusi varmenne korvaa Webminissä tällä hetkellä määritetyn varmenteen. Ennen kuin se voidaan myöntää, ACME-tarjoajan on vahvistettava jokaisen isäntänimen hallinta joko verkkosivuston dokumenttihakemistossa olevan väliaikaisen tiedoston tai väliaikaisen DNS TXT -tietueen avulla.
ssl_letsheader=Uuden SSL-varmenteen vaihtoehdot
ssl_letsdoms=Varmenteen isäntänimet
ssl_subset=Ohitetaanko varmentamattomat isäntänimet?
ssl_letsmode=Salataan vahvistusmenetelmä
ssl_letsmode=Verkkotunnuksen validointimenetelmä
ssl_letsmode0=Apache-virtuaaliisäntä, joka vastaa isäntänimeä
ssl_letsmode1=Valittu Apache-virtuaaliisäntä
ssl_letsmode2=Muu verkkopalvelimen asiakirjahakemisto
@@ -440,9 +440,17 @@ ssl_letsonly=Päivitä vain uusinta
ssl_usewebmin=Kopioidaanko uusi avain ja varmenne Webminiin?
ssl_letsrenew=Kuukaudet automaattisen uusimisen välillä
ssl_letsnotrenew=Uusi vain manuaalisesti
ssl_staging=Salatkoon palvelin
ssl_staging0=Todellinen
ssl_staging1=Vaihe (vain testi)
ssl_staging=Palveluntarjoajapalvelin
ssl_staging0=Tuotanto
ssl_staging1=Vaiheistus (vain testi)
ssl_acmeopts=Palveluntarjoajan asetukset
ssl_acmeextra=Näytä lisäasetukset
ssl_acmedir=Mukautettu ACME-hakemiston URL-osoite
ssl_acmedirdesc=Jos tämä on asetettu, tämä ohittaa yllä olevan oletusarvoisen palvelinpalvelimen.
ssl_acmekid=Ulkoisen tilin sidonta-avaimen tunnus
ssl_acmekiddesc=Valinnainen. Jotkin ACME-palveluntarjoajat vaativat tätä hakemiston URL-osoitteen lisäksi.
ssl_acmehmac=Ulkoisen tilin sitova HMAC-avain
ssl_acmehmacdesc=Valinnainen. Vaatii Certbotin alkuperäisen asiakasohjelman käytettäessä.
newkey_err=SSL-avaimen luominen epäonnistui
newkey_ecn=Puuttuva tai virheellinen palvelimen nimi
@@ -664,13 +672,14 @@ session_pmode0=Kieltää käyttäjät aina vanhentuneet salasanat
session_pmode1=Salli aina käyttäjät, joilla on vanhentuneet salasanat
session_pmode2=Pyydä käyttäjiä, joiden salasanat ovat vanhentuneet, antamaan uusi
session_md5=Webmin-salasanan hajautusmuoto
session_rpc_timeout=RPC-istunnon aikakatkaisu
session_erpc_timeout=RPC-istunnon aikakatkaisu puuttuu tai sen on oltava suurempi kuin 0
session_md5off=Määritä automaattisesti
session_md5on=Käytä <tt>MD5</tt>-tiivistemuotoa
session_sha512=Käytä <tt>SHA512</tt>-tiivistemuotoa
session_yescrypt=Käytä <tt>yescrypt</tt>-tiivistemuotoa
session_emd5mod=MD5-tiivistysmuotoa ei voi käyttää, koska Perl $1 -moduulia ei ole asennettu
session_esha512mod=SHA512-tiivistysmuotoa ei voi käyttää, koska Perl $1 -moduulia ei ole asennettu
session_eyescrypt=yescrypt-hajautusmuotoa ei voi käyttää, koska Perl $1 -moduulia ei ole asennettu
session_edigestcrypt=$1-hajautusmuotoa ei voida käyttää, koska järjestelmän <tt>crypt</tt>-funktio ei tue sitä
session_blocklock=Lukitse myös käyttäjät, joilla epäonnistuneet kirjautumiset
session_passapi=Otetaanko salasanan etäkäyttöliittymä käyttöön?
session_passapi0=API poistettu käytöstä
@@ -746,13 +755,14 @@ log_delete_webmincron=Poistetut $1 ajoitetut toiminnot
log_run_webmincron=Suoritti $1 ajoitettuja toimintoja
log_save_webmincron=Päivitetty ajoitettu toiminto moduulissa $1
log_onedelete_webmincron=Poistettu ajoitettu toiminto moduulista $1
log_letsencrypt=Pyysi uutta SSL-varmennetta Let's Encryptiltä
log_letsencryptdns=Luotu salattiin DNS-tietue $1
log_letsencryptcleanup=Poistettiin salaamaan $1 DNS-tietue
log_letsencrypt=Pyysin uutta SSL-varmennetta ACME-palveluntarjoajalta
log_letsencryptdns=Luotu ACME DNS -tietue kohteelle $1
log_letsencryptcleanup=ACME DNS -tietue poistettiin kohteelle $1
themes_title=Webmin-teemat
themes_desc=Teemat ohjaavat Webmin-käyttöliittymän ulkonäköä, mukaan lukien kuvakkeet, värit, taustat ja sivujen asettelu. Alla olevaa valintaruutua voidaan käyttää valitsemalla yksi järjestelmään asennetuista teemoista.
themes_sel=Nykyinen teema :
themes_configure=Avaa teeman määrityssivu
themes_default=Vanha Webmin-teema
themes_none=Ei mitään - anna teema päättää
themes_change=Muuttaa
@@ -1104,6 +1114,7 @@ sendmail_authdef=Oletus (tällä hetkellä Cram-MD5)
sendmail_from=Webminin sähköpostiosoitteesta
sendmail_fromdef=Oletus ($1)
sendmail_fromaddr=Osoite
sendmail_name=Näyttönimi
sendmail_toaddr=Ilmoitusten oletuskohdeosoite
sendmail_to_def=Ei asetettu
sendmail_etoaddr=Puuttuva tai väärin muotoiltu kohdeosoite
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Voit nyt ilmoittautua kaksifaktoriseen todennukseen <a href
twofactor_url=Lisätietoja $1 on verkkosivustolla osoitteessa <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Kaksitekijäiseen todennukseen tarvittavaa Perl-moduulia <tt>$1</tt> ei ole asennettu. Asenna se Webminin <a href='$2'>Perl-moduulit</a> -sivulla.
twofactor_qrcode=Kirjoita salainen koodi $1 TOTP-sovellukseen tai skannaa alla oleva QR-koodi.
twofactor_qrcode_manual=Syötä salainen koodi $1 TOTP-sovellukseen ja määritä se manuaalisesti, koska QR-koodien luontia ei tueta tässä järjestelmässä.
twofactor_etotpid=Virheellinen TOTP base32-koodattu salaisuus
twofactor_etotptoken=TOTP-tunnuksen on oltava numero
twofactor_etotpmatch=Väärä OTP-koodi
@@ -1214,9 +1226,9 @@ twofactor_secret0=Käytä 16-merkkistä näppäintä
twofactor_esecret=Salaisen avaimen tulee olla tarkalleen 16 merkkiä pitkä ja sisältää vain kirjaimia ja numeroita
twofactor_esession=Kaksikerroista todennusta ei voida käyttää, ellei istuntopohjainen todennus ole aktiivinen
letsencrypt_title=Salatkaamme varmennepyyntö
letsencrypt_title=SSL-palveluntarjoajan varmennepyyntö
letsencrypt_err=Varmenteen pyytäminen epäonnistui
letsencrypt_ecmds=Järjestelmästä ei löytynyt Let's Encrypt client -komentoa <tt>certbot</tt> tai <tt>python</tt> -komentoa.
letsencrypt_ecmds=Järjestelmästäsi ei löytynyt ACME-asiakasohjelman natiivia certbot <tt>certbot</tt> komentoa eikä <tt>python</tt> -komentoa
letsencrypt_epythonmod=Sisäänrakennetun Let's Encrypt -asiakkaan tarvitsemaa Python-moduulia $1 ei ole asennettu
letsencrypt_epythonver=Python-version hankkiminen epäonnistui : $1
letsencrypt_epythonver2=Python-versio $1 tai uudempi vaaditaan, mutta sinulla on vain versio $2.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Apache-virtuaalikoneella $1 ei ole asiakirjahakemistoa!
letsencrypt_edom=Puuttuva tai virheellinen verkkotunnus
letsencrypt_erenew=Puuttuva tai ei-numeerinen uusimisväli
letsencrypt_eacmedir=Puuttuva tai virheellinen ACME-hakemiston URL-osoite
letsencrypt_eeabdir=ACME-hakemiston URL-osoite on annettava, kun käytetään ulkoista tilin sidontaa
letsencrypt_eeabpair=Sekä ulkoisen tilin sidonta-avaimen tunnus että HMAC-avain on annettava
letsencrypt_eeabnative=Ulkoista tilien sidontaa voidaan käyttää vain, kun natiivi ACME-asiakasohjelma on asennettu
letsencrypt_ewebroot=Verkkosivun asiakirjahakemistoa ei ole
letsencrypt_evhost=Virtuaalista isäntää, joka vastasi $1, ei löytynyt
letsencrypt_efull=Odotettua täydellistä varmennetiedostoa $1 ei löytynyt
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Ketjutun varmenteen lataus epäonnistui : $1
letsencrypt_echain2=Ketjutettu sertifikaatti, joka on ladattu osoitteesta $1, on tyhjä
letsencrypt_ecsr=CSR: n luominen epäonnistui : $1
letsencrypt_ekeygen=Yksityisen avaimen luonti epäonnistui : $1
letsencrypt_enative=Alkuperäistä Let's Encrypt -asiakasta (certbot) käytettiin aiemmin tässä järjestelmässä, ja sitä on käytettävä kaikkiin tuleviin varmennepyyntöihin
letsencrypt_eacmedns=Vain virallinen Let's Encrypt -asiakas tukee DNS-pohjaista validointia
letsencrypt_eacmecertbot=Vain virallinen Let's Encrypt -asiakas tukee Certbotin validointia
letsencrypt_enative=Tässä järjestelmässä on aiemmin käytetty alkuperäistä ACME-asiakasohjelmaa (certbot), ja sitä on käytettävä kaikissa tulevissa varmennepyynnöissä
letsencrypt_eacmedns=Vain natiivi ACME-asiakasohjelma tukee DNS-pohjaista validointia
letsencrypt_eacmecertbot=Vain ACME:n natiivi asiakasohjelma tukee Certbot-validointia
announce_hide=Piilota tämä ilmoitus
alert_hide=Piilota hälytys

View File

@@ -308,7 +308,6 @@ ssl_essl=Le module perl Net :: SSLeay ne semble pas être installé sur votre sy
ssl_cpan=Vous pouvez également demander à Webmin <a href='$1'>de télécharger et d'installer</a> le module Net::SSLeay Perl requis pour vous.
ssl_emessage=Le message d'erreur de Perl était : $1
ssl_desc1=L'hôte sur lequel Webmin s'exécute semble avoir installé le module SSLeay Perl. Grâce à cela, Webmin prend en charge la communication cryptée SSL entre votre navigateur et le serveur. Si vous accédez à votre serveur Webmin via Internet, vous devez absolument envisager d'utiliser SSL pour empêcher un attaquant de capturer votre mot de passe Webmin.
ssl_desc2=Attention - n'activez la prise en charge SSL que si votre navigateur prend en charge SSL et qu'il n'y a pas de requêtes de blocage de pare-feu <b>https</b> entre votre navigateur et l'hôte Webmin.
ssl_header=Prise en charge SSL
ssl_on=Activer SSL?
ssl_key=Fichier de clé privée
@@ -377,7 +376,6 @@ ssl_tabcreate=Certificat auto-signé
ssl_tabcsr=Demande de signature de certificat
ssl_tabupload=Télécharger le certificat
ssl_tabcurrent=Certificat actuel
ssl_tablets=Permet de chiffrer
ssl_cheader=Détails du certificat actuel
ssl_typeself=Auto-signé
ssl_typereal=Signé par CA
@@ -389,10 +387,6 @@ ssl_edownload=Échec de l'extraction des données PEM du certificat
ssl_csralready=Afficher la clé et le CSR les plus récents ...
ssl_already1=Clé privée précédemment générée :
ssl_already2=Demande de signature de certificat précédemment générée :
ssl_letsdesc=Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte qui peut être utilisée pour générer un certificat SSL à utiliser par Webmin.
ssl_letserr=Malheureusement, Let's Encrypt ne peut pas être utilisé sur votre système : $1.
ssl_letserr2=Vous pouvez également consulter la page <a href='$1'>de configuration du module</a> pour vous assurer que vous utilisez le chemin correct vers la commande <tt>letsencrypt</tt>.
ssl_letsdesc2=Cette page peut être utilisée pour demander un nouveau certificat, qui écrasera tout autre déjà configuré dans Webmin. Cependant, le service Let's Encrypt nécessite que votre propriété du domaine de certificat soit validée en vérifiant que ce système héberge le site Web du domaine. Pour ce faire, placez un petit fichier temporaire dans le répertoire de documents du site Web.
ssl_letsheader=Options pour le nouveau certificat SSL
ssl_letsdoms=Noms d'hôte pour le certificat
ssl_letsok=Demander un certificat
@@ -400,9 +394,6 @@ ssl_letsonly=Il suffit de mettre à jour le renouvellement
ssl_usewebmin=Copier la nouvelle clé et le nouveau certificat dans Webmin?
ssl_letsrenew=Mois entre le renouvellement automatique
ssl_letsnotrenew=Renouveler uniquement manuellement
ssl_staging=Serveur Let's Encrypt
ssl_staging0=Réel
ssl_staging1=Mise en scène (test uniquement)
newkey_err=Échec de la création de la clé SSL
newkey_ecn=Nom de serveur manquant ou non valide
@@ -679,9 +670,6 @@ log_delete_webmincron=Fonctions planifiées à $1 supprimées
log_run_webmincron=Ran $1 fonctions programmées
log_save_webmincron=Mise à jour de la fonction programmée dans le module $1
log_onedelete_webmincron=Fonction programmée supprimée dans le module $1
log_letsencrypt=Nouveau certificat SSL demandé à Let's Encrypt
log_letsencryptdns=Création d'un enregistrement DNS Let's Encrypt pour $1
log_letsencryptcleanup=Suppression de l'enregistrement DNS Let's Encrypt pour $1
themes_title=Thèmes Webmin
themes_desc=Les thèmes contrôlent l'apparence de l'interface utilisateur Webmin, y compris les icônes, les couleurs, les arrière-plans et la disposition des pages. La boîte de sélection ci-dessous peut être utilisée pour choisir l'un des thèmes installés sur votre système.
@@ -1085,9 +1073,6 @@ twofactor_secret0=Utiliser une clé à 16 caractères
twofactor_esecret=La clé secrète doit contenir exactement 16 caractères et ne contenir que des lettres et des chiffres
twofactor_esession=L'authentification à deux facteurs ne peut être utilisée que si l'authentification basée sur la session est active
letsencrypt_title=Let's Encrypt Certificate Request
letsencrypt_err=Échec de la demande de certificat
letsencrypt_ecmds=Ni la commande client Let's Encrypt <tt>certbot</tt> ni la commande <tt>python</tt> nont été trouvées sur votre système
letsencrypt_epythonmod=Le module Python $1 requis par le client Let's Encrypt intégré n'est pas installé
letsencrypt_epythonver=Impossible d'obtenir la version Python : $1
letsencrypt_epythonver2=La version Python $1 ou supérieure est requise, mais vous n'avez que la version $2.
@@ -1116,8 +1101,6 @@ letsencrypt_echain=Échec du téléchargement du certificat chaîné : $1
letsencrypt_echain2=Le certificat chaîné téléchargé à partir de $1 est vide
letsencrypt_ecsr=Échec de la génération du CSR : $1
letsencrypt_ekeygen=Échec de la génération de la clé privée : $1
letsencrypt_enative=Le client natif Let's Encrypt (certbot) a été utilisé précédemment sur ce système et doit être utilisé pour toutes les futures demandes de certificat
letsencrypt_eacmedns=Seul le client officiel Let's Encrypt prend en charge la validation DNS
announce_hide=Cacher cette annonce
alert_hide=Masquer l'alerte

View File

@@ -35,14 +35,32 @@ lang_dateformat_dd/mm/yyyy=jj/mm/aaaa (c'est-à-dire 16/09/2001)
lang_dateformat_mm/dd/yyyy=jj/mm/aaaa (c'est-à-dire 16/09/2001)
lang_dateformat_yyyy/mm/dd=aaaa/mm/jj (c.-à-d. 2001/09/16)
ssl_enforce=Imposer le SSL
ssl_hsts=Appliquer SSL avec l'en-tête HSTS
ssl_tablets=Fournisseur SSL
ssl_letsdesc=Ce formulaire vous permet de demander un certificat SSL de confiance pour Webmin auprès d'un fournisseur compatible ACME tel que Let's Encrypt.
ssl_letserr=Malheureusement, ce système ne peut pas demander de certificats à un fournisseur SSL : $1.
ssl_letserr2=Vous pouvez également consulter la page <a href='$1'>configuration du module</a> pour vous assurer que vous utilisez le chemin correct vers la commande client ACME configurée.
ssl_letsdesc2=Le nouveau certificat remplacera celui actuellement configuré dans Webmin. Avant son émission, le fournisseur ACME doit vérifier le contrôle de chaque nom d'hôte à l'aide d'un fichier temporaire dans le répertoire des documents du site web ou d'un enregistrement DNS TXT temporaire.
ssl_subset=Ignorer les noms dhôtes non vérifiables ?
ssl_letsmode=Méthode de validation Let's Encrypt
ssl_letsmode=méthode de validation de domaine
ssl_letsmode0=Hôte virtuel Apache correspondant au nom d'hôte
ssl_letsmode1=Hôte virtuel Apache sélectionné
ssl_letsmode2=Autre répertoire de documents du serveur Web
ssl_letsmode3=Validation DNS à l'aide de BIND
ssl_letsmode4=Serveur Web intégré Certbot
ssl_staging=Serveur fournisseur
ssl_staging0=Production
ssl_staging1=Mise en scène (test uniquement)
ssl_acmeopts=Paramètres du fournisseur
ssl_acmeextra=Afficher les paramètres avancés
ssl_acmedir=URL de répertoire ACME personnalisée
ssl_acmedirdesc=Si cette option est activée, elle remplace le serveur fournisseur par défaut indiqué ci-dessus.
ssl_acmekid=ID de clé de liaison de compte externe
ssl_acmekiddesc=Facultatif. Certains fournisseurs ACME exigent cette information en plus de l'URL du répertoire.
ssl_acmehmac=Clé HMAC de liaison de compte externe
ssl_acmehmacdesc=Optionnel. Nécessite le client Certbot natif lorsqu'il est utilisé.
upgrade_repo=Dernière version du référentiel $1
upgrade_setup=Exécution du script <tt>setup.sh</tt> pour mettre à niveau Webmin ..
@@ -52,20 +70,20 @@ upgrade_setuppackage=Exécution de <tt>pkgadd</tt> pour mettre à niveau Webmin
session_blockhost=Bloquer les adresses IP client avec plus de $1 échecs de connexion pendant $2 secondes.
session_utmp=Enregistrer les connexions et les déconnexions dans <tt>utmp</tt> ?
session_rpc_timeout=Délai d'expiration de la session RPC
session_erpc_timeout=Le délai d'expiration de la session RPC est manquant ou doit être supérieur à 0
session_md5off=Déterminer automatiquement
session_md5on=Utiliser le format de hachage <tt>MD5</tt>
session_sha512=Utiliser le format de hachage <tt>SHA512</tt>
session_yescrypt=Utiliser le format de hachage <tt>yescrypt</tt>
session_emd5mod=Le format de hachage MD5 ne peut pas être utilisé car le module Perl $1 n'est pas installé
session_esha512mod=Le format de hachage SHA512 ne peut pas être utilisé car le module Perl $1 n'est pas installé
session_eyescrypt=Le format de hachage yescrypt ne peut pas être utilisé car le module Perl $1 n'est pas installé
session_edigestcrypt=Le format de hachage $1 ne peut pas être utilisé, car la fonction <tt>crypt</tt> du système ne le prend pas en charge
session_passapi=Activer l'API de changement de mot de passe à distance ?
session_passapi0=API désactivée
session_passapi1=API activée pour les utilisateurs Unix
session_passurl=Lorsqu'il est activé, les mots de passe utilisateur peuvent être modifiés via une requête POST à $1
session_forgot=Autoriser la récupération du mot de passe oublié ?
session_eforgot=La récupération de mot de passe oublié ne peut être activée que si le module d'extension <b>Récupération de mot de passe Virtualmin</b> est préalablement supprimé. Cette opération est possible sur la page <a href='$1'>Modules Webmin</a>.
session_passresetdesc=Limitation de la récupération du mot de passe
session_passreset=Bloquer les clients avec plus de $1 requêtes pendant $2 minutes
session_epassreset_failures=Demandes de blocage manquantes ou invalides
@@ -74,6 +92,11 @@ session_passtimeout=Le lien de réinitialisation du mot de passe expire dans $1
session_epassreset_timeout=Délai de réinitialisation du mot de passe manquant ou non valide
log_fixrepo=Référentiel Webmin fixe
log_letsencrypt=J'ai demandé un nouveau certificat SSL à un fournisseur ACME
log_letsencryptdns=Création d'un enregistrement DNS ACME pour $1
log_letsencryptcleanup=Enregistrement DNS ACME supprimé pour $1
themes_configure=Ouvrir la page de configuration du thème
themes_ok=Le thème a été modifié avec succès et la redirection est maintenant terminée ..
themes_ok2=La superposition de thème a été modifiée avec succès, la redirection est désormais effectuée ..
@@ -122,6 +145,7 @@ status_temp2=Collecter les températures du processeur et la vitesse des ventila
status_err=Échec de l'enregistrement de la collection d'états en arrière-plan
status_einterval=L'intervalle de collecte doit être un entier
sendmail_name=Nom d'affichage
sendmail_toaddr=Adresse de destination par défaut pour les notifications
sendmail_to_def=Aucun ensemble
sendmail_etoaddr=Adresse de destination manquante ou mal formatée
@@ -143,10 +167,20 @@ web_redirssl=Rediriger SSL
twofactor_totp=Authentificateur TOTP
twofactor_qrcode=Saisissez le code secret $1 dans l'application TOTP ou scannez le code QR ci-dessous.
twofactor_qrcode_manual=Saisissez le code secret $1 dans l'application TOTP et configurez-le manuellement, car la génération de code QR n'est pas prise en charge sur ce système.
twofactor_etotptoken=Le jeton TOTP doit être un nombre
letsencrypt_title=Demande de certificat de fournisseur SSL
letsencrypt_err=Échec de la demande de certificat
letsencrypt_ecmds=Ni la commande client ACME native <tt>certbot</tt> ni la commande <tt>python</tt> n'ont été trouvées sur votre système
letsencrypt_eacmedir=URL du répertoire ACME manquante ou invalide
letsencrypt_eeabdir=Une URL d'annuaire ACME doit être saisie lors de l'utilisation de la liaison de compte externe
letsencrypt_eeabpair=L'identifiant de la clé de liaison du compte externe et la clé HMAC doivent tous deux être saisis
letsencrypt_eeabnative=La liaison de compte externe ne peut être utilisée que lorsque le client ACME natif est installé
letsencrypt_doingcertbot=Demande d'un nouveau certificat pour $1, à l'aide du serveur Web Certbot ..
letsencrypt_eacmecertbot=Seul le client officiel Let's Encrypt prend en charge la validation Certbot
letsencrypt_enative=Le client ACME natif (certbot) était utilisé précédemment sur ce système et doit être utilisé pour toutes les futures demandes de certificats
letsencrypt_eacmedns=Seul le client ACME natif prend en charge la validation basée sur le DNS
letsencrypt_eacmecertbot=Seul le client ACME natif prend en charge la validation Certbot
os_eol=Notification du compte à rebours du système d'exploitation EOL
os_eol_countdown=des mois avant

View File

@@ -340,7 +340,6 @@ ssl_essl=Čini se da perl modul Net::SSLeay nije instaliran na vašem sustavu. D
ssl_cpan=Alternativno, možete Webmin <a href='$1'>preuzeti i instalirati</a> potreban Net::SSLeay Perl modul za vas.
ssl_emessage=Poruka pogreške Perla bila je : $1
ssl_desc1=Čini se da je domaćin na kojem radi Webmin instaliran SSLeay Perl modul. Koristeći to, Webmin podržava SSL šifriranu komunikaciju između preglednika i poslužitelja. Ako pristupate svom Webmin poslužitelju putem Interneta, tada bi svakako trebali razmotriti korištenje SSL-a kako biste spriječili da napadač uhvati vašu Webmin lozinku.
ssl_desc2=Upozorenje - uključite SSL podršku samo ako imate preglednik koji podržava SSL i ako između preglednika i domaćina Webmin nema vatrozid koji blokira <b>https</b> zahtjeve.
ssl_header=SSL podrška
ssl_on=Želite li omogućiti SSL?
ssl_key=Datoteka privatnog ključa
@@ -351,6 +350,7 @@ ssl_deny=Verzije SSL protokola odbiti
ssl_compression=Dopuštate komprimirane SSL veze?
ssl_honorcipherorder=Prisilno korištenje poslužiteljski definiranog šifriranog reda?
ssl_extracas=Dodatne datoteke certifikata <br> (za lančane certifikate)
ssl_enforce=Provođenje SSL-a
ssl_hsts=Nametnite SSL s HSTS zaglavljem
ssl_redirect=Preusmjeriti non-SSL zahtjeve na SSL način?
ssl_extracasdef=Isto je kao i globalne SSL postavke
@@ -410,7 +410,7 @@ ssl_tabcreate=Potvrdu o vlastitom potpisu
ssl_tabcsr=Zahtjev za potpisivanje potvrde
ssl_tabupload=Pošaljite potvrdu
ssl_tabcurrent=Trenutni certifikat
ssl_tablets=Idemo Šifrirati
ssl_tablets=Pružatelj SSL-a
ssl_cheader=Pojedinosti o trenutnom certifikatu
ssl_typeself=Samopotpisan
ssl_typereal=Potpisao CA
@@ -422,14 +422,14 @@ ssl_edownload=Nije uspjelo izdvajanje PEM podataka iz certifikata
ssl_csralready=Pogledajte najnoviji ključ i CSR ..
ssl_already1=Prethodno generirani privatni ključ :
ssl_already2=Prethodno generirani zahtjev za potpisivanje potvrde :
ssl_letsdesc=Let's Encrypt je besplatno, automatizirano i otvoreno tijelo certifikata koje se može koristiti za generiranje SSL certifikata za korištenje od strane Webmin-a.
ssl_letserr=Nažalost, Let's Encrypt ne može se koristiti u vašem sustavu: $1.
ssl_letserr2=Alternativno, provjerite stranicu konfiguracije modula <a href='$1'></a> da biste osigurali da koristite ispravan put do naredbe <tt>letsencrypt</tt>.
ssl_letsdesc2=Ova se stranica može koristiti za traženje novog certifikata, koji će prebrisati sve ostale trenutno konfigurirane u Webminu. Međutim, usluga Let's Encrypt zahtijeva da se vaše vlasništvo nad domenom certifikata potvrdi provjerom da li ovaj sustav ugošćuje web mjesto za domenu. To se postiže postavljanjem male privremene datoteke u direktorij dokumenata web mjesta.
ssl_letsdesc=Ovaj obrazac vam omogućuje da zatražite pouzdani SSL certifikat za Webmin od ACME-kompatibilnog pružatelja usluga kao što je Let's Encrypt.
ssl_letserr=Nažalost, ovaj sustav ne može zatražiti certifikate od SSL davatelja usluga: $1.
ssl_letserr2=Alternativno, provjerite stranicu za <a href='$1'>konfiguraciju modula</a> kako biste bili sigurni da koristite ispravnu putanju do konfigurirane naredbe ACME klijenta.
ssl_letsdesc2=Novi certifikat zamijenit će onaj koji je trenutno konfiguriran u Webminu. Prije nego što se može izdati, ACME davatelj usluga mora provjeriti kontrolu nad svakim nazivom hosta koristeći privremenu datoteku u direktoriju dokumenata web-mjesta ili privremeni DNS TXT zapis.
ssl_letsheader=Opcije za novi SSL certifikat
ssl_letsdoms=Imena hosta za certifikat
ssl_subset=Preskočiti imena hostova koja se ne mogu provjeriti?
ssl_letsmode=Metoda provjere valjanosti Let's Encrypt
ssl_letsmode=Metoda validacije domene
ssl_letsmode0=Apache virtualni host koji odgovara nazivu hosta
ssl_letsmode1=Odabrani Apache virtualni host
ssl_letsmode2=Ostali direktorij dokumenata web poslužitelja
@@ -440,9 +440,17 @@ ssl_letsonly=Samo ažurirajte obnovu
ssl_usewebmin=Kopirate novi ključ i certifikat u Webmin?
ssl_letsrenew=Mjeseci između automatske obnove
ssl_letsnotrenew=Obnavljajte samo ručno
ssl_staging=Hajde da šifriramo poslužitelj
ssl_staging0=Stvaran
ssl_staging1=Snimanje (samo test)
ssl_staging=Poslužitelj davatelja usluga
ssl_staging0=Proizvodnja
ssl_staging1=Priprema (samo za testiranje)
ssl_acmeopts=Postavke pružatelja usluga
ssl_acmeextra=Prikaži napredne postavke
ssl_acmedir=Prilagođeni URL ACME direktorija
ssl_acmedirdesc=Ako je postavljeno, ovo poništava gore navedeni zadani poslužitelj pružatelja usluga.
ssl_acmekid=ID ključa za povezivanje vanjskog računa
ssl_acmekiddesc=Neobavezno. Neki ACME pružatelji usluga zahtijevaju ovo uz URL direktorija.
ssl_acmehmac=HMAC ključ za povezivanje vanjskog računa
ssl_acmehmacdesc=Neobavezno. Zahtijeva izvorni Certbot klijent prilikom korištenja.
newkey_err=Izrada SSL ključa nije uspjela
newkey_ecn=Nedostaje ili nevaljano ime poslužitelja
@@ -664,13 +672,14 @@ session_pmode0=Uvijek odbijajte korisnike s istečenim zaporkama
session_pmode1=Uvijek dopustite korisnicima kojima su lozinke istekle
session_pmode2=Zatražite korisnike s istečenim zaporkama da uđu novu
session_md5=Format kreiranja zaporke za Webmin
session_rpc_timeout=Vremensko ograničenje RPC sesije
session_erpc_timeout=Nedostaje vrijeme isteka RPC sesije ili mora biti broj veći od 0
session_md5off=Odredite automatski
session_md5on=Koristite <tt>MD5</tt> format raspršivanja
session_sha512=Koristite <tt>SHA512</tt> format raspršivanja
session_yescrypt=Koristite <tt>yescrypt</tt> format raspršivanja
session_emd5mod=MD5 format raspršivanja ne može se koristiti jer Perl $1 modul nije instaliran
session_esha512mod=SHA512 format raspršivanja ne može se koristiti jer Perl $1 modul nije instaliran
session_eyescrypt=yescrypt format raspršivanja ne može se koristiti jer Perl $1 modul nije instaliran
session_edigestcrypt=Format hashiranja $1 ne može se koristiti jer ga sistemska funkcija <tt>crypt</tt> ne podržava
session_blocklock=Zaključajte i korisnike s neuspjelim prijavama
session_passapi=Omogućiti API za daljinsku promjenu lozinke?
session_passapi0=API onemogućen
@@ -746,13 +755,14 @@ log_delete_webmincron=Izbrisane su $1 zakazane funkcije
log_run_webmincron=Ran $1 zakazane funkcije
log_save_webmincron=Ažurirana zakazana funkcija u modulu $1
log_onedelete_webmincron=Izbrisana zakazana funkcija u modulu $1
log_letsencrypt=Zatražen je novi SSL certifikat od Let's Encrypt
log_letsencryptdns=Napravljeno šifrirajmo DNS zapis za $1
log_letsencryptcleanup=Uklonjeno je Šifriraj DNS zapis za $1
log_letsencrypt=Zatražen je novi SSL certifikat od ACME pružatelja usluga
log_letsencryptdns=Izrađen ACME DNS zapis za $1
log_letsencryptcleanup=Uklonjen ACME DNS zapis za $1
themes_title=Webmin teme
themes_desc=Teme kontroliraju izgled webminsog korisničkog sučelja, uključujući ikone, boje, pozadinu i izgled stranica. Okvir za odabir u nastavku može se koristiti za odabir jedne od tema instaliranih na vašem sustavu.
themes_sel=Trenutna tema :
themes_configure=Otvori stranicu za konfiguraciju teme
themes_default=Stara tema Webmina
themes_none=Ništa - neka tema odluči
themes_change=Promijeniti
@@ -1104,6 +1114,7 @@ sendmail_authdef=Zadano (trenutno Cram-MD5)
sendmail_from=S adrese za e-poštu od Webmin-a
sendmail_fromdef=Zadano ($1)
sendmail_fromaddr=Adresa
sendmail_name=Prikazni naziv
sendmail_toaddr=Zadana odredišna adresa za obavijesti
sendmail_to_def=Nije postavljeno
sendmail_etoaddr=Odredišna adresa nedostaje ili je pogrešno oblikovana
@@ -1205,6 +1216,7 @@ twofactor_enrolllink=Sada se možete prijaviti za dvofaktornu provjeru autentič
twofactor_url=Da biste saznali više o $1, pogledajte web stranicu na <a href='$2' target=_blank>$2</a>.
twofactor_etotpmodule=Perl modul <tt>$1</tt> potreban za dvofaktorsku provjeru identiteta nije instaliran. Upotrijebite stranicu <a href='$2'>Perl moduli</a> u Webminu kako biste je instalirali.
twofactor_qrcode=Unesite tajni kod $1 u TOTP aplikaciju ili skenirajte QR kod ispod.
twofactor_qrcode_manual=Unesite tajni kod $1 u TOTP aplikaciju i postavite ga ručno jer generiranje QR koda nije podržano na ovom sustavu.
twofactor_etotpid=Nevaljana tajna TOTP kodirana na bazi32
twofactor_etotptoken=TOTP token mora biti broj
twofactor_etotpmatch=Neispravan OTP kôd
@@ -1214,9 +1226,9 @@ twofactor_secret0=Upotrijebite tipku od 16 znakova
twofactor_esecret=Tajni ključ mora biti tačan 16 znakova i sadrži samo slova i brojeve
twofactor_esession=Dvofaktorska provjera autentičnosti ne može se koristiti ako nije aktivna provjera autentičnosti na sesiji
letsencrypt_title=Idemo šifrirati zahtjev certifikata
letsencrypt_err=Zatraživanje certifikata nije uspjelo
letsencrypt_ecmds=U vašem sustavu nisu pronađene naredba Let's Encrypt client <tt>certbot</tt> niti naredba <tt>python</tt>.
letsencrypt_title=Zahtjev za SSL certifikat pružatelja usluga
letsencrypt_err=Zahtjev za certifikat nije uspio
letsencrypt_ecmds=Ni izvorna ACME klijentska naredba <tt>certbot</tt> ni naredba <tt>python</tt> nisu pronađene na vašem sustavu
letsencrypt_epythonmod=Python modul $1 potreban ugrađenom klijentu Encrypt klijent nije instaliran
letsencrypt_epythonver=Nije uspjelo nabaviti verziju Pythona : $1
letsencrypt_epythonver2=Potrebna je inačica Pythona $1 ili novije verzije, ali imate samo verziju $2.
@@ -1224,6 +1236,10 @@ letsencrypt_certbot=Certbot
letsencrypt_edroot=Apacheov virtualni domaćin $1 nema direktorij dokumenata!
letsencrypt_edom=Nedostaje ili nevažeće ime domene
letsencrypt_erenew=Nedostaje ili ne-numerički interval obnove
letsencrypt_eacmedir=Nedostaje ili je nevažeći URL ACME direktorija
letsencrypt_eeabdir=Prilikom korištenja povezivanja vanjskog računa potrebno je unijeti URL ACME direktorija
letsencrypt_eeabpair=Moraju se unijeti i ID ključa za povezivanje vanjskog računa i HMAC ključ
letsencrypt_eeabnative=Povezivanje vanjskog računa može se koristiti samo kada je instaliran izvorni ACME klijent
letsencrypt_ewebroot=Imenik dokumenata web stranice ne postoji
letsencrypt_evhost=Nije pronađen nijedan virtualni host podudaranja $1
letsencrypt_efull=Očekivana potpuna datoteka certifikata $1 nije pronađena
@@ -1246,9 +1262,9 @@ letsencrypt_echain=Preuzimanje mrežnog certifikata nije uspjelo : $1
letsencrypt_echain2=Lančani certifikat preuzet s $1 je prazan
letsencrypt_ecsr=Generiranje CSR-a nije uspjelo : $1
letsencrypt_ekeygen=Generiranje privatnog ključa nije uspjelo : $1
letsencrypt_enative=Izvorni klijent Let's Encrypt klijent (certbot) prethodno se koristio u ovom sustavu i mora se koristiti za sve buduće zahtjeve certifikata.
letsencrypt_eacmedns=Samo službeni klijent Let's Encrypt klijent podržava provjeru utemeljenu na DNS-u
letsencrypt_eacmecertbot=Samo službeni Let's Encrypt klijent podržava Certbot provjeru valjanosti
letsencrypt_enative=Izvorni ACME klijent (certbot) prethodno je korišten na ovom sustavu i mora se koristiti za sve buduće zahtjeve za certifikatom
letsencrypt_eacmedns=Samo izvorni ACME klijent podržava validaciju temeljenu na DNS-u
letsencrypt_eacmecertbot=Samo izvorni ACME klijent podržava Certbot validaciju
announce_hide=Sakrij ovu najavu
alert_hide=Sakrij upozorenje

View File

@@ -95,7 +95,6 @@ lang_ok=Nyelvezet változtatása
ssl_title=SSL titkosítás
ssl_desc1=A hoszton, amelyen a Webmin fut, fellelhető az SSLeay Perl modul telepített változata. Ennek használatával a Webmin támogatni fogja a titkosított kommunikációt a böngésző és a kiszolgáló között. Ha Ön a Webmin kiszolgálóját az Internet-en keresztül haszálja, akkor különösen ajánlott az SSL használata, mellyel megakadályozható egy esetleges támadó abban, hogy elcsípje az Ön Webmin jelszavát.
ssl_desc2=Figyelem! Csak akkor kapcsolja be az SSL támogatást, ha van olyan böngészője, amely támogatja az SSL-t (mint például a Netscape vagy az Internet Explorer), és nincs olyan tűzfal, amely blokkolja a <b>https</b> kéréseket az Ön böngészője és a Webmin hosztja között.
ssl_header=SSL támogatás
startpage_title=Index oldali opciók

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