Compare commits

...

59 Commits

Author SHA1 Message Date
Ilia Ross
4333435739 Fix indent 2023-09-17 13:44:03 +03:00
Ilia Ross
f01197df71 Add die handler that stores the error from eval message 2023-09-17 13:42:30 +03:00
Jamie Cameron
cb41eff450 Fix decompression of folders 2023-09-16 18:44:42 -07:00
Jamie Cameron
352326f574 Return decompression status 2023-09-16 18:44:16 -07:00
Jamie Cameron
410fd07287 Merge branch 'master' of github.com:webmin/webmin 2023-09-16 09:29:49 -07:00
Jamie Cameron
faededeb77 Fix variable name 2023-09-16 09:29:42 -07:00
Ilia Ross
f0f8dc2850 Fix to correctly escape content in editor mode
https://forum.virtualmin.com/t/webmins-file-managers-editor-converting-html-special-characters-making-the-next-save-detrimental/122606/18?u=ilia

605a32f87d
2023-09-16 16:57:08 +03:00
Jamie Cameron
184e8d627d Deal with case where all configs are under /opt 2023-09-15 20:52:23 -07:00
Jamie Cameron
fd2b7c1fc7 Merge pull request #2002 from webmin/dev/protocols-save-to-global
Fix to save protocols to global config file
2023-09-15 20:50:34 -07:00
Jamie Cameron
98192ca099 Fix variable name 2023-09-15 18:54:43 -07:00
Jamie Cameron
05a93a5e3d Merge branch 'master' of github.com:webmin/webmin 2023-09-15 18:53:00 -07:00
Jamie Cameron
50a2820a97 remove typo 2023-09-15 18:52:54 -07:00
Ilia Ross
87f2640ee3 Update CHANGELOG.md 2023-09-16 00:21:59 +03:00
Ilia Ross
4180e3d3ee Fix to always include vendor_perl for 2FA to work [build]
https://forum.virtualmin.com/t/added-two-factor-authentication-i-think-last-access-but-not-100-anyway-2fa-is-failing-about-authen-oath/122538/60?u=ilia
2023-09-16 00:03:45 +03:00
Ilia Ross
b7d7ea5d8d Fix to simplify code 2023-09-15 22:34:32 +03:00
Ilia Ross
4e09cf0b55 Fix sent folder name ; update translations 2023-09-15 21:14:43 +03:00
Ilia Ross
3f0ab3fb92 Fix missing line increment 2023-09-15 19:21:08 +03:00
Ilia Ross
836647525a Fix to save protocols to global config file 2023-09-15 17:50:39 +03:00
Ilia Ross
8b68eac561 Fix how errors are handled when $main::error_last_eval is set
Note: If `$main::error_last_eval` was set, then display full error message using HTML accordion, otherwise display a bubble showing a file name and line which failed
2023-09-15 15:37:33 +03:00
Ilia Ross
0503299773 Fix to correctly set last caller (file:line) in error 2023-09-15 14:16:58 +03:00
Jamie Cameron
2e8000d191 Show full error if Authen::OATH cannot be loaded 2023-09-14 18:50:39 -07:00
Jamie Cameron
65ffcea0db Merge branch 'master' of github.com:webmin/webmin 2023-09-14 18:47:44 -07:00
Jamie Cameron
45845b8ca6 Wait a bit longer for DNS propogation 2023-09-14 17:07:04 -07:00
Ilia Ross
fead9b108d Fix to print errors to STDERR nicely 2023-09-15 01:13:54 +03:00
Ilia Ross
db1c9679ba Fix to revert previous patch 2023-09-15 00:40:16 +03:00
Ilia Ross
d753fa7a8d Fix to actually print the error 2023-09-15 00:11:06 +03:00
Ilia Ross
f6d7e05b14 Fix to remove unused config title 2023-09-13 22:53:32 +03:00
Ilia Ross
a9288423cc Fix to remove unused config title 2023-09-12 16:08:25 +03:00
Ilia Ross
ac9e54afba Update CHANGELOG.md for 2.103 2023-09-11 21:34:42 +03:00
Jamie Cameron
f7cf6419d2 Use taqbs 2023-09-06 16:23:40 -07:00
Jamie Cameron
a9097cbb42 Also support passing in the key ID and hmac for non-standard servers 2023-09-05 20:28:21 -07:00
Jamie Cameron
6f84ca1c9d Merge branch 'master' of github.com:webmin/webmin 2023-09-04 19:09:58 -07:00
Ilia Ross
dff70c3349 Fix Postfix check options page 2023-09-04 22:38:47 +03:00
Jamie Cameron
fe8f3f8494 Use standard buffer size 2023-09-04 11:13:45 -07:00
Ilia Ross
f5f3510a59 Fix default download buffer (once more) as 1 MiB should be just fine 2023-09-04 14:09:55 +03:00
Ilia Ross
1e375b4740 Fix indent one more time
c573496914
2023-09-04 13:14:31 +03:00
Jamie Cameron
c573496914 Fix indenting 2023-09-03 22:54:28 -07:00
Jamie Cameron
73e731722d Use packages with new key for upgrading 2023-09-02 21:44:29 -07:00
Jamie Cameron
6186376b6b Use packages with new key for upgrading 2023-09-02 21:43:58 -07:00
Ilia Ross
31e0151804 Fix to use help UI lib for showing explanatory message 2023-09-02 16:11:02 +03:00
Ilia Ross
872ca66b07 Add UI option to control network buffer size for downloads 2023-09-02 15:49:47 +03:00
Ilia Ross
088aba8cec Fix to use safer default buffer 2023-09-02 15:19:11 +03:00
Ilia Ross
99b8959559 Fix to send a file in chunks
https://forum.virtualmin.com/t/upgrade-2-102-killed-download-from-server-feature/122413/7?u=ilia
2023-09-02 15:18:49 +03:00
Jamie Cameron
94f23e63e7 Hide ps command in output 2023-08-31 22:44:44 -07:00
Jamie Cameron
7c449cf4a3 Merge branch 'master' of github.com:webmin/webmin 2023-08-31 22:40:06 -07:00
Jamie Cameron
2db507e5e8 Use proper UI functions for CPU and RAM modes 2023-08-31 22:39:45 -07:00
Ilia Ross
bdeb908df0 Fix to add --no-reuse-key as well
https://forum.virtualmin.com/t/unable-to-switch-ssl-certificate-into-elliptic-curve/122383?u=ilia
2023-08-31 17:15:24 +03:00
Jamie Cameron
a133cdfdef Also uncompress sub-folders 2023-08-30 22:54:25 -07:00
Jamie Cameron
fe2656acd8 Add flag for the key name 2023-08-30 20:15:41 -07:00
Jamie Cameron
64a44a667e Merge branch 'master' of github.com:webmin/webmin 2023-08-30 20:10:39 -07:00
Jamie Cameron
59cef9a04f Add flag for the default GPG key 2023-08-30 20:10:01 -07:00
Ilia Ross
af629fe3cd Fix code indent 2023-08-28 16:08:28 +03:00
Ilia Ross
80368e2a04 Merge branch 'master' of github.com:webmin/webmin 2023-08-28 16:05:39 +03:00
Ilia Ross
5237ae8ea2 Fix bug when backend isn't saved correctly #1992 2023-08-28 16:05:33 +03:00
Jamie Cameron
54ad4f7f74 Work on function to uncompress mail folders 2023-08-27 21:54:18 -07:00
Jamie Cameron
0dd94f5957 Merge branch 'master' of github.com:webmin/webmin 2023-08-26 18:51:08 -07:00
Jamie Cameron
5b2b3f0790 Add flag for ACME service URL 2023-08-26 18:51:01 -07:00
Jamie Cameron
ac05a0c43a Merge pull request #1991 from webmin/dev/cache-system-hostname-using-state
Fix to use a new way for clearing hostname cache
2023-08-26 15:34:26 -07:00
Ilia Ross
710829c16a Fix to send headers unless already done in var_dump 2023-08-26 21:45:44 +03:00
92 changed files with 337 additions and 149 deletions

View File

