mirror of
https://github.com/webmin/webmin.git
synced 2026-05-06 23:30:29 +01:00
Merge branch 'master' of github.com:webmin/webmin
Some checks failed
webmin.dev: webmin/webmin / build (push) Has been cancelled
Some checks failed
webmin.dev: webmin/webmin / build (push) Has been cancelled
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ tarballs/
|
||||
minimal/
|
||||
.DS_Store
|
||||
.vscode/settings.json
|
||||
debug.cgi
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
BIN
filemin/images/icons/mime/application-mathml+xml.png
Normal file
BIN
filemin/images/icons/mime/application-mathml+xml.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 913 B |
BIN
filemin/images/icons/mime/text-mathml+xml.png
Normal file
BIN
filemin/images/icons/mime/text-mathml+xml.png
Normal file
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 |
@@ -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()
|
||||
|
||||
@@ -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
16
nftables/apply.cgi
Executable 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
12
nftables/config.info
Normal 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
55
nftables/create_table.cgi
Executable 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
54
nftables/delete_chain.cgi
Normal 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
48
nftables/delete_set.cgi
Executable 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
36
nftables/delete_table.cgi
Executable 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
87
nftables/edit_chain.cgi
Normal 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
646
nftables/edit_rule.cgi
Executable 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
86
nftables/edit_set.cgi
Executable 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'});
|
||||
7
nftables/help/action.html
Normal file
7
nftables/help/action.html
Normal 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>
|
||||
3
nftables/help/chain_hook.html
Normal file
3
nftables/help/chain_hook.html
Normal 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>
|
||||
3
nftables/help/chain_name.html
Normal file
3
nftables/help/chain_name.html
Normal 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>
|
||||
3
nftables/help/chain_policy.html
Normal file
3
nftables/help/chain_policy.html
Normal 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>
|
||||
3
nftables/help/chain_priority.html
Normal file
3
nftables/help/chain_priority.html
Normal 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>
|
||||
3
nftables/help/chain_type.html
Normal file
3
nftables/help/chain_type.html
Normal 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>
|
||||
6
nftables/help/comment.html
Normal file
6
nftables/help/comment.html
Normal 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>
|
||||
3
nftables/help/counter.html
Normal file
3
nftables/help/counter.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<header>Counter</header>
|
||||
<p>Add a counter to track packets and bytes.</p>
|
||||
<footer>nft(8)</footer>
|
||||
3
nftables/help/counter_1.html
Normal file
3
nftables/help/counter_1.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<header>Counter</header>
|
||||
<p>Add a counter to track packets and bytes.</p>
|
||||
<footer>nft(8)</footer>
|
||||
10
nftables/help/ct_state.html
Normal file
10
nftables/help/ct_state.html
Normal 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
3
nftables/help/daddr.html
Normal 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
3
nftables/help/dport.html
Normal 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>
|
||||
4
nftables/help/edit_direct.html
Normal file
4
nftables/help/edit_direct.html
Normal 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/edit_direct_1.html
Normal file
4
nftables/help/edit_direct_1.html
Normal 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
4
nftables/help/goto.html
Normal 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>
|
||||
5
nftables/help/icmp_type.html
Normal file
5
nftables/help/icmp_type.html
Normal 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
3
nftables/help/iif.html
Normal 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
4
nftables/help/intro.html
Normal 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
4
nftables/help/jump.html
Normal 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>
|
||||
3
nftables/help/limit_burst.html
Normal file
3
nftables/help/limit_burst.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<header>Limit burst</header>
|
||||
<p>Optional burst size in packets.</p>
|
||||
<footer>nft(8)</footer>
|
||||
3
nftables/help/limit_rate.html
Normal file
3
nftables/help/limit_rate.html
Normal 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
4
nftables/help/log.html
Normal 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
4
nftables/help/log_1.html
Normal 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>
|
||||
3
nftables/help/log_level.html
Normal file
3
nftables/help/log_level.html
Normal 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>
|
||||
3
nftables/help/log_prefix.html
Normal file
3
nftables/help/log_prefix.html
Normal 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
3
nftables/help/oif.html
Normal 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
7
nftables/help/proto.html
Normal 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>
|
||||
4
nftables/help/raw_rule.html
Normal file
4
nftables/help/raw_rule.html
Normal 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
3
nftables/help/saddr.html
Normal 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>
|
||||
3
nftables/help/set_elements.html
Normal file
3
nftables/help/set_elements.html
Normal 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>
|
||||
3
nftables/help/set_flags.html
Normal file
3
nftables/help/set_flags.html
Normal 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>
|
||||
3
nftables/help/set_name.html
Normal file
3
nftables/help/set_name.html
Normal 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>
|
||||
3
nftables/help/set_type.html
Normal file
3
nftables/help/set_type.html
Normal 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
3
nftables/help/sport.html
Normal 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>
|
||||
14
nftables/help/tcp_flags.html
Normal file
14
nftables/help/tcp_flags.html
Normal 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>
|
||||
4
nftables/help/tcp_flags_mask.html
Normal file
4
nftables/help/tcp_flags_mask.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<header>TCP flags mask</header>
|
||||
<p>Optional mask used with tcp flags & mask == value.</p>
|
||||
<p>Example mask: syn|rst.</p>
|
||||
<footer>nft(8)</footer>
|
||||
BIN
nftables/images/icon.gif
Normal file
BIN
nftables/images/icon.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
206
nftables/index.cgi
Executable file
206
nftables/index.cgi
Executable 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
18
nftables/install_check.pl
Normal 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
222
nftables/lang/en
Normal 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
5
nftables/module.info
Normal 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
40
nftables/move_rule.cgi
Executable 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
1140
nftables/nftables-lib.pl
Normal file
File diff suppressed because it is too large
Load Diff
33
nftables/rename_chain.cgi
Normal file
33
nftables/rename_chain.cgi
Normal 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
99
nftables/save_chain.cgi
Normal 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
180
nftables/save_rule.cgi
Executable 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
62
nftables/save_set.cgi
Executable 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
197
nftables/setup.cgi
Normal 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
61
nftables/t/perlcritic.t
Normal 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();
|
||||
8
nftables/t/rulesets/basic.nft
Normal file
8
nftables/t/rulesets/basic.nft
Normal 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
|
||||
}
|
||||
}
|
||||
18
nftables/t/rulesets/sets.nft
Normal file
18
nftables/t/rulesets/sets.nft
Normal 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
185
nftables/t/run-tests.t
Executable 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();
|
||||
@@ -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
735
vendor_perl/Convert/TNEF.pm
Normal 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
672
vendor_perl/MIME/Body.pm
Normal 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
1043
vendor_perl/MIME/Tools.pm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
@@ -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:])
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'});
|
||||
|
||||
|
||||
@@ -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=إخفاء التنبيه
|
||||
|
||||
@@ -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=Скриване на предупреждение
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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í
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
44
webmin/lang/de.auto
Normal 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
|
||||
@@ -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=Απόκρυψη ειδοποίησης
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=پرونده کليد اختصاصي
|
||||
|
||||
@@ -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=هشدار را مخفی کنید
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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> n’ont é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
|
||||
|
||||
@@ -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 d’hô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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user