diff --git a/CHANGELOG.md b/CHANGELOG.md
index e02c15d7b..5a3894ea3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,18 @@
## Changelog
-#### 2.400 (May 24, 2025)
-* Added built-in support for forgotten password recovery
-* Fixed bugs with IPv6 interface creation on systems using Network Manager
-* Improved security of single-use login links
-* Added support for SSL certificates and DNS over TLS in the BIND module
+#### 2.400 (May 25, 2025)
+* Add built-in support for forgotten password recovery
+* Add support for SSL certificates and DNS over TLS in the BIND module
+* Add support to configure listen for any type of address in Dovecot module
+* Add display of the PHP binary and its version in the PHP Configuration module
+* Add TOML as editable format in the File Manager module
+* Add support for template variables in help pages
+* Improve security of single-use login links
+* Fix Linux systems to show human-readable timestamps in the System Logs module
+* Fix to prefer JSON::XS over JSON::PP if available for better performance
+* Fix bugs with IPv6 interface creation on systems using Network Manager
+* Fix to address the security issue in the System Documentation module
+
#### 2.303 (March 14, 2025)
* Fix permissions error when attempting to open a temp file for writing
diff --git a/phpini/delete_pkgs.cgi b/phpini/delete_pkgs.cgi
index 282a7d0c1..c15fc324e 100755
--- a/phpini/delete_pkgs.cgi
+++ b/phpini/delete_pkgs.cgi
@@ -31,6 +31,7 @@ foreach my $name (@d) {
if (!$in{'confirm'}) {
# Find the packages first
+ print "
\n";
print &ui_form_start("delete_pkgs.cgi");
foreach my $d (@d) {
print &ui_hidden("d", $d);
@@ -42,6 +43,7 @@ if (!$in{'confirm'}) {
print &text('dpkgs_rusure',
join(" ", map { "$_" } @alldel)),"\n";
print &ui_form_end([ [ 'confirm', $text{'pkgs_delete'} ] ]);
+ print "
\n";
}
else {
# Actually do the deletion
diff --git a/phpini/index.cgi b/phpini/index.cgi
index 1d38bf387..00aa73312 100755
--- a/phpini/index.cgi
+++ b/phpini/index.cgi
@@ -3,22 +3,35 @@
require './phpini-lib.pl';
+# Get install button
+my $install_button = &show_php_install_button();
+
+# Do we have PHP installed?
+my @pkgs = &list_php_base_packages();
+if (!@pkgs && $install_button) {
+ &ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1);
+ &ui_print_endpage($text{'pkgs_none2'}."
".$install_button);
+ }
+
# Get editable files
@files = &list_php_configs();
if (!@files) {
# User doesn't have access to any
&ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1);
- &ui_print_endpage($text{'index_eaccess'});
+ &ui_print_endpage($text{'index_eaccess'}."
".
+ $install_button);
}
@files = grep { -r $_->[0] } @files;
if (!@files) {
&ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1);
if ($access{'noconfig'}) {
- &ui_print_endpage($text{'index_efiles'});
+ &ui_print_endpage($text{'index_efiles'}."
".
+ $install_button);
}
else {
&ui_print_endpage(&text('index_efiles2',
- "../config.cgi?$module_name"));
+ "../config.cgi?$module_name")."
".
+ $install_button);
}
}
@@ -37,7 +50,7 @@ else {
100, 0, \@tds);
foreach $f (@files) {
local @acts = ( "$text{'index_edit'}" );
+ &urlize($f->[0])."'>$text{'index_medit'}" );
if ($access{'manual'}) {
push(@acts, "$text{'index_manual'}");
@@ -57,20 +70,29 @@ else {
print "$text{'index_anyfile'} \n";
print &ui_textbox("file", undef, 40)." ".
&file_chooser_button("file")." ".
- &ui_submit($text{'index_edit'})."\n";
+ &ui_submit($text{'index_medit'})."\n";
print &ui_form_end();
}
# Show button to install PHP versions
- if ($access{'global'} && &foreign_available("software")) {
- print &ui_hr();
- print &ui_buttons_start();
- print &ui_buttons_row("list_pkgs.cgi",
- $text{'index_pkgs'},
- $text{'index_pkgsdesc'});
- print &ui_buttons_end();
- }
+ print &show_php_install_button();
&ui_print_footer("/", $text{'index'});
}
+# Print PHP install button if available
+# Returns a button to install new PHP versions
+sub show_php_install_button
+{
+&load_theme_library();
+my $rv = '';
+if ($access{'global'} && &foreign_available("software")) {
+ $rv .= &ui_hr();
+ $rv .= &ui_buttons_start();
+ $rv .= &ui_buttons_row("list_pkgs.cgi",
+ $text{'index_pkgs'},
+ $text{'index_pkgsdesc'});
+ $rv .= &ui_buttons_end();
+ }
+return $rv;
+}
diff --git a/phpini/lang/ar.auto b/phpini/lang/ar.auto
index cba6edc04..6b25aa9e7 100644
--- a/phpini/lang/ar.auto
+++ b/phpini/lang/ar.auto
@@ -5,7 +5,7 @@ index_efiles2=لم يتم العثور على ملفات تهيئة PHP. اضب
index_file=ملف الضبط
index_desc=هدف
index_actions=أجراءات
-index_edit=يدير
+index_medit=يدير
index_manual=تحرير يدوي
index_anyfile=تعديل ملف تكوين PHP الآخر
index_return=ملفات التكوين
diff --git a/phpini/lang/bg.auto b/phpini/lang/bg.auto
index 859e8710b..4f40e84ab 100644
--- a/phpini/lang/bg.auto
+++ b/phpini/lang/bg.auto
@@ -5,7 +5,7 @@ index_efiles2=Не бяха намерени конфигурационни фа
index_file=Конфигурационен файл
index_desc=Предназначение
index_actions=мерки
-index_edit=управлявам
+index_medit=управлявам
index_manual=Редактирайте ръчно
index_anyfile=Редактирайте друг PHP конфигурационен файл
index_return=конфигурационни файлове
diff --git a/phpini/lang/ca b/phpini/lang/ca
index a3c31e206..a802502ac 100644
--- a/phpini/lang/ca
+++ b/phpini/lang/ca
@@ -5,7 +5,7 @@ index_efiles2=No s'ha trobat cap fitxer de configuració de PHP. Ajusta la mod
index_file=Konfigurationsfil
index_desc=Formål
index_actions=Handlinger
-index_edit=Styre
+index_medit=Styre
index_manual=Rediger manuelt
index_anyfile=Rediger anden PHP-konfigurationsfil
index_return=konfigurationsfiler
diff --git a/phpini/lang/de b/phpini/lang/de
index d62cf25e1..e1515c16c 100644
--- a/phpini/lang/de
+++ b/phpini/lang/de
@@ -5,7 +5,7 @@ index_efiles2=Es wurden keine PHP-Konfigurationsdateien gefunden. Passen Sie die
index_file=Konfigurationsdatei
index_desc=Verwendungszweck
index_actions=Aktionen
-index_edit=Verwalten
+index_medit=Verwalten
index_manual=Manuell bearbeiten
index_anyfile=Andere PHP-Konfigurationsdatei bearbeiten
index_return=Konfigurationsdateien
@@ -230,7 +230,7 @@ pkgs_ecannot=Sie haben keine Berechtigung, PHP-Pakete zu verwalten!
pkgs_ecannot2=Softwarepakete können auf diesem System nicht verwaltet werden
pkgs_nousers=Keine Domains
pkgs_ucount=$1 Domains
-pkgs_newver=Zu installierendes PHP-Paket:
+pkgs_newver=Zu installierendes PHP-Paket
pkgs_install=Jetzt installieren
pkgs_return=PHP-Pakete
diff --git a/phpini/lang/el.auto b/phpini/lang/el.auto
index fadadcf97..b50a8720d 100644
--- a/phpini/lang/el.auto
+++ b/phpini/lang/el.auto
@@ -5,7 +5,7 @@ index_efiles2=Δεν βρέθηκαν αρχεία ρυθμίσεων PHP. Ρυ
index_file=Αρχείο ρυθμίσεων
index_desc=Σκοπός
index_actions=Ενέργειες
-index_edit=Διαχειρίζονται
+index_medit=Διαχειρίζονται
index_manual=Επεξεργασία Μη αυτόματα
index_anyfile=Επεξεργαστείτε άλλο αρχείο διαμόρφωσης PHP
index_return=αρχεία διαμόρφωσης
diff --git a/phpini/lang/en b/phpini/lang/en
index 983299e46..ffad4c04d 100644
--- a/phpini/lang/en
+++ b/phpini/lang/en
@@ -5,7 +5,7 @@ index_efiles2=No PHP configuration files were found. Adjust the mod
index_file=Configuration file
index_desc=Purpose
index_actions=Actions
-index_edit=Manage
+index_medit=Manage
index_manual=Edit Manually
index_anyfile=Edit other PHP configuration file
index_return=configuration files
@@ -226,11 +226,12 @@ pkgs_shortver=Short version
pkgs_users=Used by
pkgs_delete=Delete Selected Packages
pkgs_none=No PHP packages were found on your system!
+pkgs_none2=No PHP versions were found on your system. Click the button below to install one, if available in your software package repository.
pkgs_ecannot=You are not allowed to manage PHP packages!
pkgs_ecannot2=Software packages cannot be managed on this system
pkgs_nousers=No domains
pkgs_ucount=$1 domains
-pkgs_newver=PHP package to install:
+pkgs_newver=PHP package to install
pkgs_install=Install Now
pkgs_return=PHP packages
diff --git a/phpini/lang/es.auto b/phpini/lang/es.auto
index d071eefad..2dd23ed85 100644
--- a/phpini/lang/es.auto
+++ b/phpini/lang/es.auto
@@ -5,7 +5,7 @@ index_efiles2=No se encontraron archivos de configuración de PHP. Ajuste la
index_file=Konfigurazio fitxategia
index_desc=helburua
index_actions=Ekintzak
-index_edit=kudeatu
+index_medit=kudeatu
index_manual=Editatu eskuz
index_anyfile=Editatu beste PHP konfigurazio fitxategia
index_return=konfigurazio fitxategiak
diff --git a/phpini/lang/fa.auto b/phpini/lang/fa.auto
index a5d51d688..bdde900cf 100644
--- a/phpini/lang/fa.auto
+++ b/phpini/lang/fa.auto
@@ -5,7 +5,7 @@ index_efiles2=هیچ پرونده پیکربندی PHP یافت نشد. تنظی
index_file=فایل پیکربندی
index_desc=هدف
index_actions=اقدامات
-index_edit=مدیریت کنید
+index_medit=مدیریت کنید
index_manual=ویرایش دستی
index_anyfile=سایر فایل های پیکربندی PHP را ویرایش کنید
index_return=پرونده های پیکربندی
diff --git a/phpini/lang/fi.auto b/phpini/lang/fi.auto
index 87f5ccc63..bdc3a47a3 100644
--- a/phpini/lang/fi.auto
+++ b/phpini/lang/fi.auto
@@ -5,7 +5,7 @@ index_efiles2=PHP-määritystiedostoja ei löytynyt. Säädä moduu
index_file=Asetustiedosto
index_desc=Tarkoitus
index_actions=Toiminnot
-index_edit=hoitaa
+index_medit=hoitaa
index_manual=Muokkaa manuaalisesti
index_anyfile=Muokkaa muuta PHP-asetustiedostoa
index_return=kokoonpanotiedostot
diff --git a/phpini/lang/fr b/phpini/lang/fr
index 959ff02d6..5c2151ea6 100644
--- a/phpini/lang/fr
+++ b/phpini/lang/fr
@@ -5,7 +5,7 @@ index_efiles2=Aucun fichier de configuration PHP n'a été trouvé. Ajustez la <
index_file=Fichier de configuration
index_desc=Objectif
index_actions=Actions
-index_edit=Gérer
+index_medit=Gérer
index_manual=Modifier manuellement
index_return=fichiers de configuration
diff --git a/phpini/lang/hr.auto b/phpini/lang/hr.auto
index ebcdf2fdb..2ac6a7189 100644
--- a/phpini/lang/hr.auto
+++ b/phpini/lang/hr.auto
@@ -5,7 +5,7 @@ index_efiles2=Nisu pronađene PHP konfiguracijske datoteke. Podesite konfiguraci
index_file=Konfiguracijska datoteka
index_desc=Svrha
index_actions=akcije
-index_edit=Upravljati
+index_medit=Upravljati
index_manual=Ručno uređivanje
index_anyfile=Uredite drugu PHP konfiguracijsku datoteku
index_return=konfiguracijske datoteke
diff --git a/phpini/lang/hu b/phpini/lang/hu
index 91d00c9df..0bdf5ba6a 100644
--- a/phpini/lang/hu
+++ b/phpini/lang/hu
@@ -2,7 +2,7 @@ index_title=PHP konfiguráció
index_file=Konfigurációs fájl
index_desc=Cél
index_actions=Művelet
-index_edit=Beállítás
+index_medit=Beállítás
index_manual=Kézi szerkesztés
index_return=Konfigurációs fájlok
diff --git a/phpini/lang/it b/phpini/lang/it
index eccc6adc9..d7a7b604d 100644
--- a/phpini/lang/it
+++ b/phpini/lang/it
@@ -5,7 +5,7 @@ index_efiles2=Non è stato trovato alcun file di configurazione di PHP. Modifica
index_file=File di configurazione
index_desc=Tipologia
index_actions=Azioni
-index_edit=Modifica
+index_medit=Modifica
index_manual=Modifica manualmente
index_return=file di configurazione
diff --git a/phpini/lang/ja.auto b/phpini/lang/ja.auto
index 7ebe780bf..46817d827 100644
--- a/phpini/lang/ja.auto
+++ b/phpini/lang/ja.auto
@@ -5,7 +5,7 @@ index_efiles2=PHP構成ファイルが見つかりませんでした。 모듈
index_file=설정 파일
index_desc=사용처
index_actions=작동
-index_edit=관리
+index_medit=관리
index_manual=수동 편집
index_return=설정 파일
diff --git a/phpini/lang/ms.auto b/phpini/lang/ms.auto
index 498bb059f..7e827a56d 100644
--- a/phpini/lang/ms.auto
+++ b/phpini/lang/ms.auto
@@ -5,7 +5,7 @@ index_efiles2=Tiada fail konfigurasi PHP ditemui. Laraskan konfigur
index_file=Fail konfigurasi
index_desc=Tujuan
index_actions=Tindakan
-index_edit=Mengurus
+index_medit=Mengurus
index_manual=Edit secara manual
index_anyfile=Edit fail konfigurasi PHP lain
index_return=fail konfigurasi
diff --git a/phpini/lang/nl b/phpini/lang/nl
index 2d4631c51..6bffaac54 100644
--- a/phpini/lang/nl
+++ b/phpini/lang/nl
@@ -5,7 +5,7 @@ index_efiles2=Geen PHP configuratie files zijn gevonden. Verander de modulkonfi
index_file=Konfigurasjonsfil
index_desc=Hensikt
index_actions=Handlinger
-index_edit=Vedlikehold
+index_medit=Vedlikehold
index_manual=Rediger manuelt
index_return=konfigurasjonsfiler
diff --git a/phpini/lang/pl b/phpini/lang/pl
index b22883f35..077fe0569 100644
--- a/phpini/lang/pl
+++ b/phpini/lang/pl
@@ -5,7 +5,7 @@ index_efiles2=Nie znaleziono plików konfiguracji PHP. Ustaw poprawne ścieżki
index_file=Plik konfiguracyjny
index_desc=Przeznaczenie
index_actions=Działania
-index_edit=Zarządzaj
+index_medit=Zarządzaj
index_manual=Edytuj ręcznie
index_return=plików konfiguracyjnych
diff --git a/phpini/lang/pt.auto b/phpini/lang/pt.auto
index bd406b4ef..0f7445180 100644
--- a/phpini/lang/pt.auto
+++ b/phpini/lang/pt.auto
@@ -5,7 +5,7 @@ index_efiles2=Nenhum arquivo de configuração PHP foi encontrado. Ajuste a modulk
index_file=Konfigurationsfil
index_desc=Ändamål
index_actions=Handlingar
-index_edit=Klara av
+index_medit=Klara av
index_manual=Redigera manuellt
index_anyfile=Redigera annan PHP-konfigurationsfil
index_return=konfigurationsfiler
diff --git a/phpini/lang/tr.auto b/phpini/lang/tr.auto
index 90e088f6c..cc2e5256b 100644
--- a/phpini/lang/tr.auto
+++ b/phpini/lang/tr.auto
@@ -5,7 +5,7 @@ index_efiles2=PHP yapılandırma dosyası bulunamadı. Genel PHP yapılandırma
index_file=Yapılandırma dosyası
index_desc=amaç
index_actions=Hareketler
-index_edit=yönetme
+index_medit=yönetme
index_manual=Manuel Olarak Düzenle
index_anyfile=Diğer PHP yapılandırma dosyasını düzenle
index_return=yapılandırma dosyaları
diff --git a/phpini/lang/uk.auto b/phpini/lang/uk.auto
index da65ec006..74fba246e 100644
--- a/phpini/lang/uk.auto
+++ b/phpini/lang/uk.auto
@@ -5,7 +5,7 @@ index_efiles2=Файлів конфігурації PHP не знайдено.
index_file=Файл конфігурації
index_desc=Призначення
index_actions=Дії
-index_edit=Управління
+index_medit=Управління
index_manual=Редагувати вручну
index_anyfile=Відредагуйте інший файл конфігурації PHP
index_return=файли конфігурації
diff --git a/phpini/lang/zh.auto b/phpini/lang/zh.auto
index 9f1d066f3..a1ae7168a 100644
--- a/phpini/lang/zh.auto
+++ b/phpini/lang/zh.auto
@@ -5,7 +5,7 @@ index_efiles2=找不到PHP配置文件。调整模块配置,
index_file=配置文件
index_desc=目的
index_actions=动作
-index_edit=管理
+index_medit=管理
index_manual=手动编辑
index_anyfile=编辑其他 PHP 配置文件
index_return=配置文件
diff --git a/phpini/lang/zh_TW.auto b/phpini/lang/zh_TW.auto
index f66a0b600..f11416730 100644
--- a/phpini/lang/zh_TW.auto
+++ b/phpini/lang/zh_TW.auto
@@ -5,7 +5,7 @@ index_efiles2=找不到PHP配置文件。調整模塊配置,
index_file=配置文件
index_desc=目的
index_actions=動作
-index_edit=管理
+index_medit=管理
index_manual=手動編輯
index_anyfile=編輯其他 PHP 設定檔
index_return=配置文件
diff --git a/phpini/list_pkgs.cgi b/phpini/list_pkgs.cgi
index e3b1d5046..e8919e605 100755
--- a/phpini/list_pkgs.cgi
+++ b/phpini/list_pkgs.cgi
@@ -25,11 +25,15 @@ if (@pkgs) {
my $users;
if ($vmap) {
my $ulist = $vmap->{$pkg->{'shortver'}};
+ my $details =
+ &ui_details({
+ class => 'inline',
+ html => 1,
+ title => &text('pkgs_ucount', scalar(@$ulist)),
+ content => join("
",
+ map { "$_->{'dom'}" } @$ulist)});
$users = !$ulist || !@$ulist ? $text{'pkgs_nousers'} :
- @$ulist > 5 ? &text('pkgs_ucount',
- scalar(@$ulist)) :
- join(", ", map { "$_->{'dom'}" }
- @$ulist);
+ $details;
}
print &ui_checked_columns_row([
$pkg->{'name'},
@@ -53,10 +57,10 @@ if (&foreign_installed("package-updates")) {
print &ui_hr();
print &ui_form_start(
&get_webprefix()."/package-updates/update.cgi", "post");
- print "$text{'pkgs_newver'}\n";
+ print "$text{'pkgs_newver'} \n";
print &ui_select("u", undef,
[ map { [ $_->{'name'},
- $_->{'name'}." (".$_->{'ver'}.")" ] } @newpkgs ]);
+ "PHP $_->{'shortver'}" ] } @newpkgs ]);
print &ui_hidden(
"redir", &get_webprefix()."/$module_name/list_pkgs.cgi");
print &ui_hidden("redirdesc", $text{'pkgs_title'});
diff --git a/phpini/phpini-lib.pl b/phpini/phpini-lib.pl
index 7c6fa0dca..ed661a495 100755
--- a/phpini/phpini-lib.pl
+++ b/phpini/phpini-lib.pl
@@ -1010,7 +1010,8 @@ my ($pkg) = @_;
foreach my $p (&list_all_php_version_packages($pkg)) {
my @info = &software::package_info($p);
next if (!@info);
- my $err = &software::delete_package($p, { 'nodeps' => 1 });
+ my $err = &software::delete_package($p,
+ { 'nodeps' => 1, 'depstoo' => 1 });
if ($err) {
return &html_strip($err);
}
diff --git a/usermin/lang/de b/usermin/lang/de
index 8e3a9717e..154185fb1 100644
--- a/usermin/lang/de
+++ b/usermin/lang/de
@@ -18,7 +18,7 @@ index_restart=Usermin neu starten
index_restartmsg=Klicken Sie auf diese Schaltfläche, um den Usermin-Serverprozess neu zu starten. Dies kann notwendig sein, wenn Sie kürzlich Perl aktualisiert haben.
access_title=IP-Zugangskontrolle
-access_desc=Usermin kann so konfiguriert werden, dass der Zugriff nur von bestimmten IP-Adressen erlaubt oder verweigert wird. Hostnamen (wie foo.bar.com) und IP-Netzwerke (wie 10.254.3.0 oder 10.254.1.0/255.255.255.128 oder 10.254.1.0/25 oder 10.254.1.5-10.254.97.127) können ebenfalls eingegeben werden. Der Zugriff auf Usermin sollte auf vertrauenswürdige Adressen beschränkt werden, insbesondere wenn der Dienst über das Internet erreichbar ist. Andernfalls erhält jede:r, der:die das Passwort errät, vollständige Kontrolle über das System.
+access_desc=Usermin kann so konfiguriert werden, dass der Zugriff nur von bestimmten IP-Adressen erlaubt oder verweigert wird. Hostnamen (wie foo.bar.com) und IP-Netzwerke (wie 10.254.3.0 oder 10.254.1.0/255.255.255.128 oder 10.254.1.0/25 oder 10.254.1.5-10.254.97.127) können ebenfalls eingegeben werden. Der Zugriff auf Usermin sollte auf vertrauenswürdige Adressen beschränkt werden, insbesondere wenn der Dienst über das Internet erreichbar ist. Andernfalls erhält jeder, der das Passwort errät, vollständige Kontrolle über das System.
bind_title=Ports und Adressen
bind_desc2=Dieses Formular kann verwendet werden, um die Portnummer zu ändern, auf der Usermin lauscht, oder es so zu konfigurieren, dass es nur auf einer einzigen IP-Adresse auf Ihrem System lauscht. Sie können es auch so konfigurieren, dass es Verbindungen auf mehreren Ports akzeptiert oder auf mehreren IP-Adressen lauscht. Hinweis: Ihr Webbrowser fordert Sie möglicherweise auf, sich nach der Änderung des Ports oder der Bindungsadresse erneut anzumelden.