@@ -1,5 +1,14 @@
## Changelog ## Changelog
#### 2.103 (September 18, 2023)
* Add support for hostname detection using `hostnamectl` command
* Add support for other ACME services
* Fix to correctly switch key hash type with ACME services
* Fix bug when `backend` wasn't saved correctly in Fail2Ban module [#1992](https://github.com/webmin/webmin/issues/1992)
* Fix large files download in Upload and Download module
* Fix Google Authentication on RHEL systems derivatives
* Update the Authentic theme to the latest version with various fixes and improvements
#### 2.102 (August 23, 2023) #### 2.102 (August 23, 2023)
* Add support for Amazon Linux 2023 * Add support for Amazon Linux 2023
* Fix a bug in Network Configuration module when parsing network size [sourceforge.net/discussion#55377]( https://sourceforge.net/p/webadmin/discussion/55377/thread/78e5aa05f3) * Fix a bug in Network Configuration module when parsing network size [sourceforge.net/discussion#55377]( https://sourceforge.net/p/webadmin/discussion/55377/thread/78e5aa05f3)

View File

@@ -19,6 +19,10 @@ while(@ARGV) {
shift(@ARGV); shift(@ARGV);
$createsig = 1; $createsig = 1;
} }
elsif ($ARGV[0] eq "--key") {
shift(@ARGV);
$keyname = shift(@ARGV);
}
elsif ($ARGV[0] eq "--exclude") { elsif ($ARGV[0] eq "--exclude") {
shift(@ARGV); shift(@ARGV);
push(@exclude, shift(@ARGV)); push(@exclude, shift(@ARGV));
@@ -98,7 +102,8 @@ if ($file =~ /^(.*)\.gz$/i) {
} }
if ($createsig) { if ($createsig) {
system("rm -f $file-sig.asc"); system("rm -f $file-sig.asc");
system("gpg --armor --output $file-sig.asc --detach-sig $file"); system("gpg ".($keyname ? " --default-key $keyname" : "").
" --armor --output $file-sig.asc --detach-sig $file");
} }
# read_file(file, &assoc, [&order], [lowercase]) # read_file(file, &assoc, [&order], [lowercase])

View File

@@ -216,6 +216,11 @@ return wantarray ? @rv : $rv[0];
sub save_directive sub save_directive
{ {
local ($conf, $name, $value, $sname, $svalue) = @_; local ($conf, $name, $value, $sname, $svalue) = @_;
$newconf = [ grep { $_->{'file'} !~ /^\/usr\/share\/dovecot/ &&
$_->{'file'} !~ /^\/opt/ } @$conf ];
if (@$newconf) {
$conf = $newconf;
}
local $dir; local $dir;
if (ref($name)) { if (ref($name)) {
# Old directive given # Old directive given
@@ -577,5 +582,4 @@ else {
} }
1; 1;
r

View File

@@ -1,4 +1,3 @@
line2=System configuration,11
exports_file=Exported filesystems file,0 exports_file=Exported filesystems file,0
apply_cmd=Command to apply configuration,3,None apply_cmd=Command to apply configuration,3,None
restart_command=Command to restart export server,0 restart_command=Command to restart export server,0

View File

@@ -51,9 +51,11 @@ print &ui_table_row($text{'jail_ignoreip'},
my $backend = &find_value("backend", $jail); my $backend = &find_value("backend", $jail);
print &ui_table_row($text{'jail_backend'}, print &ui_table_row($text{'jail_backend'},
&ui_select("backend", $backend || "auto", &ui_select("backend", $backend || "auto",
[ [ "auto", $text{'jail_auto'} ], [ [ "auto", $text{'jail_auto'} ],
[ "gamin", $text{'jail_gamin'} ], [ "systemd", $text{'jail_systemd'} ],
[ "polling", $text{'jail_polling'} ] ])); [ "polling", $text{'jail_polling'} ],
[ "gamin", $text{'jail_gamin'} ],
[ "pyinotify", $text{'jail_pyinotify'} ] ]));
# Email destination # Email destination
my $destemail = &find_value("destemail", $jail); my $destemail = &find_value("destemail", $jail);

View File

@@ -114,8 +114,10 @@ jail_efindtime=Delay between matches must be a number greater than zero
jail_ebantime=Time to ban an IP must be a number greater than zero jail_ebantime=Time to ban an IP must be a number greater than zero
jail_backend=Check for log file updates using jail_backend=Check for log file updates using
jail_auto=Decide automatically jail_auto=Decide automatically
jail_gamin=Gamin file alteration monitor jail_systemd=systemd
jail_polling=Background polling jail_polling=polling
jail_gamin=gamin
jail_pyinotify=pyinotify
jail_destemail=Default notification email jail_destemail=Default notification email
jail_none=None set jail_none=None set
jail_banaction=Default action to apply jail_banaction=Default action to apply

View File

@@ -2459,10 +2459,8 @@ my $systemd_local_conf = "/etc/systemd/system";
my $systemd_unit_dir1 = "/usr/lib/systemd/system"; my $systemd_unit_dir1 = "/usr/lib/systemd/system";
my $systemd_unit_dir2 = "/lib/systemd/system"; my $systemd_unit_dir2 = "/lib/systemd/system";
if ($name) { if ($name) {
foreach my $p ( foreach my $p ($systemd_local_conf, $systemd_unit_dir1,
$systemd_local_conf, $systemd_unit_dir2) {
$systemd_unit_dir1,
$systemd_unit_dir2) {
if (-r "$p/$name.service" || if (-r "$p/$name.service" ||
-r "$p/$name" || -r "$p/$name" ||
-r "$p/$name.target" || -r "$p/$name.target" ||

View File

@@ -983,7 +983,7 @@ elsif ($mode == 3) {
{ 'headers' => [ [ 'Content-type', 'application/zip' ], { 'headers' => [ [ 'Content-type', 'application/zip' ],
[ 'Content-Transfer-Encoding', 'base64' ] ], [ 'Content-Transfer-Encoding', 'base64' ] ],
'data' => $data } ] }; 'data' => $data } ] };
$main::errors_must_die = 1; $main::error_must_die = 1;
if (&foreign_check("mailboxes")) { if (&foreign_check("mailboxes")) {
&foreign_require("mailboxes", "mailboxes-lib.pl"); &foreign_require("mailboxes", "mailboxes-lib.pl");
eval { &mailboxes::send_mail($mail); }; eval { &mailboxes::send_mail($mail); };

View File

@@ -111,7 +111,7 @@ elsif ($mode == 3) {
'data' => $body }, 'data' => $body },
{ 'headers' => [ [ 'Content-type', 'text/plain' ] ], { 'headers' => [ [ 'Content-type', 'text/plain' ] ],
'data' => $data } ] }; 'data' => $data } ] };
$main::errors_must_die = 1; $main::error_must_die = 1;
if (&foreign_check("mailboxes")) { if (&foreign_check("mailboxes")) {
&foreign_require("mailboxes", "mailboxes-lib.pl"); &foreign_require("mailboxes", "mailboxes-lib.pl");
eval { &mailboxes::send_mail($mail); }; eval { &mailboxes::send_mail($mail); };

View File

@@ -392,4 +392,6 @@ file_truncated_message_tail=fetched ending $1 of data, truncated $2 out of $3
defcert_error=Default $1 bundled SSL certificate is being used. It is highly advised to update default <tt>$2</tt> certificate before proceeding with login. defcert_error=Default $1 bundled SSL certificate is being used. It is highly advised to update default <tt>$2</tt> certificate before proceeding with login.
main_error_details=Error details
__norefs=1 __norefs=1

View File

@@ -3006,6 +3006,41 @@ if ($switched) {
return $rv; return $rv;
} }
# is_gzipped_file(file)
# Returns 1 if a file is gzip compressed
sub is_gzipped_file
{
my ($file) = @_;
my $fh;
my $rv = open($fh, "<", $file);
return 0 if (!$rv);
my $two;
read($fh, $two, 2);
close($fh);
return $two eq "\037\213" ? 1 : 0;
}
# gunzip_mail_file(file)
# Uncompress a mail file in place
sub gunzip_mail_file
{
my ($file) = @_;
my $switched = &switch_to_mail_user();
my $outfile = $file.".$$.uncompressed";
my $ex = system("gunzip -c ".quotemeta($file)."> ".quotemeta($outfile)." 2>/dev/null");
if ($ex) {
unlink($outfile);
}
else {
rename($outfile, $file);
}
if ($switched) {
$) = 0;
$> = 0;
}
return !$ex;
}
# create_as_mail_user(fh, file) # create_as_mail_user(fh, file)
# Creates a new file, but ensures that it does not yet exist first, and then # Creates a new file, but ensures that it does not yet exist first, and then
# sets the ownership to the mail user # sets the ownership to the mail user

View File

@@ -1543,6 +1543,33 @@ if ($src->{'sortable'}) {
} }
} }
# mailbox_uncompress_folder(&folder)
# If a folder or it's files are gzipped, uncompress them in place
sub mailbox_uncompress_folder
{
my ($folder) = @_;
if ($folder->{'type'} == 1 || $folder->{'type'} == 3) {
my @files = $folder->{'type'} == 1 ?
&get_maildir_files($folder->{'file'}) :
&get_mhdir_files($folder->{'file'});
if ($folder->{'type'} == 1) {
foreach my $sf (glob("$folder->{'file'}/.??*")) {
push(@files, &get_maildir_files($sf));
}
}
foreach my $f (@files) {
if (&is_gzipped_file($f)) {
&gunzip_mail_file($f);
}
}
}
elsif ($folder->{'type'} == 0) {
if (&is_gzipped_file($folder->{'file'})) {
&gunzip_mail_file($folder->{'file'});
}
}
}
# mailbox_copy_mail(&source, &dest, mail, ...) # mailbox_copy_mail(&source, &dest, mail, ...)
# Copy mail from one folder to another # Copy mail from one folder to another
sub mailbox_copy_mail sub mailbox_copy_mail
@@ -3366,7 +3393,10 @@ local $dmail = {
[ 'Content-Transfer-Encoding' => '7bit' ] ], [ 'Content-Transfer-Encoding' => '7bit' ] ],
'data' => $dsn } 'data' => $dsn }
] }; ] };
eval { local $main::errors_must_die = 1; &send_mail($dmail); }; eval {
local $main::error_must_die = 1;
&send_mail($dmail);
};
return $to; return $to;
} }

View File

@@ -320,7 +320,7 @@ search_elatest=Ontbrekende of ongeldige aantal boodskappe om te soek
search_withstatus=, met status $1 search_withstatus=, met status $1
folder_inbox=posbus folder_inbox=posbus
folder_sent=Gestuurde pos folder_sent=Gestuur
folder_drafts=Drafts folder_drafts=Drafts
folder_trash=asblik folder_trash=asblik

View File

@@ -320,7 +320,7 @@ search_elatest=عدد الرسائل المفقودة أو غير الصحيحة
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=صندوق الوارد folder_inbox=صندوق الوارد
folder_sent=البريد المرسل folder_sent=مرسل
folder_drafts=المسودات folder_drafts=المسودات
folder_trash=قمامة، يدمر، يهدم folder_trash=قمامة، يدمر، يهدم

View File

@@ -320,7 +320,7 @@ search_elatest=Адсутнічае альбо недапушчальная ко
search_withstatus=, са статусам $1 search_withstatus=, са статусам $1
folder_inbox=Уваходныя folder_inbox=Уваходныя
folder_sent=Даслана пошта folder_sent=Адпраўлена
folder_drafts=Чарнавікі folder_drafts=Чарнавікі
folder_trash=Хлам folder_trash=Хлам

View File

@@ -320,7 +320,7 @@ search_elatest=Липсващ или невалиден брой съобщен
search_withstatus=, със статус $1 search_withstatus=, със статус $1
folder_inbox=Входящи folder_inbox=Входящи
folder_sent=Изпратена поща folder_sent=Изпратено
folder_drafts=дама folder_drafts=дама
folder_trash=боклук folder_trash=боклук

View File

@@ -319,7 +319,6 @@ search_elatest=Hi falta el nombre de missatges a buscar o bé és invàlid
search_withstatus=, amb estat $1 search_withstatus=, amb estat $1
folder_inbox=Entrada folder_inbox=Entrada
folder_sent=Enviat
folder_drafts=Drafts folder_drafts=Drafts
folder_trash=Trash folder_trash=Trash

View File

@@ -1,5 +1,7 @@
index_return=llista d'usuaris index_return=llista d'usuaris
folder_sent=Enviat
editor_heading=Encapçalament editor_heading=Encapçalament
editor_paragraph=Paràgraf editor_paragraph=Paràgraf
editor_fontfamily_default=Per defecte editor_fontfamily_default=Per defecte

View File

@@ -295,7 +295,6 @@ search_elatest=Chybějící nebo nevhodný počet zpráv k prohledání
search_withstatus=, se stavem $1 search_withstatus=, se stavem $1
folder_inbox=Doručená pošta folder_inbox=Doručená pošta
folder_sent=Odesláné pošta
folder_drafts=Koncepty folder_drafts=Koncepty
folder_trash=Koš folder_trash=Koš

View File

@@ -29,6 +29,8 @@ reply_html1=Vytvořte HTML
search_msg6=Výsledky hledání $1 v poli $2 search_msg6=Výsledky hledání $1 v poli $2
search_attach=Musí mít přílohy? search_attach=Musí mít přílohy?
folder_sent=Odesláno
left_mail=Pošta left_mail=Pošta
left_search=Vyhledávání: left_search=Vyhledávání:
left_folders=Správa složek left_folders=Správa složek

