logAction(FroxlorLogger::CRON_ACTION, LOG_NOTICE, "Removing Let's Encrypt entries for domain " . $row['data']['domain']);
Domain::doLetsEncryptCleanUp($row['data']['domain']);
+ } elseif ($row['type'] == TaskId::UPDATE_LE_SERVICES) {
+ /**
+ * TYPE=13 set configuration for selected services regarding the use of Let's Encrypt certificate
+ */
+ FroxlorLogger::getInstanceOf()->logAction(FroxlorLogger::CRON_ACTION, LOG_NOTICE, "Updating Let's Encrypt configuration for selected services");
+ AcmeSh::renewHookConfigs(FroxlorLogger::getInstanceOf());
}
}
diff --git a/lib/Froxlor/Cron/TaskId.php b/lib/Froxlor/Cron/TaskId.php
index f905eba4..92d6b629 100644
--- a/lib/Froxlor/Cron/TaskId.php
+++ b/lib/Froxlor/Cron/TaskId.php
@@ -87,6 +87,11 @@ final class TaskId
*/
const DELETE_DOMAIN_SSL = 12;
+ /**
+ * TYPE=13 set configuration for selected services regarding the use of Let's Encrypt certificate
+ */
+ const UPDATE_LE_SERVICES = 13;
+
/**
* TYPE=20 CUSTUMER DATA DUMP
*/
diff --git a/lib/Froxlor/Cron/Traffic/ReportsCron.php b/lib/Froxlor/Cron/Traffic/ReportsCron.php
index 4a124b89..690e6d2e 100644
--- a/lib/Froxlor/Cron/Traffic/ReportsCron.php
+++ b/lib/Froxlor/Cron/Traffic/ReportsCron.php
@@ -133,7 +133,9 @@ class ReportsCron extends FroxlorCron
$_mailerror = false;
$mailerr_msg = "";
try {
- $mail->SetFrom($row['adminmail'], $row['adminname']);
+ $mail->setFrom(Settings::Get('panel.adminmail'), $row['adminname']);
+ $mail->clearReplyTos();
+ $mail->addReplyTo($row['adminmail'], $row['adminname']);
$mail->Subject = $mail_subject;
$mail->AltBody = $mail_body;
$mail->MsgHTML(nl2br($mail_body));
@@ -405,7 +407,9 @@ class ReportsCron extends FroxlorCron
$_mailerror = false;
$mailerr_msg = "";
try {
- $mail->SetFrom($row['adminmail'], $row['adminname']);
+ $mail->setFrom(Settings::Get('panel.adminmail'), $row['adminname']);
+ $mail->clearReplyTos();
+ $mail->addReplyTo($row['adminmail'], $row['adminname']);
$mail->Subject = $mail_subject;
$mail->AltBody = $mail_body;
$mail->MsgHTML(nl2br($mail_body));
diff --git a/lib/Froxlor/Database/DbManager.php b/lib/Froxlor/Database/DbManager.php
index 2fdae1e6..8ef72dab 100644
--- a/lib/Froxlor/Database/DbManager.php
+++ b/lib/Froxlor/Database/DbManager.php
@@ -102,8 +102,26 @@ class DbManager
$databases[$databases_row['dbserver']][] = $databases_row['databasename'];
}
+ $customers_sel = Database::query("
+ SELECT DISTINCT c.loginname
+ FROM `" . TABLE_PANEL_CUSTOMERS . "` c
+ LEFT JOIN `" . TABLE_PANEL_DATABASES . "` d ON c.customerid = d.customerid
+ WHERE c.deactivated = '0' AND d.id IS NOT NULL
+ ");
+ $customers = [];
+ while ($customer = $customers_sel->fetch(\PDO::FETCH_ASSOC)) {
+ $customers[] = $customer['loginname'];
+ }
+
$dbservers_stmt = Database::query("SELECT DISTINCT `dbserver` FROM `" . TABLE_PANEL_DATABASES . "`");
while ($dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC)) {
+
+ // add all customer loginnames to the $databases array for this database-server to correct
+ // a possible existing global mysql-user for that customer
+ foreach ($customers as $customer) {
+ $databases[$dbserver['dbserver']][] = $customer;
+ }
+
// require privileged access for target db-server
Database::needRoot(true, $dbserver['dbserver'], false);
@@ -136,6 +154,8 @@ class DbManager
$dbm->getManager()->flushPrivileges();
Database::needRoot(false);
+
+ unset($databases[$dbserver['dbserver']]);
}
}
@@ -149,13 +169,14 @@ class DbManager
* @param ?string $password
* @param int $dbserver
* @param int $last_accnumber
+ * @param ?string $global_user
*
* @return string|bool $username if successful or false of username is equal to the password
* @throws Exception
*/
- public function createDatabase(string $loginname = null, string $password = null, int $dbserver = 0, int $last_accnumber = 0)
+ public function createDatabase(string $loginname = null, string $password = null, int $dbserver = 0, int $last_accnumber = 0, string $global_user = "")
{
- Database::needRoot(true, $dbserver, false);
+ Database::needRoot(true, $dbserver, true);
// check whether we shall create a random username
if (strtoupper(Settings::Get('customer.mysqlprefix')) == 'RANDOM') {
@@ -184,6 +205,9 @@ class DbManager
// and give permission to the user on every access-host we have
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
$this->getManager()->grantPrivilegesTo($username, $password, $mysql_access_host);
+ if (!empty($global_user)) {
+ $this->getManager()->grantCreateToDb($global_user, $username, $mysql_access_host);
+ }
}
$this->getManager()->flushPrivileges();
diff --git a/lib/Froxlor/Database/Manager/DbManagerMySQL.php b/lib/Froxlor/Database/Manager/DbManagerMySQL.php
index 481c4dc3..b73992a4 100644
--- a/lib/Froxlor/Database/Manager/DbManagerMySQL.php
+++ b/lib/Froxlor/Database/Manager/DbManagerMySQL.php
@@ -110,13 +110,21 @@ class DbManagerMySQL
"password" => $password
]);
// grant privileges
+ $grants = "ALL";
+ if ($grant_access_prefix) {
+ $grants = "SELECT, INSERT, UPDATE, DELETE, DROP, INDEX, ALTER";
+ }
$stmt = Database::prepare("
- GRANT ALL ON `" . $username . ($grant_access_prefix ? '%' : '') . "`.* TO :username@:host
+ GRANT " . $grants . " ON `" . $username . ($grant_access_prefix ? '%' : '') . "`.* TO :username@:host
");
Database::pexecute($stmt, [
"username" => $username,
"host" => $access_host
]);
+
+ if ($grant_access_prefix) {
+ $this->grantCreateToCustomerDbs($username, $access_host);
+ }
} else {
// set password
if (version_compare(Database::getAttribute(\PDO::ATTR_SERVER_VERSION), '5.7.6', '<') || version_compare(Database::getAttribute(\PDO::ATTR_SERVER_VERSION), '10.0.0', '>=')) {
@@ -145,9 +153,10 @@ class DbManagerMySQL
* takes away any privileges from a user to that db
*
* @param string $dbname
+ * @param ?string $global_user
* @throws \Exception
*/
- public function deleteDatabase(string $dbname)
+ public function deleteDatabase(string $dbname, string $global_user = "")
{
if (version_compare(Database::getAttribute(PDO::ATTR_SERVER_VERSION), '5.0.2', '<')) {
// failsafe if user has been deleted manually (requires MySQL 4.1.2+)
@@ -167,11 +176,19 @@ class DbManagerMySQL
} else {
$drop_stmt = Database::prepare("DROP USER IF EXISTS :dbname@:host");
}
+ $rev_stmt = Database::prepare("REVOKE ALL PRIVILEGES ON `" . $dbname . "`.* FROM :guser@:host;");
while ($host = $host_res_stmt->fetch(PDO::FETCH_ASSOC)) {
Database::pexecute($drop_stmt, [
'dbname' => $dbname,
'host' => $host['Host']
], false);
+
+ if (!empty($global_user)) {
+ Database::pexecute($rev_stmt, [
+ 'guser' => $global_user,
+ 'host' => $host['Host']
+ ], false);
+ }
}
$drop_stmt = Database::prepare("DROP DATABASE IF EXISTS `" . $dbname . "`");
@@ -231,8 +248,15 @@ class DbManagerMySQL
{
// check whether user exists to avoid errors
if ($this->userExistsOnHost($username, $host)) {
- Database::query('GRANT ALL PRIVILEGES ON `' . $username . ($grant_access_prefix ? '%' : '') . '`.* TO `' . $username . '`@`' . $host . '`');
- Database::query('GRANT ALL PRIVILEGES ON `' . str_replace('_', '\_', $username) . ($grant_access_prefix ? '%' : '') . '` . * TO `' . $username . '`@`' . $host . '`');
+ $grants = "ALL PRIVILEGES";
+ if ($grant_access_prefix) {
+ $grants = "SELECT, INSERT, UPDATE, DELETE, DROP, INDEX, ALTER";
+ }
+ Database::query('GRANT ' . $grants . ' ON `' . $username . ($grant_access_prefix ? '%' : '') . '`.* TO `' . $username . '`@`' . $host . '`');
+ Database::query('GRANT ' . $grants . ' ON `' . str_replace('_', '\_', $username) . ($grant_access_prefix ? '%' : '') . '` . * TO `' . $username . '`@`' . $host . '`');
+ if ($grant_access_prefix) {
+ $this->grantCreateToCustomerDbs($username, $host);
+ }
}
}
@@ -292,4 +316,51 @@ class DbManagerMySQL
}
return $allsqlusers;
}
+
+ /**
+ * grant "CREATE" for prefix user to all existing databases of that customer
+ *
+ * @param string $username
+ * @param string $access_host
+ * @return void
+ * @throws \Exception
+ */
+ private function grantCreateToCustomerDbs(string $username, string $access_host)
+ {
+ $cus_stmt = Database::prepare("SELECT customerid FROM `" . TABLE_PANEL_CUSTOMERS . "` WHERE loginname = :username");
+ $cust = Database::pexecute_first($cus_stmt, ['username' => $username]);
+ if ($cust) {
+ $sel_stmt = Database::prepare("SELECT databasename FROM `" . TABLE_PANEL_DATABASES . "` WHERE `customerid` = :cid");
+ Database::pexecute($sel_stmt, ['cid' => $cust['customerid']]);
+ while ($dbdata = $sel_stmt->fetch(\PDO::FETCH_ASSOC)) {
+ $stmt = Database::prepare("
+ GRANT ALL ON `" . $dbdata['databasename'] . "`.* TO :username@:host
+ ");
+ Database::pexecute($stmt, [
+ "username" => $username,
+ "host" => $access_host
+ ]);
+ }
+ }
+ }
+
+ /**
+ * grant "CREATE" for prefix user to all existing databases of that customer
+ *
+ * @param string $username
+ * @param string $database
+ * @param string $access_host
+ * @return void
+ * @throws \Exception
+ */
+ public function grantCreateToDb(string $username, string $database, string $access_host)
+ {
+ $stmt = Database::prepare("
+ GRANT ALL ON `" . $database . "`.* TO :username@:host
+ ");
+ Database::pexecute($stmt, [
+ "username" => $username,
+ "host" => $access_host
+ ]);
+ }
}
diff --git a/lib/Froxlor/Froxlor.php b/lib/Froxlor/Froxlor.php
index 016bb0de..a2e3a465 100644
--- a/lib/Froxlor/Froxlor.php
+++ b/lib/Froxlor/Froxlor.php
@@ -34,7 +34,7 @@ final class Froxlor
const VERSION = '2.2.5';
// Database version (YYYYMMDDC where C is a daily counter)
- const DBVERSION = '202409280';
+ const DBVERSION = '202412030';
// Distribution branding-tag (used for Debian etc.)
const BRANDING = '';
diff --git a/lib/Froxlor/Settings/Store.php b/lib/Froxlor/Settings/Store.php
index be5f2cb9..bbc6b210 100644
--- a/lib/Froxlor/Settings/Store.php
+++ b/lib/Froxlor/Settings/Store.php
@@ -237,6 +237,17 @@ class Store
return $returnvalue;
}
+ public static function storeSettingFieldInsertUpdateServicesTask($fieldname, $fielddata, $newfieldvalue)
+ {
+ // first save the setting itself
+ $returnvalue = self::storeSettingField($fieldname, $fielddata, $newfieldvalue);
+
+ if ($returnvalue !== false) {
+ Cronjob::inserttask(TaskId::UPDATE_LE_SERVICES);
+ }
+ return $returnvalue;
+ }
+
public static function storeSettingHostname($fieldname, $fielddata, $newfieldvalue)
{
$returnvalue = self::storeSettingField($fieldname, $fielddata, $newfieldvalue);
diff --git a/lib/Froxlor/System/Mailer.php b/lib/Froxlor/System/Mailer.php
index b8b11cc8..be50f84f 100644
--- a/lib/Froxlor/System/Mailer.php
+++ b/lib/Froxlor/System/Mailer.php
@@ -68,9 +68,9 @@ class Mailer extends PHPMailer
if (self::ValidateAddress(Settings::Get('panel.adminmail')) !== false) {
// set return-to address and custom sender-name, see #76
- $this->SetFrom(Settings::Get('panel.adminmail'), Settings::Get('panel.adminmail_defname'));
+ $this->setFrom(Settings::Get('panel.adminmail'), Settings::Get('panel.adminmail_defname'));
if (Settings::Get('panel.adminmail_return') != '') {
- $this->AddReplyTo(Settings::Get('panel.adminmail_return'), Settings::Get('panel.adminmail_defname'));
+ $this->addReplyTo(Settings::Get('panel.adminmail_return'), Settings::Get('panel.adminmail_defname'));
}
}
}
diff --git a/lib/Froxlor/UI/Panel/UI.php b/lib/Froxlor/UI/Panel/UI.php
index 3cec80f8..ebad4738 100644
--- a/lib/Froxlor/UI/Panel/UI.php
+++ b/lib/Froxlor/UI/Panel/UI.php
@@ -121,7 +121,7 @@ class UI
'domain' => self::getCookieHost(),
'secure' => self::requestIsHttps(),
'httponly' => true,
- 'samesite' => 'Strict'
+ 'samesite' => 'Lax'
]);
session_start();
diff --git a/lib/Froxlor/User.php b/lib/Froxlor/User.php
index c2f7857f..a60ffc06 100644
--- a/lib/Froxlor/User.php
+++ b/lib/Froxlor/User.php
@@ -152,7 +152,7 @@ class User
]);
$customer['emails_used_new'] = (int)$customer_emails['number_emails'];
- $customer_emails_result_stmt = Database::prepare('SELECT `email`, `email_full`, `destination`, `popaccountid` AS `number_email_forwarders` FROM `' . TABLE_MAIL_VIRTUAL . '`
+ $customer_emails_result_stmt = Database::prepare('SELECT `email`, `email_full`, `destination`, `popaccountid` FROM `' . TABLE_MAIL_VIRTUAL . '`
WHERE `customerid` = :cid');
Database::pexecute($customer_emails_result_stmt, [
"cid" => $customer['customerid']
diff --git a/lib/formfields/admin/domains/formfield.domains_edit.php b/lib/formfields/admin/domains/formfield.domains_edit.php
index 45585ca3..c4b884e1 100644
--- a/lib/formfields/admin/domains/formfield.domains_edit.php
+++ b/lib/formfields/admin/domains/formfield.domains_edit.php
@@ -213,6 +213,10 @@ return [
'type' => 'hidden',
'value' => '0'
],
+ 'emaildomainverified' => [
+ 'type' => 'hidden',
+ 'value' => '0'
+ ],
]
],
'section_bssl' => [
@@ -433,15 +437,17 @@ return [
'section_d' => [
'title' => lng('admin.nameserversettings'),
'image' => 'icons/domain_edit.png',
- 'visible' => Settings::Get('system.bind_enable') == '1' && $userinfo['change_serversettings'] == '1',
+ 'visible' => $userinfo['change_serversettings'] == '1',
'fields' => [
'isbinddomain' => [
+ 'visible' => Settings::Get('system.bind_enable') == '1',
'label' => lng('admin.createzonefile'),
'type' => 'checkbox',
'value' => '1',
'checked' => $result['isbinddomain']
],
'zonefile' => [
+ 'visible' => Settings::Get('system.bind_enable') == '1',
'label' => lng('admin.custombindzone'),
'desc' => lng('admin.bindzonewarning'),
'type' => 'text',
diff --git a/lib/formfields/customer/email/formfield.emails_edit.php b/lib/formfields/customer/email/formfield.emails_edit.php
index 925acb1a..89f794d2 100644
--- a/lib/formfields/customer/email/formfield.emails_edit.php
+++ b/lib/formfields/customer/email/formfield.emails_edit.php
@@ -97,7 +97,7 @@ return [
'checked' => (int)$result['iscatchall'],
],
'bypass_spam' => [
- 'visible' => Settings::Get('antispam.activated') == '1',
+ 'visible' => Settings::Get('antispam.activated') == '1' && (int)Settings::Get('antispam.default_bypass_spam') <= 2,
'label' => lng('antispam.bypass_spam'),
'type' => 'checkbox',
'value' => '1',
@@ -112,7 +112,7 @@ return [
'value' => $result['spam_tag_level'],
],
'spam_rewrite_subject' => [
- 'visible' => Settings::Get('antispam.activated') == '1',
+ 'visible' => Settings::Get('antispam.activated') == '1' && (int)Settings::Get('antispam.default_spam_rewrite_subject') <= 2,
'label' => lng('antispam.rewrite_subject'),
'type' => 'checkbox',
'value' => '1',
@@ -127,7 +127,7 @@ return [
'value' => $result['spam_kill_level']
],
'policy_greylist' => [
- 'visible' => Settings::Get('antispam.activated') == '1',
+ 'visible' => Settings::Get('antispam.activated') == '1' && (int)Settings::Get('antispam.default_policy_greylist') <= 2,
'label' => lng('antispam.policy_greylist'),
'type' => 'checkbox',
'value' => '1',
diff --git a/lib/init.php b/lib/init.php
index c4cc5bdc..ee61f5b8 100644
--- a/lib/init.php
+++ b/lib/init.php
@@ -374,7 +374,7 @@ if (CurrentUser::hasSession()) {
'domain' => UI::getCookieHost(),
'secure' => UI::requestIsHttps(),
'httponly' => true,
- 'samesite' => 'Strict'
+ 'samesite' => 'Lax'
];
setcookie(session_name(), $_COOKIE[session_name()], $cookie_params);
} else {
diff --git a/lng/de.lng.php b/lng/de.lng.php
index 7199ee87..89e3c57b 100644
--- a/lng/de.lng.php
+++ b/lng/de.lng.php
@@ -504,6 +504,7 @@ return [
'apiguide' => 'API Guide',
'domain_duplicate' => 'Domain duplizieren',
'domain_duplicate_named' => '%s duplizieren',
+ 'emaildomainwarning' => 'ACHTUNG: Durch die Änderung dieser Einstellung löschen Sie alle bestehenden E-Mail-Adressen und -Konten unwiderruflich.
',
],
'apikeys' => [
'no_api_keys' => 'Keine API Keys gefunden',
@@ -640,6 +641,24 @@ return [
'required_spf_dns' => 'Erforderlicher SPF DNS Eintrag',
'required_dmarc_dns' => 'Erforderlicher DMARC DNS Eintrag',
'required_dkim_dns' => 'Erforderlicher DKIM DNS Eintrag',
+ 'default_select' => [
+ 'on_changeable' => 'Aktiviert, einstellbar',
+ 'off_changeable' => 'Deaktiviert, einstellbar',
+ 'on_unchangeable' => 'Aktiviert, nicht einstellbar',
+ 'off_unchangeable' => 'Deaktiviert, nicht einstellbar',
+ ],
+ 'default_bypass_spam' => [
+ 'title' => 'Standardwert: Spamfilter umgehen',
+ 'description' => 'Wählen, ob bei neuen E-Mail-Konten "Spamfilter umgehen" standardmäßig aktiviert ist und ob diese Einstellung vom Kunden angepasst werden kann.
Standard: Deaktiviert, einstellbar'
+ ],
+ 'default_spam_rewrite_subject' => [
+ 'title' => 'Standardwert: Betreff ändern',
+ 'description' => 'Wählen, ob bei neuen E-Mail-Konten "Betreff ändern" standardmäßig aktiviert ist und ob diese Einstellung vom Kunden angepasst werden kann.
Standard: Aktiviert, einstellbar'
+ ],
+ 'default_policy_greylist' => [
+ 'title' => 'Standardwert: Verwende greylisting',
+ 'description' => 'Wählen, ob bei neuen E-Mail-Konten "Verwende greylisting" standardmäßig aktiviert ist und ob diese Einstellung vom Kunden angepasst werden kann.
Standard: Aktiviert, einstellbar'
+ ],
],
'dns' => [
'destinationip' => 'Domain-IP-Adresse(n)',
@@ -769,6 +788,8 @@ return [
'mydocumentroot' => '\'Documentroot\'',
'loginnameexists' => 'Der Login-Name "%s" existiert bereits.',
'emailiswrong' => 'Die E-Mail-Adresse "%s" enthält ungültige Zeichen oder ist nicht vollständig.',
+ 'emailexists' => 'Die E-Mail-Adresse "%s" wird bereits von einem anderen Admin verwendet',
+ 'emailexistsanon' => 'Die E-Mail-Adresse "%s" wird bereits verwendet',
'alternativeemailiswrong' => 'Die angegebene alternative E-Mail Adresse "%s", an welche die Zugangsdaten geschickt werden soll, scheint ungültig zu sein.',
'loginnameiswrong' => 'Der Login-Name "%s" enthält ungültige Zeichen.',
'loginnameiswrong2' => 'Der Login-Name enthält zu viele Zeichen, es sind maximal %s Zeichen erlaubt.',
@@ -956,6 +977,7 @@ return [
'invalidpgppublickey' => 'Der angegebene PGP Public Key ist ungültig',
'invalid_validtime' => 'Wert der valid_time in Sekunden muss zwischen 10 und 120 liegen.',
'customerphpenabledbutnoconfig' => 'Kunde hat PHP aktiviert aber keine PHP-Konfiguration wurde gewählt.',
+ 'emaildomainstillhasaddresses' => 'Maildomain-Flag kann nicht deaktiviert werden, da für diese Domain noch E-Mail-Adressen vorhanden sind.',
],
'extras' => [
'description' => 'Hier können Sie zusätzliche Extras einrichten, wie zum Beispiel einen Verzeichnisschutz.
Die Änderungen sind erst nach einer kurzen Zeit wirksam.',
@@ -2174,6 +2196,7 @@ Vielen Dank, Ihr Administrator',
'CREATE_CUSTOMER_DATADUMP' => 'Daten-Export für Kunde %s',
'DELETE_DOMAIN_PDNS' => 'Lösche Domain %s von PowerDNS Datenbank',
'DELETE_DOMAIN_SSL' => 'Lösche SSL Dateien von Domain %s',
+ 'UPDATE_LE_SERVICES' => 'Aktualisiere Systemdienste für Let\'s Encrypt',
],
'terms' => 'AGB',
'traffic' => [
diff --git a/lng/en.lng.php b/lng/en.lng.php
index 6c0af9c1..5065b5b1 100644
--- a/lng/en.lng.php
+++ b/lng/en.lng.php
@@ -519,6 +519,7 @@ return [
'backups' => [
'backups' => 'Backups',
],
+ 'emaildomainwarning' => 'WARNING: By changing this setting you will delete all existing e-mail addresses and -accounts permanently.
',
],
'apcuinfo' => [
'clearcache' => 'Clear APCu cache',
@@ -689,6 +690,24 @@ return [
'required_spf_dns' => 'Required SPF DNS entry',
'required_dmarc_dns' => 'Required DMARC DNS entry',
'required_dkim_dns' => 'Required DKIM DNS entry',
+ 'default_select' => [
+ 'on_changeable' => 'Activated, adjustable',
+ 'off_changeable' => 'Deactivated, adjustable',
+ 'on_unchangeable' => 'Activated, not adjustable',
+ 'off_unchangeable' => 'Deactivated, not adjustable',
+ ],
+ 'default_bypass_spam' => [
+ 'title' => 'Bypass spamfilter default value',
+ 'description' => 'Whether new email accounts have "Bypass spamfilter" activated by default and whether this setting is adjustable by the customer.
Default: Deactivated, adjustable'
+ ],
+ 'default_spam_rewrite_subject' => [
+ 'title' => 'Rewrite subject default value',
+ 'description' => 'Whether new email accounts have "Rewrite subject" activated by default and whether this setting is adjustable by the customer.
Default: Activated, adjustable'
+ ],
+ 'default_policy_greylist' => [
+ 'title' => 'Use greylisting default value',
+ 'description' => 'Whether new email accounts have "Use greylisting" activated by default and whether this setting is adjustable by the customer.
Default: Activated, adjustable'
+ ],
],
'dns' => [
'destinationip' => 'Domain IP(s)',
@@ -840,6 +859,8 @@ return [
'mydocumentroot' => '\'Documentroot\'',
'loginnameexists' => 'Loginname %s already exists',
'emailiswrong' => 'Email-address %s contains invalid characters or is incomplete',
+ 'emailexists' => 'Email-address %s already in use by another admin',
+ 'emailexistsanon' => 'Email-address %s already in use.',
'alternativeemailiswrong' => 'The given alternative email address %s to send the credentials to seems to be invalid',
'loginnameiswrong' => 'Loginname "%s" contains illegal characters.',
'loginnameiswrong2' => 'Loginname contains too many characters. Only %s characters are allowed.',
@@ -1028,6 +1049,7 @@ return [
'invalidpgppublickey' => 'The PGP Public Key is not valid',
'invalid_validtime' => 'Valid time in seconds can only be between 10 and 120',
'customerphpenabledbutnoconfig' => 'Customer has PHP activated but no PHP-configuration was selected.',
+ 'emaildomainstillhasaddresses' => 'Cannot deactivate mail-domain flag, as there are still email-addresses for this domain.',
],
'extras' => [
'description' => 'Here you can add some extras, for example directory protection.
The system will need some time to apply the new settings after every change.',
@@ -2308,6 +2330,7 @@ Yours sincerely, your administrator',
'CREATE_CUSTOMER_DATADUMP' => 'Data export job for customer %s',
'DELETE_DOMAIN_PDNS' => 'Delete domain %s from PowerDNS database',
'DELETE_DOMAIN_SSL' => 'Delete ssl files of domain %s',
+ 'UPDATE_LE_SERVICES' => 'Updating system services for Let\'s Encrypt',
],
'terms' => 'Terms of use',
'traffic' => [
diff --git a/package-lock.json b/package-lock.json
index 0483e44f..db54468a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,7 +19,7 @@
"postcss": "^8.1.14",
"resolve-url-loader": "^5.0.0",
"sass": "^1.69.3",
- "vite": "^4.5.3",
+ "vite": "^4.5.5",
"vue": "^3.2.37"
},
"engines": {
@@ -1156,10 +1156,11 @@
}
},
"node_modules/vite": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz",
- "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==",
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz",
+ "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"esbuild": "^0.18.10",
"postcss": "^8.4.27",
diff --git a/package.json b/package.json
index db6ad8a5..9696a9ca 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
"postcss": "^8.1.14",
"resolve-url-loader": "^5.0.0",
"sass": "^1.69.3",
- "vite": "^4.5.3",
+ "vite": "^4.5.5",
"vue": "^3.2.37"
},
"engines": {