Compare commits

...

121 Commits

Author SHA1 Message Date
Jamie Cameron
825d54adc4 Small version bump 2025-09-07 20:51:21 -07:00
Jamie Cameron
cbaff19725 Add option, disabled by default, to allow use of ALIAS records
https://github.com/webmin/webmin/issues/2095
2025-09-06 10:33:51 -07:00
Jamie Cameron
ece2ff6a1e Merge branch 'master' of github.com:webmin/webmin 2025-09-06 10:09:52 -07:00
Jamie Cameron
6b71562abf Auto-select the correct mode when uploading a new cert 2025-09-06 10:08:02 -07:00
Ilia Ross
a73210adc9 Fix to show FAN even if RPM is zero 2025-09-06 18:51:36 +03:00
Ilia Ross
c6d9d0338f Update changelog 2025-09-06 16:47:35 +03:00
Ilia Ross
5066534a40 Add Squid 7 support
https://forum.virtualmin.com/t/squid-version-7-1-not-support-in-webmin-any-solution-please/134609?u=ilia
2025-09-06 16:46:29 +03:00
Ilia Ross
84a417bd6e Update links and name 2025-09-06 13:25:53 +03:00
Ilia Ross
90c31af379 Update changelog for upcoming 2.501 2025-09-06 00:52:11 +03:00
Ilia Ross
1453508592 Add support for Raspberry Pi sensors #2539 #2517 2025-09-06 00:44:10 +03:00
Ilia Ross
35455f04e6 Fix comment 2025-09-05 18:16:16 +03:00
Ilia Ross
220d3124ef Merge pull request #2536 from Pedro-Cunha/webmin-setup-repo-repokey-perm
webmin-setup-repo.sh: Set mode of repo key to 644 for deb distros
2025-09-04 10:03:04 +03:00
Pedro Cunha
8b88034335 webmin-setup-repo.sh: Set mode of repo key to 644 for deb distros 2025-09-04 08:58:44 +02:00
Ilia Ross
e5bff8f31b Merge branch 'master' of github.com:webmin/webmin 2025-09-04 01:31:11 +03:00
Ilia Ross
ba4e72dfc2 Update changelog 2025-09-04 01:30:50 +03:00
Jamie Cameron
45eaad6eff New version bump 2025-09-03 15:29:40 -07:00
Jamie Cameron
cd113a468a Fix duplicate string 2025-09-03 15:29:01 -07:00
Ilia Ross
4c6ffd19a4 Add support for MariaDB 15 in Debian 13 2025-09-04 00:56:45 +03:00
Pedro Cunha
92e71e9ba3 webmin-setup-repo.sh: Set mode of repo key to 644 for deb distros 2025-09-03 15:33:15 +02:00
Ilia Ross
e56ea150fe Fix flag names consistency 2025-09-03 14:40:37 +03:00
Ilia Ross
e191220178 Add flags to skip Webmin module's info fields 2025-09-03 14:36:56 +03:00
Ilia Ross
097ef22bbc Add flags to skip module's info fields 2025-09-03 12:41:27 +03:00
Ilia Ross
66be8e9c20 Revert "Respect --rpm-recommends flag"
This reverts commit 81aa781bc9.
2025-09-02 13:00:36 +03:00
Pedro Cunha
cf6b79b740 webmin-setup-repo.sh: Set mode of repo key to 644 for deb distros 2025-09-02 10:13:13 +02:00
Jamie Cameron
81aa781bc9 Respect --rpm-recommends flag 2025-09-01 20:33:55 -07:00
Jamie Cameron
69b707e945 Enable sudo by default on RPM-based systems
https://forum.virtualmin.com/t/almalinux-no-login-create-user/134806
2025-09-01 20:02:44 -07:00
Ilia Ross
1424e248ff Fix to use correct directive names for control path 2025-09-02 00:25:19 +03:00
Ilia Ross
249dabde7e Fix support for index and control files location with Dovecot 2.4 2025-09-01 23:58:22 +03:00
Ilia Ross
443883d364 Fix to improve API name 2025-09-01 23:20:13 +03:00
Ilia Ross
156cb80104 Add support for Dovecot 2.4 in "Mail Files" page 2025-09-01 19:49:47 +03:00
Ilia Ross
0885a17f55 Add support for Dovecot 2.4 in "User and Login Options" page 2025-09-01 19:22:35 +03:00
Ilia Ross
0ffaed090a Fix to revert disabling "unsupported pages" in Dovecot 2.4
This reverts commit c2c99e3305.
2025-09-01 19:18:21 +03:00
Ilia Ross
55013abadc Fix missing LOGIN auth 2025-09-01 19:17:11 +03:00
Jamie Cameron
83a85aed93 Add support for mail_driver directive 2025-08-31 18:52:52 -07:00
Jamie Cameron
81b0bee9ee Merge branch 'master' of github.com:webmin/webmin 2025-08-31 17:48:22 -07:00
Jamie Cameron
b53504dd01 POP3 is so rarlely used that we can just drop the UIDL format option 2025-08-31 17:48:16 -07:00
Ilia Ross
c2c99e3305 Fix to disable unsupported pages for now in Dovecot 2.4 2025-08-31 22:36:15 +03:00
Ilia Ross
671c62289d Fix Dovecot 2.4 "SSL Configuration" page work 2025-08-31 22:30:09 +03:00
Jamie Cameron
d296b83192 Merge branch 'master' of github.com:webmin/webmin 2025-08-30 20:50:59 -07:00
Jamie Cameron
1d898d83fb Fix another case where version is compared wrong
https://forum.virtualmin.com/t/tlsa-rrsig-fail/134634
2025-08-30 20:49:12 -07:00
Ilia Ross
90fa7fede0 Fix to return actual Postfix status correctly
https://github.com/webmin/webmin/issues/2534
2025-08-30 15:04:08 +03:00
Jamie Cameron
415e7116f9 disable_plaintext_auth has been renamed 2025-08-29 22:24:20 -07:00
Jamie Cameron
033d94483f Support new mail_path directive 2025-08-29 21:31:58 -07:00
Jamie Cameron
69035e0a34 Merge branch 'master' of github.com:webmin/webmin 2025-08-29 15:29:32 -07:00
Jamie Cameron
bab8d7a0f0 Handle case where Postfix isn't even installed
https://github.com/webmin/webmin/issues/2534
2025-08-29 15:29:08 -07:00
Ilia Ross
9e6ae753e0 Update change log for upcoming Webmin version 2.500 2025-08-30 01:07:03 +03:00
Ilia Ross
42b6cac7b4 Fix words consistency 2025-08-30 01:04:54 +03:00
Ilia Ross
6ca908cf80 Add using relative dates in some pages where it makes sense 2025-08-29 15:32:41 +03:00
Ilia Ross
3be8a327ad Add API to display relative dates 2025-08-29 15:13:27 +03:00
Ilia Ross
16110e3e3e Fix last logins on dashboard to show usernames, and for admin display all users from the past 3 days 2025-08-27 16:54:44 +03:00
Ilia Ross
8f508724e4 Fix icon 2025-08-23 11:57:59 +03:00
Ilia Ross
e2646af3ab Fix title 2025-08-23 11:52:01 +03:00
Ilia Ross
ef55f007a4 Fix CPU load stats on macOS
https://forum.virtualmin.com/t/cpu-load-stats-are-incorrect-in-macos/134723/7?u=ilia
2025-08-21 20:42:35 +03:00
Ilia Ross
613b9e5ffa Add support to show last boot logs
https://forum.virtualmin.com/t/previous-boot-log/134731?u=ilia
2025-08-21 12:22:18 +03:00
Jamie Cameron
06744537d6 What if user isn't set at all 2025-08-20 16:17:37 -07:00
Jamie Cameron
3925dd829b Merge branch 'master' of github.com:webmin/webmin 2025-08-19 14:26:35 -07:00
Jamie Cameron
e5bff72e57 Return a useful error if IPC::Open3 is missing 2025-08-19 14:25:01 -07:00
Ilia Ross
dd445a67f1 Fix to add identifier for pre tag 2025-08-19 22:45:46 +03:00
Ilia Ross
29a4b6b598 Add .editorconfig #2531 2025-08-19 11:44:39 +03:00
Jamie Cameron
56729f7e3d Add option to customized the SMTP login
https://github.com/webmin/webmin/discussions/2530
2025-08-18 16:48:01 -07:00
Jamie Cameron
92b90a8170 Allow send_text_mail to take SMTP user and pass params
https://github.com/webmin/webmin/discussions/2530
2025-08-18 16:31:47 -07:00
Ilia Ross
783ad6f3a2 Fix ui textbox support extra class param 2025-08-14 02:21:10 +03:00
Ilia Ross
0fd02d4381 Add field sizing content class 2025-08-14 02:13:19 +03:00
Ilia Ross
4c2fde6847 Fix to test if database supports account locking correctly 2025-08-13 21:20:25 +03:00
Ilia Ross
9065de316a Fix not to fail on MySQL 5.5
99889c1f30 (commitcomment-163892642)
2025-08-13 11:11:09 +03:00
Ilia Ross
679a1c386e Add a way not to display bottom select all buttons 2025-08-10 17:44:12 +03:00
Ilia Ross
462483b667 Fix squashed tables bug 2025-08-09 16:41:45 +03:00
Jamie Cameron
58467ece0b Add dovecot IMAP location 2025-08-05 16:41:03 -07:00
Jamie Cameron
e864fa785f Merge branch 'master' of github.com:webmin/webmin 2025-08-05 13:28:40 -07:00
Jamie Cameron
5aba173111 Support MariaBD version 12
https://github.com/webmin/webmin/issues/2522
2025-08-05 13:28:03 -07:00
Ilia Ross
9305ddbdd5 Fix alerts positioning inside details 2025-08-04 21:28:50 +03:00
Ilia Ross
08d990ab13 Fix to support inlined details element (on the same line with text when opened) 2025-08-04 20:58:10 +03:00
Jamie Cameron
ecbeaf7bc7 Add support for IMAP via local command 2025-08-02 19:39:33 -07:00
Jamie Cameron
f8cb0db802 Show a different message for the reboot required monitor
https://github.com/webmin/webmin/issues/2518
2025-08-02 15:21:32 -07:00
Jamie Cameron
77b134fec1 This function is never called 2025-08-02 11:52:23 -07:00
Jamie Cameron
060a2f2853 Merge branch 'master' of github.com:webmin/webmin 2025-08-01 14:58:50 -07:00
Jamie Cameron
88c71b5dd4 Add UI field for slave server key
https://sourceforge.net/p/webadmin/bugs/5657/
2025-08-01 14:58:43 -07:00
Ilia Ross
f99f5fbae6 Revert previous commit
5ee080d24a (commitcomment-163253013)
2025-08-01 11:21:57 +03:00
Ilia Ross
2037af9d25 Add support for configuring WebSocket binding
5ee080d24a (commitcomment-163197549)
2025-07-31 15:21:33 +03:00
Jamie Cameron
d8988bd9f0 Merge branch 'master' of github.com:webmin/webmin 2025-07-30 16:59:39 -07:00
Jamie Cameron
5ee080d24a Only listen on localhost
https://github.com/webmin/authentic-theme/issues/1713
2025-07-30 16:59:32 -07:00
Ilia Ross
54bb5eac1e Fix output print 2025-07-26 23:29:50 +03:00
Ilia Ross
10790ccc7f Fix to make this page progressive 2025-07-26 23:29:19 +03:00
Ilia Ross
820453cc8c Add a way to run encrypt/decrypt as another user, defaulting to nobody
69681c01d4 (r162892288)
2025-07-26 15:01:18 +03:00
Ilia Ross
3d2ea49a47 Fix to use quotemeta instead
69681c01d4 (r162892280)
2025-07-26 14:21:45 +03:00
Ilia Ross
69681c01d4 Add reversible encryption helpers API 2025-07-25 14:24:43 +03:00
Ilia Ross
fe8545703d Add support for timeouts in temporary rules in FirewallD
https://forum.virtualmin.com/t/fantastic-new-addition-to-firewall-module/134328/10?u=ilia
2025-07-25 02:05:50 +03:00
Ilia Ross
f130112177 Fix to use correct default value 2025-07-25 01:43:46 +03:00
Ilia Ross
c32b04a7e6 Fix to make method configurable 2025-07-24 23:31:14 +03:00
Ilia Ross
afa9e9bd38 Fix to rethink what CPU fan is #2517
[no-build]
2025-07-24 22:50:18 +03:00
Ilia Ross
73d6333f19 Merge branch 'master' of github.com:webmin/webmin 2025-07-24 15:31:59 +03:00
Ilia Ross
549c786b84 Fix func name
https://github.com/webmin/webmin/issues/2519
2025-07-24 15:31:53 +03:00
Jamie Cameron
e15ab46a98 Improve wording when no reboot is needed
https://github.com/webmin/webmin/issues/2518
2025-07-23 23:57:12 -07:00
Ilia Ross
63abfbfe87 Fix not to add a new line to the content 2025-07-23 23:44:36 +03:00
Ilia Ross
da5b814d2b Fix query as the order matters
* Note: When "Show blob and text fields as" option is set to "Links to download" the download won't work if the sorting is active
2025-07-22 13:48:45 +03:00
Ilia Ross
187b7c72a8 Fix download link in MySQL rows
https://forum.virtualmin.com/t/mariadb-download-link-when-viewing-text-database-fields/134323/14
2025-07-22 13:05:39 +03:00
Ilia Ross
a08d104f82 Fix nested details to display nicely 2025-07-20 22:55:08 +03:00
Ilia Ross
71f441375b Add support for fit class in details 2025-07-20 17:30:55 +03:00
Ilia Ross
53fb520392 Fix to consider musthost directive too 2025-07-17 19:12:47 +03:00
Jamie Cameron
f5305eb065 URL for use in emails should use HTTP hostname if available
https://forum.virtualmin.com/t/webmin-virtualmin-password-recovery/132914/82
2025-07-17 01:46:46 -07:00
Ilia Ross
cd51f76062 Fix how help bubble appear in tables 2025-07-17 00:25:53 +03:00
Ilia Ross
147a10dd8a Fix tooltip align 2025-07-16 18:28:44 +03:00
Ilia Ross
f17f92c5c0 Fix table layout 2025-07-16 18:24:33 +03:00
Jamie Cameron
69b9756b4a Merge pull request #2512 from webmin/dev/init-systemd-improvements
Add improvements to systemd section of Init module
2025-07-14 18:23:11 +08:00
Ilia Ross
6935174133 Fix to consider it a bad request only if there is one 2025-07-13 17:43:47 +03:00
Jamie Cameron
51c86d41d4 Allow the primary file to also be home-relative 2025-07-11 00:47:19 -07:00
Jamie Cameron
d8166e9a8e Allow use of ~ in autoreply file 2025-07-10 04:40:22 -07:00
Jamie Cameron
0a0ad2f119 Only update session time when there is actually websockets traffic
https://github.com/webmin/webmin/pull/2510
2025-07-10 04:31:36 -07:00
Jamie Cameron
137af3637b Allow reply-tracking file to be relative to home dir 2025-07-09 16:13:56 -07:00
Jamie Cameron
d2863b7c4c Delete useless ssl_redirect option 2025-07-09 15:59:16 -07:00
Jamie Cameron
0f721a17ae Merge pull request #1718 from tgurr/sslrenegotiation
Disable SSL/TLS renegotiation
2025-07-07 17:20:37 +10:00
Jamie Cameron
72014ab2d7 Merge pull request #2514 from webmin/dev/option-enforce-ssl
Add the ability to re-enforce SSL connections and enable it by default
2025-07-07 08:53:24 +10:00
Ilia Ross
2d86d8c77a Fix to correctly open ports on contemporary systems 2025-07-06 21:08:18 +03:00
Ilia Ross
0bcbcd94b8 Fix to always send ports disregard of the firewall 2025-07-06 21:05:20 +03:00
Ilia Ross
f353ae31d8 Fix typos 2025-07-06 20:44:35 +03:00
Ilia Ross
24cd121642 Update outdated SSL explanations 2025-07-06 20:41:24 +03:00
Ilia Ross
11de78ce51 Add ability to configure SSL enforcement options in UI 2025-07-06 20:24:06 +03:00
Ilia Ross
6b75672534 Add ability to enforce SSL by default 2025-07-06 20:02:34 +03:00
Ilia Ross
c0f886b670 Fix not to show connection error if SSL is explicitly disabled
[no-build]
2025-07-06 15:43:00 +03:00
Ilia Ross
784b2b42e7 Fix wording 2025-07-06 14:03:19 +03:00
Timo Gurr
76bf648f94 Disable SSL/TLS renegotiation
Commit 2b77e8f020 allows to disable
TLS < 1.3, extend it to always disable SSL/TLS renegotiation even
for this older TLS protocols.