View File

@@ -320,7 +320,7 @@ search_elatest=Manglende eller ugyldigt antal meddelelser til søgning
search_withstatus=, med status $1 search_withstatus=, med status $1
folder_inbox=Indbakke folder_inbox=Indbakke
folder_sent=Sendt post folder_sent=Sendt
folder_drafts=Kladder folder_drafts=Kladder
folder_trash=Affald folder_trash=Affald

View File

@@ -319,7 +319,6 @@ search_elatest=Fehlende oder ungültige Anzahl an Mails für die Suche
search_withstatus=, mit Status $1 search_withstatus=, mit Status $1
folder_inbox=Posteingang folder_inbox=Posteingang
folder_sent=Versendete Mail
folder_drafts=Entwürfe folder_drafts=Entwürfe
folder_trash=Papierkorb folder_trash=Papierkorb

View File

@@ -1,5 +1,7 @@
index_return=Benutzerliste index_return=Benutzerliste
folder_sent=Gesendet
editor_heading=Überschrift editor_heading=Überschrift
editor_paragraph=Absatz editor_paragraph=Absatz
editor_fontfamily_default=Standard editor_fontfamily_default=Standard

View File

@@ -268,7 +268,6 @@ search_elatest=Λείπει ή είναι άκυρος ο αριθμός των
search_withstatus=, με κατάσταση $1 search_withstatus=, με κατάσταση $1
folder_inbox=Εισερχόμενα folder_inbox=Εισερχόμενα
folder_sent=Απεσταλμένα
folder_drafts=Πρόχειρα folder_drafts=Πρόχειρα
folder_trash=Απορρίματα folder_trash=Απορρίματα

View File

@@ -60,6 +60,8 @@ confirm_warnallf=Είστε βέβαιοι ότι θέλετε να διαγρά
search_msg6=Αποτελέσματα αναζήτησης για $1 στο πεδίο $2 search_msg6=Αποτελέσματα αναζήτησης για $1 στο πεδίο $2
search_attach=Πρέπει να έχετε συνημμένα; search_attach=Πρέπει να έχετε συνημμένα;
folder_sent=Απεσταλμένα
sform_header=Προηγμένες επιλογές αναζήτησης ηλεκτρονικού ταχυδρομείου sform_header=Προηγμένες επιλογές αναζήτησης ηλεκτρονικού ταχυδρομείου
sform_andmode=Λειτουργία κριτηρίων sform_andmode=Λειτουργία κριτηρίων
sform_folder2=Αναζήτηση σε φάκελο (-ες) sform_folder2=Αναζήτηση σε φάκελο (-ες)

View File

@@ -320,7 +320,7 @@ search_elatest=Missing or invalid number of messages to search
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=Inbox folder_inbox=Inbox
folder_sent=Sent mail folder_sent=Sent
folder_drafts=Drafts folder_drafts=Drafts
folder_trash=Trash folder_trash=Trash

View File

@@ -238,7 +238,7 @@ search_elatest=Número de mensajes faltantes o no válidos para buscar
search_withstatus=, con estado $1 search_withstatus=, con estado $1
folder_inbox=Bandeja de entrada folder_inbox=Bandeja de entrada
folder_sent=Correo enviado folder_sent=Enviado
folder_drafts=Borradores folder_drafts=Borradores
folder_trash=Basura folder_trash=Basura

View File

@@ -320,7 +320,7 @@ search_elatest=Bilatu beharreko mezu kopuru falta edo baliogabea
search_withstatus=, egoera $1 egoerarekin search_withstatus=, egoera $1 egoerarekin
folder_inbox=Sarrerako ontzia folder_inbox=Sarrerako ontzia
folder_sent=Bidalitako mezuak folder_sent=Bidali
folder_drafts=Turkiarrak folder_drafts=Turkiarrak
folder_trash=Trash folder_trash=Trash

View File

@@ -320,7 +320,7 @@ search_elatest=تعداد پیام های نامعتبر یا نامعتبر ا
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=صندوق ورودی folder_inbox=صندوق ورودی
folder_sent=نامه ارسال شده folder_sent=ارسال شد
folder_drafts=پیش نویس folder_drafts=پیش نویس
folder_trash=زباله ها folder_trash=زباله ها

View File

@@ -205,7 +205,6 @@ search_nolatest=Kaikki kansiossa
search_latestnum=Vain viimeisimmät search_latestnum=Vain viimeisimmät
search_elatest=Puuttuva tai virheellinen määrä etsittäviä viestejä search_elatest=Puuttuva tai virheellinen määrä etsittäviä viestejä
folder_sent=Lähetetyt
folder_drafts=Luonnokset folder_drafts=Luonnokset
folder_trash=Roskakori folder_trash=Roskakori

View File

@@ -125,6 +125,7 @@ search_onestatus=Vain tila
search_withstatus=, tila $1 search_withstatus=, tila $1
folder_inbox=Saapuneet folder_inbox=Saapuneet
folder_sent=Lähetetty
detach_err=Tiedoston irrottaminen epäonnistui detach_err=Tiedoston irrottaminen epäonnistui
detach_edir=Ei tiedostoa tai hakemistoa tallennettavaksi syötettyyn detach_edir=Ei tiedostoa tai hakemistoa tallennettavaksi syötettyyn

View File

@@ -320,7 +320,6 @@ search_elatest=nombre de messages à rechercher manquant ou invalide
search_withstatus=, avec statut $1 search_withstatus=, avec statut $1
folder_inbox=Boite de Réception folder_inbox=Boite de Réception
folder_sent=Courriers Envoyés
folder_drafts=Brouillons folder_drafts=Brouillons
folder_trash=Corbeille folder_trash=Corbeille

View File

@@ -1,3 +1,5 @@
folder_sent=Envoyé
editor_heading=Titre editor_heading=Titre
editor_paragraph=Paragraphe editor_paragraph=Paragraphe
editor_fontfamily_default=Défaut editor_fontfamily_default=Défaut

View File

@@ -320,7 +320,7 @@ search_elatest=מספר הודעות חסר או לא חוקי לחיפוש
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=תיבת הדואר הנכנס folder_inbox=תיבת הדואר הנכנס
folder_sent=שלח מייל folder_sent=נשלח
folder_drafts=טיוטות folder_drafts=טיוטות
folder_trash=זבל folder_trash=זבל

View File

@@ -320,7 +320,7 @@ search_elatest=Nedostaje ili nevažeći broj poruka za pretraživanje
search_withstatus=, sa statusom $1 search_withstatus=, sa statusom $1
folder_inbox=Ulazni spremnik folder_inbox=Ulazni spremnik
folder_sent=Poslana pošta folder_sent=Poslano
folder_drafts=nacrti folder_drafts=nacrti
folder_trash=Otpad folder_trash=Otpad

View File

@@ -147,7 +147,6 @@ search_attach=Szeretne csatolmányokat?
search_allstatus=Minden search_allstatus=Minden
folder_inbox=Bejövő levelek folder_inbox=Bejövő levelek
folder_sent=Elküldött levelek
folder_drafts=Piszkozatok folder_drafts=Piszkozatok
folder_trash=Kuka folder_trash=Kuka

View File

@@ -181,6 +181,8 @@ search_latestnum=Csak a legújabb
search_elatest=Hiányzik vagy érvénytelen a keresett üzenetek száma search_elatest=Hiányzik vagy érvénytelen a keresett üzenetek száma
search_withstatus=, állapotával $1 search_withstatus=, állapotával $1
folder_sent=Küldött
detach_err=A fájl leválasztása nem sikerült detach_err=A fájl leválasztása nem sikerült
detach_edir=Nincs fájl vagy könyvtár, amelyet menteni kellene a megadott fájlba detach_edir=Nincs fájl vagy könyvtár, amelyet menteni kellene a megadott fájlba
detach_eopen=A $1 megnyitása nem sikerült : $2 detach_eopen=A $1 megnyitása nem sikerült : $2

View File

@@ -316,7 +316,6 @@ search_elatest=Numero di messaggi da cercare mancante o non valido
search_withstatus=, con stato $1 search_withstatus=, con stato $1
folder_inbox=Posta in arrivo folder_inbox=Posta in arrivo
folder_sent=Posta inviata
folder_drafts=Bozze folder_drafts=Bozze
folder_trash=Cestino folder_trash=Cestino

View File

@@ -6,6 +6,8 @@ view_nobody=Questo messaggio non ha contenuti del corpo.
search_msg6=Risultati della ricerca per $1 nel campo $2 search_msg6=Risultati della ricerca per $1 nel campo $2
folder_sent=Inviato
left_mail=posta left_mail=posta
left_search=Ricerca: left_search=Ricerca:
left_folders=Gestisci cartelle left_folders=Gestisci cartelle

View File

@@ -295,7 +295,6 @@ search_elatest=Missing or invalid number of messages to search
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=Inbox folder_inbox=Inbox
folder_sent=Sent mail
folder_drafts=Drafts folder_drafts=Drafts
folder_trash=Trash folder_trash=Trash

View File

@@ -29,6 +29,8 @@ reply_html1=HTMLを作成
search_msg6=$2フィールドの$1の検索結果 search_msg6=$2フィールドの$1の検索結果
search_attach=添付ファイルが必要ですか? search_attach=添付ファイルが必要ですか?
folder_sent=送信済み
left_mail=郵便物 left_mail=郵便物
left_search=探す: left_search=探す:
left_folders=フォルダーを管理する left_folders=フォルダーを管理する

View File

@@ -285,7 +285,6 @@ search_elatest=검색 메시지수가 지정되지 않았거나 유효하지 않
search_withstatus=, 상태 $1로 search_withstatus=, 상태 $1로
folder_inbox=인박스 folder_inbox=인박스
folder_sent=메일 보내기
folder_drafts=초안 folder_drafts=초안
folder_trash=휴지통 folder_trash=휴지통

View File

@@ -40,6 +40,8 @@ search_ewhat=입력 된 행과 일치하는 텍스트가 없습니다 $1
search_msg6=$2 필드에서 $1에 대한 검색 결과 search_msg6=$2 필드에서 $1에 대한 검색 결과
search_attach=첨부 파일이 있어야합니까? search_attach=첨부 파일이 있어야합니까?
folder_sent=전송된
sform_andmode=기준 모드 sform_andmode=기준 모드
left_mail=우편 left_mail=우편

View File

@@ -320,7 +320,7 @@ search_elatest=Trūksta arba netinkamas ieškomų pranešimų skaičius
search_withstatus=, su būsena $1 search_withstatus=, su būsena $1
folder_inbox=Pašto dėžutę folder_inbox=Pašto dėžutę
folder_sent=Išsiųsti laiškai folder_sent=Išsiųsta
folder_drafts=Juodraščiai folder_drafts=Juodraščiai
folder_trash=Šiukšlių dėžė folder_trash=Šiukšlių dėžė

