Compare commits

..

10 Commits

Author SHA1 Message Date
Ilia Ross
15e7c5ea40 Make the function and hash names clearer 2025-08-25 22:31:54 +03:00
Ilia Ross
f5b3e5ebc4 Drop param that was obsolete for ages 2025-08-25 12:48:55 +03:00
Ilia Ross
9c050ad764 Fix mapped supported option to be saved correctly 2025-08-25 12:17:23 +03:00
Ilia Ross
4f4a3feaca Fix not to show yet pages that do not have support in Dovecot 2.4 2025-08-25 12:12:19 +03:00
Ilia Ross
0573074cac Fix to use mapped API specifically for known options, without magic 2025-08-24 23:00:23 +03:00
Ilia Ross
863e178c7b Add a proper implementation for handling Dovecot version chaos 2025-08-22 16:22:48 +03:00
Ilia Ross
6de9014357 Revert to original code for now 2025-08-22 14:56:12 +03:00
Ilia Ross
f03f7dcf44 Fix to simplify variable name 2025-08-22 14:52:46 +03:00
Ilia Ross
d9295e0f30 Fix not to hardcode module name 2025-08-21 12:31:52 +03:00
Ilia Ross
acf0cf9ca0 Add support for Dovecot 2.4 in API 2025-08-21 00:29:10 +03:00
110 changed files with 593 additions and 875 deletions

View File