2b77e8f020
https://sourceforge.net/p/webadmin/bugs/4590/
2022-10-28 10:55:52 +02:00
157 changed files with 1414 additions and 582 deletions

14
.editorconfig Normal file
View File

@@ -0,0 +1,14 @@
# EditorConfig for Perl project
# - Indentation: tabs
# - Tab width: 8
# - Indentation style: Ratliff
root = true
[*]
charset = utf-8
indent_style = tab
indent_size = 8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

View File

@@ -1,12 +1,49 @@
## Changelog ## Changelog
#### 2.403 (June 30, 2025) #### 2.501 (September 10, 2025)
* Add support for the Webmin webserver to work in both HTTP and HTTPS modes at the same time * Add support for Raspberry Pi sensors #2539 #2517
* Add status monitor for PHP FPM #2499 * Add Squid 7 support
* Add support for redirecting to the enforced domain when the `musthost_redirect` directive is set * Update the Authentic theme to the latest version with the following fixes:
* Add a UI API to mask sensitive text—like displayed passwords, unless hovered over container - Fix broken editor in "Bootup and Shutdown" module
* Fix MySQL/MariaDB to remove obsolete `set-variable` options that break modern config files #2497
#### 2.500 (September 4, 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
* 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) #### 2.402 (June 16, 2025)
* Update the Authentic theme to the latest version with various fixes and improvements * Update the Authentic theme to the latest version with various fixes and improvements
@@ -131,7 +168,7 @@
* Update the Authentic theme to the latest version with various fixes and improvements * Update the Authentic theme to the latest version with various fixes and improvements
#### 2.201 (July 24, 2024) #### 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) * Fix Terminal module to work correctly with _sudo_-capable users [#2223](https://github.com/webmin/webmin/issues/2223)
#### 2.200 (July 21, 2024) #### 2.200 (July 21, 2024)
@@ -244,7 +281,7 @@
* Add support for editing ACLs in File Manager * Add support for editing ACLs in File Manager
* Add support to configure SSL connection for MySQL/MariaDB module * Add support to configure SSL connection for MySQL/MariaDB module
* Add support for compressed backups in PostgreSQL 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 * Add better support for CloudLinux
* Fix to always default to RSA key type in Let's Encrypt requests * Fix to always default to RSA key type in Let's Encrypt requests
* Fix setup repository script for Oracle * Fix setup repository script for Oracle
@@ -252,7 +289,7 @@
* Fix support for SpamAssassin 4 * Fix support for SpamAssassin 4
* Fix to use system default hashing format for `htpasswd` file * Fix to use system default hashing format for `htpasswd` file
* Fix FastRPC issues * 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) #### 2.013 (January 19, 2023)
* Fix Authentic theme issue with error handling * Fix Authentic theme issue with error handling