View File

@@ -320,7 +320,7 @@ search_elatest=Trūkst vai nav derīgs meklējamo ziņojumu skaits
search_withstatus=, ar statusu $1 search_withstatus=, ar statusu $1
folder_inbox=Iesūtne folder_inbox=Iesūtne
folder_sent=Nosūtītais pasts folder_sent=Nosūtīts
folder_drafts=Melnraksti folder_drafts=Melnraksti
folder_trash=Atkritumi folder_trash=Atkritumi

View File

@@ -320,7 +320,7 @@ search_elatest=Bilangan mesej yang hilang atau tidak sah untuk dicari
search_withstatus=, dengan status $1 search_withstatus=, dengan status $1
folder_inbox=Peti masuk folder_inbox=Peti masuk
folder_sent=Menghantar surat folder_sent=Dihantar
folder_drafts=Draf folder_drafts=Draf
folder_trash=Sampah folder_trash=Sampah

View File

@@ -320,7 +320,7 @@ search_elatest=Numru ta 'messaġġi nieqsa jew invalidi biex tfittex
search_withstatus=, bi status $1 search_withstatus=, bi status $1
folder_inbox=Inbox folder_inbox=Inbox
folder_sent=Intbagħat il-posta folder_sent=Mibgħuta
folder_drafts=Abbozzi folder_drafts=Abbozzi
folder_trash=Trash folder_trash=Trash

View File

@@ -317,7 +317,6 @@ search_elatest=Ontbrekende of ongeldige aantal berichten om te zoeken
search_withstatus=, met status $1 search_withstatus=, met status $1
folder_inbox=Inbox folder_inbox=Inbox
folder_sent=Verstuur email
folder_drafts=Ontwerpen folder_drafts=Ontwerpen
folder_trash=Vuilnis folder_trash=Vuilnis

View File

@@ -4,6 +4,8 @@ mail_specialsync=Synchronisatie speciaal
search_msg6=Zoekresultaten voor $1 in het veld $2 search_msg6=Zoekresultaten voor $1 in het veld $2
folder_sent=Verstuurd
left_mail=Mail left_mail=Mail
left_search=Zoeken: left_search=Zoeken:
left_folders=Beheer mappen left_folders=Beheer mappen

View File

@@ -320,7 +320,6 @@ search_elatest=Manglende eller ugyldig antall meldinger å søke gjennom
search_withstatus=, med status $1 search_withstatus=, med status $1
folder_inbox=Innboks folder_inbox=Innboks
folder_sent=Sendt e-post
folder_drafts=Kladd folder_drafts=Kladd
folder_trash=Papirkurv folder_trash=Papirkurv

View File

@@ -1,3 +1,5 @@
folder_sent=Sendt
editor_heading=Overskrift editor_heading=Overskrift
editor_paragraph=Avsnitt editor_paragraph=Avsnitt
editor_fontfamily_default=Misligholde editor_fontfamily_default=Misligholde

View File

@@ -179,7 +179,7 @@ search_elatest=Brakująca lub niepoprawna liczba wiadomości do przeszukania
search_withstatus=, ze statusem $1 search_withstatus=, ze statusem $1
folder_inbox=W pudełku folder_inbox=W pudełku
folder_sent=Wysłany mail folder_sent=Wysłano
folder_drafts=Warcaby folder_drafts=Warcaby
folder_trash=Śmieci folder_trash=Śmieci

View File

@@ -287,7 +287,7 @@ search_elatest=Número de mensagens ausente ou inválido para pesquisa
search_withstatus=, com status $1 search_withstatus=, com status $1
folder_inbox=Caixa de entrada folder_inbox=Caixa de entrada
folder_sent=Correspondência enviada folder_sent=Enviado
folder_drafts=Rascunhos folder_drafts=Rascunhos
folder_trash=Lixo folder_trash=Lixo

View File

@@ -1,3 +1,2 @@
folder_inbox=Caixa de Entrada folder_inbox=Caixa de Entrada
folder_sent=E-mais Enviados
folder_trash=Lixo folder_trash=Lixo

View File

@@ -319,6 +319,7 @@ search_latestnum=Apenas os mais recentes
search_elatest=Número de mensagens ausente ou inválido para pesquisa search_elatest=Número de mensagens ausente ou inválido para pesquisa
search_withstatus=, com status $1 search_withstatus=, com status $1
folder_sent=Enviado
folder_drafts=Rascunhos folder_drafts=Rascunhos
detach_err=Falha ao desanexar arquivo detach_err=Falha ao desanexar arquivo

View File

@@ -320,7 +320,7 @@ search_elatest=Număr de mesaje lipsă sau nevalide de căutat
search_withstatus=, cu statut $1 search_withstatus=, cu statut $1
folder_inbox=Inbox folder_inbox=Inbox
folder_sent=E-mail trimis folder_sent=Trimis
folder_drafts=Schițe folder_drafts=Schițe
folder_trash=Gunoi folder_trash=Gunoi

View File

@@ -320,7 +320,7 @@ search_elatest=Отсутствует или неверное количеств
search_withstatus=со статусом $1 search_withstatus=со статусом $1
folder_inbox=входящие folder_inbox=входящие
folder_sent=Отправленные письма folder_sent=Отправил
folder_drafts=Черновики folder_drafts=Черновики
folder_trash=дрянь folder_trash=дрянь

View File

@@ -320,7 +320,7 @@ search_elatest=Chýba alebo je neplatný počet správ na vyhľadávanie
search_withstatus=, so stavom $1 search_withstatus=, so stavom $1
folder_inbox=Doručená pošta folder_inbox=Doručená pošta
folder_sent=Odoslaná pošta folder_sent=Odoslané
folder_drafts=dáma folder_drafts=dáma
folder_trash=Smeti folder_trash=Smeti

View File

@@ -320,7 +320,7 @@ search_elatest=Manjkajoče ali neveljavno število sporočil za iskanje
search_withstatus=, s statusom $1 search_withstatus=, s statusom $1
folder_inbox=Prejeto folder_inbox=Prejeto
folder_sent=Poslana pošta folder_sent=Poslano
folder_drafts=Osnutki folder_drafts=Osnutki
folder_trash=Smeti folder_trash=Smeti

View File

@@ -260,7 +260,7 @@ search_elatest=Det saknas eller ogiltigt antal meddelanden att söka efter
search_withstatus=, med status $1 search_withstatus=, med status $1
folder_inbox=Inkorg folder_inbox=Inkorg
folder_sent=Skickade post folder_sent=Skickat
folder_drafts=utkast folder_drafts=utkast
folder_trash=Skräp folder_trash=Skräp

View File

@@ -320,7 +320,7 @@ search_elatest=จำนวนข้อความที่ขาดหาย
search_withstatus=ด้วยสถานะ $1 search_withstatus=ด้วยสถานะ $1
folder_inbox=กล่องขาเข้า folder_inbox=กล่องขาเข้า
folder_sent=ส่งอีเมล folder_sent=ส่งแล้ว
folder_drafts=ร่าง folder_drafts=ร่าง
folder_trash=ขยะ folder_trash=ขยะ

View File

@@ -275,7 +275,6 @@ search_elatest=Arama için hatalı veya gecersiz sayıda mesaj
search_withstatus=, durum kodu $1 olan search_withstatus=, durum kodu $1 olan
folder_inbox=Gelen Kutusu folder_inbox=Gelen Kutusu
folder_sent=Gönderilen postalar
folder_drafts=Taslaklar folder_drafts=Taslaklar
folder_trash=Çop Kutusu folder_trash=Çop Kutusu

View File

@@ -52,6 +52,8 @@ send_title2=Posta Kaydedildi
search_msg6=$2 alanında $1 için arama sonuçları search_msg6=$2 alanında $1 için arama sonuçları
search_attach=Ekleri olmalı mı? search_attach=Ekleri olmalı mı?
folder_sent=Gönderilmiş
sform_header=Gelişmiş e-posta arama seçenekleri sform_header=Gelişmiş e-posta arama seçenekleri
sform_andmode=Ölçüt modu sform_andmode=Ölçüt modu
sform_folder2=Klasörlerde ara sform_folder2=Klasörlerde ara

View File

@@ -320,7 +320,7 @@ search_elatest=Відсутня або недійсна кількість по
search_withstatus=, зі статусом $1 search_withstatus=, зі статусом $1
folder_inbox=Вхідні folder_inbox=Вхідні
folder_sent=Надіслати пошту folder_sent=Надісланий
folder_drafts=Чернетки folder_drafts=Чернетки
folder_trash=Сміття folder_trash=Сміття

View File

@@ -320,7 +320,7 @@ search_elatest=تلاش کرنے کیلئے پیغامات کی گمشدہ یا
search_withstatus=, with status $1 search_withstatus=, with status $1
folder_inbox=ان باکس folder_inbox=ان باکس
folder_sent=میل بھیجا folder_sent=بھیجا
folder_drafts=ڈرافٹس folder_drafts=ڈرافٹس
folder_trash=کوڑے دان folder_trash=کوڑے دان

View File

@@ -320,7 +320,7 @@ search_elatest=Thiếu hoặc không hợp lệ số lượng tin nhắn để t
search_withstatus=, với trạng thái $1 search_withstatus=, với trạng thái $1
folder_inbox=Hộp thư đến folder_inbox=Hộp thư đến
folder_sent=Gửi mail folder_sent=Đã gửi
folder_drafts=Dự thảo folder_drafts=Dự thảo
folder_trash=Rác folder_trash=Rác

View File

@@ -234,7 +234,7 @@ search_elatest=要搜索的消息丢失或数量无效
search_withstatus=,状态为$1 search_withstatus=,状态为$1
folder_inbox=收件箱 folder_inbox=收件箱
folder_sent=发送邮件 folder_sent=发送
folder_drafts=草稿 folder_drafts=草稿
folder_trash=垃圾 folder_trash=垃圾

View File

@@ -213,7 +213,6 @@ search_local=在本地資料夾
search_all=在所有資料夾 search_all=在所有資料夾
folder_inbox=收件夾 folder_inbox=收件夾
folder_sent=傳送郵件
folder_drafts=草稿 folder_drafts=草稿
folder_trash=垃圾桶 folder_trash=垃圾桶

View File

@@ -117,6 +117,8 @@ search_latestnum=只有最新
search_elatest=要搜索的消息丟失或數量無效 search_elatest=要搜索的消息丟失或數量無效
search_withstatus=,狀態為$1 search_withstatus=,狀態為$1
folder_sent=發送
sform_header=進階電子郵件搜尋選項 sform_header=進階電子郵件搜尋選項
sform_andmode=標準模式 sform_andmode=標準模式
sform_folder2=搜索文件夾 sform_folder2=搜索文件夾