@@ -1,49 +1,12 @@
## Changelog
#### 2.501 (September 10, 2025)
* Add support for Raspberry Pi sensors #2539 #2517
* Add Squid 7 support
* Update the Authentic theme to the latest version with the following fixes:
- Fix broken editor in "Bootup and Shutdown" module
#### 2.500 (September 4, 2025)
#### 2.403 (June 30, 2025)
* Add support for the Webmin webserver to work in both HTTP and HTTPS modes at the same time
* Add distinct warning to the login page if the connection is not secure
* Add support for timeouts in temporary rules in "FirewallD" module
* Add support for the new Dovecot version 2.4
* Add support for MariaDB version 12 #2522
* Add support for IMAP through a local command for Usermin
* Add latest SSLeay support for redirects to SSL work
* Add improvements to "Bootup and Shutdown" module for _systemd_ systems
* Add field for secondary server key in "BIND DNS Server" module
* Add reversible encryption helpers API
* Add API to display relative dates
* Add API to mask sensitive text, like displayed passwords, unless hovered over
* Add status monitor for PHP FPM #2499
* Add support for DNF5 format in the "Software Packages" module
* Add support for redirecting to the enforced domain when the `musthost_redirect` directive is set
* Add option to customize the SMTP login for scheduled background monitoring in the "System and Server Status" module
* Change to show relative dates in "Webmin Users: Current Login Sessions" and "Webmin Actions Log: Search Results" pages
* Change "Last Logins" on the dashboard to show usernames, relative dates, and all users from the past 3 days
* Change to always enable HSTS by default
* Add a UI API to mask sensitive text—like displayed passwords, unless hovered over container
* Fix MySQL/MariaDB to remove obsolete `set-variable` options that break modern config files #2497
* Fix download link in table rows in "MySQL/MariaDB Database Server" module
* Fix module not to fail on old MySQL 5.5
* Update the Authentic theme to the latest version with various improvements and fixes:
- Add support to automatically set the color palette based on OS or browser preferences
- Add improvements to tooltips in dark palette
- Change the default shortcut key for toggling the light/dark palette
- Change the default shortcut key for toggling right slider
- Change wording to use "shortcut" instead of "hotkey"
- Change the default maximum column width
- Fix navigation menu load in proxy mode #2502
- Fix navigation menu to always stay in sync with the product switch
- Fix sporadic issue where the navigation menu disappeared and the content page was shifted
- Fix info alert text color and button color in the dark palette
- Fix styling of checkboxes and radios for backup and restore pages in Virtualmin
- Fix styling for extra backup destinations in Virtualmin
- Fix advanced schedule display in the cron chooser in Virtualmin
[More details...](https://github.com/webmin/authentic-theme/releases/tag/25.00)
#### 2.402 (June 16, 2025)
* Update the Authentic theme to the latest version with various fixes and improvements
@@ -168,7 +131,7 @@
* Update the Authentic theme to the latest version with various fixes and improvements
#### 2.201 (July 24, 2024)
* Fix real-time monitoring not updating graphs in the dashboard [#2222](https://github.com/webmin/webmin/issues/2222)
* Fix real-time monitoring not updating graphs in the Dashboard [#2222](https://github.com/webmin/webmin/issues/2222)
* Fix Terminal module to work correctly with _sudo_-capable users [#2223](https://github.com/webmin/webmin/issues/2223)
#### 2.200 (July 21, 2024)
@@ -281,7 +244,7 @@
* Add support for editing ACLs in File Manager
* Add support to configure SSL connection for MySQL/MariaDB module
* Add support for compressed backups in PostgreSQL module
* Add support for displaying inodes too in Disk Usage in the dashboard
* Add support for displaying inodes too in Disk Usage in the Dashboard
* Add better support for CloudLinux
* Fix to always default to RSA key type in Let's Encrypt requests
* Fix setup repository script for Oracle
@@ -289,7 +252,7 @@
* Fix support for SpamAssassin 4
* Fix to use system default hashing format for `htpasswd` file
* Fix FastRPC issues
* Update the Authentic theme to the latest version, with sped-up dashboard performance
* Update the Authentic theme to the latest version, with sped-up Dashboard performance
#### 2.013 (January 19, 2023)
* Fix Authentic theme issue with error handling

View File

@@ -44,7 +44,7 @@ Webmin 可以两种方法安装:
### 贡献者
* [Joe Cooper](https://github.com/swelljoe)
* [Ilia Rostovtsev](https://github.com/iliaross)
* [Ilia Rostovtsev](https://github.com/iliajie)
* [Kay Marquardt](https://github.com/gnadelwartz)
* [Nawawi Jamili](https://github.com/nawawi) + [其他无偿奉献的开发者](https://github.com/webmin/webmin/graphs/contributors)

View File

@@ -48,13 +48,13 @@ For detailed installation instructions check our guide on [webmin.com/download](
* [Jamie Cameron](https://www.webmin.com/about.html) [![](https://github.com/webmin-devel/webmin/blob/master/media/linkedin-15x15.png?raw=true)](https://www.linkedin.com/in/jamiecameron2)
### Developers
* [Ilia Rostovtsev](https://github.com/iliaross)
* [Ilia Rostovtsev](https://github.com/iliajie)
* [Joe Cooper](https://github.com/swelljoe)
### Contributors
* [Kay Marquardt](https://github.com/gnadelwartz)
* [Nawawi Jamili](https://github.com/nawawi)
* [unknown10777](https://github.com/unknown10777) + [90 more...](https://github.com/webmin/webmin/graphs/contributors)
* [unknown10777](https://github.com/unknown10777) + [90 more..](https://github.com/webmin/webmin/graphs/contributors)
## License

File diff suppressed because one or more lines are too long

View File

@@ -355,7 +355,6 @@ unix_utable=Allowed Unix users
sessions_title=Current Login Sessions
sessions_id=Session ID
sessions_user=Webmin user
sessions_login_ago=Last active ago
sessions_login=Last active at
sessions_host=IP address
sessions_lview=View logs..

View File

@@ -28,7 +28,7 @@ print &ui_columns_start([ $text{'sessions_id'},
$text{'sessions_state'},
$text{'sessions_user'},
$text{'sessions_host'},
$text{'sessions_login_ago'},
$text{'sessions_login'},
$text{'sessions_actions'},
], 100);
foreach my $k (sort { my @a = split(/\s+/, $sessiondb{$a});
@@ -68,8 +68,7 @@ foreach my $k (sort { my @a = split(/\s+/, $sessiondb{$a});
push(@cols, $user);
}
push(@cols, $lip);
push(@cols, &make_date_relative($ltime).
" ".&ui_help(&make_date($ltime)));
push(@cols, &make_date($ltime));
my @links;
if ($haslog) {
push(@links, ui_link("../webminlog/search.cgi?uall=1&mall=1&tall=1&wall=1&fall=1&sid=$k", $text{'sessions_lview'}));

View File

@@ -20,12 +20,7 @@ foreach my $k (keys %sessiondb) {
next if ($k =~ /^1111111/);
next if (!$sessiondb{$k});
my ($user, $ltime, $lip) = split(/\s+/, $sessiondb{$k});
next if (&webmin_user_is_admin()
? ($user eq "!" ||
($user ne $remote_user &&
# Show all logins for past 3 days for admin
$ltime && $ltime < time() - 3*24*60*60))
: ($user ne $remote_user && $user ne "!".$remote_user));
next if ($user ne $remote_user && $user ne "!".$remote_user);
push(@logins, [ $user, $ltime, $lip, $k ]);
}
if (@logins) {
@@ -34,8 +29,7 @@ if (@logins) {
@logins = @logins[0..4];
}
my $html = &ui_columns_start([ $text{'sessions_host'},
$text{'sessions_user'},
$text{'sessions_login_ago'},
$text{'sessions_login'},
$text{'sessions_state'},
$text{'sessions_action'} ]);
my $open = 0;
@@ -68,13 +62,9 @@ if (@logins) {
&ui_link("@{[&get_webprefix()]}/acl/delete_session.cgi?id=$l->[3]&redirect_ref=1",
$text{'sessions_kill'}))
}
my $user = $l->[0];
$user =~ s/^\!//;
$html .= &ui_columns_row([
$l->[2],
$user,
&make_date_relative($l->[1]).
"&nbsp;".&ui_help(&make_date($l->[1])),
&make_date($l->[1]),
$state,
&ui_links_row(\@links) ]);
}

View File

@@ -116,4 +116,4 @@ Name of the user to disable two-factor authentication for.
Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com>
Ilia Ross <ilia@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com>

View File

@@ -260,5 +260,5 @@ Set new user password. Using this option may be unsecure.
Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com>
Ilia Ross <ilia@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com>

View File

@@ -174,5 +174,5 @@ sub root
Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com>
Ilia Ross <ilia@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com>

View File

@@ -457,5 +457,5 @@ Returns Webmin and other modules and themes versions installed (only those for w
Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com>
Ilia Ross <ilia@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com>

View File

@@ -1135,10 +1135,6 @@ elsif ($type eq "CNAME") {
print &ui_table_row($text{'value_CNAME1'},
&ui_textbox("value0", $v[0], 30)." ($text{'edit_cnamemsg'})", 3);
}
elsif ($type eq "ALIAS") {
print &ui_table_row($text{'value_ALIAS1'},
&ui_textbox("value0", $v[0], 30)." ($text{'edit_cnamemsg'})", 3);
}
elsif ($type eq "MX") {
print &ui_table_row($text{'value_MX2'},
&ui_textbox("value1", $v[1], 30));
@@ -3121,11 +3117,7 @@ $slave_error = $_[0];
sub get_forward_record_types
{
return ("A", "NS", "CNAME",
$config{'allow_alias'} ? ( "ALIAS" ) : ( ),
"MX", "HINFO", "TXT", "SPF", "DMARC", "WKS", "RP", "PTR", "LOC",
"SRV", "KEY", "TLSA", "SSHFP", "CAA", "NAPTR", "NSEC3PARAM",
$config{'support_aaaa'} ? ( "AAAA" ) : ( ), @extra_forward);
return ("A", "NS", "CNAME", "MX", "HINFO", "TXT", "SPF", "DMARC", "WKS", "RP", "PTR", "LOC", "SRV", "KEY", "TLSA", "SSHFP", "CAA", "NAPTR", "NSEC3PARAM", $config{'support_aaaa'} ? ( "AAAA" ) : ( ), @extra_forward);
}
sub get_reverse_record_types

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ spf_record=0
dnssec_info=1
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -50,4 +50,3 @@ tmpl_dnssec_dt=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -47,4 +47,3 @@ restart_cmd=service named restart
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -48,4 +48,3 @@ start_cmd=systemctl start bind9.service
stop_cmd=systemctl stop bind9.service
restart_cmd=systemctl reload bind9.service
dnssec_period=21
allow_alias=0

View File

@@ -48,4 +48,3 @@ start_cmd=systemctl start named.service
stop_cmd=systemctl stop named.service
restart_cmd=systemctl reload named.service
dnssec_period=21
allow_alias=0

View File

@@ -38,4 +38,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -44,4 +44,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -48,4 +48,3 @@ start_cmd=systemctl start bind9.service
stop_cmd=systemctl stop bind9.service
restart_cmd=systemctl reload bind9.service
dnssec_period=21
allow_alias=0

View File

@@ -48,4 +48,3 @@ start_cmd=systemctl start named.service
stop_cmd=systemctl stop named.service
restart_cmd=systemctl reload named.service
dnssec_period=21
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -44,4 +44,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ force_random=0
spf_record=0
pid_file=/var/run/named/pid
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ force_random=0
spf_record=0
pid_file=/var/run/named/pid
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ pid_file=/var/run/named/named.pid /private/var/run/named/named.pid
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -42,4 +42,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -42,4 +42,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -48,4 +48,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -42,4 +42,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -45,4 +45,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -52,4 +52,3 @@ stop_cmd=systemctl stop named
restart_cmd=systemctl reload named
chroot=
auto_chroot=
allow_alias=0

View File

@@ -52,4 +52,3 @@ spf_record=0
dnssec_info=1
chroot=
auto_chroot=
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -45,4 +45,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -46,4 +46,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -48,4 +48,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -35,4 +35,3 @@ other_slaves=1
updserial_man=1
master_ttl=1
dnssec_info=1
allow_alias=0

View File

@@ -47,4 +47,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -47,4 +47,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -47,4 +47,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -40,4 +40,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -43,4 +43,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -41,4 +41,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -58,4 +58,3 @@ other_slaves=1
force_random=0
spf_record=0
dnssec_info=1
allow_alias=0

View File

@@ -19,7 +19,6 @@ support_aaaa=Support DNS for IPv6 addresses,1,1-Yes,0-No
allow_comments=Allow comments for records,1,1-Yes,0-No
allow_wild=Allow wildcards?,1,1-Yes,0-No
allow_underscore=Allow underscores in record names?,1,1-Yes,0-No
allow_alias=Allow ALIAS records?,1,1-Yes,0-No
short_names=Convert record names to canonical form?,1,0-Yes,1-No
extra_forward=Extra record types for forward zones,0
extra_reverse=Extra record types for reverse zones,0

View File

@@ -398,7 +398,6 @@ type_A=Address
type_AAAA=IPv6 Address
type_NS=Name Server
type_CNAME=Name Alias
type_ALIAS=Address Alias
type_MX=Mail Server
type_HINFO=Host Information
type_NSEC3PARAM=DNSSEC Parameters
@@ -421,7 +420,6 @@ edit_A=Address
edit_AAAA=IPv6 Address
edit_NS=Name Server
edit_CNAME=Name Alias
edit_ALIAS=Address Alias
edit_MX=Mail Server
edit_HINFO=Host Information
edit_TXT=Text
@@ -444,7 +442,6 @@ recs_A=Address
recs_AAAA=IPv6 Address
recs_NS=Name Server
recs_CNAME=Name Alias
recs_ALIAS=Address Alias
recs_MX=Mail Server
recs_HINFO=Host Information
recs_TXT=Text
@@ -468,7 +465,6 @@ value_A1=Address
value_AAAA1=IPv6 Address
value_NS1=Name Server
value_CNAME1=Real Name
value_ALIAS1=Copy Address From
value_MX1=Priority
value_MX2=Mail Server
value_HINFO1=Hardware
@@ -1360,7 +1356,7 @@ xfer_done=.. from $1 : Completed OK
xfer_count=Test transfer successfully fetched $1 records from at least one nameserver. Actual transfers by BIND should also succeed.
xfer_none=Test transfer appeared to succeed, but didn't actually fetch any records!
tls_title=SSL Keys and Certificates
tls_title=SSL Keys And Certificates
tls_ecannot=You are not allowed to edit SSL keys and certificates
tls_esupport=SSL keys and certificates are not supported on this system
tls_name=Key name
@@ -1368,6 +1364,8 @@ tls_key=Key file
tls_cert=Certificate file
tls_ca=CA certificate file
tls_ca_def=None required
tls_ecannot=You are not allowed to edit SSL keys and certificates
tls_esupport=DNS over SSL is not supported on this system
tls_none=No SSL keys have been added yet.
tls_add=Add a new SSL key.
tls_desc=The SSL keys and certificates listed on this page can be used to enable DNS over SSL/TLS.

View File

@@ -216,13 +216,6 @@ else {
$vals .= ".";
}
}
elsif ($in{'type'} eq "ALIAS") {
&valname($vals) ||
&error(&text('edit_ecname', $vals));
if ($vals =~ /\.\Q$in{'origin'}\E$/) {
$vals .= ".";
}
}
elsif ($in{'type'} eq "MX") {
&valname($in{'value1'}) ||
&error(&text('edit_emx', $in{'value1'}));

View File

@@ -4,13 +4,19 @@ BEGIN { push(@INC, ".."); };
use WebminCore;
&init_config();
@supported_auths = ( "anonymous", "plain", "login", "digest-md5", "cram-md5",
"apop", "scram-sha-1", "scram-sha-256", "ntlm",
"gss-spnego", "gssapi", "rpa", "otp", "skey", "external",
@supported_auths = ( "anonymous", "plain", "digest-md5", "cram-md5", "apop",
"scram-sha-1", "scram-sha-256", "ntlm", "gss-spnego",
"gssapi", "rpa", "otp", "skey", "external",
"oauthbearer", "xoauth2" );
@mail_envs = ( undef, "maildir:~/Maildir", "mbox:~/mail/:INBOX=/var/mail/%u",
"maildir:~/Maildir:mbox:~/mail/" );
# Dovecot version specific mapping if any
our %dovecot;
our $version = &get_dovecot_based_version();
require "$module_root_directory/$module_name$version-lib.pl"
if (-r "$module_root_directory/$module_name$version-lib.pl");
# get_config_file()
# Returns the full path to the first valid config file
sub get_config_file
@@ -521,7 +527,7 @@ else {
# Returns 'Default (value)' for some config
sub getdef
{
local $def = &find_value($_[0], &get_config(), 1);
local $def = &find_value_mapped($_[0], &get_config(), 1);
if (defined($def)) {
local $map;
if ($_[1]) {
@@ -545,6 +551,15 @@ local $out = &backquote_command("$config{'dovecot'} --version 2>&1");
return $out =~ /([0-9\.]+)/ ? $1 : undef;
}
# get_dovecot_based_version()
# Returns the dovecot version number without the patch level and without dots
sub get_dovecot_based_version
{
my $base_version = &get_dovecot_version();
$base_version = $base_version =~ /^(\d)\.(\d)/ ? $1.$2 : '';
return $base_version;
}
# version_atleast(ver)
# Returns 1 if running at least some version or above
sub version_atleast
@@ -555,16 +570,6 @@ return 0 if (!$ver);
return &compare_version_numbers($ver, $wantver) >= 0;
}
# version_below(ver)
# Returns 1 if running below some version
sub version_below
{
local ($wantver) = @_;
local $ver = &get_dovecot_version();
return 0 if (!$ver);
return &compare_version_numbers($ver, $wantver) < 0;
}
sub list_lock_methods
{
local ($forindex) = @_;
@@ -605,5 +610,67 @@ else {
}
}
# find_mapped(name, &conf, [mode], [sectionname], [sectionvalue], [first])
# Version aware read
sub find_mapped
{
return &dovecot_shim('find', @_)
if defined &dovecot_shim && !$dovecot_shims{main};
return &find(@_);
}
# find_value_mapped(name, &config, [disabled-mode], [sectionname], [sectionvalue])
# Version aware value reader
sub find_value_mapped
{
my ($name, $conf, $mode, $sname, $svalue) = @_;
my @rv;
if (defined &dovecot_shim && !$dovecot_shims{main}) {
@rv = &dovecot_shim('find', $name, $conf, $mode, $sname, $svalue, undef);
}
else {
@rv = &find($name, $conf, $mode, $sname, $svalue, undef);
}
if (wantarray) {
return map { $_->{'value'} } @rv;
}
elsif (!@rv) {
return undef;
}
else {
# Prefer the last one that isn't self-referential
my @unself = grep { $_->{'value'} !~ /\$\Q$name\E/ } @rv;
@rv = @unself if (@unself);
return $rv[$#rv]->{'value'};
}
}
# save_directive_mapped(&conf, name|&dir, value, [sectionname], [sectionvalue])
# Version aware write
sub save_directive_mapped
{
return &dovecot_shim('save_directive', @_)
if defined &dovecot_shim && !$dovecot_shims{main};
return &save_directive(@_);
}
# save_section_mapped(&conf, &section)
# Version aware section update
sub save_section_mapped
{
return &dovecot_shim('save_section', @_)
if defined &dovecot_shim && !$dovecot_shims{main};
return &save_section(@_);
}
# create_section_mapped(&conf, &section, [&parent], [&before])
# Version aware section create
sub create_section_mapped
{
return &dovecot_shim('create_section', @_)
if defined &dovecot_shim && !$dovecot_shims{main};
return &create_section(@_);
}
1;

150
dovecot/dovecot24-lib.pl Executable file
View File

@@ -0,0 +1,150 @@
# Dovecot 2.4 compatibility shims
# %dovecot_shims
# Dispatch table of 2.4 overrides keyed by sub name
our %dovecot_shims = (
find => \&find_24,
save_directive => \&save_directive_24,
save_section => \&save_section_24,
create_section => \&create_section_24,
);
# dovecot_shim(caller-sub, @args)
# Single entrypoint that routes a call to a version-specific override
sub dovecot_shim
{
my ($sub, @args) = @_;
return if $dovecot_shims{main};
(my $subname = $sub) =~ s/^.*:://;
if (my $thissub = $dovecot_shims{$subname}) {
return $thissub->(@args);
}
my $mainsub = \&{$sub};
local $dovecot_shims{main} = 1;
return $mainsub->(@args);
}
# params([param])
# Simple mapping
sub params
{
my $name = shift;
my %map = (
# Auth
auth_default_realm => 'auth_default_domain',
disable_plaintext_auth => 'auth_allow_cleartext',
# SSL
ssl_ca => 'ssl_server_ca_file',
ssl_ca_file => 'ssl_client_ca_file',
ssl_cert => 'ssl_server_cert_file',
ssl_cert_file => 'ssl_server_cert_file',
ssl_key => 'ssl_server_key_file',
ssl_key_file => 'ssl_server_key_file',
ssl_key_password => 'ssl_server_key_password',
);
return wantarray ? %map : ($map{$name} || $name);
}
# map_find(name)
# Returns lookup key for compatibility
sub map_find
{
my ($name) = @_;
return &params($name);
}
# map_value(name, value)
# Converts values for compatibility
sub map_value
{
my ($name, $value) = @_;
$name = &map_find($name);
if ($name =~ /^(ssl_server_cert_file|ssl_server_key_file|ssl_server_ca_file|ssl_client_ca_file)$/) {
# Drop obsolete "<"
$value =~ s/^\s*<\s*// if defined $value;
}
elsif ($name eq 'auth_allow_cleartext') {
# Flip value
$value = lc($value) eq 'no' ? 'yes' : 'no' if defined $value;
}
return ($name, $value);
}
# map_members(members)
# Converts values to all members of a section
sub map_members
{
my ($members) = @_;
my @members;
for my $m (@{$members || []}) {
my ($n, $v) = &map_value($m->{name}, $m->{value});
my %copy = %$m;
$copy{name} = $n;
$copy{value} = $v;
push(@members, \%copy);
}
return \@members;
}
# find_24(name, &config, [disabled-mode], [sectionname], [sectionvalue], [first])
# Finds mapped or original directive
sub find_24
{
local ($name, $conf, $mode, $sname, $svalue, $first) = @_;
my $req = $name;
$name = &map_find($name);
local $dovecot_shims{main} = 1;
my @rv = &find($name, $conf, $mode, $sname, $svalue, undef);
foreach my $rv (@rv) {
my (undef, $v) = &map_value($req, $rv->{value});
$rv->{value} = $v;
}
return @rv if wantarray;
return $rv[0] if $first;
return $rv[$#rv];
}
# save_directive_24(&conf, name|&dir, value, [sectionname], [sectionvalue])
# Updates mapped or original directive in the config file
sub save_directive_24
{
local ($conf, $name, $value, $sname, $svalue) = @_;
if (ref $name) {
my ($nn, $vv) = &map_value($name->{name}, $value);
$name->{name} = $nn; $value = $vv;
local $dovecot_shims{main} = 1;
return &save_directive($conf, $name, $value, $sname, $svalue);
}
else {
my ($nn, $vv) = &map_value($name, $value);
local $dovecot_shims{main} = 1;
return &save_directive($conf, $nn, $vv, $sname, $svalue);
}
}
# save_section_24(&conf, &section)
# Updates one section in the config file with members mapped
sub save_section_24
{
local ($conf, $section) = @_;
$section->{members} = &map_members($section->{members});
local $dovecot_shims{main} = 1;
return &save_section($conf, $section);
}
# create_section_24(&conf, &section, [&parent], [&before])
# Adds a section to the config file with members mapped
sub create_section_24
{
local ($conf, $section, $parent, $before) = @_;
$section->{members} = &map_members($section->{members});
local $dovecot_shims{main} = 1;
return &create_section($conf, $section, $parent, $before);
}
1;

View File

@@ -14,11 +14,7 @@ print &ui_table_row($text{'login_realms'},
&ui_opt_textbox("realms", $realms, 40, $text{'login_none'}), 3);
# Default authentication realm
$realm = &find_value(
&version_atleast("2.4")
? "auth_default_domain"
: "auth_default_realm",
$conf);
$realm = &find_value_mapped("auth_default_realm", $conf);
print &ui_table_row($text{'login_realm'},
&ui_opt_textbox("realm", $realm, 10, $text{'default'}));
@@ -91,27 +87,25 @@ elsif ($userdb =~ /^sql\s+(.*)/) {
else {
$other = $userdb;
}
if (&version_below("2.4")) {
print &ui_table_row($text{'login_userdb'},
&ui_radio("usermode", $usermode,
[ [ "passwd", $text{'login_passwd'}."<br>" ],
[ "passwd-file", &text('login_passwdfile',
&ui_textbox("passwdfile", $passwdfile, 30))."<br>" ],
[ "static", &text('login_static',
&ui_textbox("uid", $uid, 6),
&ui_textbox("gid", $gid, 6),
&ui_textbox("home", $home, 20))."<br>" ],
[ "vpopmail", $text{'login_vpopmail'}."<br>" ],
[ "ldap", &text('login_ldap',
&ui_textbox("ldap", $ldap, 30))."<br>" ],
[ "pgsql", &text('login_pgsql',
&ui_textbox("pgsql", $pgsql, 30))."<br>" ],
[ "sql", &text('login_sql',
&ui_textbox("sql", $sql, 30))."<br>" ],
[ "", &text('login_other',
&ui_textbox("other", $other, 30))."<br>" ],
]), 3);
}
print &ui_table_row($text{'login_userdb'},
&ui_radio("usermode", $usermode,
[ [ "passwd", $text{'login_passwd'}."<br>" ],
[ "passwd-file", &text('login_passwdfile',
&ui_textbox("passwdfile", $passwdfile, 30))."<br>" ],
[ "static", &text('login_static',
&ui_textbox("uid", $uid, 6),
&ui_textbox("gid", $gid, 6),
&ui_textbox("home", $home, 20))."<br>" ],
[ "vpopmail", $text{'login_vpopmail'}."<br>" ],
[ "ldap", &text('login_ldap',
&ui_textbox("ldap", $ldap, 30))."<br>" ],
[ "pgsql", &text('login_pgsql',
&ui_textbox("pgsql", $pgsql, 30))."<br>" ],
[ "sql", &text('login_sql',
&ui_textbox("sql", $sql, 30))."<br>" ],
[ "", &text('login_other',
&ui_textbox("other", $other, 30))."<br>" ],
]), 3);
# Password authentication system
if (&find("auth_passdb", $conf, 2)) {
@@ -180,49 +174,46 @@ elsif ($passdb =~ /^checkpassword\s+(.*)$/) {
else {
$pother = $passdb;
}
print &ui_table_row($text{'login_passdb'},
&ui_radio("passmode", $passmode,
[ [ "passwd", $text{'login_passwd2'}."<br>" ],
[ "shadow", $text{'login_shadow'}."<br>" ],
[ "dpam", &text('login_dpam')."<br>" ],
$alpha_opts ?
( [ "pam", &text('login_pam2',
&ui_textbox("ppam", $ppam, 10),
&ui_checkbox("ppam_session", 1,
$text{'login_session'}, $psession),
&ui_opt_textbox("ppam_ckey", $pckey, 10,
$text{'login_none'}))."<br>" ]
) :
( [ "pam", &text('login_pam',
&ui_textbox("ppam", $ppam, 10))."<br>" ]
),
[ "passwd-file", &text('login_passwdfile',
&ui_textbox("ppasswdfile", $ppasswdfile, 30))."<br>" ],
[ "vpopmail", $text{'login_vpopmail'}."<br>" ],
[ "ldap", &text('login_ldap',
&ui_textbox("pldap", $pldap, 30))."<br>" ],
[ "pgsql", &text('login_pgsql',
&ui_textbox("ppgsql", $ppgsql, 30))."<br>" ],
[ "sql", &text('login_sql',
&ui_textbox("psql", $psql, 30))."<br>" ],
$alpha_opts ?
( [ "bsdauth",
&text('login_bsdauth',
&ui_opt_textbox("bsdauth_ckey", $pbckey, 10,
$text{'login_none'}))."<br>" ],
[ "checkpassword",
&text('login_checkpassword',
&ui_textbox("checkpassword", $checkpassword, 40))."<br>" ],
) :
( ),
[ "", &text('login_other',
&ui_textbox("pother", $pother, 30))."<br>" ],
]), 3);
if (&version_below("2.4")) {
print &ui_table_row($text{'login_passdb'},
&ui_radio("passmode", $passmode,
[ [ "passwd", $text{'login_passwd2'}."<br>" ],
[ "shadow", $text{'login_shadow'}."<br>" ],
[ "dpam", &text('login_dpam')."<br>" ],
$alpha_opts ?
( [ "pam", &text('login_pam2',
&ui_textbox("ppam", $ppam, 10),
&ui_checkbox("ppam_session", 1,
$text{'login_session'}, $psession),
&ui_opt_textbox("ppam_ckey", $pckey, 10,
$text{'login_none'}))."<br>" ]
) :
( [ "pam", &text('login_pam',
&ui_textbox("ppam", $ppam, 10))."<br>" ]
),
[ "passwd-file", &text('login_passwdfile',
&ui_textbox("ppasswdfile", $ppasswdfile, 30))."<br>" ],
[ "vpopmail", $text{'login_vpopmail'}."<br>" ],
[ "ldap", &text('login_ldap',
&ui_textbox("pldap", $pldap, 30))."<br>" ],
[ "pgsql", &text('login_pgsql',
&ui_textbox("ppgsql", $ppgsql, 30))."<br>" ],
[ "sql", &text('login_sql',
&ui_textbox("psql", $psql, 30))."<br>" ],
$alpha_opts ?
( [ "bsdauth",
&text('login_bsdauth',
&ui_opt_textbox("bsdauth_ckey", $pbckey, 10,
$text{'login_none'}))."<br>" ],
[ "checkpassword",
&text('login_checkpassword',
&ui_textbox("checkpassword", $checkpassword, 40))."<br>" ],
) :
( ),
[ "", &text('login_other',
&ui_textbox("pother", $pother, 30))."<br>" ],
]), 3);
print &ui_table_hr();
}
print &ui_table_hr();
$fuid = &find_value("first_valid_uid", $conf);
print &ui_table_row($text{'login_fuid'},
@@ -241,11 +232,7 @@ $lgid = &find_value("last_valid_gid", $conf);
print &ui_table_row($text{'login_lgid'},
&ui_opt_textbox("lgid", $lgid, 6, &getdef("last_valid_gid", \@mmap)));
$extra = &find_value(&version_atleast("2")
? "mail_access_groups"
: "mail_extra_groups",
$conf);
$extra = &find_value("mail_extra_groups", $conf);
print &ui_table_row($text{'login_extra'},
&ui_opt_textbox("extra", $extra, 50, $text{'login_none'})."\n".
&group_chooser_button("extra", 1), 3);

View File

@@ -13,49 +13,25 @@ $envmode = 4;
if (&find("default_mail_env", $conf, 2)) {
$env = &find_value("default_mail_env", $conf);
}
elsif (&find("mail_path", $conf, 2)) {
$env = &find_value("mail_path", $conf);
}
else {
$env = &find_value("mail_location", $conf);
}
if ($env =~ s/:INDEX=([^:]+)//) {
$index = $1;
}
elsif (&find("mail_index_path", $conf, 2)) {
$index = &find_value("mail_index_path", $conf);
}
if ($env =~ s/:CONTROL=([^:]+)//) {
$control = $1;
}
elsif (&find("mail_control_path", $conf, 2)) {
$control = &find_value("mail_control_path", $conf);
}
for($i=0; $i<@mail_envs; $i++) {
$envmode = $i if ($mail_envs[$i] eq $env);
}
print &ui_table_row($text{'mail_env'},
&ui_radio("envmode", $envmode,
[ ( map { [ $_, $text{'mail_env'.$_}."<br>" ] } (
&version_atleast("2.4") ? (0) : (0 .. 3)) ),
[ ( map { [ $_, $text{'mail_env'.$_}."<br>" ] } (0.. 3) ),
[ 4, &text('mail_env4',
&ui_textbox("other", $envmode == 4 ? $env : undef, 40)) ] ],
), 3);
# Mail file format
if (&version_atleast("2.4")) {
$driver = &find_value("mail_driver", $conf);
print &ui_table_row($text{'mail_driver'},
&ui_radio("driver", $driver,
[ [ "", $text{'mail_driver_def'} ],
[ "auto", $text{'mail_driver_auto'} ],
[ "mbox", $text{'mail_driver_mbox'} ],
[ "maildir", $text{'mail_driver_maildir'} ],
[ "dbox", $text{'mail_driver_dbox'} ],
[ "imapc", $text{'mail_driver_imapc'} ],
[ "pop3c", $text{'mail_driver_auto'} ] ]));
}
# Index files location
$indexmode = $index eq 'MEMORY' ? 1 :
$index ? 2 : 0;
@@ -113,10 +89,26 @@ print &ui_table_row($text{'mail_change'},
[ "", &getdef($dirty, \@opts) ] ]), 3);
# Permissions on files
if (&version_below("2")) {
$umask = &find_value("umask", $conf);
print &ui_table_row($text{'mail_umask'},
&ui_opt_textbox("umask", $umask, 5, &getdef("umask")), 3);
$umask = &find_value("umask", $conf);
print &ui_table_row($text{'mail_umask'},
&ui_opt_textbox("umask", $umask, 5, &getdef("umask")), 3);
# UIDL format
if (&find("pop3_uidl_format", $conf, 2)) {
$uidl = &find_value("pop3_uidl_format", $conf);
@opts = ( $uidl ? ( ) : ( [ "", $text{'mail_uidl_none'} ] ),
[ "%v.%u", $text{'mail_uidl_dovecot'} ],
[ "%08Xv%08Xu", $text{'mail_uidl_uw'} ],
[ "%f", $text{'mail_uidl_courier0'} ],
[ "%u", $text{'mail_uidl_courier1'} ],
[ "%v-%u", $text{'mail_uidl_courier2'} ],
[ "%Mf", $text{'mail_uidl_tpop3d'} ] );
($got) = grep { $_->[0] eq $uidl } @opts;
print &ui_table_row($text{'mail_uidl'},
&ui_select("pop3_uidl_format", $got ? $uidl : "*",
[ @opts, [ "*", $text{'mail_uidl_other'} ] ])."\n".
&ui_textbox("pop3_uidl_format_other", $got ? "" : $uidl, 10),
3);
}
# Allow POP3 last command

View File

@@ -9,64 +9,49 @@ print &ui_form_start("save_ssl.cgi", "post");
print &ui_table_start($text{'ssl_header'}, "width=100%", 4);
# SSL cert and key files
if (&version_atleast("2.4")) {
$cert = &find_value('ssl_server_cert_file', $conf, 0, "");
$cert =~ s/^<//;
}
elsif (&find_value("ssl_cert", $conf, 2) || &version_atleast("2.2")) {
$cert = &find_value("ssl_cert", $conf, 0, "");
if (&find_value_mapped("ssl_cert", $conf, 2) || &version_atleast("2.2")) {
$cert = &find_value_mapped("ssl_cert", $conf, 0, "");
$cert =~ s/^<//;
}
else {
$cert = &find_value("ssl_cert_file", $conf);
$cert = &find_value_mapped("ssl_cert_file", $conf);
}
print &ui_table_row($text{'ssl_cert'},
&ui_opt_textbox("cert", $cert, 40, &getdef("ssl_cert_file")), 3,
[ undef, "nowrap" ]);
if (&version_atleast("2.4")) {
$key = &find_value('ssl_server_key_file', $conf, 0, "");
$key =~ s/^<//;
}
elsif (&find_value("ssl_key", $conf, 2) || &version_atleast("2.2")) {
$key = &find_value("ssl_key", $conf, 0, "");
if (&find_value_mapped("ssl_key", $conf, 2) || &version_atleast("2.2")) {
$key = &find_value_mapped("ssl_key", $conf, 0, "");
$key =~ s/^<//;
}
else {
$key = &find_value("ssl_key_file", $conf);
$key = &find_value_mapped("ssl_key_file", $conf);
}
print &ui_table_row($text{'ssl_key'},
&ui_opt_textbox("key", $key, 40, &getdef("ssl_key_file")), 3,
[ undef, "nowrap" ]);
# SSL key password
$pass = &find_value_mapped("ssl_key_password", $conf);
print &ui_table_row($text{'ssl_pass'},
&ui_opt_textbox("pass", $pass, 20, $text{'ssl_prompt'}), 3,
[ undef, "nowrap" ]);
# SSL CA file
if (&version_atleast("2.4")) {
$ca = &find_value('ssl_server_ca_file', $conf, 0, "");
$ca =~ s/^<//;
}
elsif (&find_value("ssl_ca", $conf, 2) || &version_atleast("2.2")) {
$ca = &find_value("ssl_ca", $conf, 0, "");
if (&find_value_mapped("ssl_ca", $conf, 2) || &version_atleast("2.2")) {
$ca = &find_value_mapped("ssl_ca", $conf, 0, "");
$ca =~ s/^<//;
}
else {
$ca = &find_value("ssl_ca_file", $conf);
$ca = &find_value_mapped("ssl_ca_file", $conf);
}
print &ui_table_row($text{'ssl_ca'},
&ui_opt_textbox("ca", $ca, 40,
&getdef("ssl_ca_file", [ [ "", $text{'ssl_none'} ] ])), 3,
[ undef, "nowrap" ]);
# SSL key password
my $passdir = &version_atleast("2.4")
? "ssl_server_key_password"
: "ssl_key_password";
$pass = &find_value($passdir, $conf);
print &ui_table_row($text{'ssl_pass'},
&ui_opt_textbox("pass", $pass, 20, $text{'ssl_prompt'}), 3,
[ undef, "nowrap" ]);
# Parameter regen time
if (&version_below("2.4")) {
if ($version < 23) {
$regen = &find_value("ssl_parameters_regenerate", $conf);
print &ui_table_row($text{'ssl_regen'},
&ui_opt_textbox("regen", $regen, 5,
@@ -75,22 +60,12 @@ if (&version_below("2.4")) {
}
# Disable plaintext passwords when not SSL
if (&find_value("auth_allow_cleartext", $conf, 2)) {
@opts = ( [ 'yes', $text{'yes'} ], [ 'no', $text{'no'} ] );
$plain = &find_value("auth_allow_cleartext", $conf);
print &ui_table_row($text{'ssl_plain2'},
&ui_radio("plain", $plain,
[ @opts,
[ '', "$text{'default'} (No)" ] ]), 3);
}
else {
@opts = ( [ 'yes', $text{'yes'} ], [ 'no', $text{'no'} ] );
$plain = &find_value("disable_plaintext_auth", $conf);
print &ui_table_row($text{'ssl_plain'},
&ui_radio("plain", $plain,
[ @opts,
[ '', &getdef("disable_plaintext_auth", \@opts) ] ]), 3);
}
@opts = ( [ 'yes', $text{'yes'} ], [ 'no', $text{'no'} ] );
$plain = &find_value_mapped("disable_plaintext_auth", $conf);
print &ui_table_row($text{'ssl_plain'},
&ui_radio("plain", $plain,
[ @opts,
[ '', &getdef("disable_plaintext_auth", \@opts) ] ]), 3);
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);

View File

@@ -33,6 +33,7 @@ if (!&get_config_file()) {
# Show icons for option categories
@pages = ( "net", "login", "mail", "ssl", "manual" );
@pages = grep { $_ ne 'login' && $_ ne 'mail' } @pages unless $version < 24;
@titles = map { $text{$_."_title"} } @pages;
@icons = map { "images/".$_.".gif" } @pages;
@links = map { "edit_".$_.".cgi" } @pages;

View File

@@ -56,7 +56,6 @@ ssl_regen=Interval between SSL parameter regeneration
ssl_hours=hours
ssl_none=None
ssl_plain=Disallow plaintext authentication in non-SSL mode?
ssl_plain2=Allow plaintext authentication in non-SSL mode?
ssl_err=Failed to save SSL configuration
ssl_ekey=Missing or non-existent private key file
ssl_ecert=Missing or non-existent certificate file
@@ -135,14 +134,6 @@ mail_env1=Inbox and folders in <tt>~/Maildir</tt>
mail_env2=Inbox under <tt>/var/mail</tt>, folders in <tt>~/mail</tt>
mail_env3=Inbox in <tt>~/Maildir</tt>, folders in <tt>~/mail</tt>
mail_env4=Other Dovecot location $1
mail_driver=Mail file format
mail_driver_def=Dovecot default
mail_driver_auto=Detect automatically
mail_driver_mbox=mbox (one file per folder)
mail_driver_maildir=Maildir (one file per message)
mail_driver_dbox=Dbox (Dovecot's custom format)
mail_driver_imapc=Remote IMAP server
mail_driver_pop3c=Remote POP3 server
mail_index=Index files location
mail_index0=Default (in Maildir directory)
mail_index1=In memory only
@@ -161,6 +152,16 @@ mail_eenv=Missing or invalid-looking mail location
mail_echeck=Missing or non-numeric number of seconds between checks
mail_eidle=Missing or non-numeric number of seconds between checks when idle
mail_eumask=Missing or invalid four-digit octal Umask
mail_uidl=UIDL format
mail_uidl_other=Other..
mail_uidl_none=Not set (WARNING - Dove may not start)
mail_uidl_dovecot=Old Dovecot, new Cyrus
mail_uidl_uw=UW ipop3d
mail_uidl_courier0=Courier version 0
mail_uidl_courier1=Courier version 1, old Cyrus
mail_uidl_courier2=Courier version 2
mail_uidl_tpop3d=tpop3d
mail_euidl=Missing or invalid UIDL format
mail_last=Allow use of POP3 LAST command?
mail_lock=Index files locking method
mail_fcntl=fcntl function

View File

@@ -10,151 +10,144 @@ $conf = &get_config();
# Allowed and default realm
&save_directive($conf, "auth_realms",
$in{'realms_def'} ? undef : $in{'realms'});
&save_directive($conf,
&version_atleast("2.4")
? "auth_default_domain"
: "auth_default_realm",
&save_directive_mapped($conf, "auth_default_realm",
$in{'realm_def'} ? undef : $in{'realm'});
# Authentication mechanisms
if (&find("auth_mechanisms", $conf, 2)) {
&save_directive($conf, "auth_mechanisms",
$in{'mechs'}
? join(" ", split(/\0/, $in{'mechs'}))
: undef);
join(" ", split(/\0/, $in{'mechs'})));
}
else {
&save_directive($conf, "mechanisms",
join(" ", split(/\0/, $in{'mechs'})), "auth","default");
}
if (&version_below("2.4")) {
# User database
$userdb = $in{'usermode'};
if ($in{'usermode'} eq 'passwd-file') {
-r $in{'passwdfile'} || &error($text{'login_epasswdfile'});
$userdb .= " ".$in{'passwdfile'};
}
elsif ($in{'usermode'} eq 'static') {
$in{'uid'} =~ /^\d+$/ || &error($text{'login_euid'});
$in{'gid'} =~ /^\d+$/ || &error($text{'login_egid'});
$in{'home'} || &error($text{'login_ehome'});
$userdb .= " uid=".$in{'uid'}." gid=".$in{'gid'}.
" home=".$in{'home'};
}
elsif ($in{'usermode'} eq 'ldap') {
-r $in{'ldap'} || &error($text{'login_eldap'});
$userdb .= " ".$in{'ldap'};
}
elsif ($in{'usermode'} eq 'pgsql') {
-r $in{'pgsql'} || &error($text{'login_epgsql'});
$userdb .= " ".$in{'pgsql'};
}
elsif ($in{'usermode'} eq 'sql') {
-r $in{'sql'} || &error($text{'login_esql'});
$userdb .= " ".$in{'sql'};
}
elsif ($in{'usermode'} eq '') {
$userdb = $in{'other'};
}
if ($usec = &find_section("userdb", $conf, undef, "auth", "default")) {
# Version 1.0.alpha format, which has a userdb *section*
($svalue, $args) = split(/\s+/, $userdb, 2);
$usec->{'value'} = $svalue;
$usec->{'members'} = [ grep { $_->{'name'} ne 'args' }
@{$usec->{'members'}} ];
if ($args) {
$usec->{'members'} = [ { 'name' => 'args',
'value' => $args } ];
}
&save_section($conf, $usec);
}
elsif (&find("auth_userdb", $conf, 2)) {
# Version 0.99 format
&save_directive($conf, "auth_userdb", $userdb);
}
elsif (&find_value("driver", $conf, 2, "userdb")) {
# Version 2.0 format
$args = $userdb =~ s/\s+(\S.*)$// ? $1 : undef;
&save_directive($conf, "driver", $userdb, "userdb");
&save_directive($conf, "args", $args, "userdb");
}
else {
# Version 1.0 format
&save_directive($conf, "userdb", $userdb, "auth", "default");
# User database
$userdb = $in{'usermode'};
if ($in{'usermode'} eq 'passwd-file') {
-r $in{'passwdfile'} || &error($text{'login_epasswdfile'});
$userdb .= " ".$in{'passwdfile'};
}
elsif ($in{'usermode'} eq 'static') {
$in{'uid'} =~ /^\d+$/ || &error($text{'login_euid'});
$in{'gid'} =~ /^\d+$/ || &error($text{'login_egid'});
$in{'home'} || &error($text{'login_ehome'});
$userdb .= " uid=".$in{'uid'}." gid=".$in{'gid'}.
" home=".$in{'home'};
}
elsif ($in{'usermode'} eq 'ldap') {
-r $in{'ldap'} || &error($text{'login_eldap'});
$userdb .= " ".$in{'ldap'};
}
elsif ($in{'usermode'} eq 'pgsql') {
-r $in{'pgsql'} || &error($text{'login_epgsql'});
$userdb .= " ".$in{'pgsql'};
}
elsif ($in{'usermode'} eq 'sql') {
-r $in{'sql'} || &error($text{'login_esql'});
$userdb .= " ".$in{'sql'};
}
elsif ($in{'usermode'} eq '') {
$userdb = $in{'other'};
}
if ($usec = &find_section("userdb", $conf, undef, "auth", "default")) {
# Version 1.0.alpha format, which has a userdb *section*
($svalue, $args) = split(/\s+/, $userdb, 2);
$usec->{'value'} = $svalue;
$usec->{'members'} = [ grep { $_->{'name'} ne 'args' }
@{$usec->{'members'}} ];
if ($args) {
$usec->{'members'} = [ { 'name' => 'args',
'value' => $args } ];
}
&save_section($conf, $usec);
}
elsif (&find("auth_userdb", $conf, 2)) {
# Version 0.99 format
&save_directive($conf, "auth_userdb", $userdb);
}
elsif (&find_value("driver", $conf, 2, "userdb")) {
# Version 2.0 format
$args = $userdb =~ s/\s+(\S.*)$// ? $1 : undef;
&save_directive($conf, "driver", $userdb, "userdb");
&save_directive($conf, "args", $args, "userdb");
}
else {
# Version 1.0 format
&save_directive($conf, "userdb", $userdb, "auth", "default");
}
# Password mode
$passdb = $in{'passmode'};
if ($in{'passmode'} eq 'dpam') {
$passdb = "pam";
# Password mode
$passdb = $in{'passmode'};
if ($in{'passmode'} eq 'dpam') {
$passdb = "pam";
}
elsif ($in{'passmode'} eq 'pam') {
$in{'ppam'} =~ /^\S+$/ || &error($text{'login_edpam'});
if (defined($in{'ppam_ckey'}) && !$in{'ppam_ckey_def'}) {
$ckey = $in{'ppam_ckey'};
$ckey =~ /^\S+$/ || &error($text{'login_eckey'});
}
elsif ($in{'passmode'} eq 'pam') {
$in{'ppam'} =~ /^\S+$/ || &error($text{'login_edpam'});
if (defined($in{'ppam_ckey'}) && !$in{'ppam_ckey_def'}) {
$ckey = $in{'ppam_ckey'};
$ckey =~ /^\S+$/ || &error($text{'login_eckey'});
}
$passdb .= ($in{'ppam_session'} ? " -session" : "").
($ckey ? " cache_key=$ckey" : "").
" ".$in{'ppam'};
}
elsif ($in{'passmode'} eq 'passwd-file') {
-r $in{'ppasswdfile'} || &error($text{'login_epasswdfile'});
$passdb .= " ".$in{'ppasswdfile'};
}
elsif ($in{'passmode'} eq 'ldap') {
-r $in{'pldap'} || &error($text{'login_eldap'});
$passdb .= " ".$in{'pldap'};
}
elsif ($in{'passmode'} eq 'pgsql') {
-r $in{'ppgsql'} || &error($text{'login_epgsql'});
$passdb .= " ".$in{'ppgsql'};
}
elsif ($in{'passmode'} eq 'sql') {
-r $in{'psql'} || &error($text{'login_esql'});
$passdb .= " ".$in{'psql'};
}
elsif ($in{'passmode'} eq 'bsdauth') {
$in{'bsdauth_ckey_def'} || $in{'bsdauth_ckey'} =~ /^\S+$/ ||
&error($text{'login_eckey'});
$passdb .= " cache_key=$in{'bsdauth_ckey'}"
if (!$in{'bsdauth_ckey_def'});
}
elsif ($in{'passmode'} eq 'checkpassword') {
-x $in{'checkpassword'} || &error($text{'login_echeckpassword'});
$passdb .= " ".$in{'checkpassword'};
}
elsif ($in{'passmode'} eq '') {
$passdb = $in{'other'};
}
# XXX other modes
if ($psec = &find_section("passdb", $conf, undef, "auth", "default")) {
# Version 1.0.alpha format
($svalue, $args) = split(/\s+/, $passdb, 2);
$psec->{'value'} = $svalue;
$psec->{'members'} = [ grep { $_->{'name'} ne 'args' }
@{$psec->{'members'}} ];
if ($args) {
$psec->{'members'} = [ { 'name' => 'args',
'value' => $args } ];
}
&save_section($conf, $psec);
}
elsif (&find("auth_passdb", $conf, 2)) {
# Version 0.99 format
&save_directive($conf, "auth_passdb", $passdb);
}
elsif (&find_value("driver", $conf, 2, "passdb")) {
# Version 2.0 format
$args = $passdb =~ s/\s+(\S.*)$// ? $1 : undef;
&save_directive($conf, "driver", $passdb, "passdb");
&save_directive($conf, "args", $args, "passdb");
}
else {
# Version 1.0 format
&save_directive($conf, "passdb", $passdb, "auth", "default");
$passdb .= ($in{'ppam_session'} ? " -session" : "").
($ckey ? " cache_key=$ckey" : "").
" ".$in{'ppam'};
}
elsif ($in{'passmode'} eq 'passwd-file') {
-r $in{'ppasswdfile'} || &error($text{'login_epasswdfile'});
$passdb .= " ".$in{'ppasswdfile'};
}
elsif ($in{'passmode'} eq 'ldap') {
-r $in{'pldap'} || &error($text{'login_eldap'});
$passdb .= " ".$in{'pldap'};
}
elsif ($in{'passmode'} eq 'pgsql') {
-r $in{'ppgsql'} || &error($text{'login_epgsql'});
$passdb .= " ".$in{'ppgsql'};
}
elsif ($in{'passmode'} eq 'sql') {
-r $in{'psql'} || &error($text{'login_esql'});
$passdb .= " ".$in{'psql'};
}
elsif ($in{'passmode'} eq 'bsdauth') {
$in{'bsdauth_ckey_def'} || $in{'bsdauth_ckey'} =~ /^\S+$/ ||
&error($text{'login_eckey'});
$passdb .= " cache_key=$in{'bsdauth_ckey'}"
if (!$in{'bsdauth_ckey_def'});
}
elsif ($in{'passmode'} eq 'checkpassword') {
-x $in{'checkpassword'} || &error($text{'login_echeckpassword'});
$passdb .= " ".$in{'checkpassword'};
}
elsif ($in{'passmode'} eq '') {
$passdb = $in{'other'};
}
# XXX other modes
if ($psec = &find_section("passdb", $conf, undef, "auth", "default")) {
# Version 1.0.alpha format
($svalue, $args) = split(/\s+/, $passdb, 2);
$psec->{'value'} = $svalue;
$psec->{'members'} = [ grep { $_->{'name'} ne 'args' }
@{$psec->{'members'}} ];
if ($args) {
$psec->{'members'} = [ { 'name' => 'args',
'value' => $args } ];
}
&save_section($conf, $psec);
}
elsif (&find("auth_passdb", $conf, 2)) {
# Version 0.99 format
&save_directive($conf, "auth_passdb", $passdb);
}
elsif (&find_value("driver", $conf, 2, "passdb")) {
# Version 2.0 format
$args = $passdb =~ s/\s+(\S.*)$// ? $1 : undef;
&save_directive($conf, "driver", $passdb, "passdb");
&save_directive($conf, "args", $args, "passdb");
}
else {
# Version 1.0 format
&save_directive($conf, "passdb", $passdb, "auth", "default");
}
# Allowed UIDs and GIDs
@@ -174,10 +167,7 @@ $in{'lgid_def'} || $in{'lgid'} =~ /^\d+$/ || &error($text{'login_elgid'});
&save_directive($conf, "last_valid_gid",
$in{'lgid_def'} ? undef : $in{'lgid'});
&save_directive($conf,
&version_atleast("2")
? "mail_access_groups"
: "mail_extra_groups",
&save_directive($conf, "mail_extra_groups",
$in{'extra_def'} ? undef : $in{'extra'});
$in{'chroot_def'} || -d $in{'chroot'} || &error($text{'login_echroot'});

View File

@@ -17,59 +17,27 @@ else {
}
# Add index file location
if (&version_below("2.4")) {
$env || !$in{'indexmode'} || &error($text{'mail_eindexmode'});
$env || !$in{'controlmode'} || &error($text{'mail_econtrolmode'});
if ($in{'indexmode'} == 1) {
$env .= ":INDEX=MEMORY";
}
elsif ($in{'indexmode'} == 2) {
$in{'index'} =~ /^\/\S+$/ || &error($text{'mail_eindex'});
$env .= ":INDEX=".$in{'index'};
}
if ($in{'controlmode'}) {
$in{'control'} =~ /^\/\S+$/ || &error($text{'mail_econtrol'});
$env .= ":CONTROL=".$in{'control'};
}
$env || !$in{'indexmode'} || &error($text{'mail_eindexmode'});
$env || !$in{'controlmode'} || &error($text{'mail_econtrolmode'});
if ($in{'indexmode'} == 1) {
$env .= ":INDEX=MEMORY";
}
else {
# Parse index and control first
if ($in{'indexmode'} == 1) {
$index = "MEMORY";
}
elsif ($in{'indexmode'} == 2) {
$in{'index'} =~ /^\/\S+$/ || $in{'index'} =~ /^~\S+$/ ||
&error($text{'mail_eindex'});
$index = $in{'index'};
}
if ($in{'controlmode'}) {
$in{'control'} =~ /^\/\S+$/ || $in{'control'} =~ /^~\S+$/ ||
&error($text{'mail_econtrol'});
$control = $in{'control'};
}
# Directly save dedicated mail_index_path and mail_control_path
&save_directive($conf, "mail_index_path",
$index eq "" ? undef : $index);
&save_directive($conf, "mail_control_path",
$control eq "" ? undef : $control);
elsif ($in{'indexmode'} == 2) {
$in{'index'} =~ /^\/\S+$/ || &error($text{'mail_eindex'});
$env .= ":INDEX=".$in{'index'};
}
if ($in{'controlmode'}) {
$in{'control'} =~ /^\/\S+$/ || &error($text{'mail_econtrol'});
$env .= ":CONTROL=".$in{'control'};
}
if (&find("default_mail_env", $conf, 2)) {
&save_directive($conf, "default_mail_env", $env eq "" ? undef : $env);
}
elsif (&find("mail_path", $conf, 2)) {
&save_directive($conf, "mail_path", $env eq "" ? undef : $env);
}
else {
&save_directive($conf, "mail_location", $env eq "" ? undef : $env);
}
# Mail file format
if (&version_atleast("2.4")) {
my $driver = $in{'driver'};
&save_directive($conf, "mail_driver", $driver eq "" ? undef : $driver);
}
# Idle intervals
$in{'idle'} != 2 || $in{'idlei'} =~ /^\d+$/ || &error($text{'mail_eidle'});
&save_directive($conf, "mailbox_idle_check_interval",
@@ -89,12 +57,17 @@ else {
$in{'change'} ? $in{'change'} : undef);
}
if (&version_below("2")) {
# Umask
$in{'umask_def'} || $in{'umask'} =~ /^[0-7]{4}$/ ||
&error($text{'mail_eumask'});
&save_directive($conf, "umask",
$in{'umask_def'} ? undef : $in{'umask'});
# Umask
$in{'umask_def'} || $in{'umask'} =~ /^[0-7]{4}$/ ||&error($text{'mail_eumask'});
&save_directive($conf, "umask",
$in{'umask_def'} ? undef : $in{'umask'});
# UIDL format
if (&find("pop3_uidl_format", $conf, 2)) {
$uidl = $in{'pop3_uidl_format'} eq '*' ?
$in{'pop3_uidl_format_other'} : $in{'pop3_uidl_format'};
$uidl =~ /^\S+$/ || &error($text{'mail_euidl'});
&save_directive($conf, "pop3_uidl_format", $uidl);
}
# LAST command

View File

@@ -7,82 +7,58 @@ require './dovecot-lib.pl';
$conf = &get_config();
&lock_dovecot_files($conf);
# Save SSL cert
# Save SSL cert and key
$in{'cert_def'} || -r $in{'cert'} || $in{'cert'} =~ /^[<>\|]/ ||
&error($text{'ssl_ecert'});
if (&version_atleast("2.4")) {
&save_directive($conf, "ssl_server_cert_file",
$in{'cert_def'} ? undef : $in{'cert'}, "");
}
elsif (&find_value("ssl_cert", $conf, 2) || &version_atleast("2.2")) {
if (&find_value_mapped("ssl_cert", $conf, 2) || &version_atleast("2.2")) {
$in{'cert'} = "<".$in{'cert'} if ($in{'cert'} =~ /^\//);
&save_directive($conf, "ssl_cert",
&save_directive_mapped($conf, "ssl_cert",
$in{'cert_def'} ? undef : $in{'cert'}, "");
}
else {
&save_directive($conf, "ssl_cert_file",
&save_directive_mapped($conf, "ssl_cert_file",
$in{'cert_def'} ? undef : $in{'cert'});
}
# Save SSL key
$in{'key_def'} || -r $in{'key'} || $in{'key'} =~ /^[<>\|]/ ||
&error($text{'ssl_ekey'});
if (&version_atleast("2.4")) {
&save_directive($conf, "ssl_server_key_file",
$in{'key_def'} ? undef : $in{'key'}, "");
}
elsif (&find_value("ssl_key", $conf, 2) || &version_atleast("2.2")) {
if (&find_value_mapped("ssl_key", $conf, 2) || &version_atleast("2.2")) {
$in{'key'} = "<".$in{'key'} if ($in{'key'} =~ /^\//);
&save_directive($conf, "ssl_key",
&save_directive_mapped($conf, "ssl_key",
$in{'key_def'} ? undef : $in{'key'}, "");
}
else {
&save_directive($conf, "ssl_key_file",
&save_directive_mapped($conf, "ssl_key_file",
$in{'key_def'} ? undef : $in{'key'});
}
# Save SSL CA cert
$in{'ca_def'} || -r $in{'ca'} || $in{'ca'} =~ /^[<>\|]/ ||
&error($text{'ssl_eca'});
if (&version_atleast("2.4")) {
&save_directive($conf, "ssl_server_ca_file",
$in{'ca_def'} ? undef : $in{'ca'}, "");
}
elsif (&find_value("ssl_ca", $conf, 2) || &version_atleast("2.2")) {
if (&find_value_mapped("ssl_ca", $conf, 2) || &version_atleast("2.2")) {
$in{'ca'} = "<".$in{'ca'} if ($in{'ca'} =~ /^\//);
&save_directive($conf, "ssl_ca",
&save_directive_mapped($conf, "ssl_ca",
$in{'ca_def'} ? undef : $in{'ca'}, "");
}
else {
&save_directive($conf, "ssl_ca_file",
&save_directive_mapped($conf, "ssl_ca_file",
$in{'ca_def'} ? undef : $in{'ca'});
}
# Save SSL key password
$in{'pass_def'} || $in{'pass'} =~ /\S/ || &error($text{'ssl_epass'});
&save_directive($conf,
&version_atleast("2.4")
? "ssl_server_key_password"
: "ssl_key_password",
$in{'pass_def'} ? undef : $in{'pass'});
&save_directive_mapped($conf, "ssl_key_password",
$in{'pass_def'} ? undef : $in{'pass'});
# Save SSL parameter regeneration time
if (&version_below("2.4")) {
if ($version < 23) {
$in{'regen_def'} || $in{'regen'} =~ /^\d+$/ ||
&error($text{'ssl_eregen'});
&save_directive($conf, "ssl_parameters_regenerate",
$in{'regen_def'} ? undef : $in{'regen'});
}
# Save plaintext password setting
if (&find_value("auth_allow_cleartext", $conf, 2)) {
&save_directive($conf, "auth_allow_cleartext",
$in{'plain'} ? $in{'plain'} : undef);
}
else {
&save_directive($conf, "disable_plaintext_auth",
$in{'plain'} ? $in{'plain'} : undef);
}
&save_directive_mapped($conf, "disable_plaintext_auth",
$in{'plain'} ? $in{'plain'} : undef);
&flush_file_lines();
&unlock_dovecot_files($conf);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

31
lang/en
View File

@@ -438,37 +438,6 @@ file_truncated_message=fetched $1 of data, truncated $2 out of $3
file_truncated_message_head=fetched beginning $1 of data, truncated $2 out of $3
file_truncated_message_tail=fetched ending $1 of data, truncated $2 out of $3
time_ago_col=Time ago
time_ago_year=$1 year ago
time_ago_years=$1 years ago
time_ago_month=$1 month ago
time_ago_months=$1 months ago
time_ago_week=$1 week ago
time_ago_weeks=$1 weeks ago
time_ago_day=$1 day ago
time_ago_days=$1 days ago
time_ago_hour=$1 hour ago
time_ago_hours=$1 hours ago
time_ago_min=$1 minute ago
time_ago_mins=$1 minutes ago
time_ago_sec=$1 second ago
time_ago_secs=$1 seconds ago
time_in_year=In $1 year
time_in_years=In $1 years
time_in_month=In $1 month
time_in_months=In $1 months
time_in_week=In $1 week
time_in_weeks=In $1 weeks
time_in_day=In $1 day
time_in_days=In $1 days
time_in_hour=In $1 hour
time_in_hours=In $1 hours
time_in_min=In $1 minute
time_in_mins=In $1 minutes
time_in_sec=In $1 second
time_in_secs=In $1 seconds
time_now=Just now
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

View File

@@ -20,7 +20,6 @@ journal_journalctl_unit=Messages for specific unit
journal_since0=Latest available
journal_since1=Real-time follow
journal_since2=Current boot
journal_since2-1=Last boot
journal_since3=7 days ago
journal_since4=24 hours ago
journal_since5=8 hours ago

View File

@@ -35,7 +35,6 @@ return [
{ "" => $text{'journal_since0'} },
{ "--follow" => $text{'journal_since1'} },
{ "--boot" => $text{'journal_since2'} },
{ "--boot -1" => $text{'journal_since2-1'} },
{ "--since '7 days ago'" => $text{'journal_since3'} },
{ "--since '24 hours ago'" => $text{'journal_since4'} },
{ "--since '8 hours ago'" => $text{'journal_since5'} },

View File

@@ -2073,8 +2073,7 @@ if (!$h && $folder->{'server'} eq '*') {
}
}
$imapcmd || return (0, "Dovecot imap command not found");
$imapcmd .= " -u ".($folder->{'user'} eq "*" ||
!$folder->{'user'} ? $remote_user : $folder->{'user'});
$imapcmd .= " -u ".($folder->{'user'} eq "*" ? $remote_user : $folder->{'user'});
print DEBUG "Running IMAP server $imapcmd\n";
eval "use IPC::Open3";
if ($@) {

View File

@@ -25,61 +25,23 @@ my $changelog_file = "$debian_dir/changelog";
my $files_file = "$debian_dir/files";
# Parse command-line args
my ($force_theme, $url, $upstream,
my ($force_theme, $url, $upstream, $debdepends, $debrecommends,
$no_prefix, $force_usermin, $release, $allow_overwrite, $final_mod,
$dsc_file, $dir, $ver, @exclude,
$debdepends, $nodebdepends, $debrecommends, $nodebrecommends,
$no_requires, $no_recommends, $no_suggests, $no_conflicts, $no_replaces,
$no_breaks, $no_provides, $no_obsoletes);
$dsc_file, $dir, $ver, @exclude);
my $mod_list = 'full';
while(@ARGV) {
my $a = shift(@ARGV);
if ($a eq "--deb-depends" || $a eq "--mod-depends") {
if ($a eq "--deb-depends") {
$debdepends = 1;
}
elsif ($a eq "--no-mod-depends") {
$nodebdepends = 1;
}
elsif ($a eq "--deb-recommends" || $a eq "--mod-recommends") {
elsif ($a eq "--deb-recommends") {
$debrecommends = 1;
}
elsif ($a eq "--no-mod-recommends") {
$nodebrecommends = 1;
}
# --recommends, --suggests, --conflicts, --provides and --obsoletes are
# not for Webmin modules, and not meant to have prefix, and populated
# from module.info automatically
# --no-requires, --no-recommends, --no-suggests,
# --no-conflicts, --no-replaces, --no-breaks, --no-provides,
# --no-obsoletes can be used to disable the automatic population of
# these fields from module.info
elsif ($a eq "--no-requires") {
$no_requires = 1;
}
elsif ($a eq "--no-recommends") {
$no_recommends = 1;
}
elsif ($a eq "--no-suggests") {
$no_suggests = 1;
}
elsif ($a eq "--no-conflicts") {
$no_conflicts = 1;
}
elsif ($a eq "--no-replaces") {
$no_replaces = 1;
}
elsif ($a eq "--no-breaks") {
$no_breaks = 1;
}
elsif ($a eq "--no-provides") {
$no_provides = 1;
}
elsif ($a eq "--no-obsoletes") {
$no_obsoletes = 1;
}
elsif ($a eq "--no-prefix") {
$no_prefix = 1;
}
@@ -136,24 +98,13 @@ while(@ARGV) {
}
}
# Disable module's depends and recommends if set in extra flags
$debdepends = 0 if ($nodebdepends);
$debrecommends = 0 if ($nodebrecommends);
# Validate args
if (!$dir) {
print "usage: ", CYAN, "makemoduledeb.pl ";
print CYAN, "<module> [version]";
print YELLOW, "\n";
print " [--mod-depends] [--no-mod-depends]\n";
print " [--mod-recommends] [--no-mod-recommends]\n";
print " [--no-requires]\n";
print " [--no-suggests]\n";
print " [--no-conflicts]\n";
print " [--no-replaces]\n";
print " [--no-breaks]\n";
print " [--no-provides]\n";
print " [--no-obsoletes]\n";
print " [--deb-depends]\n";
print " [--deb-recommends]\n";
print " [--no-prefix]\n";
print " [--licence name]\n";
print " [--email 'name <address>']\n";
@@ -330,7 +281,7 @@ if ($debrecommends && defined($minfo{'recommends'})) {
# Build (append) list of required packages (not Webmin modules)
my @rrequires = ( );
if (!$no_requires && exists($minfo{'deb_requires'})) {
if (exists($minfo{'deb_requires'})) {
foreach my $debrequire (split(/\s+/, $minfo{'deb_requires'})) {
push(@rrequires, $debrequire);
}
@@ -339,7 +290,7 @@ if (!$no_requires && exists($minfo{'deb_requires'})) {
# Build (append) list of recommended packages (not Webmin modules)
my @rrecommends = ( );
if (!$no_recommends && exists($minfo{'deb_recommends'})) {
if (exists($minfo{'deb_recommends'})) {
foreach my $debrecommend (split(/\s+/, $minfo{'deb_recommends'})) {
push(@rrecommends, $debrecommend);
}
@@ -349,7 +300,7 @@ if (!$no_recommends && exists($minfo{'deb_recommends'})) {
# Build (standalone) list of suggested packages (not Webmin modules)
my @rsuggests = ( );
if (!$no_suggests && exists($minfo{'deb_suggests'})) {
if (exists($minfo{'deb_suggests'})) {
foreach my $debsuggest (split(/\s+/, $minfo{'deb_suggests'})) {
push(@rsuggests, $debsuggest);
}
@@ -357,7 +308,7 @@ if (!$no_suggests && exists($minfo{'deb_suggests'})) {
# Build (standalone) list of conflicts (not Webmin modules)
my @rconflicts = ( );
if (!$no_conflicts && exists($minfo{'deb_conflicts'})) {
if (exists($minfo{'deb_conflicts'})) {
foreach my $debconflict (split(/\s+/, $minfo{'deb_conflicts'})) {
push(@rconflicts, $debconflict);
}
@@ -365,7 +316,7 @@ if (!$no_conflicts && exists($minfo{'deb_conflicts'})) {
# Build (standalone) list of replaces (not Webmin modules)
my @rreplaces = ( );
if (!$no_replaces && exists($minfo{'deb_replaces'})) {
if (exists($minfo{'deb_replaces'})) {
foreach my $debreplace (split(/\s+/, $minfo{'deb_replaces'})) {
push(@rreplaces, $debreplace);
}
@@ -373,14 +324,14 @@ if (!$no_replaces && exists($minfo{'deb_replaces'})) {
# Build (standalone) list of breaks (not Webmin modules)
my @rbreaks = ( );
if (!$no_breaks && exists($minfo{'deb_breaks'})) {
if (exists($minfo{'deb_breaks'})) {
foreach my $debbreak (split(/\s+/, $minfo{'deb_breaks'})) {
push(@rbreaks, $debbreak);
}
}
# Build (standalone) list of obsoletes (replaces+conflicts) (not Webmin modules)
if (!$no_obsoletes && exists($minfo{'deb_obsoletes'})) {
if (exists($minfo{'deb_obsoletes'})) {
foreach my $debobsolete (split(/\s+/, $minfo{'deb_obsoletes'})) {
push(@rconflicts, $debobsolete);
push(@rreplaces, $debobsolete);
@@ -389,7 +340,7 @@ if (!$no_obsoletes && exists($minfo{'deb_obsoletes'})) {
# Build (standalone) list of provides (not Webmin modules)
my @rprovides = ( );
if (!$no_provides && exists($minfo{'deb_provides'})) {
if (exists($minfo{'deb_provides'})) {
foreach my $debprovide (split(/\s+/, $minfo{'deb_provides'})) {
push(@rprovides, $debprovide);
}

View File

@@ -32,13 +32,9 @@ my $release = 1;
$ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin";
my $allow_overwrite = 0;
my ($force_theme, $no_prefix, $set_prefix,
my ($force_theme, $rpmdepends, $rpmrecommends, $no_prefix, $set_prefix,
$obsolete_wbm, $vendor, $url, $force_usermin, $final_mod, $sign, $keyname,
$epoch, $dir, $ver, @exclude,
$rpmdepends, $norpmdepends, $rpmrecommends, $norpmrecommends,
$no_requires, $no_recommends, $no_suggests, $no_conflicts, $no_provides,
$no_obsoletes);
$epoch, $dir, $ver, @exclude);
my $mod_list = 'full';
@@ -46,42 +42,15 @@ my $mod_list = 'full';
while(@ARGV) {
# XXX Untainting isn't needed when running as non-root?
my $a = &untaint(shift(@ARGV));
if ($a eq "--rpm-depends" || $a eq "--mod-depends") {
if ($a eq "--rpm-depends") {
$rpmdepends = 1;
}
elsif ($a eq "--no-mod-depends") {
$norpmdepends = 1;
}
elsif ($a eq "--rpm-recommends" || $a eq "--mod-recommends") {
elsif ($a eq "--rpm-recommends") {
$rpmrecommends = 1;
}
elsif ($a eq "--no-mod-recommends") {
$norpmrecommends = 1;
}
# --requires, --recommends, --suggests, --conflicts, --provides and
# --obsoletes are not for Webmin modules, and not meant to have prefix,
# and populated from module.info automatically
# --no-requires, --no-recommends, --no-suggests,
# --no-conflicts, --no-provides, --no-obsoletes can be used
# to disable the automatic population of these fields from module.info
elsif ($a eq "--no-requires") {
$no_requires = 1;
}
elsif ($a eq "--no-recommends") {
$no_recommends = 1;
}
elsif ($a eq "--no-suggests") {
$no_suggests = 1;
}
elsif ($a eq "--no-conflicts") {
$no_conflicts = 1;
}
elsif ($a eq "--no-provides") {
$no_provides = 1;
}
elsif ($a eq "--no-obsoletes") {
$no_obsoletes = 1;
}
# --recommends, --suggests, --conflicts, --provides and --obsoletes are
# not for Webmin modules, and not meant to have prefix, and populated
# from module.info automatically
elsif ($a eq "--no-prefix") {
$no_prefix = 1;
}
@@ -150,22 +119,13 @@ while(@ARGV) {
}
}
# Disable module's depends and recommends if set in extra flags
$rpmdepends = 0 if ($norpmdepends);
$rpmrecommends = 0 if ($norpmrecommends);
# Validate args
if (!$dir) {
print "usage: ";
print CYAN, "makemodulerpm.pl <module> [version]", RESET;
print YELLOW, "\n";
print " [--mod-depends] [--no-mod-depends]\n";
print " [--mod-recommends] [--no-mod-recommends]\n";
print " [--no-requires]\n";
print " [--no-suggests]\n";
print " [--no-conflicts]\n";
print " [--no-provides]\n";
print " [--no-obsoletes]\n";
print " [--rpm-depends]\n";
print " [--rpm-recommends]\n";
print " [--rpm-dir directory]\n";
print " [--no-prefix]\n";
print " [--prefix prefix]\n";
@@ -348,7 +308,7 @@ if ($rpmrecommends && defined($minfo{'recommends'})) {
# Build (append) list of required packages (not Webmin modules)
my @rrequires = ( );
if (!$no_requires && exists($minfo{'rpm_requires'})) {
if (exists($minfo{'rpm_requires'})) {
foreach my $rpmrequire (split(/\s+/, $minfo{'rpm_requires'})) {
push(@rrequires, $rpmrequire);
}
@@ -357,7 +317,7 @@ if (!$no_requires && exists($minfo{'rpm_requires'})) {
# Build (append) list of recommended packages (not Webmin modules)
my @rrecommends = ( );
if (!$no_recommends && exists($minfo{'rpm_recommends'})) {
if (exists($minfo{'rpm_recommends'})) {
foreach my $rpmrecommend (split(/\s+/, $minfo{'rpm_recommends'})) {
push(@rrecommends, $rpmrecommend);
}
@@ -367,7 +327,7 @@ if (!$no_recommends && exists($minfo{'rpm_recommends'})) {
# Build (standalone) list of suggested packages (not Webmin modules)
my @rsuggests = ( );
if (!$no_suggests && exists($minfo{'rpm_suggests'})) {
if (exists($minfo{'rpm_suggests'})) {
foreach my $rpmsuggest (split(/\s+/, $minfo{'rpm_suggests'})) {
push(@rsuggests, $rpmsuggest);
}
@@ -375,7 +335,7 @@ if (!$no_suggests && exists($minfo{'rpm_suggests'})) {
# Build (standalone) list of conflicts (not Webmin modules)
my @rconflicts = ( );
if (!$no_conflicts && exists($minfo{'rpm_conflicts'})) {
if (exists($minfo{'rpm_conflicts'})) {
foreach my $rpmconflict (split(/\s+/, $minfo{'rpm_conflicts'})) {
push(@rconflicts, $rpmconflict);
}
@@ -383,7 +343,7 @@ if (!$no_conflicts && exists($minfo{'rpm_conflicts'})) {
# Build (standalone) list of provides (not Webmin modules)
my @rprovides = ( );
if (!$no_provides && exists($minfo{'rpm_provides'})) {
if (exists($minfo{'rpm_provides'})) {
foreach my $rpmprovide (split(/\s+/, $minfo{'rpm_provides'})) {
push(@rprovides, $rpmprovide);
}
@@ -391,7 +351,7 @@ if (!$no_provides && exists($minfo{'rpm_provides'})) {
# Build (standalone) list of obsoletes (not Webmin modules)
my @robsoletes = ( );
if (!$no_obsoletes && exists($minfo{'rpm_obsoletes'})) {
if (exists($minfo{'rpm_obsoletes'})) {
foreach my $rpmobsolete (split(/\s+/, $minfo{'rpm_obsoletes'})) {
push(@robsoletes, $rpmobsolete);
}

View File

@@ -229,11 +229,6 @@ if [ "\$tempdir" = "" ]; then
fi
export config_dir var_dir perl autoos port login crypt host ssl nochown autothird noperlpath nouninstall nostart allow atboot makeboot nostop nodepsmsg
./setup.sh >\$tempdir/webmin-setup.out 2>&1
grep sudo= /etc/webmin/miniserv.conf >/dev/null 2>&1
if [ "\$?" = 1 ]; then
# Allow sudo-based logins
echo sudo=1 >>/etc/webmin/miniserv.conf
fi
chmod 600 \$tempdir/webmin-setup.out
rm -f /var/lock/subsys/webmin
cd /usr/libexec/webmin

View File

@@ -1,24 +0,0 @@
access=*: *
add_mode=1
blob_mode=0
date_subs=0
login=root
max_dbs=50
max_text=1000
my_cnf=/etc/mysql/my.cnf
mysql=/usr/bin/mariadb
mysql_data=/var/lib/mysql
mysql_libs=
mysqladmin=/usr/bin/mariadb-admin
mysqldump=/usr/bin/mariadb-dump
mysqlimport=/usr/bin/mariadb-import
mysqlshow=/usr/bin/mariadb-show
nodbi=0
nopwd=0
passwd_mode=0
perpage=25
ssl=0
start_cmd=systemctl start mariadb
stop_cmd=systemctl stop mariadb
style=1
webmin_subs=0

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