View File

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

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -28,7 +28,7 @@ print &ui_columns_start([ $text{'sessions_id'},
$text{'sessions_state'}, $text{'sessions_state'},
$text{'sessions_user'}, $text{'sessions_user'},
$text{'sessions_host'}, $text{'sessions_host'},
$text{'sessions_login'}, $text{'sessions_login_ago'},
$text{'sessions_actions'}, $text{'sessions_actions'},
], 100); ], 100);
foreach my $k (sort { my @a = split(/\s+/, $sessiondb{$a}); foreach my $k (sort { my @a = split(/\s+/, $sessiondb{$a});
@@ -68,7 +68,8 @@ foreach my $k (sort { my @a = split(/\s+/, $sessiondb{$a});
push(@cols, $user); push(@cols, $user);
} }
push(@cols, $lip); push(@cols, $lip);
push(@cols, &make_date($ltime)); push(@cols, &make_date_relative($ltime).
"&nbsp;".&ui_help(&make_date($ltime)));
my @links; my @links;
if ($haslog) { if ($haslog) {
push(@links, ui_link("../webminlog/search.cgi?uall=1&mall=1&tall=1&wall=1&fall=1&sid=$k", $text{'sessions_lview'})); 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,7 +20,12 @@ foreach my $k (keys %sessiondb) {
next if ($k =~ /^1111111/); next if ($k =~ /^1111111/);
next if (!$sessiondb{$k}); next if (!$sessiondb{$k});
my ($user, $ltime, $lip) = split(/\s+/, $sessiondb{$k}); my ($user, $ltime, $lip) = split(/\s+/, $sessiondb{$k});
next if ($user ne $remote_user && $user ne "!".$remote_user); 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));
push(@logins, [ $user, $ltime, $lip, $k ]); push(@logins, [ $user, $ltime, $lip, $k ]);
} }
if (@logins) { if (@logins) {
@@ -29,7 +34,8 @@ if (@logins) {
@logins = @logins[0..4]; @logins = @logins[0..4];
} }
my $html = &ui_columns_start([ $text{'sessions_host'}, my $html = &ui_columns_start([ $text{'sessions_host'},
$text{'sessions_login'}, $text{'sessions_user'},
$text{'sessions_login_ago'},
$text{'sessions_state'}, $text{'sessions_state'},
$text{'sessions_action'} ]); $text{'sessions_action'} ]);
my $open = 0; my $open = 0;
@@ -62,9 +68,13 @@ if (@logins) {
&ui_link("@{[&get_webprefix()]}/acl/delete_session.cgi?id=$l->[3]&redirect_ref=1", &ui_link("@{[&get_webprefix()]}/acl/delete_session.cgi?id=$l->[3]&redirect_ref=1",
$text{'sessions_kill'})) $text{'sessions_kill'}))
} }
my $user = $l->[0];
$user =~ s/^\!//;
$html .= &ui_columns_row([ $html .= &ui_columns_row([
$l->[2], $l->[2],
&make_date($l->[1]), $user,
&make_date_relative($l->[1]).
"&nbsp;".&ui_help(&make_date($l->[1])),
$state, $state,
&ui_links_row(\@links) ]); &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> Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com> Joe Cooper <joe@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com> Ilia Ross <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> Copyright 2018 Jamie Cameron <jcameron@webmin.com>
Joe Cooper <joe@virtualmin.com> Joe Cooper <joe@virtualmin.com>
Ilia Rostovtsev <ilia@virtualmin.com> Ilia Ross <ilia@virtualmin.com>

View File

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

View File

@@ -1135,6 +1135,10 @@ elsif ($type eq "CNAME") {
print &ui_table_row($text{'value_CNAME1'}, print &ui_table_row($text{'value_CNAME1'},
&ui_textbox("value0", $v[0], 30)." ($text{'edit_cnamemsg'})", 3); &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") { elsif ($type eq "MX") {
print &ui_table_row($text{'value_MX2'}, print &ui_table_row($text{'value_MX2'},
&ui_textbox("value1", $v[1], 30)); &ui_textbox("value1", $v[1], 30));
@@ -3117,7 +3121,11 @@ $slave_error = $_[0];
sub get_forward_record_types sub get_forward_record_types
{ {
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); 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);
} }
sub get_reverse_record_types sub get_reverse_record_types

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -57,6 +57,7 @@ foreach my $z (&find("zone", $vconf)) {
} }
} }
my $masterport = $in{'port_def'} ? undef : $in{'port'}; my $masterport = $in{'port_def'} ? undef : $in{'port'};
my $masterkey = $in{'key_def'} ? undef : $in{'key'};
my @masters = split(/\s+/, $in{'masters'}); my @masters = split(/\s+/, $in{'masters'});
foreach my $m (@masters) { foreach my $m (@masters) {
&check_ipaddress($m) || &check_ip6address($m) || &check_ipaddress($m) || &check_ip6address($m) ||
@@ -106,6 +107,9 @@ my $masters = { 'name' => 'masters',
if (defined($masterport)) { if (defined($masterport)) {
$masters->{'values'} = [ 'port', $masterport ]; $masters->{'values'} = [ 'port', $masterport ];
} }
if ($masterkey) {
$masters->{'values'} = [ 'key', $masterkey ];
}
my $dir = { 'name' => 'zone', my $dir = { 'name' => 'zone',
'values' => [ $in{'zone'} ], 'values' => [ $in{'zone'} ],
'type' => 1, 'type' => 1,

View File

@@ -184,6 +184,7 @@ slave_ecannot=You are not allowed to edit this zone
slave_opts=Zone Options slave_opts=Zone Options
slave_masters=Master servers slave_masters=Master servers
slave_masterport=Server port slave_masterport=Server port
slave_masterkey=Server key
slave_max=Maximum transfer time slave_max=Maximum transfer time
slave_file=Records file slave_file=Records file
slave_check=Check names? slave_check=Check names?
@@ -397,6 +398,7 @@ type_A=Address
type_AAAA=IPv6 Address type_AAAA=IPv6 Address
type_NS=Name Server type_NS=Name Server
type_CNAME=Name Alias type_CNAME=Name Alias
type_ALIAS=Address Alias
type_MX=Mail Server type_MX=Mail Server
type_HINFO=Host Information type_HINFO=Host Information
type_NSEC3PARAM=DNSSEC Parameters type_NSEC3PARAM=DNSSEC Parameters
@@ -419,6 +421,7 @@ edit_A=Address
edit_AAAA=IPv6 Address edit_AAAA=IPv6 Address
edit_NS=Name Server edit_NS=Name Server
edit_CNAME=Name Alias edit_CNAME=Name Alias
edit_ALIAS=Address Alias
edit_MX=Mail Server edit_MX=Mail Server
edit_HINFO=Host Information edit_HINFO=Host Information
edit_TXT=Text edit_TXT=Text
@@ -441,6 +444,7 @@ recs_A=Address
recs_AAAA=IPv6 Address recs_AAAA=IPv6 Address
recs_NS=Name Server recs_NS=Name Server
recs_CNAME=Name Alias recs_CNAME=Name Alias
recs_ALIAS=Address Alias
recs_MX=Mail Server recs_MX=Mail Server
recs_HINFO=Host Information recs_HINFO=Host Information
recs_TXT=Text recs_TXT=Text
@@ -464,6 +468,7 @@ value_A1=Address
value_AAAA1=IPv6 Address value_AAAA1=IPv6 Address
value_NS1=Name Server value_NS1=Name Server
value_CNAME1=Real Name value_CNAME1=Real Name
value_ALIAS1=Copy Address From
value_MX1=Priority value_MX1=Priority
value_MX2=Mail Server value_MX2=Mail Server
value_HINFO1=Hardware value_HINFO1=Hardware
@@ -1355,7 +1360,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_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! 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_ecannot=You are not allowed to edit SSL keys and certificates
tls_esupport=SSL keys and certificates are not supported on this system tls_esupport=SSL keys and certificates are not supported on this system
tls_name=Key name tls_name=Key name
@@ -1363,8 +1368,6 @@ tls_key=Key file
tls_cert=Certificate file tls_cert=Certificate file
tls_ca=CA certificate file tls_ca=CA certificate file
tls_ca_def=None required 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_none=No SSL keys have been added yet.
tls_add=Add a new SSL key. tls_add=Add a new SSL key.
tls_desc=The SSL keys and certificates listed on this page can be used to enable DNS over SSL/TLS. tls_desc=The SSL keys and certificates listed on this page can be used to enable DNS over SSL/TLS.

View File

@@ -216,6 +216,13 @@ else {
$vals .= "."; $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") { elsif ($in{'type'} eq "MX") {
&valname($in{'value1'}) || &valname($in{'value1'}) ||
&error(&text('edit_emx', $in{'value1'})); &error(&text('edit_emx', $in{'value1'}));

View File

@@ -59,6 +59,15 @@ print &ui_table_row($text{'slave_masterport'},
&ui_opt_textbox("port", undef, 5, $text{'default'}, &ui_opt_textbox("port", undef, 5, $text{'default'},
$text{'slave_master_port'}), 3); $text{'slave_master_port'}), 3);
# Master key
my @keys = &find("key", $conf);
if (@keys) {
print &ui_table_row($text{'slave_masterkey'},
&ui_select("key", undef,
[ [ undef, $text{'slave_nokey'} ],
(map { $_->{'value'} } @keys) ]));
}
# Create on slave servers? # Create on slave servers?
my @servers = grep { $_->{'sec'} } &list_slave_servers(); my @servers = grep { $_->{'sec'} } &list_slave_servers();
if (@servers && $access{'remote'}) { if (@servers && $access{'remote'}) {

View File

@@ -4,9 +4,9 @@ BEGIN { push(@INC, ".."); };
use WebminCore; use WebminCore;
&init_config(); &init_config();
@supported_auths = ( "anonymous", "plain", "digest-md5", "cram-md5", "apop", @supported_auths = ( "anonymous", "plain", "login", "digest-md5", "cram-md5",
"scram-sha-1", "scram-sha-256", "ntlm", "gss-spnego", "apop", "scram-sha-1", "scram-sha-256", "ntlm",
"gssapi", "rpa", "otp", "skey", "external", "gss-spnego", "gssapi", "rpa", "otp", "skey", "external",
"oauthbearer", "xoauth2" ); "oauthbearer", "xoauth2" );
@mail_envs = ( undef, "maildir:~/Maildir", "mbox:~/mail/:INBOX=/var/mail/%u", @mail_envs = ( undef, "maildir:~/Maildir", "mbox:~/mail/:INBOX=/var/mail/%u",
"maildir:~/Maildir:mbox:~/mail/" ); "maildir:~/Maildir:mbox:~/mail/" );
@@ -555,6 +555,16 @@ return 0 if (!$ver);
return &compare_version_numbers($ver, $wantver) >= 0; 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 sub list_lock_methods
{ {
local ($forindex) = @_; local ($forindex) = @_;

View File

@@ -14,7 +14,11 @@ print &ui_table_row($text{'login_realms'},
&ui_opt_textbox("realms", $realms, 40, $text{'login_none'}), 3); &ui_opt_textbox("realms", $realms, 40, $text{'login_none'}), 3);
# Default authentication realm # Default authentication realm
$realm = &find_value("auth_default_realm", $conf); $realm = &find_value(
&version_atleast("2.4")
? "auth_default_domain"
: "auth_default_realm",
$conf);
print &ui_table_row($text{'login_realm'}, print &ui_table_row($text{'login_realm'},
&ui_opt_textbox("realm", $realm, 10, $text{'default'})); &ui_opt_textbox("realm", $realm, 10, $text{'default'}));
@@ -87,25 +91,27 @@ elsif ($userdb =~ /^sql\s+(.*)/) {
else { else {
$other = $userdb; $other = $userdb;
} }
print &ui_table_row($text{'login_userdb'}, if (&version_below("2.4")) {
&ui_radio("usermode", $usermode, print &ui_table_row($text{'login_userdb'},
[ [ "passwd", $text{'login_passwd'}."<br>" ], &ui_radio("usermode", $usermode,
[ "passwd-file", &text('login_passwdfile', [ [ "passwd", $text{'login_passwd'}."<br>" ],
&ui_textbox("passwdfile", $passwdfile, 30))."<br>" ], [ "passwd-file", &text('login_passwdfile',
[ "static", &text('login_static', &ui_textbox("passwdfile", $passwdfile, 30))."<br>" ],
&ui_textbox("uid", $uid, 6), [ "static", &text('login_static',
&ui_textbox("gid", $gid, 6), &ui_textbox("uid", $uid, 6),
&ui_textbox("home", $home, 20))."<br>" ], &ui_textbox("gid", $gid, 6),
[ "vpopmail", $text{'login_vpopmail'}."<br>" ], &ui_textbox("home", $home, 20))."<br>" ],
[ "ldap", &text('login_ldap', [ "vpopmail", $text{'login_vpopmail'}."<br>" ],
&ui_textbox("ldap", $ldap, 30))."<br>" ], [ "ldap", &text('login_ldap',
[ "pgsql", &text('login_pgsql', &ui_textbox("ldap", $ldap, 30))."<br>" ],
&ui_textbox("pgsql", $pgsql, 30))."<br>" ], [ "pgsql", &text('login_pgsql',
[ "sql", &text('login_sql', &ui_textbox("pgsql", $pgsql, 30))."<br>" ],
&ui_textbox("sql", $sql, 30))."<br>" ], [ "sql", &text('login_sql',
[ "", &text('login_other', &ui_textbox("sql", $sql, 30))."<br>" ],
&ui_textbox("other", $other, 30))."<br>" ], [ "", &text('login_other',
]), 3); &ui_textbox("other", $other, 30))."<br>" ],
]), 3);
}
# Password authentication system # Password authentication system
if (&find("auth_passdb", $conf, 2)) { if (&find("auth_passdb", $conf, 2)) {
@@ -174,46 +180,49 @@ elsif ($passdb =~ /^checkpassword\s+(.*)$/) {
else { else {
$pother = $passdb; $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);
print &ui_table_hr(); 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();
}
$fuid = &find_value("first_valid_uid", $conf); $fuid = &find_value("first_valid_uid", $conf);
print &ui_table_row($text{'login_fuid'}, print &ui_table_row($text{'login_fuid'},
@@ -232,7 +241,11 @@ $lgid = &find_value("last_valid_gid", $conf);
print &ui_table_row($text{'login_lgid'}, print &ui_table_row($text{'login_lgid'},
&ui_opt_textbox("lgid", $lgid, 6, &getdef("last_valid_gid", \@mmap))); &ui_opt_textbox("lgid", $lgid, 6, &getdef("last_valid_gid", \@mmap)));
$extra = &find_value("mail_extra_groups", $conf); $extra = &find_value(&version_atleast("2")
? "mail_access_groups"
: "mail_extra_groups",
$conf);
print &ui_table_row($text{'login_extra'}, print &ui_table_row($text{'login_extra'},
&ui_opt_textbox("extra", $extra, 50, $text{'login_none'})."\n". &ui_opt_textbox("extra", $extra, 50, $text{'login_none'})."\n".
&group_chooser_button("extra", 1), 3); &group_chooser_button("extra", 1), 3);

View File

@@ -13,25 +13,49 @@ $envmode = 4;
if (&find("default_mail_env", $conf, 2)) { if (&find("default_mail_env", $conf, 2)) {
$env = &find_value("default_mail_env", $conf); $env = &find_value("default_mail_env", $conf);
} }
elsif (&find("mail_path", $conf, 2)) {
$env = &find_value("mail_path", $conf);
}
else { else {
$env = &find_value("mail_location", $conf); $env = &find_value("mail_location", $conf);
} }
if ($env =~ s/:INDEX=([^:]+)//) { if ($env =~ s/:INDEX=([^:]+)//) {
$index = $1; $index = $1;
} }
elsif (&find("mail_index_path", $conf, 2)) {
$index = &find_value("mail_index_path", $conf);
}
if ($env =~ s/:CONTROL=([^:]+)//) { if ($env =~ s/:CONTROL=([^:]+)//) {
$control = $1; $control = $1;
} }
elsif (&find("mail_control_path", $conf, 2)) {
$control = &find_value("mail_control_path", $conf);
}
for($i=0; $i<@mail_envs; $i++) { for($i=0; $i<@mail_envs; $i++) {
$envmode = $i if ($mail_envs[$i] eq $env); $envmode = $i if ($mail_envs[$i] eq $env);
} }
print &ui_table_row($text{'mail_env'}, print &ui_table_row($text{'mail_env'},
&ui_radio("envmode", $envmode, &ui_radio("envmode", $envmode,
[ ( map { [ $_, $text{'mail_env'.$_}."<br>" ] } (0.. 3) ), [ ( map { [ $_, $text{'mail_env'.$_}."<br>" ] } (
&version_atleast("2.4") ? (0) : (0 .. 3)) ),
[ 4, &text('mail_env4', [ 4, &text('mail_env4',
&ui_textbox("other", $envmode == 4 ? $env : undef, 40)) ] ], &ui_textbox("other", $envmode == 4 ? $env : undef, 40)) ] ],
), 3); ), 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 # Index files location
$indexmode = $index eq 'MEMORY' ? 1 : $indexmode = $index eq 'MEMORY' ? 1 :
$index ? 2 : 0; $index ? 2 : 0;
@@ -89,26 +113,10 @@ print &ui_table_row($text{'mail_change'},
[ "", &getdef($dirty, \@opts) ] ]), 3); [ "", &getdef($dirty, \@opts) ] ]), 3);
# Permissions on files # Permissions on files
$umask = &find_value("umask", $conf); if (&version_below("2")) {
print &ui_table_row($text{'mail_umask'}, $umask = &find_value("umask", $conf);
&ui_opt_textbox("umask", $umask, 5, &getdef("umask")), 3); 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 # Allow POP3 last command

View File

@@ -9,7 +9,11 @@ print &ui_form_start("save_ssl.cgi", "post");
print &ui_table_start($text{'ssl_header'}, "width=100%", 4); print &ui_table_start($text{'ssl_header'}, "width=100%", 4);
# SSL cert and key files # SSL cert and key files
if (&find_value("ssl_cert", $conf, 2) || &version_atleast("2.2")) { 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, ""); $cert = &find_value("ssl_cert", $conf, 0, "");
$cert =~ s/^<//; $cert =~ s/^<//;
} }
@@ -20,7 +24,11 @@ print &ui_table_row($text{'ssl_cert'},
&ui_opt_textbox("cert", $cert, 40, &getdef("ssl_cert_file")), 3, &ui_opt_textbox("cert", $cert, 40, &getdef("ssl_cert_file")), 3,
[ undef, "nowrap" ]); [ undef, "nowrap" ]);
if (&find_value("ssl_key", $conf, 2) || &version_atleast("2.2")) { 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, ""); $key = &find_value("ssl_key", $conf, 0, "");
$key =~ s/^<//; $key =~ s/^<//;
} }
@@ -31,14 +39,12 @@ print &ui_table_row($text{'ssl_key'},
&ui_opt_textbox("key", $key, 40, &getdef("ssl_key_file")), 3, &ui_opt_textbox("key", $key, 40, &getdef("ssl_key_file")), 3,
[ undef, "nowrap" ]); [ undef, "nowrap" ]);
# SSL key password
$pass = &find_value("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 # SSL CA file
if (&find_value("ssl_ca", $conf, 2) || &version_atleast("2.2")) { 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, ""); $ca = &find_value("ssl_ca", $conf, 0, "");
$ca =~ s/^<//; $ca =~ s/^<//;
} }
@@ -50,20 +56,41 @@ print &ui_table_row($text{'ssl_ca'},
&getdef("ssl_ca_file", [ [ "", $text{'ssl_none'} ] ])), 3, &getdef("ssl_ca_file", [ [ "", $text{'ssl_none'} ] ])), 3,
[ undef, "nowrap" ]); [ 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 # Parameter regen time
$regen = &find_value("ssl_parameters_regenerate", $conf); if (&version_below("2.4")) {
print &ui_table_row($text{'ssl_regen'}, $regen = &find_value("ssl_parameters_regenerate", $conf);
&ui_opt_textbox("regen", $regen, 5, print &ui_table_row($text{'ssl_regen'},
&getdef("ssl_parameters_regenerate")). &ui_opt_textbox("regen", $regen, 5,
" ".$text{'ssl_hours'}, 3); &getdef("ssl_parameters_regenerate")).
" ".$text{'ssl_hours'}, 3);
}
# Disable plaintext passwords when not SSL # Disable plaintext passwords when not SSL
@opts = ( [ 'yes', $text{'yes'} ], [ 'no', $text{'no'} ] ); if (&find_value("auth_allow_cleartext", $conf, 2)) {
$plain = &find_value("disable_plaintext_auth", $conf); @opts = ( [ 'yes', $text{'yes'} ], [ 'no', $text{'no'} ] );
print &ui_table_row($text{'ssl_plain'}, $plain = &find_value("auth_allow_cleartext", $conf);
&ui_radio("plain", $plain, print &ui_table_row($text{'ssl_plain2'},
[ @opts, &ui_radio("plain", $plain,
[ '', &getdef("disable_plaintext_auth", \@opts) ] ]), 3); [ @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);
}
print &ui_table_end(); print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]); print &ui_form_end([ [ "save", $text{'save'} ] ]);

View File

@@ -56,6 +56,7 @@ ssl_regen=Interval between SSL parameter regeneration
ssl_hours=hours ssl_hours=hours
ssl_none=None ssl_none=None
ssl_plain=Disallow plaintext authentication in non-SSL mode? 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_err=Failed to save SSL configuration
ssl_ekey=Missing or non-existent private key file ssl_ekey=Missing or non-existent private key file
ssl_ecert=Missing or non-existent certificate file ssl_ecert=Missing or non-existent certificate file
@@ -134,6 +135,14 @@ mail_env1=Inbox and folders in <tt>~/Maildir</tt>
mail_env2=Inbox under <tt>/var/mail</tt>, folders in <tt>~/mail</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_env3=Inbox in <tt>~/Maildir</tt>, folders in <tt>~/mail</tt>
mail_env4=Other Dovecot location $1 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_index=Index files location
mail_index0=Default (in Maildir directory) mail_index0=Default (in Maildir directory)
mail_index1=In memory only mail_index1=In memory only
@@ -152,16 +161,6 @@ mail_eenv=Missing or invalid-looking mail location
mail_echeck=Missing or non-numeric number of seconds between checks 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_eidle=Missing or non-numeric number of seconds between checks when idle
mail_eumask=Missing or invalid four-digit octal Umask 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_last=Allow use of POP3 LAST command?
mail_lock=Index files locking method mail_lock=Index files locking method
mail_fcntl=fcntl function mail_fcntl=fcntl function

View File

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

View File

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

View File

@@ -7,10 +7,14 @@ require './dovecot-lib.pl';
$conf = &get_config(); $conf = &get_config();
&lock_dovecot_files($conf); &lock_dovecot_files($conf);
# Save SSL cert and key # Save SSL cert
$in{'cert_def'} || -r $in{'cert'} || $in{'cert'} =~ /^[<>\|]/ || $in{'cert_def'} || -r $in{'cert'} || $in{'cert'} =~ /^[<>\|]/ ||
&error($text{'ssl_ecert'}); &error($text{'ssl_ecert'});
if (&find_value("ssl_cert", $conf, 2) || &version_atleast("2.2")) { 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")) {
$in{'cert'} = "<".$in{'cert'} if ($in{'cert'} =~ /^\//); $in{'cert'} = "<".$in{'cert'} if ($in{'cert'} =~ /^\//);
&save_directive($conf, "ssl_cert", &save_directive($conf, "ssl_cert",
$in{'cert_def'} ? undef : $in{'cert'}, ""); $in{'cert_def'} ? undef : $in{'cert'}, "");
@@ -20,9 +24,14 @@ else {
$in{'cert_def'} ? undef : $in{'cert'}); $in{'cert_def'} ? undef : $in{'cert'});
} }
# Save SSL key
$in{'key_def'} || -r $in{'key'} || $in{'key'} =~ /^[<>\|]/ || $in{'key_def'} || -r $in{'key'} || $in{'key'} =~ /^[<>\|]/ ||
&error($text{'ssl_ekey'}); &error($text{'ssl_ekey'});
if (&find_value("ssl_key", $conf, 2) || &version_atleast("2.2")) { 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")) {
$in{'key'} = "<".$in{'key'} if ($in{'key'} =~ /^\//); $in{'key'} = "<".$in{'key'} if ($in{'key'} =~ /^\//);
&save_directive($conf, "ssl_key", &save_directive($conf, "ssl_key",
$in{'key_def'} ? undef : $in{'key'}, ""); $in{'key_def'} ? undef : $in{'key'}, "");
@@ -35,7 +44,11 @@ else {
# Save SSL CA cert # Save SSL CA cert
$in{'ca_def'} || -r $in{'ca'} || $in{'ca'} =~ /^[<>\|]/ || $in{'ca_def'} || -r $in{'ca'} || $in{'ca'} =~ /^[<>\|]/ ||
&error($text{'ssl_eca'}); &error($text{'ssl_eca'});
if (&find_value("ssl_ca", $conf, 2) || &version_atleast("2.2")) { 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")) {
$in{'ca'} = "<".$in{'ca'} if ($in{'ca'} =~ /^\//); $in{'ca'} = "<".$in{'ca'} if ($in{'ca'} =~ /^\//);
&save_directive($conf, "ssl_ca", &save_directive($conf, "ssl_ca",
$in{'ca_def'} ? undef : $in{'ca'}, ""); $in{'ca_def'} ? undef : $in{'ca'}, "");
@@ -47,15 +60,29 @@ else {
# Save SSL key password # Save SSL key password
$in{'pass_def'} || $in{'pass'} =~ /\S/ || &error($text{'ssl_epass'}); $in{'pass_def'} || $in{'pass'} =~ /\S/ || &error($text{'ssl_epass'});
&save_directive($conf, "ssl_key_password", &save_directive($conf,
$in{'pass_def'} ? undef : $in{'pass'}); &version_atleast("2.4")
? "ssl_server_key_password"
: "ssl_key_password",
$in{'pass_def'} ? undef : $in{'pass'});
$in{'regen_def'} || $in{'regen'} =~ /^\d+$/ || &error($text{'ssl_eregen'}); # Save SSL parameter regeneration time
&save_directive($conf, "ssl_parameters_regenerate", if (&version_below("2.4")) {
$in{'regen_def'} ? undef : $in{'regen'}); $in{'regen_def'} || $in{'regen'} =~ /^\d+$/ ||
&error($text{'ssl_eregen'});
&save_directive($conf, "ssl_parameters_regenerate",
$in{'regen_def'} ? undef : $in{'regen'});
}
&save_directive($conf, "disable_plaintext_auth", # Save plaintext password setting
$in{'plain'} ? $in{'plain'} : undef); 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);
}
&flush_file_lines(); &flush_file_lines();
&unlock_dovecot_files($conf); &unlock_dovecot_files($conf);

View File

@@ -1,4 +1,5 @@
firewall_cmd=firewall-cmd firewall_cmd=firewall-cmd
init_name=firewalld init_name=firewalld
config_dir=/etc/firewalld config_dir=/etc/firewalld
packet_handling=drop packet_handling=0
timeout=0

View File

@@ -2,3 +2,4 @@ firewall_cmd=Full path to firewall-cmd program,0
init_name=FirewallD init script name,0 init_name=FirewallD init script name,0
config_dir=FirewallD configuration directory,0 config_dir=FirewallD configuration directory,0
packet_handling=Default packet handling action,1,0-<tt>drop</tt>,1-<tt>reject</tt> packet_handling=Default packet handling action,1,0-<tt>drop</tt>,1-<tt>reject</tt>
timeout=Timeout for temporary rules,15,timeout_data

48
firewalld/config_info.pl Executable file
View File

@@ -0,0 +1,48 @@
require './firewalld-lib.pl';
# show_timeout_data(value, config-option-name)
# Returns a radio button and a select box for timeout values
sub show_timeout_data
{
my ($value, $name) = @_;
$name = &format_option_name($name);
my $radio = &ui_radio(
"${name}_def", !$value ? 1 : 0,
[ [ 1, $text{'config_timeout_none'} ],
[ 0, ' ' ] ] );
my @list = &get_timeouts();
my @opts = map { [ $_, $text{"config_timeout_$_"} ] } @list;
my $select = &ui_select($name, !$value ? $list[3] : $value, \@opts);
return $radio . '&nbsp;' . $select;
}
# parse_timeout_data(old-value, config-option-name)
# Parses the timeout value from the form input
sub parse_timeout_data
{
my ($oldval, $name) = @_;
$name = &format_option_name($name);
my $val = $in{$name} // '';
return 0 if ($in{"${name}_def"});
my %valid = map { $_ => 1 } &get_timeouts();
&error(&text('config_timeout_err', $val)) unless($valid{$val});
return $val;
}
# get_timeouts
# Returns a list of valid timeout values for the select box
sub get_timeouts
{
return qw(1m 5m 15m 30m 1h 3h 6h 12h 1d 3d 7d 30d);
}
# format_option_name(name)
# Formats the option name for use in HTML element names
sub format_option_name
{
my ($name) = @_;
$name =~ s/\s+/_/g;
$name =~ s/[^\x00-\x7F]/_/g;
$name = lc($name);
return $name;
}

View File

@@ -540,6 +540,14 @@ if (!$zone) {
$zone = $zone->{'name'}; $zone = $zone->{'name'};
} }
# Timeout
my $timeout = $opts->{'timeout'};
if ($timeout) {
# Validate timeout format
&error(&text('config_timeout_err', $timeout))
if ($timeout !~ /^(\d+)([smhd]?)$/);
}
# Permanent rule # Permanent rule
my $permanent = $opts->{'permanent'}; my $permanent = $opts->{'permanent'};
@@ -548,7 +556,8 @@ my $get_cmd = sub {
my ($rtype) = @_; my ($rtype) = @_;
my $type = $rtype ? " --permanent" : ""; my $type = $rtype ? " --permanent" : "";
return "$config{'firewall_cmd'} --zone=\"".quotemeta($zone)."\"". return "$config{'firewall_cmd'} --zone=\"".quotemeta($zone)."\"".
"$type --".quotemeta($action)."-rich-rule='$opts->{'rule'}'"; "$type --".quotemeta($action)."-rich-rule='$opts->{'rule'}'".
($timeout ? " --timeout=".quotemeta($timeout) : "");
}; };
for my $type (0..1) { for my $type (0..1) {

View File

@@ -50,6 +50,21 @@ index_dependent=Failed to restart $1 dependent service
index_manual=Edit Config Files. index_manual=Edit Config Files.
index_downrules=FirewallD rules cannot be created or edited and are not enforced unless the server is running. index_downrules=FirewallD rules cannot be created or edited and are not enforced unless the server is running.
config_timeout_none=None
config_timeout_1m=1 minute
config_timeout_5m=5 minutes
config_timeout_15m=15 minutes
config_timeout_30m=30 minutes
config_timeout_1h=1 hour
config_timeout_3h=3 hours
config_timeout_6h=6 hours
config_timeout_12h=12 hours
config_timeout_1d=1 day
config_timeout_3d=3 days
config_timeout_7d=7 days
config_timeout_30d=30 days
config_timeout_err=Invalid timeout value <tt>$1</tt>
manual_title=Edit Config Files manual_title=Edit Config Files
manual_editsel=Edit FirewallD configuration file manual_editsel=Edit FirewallD configuration file
manual_err=Failed to save config file manual_err=Failed to save config file

View File

@@ -6,7 +6,7 @@ use warnings;
no warnings 'redefine'; no warnings 'redefine';
no warnings 'uninitialized'; no warnings 'uninitialized';
require './firewalld-lib.pl'; require './firewalld-lib.pl';
our (%in, %text); our (%in, %text, %config);
&ReadParse(); &ReadParse();
# Setup error messages # Setup error messages
@@ -31,6 +31,7 @@ $ip =~ s/\Q$mask\E// if ($mask);
# Block the IP # Block the IP
my $perm = $in{'permanent'} ? 'perm' : ''; my $perm = $in{'permanent'} ? 'perm' : '';
my $timeout = $config{'timeout'} unless ($perm && $config{'timeout'});
my ($out, $rs) = &rich_rule('add', my ($out, $rs) = &rich_rule('add',
{ 'rule' => { 'rule' =>
&construct_rich_rule( &construct_rich_rule(
@@ -38,7 +39,8 @@ my ($out, $rs) = &rich_rule('add',
'action' => $allow ? 'accept' : undef, 'action' => $allow ? 'accept' : undef,
'priority' => $allow ? -32767 : -32766, 'priority' => $allow ? -32767 : -32766,
), ),
'zone' => $zone->{'name'}, 'permanent' => $perm }); 'zone' => $zone->{'name'}, 'permanent' => $perm,
'timeout' => $timeout });
&error($out) if ($rs); &error($out) if ($rs);
&apply_firewalld() if ($perm); &apply_firewalld() if ($perm);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -15,6 +15,9 @@ table.formsection, table.ui_table, table.loginform {
table.ui_table .ui_table { table.ui_table .ui_table {
border: none; border: none;
} }
table.shrinkwrapper > tbody > tr > td > .ui_table {
table-layout: fixed;
}
img, a img { border:0; } img, a img { border:0; }
tr.row0 {background-color:#e8e8ea;} tr.row0 {background-color:#e8e8ea;}
tr.row1 {background-color:#f8f8fa;} tr.row1 {background-color:#f8f8fa;}
@@ -140,11 +143,16 @@ div.wrapper {
background-color:#D9D9D9; background-color:#D9D9D9;
} }
.goArrow { margin-bottom: -4px; } .goArrow { margin-bottom: -4px; }
.ui_checked_columns .ui_checked_checkbox {
min-width: 20px;
}
.ui_form_label{ .ui_form_label{
text-align:right; text-align:right;
vertical-align:top; vertical-align:top;
} }
.ui_form_pair .ui_form_value {
padding-left: 8px;
}
.ui_form_pair td {padding:4px;} .ui_form_pair td {padding:4px;}
.ui_form_pair td table.ui_radio_table tr td {padding:2px;} .ui_form_pair td table.ui_radio_table tr td {padding:2px;}
.ui_form_pair td table tr td {padding:0px;} .ui_form_pair td table tr td {padding:0px;}
@@ -220,8 +228,16 @@ br[data-x-br] {
opacity: .8; opacity: .8;
} }
.ui_text_wrap { tr:has(.ui_help) td:not(:hover) .ui_help {
float: right; visibility: hidden;
}
tr:has(.ui_help) td.ui_form_label .ui_help {
visibility: visible;
}
td:not(:hover) .ui_link_help {
visibility: hidden;
} }
.ui_link_help { .ui_link_help {
@@ -230,12 +246,13 @@ br[data-x-br] {
margin-right: 4px; margin-right: 4px;
} }
td:not(:hover) .ui_link_help { .ui_text_wrap {
visibility: hidden; float: right;
} }
[data-tooltip][aria-label] { [data-tooltip][aria-label] {
position: relative; position: relative;
vertical-align: top;
} }
[data-tooltip][aria-label]::after { [data-tooltip][aria-label]::after {
@@ -442,6 +459,23 @@ details.inline > summary + span {
line-height: 1.33; line-height: 1.33;
} }
details.inline.inlined > summary,
details.inline.inlined {
display: inline !important;
}
details > span .ui_alert_box {
margin-top: 5px;
}
details > span .ui_alert_box:not(:has(+p)) {
margin-bottom: 5px;
}
details.inline.inlined > span {
margin-top: 10px;
}
details.inline > summary + span > tt { details.inline > summary + span > tt {
font-size: 96%; font-size: 96%;
} }
@@ -465,6 +499,12 @@ details[open].inline > summary:after {
content: '⏷'; content: '⏷';
} }
details.inline.fit > summary + span span,
details.inline.fit > summary + span {
width: fit-content;
display: inline-block;
}
[data-second-print]:has(details) + br:has(+[data-x-br]) { [data-second-print]:has(details) + br:has(+[data-x-br]) {
display: none; display: none;
} }
@@ -840,3 +880,14 @@ body > .mode > b[data-mode="server-manager"] > a > .ff-cloudmin {
.inherit-color { .inherit-color {
color: inherit !important; color: inherit !important;
} }
.table-simple {
width: auto !important;
max-width: 100%;
}
.table-simple tr td {
padding: 0 4px !important;
}
.field-sizing-content {
field-sizing: content !important;
min-width: 40px !important;
}

33
lang/en
View File

@@ -190,7 +190,7 @@ pam_login=Continue
pam_restart=Restart pam_restart=Restart
login_notsecure=Not Secure login_notsecure=Not Secure
login_notsecure_desc=This connection is not secure and could let a man-in-the-middle attack intercept your password or session cookie. Click this badge to switch to an HTTPS connection, unless you are on a trusted local network or behind a secure reverse proxy. login_notsecure_desc=This connection is not secure and could let a man-in-the-middle attack intercept your password or session cookie. Click here to switch to an HTTPS connection, unless you are on a trusted local network or behind a secure reverse proxy.
acl_root=Root directory for file chooser acl_root=Root directory for file chooser
acl_otherdirs=Other visible directories in file chooser acl_otherdirs=Other visible directories in file chooser
@@ -438,6 +438,37 @@ 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_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 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. 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 main_error_details=Error details

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