View File

@@ -33,7 +33,7 @@ $ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin";
my $allow_overwrite = 0; my $allow_overwrite = 0;
my ($force_theme, $rpmdepends, $no_prefix, $vendor, $provides, $url, my ($force_theme, $rpmdepends, $no_prefix, $vendor, $provides, $url,
$force_usermin, $final_mod, $sign, $epoch, $dir, $ver, @extrareqs, $force_usermin, $final_mod, $sign, $keyname, $epoch, $dir, $ver, @extrareqs,
@exclude); @exclude);
# Parse command-line args # Parse command-line args
@@ -85,6 +85,9 @@ while(@ARGV) {
elsif ($a eq "--sign") { elsif ($a eq "--sign") {
$sign = 1; $sign = 1;
} }
elsif ($a eq "--key") {
$keyname = shift(@ARGV);
}
elsif ($a eq "--epoch") { elsif ($a eq "--epoch") {
$epoch = shift(@ARGV); $epoch = shift(@ARGV);
} }
@@ -426,7 +429,8 @@ unlink("$rpm_source_dir/$mod.tar.gz");
# Sign if requested # Sign if requested
if ($sign) { if ($sign) {
system("echo | rpm --resign $rpm_dir/$prefix$mod-$ver-$release.noarch.rpm $source_rpm_dir/$prefix$mod-$ver-$release.src.rpm"); my $keyflag = $keyname ? "-D '_gpg_name $keyname'" : "";
system("echo | rpm --resign $keyflag $rpm_dir/$prefix$mod-$ver-$release.noarch.rpm $source_rpm_dir/$prefix$mod-$ver-$release.src.rpm");
} }
if ($target_dir =~ /:/) { if ($target_dir =~ /:/) {

View File

@@ -24,80 +24,80 @@ if ( !$in{'go'} ) {
print "<input type=hidden name=go value=go>\n"; print "<input type=hidden name=go value=go>\n";
print "<table border>\n"; print "<table border>\n";
print "<tr $cb> <td><table>\n"; print "<tr $cb> <td><table>\n";
print "<tr $cb> <td><font color=0000FF size=4><b>Display Options:</b></font></td></tr>\n"; print "<tr $cb> <td><font color=0000FF size=4><b>Display Options</b></font></td></tr>\n";
print "<tr $cb> <td><b>System</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>System</b></td> <td colspan=3>\n";
printf "<input type=radio name=system value=1 %s> %s\n", printf "<input type=radio name=system value=1 %s> %s\n",
$System eq 1 ? 'checked' : '', $text{'yes'}; $System eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=system value=no %s> %s\n", printf "<input type=radio name=system value=no %s> %s\n",
$System eq 1 ? '' : 'checked', $text{'no'}, $System eq 1 ? '' : 'checked', $text{'no'},
join(" ", $System),"</td> </tr>\n"; join(" ", $System),"</td></tr>\n";
print "<tr $cb> <td><b>Package</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Package</b></td> <td colspan=3>\n";
printf "<input type=radio name=package value=1 %s> %s\n", printf "<input type=radio name=package value=1 %s> %s\n",
$Package eq 1 ? 'checked' : '', $text{'yes'}; $Package eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=package value=no %s> %s\n", printf "<input type=radio name=package value=no %s> %s\n",
$Package eq 1 ? '' : 'checked', $text{'no'}, $Package eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Package),"</td> </tr>\n"; join(" ", $Package),"</td></tr>\n";
print "<tr $cb> <td><b>Main</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Main</b></td> <td colspan=3>\n";
printf "<input type=radio name=main value=1 %s> %s\n", printf "<input type=radio name=main value=1 %s> %s\n",
$Main eq 1 ? 'checked' : '', $text{'yes'}; $Main eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=main value=no %s> %s\n", printf "<input type=radio name=main value=no %s> %s\n",
$Main eq 1 ? '' : 'checked', $text{'no'}, $Main eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Main),"</td> </tr>\n"; join(" ", $Main),"</td></tr>\n";
print "<tr $cb> <td><b>Defaults in Main</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Defaults in Main</b></td> <td colspan=3>\n";
printf "<input type=radio name=defaultsinmain value=1 %s> %s\n", printf "<input type=radio name=defaultsinmain value=1 %s> %s\n",
$Defaultsinmain eq 1 ? 'checked' : '', $text{'yes'}; $Defaultsinmain eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=defaultsinmain value=no %s> %s\n", printf "<input type=radio name=defaultsinmain value=no %s> %s\n",
$Defaultsinmain eq 1 ? '' : 'checked', $text{'no'}, $Defaultsinmain eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Defaultsinmain),"</td> </tr>\n"; join(" ", $Defaultsinmain),"</td></tr>\n";
print "<tr $cb> <td><b>Master</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Master</b></td> <td colspan=3>\n";
printf "<input type=radio name=master value=1 %s> %s\n", printf "<input type=radio name=master value=1 %s> %s\n",
$Master eq 1 ? 'checked' : '', $text{'yes'}; $Master eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=master value=no %s> %s\n", printf "<input type=radio name=master value=no %s> %s\n",
$Master eq 1 ? '' : 'checked', $text{'no'}, $Master eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Master),"</td> </tr>\n"; join(" ", $Master),"</td></tr>\n";
print "<tr $cb> <td><b>Locking</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Locking</b></td> <td colspan=3>\n";
printf "<input type=radio name=locking value=1 %s> %s\n", printf "<input type=radio name=locking value=1 %s> %s\n",
$Locking eq 1 ? 'checked' : '', $text{'yes'}; $Locking eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=locking value=no %s> %s\n", printf "<input type=radio name=locking value=no %s> %s\n",
$Locking eq 1 ? '' : 'checked', $text{'no'}, $Locking eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Locking),"</td> </tr>\n"; join(" ", $Locking),"</td></tr>\n";
print "<tr $cb> <td><b>Tables</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Tables</b></td> <td colspan=3>\n";
printf "<input type=radio name=tables value=1 %s> %s\n", printf "<input type=radio name=tables value=1 %s> %s\n",
$Tables eq 1 ? 'checked' : '', $text{'yes'}; $Tables eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=tables value=no %s> %s\n", printf "<input type=radio name=tables value=no %s> %s\n",
$Tables eq 1 ? '' : 'checked', $text{'no'}, $Tables eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Tables),"</td> </tr>\n"; join(" ", $Tables),"</td></tr>\n";
print "<tr $cb> <td><b>Permissions</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Permissions</b></td> <td colspan=3>\n";
printf "<input type=radio name=permissions value=1 %s> %s\n", printf "<input type=radio name=permissions value=1 %s> %s\n",
$Permissions eq 1 ? 'checked' : '', $text{'yes'}; $Permissions eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=permissions value=no %s> %s\n", printf "<input type=radio name=permissions value=no %s> %s\n",
$Permissions eq 1 ? '' : 'checked', $text{'no'}, $Permissions eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Permissions),"</td> </tr>\n"; join(" ", $Permissions),"</td></tr>\n";
print "<tr $cb> <td><b>Libraries</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Libraries</b></td> <td colspan=3>\n";
printf "<input type=radio name=libraries value=1 %s> %s\n", printf "<input type=radio name=libraries value=1 %s> %s\n",
$Libraries eq 1 ? 'checked' : '', $text{'yes'}; $Libraries eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=libraries value=no %s> %s\n", printf "<input type=radio name=libraries value=no %s> %s\n",
$Libraries eq 1 ? '' : 'checked', $text{'no'}, $Libraries eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Libraries),"</td> </tr>\n"; join(" ", $Libraries),"</td></tr>\n";
print "<tr $cb> <td><b>Warn</b></td> <td colspan=3>\n"; print "<tr $cb> <td><b>Warn</b></td> <td colspan=3>\n";
printf "<input type=radio name=warn value=1 %s> %s\n", printf "<input type=radio name=warn value=1 %s> %s\n",
$Warn eq 1 ? 'checked' : '', $text{'yes'}; $Warn eq 1 ? 'checked' : '', $text{'yes'};
printf "<input type=radio name=warn value=no %s> %s\n", printf "<input type=radio name=warn value=no %s> %s\n",
$Warn eq 1 ? '' : 'checked', $text{'no'}, $Warn eq 1 ? '' : 'checked', $text{'no'},
join(" ", $Warn),"</td> </tr>\n"; join(" ", $Warn),"</td></tr>\n";
print "<tr><td> </td></tr><tr><td><input type=submit value=\"$text{'postfinger_show'}\"></td></tr></form>\n"; print "<tr><td></td></tr><tr><td><input type=submit value=\"$text{'postfinger_show'}\"></td></tr></form>\n";
print "</table></td> </tr></table>"; print "</table></td></tr></table>";
&footer("index.cgi", $text{'index_title'}); &ui_print_footer("index.cgi", $text{'index_title'});
} else { } else {
&head; &head;
if (! -x $config{'postfix_config_command'} && ! -r $config{'postfix_config_file'} ) { if (! -x $config{'postfix_config_command'} && ! -r $config{'postfix_config_file'} ) {
@@ -108,7 +108,7 @@ if ( !$in{'go'} ) {
if ($config{'index_check'} && ($err = &check_postfix())) { if ($config{'index_check'} && ($err = &check_postfix())) {
print "<p>",&text('check_error'),"<p>\n"; print "<p>",&text('check_error'),"<p>\n";
print "<pre>$err</pre>\n"; print "<pre>$err</pre>\n";
&footer("/", $text{'index'}); &ui_print_footer("/", $text{'index'});
exit; exit;
} }
if ($System eq 1 ) { if ($System eq 1 ) {
@@ -197,16 +197,16 @@ if ( !$in{'go'} ) {
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
($postf1,$postf2,$postf3,$postf4,$postf5,$postf6,$postf7,$postf8)=split(/\s+/,$postfinger,8); ($postf1,$postf2,$postf3,$postf4,$postf5,$postf6,$postf7,$postf8)=split(/\s+/,$postfinger,8);
if ($postfinger =~ /\-o/) { if ($postfinger =~ /\-o/) {
print "<tr><td class='e'> </td><td class='v'> </td>", print "<tr><td class='e'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'> </td>", "<td class='v'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'> </td>", "<td class='v'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'>$postf2</td></tr>" "<td class='v'></td><td class='v'>$postf2</td></tr>"
if ( !grep(/^#|^\[ \]*$/,$postfinger)); if ( !grep(/^#|^\[ \]*$/,$postfinger));
} elsif ($postfinger =~ /user=/) { } elsif ($postfinger =~ /user=/) {
print "<tr><td class='e'> </td><td class='v'> </td>", print "<tr><td class='e'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'> </td>", "<td class='v'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'> </td>", "<td class='v'></td><td class='v'></td>",
"<td class='v'> </td><td class='v'>$postf1</td></tr>" "<td class='v'></td><td class='v'>$postf1</td></tr>"
if ( !grep(/^#|^\[ \]*$/,$postfinger)); if ( !grep(/^#|^\[ \]*$/,$postfinger));
} else { } else {
print "<tr><td class='e'><b>$postf1</b></td><td class='v'><center>$postf2</center></td>", print "<tr><td class='e'><b>$postf1</b></td><td class='v'><center>$postf2</center></td>",
@@ -223,21 +223,21 @@ if ( !$in{'go'} ) {
if ($Permissions eq 1 ) { if ($Permissions eq 1 ) {
print '<h1 align="center">Specific file and directory permissions</h1><br>'; print '<h1 align="center">Specific file and directory permissions</h1><br>';
print '<table border="0" cellpadding="0" width="600" align="center">'; print '<table border="0" cellpadding="0" width="600" align="center">';
print "<tr><td class='e'><b>Permission</b> Deep <b>Owner</b> <b>Group</b> Size Date <b>Directory/File</b> </td></tr>"; print "<tr><td class='e'><b>Permission</b> Deep <b>Owner</b> <b>Group</b> Size Date <b>Directory/File</b></td></tr>";
open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/maildrop 2>/dev/null |"); open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/maildrop 2>/dev/null |");
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
print "<tr><td class='v'>$postfinger</td></tr>" print "<tr><td class='v'>$postfinger</td></tr>"
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/public 2>/dev/null |"); open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/public 2>/dev/null |");
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
print "<tr><td class='v'>$postfinger</td></tr>" print "<tr><td class='v'>$postfinger</td></tr>"
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
if (! open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h queue_directory`/public 2>/dev/null |")) { if (! open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h queue_directory`/public 2>/dev/null |")) {
print '<center><b>WARNING: No access to $queue_directory/public<br>Try running postfinger as user root or postfix</b></center><br>'; print '<center><b>WARNING: No access to $queue_directory/public<br>Try running postfinger as user root or postfix</b></center><br>';
} else { } else {
@@ -246,7 +246,7 @@ if ( !$in{'go'} ) {
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
} }
open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/private 2>/dev/null |"); open(MAILQ, "/bin/ls -ld `$config{'postfix_config_command'} -h queue_directory`/private 2>/dev/null |");
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
@@ -254,7 +254,7 @@ if ( !$in{'go'} ) {
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
if (! open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h queue_directory`/private 2>/dev/null |")) { if (! open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h queue_directory`/private 2>/dev/null |")) {
print '<center><b>WARNING: No access to $queue_directory/private<br>Try running postfinger as user root or postfix</b></center><br>'; print '<center><b>WARNING: No access to $queue_directory/private<br>Try running postfinger as user root or postfix</b></center><br>';
} else { } else {
@@ -263,7 +263,7 @@ if ( !$in{'go'} ) {
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
} }
open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h command_directory`/postdrop 2>/dev/null |"); open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h command_directory`/postdrop 2>/dev/null |");
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
@@ -271,7 +271,7 @@ if ( !$in{'go'} ) {
if ( !grep(/total|^#|^\[ \]*$/,$postfinger)); if ( !grep(/total|^#|^\[ \]*$/,$postfinger));
} }
close(MAILQ); close(MAILQ);
print "<tr><td> </td></tr>"; print "<tr><td></td></tr>";
open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h command_directory`/postqueue 2>/dev/null |"); open(MAILQ, "/bin/ls -l `$config{'postfix_config_command'} -h command_directory`/postqueue 2>/dev/null |");
while (my $postfinger = <MAILQ>) { while (my $postfinger = <MAILQ>) {
print "<tr><td class='v'>$postfinger</td></tr>" print "<tr><td class='v'>$postfinger</td></tr>"
@@ -295,8 +295,8 @@ if ( !$in{'go'} ) {
print "</table><br>"; print "</table><br>";
} }
} }
print "</td> </tr></table></td> </tr></table>"; print "</td></tr></table></td></tr></table>";
&footer("index.cgi", $text{'index_title'}); &ui_print_footer("index.cgi", $text{'index_title'});
} }
sub head { sub head {

View File

@@ -10,23 +10,22 @@ if (defined(&get_cpu_info)) {
print "<table>\n"; print "<table>\n";
@c = &get_cpu_info(); @c = &get_cpu_info();
if (@c) { if (@c) {
print "<tr> <td><b>$text{'index_loadname'}</b></td>\n"; print &ui_table_start(undef, undef, 2);
print "<td>",&text('index_loadnums', print &ui_table_row($text{'index_loadname'},
"<tt>$c[0]</tt>", "<tt>$c[1]</tt>", "<tt>$c[2]</tt>"), &text('index_loadnums',
"</td> </tr>\n"; "<tt>$c[0]</tt>", "<tt>$c[1]</tt>", "<tt>$c[2]</tt>"));
if (@c >= 5) { if (@c >= 5) {
print "<tr> <td><b>$text{'index_cpuname'}</b></td>\n"; my $cpu = $c[4]."\n";
print "<td>$c[4]\n";
if ($c[4] !~ /Hz/) { if ($c[4] !~ /Hz/) {
print "($c[3] MHz)\n"; $cpu .= "($c[3] MHz)\n";
} }
if ($c[7]) { if ($c[7]) {
print ", $c[7] cores\n"; $cpu .= ", $c[7] cores\n";
} }
print "</td> </tr>\n"; print &ui_table_row($text{'index_cpuname'}, $cpu);
} }
print &ui_table_end(),"<p>\n";
} }
print "</table><br>\n";
} }
print &ui_columns_start([ $text{'pid'}, $text{'owner'}, print &ui_columns_start([ $text{'pid'}, $text{'owner'},

View File

@@ -9,17 +9,20 @@ if (defined(&get_memory_info)) {
@m = &get_memory_info(); @m = &get_memory_info();
if (@m) { if (@m) {
$msg = $m[4] ? 'index_mem3' : 'index_mem2'; $msg = $m[4] ? 'index_mem3' : 'index_mem2';
print "<p>"; print &ui_table_start(undef, undef, 2);
print &text($msg, &nice_size($m[0]*1024), print &ui_table_row($text{'index_memreal'},
&nice_size($m[1]*1024), &text($m[4] ? 'index_memtfc' : 'index_memtf',
&nice_size($m[4]*1024)),"\n"; &nice_size($m[0]*1024),
&nice_size($m[1]*1024),
&nice_size($m[4]*1024)));
if ($m[5]) { if ($m[5]) {
print "&nbsp;&nbsp;", print &ui_table_row($text{'index_memburst'},
&text('index_burst', &nice_size($m[5]*1024)); &nice_size($m[5]*1024));
} }
print "&nbsp;&nbsp;", print &ui_table_row($text{'index_memswap'},
&text('index_swap2', &nice_size($m[2]*1024), &text('index_memtf', &nice_size($m[2]*1024),
&nice_size($m[3]*1024)),"<p>\n"; &nice_size($m[3]*1024)));
print &ui_table_end(),"<p>\n";
} }
} }
print &ui_columns_start([ print &ui_columns_start([

View File

@@ -8,10 +8,11 @@ index_search=Search
index_zone=Zone index_zone=Zone
index_run=Run.. index_run=Run..
index_return=process list index_return=process list
index_mem2=<b>Real memory:</b> $1 total / $2 free index_memreal=Real memory:
index_mem3=<b>Real memory:</b> $1 total / $2 free / $3 cached index_memswap=Swap space:
index_swap2=<b>Swap space:</b> $1 total / $2 free index_memburst=Burstable memory:
index_burst=<b>Burstable memory:</b> $1 total index_memtf=$1 total / $2 free
index_memtfc=$1 total / $2 free / $3 cached
index_loadname=CPU load averages: index_loadname=CPU load averages:
index_loadnums=$1 (1 mins) , $2 (5 mins) , $3 (15 mins) index_loadnums=$1 (1 mins) , $2 (5 mins) , $3 (15 mins)
index_cpuname=CPU type: index_cpuname=CPU type:

View File

@@ -66,7 +66,8 @@ else {
# Use width format character if allowed # Use width format character if allowed
$width = ":80"; $width = ":80";
} }
open(PS, "ps --cols 2048 -eo user$width,ruser$width,group$width,rgroup$width,pid,ppid,pgid,pcpu,rss,nice,etime,time,stime,tty,args 2>/dev/null |"); my $pscmd = "ps --cols 2048 -eo user$width,ruser$width,group$width,rgroup$width,pid,ppid,pgid,pcpu,rss,nice,etime,time,stime,tty,args";
open(PS, "$pscmd 2>/dev/null |");
$dummy = <PS>; $dummy = <PS>;
my @now = localtime(time()); my @now = localtime(time());
for($i=0; $line=<PS>; $i++) { for($i=0; $line=<PS>; $i++) {
@@ -116,6 +117,7 @@ else {
$plist[$i]->{"_rgroup"} = $w[3]; $plist[$i]->{"_rgroup"} = $w[3];
$plist[$i]->{"_pgid"} = $w[6]; $plist[$i]->{"_pgid"} = $w[6];
$plist[$i]->{"_tty"} = $w[13] =~ /\?/ ? $text{'edit_none'} : "/dev/$w[13]"; $plist[$i]->{"_tty"} = $w[13] =~ /\?/ ? $text{'edit_none'} : "/dev/$w[13]";
$plist[$i]->{"_pscmd"} = 1 if ($plist[$i]->{"args"} =~ /\Q$pscmd\E/);
} }
close(PS); close(PS);
} }

View File

@@ -195,7 +195,7 @@ else {
local $sel = select($rmask, undef, undef, 1); local $sel = select($rmask, undef, undef, 1);
if ($sel > 0 && vec($rmask, $fn, 1)) { if ($sel > 0 && vec($rmask, $fn, 1)) {
# got something to read.. print it # got something to read.. print it
sysread(OUTr, $buf, 65536) || last; sysread(OUTr, $buf, &get_buffer_size()) || last;
$got += length($buf); $got += length($buf);
if ($_[5]) { if ($_[5]) {
$buf = &html_escape($buf); $buf = &html_escape($buf);
@@ -584,6 +584,7 @@ sub can_view_process
{ {
local ($p) = @_; local ($p) = @_;
return 0 if ($p->{'pid'} == $$ && $config{'hide_self'}); return 0 if ($p->{'pid'} == $$ && $config{'hide_self'});
return 0 if ($p->{'_pscmd'} && $config{'hide_self'});
local $user = $p->{'user'}; local $user = $p->{'user'};
if ($hide{$user}) { if ($hide{$user}) {
return 0; return 0;

View File

@@ -1,3 +1,2 @@
line2=System configuration,11
stunnel_path=Path to stunnel executable,0 stunnel_path=Path to stunnel executable,0
pem_path=Path to default stunnel PEM file,3,None pem_path=Path to default stunnel PEM file,3,None

View File

@@ -1305,7 +1305,7 @@ return "<textarea class='ui_textarea' ".
"rows='$rows' cols='$cols'".($wrap ? " wrap='$wrap'" : ""). "rows='$rows' cols='$cols'".($wrap ? " wrap='$wrap'" : "").
($dis ? " disabled='true'" : ""). ($dis ? " disabled='true'" : "").
($tags ? " $tags" : "").">". ($tags ? " $tags" : "").">".
&html_escape($value). &html_escape($value, 1).
"</textarea>"; "</textarea>";
} }

View File

@@ -99,17 +99,21 @@ if ($ENV{'PATH_INFO'}) {
print "Content-Disposition: Attachment\n"; print "Content-Disposition: Attachment\n";
} }
} }
else {
while(read(FILE, $buffer, &get_buffer_size_binary())) {
$fdata .= $buffer;
}
}
close(FILE);
print "Content-length: $fsize\n"; print "Content-length: $fsize\n";
print "X-Content-Type-Options: nosniff\n"; print "X-Content-Type-Options: nosniff\n";
print "Content-type: $type\n\n"; print "Content-type: $type\n\n";
print "$fdata"; # File is already read, so print it
if ($dangertypes) {
print "$fdata";
}
else {
# Send the file
while(read(FILE, $buffer, &get_buffer_size_binary())) {
print("$buffer");
}
}
close(FILE);
} }
# Switch back to root # Switch back to root

View File

@@ -32,8 +32,9 @@ $ttable .= &ui_columns_end();
print &ui_table_row($text{'advanced_tempmods'}, $ttable); print &ui_table_row($text{'advanced_tempmods'}, $ttable);
# Pass passwords to CGI programs # Pass passwords to CGI programs
print &ui_table_row($text{'advanced_pass'}, print &ui_table_row($text{'advanced_pass_desc'},
&ui_yesno_radio("pass", int($miniserv{'pass_password'}))); &ui_yesno_radio("pass", int($miniserv{'pass_password'})).
&ui_help($text{'advanced_pass_help'}));
@preloads = &webmin::get_preloads(\%miniserv); @preloads = &webmin::get_preloads(\%miniserv);
if (!@preloads && (!$miniserv{'premodules'} || if (!@preloads && (!$miniserv{'premodules'} ||

View File

@@ -486,7 +486,8 @@ descs_title=Module Titles
descs_info=This page allows you to specify alternate titles for Usermin modules, to override their standard descriptions. descs_info=This page allows you to specify alternate titles for Usermin modules, to override their standard descriptions.
advanced_title=Advanced Options advanced_title=Advanced Options
advanced_pass=Make password available to Usermin programs?<br><font size=-1>(Does not work when session authentication is enabled)</font> advanced_pass_desc=Make password available to Usermin programs?
advanced_pass_help=Does not work when session authentication is enabled
blocked_title=Blocked Hosts and Users blocked_title=Blocked Hosts and Users
blocked_none=No hosts or users are currently blocked by Usermin. blocked_none=No hosts or users are currently blocked by Usermin.

View File

@@ -84,12 +84,12 @@ elsif ($in{'source'} == 2) {
if ($in{'mode'} eq 'rpm') { if ($in{'mode'} eq 'rpm') {
$release ||= 1; $release ||= 1;
$progress_callback_url = &convert_osdn_url( $progress_callback_url = &convert_osdn_url(
"http://$webmin::osdn_host/webadmin/${product}-${version}-${release}.noarch.rpm"); "http://$webmin::osdn_host/webadmin/newkey-${product}-${version}-${release}.noarch.rpm");
} }
elsif ($in{'mode'} eq 'deb') { elsif ($in{'mode'} eq 'deb') {
$release = $release ? "-".$release : ""; $release = $release ? "-".$release : "";
$progress_callback_url = &convert_osdn_url( $progress_callback_url = &convert_osdn_url(
"http://$webmin::osdn_host/webadmin/${product}_${version}${release}_all.deb"); "http://$webmin::osdn_host/webadmin/newkey-${product}_${version}${release}_all.deb");
} }
else { else {
$release = $release ? "-".$release : ""; $release = $release ? "-".$release : "";

View File

@@ -242,7 +242,7 @@ if ($sorted_by && $sorted_by_sectioning_preserved) {
} }
} }
=head2 html_escape(string) =head2 html_escape(string, [editor-mode])
Converts &, < and > codes in text to HTML entities, and returns the new string. Converts &, < and > codes in text to HTML entities, and returns the new string.
This should be used when including data read from other sources in HTML pages. This should be used when including data read from other sources in HTML pages.
@@ -250,13 +250,16 @@ This should be used when including data read from other sources in HTML pages.
=cut =cut
sub html_escape sub html_escape
{ {
my ($tmp) = @_; my ($tmp, $editor_mode) = @_;
if (!defined $tmp) { if (!defined $tmp) {
return ''; # empty string return ''; # empty string
}; };
# Before escaping ampersand use negative lookahead to see if occurrence # Before escaping ampersand use negative lookahead to see if occurrence
# is not an HTML entity already to prevent double escaping # is not an HTML entity already to prevent double escaping
$tmp =~ s/&(?!(([a-zA-Z]+)|(#|#x)\d+);)/&amp;/g; $tmp =~ s/&(?!(([a-zA-Z]+)|(#|#x)\d+);)/&amp;/g if (!$editor_mode);
# In editor mode always escape all ampersands
# to make sure they are displayed per se
$tmp =~ s/&/&amp;/g if ($editor_mode);
# Just always escape the following # Just always escape the following
$tmp =~ s/</&lt;/g; $tmp =~ s/</&lt;/g;
$tmp =~ s/>/&gt;/g; $tmp =~ s/>/&gt;/g;
@@ -1694,13 +1697,27 @@ for(my $i=0; my @stack_ = caller($i); $i++) {
push(@stack, \@stack_); push(@stack, \@stack_);
} }
my $err_caller; my $err_caller;
$err_caller = "$stack[1]->[1] (line $stack[1]->[2])" my $err_last_eval = $main::error_last_eval;
if ($stack[1]->[1] && $stack[1]->[2]); $err_last_eval =~ s/\n$// if ($err_last_eval);
$err_caller = "$stack[0]->[1] (line $stack[0]->[2])"
if ($stack[0]->[1] && $stack[0]->[2]);
if ($err_caller) { if ($err_caller) {
$err_caller =~ s/$root_directory\///; $err_caller =~ s/$root_directory\///;
my $err_caller_msg_esc =
&quote_escape(($err_last_eval ? "$err_last_eval : $err_caller" : $err_caller), '"');
my $err_caller_msg;
if ($err_last_eval) {
$err_caller_msg = &ui_details({
'title' => $text{'main_error_details'},
'content' => $err_caller_msg_esc,
'class' =>'error'}, 1);
}
else {
$err_caller_msg = &ui_help($err_caller_msg_esc);
}
my $err_caller_ = my $err_caller_ =
$main::webmin_script_type =~ /^(cmd|cron)$/ ? $main::webmin_script_type =~ /^(cmd|cron)$/ ?
$err_caller : &ui_help($err_caller); $err_caller : $err_caller_msg;
$msg = $msg ? "$msg $err_caller_" : $err_caller_; $msg = $msg ? "$msg $err_caller_" : $err_caller_;
push(@msg, $err_caller_); push(@msg, $err_caller_);
} }
@@ -1710,7 +1727,7 @@ my $error_output_right = sub {
return $main::webmin_script_type eq 'cmd' ? entities_to_ascii($err_msg) : $err_msg; return $main::webmin_script_type eq 'cmd' ? entities_to_ascii($err_msg) : $err_msg;
}; };
if (!$main::error_must_die) { if (!$main::error_must_die) {
print STDERR "Error: ", &$error_output_right($msg), "\n"; &error_stderr(&$error_output_right($msg));
} }
&load_theme_library(); &load_theme_library();
if ($main::error_must_die) { if ($main::error_must_die) {
@@ -1827,6 +1844,7 @@ $remove_host = $ENV{"REMOTE_HOST"};
$page = $ENV{"REQUEST_URI"}; $page = $ENV{"REQUEST_URI"};
$err = &html_strip($err); $err = &html_strip($err);
$err =~ s/[\n\r]+/ /g; $err =~ s/[\n\r]+/ /g;
$err =~ s/\s\?$//g;
$err = $err =
"[$make_datestr] " . "[$make_datestr] " .
($remove_host ? ( "[$remove_host] " ) : ( )) . ($remove_host ? ( "[$remove_host] " ) : ( )) .
@@ -7221,6 +7239,12 @@ if ($filename && $filename_) {
$filename =~ tr/A-Za-z0-9\_\-//cd; $filename =~ tr/A-Za-z0-9\_\-//cd;
$filename = "$filename--"; $filename = "$filename--";
} }
state $check_header;
my $check_headers = sub {
if (!$check_header++ && !$main::done_webmin_header) {
print "Content-type: text/html\n\n";
}
};
eval 'use Data::Dumper'; eval 'use Data::Dumper';
if (!$@) { if (!$@) {
@@ -7252,7 +7276,8 @@ if (!$@) {
$dumped_data =~ s/\n/<br>/g; $dumped_data =~ s/\n/<br>/g;
$dumped_data =~ s/\s/&nbsp;/g; $dumped_data =~ s/\s/&nbsp;/g;
} }
print $dumped_data; &$check_headers();
$objref && print $dumped_data;
} }
} }
else { else {
@@ -7263,7 +7288,8 @@ else {
} }
# Print on screen # Print on screen
else { else {
print Dumper($dumpererr); &$check_headers();
$objref && print Dumper($dumpererr);
} }
} }
} }
@@ -12832,7 +12858,7 @@ sub get_buffer_size_binary
{ {
my %miniserv; my %miniserv;
&get_miniserv_config(\%miniserv); &get_miniserv_config(\%miniserv);
return $miniserv{'bufsize_binary'} || (65536 * 100); return $miniserv{'bufsize_binary'} || 1048576;
} }
=head2 get_webprefix =head2 get_webprefix

View File

@@ -34,5 +34,12 @@ if (!$done_web_lib_funcs) {
$remote_error_handler ||= \&error; $remote_error_handler ||= \&error;
$main::remote_error_handler ||= \&error; $main::remote_error_handler ||= \&error;
# Die handler that stores the error from
# eval message in a global variable
$SIG{__DIE__} = sub {
# Don't meddle with the natural functioning of eval.
$main::error_last_eval = $_[0] if (!$^S);
};
1; 1;

View File

@@ -118,6 +118,16 @@ else {
$miniserv{'bufsize'} = $in{'bufsize'}; $miniserv{'bufsize'} = $in{'bufsize'};
} }
# Save buffer size
if ($in{'bufsize_binary_def'}) {
delete($miniserv{'bufsize_binary'});
}
else {
$in{'bufsize_binary'} =~ /^\d+$/ && $in{'bufsize_binary'} > 0 ||
&error($text{'advanced_ebufsize_binary'});
$miniserv{'bufsize_binary'} = $in{'bufsize_binary'};
}
&lock_file($ENV{'MINISERV_CONFIG'}); &lock_file($ENV{'MINISERV_CONFIG'});
&put_miniserv_config(\%miniserv); &put_miniserv_config(\%miniserv);
&unlock_file($ENV{'MINISERV_CONFIG'}); &unlock_file($ENV{'MINISERV_CONFIG'});

View File

@@ -5,6 +5,6 @@ updays=1
cron_mode=0 cron_mode=0
osdn=1 osdn=1
warn_days=7 warn_days=7
letsencrypt_dns_wait=10 letsencrypt_dns_wait=30
letsencrypt_algo=rsa letsencrypt_algo=rsa
letsencrypt_reuse=1 letsencrypt_reuse=1

View File

@@ -78,6 +78,11 @@ print &ui_table_row($text{'advanced_bufsize'},
&ui_opt_textbox("bufsize", $miniserv{'bufsize'}, 6, &ui_opt_textbox("bufsize", $miniserv{'bufsize'}, 6,
$text{'default'}." (32768)")); $text{'default'}." (32768)"));
# Network download buffer size
print &ui_table_row($text{'advanced_bufsize_binary'},
&ui_opt_textbox("bufsize_binary", $miniserv{'bufsize_binary'}, 6,
$text{'default'}." (1048576)"));
# Nice level for cron jobs # Nice level for cron jobs
if (&foreign_check("proc")) { if (&foreign_check("proc")) {
&foreign_require("proc", "proc-lib.pl"); &foreign_require("proc", "proc-lib.pl");

View File

@@ -58,8 +58,9 @@ print &ui_table_row($text{'advanced_showstderr'},
if (!$miniserv{'session'}) { if (!$miniserv{'session'}) {
# Pass passwords to CGI programs # Pass passwords to CGI programs
print &ui_table_row($text{'advanced_pass'}, print &ui_table_row($text{'advanced_pass_desc'},
&ui_yesno_radio("pass", int($miniserv{'pass_password'})), undef); &ui_yesno_radio("pass", int($miniserv{'pass_password'})).
&ui_help($text{'advanced_pass_help'}), undef);
} }
# Gzip static files? # Gzip static files?

View File

@@ -884,7 +884,8 @@ advanced_err=Failed to save advanced options
advanced_etemp=Missing or non-existant temporary files directory advanced_etemp=Missing or non-existant temporary files directory
advanced_etdir=Missing or non-existant temporary files directory for $1 advanced_etdir=Missing or non-existant temporary files directory for $1
advanced_etempallowed=Temporary files directory $1 is a system directory advanced_etempallowed=Temporary files directory $1 is a system directory
advanced_pass=Make password available to Webmin programs?<br><font size=-1>(Does not work when session authentication is enabled)</font> advanced_pass_desc=Make password available to Usermin programs?
advanced_pass_help=Does not work when session authentication is enabled
advanced_tempmods=Per-module temporary directories advanced_tempmods=Per-module temporary directories
advanced_tmod=Module advanced_tmod=Module
advanced_tdir=Directory advanced_tdir=Directory
@@ -911,7 +912,9 @@ advanced_headers=Extra HTTP headers
advanced_eheader=Headers must be formatted like <tt>Header: Value</tt> advanced_eheader=Headers must be formatted like <tt>Header: Value</tt>
advanced_sortconfigs=Save config files sorted by its keys? advanced_sortconfigs=Save config files sorted by its keys?
advanced_bufsize=Network buffer size in bytes advanced_bufsize=Network buffer size in bytes
advanced_bufsize_binary=Network buffer size for downloads in bytes
advanced_ebufsize=Network buffer size must be a number greater than zero advanced_ebufsize=Network buffer size must be a number greater than zero
advanced_ebufsize_binary=Network buffer size for downloads must be a number greater than zero
syslog_errorlog=Webmin error log syslog_errorlog=Webmin error log

View File

@@ -58,14 +58,14 @@ return &software::missing_install_link(
# request_letsencrypt_cert(domain|&domains, webroot, [email], [keysize], # request_letsencrypt_cert(domain|&domains, webroot, [email], [keysize],
# [request-mode], [use-staging], [account-email], # [request-mode], [use-staging], [account-email],
# [reuse-key]) # [reuse-key], [server-url, server-key, server-hmac])
# Attempt to request a cert using a generated key with the Let's Encrypt client # Attempt to request a cert using a generated key with the Let's Encrypt client
# command, and write it to the given path. Returns a status flag, and either # command, and write it to the given path. Returns a status flag, and either
# an error message or the paths to cert, key and chain files. # an error message or the paths to cert, key and chain files.
sub request_letsencrypt_cert sub request_letsencrypt_cert
{ {
my ($dom, $webroot, $email, $size, $mode, $staging, $account_email, my ($dom, $webroot, $email, $size, $mode, $staging, $account_email,
$key_type, $reuse_key) = @_; $key_type, $reuse_key, $server, $server_key, $server_hmac) = @_;
my @doms = ref($dom) ? @$dom : ($dom); my @doms = ref($dom) ? @$dom : ($dom);
$email ||= "root\@$doms[0]"; $email ||= "root\@$doms[0]";
$mode ||= "web"; $mode ||= "web";
@@ -80,6 +80,11 @@ foreach my $d (@doms) {
} }
} }
if ($server && !$letsencrypt_cmd) {
return (0, "A non-standard server can only be used when the native ".
"Let's Encrypt client is installed");
}
if ($mode eq "web") { if ($mode eq "web") {
# Create a challenges directory under the web root # Create a challenges directory under the web root
if ($wildcard) { if ($wildcard) {
@@ -170,6 +175,7 @@ if ($letsencrypt_cmd) {
my $old_flags = ""; my $old_flags = "";
my $new_flags = ""; my $new_flags = "";
my $reuse_flags = ""; my $reuse_flags = "";
my $server_flags = "";
$key_type ||= $config{'letsencrypt_algo'} || 'rsa'; $key_type ||= $config{'letsencrypt_algo'} || 'rsa';
if (&compare_version_numbers($cmd_ver, 1.11) < 0) { if (&compare_version_numbers($cmd_ver, 1.11) < 0) {
$old_flags = " --manual-public-ip-logging-ok"; $old_flags = " --manual-public-ip-logging-ok";
@@ -180,6 +186,19 @@ if ($letsencrypt_cmd) {
if ($reuse_key) { if ($reuse_key) {
$reuse_flags = " --reuse-key"; $reuse_flags = " --reuse-key";
} }
else {
$reuse_flags = " --no-reuse-key";
}
if ($server) {
$server_flags = " --server ".quotemeta($server);
if ($server_key) {
$server_flags .= " --eab-kid ".quotemeta($server_key);
}
if ($server_hmac) {
$server_flags .= " --eab-hmac-key ".
quotemeta($server_hmac);
}
}
$dir =~ s/\/[^\/]+$//; $dir =~ s/\/[^\/]+$//;
$size ||= 2048; $size ||= 2048;
my $out; my $out;
@@ -195,6 +214,7 @@ if ($letsencrypt_cmd) {
" --force-renewal". " --force-renewal".
$reuse_flags. $reuse_flags.
$old_flags. $old_flags.
$server_flags.
" --non-interactive". " --non-interactive".
" --agree-tos". " --agree-tos".
" --config ".quotemeta($temp)."". " --config ".quotemeta($temp)."".
@@ -219,6 +239,7 @@ if ($letsencrypt_cmd) {
" --force-renewal". " --force-renewal".
$reuse_flags. $reuse_flags.
$old_flags. $old_flags.
$server_flags.
" --non-interactive". " --non-interactive".
" --agree-tos". " --agree-tos".
" --config ".quotemeta($temp)."". " --config ".quotemeta($temp)."".

View File

@@ -165,7 +165,7 @@ eval "use Authen::OATH";
if ($@) { if ($@) {
return &text('twofactor_etotpmodule', 'Authen::OATH', return &text('twofactor_etotpmodule', 'Authen::OATH',
"../cpan/download.cgi?source=3&cpan=Authen::OATH&mode=2&". "../cpan/download.cgi?source=3&cpan=Authen::OATH&mode=2&".
"return=/$module_name/&returndesc=".&urlize($text{'index_return'})) "return=/$module_name/&returndesc=".&urlize($text{'index_return'}));
} }
return undef; return undef;
} }
@@ -246,6 +246,7 @@ sub validate_twofactor_totp
my ($id, $token, $apikey) = @_; my ($id, $token, $apikey) = @_;
$id =~ /^[A-Z0-9=]+$/i || return $text{'twofactor_etotpid'}; $id =~ /^[A-Z0-9=]+$/i || return $text{'twofactor_etotpid'};
$token =~ /^\d+$/ || return $text{'twofactor_etotptoken'}; $token =~ /^\d+$/ || return $text{'twofactor_etotptoken'};
eval "use lib (\"$root_directory/vendor_perl\")";
eval "use Authen::OATH"; eval "use Authen::OATH";
if ($@) { if ($@) {
return &text('twofactor_etotpmodule2', 'Authen::OATH'); return &text('twofactor_etotpmodule2', 'Authen::OATH');

View File

@@ -92,14 +92,14 @@ elsif ($in{'source'} == 2) {
# Downloading RPM # Downloading RPM
$release ||= 1; $release ||= 1;
$progress_callback_url = &convert_osdn_url( $progress_callback_url = &convert_osdn_url(
"http://$osdn_host/webadmin/webmin-${version}-${release}.noarch.rpm"); "http://$osdn_host/webadmin/newkey-webmin-${version}-${release}.noarch.rpm");
$sfx = ".rpm"; $sfx = ".rpm";
} }
elsif ($in{'mode'} eq 'deb') { elsif ($in{'mode'} eq 'deb') {
# Downloading Debian package # Downloading Debian package
$release = $release ? "-".$release : ""; $release = $release ? "-".$release : "";
$progress_callback_url = &convert_osdn_url( $progress_callback_url = &convert_osdn_url(
"http://$osdn_host/webadmin/webmin_${version}${release}_all.deb"); "http://$osdn_host/webadmin/newkey-webmin_${version}${release}_all.deb");
$sfx = ".deb"; $sfx = ".deb";
} }
elsif ($in{'mode'} eq 'solaris-pkg') { elsif ($in{'mode'} eq 'solaris-pkg') {