Compare commits

...

7 Commits
2.2.0 ... 2.2.1

Author SHA1 Message Date
Michael Kaufmann
d3ec02f258 set version to 2.2.1 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2024-08-30 10:10:11 +02:00
Michael Kaufmann
f31ee2e360 add condition to the remember-me checkbox for updaters when the token-table does not exist yet
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2024-08-29 08:21:25 +02:00
Michael Kaufmann
57206b2f72 dont generate dhparam file as fallback but use defined FFDHE4096 group; fixes #1270
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2024-08-29 08:21:16 +02:00
Florian Moker
73906f252b Fix missing proftpd-mod-wrap installation (#1272)
Missing Package Installation on Ubuntu Noble 24.04 - proftpd-mod-wrap, fixes #1271
2024-08-29 08:21:10 +02:00
Michael Kaufmann
7206f5fee2 show antispam options for email-editing only if enabled
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2024-08-24 20:18:38 +02:00
Michael Kaufmann
55212607e0 fix storing multiple-choice-select values, thx to 21MILEX on Discord, fixes #1269
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2024-08-24 10:23:54 +02:00
Lukas Bableck
e6bfe205c5 Add |raw to h5 in formfields template (#1268) 2024-08-23 11:03:33 +02:00
23 changed files with 55 additions and 27 deletions

View File

@@ -62,6 +62,7 @@ if ($action == '2fa_entercode') {
// show template to enter code // show template to enter code
UI::view('login/enter2fa.html.twig', [ UI::view('login/enter2fa.html.twig', [
'pagetitle' => lng('login.2fa'), 'pagetitle' => lng('login.2fa'),
'remember_me' => (Settings::Get('panel.db_version') >= 202407200) ? true : false,
'message' => $message 'message' => $message
]); ]);
} elseif ($action == '2fa_verify') { } elseif ($action == '2fa_verify') {

View File

@@ -730,7 +730,7 @@ opcache.validate_timestamps'),
('panel', 'logo_overridecustom', '0'), ('panel', 'logo_overridecustom', '0'),
('panel', 'settings_mode', '0'), ('panel', 'settings_mode', '0'),
('panel', 'menu_collapsed', '1'), ('panel', 'menu_collapsed', '1'),
('panel', 'version', '2.2.0'), ('panel', 'version', '2.2.1'),
('panel', 'db_version', '202408140'); ('panel', 'db_version', '202408140');

View File

@@ -164,3 +164,8 @@ if (Froxlor::isFroxlorVersion('2.2.0-rc3')) {
Update::showUpdateStep("Updating from 2.2.0-rc3 to 2.2.0 stable", false); Update::showUpdateStep("Updating from 2.2.0-rc3 to 2.2.0 stable", false);
Froxlor::updateToVersion('2.2.0'); Froxlor::updateToVersion('2.2.0');
} }
if (Froxlor::isFroxlorVersion('2.2.0')) {
Update::showUpdateStep("Updating from 2.2.0 to 2.2.1", false);
Froxlor::updateToVersion('2.2.1');
}

View File

@@ -225,7 +225,7 @@ class SysLog extends ApiCommand implements ResourceEntity
} }
$params['trunc'] = $truncatedate; $params['trunc'] = $truncatedate;
Database::pexecute($result_stmt, $params, true, true); Database::pexecute($result_stmt, $params, true, true);
$this->logger()->logAction($this->isAdmin() ? FroxlorLogger::ADM_ACTION : FroxlorLogger::USR_ACTION, LOG_WARNING, "[API] truncated the froxlor syslog"); $this->logger()->logAction(FroxlorLogger::ADM_ACTION, LOG_WARNING, "[API] truncated the froxlor syslog");
return $this->response(true); return $this->response(true);
} }
throw new Exception("Not allowed to execute given command.", 403); throw new Exception("Not allowed to execute given command.", 403);

View File

