This PR adds a "Page layout" setting to the Framed Theme, with a new single page layout that shows the menu on every page instead of in a frame.
It's meant for people who can't or don't want to use frames, so the Legacy Theme is no longer the only option without frames.
The menu code moved out of `left.cgi` into a shared menu-lib.pl, so both layouts build the same menu, frames look the same as before, and `left.cgi` shrinks from about 400 lines to about 60.
The menu's module search box now follows the global "webminsearch" permission, which the old frame code never actually checked.
One exception to be aware of. A server opened through Webmin Servers Index always uses frames, because that index only rewrites the links and redirects of framed pages.
This PR updates the framed gray theme with a modern light and dark design while keeping its frameset and old class names without adding any extra complexity on Perl or JS side.
The left menu becomes a floating panel with product logos, a product switch and a loading bar, and the system information page uses the new UI lib widgets for tiles and cards.
Color scheme that follows the browser or can be forced from the theme settings.
This PR fixes WebSocket routes being lost when miniserv configuration changes multiple times within one second.
Read `miniserv.conf` directly so locked updates use the current configuration.
The previous cache could reuse stale data because it compared modification times in whole seconds.
Add a regression test covering route additions and removals with an unchanged modification time.
This PR fixes the Package Updates module reporting "no updates" when dnf check-update fails.
DNF prints its error to stderr and exits with status 1, but the module only read stdout, so a failed check looked like an empty list and was cached for hours. Users could go weeks or months without seeing that updates were blocked!
The module now checks the exit status. When a check fails, it keeps the last known list, shows the error on the module and refresh pages, and retries after 15 minutes instead of caching an empty result.
Scheduled checks email the failure instead of acting on the old list, and in new-only mode the failure is emailed once until a check succeeds again.
Fixes https://forum.virtualmin.com/t/no-warning-of-dnf-error-suppressing-update/138052
This patch fixes FTPS backups failing on servers that require TLS session reuse.
It reuses the control connection's TLS session for data uploads.
It adds coverage for an actual passive-mode upload and was verified against a live ProFTPD server.
https://github.com/webmin/webmin/issues/2849#issuecomment-5752478469
This patch fixes the Backup Configuration destination selector by using the new select-based UI.
It keeps existing field names and backup behavior unchanged.
It also ensures browser downloads bypass AJAX and submit correctly.
This patch fixes comments before skipped `IfModule`, `IfDefine`, and `IfVersion` blocks being attached to the next parsed directive.
For example:
```apache
# SSL-only settings
<IfModule mod_ssl.c>
SSLEngine on
</IfModule>
ServerName example.test
```
When `mod_ssl` was unavailable, Webmin attached `# SSL-only settings` to `ServerName`. Deleting `ServerName` could then remove the wrong line and produce:
```apache
# SSL-only settings
<IfModule mod_ssl.c>
SSLEngine on
```
This fix clears comments belonging to skipped conditionals. Deleting `ServerName` now leaves the complete `IfModule` block unchanged.