@@ -441,7 +441,7 @@ class Apache extends HttpConfigBase
if (!empty(Settings::Get('system.dhparams_file'))) { if (!empty(Settings::Get('system.dhparams_file'))) {
$dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file')); $dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file'));
if (!file_exists($dhparams)) { if (!file_exists($dhparams)) {
FileDir::safe_exec('openssl dhparam -out ' . escapeshellarg($dhparams) . ' 4096'); file_put_contents($dhparams, self::FFDHE4096);
} }
$this->virtualhosts_data[$vhosts_filename] .= ' SSLOpenSSLConfCmd DHParameters "' . $dhparams . '"' . "\n"; $this->virtualhosts_data[$vhosts_filename] .= ' SSLOpenSSLConfCmd DHParameters "' . $dhparams . '"' . "\n";
} }
@@ -754,7 +754,7 @@ class Apache extends HttpConfigBase
if (!empty(Settings::Get('system.dhparams_file'))) { if (!empty(Settings::Get('system.dhparams_file'))) {
$dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file')); $dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file'));
if (!file_exists($dhparams)) { if (!file_exists($dhparams)) {
FileDir::safe_exec('openssl dhparam -out ' . escapeshellarg($dhparams) . ' 4096'); file_put_contents($dhparams, self::FFDHE4096);
} }
$vhost_content .= ' SSLOpenSSLConfCmd DHParameters "' . $dhparams . '"' . "\n"; $vhost_content .= ' SSLOpenSSLConfCmd DHParameters "' . $dhparams . '"' . "\n";
} }

View File

@@ -45,6 +45,26 @@ use PDO;
class HttpConfigBase class HttpConfigBase
{ {
/**
* Pre-defined DHE groups to use as fallback if dhparams_file
* is given, but non-existent, see also https://github.com/froxlor/Froxlor/issues/1270
*/
const FFDHE4096 = <<<EOC
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e
8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx
iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K
zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=
-----END DH PARAMETERS-----
EOC;
public function init() public function init()
{ {
// if Let's Encrypt is activated, run it before regeneration of webserver configfiles // if Let's Encrypt is activated, run it before regeneration of webserver configfiles

View File

@@ -273,7 +273,7 @@ class Lighttpd extends HttpConfigBase
if (!empty(Settings::Get('system.dhparams_file'))) { if (!empty(Settings::Get('system.dhparams_file'))) {
$dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file')); $dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file'));
if (!file_exists($dhparams)) { if (!file_exists($dhparams)) {
FileDir::safe_exec('openssl dhparam -out ' . escapeshellarg($dhparams) . ' 4096'); file_put_contents($dhparams, self::FFDHE4096);
} }
$this->lighttpd_data[$vhost_filename] .= 'ssl.dh-file = "' . $dhparams . '"' . "\n"; $this->lighttpd_data[$vhost_filename] .= 'ssl.dh-file = "' . $dhparams . '"' . "\n";
$this->lighttpd_data[$vhost_filename] .= 'ssl.ec-curve = "secp384r1"' . "\n"; $this->lighttpd_data[$vhost_filename] .= 'ssl.ec-curve = "secp384r1"' . "\n";
@@ -756,7 +756,7 @@ class Lighttpd extends HttpConfigBase
if (!empty(Settings::Get('system.dhparams_file'))) { if (!empty(Settings::Get('system.dhparams_file'))) {
$dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file')); $dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file'));
if (!file_exists($dhparams)) { if (!file_exists($dhparams)) {
FileDir::safe_exec('openssl dhparam -out ' . escapeshellarg($dhparams) . ' 4096'); file_put_contents($dhparams, self::FFDHE4096);
} }
$ssl_settings .= 'ssl.dh-file = "' . $dhparams . '"' . "\n"; $ssl_settings .= 'ssl.dh-file = "' . $dhparams . '"' . "\n";
$ssl_settings .= 'ssl.ec-curve = "secp384r1"' . "\n"; $ssl_settings .= 'ssl.ec-curve = "secp384r1"' . "\n";

View File

@@ -399,7 +399,7 @@ class Nginx extends HttpConfigBase
if (!empty(Settings::Get('system.dhparams_file'))) { if (!empty(Settings::Get('system.dhparams_file'))) {
$dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file')); $dhparams = FileDir::makeCorrectFile(Settings::Get('system.dhparams_file'));
if (!file_exists($dhparams)) { if (!file_exists($dhparams)) {
FileDir::safe_exec('openssl dhparam -out ' . escapeshellarg($dhparams) . ' 4096'); file_put_contents($dhparams, self::FFDHE4096);
} }
$sslsettings .= "\t" . 'ssl_dhparam ' . $dhparams . ';' . "\n"; $sslsettings .= "\t" . 'ssl_dhparam ' . $dhparams . ';' . "\n";
} }

View File

@@ -31,7 +31,7 @@ final class Froxlor
{ {
// Main version variable // Main version variable
const VERSION = '2.2.0'; const VERSION = '2.2.1';
// Database version (YYYYMMDDC where C is a daily counter) // Database version (YYYYMMDDC where C is a daily counter)
const DBVERSION = '202408140'; const DBVERSION = '202408140';

View File

@@ -232,7 +232,7 @@ class Data
{ {
$returnvalue = true; $returnvalue = true;
if (isset($fielddata['option_mode']) && $fielddata['option_mode'] == 'multiple') { if (isset($fielddata['select_mode']) && $fielddata['select_mode'] == 'multiple') {
$options = explode(',', $newfieldvalue); $options = explode(',', $newfieldvalue);
foreach ($options as $option) { foreach ($options as $option) {
$returnvalue = ($returnvalue && isset($fielddata['select_var'][$option])); $returnvalue = ($returnvalue && isset($fielddata['select_var'][$option]));
@@ -247,7 +247,7 @@ class Data
if (isset($fielddata['option_emptyallowed']) && $fielddata['option_emptyallowed']) { if (isset($fielddata['option_emptyallowed']) && $fielddata['option_emptyallowed']) {
return true; return true;
} }
return 'not in option'; return 'not in option (field: ' . $fieldname . ')';
} }
} }

View File

@@ -2121,7 +2121,7 @@ action = "no action";
<service type="ftp" title="{{lng.admin.configfiles.ftp}}"> <service type="ftp" title="{{lng.admin.configfiles.ftp}}">
<!-- Proftpd --> <!-- Proftpd -->
<daemon name="proftpd" title="ProFTPd" default="true"> <daemon name="proftpd" title="ProFTPd" default="true">
<install><![CDATA[apt-get install proftpd-basic proftpd-mod-mysql proftpd-mod-crypto]]></install> <install><![CDATA[apt-get install proftpd-basic proftpd-mod-mysql proftpd-mod-crypto proftpd-mod-wrap]]></install>
<file name="/etc/proftpd/create-cert.sh" chown="root:0" <file name="/etc/proftpd/create-cert.sh" chown="root:0"
chmod="0700"> chmod="0700">
<content><![CDATA[#!/bin/bash <content><![CDATA[#!/bin/bash

View File

@@ -103,18 +103,21 @@ return [
] ]
], ],
'spam_tag_level' => [ 'spam_tag_level' => [
'visible' => Settings::Get('antispam.activated') == '1',
'label' => lng('antispam.spam_tag_level'), 'label' => lng('antispam.spam_tag_level'),
'type' => 'text', 'type' => 'text',
'string_regexp' => '/^\d{1,}(\.\d{1,2})?$/', 'string_regexp' => '/^\d{1,}(\.\d{1,2})?$/',
'value' => $result['spam_tag_level'] 'value' => $result['spam_tag_level']
], ],
'spam_kill_level' => [ 'spam_kill_level' => [
'visible' => Settings::Get('antispam.activated') == '1',
'label' => lng('antispam.spam_kill_level'), 'label' => lng('antispam.spam_kill_level'),
'type' => 'text', 'type' => 'text',
'string_regexp' => '/^\d{1,}(\.\d{1,2})?$/', 'string_regexp' => '/^\d{1,}(\.\d{1,2})?$/',
'value' => $result['spam_kill_level'] 'value' => $result['spam_kill_level']
], ],
'bypass_spam' => [ 'bypass_spam' => [
'visible' => Settings::Get('antispam.activated') == '1',
'label' => lng('antispam.bypass_spam'), 'label' => lng('antispam.bypass_spam'),
'type' => 'label', 'type' => 'label',
'value' => ((int)$result['bypass_spam'] == 0 ? lng('panel.no') : lng('panel.yes')), 'value' => ((int)$result['bypass_spam'] == 0 ? lng('panel.no') : lng('panel.yes')),
@@ -128,6 +131,7 @@ return [
] ]
], ],
'policy_greylist' => [ 'policy_greylist' => [
'visible' => Settings::Get('antispam.activated') == '1',
'label' => lng('antispam.policy_greylist'), 'label' => lng('antispam.policy_greylist'),
'type' => 'label', 'type' => 'label',
'value' => ((int)$result['policy_greylist'] == 0 ? lng('panel.no') : lng('panel.yes')), 'value' => ((int)$result['policy_greylist'] == 0 ? lng('panel.no') : lng('panel.yes')),

View File

@@ -1143,7 +1143,8 @@ Atentament, el vostre administrador'
] ]
], ],
'message' => [ 'message' => [
'norecipients' => 'No s\'ha enviat cap correu electrònic perquè no hi ha destinataris a la base de dades' 'norecipients' => 'No s\'ha enviat cap correu electrònic perquè no hi ha destinataris a la base de dades',
'success' => 'Missatge enviat correctament als destinataris de %s',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'Usuari/Nom de la base de dades', 'databasename' => 'Usuari/Nom de la base de dades',
@@ -2169,7 +2170,6 @@ Atentament, el vostre administrador'
'issuer' => 'Emissor' 'issuer' => 'Emissor'
], ],
'success' => [ 'success' => [
'messages_success' => 'Missatge enviat correctament als destinataris de %s',
'success' => 'Informació', 'success' => 'Informació',
'clickheretocontinue' => 'Feu clic aquí per a continuar', 'clickheretocontinue' => 'Feu clic aquí per a continuar',
'settingssaved' => 'La configuració s\'ha guardat correctament.', 'settingssaved' => 'La configuració s\'ha guardat correctament.',

View File

@@ -1213,6 +1213,7 @@ Ach upřímně, váš správce',
], ],
'message' => [ 'message' => [
'norecipients' => 'Nebyl odeslán žádný e-mail, protože v databázi nejsou žádní příjemci', 'norecipients' => 'Nebyl odeslán žádný e-mail, protože v databázi nejsou žádní příjemci',
'success' => 'Zpráva byla úspěšně odeslána příjemcům %s',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'Uživatel/Jméno databáze', 'databasename' => 'Uživatel/Jméno databáze',
@@ -2273,7 +2274,6 @@ Ach upřímně, váš správce',
'issuer' => 'Vydavatel', 'issuer' => 'Vydavatel',
], ],
'success' => [ 'success' => [
'messages_success' => 'Zpráva byla úspěšně odeslána příjemcům %s',
'success' => 'Informace', 'success' => 'Informace',
'clickheretocontinue' => 'Klikněte zde pro pokračování', 'clickheretocontinue' => 'Klikněte zde pro pokračování',
'settingssaved' => 'Nastavení bylo úspěšně uloženo.', 'settingssaved' => 'Nastavení bylo úspěšně uloženo.',

View File

@@ -1141,6 +1141,7 @@ Vielen Dank, Ihr Administrator',
], ],
'message' => [ 'message' => [
'norecipients' => 'Es wurde keine E-Mail versendet, da sich keine Empfänger in der Datenbank befinden', 'norecipients' => 'Es wurde keine E-Mail versendet, da sich keine Empfänger in der Datenbank befinden',
'success' => 'Nachricht erfolgreich an "%s" Empfänger gesendet',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'Benutzer-/Datenbankname', 'databasename' => 'Benutzer-/Datenbankname',
@@ -2139,7 +2140,6 @@ Vielen Dank, Ihr Administrator',
'dmarc_entry' => 'DMARC-Eintrag für alle Domains', 'dmarc_entry' => 'DMARC-Eintrag für alle Domains',
], ],
'success' => [ 'success' => [
'messages_success' => 'Nachricht erfolgreich an "%s" Empfänger gesendet',
'success' => 'Information', 'success' => 'Information',
'clickheretocontinue' => 'Hier klicken, um fortzufahren', 'clickheretocontinue' => 'Hier klicken, um fortzufahren',
'settingssaved' => 'Die Einstellungen wurden erfolgreich gespeichert.', 'settingssaved' => 'Die Einstellungen wurden erfolgreich gespeichert.',

View File

@@ -1213,6 +1213,7 @@ Yours sincerely, your administrator',
], ],
'message' => [ 'message' => [
'norecipients' => 'No e-mail has been sent because there are no recipients in the database', 'norecipients' => 'No e-mail has been sent because there are no recipients in the database',
'success' => 'Successfully sent message to %s recipients',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'User/Database name', 'databasename' => 'User/Database name',
@@ -2273,7 +2274,6 @@ Yours sincerely, your administrator',
'issuer' => 'Issuer', 'issuer' => 'Issuer',
], ],
'success' => [ 'success' => [
'messages_success' => 'Successfully sent message to %s recipients',
'success' => 'Information', 'success' => 'Information',
'clickheretocontinue' => 'Click here to continue', 'clickheretocontinue' => 'Click here to continue',
'settingssaved' => 'The settings have been successfully saved.', 'settingssaved' => 'The settings have been successfully saved.',

View File

@@ -1132,7 +1132,8 @@ Atentamente, su administrador'
] ]
], ],
'message' => [ 'message' => [
'norecipients' => 'No se ha enviado ningún correo electrónico porque no hay destinatarios en la base de datos' 'norecipients' => 'No se ha enviado ningún correo electrónico porque no hay destinatarios en la base de datos',
'success' => 'Mensaje enviado correctamente a los destinatarios de %s',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'Usuario/Nombre de la base de datos', 'databasename' => 'Usuario/Nombre de la base de datos',
@@ -2152,7 +2153,6 @@ Atentamente, su administrador'
'issuer' => 'Emisor' 'issuer' => 'Emisor'
], ],
'success' => [ 'success' => [
'messages_success' => 'Mensaje enviado correctamente a los destinatarios de %s',
'success' => 'Información', 'success' => 'Información',
'clickheretocontinue' => 'Haga clic aquí para continuar', 'clickheretocontinue' => 'Haga clic aquí para continuar',
'settingssaved' => 'La configuración se ha guardado correctamente.', 'settingssaved' => 'La configuración se ha guardado correctamente.',

View File

@@ -466,6 +466,7 @@ return [
], ],
'message' => [ 'message' => [
'norecipients' => 'Aucun e-mail n\'a été envoyé car il n\'existe aucun destinataire dans la base de données', 'norecipients' => 'Aucun e-mail n\'a été envoyé car il n\'existe aucun destinataire dans la base de données',
'success' => 'Le message a été envoyé aux destinataires "%s"',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'Nom de la base de données', 'databasename' => 'Nom de la base de données',
@@ -749,9 +750,6 @@ return [
'description' => 'Les administrateurs / revendeurs peuvent réinitialiser leurs mots de passe et il sera envoyé à leurs propres adresses e-mails', 'description' => 'Les administrateurs / revendeurs peuvent réinitialiser leurs mots de passe et il sera envoyé à leurs propres adresses e-mails',
], ],
], ],
'success' => [
'messages_success' => 'Le message a été envoyé aux destinataires "%s"',
],
'traffic' => [ 'traffic' => [
'month' => 'Mois', 'month' => 'Mois',
'day' => 'Jour', 'day' => 'Jour',

View File

@@ -1043,6 +1043,7 @@ Cordiali Saluti, Team Froxlor',
], ],
'message' => [ 'message' => [
'norecipients' => 'Nessuna e-mail è stata inviata perch¸ non ci sono i destinatari nel database', 'norecipients' => 'Nessuna e-mail è stata inviata perch¸ non ci sono i destinatari nel database',
'success' => 'Inviato correttamente il messaggio a %s recipients',
], ],
'mysql' => [ 'mysql' => [
'description' => 'Qui puoi creare e modificare il tuo database MySQL<br />Le modifiche sono istantanee e puoi usare subito il database.<br />Nel menù a sinistra trovi phpMyAdmin con cui puoi amministrare il tuo database.<br /><br />Per usare i database nei tuoi script php usa le seguenti impostazioni: (Le parole in <i>corsivo</i> devono essere modificate con quello che hai scritto!)<br />Hostname: <b><SQL_HOST></b><br />Utente: <b><i>Nome database</i></b><br />Password: <b><i>La password che hai scelto</i></b><br />Database: <b><i>Nome database</i></b>', 'description' => 'Qui puoi creare e modificare il tuo database MySQL<br />Le modifiche sono istantanee e puoi usare subito il database.<br />Nel menù a sinistra trovi phpMyAdmin con cui puoi amministrare il tuo database.<br /><br />Per usare i database nei tuoi script php usa le seguenti impostazioni: (Le parole in <i>corsivo</i> devono essere modificate con quello che hai scritto!)<br />Hostname: <b><SQL_HOST></b><br />Utente: <b><i>Nome database</i></b><br />Password: <b><i>La password che hai scelto</i></b><br />Database: <b><i>Nome database</i></b>',
@@ -1703,7 +1704,6 @@ Nota: Perfavore <b>sii sicuro</b> di usare lo stesso nome di file come per il cr
'spf_entry' => 'Impostazioni SPF per tutti i domini', 'spf_entry' => 'Impostazioni SPF per tutti i domini',
], ],
'success' => [ 'success' => [
'messages_success' => 'Inviato correttamente il messaggio a %s recipients',
'success' => 'Informazioni', 'success' => 'Informazioni',
'clickheretocontinue' => 'Clicca qui per continuare', 'clickheretocontinue' => 'Clicca qui per continuare',
'settingssaved' => 'Le impostazioni sono state salvate con successo.', 'settingssaved' => 'Le impostazioni sono state salvate con successo.',

View File

@@ -619,6 +619,7 @@ Met vriendelijke groet, uw beheerder',
], ],
'message' => [ 'message' => [
'norecipients' => 'Er is geen email verstuurd omdat er geen ontvangers in de database zijn', 'norecipients' => 'Er is geen email verstuurd omdat er geen ontvangers in de database zijn',
'success' => 'Bericht verzonden naar ontvangers %s',
], ],
'mysql' => [ 'mysql' => [
'databasename' => 'gebruiker/database naam', 'databasename' => 'gebruiker/database naam',
@@ -1069,7 +1070,6 @@ Met vriendelijke groet, uw beheerder',
'spf_entry' => 'SPF regel voor alle domeinen', 'spf_entry' => 'SPF regel voor alle domeinen',
], ],
'success' => [ 'success' => [
'messages_success' => 'Bericht verzonden naar ontvangers %s',
'success' => 'Informatie', 'success' => 'Informatie',
'clickheretocontinue' => 'Klik hier om verder te gaan', 'clickheretocontinue' => 'Klik hier om verder te gaan',
'settingssaved' => 'De instellingen zijn opgeslagen.', 'settingssaved' => 'De instellingen zijn opgeslagen.',

View File

@@ -554,6 +554,7 @@ return [
], ],
'message' => [ 'message' => [
'norecipients' => 'Email não enviado porque não tem destinatário no banco de dados', 'norecipients' => 'Email não enviado porque não tem destinatário no banco de dados',
'success' => 'Mensagens enviadas para %s destinatários com sucesso',
], ],
'mysql' => [ 'mysql' => [
'description' => 'Aqui você pode criar e alterar seus bancos de dados MySQL.<br />As alterações são instantâneas e podem ser utilizadas imediatamente depois de salvas.<br />No menu do lado esquerdo você pode encontrar a ferramenta phpMyAdmin e com ela facilmente administrar seus bancos de dados.<br /><br />Para usar seu banco de dados com scripts em PHP use as seguintes configurações: (Os dados em <i>italico</i> devem ser substituidos pelo equivalente do banco de dados que você criou!)<br />Hostname: <b><SQL_HOST></b><br />Usuario: <b><i>Nome do banco de dadose</i></b><br />Senha: <b><i>a senha que você escolheu</i></b><br />Banco de dados: <b><i>Nome do banco de dados', 'description' => 'Aqui você pode criar e alterar seus bancos de dados MySQL.<br />As alterações são instantâneas e podem ser utilizadas imediatamente depois de salvas.<br />No menu do lado esquerdo você pode encontrar a ferramenta phpMyAdmin e com ela facilmente administrar seus bancos de dados.<br /><br />Para usar seu banco de dados com scripts em PHP use as seguintes configurações: (Os dados em <i>italico</i> devem ser substituidos pelo equivalente do banco de dados que você criou!)<br />Hostname: <b><SQL_HOST></b><br />Usuario: <b><i>Nome do banco de dadose</i></b><br />Senha: <b><i>a senha que você escolheu</i></b><br />Banco de dados: <b><i>Nome do banco de dados',
@@ -880,9 +881,6 @@ return [
'description' => 'Se ativado você pode trocar o cliente de um domínio para administração de outro.<br /><b>Attention:</b> Froxlor não troca nenhum caminho. Isto pode fazer com que domínios parem de funcionar', 'description' => 'Se ativado você pode trocar o cliente de um domínio para administração de outro.<br /><b>Attention:</b> Froxlor não troca nenhum caminho. Isto pode fazer com que domínios parem de funcionar',
], ],
], ],
'success' => [
'messages_success' => 'Mensagens enviadas para %s destinatários com sucesso',
],
'traffic' => [ 'traffic' => [
'month' => 'Mês', 'month' => 'Mês',
'day' => 'Diariamente', 'day' => 'Diariamente',

View File

@@ -3,7 +3,7 @@
{% if norow == false and (field.type != 'hidden' or (field.type == 'hidden' and field.display is defined and field.display is not empty)) %} {% if norow == false and (field.type != 'hidden' or (field.type == 'hidden' and field.display is defined and field.display is not empty)) %}
<div class="row g-0 formfield d-flex align-items-center"> <div class="row g-0 formfield d-flex align-items-center">
{% if field.prior_infotext is defined and field.prior_infotext|length > 0 %} {% if field.prior_infotext is defined and field.prior_infotext|length > 0 %}
<h5>{{ field.prior_infotext }}</h5> <h5>{{ field.prior_infotext|raw }}</h5>
{% endif %} {% endif %}
{% if field.label is iterable %} {% if field.label is iterable %}
<label for="{{ id }}" class="col-sm-6 col-form-label pe-3"> <label for="{{ id }}" class="col-sm-6 col-form-label pe-3">

View File

@@ -22,6 +22,7 @@
<input class="form-control" type="text" name="2fa_code" id="2fa_code" value="" autocomplete="off" autofocus required/> <input class="form-control" type="text" name="2fa_code" id="2fa_code" value="" autocomplete="off" autofocus required/>
</div> </div>
{% if remember_me %}
<div class="mb-3"> <div class="mb-3">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input type="hidden" name="2fa_remember" value="0"/> <input type="hidden" name="2fa_remember" value="0"/>
@@ -29,6 +30,7 @@
<label class="form-check-label" for="2fa_remember">{{ lng('login.2faremember') }}</label> <label class="form-check-label" for="2fa_remember">{{ lng('login.2faremember') }}</label>
</div> </div>
</div> </div>
{% endif %}
</div> </div>