Add translation

This commit is contained in:
Daniel Winzen 2022-12-31 21:27:40 +01:00
parent 32cbcc35cc
commit a8ebc0d9bb
No known key found for this signature in database
GPG key ID: 222FCC3F35C41077
14 changed files with 2344 additions and 346 deletions

View file

@ -8,6 +8,13 @@ Installation Instructions:
TODO TODO
Translating:
------------
The scrip `update-translations.sh` can be used to update the language template and translation files from source.
It will generate the file `locale/mail-hosting.pot` which you can then use as basis to create a new language file in `YOUR_LANG_CODE/LC_MESSAGES/mail-hosting.po` and edit it with a translation program, such as [Poedit](https://poedit.net/).
Once you are done, you can open a pull request, or [email me](mailto:daniel@danwin1210.de), to include the translation.
Live demo: Live demo:
---------- ----------

View file

@ -13,6 +13,64 @@ const DBVERSION = 1; // Database schema version
const PERSISTENT = true; // persistent database connection const PERSISTENT = true; // persistent database connection
const CAPTCHA_DIFFICULTY = 1; // captcha difficulty from 0 to 3 const CAPTCHA_DIFFICULTY = 1; // captcha difficulty from 0 to 3
const RESERVED_USERNAMES = ['about', 'abuse', 'admin', 'administrator', 'billing', 'contact', 'daemon', 'ftp', 'help', 'hostmaster', 'info', 'legal', 'list', 'list-request', 'lists', 'maildaemon', 'mailerdaemon', 'mailer-daemon', 'marketing', 'media', 'news', 'newsletter', 'nobody', 'noc', 'noreply', 'no-reply', 'notification', 'notifications', 'notify', 'offer', 'offers', 'office', 'official', 'order', 'orders', 'phish', 'phishing', 'postmaster', 'root', 'sale', 'sales', 'security', 'service', 'services', 'shop', 'shopping', 'spam', 'staff', 'support', 'survey', 'system', 'team', 'teams', 'unsbubscribe', 'uucp', 'usenet', 'user', 'username', 'users', 'web', 'webmail', 'webmaster', 'webmasters', 'welcome', 'www']; // list of reserved usernames that can mot be used on public registration const RESERVED_USERNAMES = ['about', 'abuse', 'admin', 'administrator', 'billing', 'contact', 'daemon', 'ftp', 'help', 'hostmaster', 'info', 'legal', 'list', 'list-request', 'lists', 'maildaemon', 'mailerdaemon', 'mailer-daemon', 'marketing', 'media', 'news', 'newsletter', 'nobody', 'noc', 'noreply', 'no-reply', 'notification', 'notifications', 'notify', 'offer', 'offers', 'office', 'official', 'order', 'orders', 'phish', 'phishing', 'postmaster', 'root', 'sale', 'sales', 'security', 'service', 'services', 'shop', 'shopping', 'spam', 'staff', 'support', 'survey', 'system', 'team', 'teams', 'unsbubscribe', 'uucp', 'usenet', 'user', 'username', 'users', 'web', 'webmail', 'webmaster', 'webmasters', 'welcome', 'www']; // list of reserved usernames that can mot be used on public registration
const CANONICAL_URL = 'https://danwin1210.de/mail/'; // our preferred URL prefix for search engines
const PRIVACY_POLICY_URL = '/privacy.php'; // URL to privacy policy
const WEB_XMPP_URL = 'https://danwin1210.de:5281/conversejs'; // URL to Web-XMPP
const XMPP_BOSH_URL = 'https://danwin1210.de:5281/http-bind'; // XMPP BOSH URL
const XMPP_FILE_PROXY = 'proxy.danwin1210.de'; // File proxy domain
const ROOT_URL = '/mail/'; // Relative root URL under which the mail hosting is installed
const CONTACT_URL = '/contact.php'; // URL to get in contact with you
const CLEARNET_SERVER = 'danwin1210.de'; // Clearnet domain of the mail server
const ONION_SERVER = 'danielas3rtn54uwmofdo3x2bsdifr47huasnmbgqzfrec5ubupvtpid.onion'; // Onion domain of the mail server
const DBHOST_PROSODY = 'localhost'; // Database host
const DBUSER_PROSODY = 'prosody'; // Database user
const DBPASS_PROSODY = 'YOUR_PASSWORD'; // Database password
const DBNAME_PROSODY = 'prosody'; // Database
const LANGUAGES = [
'de' => ['name' => 'Deutsch', 'locale' => 'de_DE', 'flag' => '🇩🇪', 'show_in_menu' => true, 'dir' => 'ltr'],
'en' => ['name' => 'English', 'locale' => 'en_GB', 'flag' => '🇬🇧', 'show_in_menu' => true, 'dir' => 'ltr'],
];
$language = 'en';
$locale = 'en_GB';
$dir = 'ltr';
if(isset($_REQUEST['lang']) && isset(LANGUAGES[$_REQUEST['lang']])){
$locale = LANGUAGES[$_REQUEST['lang']]['locale'];
$language = $_REQUEST['lang'];
$dir = LANGUAGES[$_REQUEST['lang']]['dir'];
setcookie('language', $_REQUEST['lang'], ['expires' => 0, 'path' => '/', 'domain' => '', 'secure' => ($_SERVER['HTTPS'] ?? '' === 'on'), 'httponly' => true, 'samesite' => 'Strict']);
}elseif(isset($_COOKIE['language']) && isset(LANGUAGES[$_COOKIE['language']])){
$locale = LANGUAGES[$_COOKIE['language']]['locale'];
$language = $_COOKIE['language'];
$dir = LANGUAGES[$_COOKIE['language']]['dir'];
}elseif(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$prefLocales = array_reduce(
explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']),
function (array $res, string $el) {
list($l, $q) = array_merge(explode(';q=', $el), [1]);
$res[$l] = (float) $q;
return $res;
}, []);
arsort($prefLocales);
foreach($prefLocales as $l => $q){
$lang = locale_lookup(array_keys(LANGUAGES), $l);
if(!empty($lang)){
$locale = LANGUAGES[$lang]['locale'];
$language = $lang;
$dir = LANGUAGES[$lang]['dir'];
setcookie('language', $lang, ['expires' => 0, 'path' => '/', 'domain' => '', 'secure' => ($_SERVER['HTTPS'] ?? '' === 'on'), 'httponly' => true, 'samesite' => 'Strict']);
break;
}
}
}
putenv('LC_ALL='.$locale);
setlocale(LC_ALL, $locale);
bindtextdomain('mail-hosting', __DIR__.'/locale');
bind_textdomain_codeset('mail-hosting', 'UTF-8');
textdomain('mail-hosting');
require_once( 'vendor/autoload.php' ); require_once( 'vendor/autoload.php' );
@ -26,7 +84,7 @@ function get_db_instance(): PDO
$db = new PDO( 'mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => PERSISTENT ] ); $db = new PDO( 'mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => PERSISTENT ] );
} catch ( PDOException ) { } catch ( PDOException ) {
http_response_code( 500 ); http_response_code( 500 );
die( 'No Connection to MySQL database!' ); die( _('No Connection to MySQL database!') );
} }
return $db; return $db;
} }
@ -75,7 +133,7 @@ function send_captcha(): void
$time = time(); $time = time();
$stmt = $db->prepare( 'INSERT INTO captcha (id, time, code) VALUES (?, ?, ?);' ); $stmt = $db->prepare( 'INSERT INTO captcha (id, time, code) VALUES (?, ?, ?);' );
$stmt->execute( [ $randid, $time, $code ] ); $stmt->execute( [ $randid, $time, $code ] );
echo '<div class="row"><div class="col"><td>Copy:<br>'; echo '<div class="row"><div class="col"><td>'._('Copy:').'<br>';
if ( CAPTCHA_DIFFICULTY === 1 ) { if ( CAPTCHA_DIFFICULTY === 1 ) {
$im = imagecreatetruecolor( 55, 24 ); $im = imagecreatetruecolor( 55, 24 );
$bg = imagecolorallocate( $im, 0, 0, 0 ); $bg = imagecolorallocate( $im, 0, 0, 0 );
@ -194,7 +252,7 @@ function validate_email_list( array $targets, string &$msg = '' ): string
if ( $validator->isValid( $email, new NoRFCWarningsValidation() ) ) { if ( $validator->isValid( $email, new NoRFCWarningsValidation() ) ) {
$alias_goto .= ",$email"; $alias_goto .= ",$email";
} else { } else {
$msg .= '<div class="red" role="alert">Oops, the email "' . htmlspecialchars( $email ) . '" doesn\' look like a valid email address and thus wasn\'t added to the forwarding list.</div>'; $msg .= '<div class="red" role="alert">'.sprintf(_('Oops, the email "%s" doesn\' look like a valid email address and thus wasn\'t added to the forwarding list.'), htmlspecialchars( $email ) ) . '</div>';
} }
} }
return ltrim( $alias_goto, ',' ); return ltrim( $alias_goto, ',' );
@ -220,7 +278,7 @@ function check_domain_access( string &$email, string &$msg = '' ): bool
$managed_domains [] = $tmp[ 'domain' ]; $managed_domains [] = $tmp[ 'domain' ];
} }
if ( ! in_array( $domain, $managed_domains, true ) ) { if ( ! in_array( $domain, $managed_domains, true ) ) {
$msg .= '<div class="red" role="alert">You are not allowed to manage this domain.</div>'; $msg .= '<div class="red" role="alert">'._('You are not allowed to manage this domain.').'</div>';
return false; return false;
} }
} }
@ -231,8 +289,20 @@ function check_email_valid( string $email, string &$msg = '' ): bool
{ {
$validator = new EmailValidator(); $validator = new EmailValidator();
if ( ! $validator->isValid( $email, new NoRFCWarningsValidation() ) ) { if ( ! $validator->isValid( $email, new NoRFCWarningsValidation() ) ) {
$msg .= '<div class="red" role="alert">Invalid email address.</div>'; $msg .= '<div class="red" role="alert">'._('Invalid email address.').'</div>';
return false; return false;
} }
return true; return true;
} }
function alt_links(): void
{
global $language;
foreach(LANGUAGES as $lang => $data) {
if($lang === $language){
continue;
}
echo '<link rel="alternate" href="?lang='.$lang.'" hreflang="'.$lang.'" />';
echo '<meta property="og:locale:alternate" content="'.$data['locale'].'">';
}
}

View file

@ -1,8 +1,10 @@
{ {
"require": { "require": {
"egulias/email-validator": "^3.1", "egulias/email-validator": "^3.2",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-pdo": "*", "ext-pdo": "*",
"ext-gnupg": "*" "ext-gnupg": "*",
} "ext-gettext": "*",
"ext-intl": "*"
}
} }

View file

@ -2,17 +2,13 @@
if ( php_sapi_name() !== 'cli' ) { if ( php_sapi_name() !== 'cli' ) {
exit; exit;
} }
const DBHOST_PROSODY = 'localhost'; // Database host
const DBUSER_PROSODY = 'prosody'; // Database user
const DBPASS_PROSODY = 'YOUR_PASSWORD'; // Database password
const DBNAME_PROSODY = 'prosody'; // Database
require_once 'common_config.php'; require_once 'common_config.php';
$db = get_db_instance(); $db = get_db_instance();
try { try {
$db_prosody = new PDO( 'mysql:host=' . DBHOST_PROSODY . ';dbname=' . DBNAME_PROSODY, DBUSER_PROSODY, DBPASS_PROSODY, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] ); $db_prosody = new PDO( 'mysql:host=' . DBHOST_PROSODY . ';dbname=' . DBNAME_PROSODY, DBUSER_PROSODY, DBPASS_PROSODY, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] );
} catch ( PDOException $e ) { } catch ( PDOException $e ) {
die( 'No Connection to MySQL database!' ); die( _('No Connection to MySQL database!') . PHP_EOL);
} }
setlocale( LC_CTYPE, 'C.UTF-8' ); // make sure to use UTF-8 locale. Non UTF-8 locales can cause serious issues when handling UTF-8 file names setlocale( LC_CTYPE, 'C.UTF-8' ); // make sure to use UTF-8 locale. Non UTF-8 locales can cause serious issues when handling UTF-8 file names

Binary file not shown.

View file

@ -0,0 +1,990 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-31 21:17+0100\n"
"PO-Revision-Date: 2022-12-31 21:23+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1.1\n"
#: www/index.php:6 www/index.php:15
msgid "E-Mail and XMPP"
msgstr "E-Mail und XMPP"
#: www/index.php:10 www/index.php:16
msgid "Get a free and anonymous E-Mail address and an XMPP/Jabber account"
msgstr ""
"Bekomme eine kostenlose und anonyme E-Mail Adresse und ein XMPP/Jabber Konto"
#: www/index.php:21 www/manage_account.php:236 www/register.php:94
msgid "Info"
msgstr "Info"
#: www/index.php:21 www/manage_account.php:240 www/register.php:94
#: www/register.php:121
msgid "Register"
msgstr "Registrieren"
#: www/index.php:21 www/manage_account.php:241 www/register.php:94
msgid "Webmail-Login"
msgstr "Webmail-Anmeldung"
#: www/index.php:21 www/register.php:95
msgid "Manage account"
msgstr "Konto verwalten"
#: www/index.php:21 www/manage_account.php:247 www/register.php:95
msgid "Web-XMPP"
msgstr "Web-XMPP"
#: www/index.php:22
msgid "What you will get"
msgstr "Was du bekommst"
#: www/index.php:23
#, php-format
msgid ""
"You get a free anonymous E-Mail address and an XMPP/Jabber account using the "
"same details. Your Jabber ID is user@%1$s and can be connected to directly "
"from clearnet or via Tor hidden service (%2$s)."
msgstr ""
"Du bekommst eine kostenlose, anonymes E-Mail Adresse und ein XMPP/Jabber "
"Konto mit den gleichen Daten. Deine Jabber ID ist user@%1$s und kann direkt "
"über Clearnet zu verbunden werden, oder über den Tor hidden service (%2$s)."
#: www/index.php:24
#, php-format
msgid ""
"You will have 50MB of disk space available for your mails. If you need more "
"space, just <a href=\"%1$s\">contact me</a>. Your E-Mail address will be %2$s"
msgstr ""
"Du wirst 50MB Speicherplatz für deine E-Mails haben. Wenn du mehr Speicher "
"brauchst, <a href=\"%1$s\">schreib mir</a> einfach. Deine E-Mail Adresse "
"wird %2$s sein"
#: www/index.php:25
msgid ""
"For privacy, please use PGP mail encryption, if you can. This prevents "
"others from reading your mails (including me and/or LEA). GnuPGs official "
"home: <a href=\"https://gnupg.org\" target=\"_blank\" rel=\"noopener "
"noreferrer\">https://gnupg.org</a> Windows GUI: <a href=\"https://gpg4usb."
"org\" target=\"_blank\" rel=\"noopener noreferrer\">https://gpg4usb.org</a>"
msgstr ""
"Für Privatsphäre, nutze bitte PGP Mail Verschlüsselung, wenn du kannst. Dies "
"hindert andere am Lesen deiner E-Mails (inklusive mir und/oder "
"Strafverfolgungsbehörden). Die offizielle GnuPG Seite: <a href=\"https://"
"gnupg.org\" target=\"_blank\" rel=\"noopener noreferrer\">https://gnupg.org</"
"a> Windows GUI: <a href=\"https://gpg4usb.org\" target=\"_blank\" "
"rel=\"noopener noreferrer\">https://gpg4usb.org</a>"
#: www/index.php:26
msgid "E-Mail Setup"
msgstr "E-Mail Einrichtung"
#: www/index.php:28
#, php-format
msgid "SMTP: %s Port 465 (SSL/TLS) or 587 (StartTLS)"
msgstr "SMTP: %s Port 465 (SSL/TLS) oder 587 (StartTLS)"
#: www/index.php:29
#, php-format
msgid "IMAP: %s Port 993 (SSL/TLS) or 143 (StartTLS)"
msgstr "IMAP: %s Port 993 (SSL/TLS) oder 143 (StartTLS)"
#: www/index.php:30
#, php-format
msgid "POP3: %s Port 995 (SSL/TLS) or 110 (StartTLS)"
msgstr "POP3: %s Port 995 (SSL/TLS) oder 110 (StartTLS)"
#: www/index.php:31
msgid "Authentication: PLAIN, LOGIN"
msgstr "Authentifizierung: PLAIN, LOGIN"
#: www/index.php:33
#, php-format
msgid ""
"You can also connect on the same ports via the Tor onion address %s, but you "
"will have to accept an SSL certificate only valid for the clearnet domain."
msgstr ""
"Du kannst dich auch mit den gleichen Ports über die Tor Onion-Adresse %s "
"verbinden, aber du wirst ein Zertifikat akzeptieren müssen, welches nur für "
"die Clearnet-Domain gültig ist."
#: www/index.php:34
msgid "XMPP setup"
msgstr "XMPP-Einrichtung"
#: www/index.php:35
#, php-format
msgid "Domain: %s"
msgstr "Domain: %s"
#: www/index.php:36
#, php-format
msgid "Connect server: %s (optional for torification)"
msgstr "Verbindungs-Server: %s (Optional für Torifzierung)"
#: www/index.php:37
#, php-format
msgid "File transfer proxy: %s"
msgstr "Datentransfer-Proxy: %s"
#: www/index.php:38
#, php-format
msgid ""
"BOSH URL: %s (only enable if you have to, as it is slower than directly "
"using xmpp)"
msgstr ""
"BOSH URL: %s (aktiviere diese nur, wenn du musst, da BOSH langsamer als "
"direktes Nutzen von XMPP ist)"
#: www/manage_account.php:17 www/admin.php:21
msgid "It looks like your user no longer exists!"
msgstr "Es sieht so aus, dass dein Nutzer nicht mehr existiert!"
#: www/manage_account.php:30
msgid "Wrong 2FA code"
msgstr "Falscher 2FA Code"
#: www/manage_account.php:38 www/admin.php:33
msgid "Successfully logged out"
msgstr "Erfolgreich abgemeldet"
#: www/manage_account.php:43 www/register.php:22
msgid "Invalid captcha"
msgstr "Ungültiges Captcha"
#: www/manage_account.php:47 www/admin.php:37
msgid "Invalid username"
msgstr "Ungültiger Nutzername"
#: www/manage_account.php:63 www/manage_account.php:81 www/admin.php:43
#: www/admin.php:55
msgid "Incorrect username or password"
msgstr "Ungültiger Nutzername oder Passwort"
#: www/manage_account.php:100 www/admin.php:175 www/admin.php:343
#: www/register.php:33
msgid "Passwords empty or don't match"
msgstr "Passwörter leer oder stimmen nicht überein"
#: www/manage_account.php:105 www/admin.php:348
msgid "Successfully updated password"
msgstr "Passwort erfolgreich aktualisiert"
#: www/manage_account.php:108
msgid ""
"Warning: This will permenently delete your account and all your data. Anyone "
"can immediately register with this user again. It cannot be reversed. Are "
"you absolutely sure?"
msgstr ""
"Warnung: Dies löscht dein Konto und alle deine Daten permanent. Jeder kann "
"direkt mit dem gleichen Nutzer erneut registrieren. Dies kann nicht "
"rückgängig gemacht werden. Bist du absolut sicher?"
#: www/manage_account.php:110
msgid "Yes, I want to permanently delete my account"
msgstr "Ja, ich will mein Konto permanent löschen"
#: www/manage_account.php:112
msgid ""
"Warning: This will disable your account for a year and delete all your data. "
"After a year it is available for registrations again. It cannot be reversed. "
"Are you absolutely sure?"
msgstr ""
"Warnung: Dies deaktiviert dein Konto für ein Jahr und alle deine Daten "
"werden gelöscht. Nach einem Jahr ist es für die Registrierung wieder "
"verfügbar. Dies kann nicht rückgängig gemacht werden. Bist du absolut sicher?"
#: www/manage_account.php:114
msgid "Yes, I want to disable my account"
msgstr "Ja, ich möchte mein Konto deaktivieren"
#: www/manage_account.php:123
msgid "Successfully deleted account"
msgstr "Konto erfolgreich gelöscht"
#: www/manage_account.php:132
msgid "Successfully disabled account"
msgstr "Konto erfolgreich deaktiviert"
#: www/manage_account.php:136
msgid "Successfully removed the key"
msgstr "Schlüssel erfolgreich entfernt"
#: www/manage_account.php:145
msgid "There was an error importing the key"
msgstr "Es gab einen Fehler beim Importieren des Schlüssels"
#: www/manage_account.php:158
msgid "Successfully imported the key"
msgstr "Schlüssel erfolgreich importiert"
#: www/manage_account.php:162
#, php-format
msgid ""
"Oops, looks like the key is missing this email address as user id. Please "
"add your address \"%s\" as user ID to your pgp key or create a new key pair."
msgstr ""
"Ups, sieht so aus, dass dem Schlüssel diese E-Mail Adresse als User-ID "
"fehlt. Bitte füge deine Adresse \"%s\" als User-ID zu deinem PGP-Schlüssel "
"hinzu oder erstelle ein neues Schlüsselpaar."
#: www/manage_account.php:168
msgid "Sorry, the code was incorrect"
msgstr "Leider wer der Code falsch"
#: www/manage_account.php:172
msgid "Successfully enabled 2FA"
msgstr "2FA erfolgreich aktiviert"
#: www/manage_account.php:181 www/manage_account.php:191
msgid "E-Mail and XMPP - Manage account"
msgstr "E-Mail und XMPP - Konto verwalten"
#: www/manage_account.php:186 www/manage_account.php:192
msgid ""
"Manage your free and anonymous E-Mail address and an XMPP/Jabber account. "
"Add forwarding addresses, change your password or disable/delete your "
"account."
msgstr ""
"Verwalte deine kostenlose und anonyme E-Mail Adresse und ein XMPP/Jabber "
"Konto. Füge eine Weiterleitungsadresse hinzu, ändere dein Passwort oder "
"deaktiviere/lösche dein Konto."
#: www/manage_account.php:213
msgid ""
"To login, please enter the following code to confirm ownership of your key:"
msgstr ""
"Um dich anzumelden, gib bitte folgenden Code zur Bestätigung ein, um den "
"Besitz deines Schlüssels zu bestätigen:"
#: www/manage_account.php:215
msgid ""
"To login, please decrypt the following PGP encrypted message and confirm the "
"code:"
msgstr ""
"Um dich anzumelden, entschlüssel bitte die folgende PGP-verschlüsselte "
"Nachricht und bestätige den Code:"
#: www/manage_account.php:221 www/manage_account.php:370
msgid "2FA code"
msgstr "2FA Code"
#: www/manage_account.php:223 www/manage_account.php:372
msgid "Confirm"
msgstr "Bestätigen"
#: www/manage_account.php:238 www/admin.php:388
#, php-format
msgid "Logged in as %s"
msgstr "Angemeldet als %s"
#: www/manage_account.php:244 www/admin.php:389
msgid "Logout"
msgstr "Abmelden"
#: www/manage_account.php:254 www/admin.php:406 www/admin.php:582
#: www/admin.php:912 www/admin.php:941 www/register.php:101
msgid "Username"
msgstr "Nutzername"
#: www/manage_account.php:259 www/manage_account.php:322 www/admin.php:410
#: www/admin.php:503 www/admin.php:586 www/admin.php:945 www/admin.php:1030
#: www/register.php:106
msgid "Password"
msgstr "Passwort"
#: www/manage_account.php:265 www/admin.php:415
msgid "Login"
msgstr "Anmelden"
#: www/manage_account.php:282
msgid "Settings"
msgstr "Einstellungen"
#: www/manage_account.php:283
msgid "Delivery"
msgstr "Zustellung"
#: www/manage_account.php:284
msgid ""
"Change how your mail is delivered. You can add forwarding addresses one per "
"line, or comma seperated. When you disable the \"keep a local copy\" "
"checkbox, your mail will only be sent to your forwarding addresses."
msgstr ""
"Ändere wie deine E-Mail zugestellt wird. Du kannst eine "
"Weiterleitungsadresse pro Zeile, oder Komma-separiert, einfügen. Wenn du "
"\"Lokale Kopie behalten\" deaktivierst, wird deine E-Mail nur an die "
"Weiterleitungsadressen gesendet."
#: www/manage_account.php:287 www/admin.php:953 www/admin.php:994
msgid "Forward to"
msgstr "Weiterleiten an"
#: www/manage_account.php:292 www/admin.php:957 www/admin.php:999
msgid "Keep a local copy"
msgstr "Lokale Kopie behalten"
#: www/manage_account.php:297
msgid "Encryption"
msgstr "Verschlüsselung"
#: www/manage_account.php:298
msgid ""
"If you are having issues sending or receiving mails with some other "
"provider, you can try disabling forced encryption here. But be aware, that "
"this makes it possible for 3rd parties on the network to read your emails. "
"Make sure to ask your correspondent to demand encryption support from their "
"provider for a safer internet."
msgstr ""
"Wenn du Probleme mit dem E-Mail Versand oder Empfang mit einigen anderen "
"Providern hast, kannst du hier die erzwungene Verschlüsselung deaktivieren. "
"Aber sei dir dabei im klaren, dass es damit für Drittparteien im Netzwerk "
"möglich wird E-Mails mitzulesen. Frage deine Kommunikationspartner in dem "
"Falle, dass sie von ihrem E-Mail Provider Unterstützung für Verschlüsselung, "
"für ein sichereres Internet, einfordern sollen."
#: www/manage_account.php:300 www/admin.php:964 www/admin.php:1011
msgid "Enforce encryption for incoming mail"
msgstr "Verschlüsselung für eingehende E-Mails erzwingen"
#: www/manage_account.php:306 www/admin.php:968 www/admin.php:1016
msgid "Enforce encryption for outgoing mail"
msgstr "Verschlüsselung für ausgehende E-Mails erzwingen"
#: www/manage_account.php:313
msgid "Update settings"
msgstr "Einstellungen aktualisieren"
#: www/manage_account.php:318 www/manage_account.php:333 www/admin.php:1025
#: www/admin.php:1041
msgid "Change password"
msgstr "Passwort ändern"
#: www/manage_account.php:327 www/admin.php:508 www/admin.php:591
#: www/admin.php:949 www/admin.php:1035 www/register.php:110
msgid "Password again"
msgstr "Passwort erneut"
#: www/manage_account.php:344
msgid "Yay, PGP based 2FA is enabled!"
msgstr "Yay, PGP basierende 2FA ist aktiviert!"
#: www/manage_account.php:354
msgid ""
"Sorry, this key can't be used to encrypt a message to you. Your key may have "
"expired or has been revoked."
msgstr ""
"Tut uns leid, dieser Schlüssel kann nicht verwendet um eine Nachricht an "
"dich zu verschlüsseln. Dein Schlüssel ist vielleicht abgelaufen oder wurde "
"widerrufen."
#: www/manage_account.php:362
msgid ""
"To enable 2FA, please enter the following code to confirm ownership of your "
"key:"
msgstr ""
"Um 2FA zu aktivieren, gib bitte folgenden Code ein, um zu bestätigen, dass "
"der Schlüssel dir gehört:"
#: www/manage_account.php:363
msgid "Enable 2FA"
msgstr "2FA aktivieren"
#: www/manage_account.php:364
msgid ""
"To enable 2FA using your PGP key, please decrypt the following PGP encrypted "
"message and confirm the code:"
msgstr ""
"Um 2FA mit deinem PGP-Schlüssel zu aktivieren, entschlüssle bitte folgende "
"PGP-verschlüsselte Nachricht und bestätige den Code:"
#: www/manage_account.php:383
msgid "Add PGP key for 2FA and end-to-end encryption"
msgstr "Füge einen PGP-Schlüssel für 2FA und End-to-End Verschlüsselung hinzu"
#: www/manage_account.php:388
msgid "PGP key"
msgstr "PGP-Schlüssel"
#: www/manage_account.php:393
msgid "Update PGP key"
msgstr "PGP-Schlüssel aktualisieren"
#: www/manage_account.php:399
msgid "Disable/Delete account"
msgstr "Konto deaktivieren/löschen"
#: www/manage_account.php:400
msgid ""
"Warning, this is permanent and cannot be undone. Disabling an account will "
"delete your email data from the server, but leave the account blocked in the "
"database for a year, so no one else can use it. Deleting your account will "
"completely wipe all records of it and it will be available for new "
"registrations again."
msgstr ""
"Warnung, dies ist permanent und kann nicht rückgängig gemacht werden. Das "
"Deaktivieren eines Kontos löscht deine Daten vom Server, aber behält das "
"Konto für ein Jahr in der Datenbank blockiert, damit niemand anderes es "
"nutzen kann. Löschen entfernt dein Konto komplett und es ist wieder "
"verfügbar zur Registrierung."
#: www/manage_account.php:404
msgid "Disable account"
msgstr "Konto deaktivieren"
#: www/manage_account.php:409
msgid "Delete account"
msgstr "Konto löschen"
#: www/admin.php:72
#, php-format
msgid ""
"Warning: This will permanently delete the admin account \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
"Warnung: Dies löscht das Admin-Konto \"%s\" permanent. Dies kann nicht "
"rückgängig gemacht werden. Bist du absolut sicher?"
#: www/admin.php:75
msgid "Yes, I want to permanently delete this admin account"
msgstr "Ja, ich will dieses Admin-Konto permanent löschen"
#: www/admin.php:77
#, php-format
msgid ""
"Warning: This will permanently delete the domain \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
"Warnung: Dies löscht die Domain \"%s\" permanent. Dies kann nicht rückgängig "
"gemacht werden. Bist du absolut sicher?"
#: www/admin.php:80
msgid "Yes, I want to permanently delete this domain"
msgstr "Ja, ich will diesee Domain permanent löschen"
#: www/admin.php:82
#, php-format
msgid ""
"Warning: This will permanently delete the alias domain \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
"Warnung: Dies löscht das Domain-Alias \"%s\" permanent. Dies kann nicht "
"rückgängig gemacht werden. Bist du absolut sicher?"
#: www/admin.php:85
msgid "Yes, I want to permanently delete this alias domain"
msgstr "Ja, ich will dieses Domain-Alias permanent löschen"
#: www/admin.php:87
#, php-format
msgid ""
"Warning: This will permanently delete the alias \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
"Warnung: Dies löscht das Alias \"%s\" permanent. Dies kann nicht rückgängig "
"gemacht werden. Bist du absolut sicher?"
#: www/admin.php:90
msgid "Yes, I want to permanently delete this alias"
msgstr "Ja, ich will dieses Alias permanent löschen"
#: www/admin.php:92
#, php-format
msgid ""
"Warning: This will permanently delete the mailbox \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
"Warnung: Dies löscht die Mailbox \"%s\" permanent. Dies kann nicht "
"rückgängig gemacht werden. Bist du absolut sicher?"
#: www/admin.php:95
msgid "Yes, I want to permanently delete this mailbox"
msgstr "Ja, ich will diese Mailbox permanent löschen"
#: www/admin.php:98
msgid "You can't delete your own admin account!"
msgstr "Du kannst dein eigenes Admin-Konto nicht löschen!"
#: www/admin.php:102
msgid "Successfully deleted admin account."
msgstr "Admin-Konto erfolgreich gelöscht."
#: www/admin.php:107
msgid "Successfully deleted domain."
msgstr "Domain erfolgreich gelöscht."
#: www/admin.php:111
msgid "Successfully deleted alias domain."
msgstr "Alias-Domain erfolgreich gelöscht."
#: www/admin.php:116
msgid "Successfully deleted alias."
msgstr "Alias erfolgreich gelöscht."
#: www/admin.php:122
msgid "Successfully deleted mailbox."
msgstr "Mailbox erfolgreich gelöscht."
#: www/admin.php:128
#, php-format
msgid "Oops, it looks like the admin account \"%s\" doesn't exist."
msgstr "Ups, das Admin-Konto \"%s\" schient nicht zu existieren."
#: www/admin.php:132
msgid "Passwords don't match!"
msgstr "Passwörter stimmen nicht überein!"
#: www/admin.php:137
msgid "Successfully updated password."
msgstr "Passwort erfolgreich aktualisiert."
#: www/admin.php:166
msgid "Successfully edited admin account."
msgstr "Admin-Konto erfolgreich bearbeitet."
#: www/admin.php:172
#, php-format
msgid "Oops, it looks like the admin account \"%s\" already exists."
msgstr "Ups, das Admin-Konto \"%s\" schient bereits zu existieren."
#: www/admin.php:182
msgid "Successfully created admin account."
msgstr "Admin-Konto erfolgreich erstellt."
#: www/admin.php:189
#, php-format
msgid "Oops, it looks like the domain \"%s\" doesn't exists."
msgstr "Ups, die Domain \"%s\" schient nicht zu existieren."
#: www/admin.php:194
msgid "Successfully updated domain."
msgstr "Domain erfolgreich aktualisiert."
#: www/admin.php:200
#, php-format
msgid "Oops, it looks like the alias domain \"%s\" doesn't exists."
msgstr "Ups, die Alias-Domain \"%s\" schient nicht zu existieren."
#: www/admin.php:205
msgid "Successfully updated alias domain."
msgstr "Alias-Domain erfolgreich aktualisiert."
#: www/admin.php:211
#, php-format
msgid "Oops, it looks like the domain \"%s\" already exists."
msgstr "Ups, die Domain \"%s\" schient bereits zu existieren."
#: www/admin.php:222
msgid "Successfully created domain."
msgstr "Domain erfolgreich erstellt."
#: www/admin.php:228
#, php-format
msgid "Oops, it looks like the alias domain \"%s\" already exists."
msgstr "Ups, die Alias-Domain \"%s\" schient bereits zu existieren."
#: www/admin.php:239
msgid "Successfully created alias domain."
msgstr "Alias-Domain erfolgreich erstellt."
#: www/admin.php:252
#, php-format
msgid "Oops, it looks like the alias \"%s\" already exists."
msgstr "Ups, das Alias \"%s\" schient bereits zu existieren."
#: www/admin.php:261
msgid "Successfully added alias."
msgstr "Alias erfolgreich hinzugefügt."
#: www/admin.php:276
msgid "Successfully updated alias."
msgstr "Alias erfolgreich aktualisiert."
#: www/admin.php:298
msgid "Successfully updated mailbox."
msgstr "Mailbox erfolgreich aktualisiert."
#: www/admin.php:311 www/register.php:62
msgid "Sorry, this user already exists"
msgstr "Sorry, dieser Nutzer existiert bereits"
#: www/admin.php:333 www/register.php:70
msgid "Successfully created new mailbox!"
msgstr "Neue Mailbox erfolgreich erstellt!"
#: www/admin.php:359
msgid "Successfully disabled two-factor authentication"
msgstr "Zwei-Faktor Authentifizierung erfolgreich deaktiviert"
#: www/admin.php:369 www/admin.php:378 www/admin.php:384
msgid "E-Mail and XMPP - Admin management"
msgstr "E-Mail und XMPP - Admin Verwaltung"
#: www/admin.php:373 www/admin.php:379
msgid "Lets domain owners manage their email domain and user accounts."
msgstr "Lässt Domain-Inhaber ihre E-Mail Domain und Nutzer-Konten verwalten."
#: www/admin.php:391
msgid "Manage admins"
msgstr "Admins verwalten"
#: www/admin.php:392
msgid "Manage alias domains"
msgstr "Alias-Domains verwalten"
#: www/admin.php:394
msgid "Manage your admin account"
msgstr "Verwalte dein Konto"
#: www/admin.php:396
msgid "Manage domains"
msgstr "Domains verwalten"
#: www/admin.php:397
msgid "Manage aliases"
msgstr "Aliase verwalten"
#: www/admin.php:398
msgid "Manage mailboxes"
msgstr "Mailboxen verwalten"
#: www/admin.php:421
msgid ""
"Welcome to the admin management interface. You can configure your domain(s) "
"and accounts here. Please select an option from the menu."
msgstr ""
"Wilkommen in der Admin-Verwaltungsoberfläche. Hier kannst du deine Domain(s) "
"und Konten konfigurieren. Bitte wähle eine Option vom Menü."
#: www/admin.php:453
msgid ""
"Oops, it looks like the page you tried to access does not exist or you do "
"not have permission to access it."
msgstr ""
"Ups, es scheint dass die Seite, auf die du versucht hast zuzugreifen "
"entweder nicht existiert, oder du keine Berechtigung hast darauf zuzugreifen."
#: www/admin.php:466 www/admin.php:485
msgid "Create new admin"
msgstr "Neuen Admin erstellen"
#: www/admin.php:471
msgid "Admin"
msgstr "Admin"
#: www/admin.php:472 www/admin.php:521 www/admin.php:534 www/admin.php:600
#: www/admin.php:624 www/admin.php:656 www/admin.php:680 www/admin.php:714
#: www/admin.php:748 www/admin.php:778 www/admin.php:811 www/admin.php:843
#: www/admin.php:877 www/admin.php:913 www/admin.php:961 www/admin.php:1006
msgid "Active"
msgstr "Aktiv"
#: www/admin.php:473 www/admin.php:625 www/admin.php:715 www/admin.php:812
#: www/admin.php:914
msgid "Last modified"
msgstr "Zuletzt geändert"
#: www/admin.php:474
msgid "Edit account"
msgstr "Konto bearbeiten"
#: www/admin.php:482 www/admin.php:636 www/admin.php:724 www/admin.php:821
#: www/admin.php:927
msgid "Edit"
msgstr "Bearbeiten"
#: www/admin.php:497
#, php-format
msgid "Edit admin account %s"
msgstr "Adminkonto %s bearbeiten"
#: www/admin.php:515 www/admin.php:528 www/admin.php:596
msgid "Superadmin"
msgstr "Superadmin"
#: www/admin.php:517 www/admin.php:529 www/admin.php:597
msgid "Superadmins can manage other admins"
msgstr "Superadmins können andere Admins verwalten"
#: www/admin.php:538
msgid "Managed domains"
msgstr "Domains verwalten"
#: www/admin.php:558 www/admin.php:685 www/admin.php:783 www/admin.php:886
msgid "Save changes"
msgstr "Änderungen speichern"
#: www/admin.php:564
msgid "Delete admin"
msgstr "Admin löschen"
#: www/admin.php:571 www/admin.php:696
msgid "Oops, this admin doesn't seem to exist."
msgstr "Ups, dieser Admin scheint nicht zu existieren."
#: www/admin.php:578
msgid "Create new admin account"
msgstr "Neues Admin-Konto erstellen"
#: www/admin.php:604
msgid "Add admin"
msgstr "Admin hinzufügen"
#: www/admin.php:617 www/admin.php:640 www/admin.php:648
msgid "Create new domain"
msgstr "Neue Domain erstellen"
#: www/admin.php:623 www/admin.php:652
msgid "Domain"
msgstr "Domain"
#: www/admin.php:626
msgid "Edit domain"
msgstr "Domain bearbeiten"
#: www/admin.php:660
msgid "Add domain"
msgstr "Domain hinzufügen"
#: www/admin.php:674
#, php-format
msgid "Edit domain %s"
msgstr "Domain %s bearbeiten"
#: www/admin.php:690
msgid "Delete domain"
msgstr "Domain löschen"
#: www/admin.php:706 www/admin.php:728 www/admin.php:736
msgid "Create new alias domain"
msgstr "Neue Alias-Domain erstellen"
#: www/admin.php:712 www/admin.php:740
msgid "Alias Domain"
msgstr "Alias-Domain"
#: www/admin.php:713 www/admin.php:744 www/admin.php:772
msgid "Target Domain"
msgstr "Ziel-Domain"
#: www/admin.php:716
msgid "Edit alias domain"
msgstr "Alias-Domain bearbeiten"
#: www/admin.php:752
msgid "Add alias domain"
msgstr "Alias-Domain hinzufügen"
#: www/admin.php:766
#, php-format
msgid "Edit alias domain %s"
msgstr "Alias-Domain %s bearbeiten"
#: www/admin.php:788
msgid "Delete alias domain"
msgstr "Alias-Domain löschen"
#: www/admin.php:794
msgid "Oops, this alias domain doesn't seem to exist."
msgstr "Ups, diese Alias-Domain schient nicht zu existieren."
#: www/admin.php:804 www/admin.php:824 www/admin.php:831
msgid "Create new alias"
msgstr "Neuen Alias erstellen"
#: www/admin.php:809 www/admin.php:835
msgid "Alias"
msgstr "Alias"
#: www/admin.php:810 www/admin.php:839 www/admin.php:870
msgid "Target"
msgstr "Ziel"
#: www/admin.php:813
msgid "Edit alias"
msgstr "Alias bearbeiten"
#: www/admin.php:846 www/admin.php:882
msgid "Enforce encryption"
msgstr "Verschlüsselung erzwingen"
#: www/admin.php:851
msgid "Add alias"
msgstr "Alias hinzufügen"
#: www/admin.php:865
#, php-format
msgid "Edit alias %s"
msgstr "Alias %s bearbeiten"
#: www/admin.php:891
msgid "Delete alias"
msgstr "Alias löschen"
#: www/admin.php:897
msgid "Oops, this alias doesn't seem to exist."
msgstr "Ups, dieses Alias schient nicht zu existieren."
#: www/admin.php:907 www/admin.php:930 www/admin.php:937
msgid "Create new mailbox"
msgstr "Neue Mailbox erstellen"
#: www/admin.php:915
msgid "Edit mailbox"
msgstr "Mailbox bearbeiten"
#: www/admin.php:973
msgid "Add mailbox"
msgstr "Mailbox hinzufügen"
#: www/admin.php:989
#, php-format
msgid "Edit mailbox %s"
msgstr "Mailbox %s bearbeiten"
#: www/admin.php:1021
msgid "Save mailbox"
msgstr "Mailbox speichern"
#: www/admin.php:1045
msgid "Delete mailbox / Disable two-factor authentication"
msgstr "Mailbox löschen / Zwei-Faktor Autorisierung deaktivieren"
#: www/admin.php:1051
msgid "Disable two-factor authentication"
msgstr "Zwei-Faktor Autorisierung deaktivieren"
#: www/admin.php:1056
msgid "Delete mailbox"
msgstr "Mailbox löschen"
#: www/admin.php:1062
msgid "Oops, this mailbox doesn't seem to exist."
msgstr "Ups, diese Mailbox schient nicht zu existieren."
#: www/register.php:18
msgid "Invalid CSRF token"
msgstr "Ungültiger CSRF Token"
#: www/register.php:27
msgid "Invalid username. It may not contain a +, ', \" or /."
msgstr "Ungültiger Nutzername. Dieser darf keine +, ', \" oder / enthalten."
#: www/register.php:44
msgid "The domain you specified is not allowed"
msgstr "Die angegebene Domain ist nicht erlaubt"
#: www/register.php:49
msgid "The email address you specified is not valid"
msgstr "Deine angegebene E-Mail Adresse ist nicht gültig"
#: www/register.php:52
msgid "The username you specified is reserved"
msgstr "Dein eingegebener Nutzername ist reserviert"
#: www/register.php:78 www/register.php:87
msgid "E-Mail and XMPP - Register"
msgstr "E-Mail und XMPP - Registreiren"
#: www/register.php:82 www/register.php:88
msgid ""
"Register for a free and anonymous E-Mail address and an XMPP/Jabber account"
msgstr ""
"Registriere dich für eine kostenloses und anonyme E-Mail Adresse und ein "
"XMPP/Jabber Konto"
#: www/register.php:114
#, php-format
msgid ""
"I have read and agreed to the <a href=\"%s\" target=\"_blank\">Privacy "
"Policy</a>"
msgstr ""
"Ich habe die <a href=\"%s\" target=\"_blank\">Datenschutzerklärung</a> "
"gelesen und akzeptiere diese"
#: cron.php:11 common_config.php:87 setup.php:20 setup.php:23
msgid "No Connection to MySQL database!"
msgstr "Keine Verbindung zur MySQL Datenbank!"
#: tools/delete_leftover_files.php:14
#, php-format
msgid ""
"%s does not seem to have any accounts, but has a directory. Consider "
"deleting it."
msgstr ""
"%s scheint keine Konten zu haben, aber ein Verzeichnis. Denk darüber nach es "
"zu löschen."
#: tools/delete_leftover_files.php:20
#, php-format
msgid "Deleted: %s"
msgstr "Gelöscht: %s"
#: tools/delete_leftover_files.php:22
#, php-format
msgid "File found in mail directory location: \"%s\". Consider deleting it."
msgstr ""
"Datei im Mailverzeichnis \"%s\" gefunden. Denke darüber nach diese zu "
"löschen."
#: common_config.php:136
msgid "Copy:"
msgstr "Kopieren:"
#: common_config.php:255
#, php-format
msgid ""
"Oops, the email \"%s\" doesn' look like a valid email address and thus "
"wasn't added to the forwarding list."
msgstr ""
"Ups, die E-Mail \"%s\" sieht nicht nach einer gültigen E-Mail Adresse aus "
"und wurde deshalb nicht zur Weiterleitungsliste hinzugefügt."
#: common_config.php:281
msgid "You are not allowed to manage this domain."
msgstr "Du darfst diese Domain nicht verwalten."
#: common_config.php:292
msgid "Invalid email address."
msgstr "Ungültige E-Mail Adresse."
#: setup.php:8
#, php-format
msgid "The %s extension of PHP is required. Please install it first."
msgstr "Die %s PHP-Erweiterung wird benötigt. Bitte installiere diese zuerst."
#: setup.php:35
msgid "Database has successfully been updated."
msgstr "Datenbank wurde erfolgreich aktualisiert."
#: setup.php:37
msgid "Database is already up-to-date."
msgstr "Datenbank ist bereits aktuell."
#: setup.php:40
msgid "Error updating database:"
msgstr "Fehler beim Aktualisieren der Datenbank:"
#: setup.php:57
msgid "Database has successfully been set up."
msgstr "Datenbank wurde erfolgreich erstellt."
#: setup.php:59
msgid "Error setting up database:"
msgstr "Fehler beim Erstellen der Datenbank:"
#~ msgid "Invalid username."
#~ msgstr "Ungültiger Nutzername"

906
locale/mail-hosting.pot Normal file
View file

@ -0,0 +1,906 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-31 21:17+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: www/index.php:6 www/index.php:15
msgid "E-Mail and XMPP"
msgstr ""
#: www/index.php:10 www/index.php:16
msgid "Get a free and anonymous E-Mail address and an XMPP/Jabber account"
msgstr ""
#: www/index.php:21 www/manage_account.php:236 www/register.php:94
msgid "Info"
msgstr ""
#: www/index.php:21 www/manage_account.php:240 www/register.php:94
#: www/register.php:121
msgid "Register"
msgstr ""
#: www/index.php:21 www/manage_account.php:241 www/register.php:94
msgid "Webmail-Login"
msgstr ""
#: www/index.php:21 www/register.php:95
msgid "Manage account"
msgstr ""
#: www/index.php:21 www/manage_account.php:247 www/register.php:95
msgid "Web-XMPP"
msgstr ""
#: www/index.php:22
msgid "What you will get"
msgstr ""
#: www/index.php:23
#, php-format
msgid ""
"You get a free anonymous E-Mail address and an XMPP/Jabber account using the "
"same details. Your Jabber ID is user@%1$s and can be connected to directly "
"from clearnet or via Tor hidden service (%2$s)."
msgstr ""
#: www/index.php:24
#, php-format
msgid ""
"You will have 50MB of disk space available for your mails. If you need more "
"space, just <a href=\"%1$s\">contact me</a>. Your E-Mail address will be %2$s"
msgstr ""
#: www/index.php:25
msgid ""
"For privacy, please use PGP mail encryption, if you can. This prevents "
"others from reading your mails (including me and/or LEA). GnuPGs official "
"home: <a href=\"https://gnupg.org\" target=\"_blank\" rel=\"noopener "
"noreferrer\">https://gnupg.org</a> Windows GUI: <a href=\"https://gpg4usb."
"org\" target=\"_blank\" rel=\"noopener noreferrer\">https://gpg4usb.org</a>"
msgstr ""
#: www/index.php:26
msgid "E-Mail Setup"
msgstr ""
#: www/index.php:28
#, php-format
msgid "SMTP: %s Port 465 (SSL/TLS) or 587 (StartTLS)"
msgstr ""
#: www/index.php:29
#, php-format
msgid "IMAP: %s Port 993 (SSL/TLS) or 143 (StartTLS)"
msgstr ""
#: www/index.php:30
#, php-format
msgid "POP3: %s Port 995 (SSL/TLS) or 110 (StartTLS)"
msgstr ""
#: www/index.php:31
msgid "Authentication: PLAIN, LOGIN"
msgstr ""
#: www/index.php:33
#, php-format
msgid ""
"You can also connect on the same ports via the Tor onion address %s, but you "
"will have to accept an SSL certificate only valid for the clearnet domain."
msgstr ""
#: www/index.php:34
msgid "XMPP setup"
msgstr ""
#: www/index.php:35
#, php-format
msgid "Domain: %s"
msgstr ""
#: www/index.php:36
#, php-format
msgid "Connect server: %s (optional for torification)"
msgstr ""
#: www/index.php:37
#, php-format
msgid "File transfer proxy: %s"
msgstr ""
#: www/index.php:38
#, php-format
msgid ""
"BOSH URL: %s (only enable if you have to, as it is slower than directly "
"using xmpp)"
msgstr ""
#: www/manage_account.php:17 www/admin.php:21
msgid "It looks like your user no longer exists!"
msgstr ""
#: www/manage_account.php:30
msgid "Wrong 2FA code"
msgstr ""
#: www/manage_account.php:38 www/admin.php:33
msgid "Successfully logged out"
msgstr ""
#: www/manage_account.php:43 www/register.php:22
msgid "Invalid captcha"
msgstr ""
#: www/manage_account.php:47 www/admin.php:37
msgid "Invalid username"
msgstr ""
#: www/manage_account.php:63 www/manage_account.php:81 www/admin.php:43
#: www/admin.php:55
msgid "Incorrect username or password"
msgstr ""
#: www/manage_account.php:100 www/admin.php:175 www/admin.php:343
#: www/register.php:33
msgid "Passwords empty or don't match"
msgstr ""
#: www/manage_account.php:105 www/admin.php:348
msgid "Successfully updated password"
msgstr ""
#: www/manage_account.php:108
msgid ""
"Warning: This will permenently delete your account and all your data. Anyone "
"can immediately register with this user again. It cannot be reversed. Are "
"you absolutely sure?"
msgstr ""
#: www/manage_account.php:110
msgid "Yes, I want to permanently delete my account"
msgstr ""
#: www/manage_account.php:112
msgid ""
"Warning: This will disable your account for a year and delete all your data. "
"After a year it is available for registrations again. It cannot be reversed. "
"Are you absolutely sure?"
msgstr ""
#: www/manage_account.php:114
msgid "Yes, I want to disable my account"
msgstr ""
#: www/manage_account.php:123
msgid "Successfully deleted account"
msgstr ""
#: www/manage_account.php:132
msgid "Successfully disabled account"
msgstr ""
#: www/manage_account.php:136
msgid "Successfully removed the key"
msgstr ""
#: www/manage_account.php:145
msgid "There was an error importing the key"
msgstr ""
#: www/manage_account.php:158
msgid "Successfully imported the key"
msgstr ""
#: www/manage_account.php:162
#, php-format
msgid ""
"Oops, looks like the key is missing this email address as user id. Please "
"add your address \"%s\" as user ID to your pgp key or create a new key pair."
msgstr ""
#: www/manage_account.php:168
msgid "Sorry, the code was incorrect"
msgstr ""
#: www/manage_account.php:172
msgid "Successfully enabled 2FA"
msgstr ""
#: www/manage_account.php:181 www/manage_account.php:191
msgid "E-Mail and XMPP - Manage account"
msgstr ""
#: www/manage_account.php:186 www/manage_account.php:192
msgid ""
"Manage your free and anonymous E-Mail address and an XMPP/Jabber account. "
"Add forwarding addresses, change your password or disable/delete your "
"account."
msgstr ""
#: www/manage_account.php:213
msgid ""
"To login, please enter the following code to confirm ownership of your key:"
msgstr ""
#: www/manage_account.php:215
msgid ""
"To login, please decrypt the following PGP encrypted message and confirm the "
"code:"
msgstr ""
#: www/manage_account.php:221 www/manage_account.php:370
msgid "2FA code"
msgstr ""
#: www/manage_account.php:223 www/manage_account.php:372
msgid "Confirm"
msgstr ""
#: www/manage_account.php:238 www/admin.php:388
#, php-format
msgid "Logged in as %s"
msgstr ""
#: www/manage_account.php:244 www/admin.php:389
msgid "Logout"
msgstr ""
#: www/manage_account.php:254 www/admin.php:406 www/admin.php:582
#: www/admin.php:912 www/admin.php:941 www/register.php:101
msgid "Username"
msgstr ""
#: www/manage_account.php:259 www/manage_account.php:322 www/admin.php:410
#: www/admin.php:503 www/admin.php:586 www/admin.php:945 www/admin.php:1030
#: www/register.php:106
msgid "Password"
msgstr ""
#: www/manage_account.php:265 www/admin.php:415
msgid "Login"
msgstr ""
#: www/manage_account.php:282
msgid "Settings"
msgstr ""
#: www/manage_account.php:283
msgid "Delivery"
msgstr ""
#: www/manage_account.php:284
msgid ""
"Change how your mail is delivered. You can add forwarding addresses one per "
"line, or comma seperated. When you disable the \"keep a local copy\" "
"checkbox, your mail will only be sent to your forwarding addresses."
msgstr ""
#: www/manage_account.php:287 www/admin.php:953 www/admin.php:994
msgid "Forward to"
msgstr ""
#: www/manage_account.php:292 www/admin.php:957 www/admin.php:999
msgid "Keep a local copy"
msgstr ""
#: www/manage_account.php:297
msgid "Encryption"
msgstr ""
#: www/manage_account.php:298
msgid ""
"If you are having issues sending or receiving mails with some other "
"provider, you can try disabling forced encryption here. But be aware, that "
"this makes it possible for 3rd parties on the network to read your emails. "
"Make sure to ask your correspondent to demand encryption support from their "
"provider for a safer internet."
msgstr ""
#: www/manage_account.php:300 www/admin.php:964 www/admin.php:1011
msgid "Enforce encryption for incoming mail"
msgstr ""
#: www/manage_account.php:306 www/admin.php:968 www/admin.php:1016
msgid "Enforce encryption for outgoing mail"
msgstr ""
#: www/manage_account.php:313
msgid "Update settings"
msgstr ""
#: www/manage_account.php:318 www/manage_account.php:333 www/admin.php:1025
#: www/admin.php:1041
msgid "Change password"
msgstr ""
#: www/manage_account.php:327 www/admin.php:508 www/admin.php:591
#: www/admin.php:949 www/admin.php:1035 www/register.php:110
msgid "Password again"
msgstr ""
#: www/manage_account.php:344
msgid "Yay, PGP based 2FA is enabled!"
msgstr ""
#: www/manage_account.php:354
msgid ""
"Sorry, this key can't be used to encrypt a message to you. Your key may have "
"expired or has been revoked."
msgstr ""
#: www/manage_account.php:362
msgid ""
"To enable 2FA, please enter the following code to confirm ownership of your "
"key:"
msgstr ""
#: www/manage_account.php:363
msgid "Enable 2FA"
msgstr ""
#: www/manage_account.php:364
msgid ""
"To enable 2FA using your PGP key, please decrypt the following PGP encrypted "
"message and confirm the code:"
msgstr ""
#: www/manage_account.php:383
msgid "Add PGP key for 2FA and end-to-end encryption"
msgstr ""
#: www/manage_account.php:388
msgid "PGP key"
msgstr ""
#: www/manage_account.php:393
msgid "Update PGP key"
msgstr ""
#: www/manage_account.php:399
msgid "Disable/Delete account"
msgstr ""
#: www/manage_account.php:400
msgid ""
"Warning, this is permanent and cannot be undone. Disabling an account will "
"delete your email data from the server, but leave the account blocked in the "
"database for a year, so no one else can use it. Deleting your account will "
"completely wipe all records of it and it will be available for new "
"registrations again."
msgstr ""
#: www/manage_account.php:404
msgid "Disable account"
msgstr ""
#: www/manage_account.php:409
msgid "Delete account"
msgstr ""
#: www/admin.php:72
#, php-format
msgid ""
"Warning: This will permanently delete the admin account \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
#: www/admin.php:75
msgid "Yes, I want to permanently delete this admin account"
msgstr ""
#: www/admin.php:77
#, php-format
msgid ""
"Warning: This will permanently delete the domain \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
#: www/admin.php:80
msgid "Yes, I want to permanently delete this domain"
msgstr ""
#: www/admin.php:82
#, php-format
msgid ""
"Warning: This will permanently delete the alias domain \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
#: www/admin.php:85
msgid "Yes, I want to permanently delete this alias domain"
msgstr ""
#: www/admin.php:87
#, php-format
msgid ""
"Warning: This will permanently delete the alias \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
#: www/admin.php:90
msgid "Yes, I want to permanently delete this alias"
msgstr ""
#: www/admin.php:92
#, php-format
msgid ""
"Warning: This will permanently delete the mailbox \"%s\". It cannot be "
"reversed. Are you absolutely sure?"
msgstr ""
#: www/admin.php:95
msgid "Yes, I want to permanently delete this mailbox"
msgstr ""
#: www/admin.php:98
msgid "You can't delete your own admin account!"
msgstr ""
#: www/admin.php:102
msgid "Successfully deleted admin account."
msgstr ""
#: www/admin.php:107
msgid "Successfully deleted domain."
msgstr ""
#: www/admin.php:111
msgid "Successfully deleted alias domain."
msgstr ""
#: www/admin.php:116
msgid "Successfully deleted alias."
msgstr ""
#: www/admin.php:122
msgid "Successfully deleted mailbox."
msgstr ""
#: www/admin.php:128
#, php-format
msgid "Oops, it looks like the admin account \"%s\" doesn't exist."
msgstr ""
#: www/admin.php:132
msgid "Passwords don't match!"
msgstr ""
#: www/admin.php:137
msgid "Successfully updated password."
msgstr ""
#: www/admin.php:166
msgid "Successfully edited admin account."
msgstr ""
#: www/admin.php:172
#, php-format
msgid "Oops, it looks like the admin account \"%s\" already exists."
msgstr ""
#: www/admin.php:182
msgid "Successfully created admin account."
msgstr ""
#: www/admin.php:189
#, php-format
msgid "Oops, it looks like the domain \"%s\" doesn't exists."
msgstr ""
#: www/admin.php:194
msgid "Successfully updated domain."
msgstr ""
#: www/admin.php:200
#, php-format
msgid "Oops, it looks like the alias domain \"%s\" doesn't exists."
msgstr ""
#: www/admin.php:205
msgid "Successfully updated alias domain."
msgstr ""
#: www/admin.php:211
#, php-format
msgid "Oops, it looks like the domain \"%s\" already exists."
msgstr ""
#: www/admin.php:222
msgid "Successfully created domain."
msgstr ""
#: www/admin.php:228
#, php-format
msgid "Oops, it looks like the alias domain \"%s\" already exists."
msgstr ""
#: www/admin.php:239
msgid "Successfully created alias domain."
msgstr ""
#: www/admin.php:252
#, php-format
msgid "Oops, it looks like the alias \"%s\" already exists."
msgstr ""
#: www/admin.php:261
msgid "Successfully added alias."
msgstr ""
#: www/admin.php:276
msgid "Successfully updated alias."
msgstr ""
#: www/admin.php:298
msgid "Successfully updated mailbox."
msgstr ""
#: www/admin.php:311 www/register.php:62
msgid "Sorry, this user already exists"
msgstr ""
#: www/admin.php:333 www/register.php:70
msgid "Successfully created new mailbox!"
msgstr ""
#: www/admin.php:359
msgid "Successfully disabled two-factor authentication"
msgstr ""
#: www/admin.php:369 www/admin.php:378 www/admin.php:384
msgid "E-Mail and XMPP - Admin management"
msgstr ""
#: www/admin.php:373 www/admin.php:379
msgid "Lets domain owners manage their email domain and user accounts."
msgstr ""
#: www/admin.php:391
msgid "Manage admins"
msgstr ""
#: www/admin.php:392
msgid "Manage alias domains"
msgstr ""
#: www/admin.php:394
msgid "Manage your admin account"
msgstr ""
#: www/admin.php:396
msgid "Manage domains"
msgstr ""
#: www/admin.php:397
msgid "Manage aliases"
msgstr ""
#: www/admin.php:398
msgid "Manage mailboxes"
msgstr ""
#: www/admin.php:421
msgid ""
"Welcome to the admin management interface. You can configure your domain(s) "
"and accounts here. Please select an option from the menu."
msgstr ""
#: www/admin.php:453
msgid ""
"Oops, it looks like the page you tried to access does not exist or you do "
"not have permission to access it."
msgstr ""
#: www/admin.php:466 www/admin.php:485
msgid "Create new admin"
msgstr ""
#: www/admin.php:471
msgid "Admin"
msgstr ""
#: www/admin.php:472 www/admin.php:521 www/admin.php:534 www/admin.php:600
#: www/admin.php:624 www/admin.php:656 www/admin.php:680 www/admin.php:714
#: www/admin.php:748 www/admin.php:778 www/admin.php:811 www/admin.php:843
#: www/admin.php:877 www/admin.php:913 www/admin.php:961 www/admin.php:1006
msgid "Active"
msgstr ""
#: www/admin.php:473 www/admin.php:625 www/admin.php:715 www/admin.php:812
#: www/admin.php:914
msgid "Last modified"
msgstr ""
#: www/admin.php:474
msgid "Edit account"
msgstr ""
#: www/admin.php:482 www/admin.php:636 www/admin.php:724 www/admin.php:821
#: www/admin.php:927
msgid "Edit"
msgstr ""
#: www/admin.php:497
#, php-format
msgid "Edit admin account %s"
msgstr ""
#: www/admin.php:515 www/admin.php:528 www/admin.php:596
msgid "Superadmin"
msgstr ""
#: www/admin.php:517 www/admin.php:529 www/admin.php:597
msgid "Superadmins can manage other admins"
msgstr ""
#: www/admin.php:538
msgid "Managed domains"
msgstr ""
#: www/admin.php:558 www/admin.php:685 www/admin.php:783 www/admin.php:886
msgid "Save changes"
msgstr ""
#: www/admin.php:564
msgid "Delete admin"
msgstr ""
#: www/admin.php:571 www/admin.php:696
msgid "Oops, this admin doesn't seem to exist."
msgstr ""
#: www/admin.php:578
msgid "Create new admin account"
msgstr ""
#: www/admin.php:604
msgid "Add admin"
msgstr ""
#: www/admin.php:617 www/admin.php:640 www/admin.php:648
msgid "Create new domain"
msgstr ""
#: www/admin.php:623 www/admin.php:652
msgid "Domain"
msgstr ""
#: www/admin.php:626
msgid "Edit domain"
msgstr ""
#: www/admin.php:660
msgid "Add domain"
msgstr ""
#: www/admin.php:674
#, php-format
msgid "Edit domain %s"
msgstr ""
#: www/admin.php:690
msgid "Delete domain"
msgstr ""
#: www/admin.php:706 www/admin.php:728 www/admin.php:736
msgid "Create new alias domain"
msgstr ""
#: www/admin.php:712 www/admin.php:740
msgid "Alias Domain"
msgstr ""
#: www/admin.php:713 www/admin.php:744 www/admin.php:772
msgid "Target Domain"
msgstr ""
#: www/admin.php:716
msgid "Edit alias domain"
msgstr ""
#: www/admin.php:752
msgid "Add alias domain"
msgstr ""
#: www/admin.php:766
#, php-format
msgid "Edit alias domain %s"
msgstr ""
#: www/admin.php:788
msgid "Delete alias domain"
msgstr ""
#: www/admin.php:794
msgid "Oops, this alias domain doesn't seem to exist."
msgstr ""
#: www/admin.php:804 www/admin.php:824 www/admin.php:831
msgid "Create new alias"
msgstr ""
#: www/admin.php:809 www/admin.php:835
msgid "Alias"
msgstr ""
#: www/admin.php:810 www/admin.php:839 www/admin.php:870
msgid "Target"
msgstr ""
#: www/admin.php:813
msgid "Edit alias"
msgstr ""
#: www/admin.php:846 www/admin.php:882
msgid "Enforce encryption"
msgstr ""
#: www/admin.php:851
msgid "Add alias"
msgstr ""
#: www/admin.php:865
#, php-format
msgid "Edit alias %s"
msgstr ""
#: www/admin.php:891
msgid "Delete alias"
msgstr ""
#: www/admin.php:897
msgid "Oops, this alias doesn't seem to exist."
msgstr ""
#: www/admin.php:907 www/admin.php:930 www/admin.php:937
msgid "Create new mailbox"
msgstr ""
#: www/admin.php:915
msgid "Edit mailbox"
msgstr ""
#: www/admin.php:973
msgid "Add mailbox"
msgstr ""
#: www/admin.php:989
#, php-format
msgid "Edit mailbox %s"
msgstr ""
#: www/admin.php:1021
msgid "Save mailbox"
msgstr ""
#: www/admin.php:1045
msgid "Delete mailbox / Disable two-factor authentication"
msgstr ""
#: www/admin.php:1051
msgid "Disable two-factor authentication"
msgstr ""
#: www/admin.php:1056
msgid "Delete mailbox"
msgstr ""
#: www/admin.php:1062
msgid "Oops, this mailbox doesn't seem to exist."
msgstr ""
#: www/register.php:18
msgid "Invalid CSRF token"
msgstr ""
#: www/register.php:27
msgid "Invalid username. It may not contain a +, ', \" or /."
msgstr ""
#: www/register.php:44
msgid "The domain you specified is not allowed"
msgstr ""
#: www/register.php:49
msgid "The email address you specified is not valid"
msgstr ""
#: www/register.php:52
msgid "The username you specified is reserved"
msgstr ""
#: www/register.php:78 www/register.php:87
msgid "E-Mail and XMPP - Register"
msgstr ""
#: www/register.php:82 www/register.php:88
msgid ""
"Register for a free and anonymous E-Mail address and an XMPP/Jabber account"
msgstr ""
#: www/register.php:114
#, php-format
msgid ""
"I have read and agreed to the <a href=\"%s\" target=\"_blank\">Privacy "
"Policy</a>"
msgstr ""
#: cron.php:11 common_config.php:87 setup.php:20 setup.php:23
msgid "No Connection to MySQL database!"
msgstr ""
#: tools/delete_leftover_files.php:14
#, php-format
msgid ""
"%s does not seem to have any accounts, but has a directory. Consider "
"deleting it."
msgstr ""
#: tools/delete_leftover_files.php:20
#, php-format
msgid "Deleted: %s"
msgstr ""
#: tools/delete_leftover_files.php:22
#, php-format
msgid "File found in mail directory location: \"%s\". Consider deleting it."
msgstr ""
#: common_config.php:136
msgid "Copy:"
msgstr ""
#: common_config.php:255
#, php-format
msgid ""
"Oops, the email \"%s\" doesn' look like a valid email address and thus "
"wasn't added to the forwarding list."
msgstr ""
#: common_config.php:281
msgid "You are not allowed to manage this domain."
msgstr ""
#: common_config.php:292
msgid "Invalid email address."
msgstr ""
#: setup.php:8
#, php-format
msgid "The %s extension of PHP is required. Please install it first."
msgstr ""
#: setup.php:35
msgid "Database has successfully been updated."
msgstr ""
#: setup.php:37
msgid "Database is already up-to-date."
msgstr ""
#: setup.php:40
msgid "Error updating database:"
msgstr ""
#: setup.php:57
msgid "Database has successfully been set up."
msgstr ""
#: setup.php:59
msgid "Error setting up database:"
msgstr ""

View file

@ -1,21 +1,26 @@
<?php <?php
if(!extension_loaded('gettext')){
die('The gettext extension of PHP is required. Please install it first.' . PHP_EOL);
}
require('common_config.php'); require('common_config.php');
if(!extension_loaded('pdo_mysql')){ foreach(['pdo_mysql', 'mbstring', 'pcre', 'gnupg', 'intl'] as $required_extension) {
die("Error: You need to install and enable the PDO php module\n"); if ( ! extension_loaded( $required_extension ) ) {
die( sprintf( _( 'The %s extension of PHP is required. Please install it first.' ), $required_extension ) . PHP_EOL );
}
} }
try{ try{
$db=new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $db=new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
}catch(PDOException $e){ }catch(PDOException){
try{ try{
//Attempt to create database //Attempt to create database
$db=new PDO('mysql:host=' . DBHOST . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $db=new PDO('mysql:host=' . DBHOST . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
if(false!==$db->exec('CREATE DATABASE ' . DBNAME)){ if(false!==$db->exec('CREATE DATABASE ' . DBNAME)){
$db=new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $db=new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME . ';charset=utf8mb4', DBUSER, DBPASS, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
}else{ }else{
die("Error: No database connection!\n"); die( _('No Connection to MySQL database!') . PHP_EOL);
} }
}catch(PDOException $e){ }catch(PDOException){
die("Error: No database connection!\n"); die( _('No Connection to MySQL database!') . PHP_EOL);
} }
} }
try{ try{
@ -27,13 +32,13 @@ try{
$stmt->execute([DBVERSION]); $stmt->execute([DBVERSION]);
$db->commit(); $db->commit();
if($version < DBVERSION){ if($version < DBVERSION){
echo "Database has successfully been updated.\n"; echo _('Database has successfully been updated.') . PHP_EOL;
} else { } else {
echo "Database is already up-to-date.\n"; echo _('Database is already up-to-date.') . PHP_EOL;
} }
} catch(PDOException $e){ } catch(PDOException $e){
echo "Error updating database:\n"; echo _('Error updating database:') . PHP_EOL;
echo $e->getMessage() . "\n"; echo $e->getMessage() . PHP_EOL;
$db->rollBack(); $db->rollBack();
} }
} catch(PDOException){ } catch(PDOException){
@ -49,9 +54,9 @@ try{
$db->exec('CREATE TABLE settings (setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL PRIMARY KEY, value text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;'); $db->exec('CREATE TABLE settings (setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL PRIMARY KEY, value text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;');
$stmt=$db->prepare("INSERT INTO settings (setting, value) VALUES ('version', ?);"); $stmt=$db->prepare("INSERT INTO settings (setting, value) VALUES ('version', ?);");
$stmt->execute([DBVERSION]); $stmt->execute([DBVERSION]);
echo "Database has successfully been set up.\n"; echo _('Database has successfully been set up.') . PHP_EOL;
} catch(PDOException $e){ } catch(PDOException $e){
echo "Error setting up database:\n"; echo _('Error setting up database:') . PHP_EOL;
echo $e->getMessage() . "\n"; echo $e->getMessage() . PHP_EOL;
} }
} }

View file

@ -11,15 +11,15 @@ $dirs = [];
foreach ( $domains as $domain ) { foreach ( $domains as $domain ) {
if ( is_dir( '/var/mail/vmail/' . basename( $domain ) ) ) { if ( is_dir( '/var/mail/vmail/' . basename( $domain ) ) ) {
if ( ! isset( $mailboxes[ $domain ] ) ) { if ( ! isset( $mailboxes[ $domain ] ) ) {
echo "$domain does not seem to have any accounts, but has a directory. Consider deleting it.\n"; echo sprintf(_('%s does not seem to have any accounts, but has a directory. Consider deleting it.'), $domain).PHP_EOL;
} else { } else {
$accounts = array_diff( scandir( '/var/mail/vmail/' . basename( $domain ) ), array( '..', '.' ) ); $accounts = array_diff( scandir( '/var/mail/vmail/' . basename( $domain ) ), array( '..', '.' ) );
foreach ( $accounts as $account ) { foreach ( $accounts as $account ) {
if ( ! isset( $mailboxes[ $domain ][ $account ] ) && is_dir( '/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ) ) ) { if ( ! isset( $mailboxes[ $domain ][ $account ] ) && is_dir( '/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ) ) ) {
exec( 'rm -r ' . escapeshellarg('/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ))); exec( 'rm -r ' . escapeshellarg('/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account )));
echo "Deleted: /var/mail/vmail/" . basename( $domain ) . '/' . basename( $account ) . "\n"; echo sprintf(_('Deleted: %s'), '/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account )) . PHP_EOL;
} elseif( is_file('/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ))){ } elseif( is_file('/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ))){
echo 'File found in mail directory location: "/var/mail/vmail/' . basename( $domain ) . '/' . basename( $account ) . "\". Consider deleting it.\n"; echo sprintf(_('File found in mail directory location: "%s". Consider deleting it.'), '/var/mail/vmail/'. basename( $domain ) . '/' . basename( $account ) ) . PHP_EOL;
} }
} }
} }

3
update-translation.sh Executable file
View file

@ -0,0 +1,3 @@
#!/bin/bash
xgettext -o locale/mail-hosting.pot `find . -iname '*.php'`
for translation in `find locale -iname '*.po'`; do msgmerge -U "$translation" locale/mail-hosting.pot; msgfmt -o ${translation:0:-2}mo "$translation"; done

File diff suppressed because it is too large Load diff

View file

@ -1,28 +1,40 @@
<?php include_once('../common_config.php'); ?> <?php
<!DOCTYPE html><html lang="en-gb"><head> include_once('../common_config.php');
<title>Daniel - E-Mail and XMPP</title> global $language, $dir, $locale;
?>
<!DOCTYPE html><html lang="<?php echo $language; ?>" dir="<?php echo $dir; ?>"><head>
<title><?php echo _('E-Mail and XMPP'); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Daniel Winzen"> <meta name="author" content="Daniel Winzen">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Get a free and anonymous E-Mail address and an XMPP/Jabber account"> <meta name="description" content="<?php echo _('Get a free and anonymous E-Mail address and an XMPP/Jabber account'); ?>">
<link rel="canonical" href="https://danwin1210.de/mail/"> <link rel="canonical" href="<?php echo CANONICAL_URL; ?>">
<link rel="alternate" href="<?php echo CANONICAL_URL; ?>" hreflang="x-default">
<?php alt_links(); ?>
<meta property="og:type" content="website">
<meta property="og:title" content="<?php echo _('E-Mail and XMPP'); ?>">
<meta property="og:description" content="<?php echo _('Get a free and anonymous E-Mail address and an XMPP/Jabber account'); ?>">
<meta property="og:url" content="<?php echo CANONICAL_URL; ?>">
<meta property="og:locale" content="<?php echo $locale; ?>">
</head><body> </head><body>
<main> <main>
<p>Info | <a href="/mail/register.php">Register</a> | <a href="/mail/squirrelmail/src/login.php" target="_blank">Webmail-Login</a> | <a href="/mail/manage_account.php">Manage account</a> | <a href="https://danwin1210.de:5281/conversejs" target="_blank" rel="noopener">Web-XMPP</a></p> <p><?php echo _('Info'); ?> | <a href="<?php echo ROOT_URL; ?>register.php"><?php echo _('Register'); ?></a> | <a href="<?php echo ROOT_URL; ?>squirrelmail/src/login.php" target="_blank"><?php echo _('Webmail-Login'); ?></a> | <a href="<?php echo ROOT_URL; ?>manage_account.php"><?php echo _('Manage account'); ?></a> | <a href="<?php echo WEB_XMPP_URL; ?>" target="_blank" rel="noopener"><?php echo _('Web-XMPP'); ?></a></p>
<h2>What you will get</h2> <h2><?php echo _('What you will get'); ?></h2>
<p>You get a free anonymous E-Mail address and an XMPP/Jabber account using the same details. Your Jabber ID is user@danwin1210.de and can be connected to directly from clearnet or via TOR hidden service (danielas3rtn54uwmofdo3x2bsdifr47huasnmbgqzfrec5ubupvtpid.onion).</p> <p><?php printf(_('You get a free anonymous E-Mail address and an XMPP/Jabber account using the same details. Your Jabber ID is user@%1$s and can be connected to directly from clearnet or via Tor hidden service (%2$s).'), CLEARNET_SERVER, ONION_SERVER); ?></p>
<p>You will have 50MB of disk space available for your mails. If you desperately need more space, just <a href="/contact.php">contact me</a>. Your E-Mail address will be user@danwin1210.de</p> <p><?php printf(_('You will have 50MB of disk space available for your mails. If you need more space, just <a href="%1$s">contact me</a>. Your E-Mail address will be %2$s'), CONTACT_URL, CLEARNET_SERVER); ?></p>
<p>For privacy, please use PGP mail encryption, if you can. This prevents others from reading your mails (including me and/or LEA). GnuPGs official home: <a href="https://gnupg.org">https://gnupg.org</a> Windows GUI: <a href="https://gpg4usb.org">https://gpg4usb.org</a></p> <p><?php echo _('For privacy, please use PGP mail encryption, if you can. This prevents others from reading your mails (including me and/or LEA). GnuPGs official home: <a href="https://gnupg.org" target="_blank" rel="noopener noreferrer">https://gnupg.org</a> Windows GUI: <a href="https://gpg4usb.org" target="_blank" rel="noopener noreferrer">https://gpg4usb.org</a>'); ?></p>
<h2>E-Mail Setup</h2> <h2><?php echo _('E-Mail Setup'); ?></h2>
<p>SMTP: danwin1210.de Port 465 (SSL/TLS) or 587 (StartTLS)<br> <p>
IMAP: danwin1210.de Port 993 (SSL/TLS) or 143 (StartTLS)<br> <?php printf(_('SMTP: %s Port 465 (SSL/TLS) or 587 (StartTLS)'), CLEARNET_SERVER); ?><br>
POP3: danwin1210.de Port 995 (SSL/TLS) or 110 (StartTLS)<br> <?php printf(_('IMAP: %s Port 993 (SSL/TLS) or 143 (StartTLS)'), CLEARNET_SERVER); ?><br>
Authentication: PLAIN, LOGIN</p> <?php printf(_('POP3: %s Port 995 (SSL/TLS) or 110 (StartTLS)'), CLEARNET_SERVER); ?><br>
<p>You can also connect on the same ports via the tor onion address danielas3rtn54uwmofdo3x2bsdifr47huasnmbgqzfrec5ubupvtpid.onion, but you will have to accept an SSL certificate only valid for the clearnet domain.</p> <?php echo _('Authentication: PLAIN, LOGIN'); ?>
<h2>XMPP setup</h2> </p>
<p>Domain: danwin1210.de<br> <p><?php printf(_('You can also connect on the same ports via the Tor onion address %s, but you will have to accept an SSL certificate only valid for the clearnet domain.'), ONION_SERVER); ?></p>
Connect server: danielas3rtn54uwmofdo3x2bsdifr47huasnmbgqzfrec5ubupvtpid.onion (optional for torification)<br> <h2><?php echo _('XMPP setup'); ?></h2>
File transfer proxy: proxy.danwin1210.de<br> <p><?php printf(_('Domain: %s'), CLEARNET_SERVER); ?><br>
BOSH URL: https://danwin1210.de:5281/http-bind (only enable if you have to, as it is slower than directly using xmpp)</p> <?php printf(_('Connect server: %s (optional for torification)'), ONION_SERVER); ?><br>
<?php printf(_('File transfer proxy: %s'), XMPP_FILE_PROXY); ?><br>
<?php printf(_('BOSH URL: %s (only enable if you have to, as it is slower than directly using xmpp)'), XMPP_BOSH_URL); ?></p>
</main> </main>
</body></html> </body></html>

View file

@ -1,6 +1,6 @@
<?php <?php
require_once( '../common_config.php' ); require_once( '../common_config.php' );
global $language, $dir, $locale;
session_start(); session_start();
if ( empty( $_SESSION[ 'csrf_token' ] ) ) { if ( empty( $_SESSION[ 'csrf_token' ] ) ) {
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
@ -14,20 +14,20 @@ if ( ! empty( $_SESSION[ 'email_user' ] ) ) {
$_SESSION = []; $_SESSION = [];
session_regenerate_id( true ); session_regenerate_id( true );
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
$msg .= '<div class="red" role="alert">It looks like your user no longer exists!</div>'; $msg .= '<div class="red" role="alert">'._('It looks like your user no longer exists!').'</div>';
} }
} }
if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
if ( $_SESSION[ 'csrf_token' ] !== $_POST[ 'csrf_token' ] ?? '' ) { if ( $_SESSION[ 'csrf_token' ] !== $_POST[ 'csrf_token' ] ?? '' ) {
die( 'Invalid csfr token' ); die( 'Invalid CSRF token' );
} }
if ( isset( $_SESSION[ '2fa_code' ] ) ) { if ( isset( $_SESSION[ '2fa_code' ] ) ) {
if ( ! empty( $_POST[ '2fa_code' ] ) && $_POST[ '2fa_code' ] === $_SESSION[ '2fa_code' ] ) { if ( ! empty( $_POST[ '2fa_code' ] ) && $_POST[ '2fa_code' ] === $_SESSION[ '2fa_code' ] ) {
unset( $_SESSION[ '2fa_code' ] ); unset( $_SESSION[ '2fa_code' ] );
unset( $_SESSION[ 'pgp_key' ] ); unset( $_SESSION[ 'pgp_key' ] );
} else { } else {
$msg .= '<p style="color:red">Wrong 2FA code</p>'; $msg .= '<p style="color:red">'._('Wrong 2FA code').'</p>';
} }
} }
if ( ! isset( $_SESSION[ '2fa_code' ] ) && isset( $_POST[ 'action' ] ) ) { if ( ! isset( $_SESSION[ '2fa_code' ] ) && isset( $_POST[ 'action' ] ) ) {
@ -35,16 +35,16 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
$_SESSION = []; $_SESSION = [];
session_regenerate_id( true ); session_regenerate_id( true );
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
$msg .= '<div class="green" role="alert">Successfully logged out</div>'; $msg .= '<div class="green" role="alert">'._('Successfully logged out').'</div>';
} elseif ( $_POST[ 'action' ] === 'login' ) { } elseif ( $_POST[ 'action' ] === 'login' ) {
$ok = true; $ok = true;
if ( ! check_captcha( $_POST[ 'challenge' ] ?? '', $_POST[ 'captcha' ] ?? '' ) ) { if ( ! check_captcha( $_POST[ 'challenge' ] ?? '', $_POST[ 'captcha' ] ?? '' ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Invalid captcha</div>'; $msg .= '<div class="red" role="alert">'._('Invalid captcha').'</div>';
} }
if ( empty( $_POST[ 'user' ] ) || ! preg_match( '/^([^+]+?)(@([^@]+))?$/i', $_POST[ 'user' ], $match ) ) { if ( empty( $_POST[ 'user' ] ) || ! preg_match( '/^([^+]+?)(@([^@]+))?$/i', $_POST[ 'user' ], $match ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Invalid username.</div>'; $msg .= '<div class="red" role="alert">'._('Invalid username').'</div>';
} }
if ( $ok ) { if ( $ok ) {
$db = get_db_instance(); $db = get_db_instance();
@ -60,7 +60,7 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
if ( $tmp = $stmt->fetch( PDO::FETCH_ASSOC ) ) { if ( $tmp = $stmt->fetch( PDO::FETCH_ASSOC ) ) {
if ( empty( $_POST[ 'pwd' ] ) || ! password_verify( $_POST[ 'pwd' ], $tmp[ 'password' ] ) ) { if ( empty( $_POST[ 'pwd' ] ) || ! password_verify( $_POST[ 'pwd' ], $tmp[ 'password' ] ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Incorrect username or password</div>'; $msg .= '<div class="red" role="alert">'._('Incorrect username or password').'</div>';
} else { } else {
$_SESSION[ 'email_user' ] = $tmp[ 'username' ]; $_SESSION[ 'email_user' ] = $tmp[ 'username' ];
$stmt = $db->prepare( 'UPDATE mailbox SET last_login = ? WHERE username = ? AND active = 1;' ); $stmt = $db->prepare( 'UPDATE mailbox SET last_login = ? WHERE username = ? AND active = 1;' );
@ -78,7 +78,7 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
} }
} }
} else { } else {
$msg .= '<div class="red" role="alert">Incorrect username or password</div>'; $msg .= '<div class="red" role="alert">'._('Incorrect username or password').'</div>';
} }
} }
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_settings' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_settings' ) {
@ -97,21 +97,21 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
$stmt->execute( [ ( isset( $_POST[ 'enforce_tls_in' ] ) ? 1 : 0 ), ( isset( $_POST[ 'enforce_tls_out' ] ) ? 1 : 0 ), $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ ( isset( $_POST[ 'enforce_tls_in' ] ) ? 1 : 0 ), ( isset( $_POST[ 'enforce_tls_out' ] ) ? 1 : 0 ), $_SESSION[ 'email_user' ] ] );
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_password' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_password' ) {
if ( empty( $_POST[ 'pass_update' ] ) || empty( $_POST[ 'pass_update2' ] ) || $_POST[ 'pass_update' ] !== $_POST[ 'pass_update2' ] ) { if ( empty( $_POST[ 'pass_update' ] ) || empty( $_POST[ 'pass_update2' ] ) || $_POST[ 'pass_update' ] !== $_POST[ 'pass_update2' ] ) {
$msg .= '<div class="red" role="alert">Passwords empty or don\'t match</div>'; $msg .= '<div class="red" role="alert">'._('Passwords empty or don\'t match').'</div>';
} else { } else {
$hash = password_hash( $_POST[ 'pass_update' ], PASSWORD_ARGON2ID ); $hash = password_hash( $_POST[ 'pass_update' ], PASSWORD_ARGON2ID );
$stmt = $db->prepare( 'UPDATE mailbox SET password_hash_type = "{ARGON2ID}", password = ? WHERE username = ? AND active = 1;' ); $stmt = $db->prepare( 'UPDATE mailbox SET password_hash_type = "{ARGON2ID}", password = ? WHERE username = ? AND active = 1;' );
$stmt->execute( [ $hash, $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $hash, $_SESSION[ 'email_user' ] ] );
$msg .= '<div class="green" role="alert">Successfully updated password</div>'; $msg .= '<div class="green" role="alert">'._('Successfully updated password').'</div>';
} }
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'delete_account' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'delete_account' ) {
$msg .= '<div class="red" role="alert">Warning: This will permenently delete your account and all your data. Anyone can immediately register with this user again. It cannot be reversed. Are you absolutely sure?</div>'; $msg .= '<div class="red" role="alert">'._('Warning: This will permenently delete your account and all your data. Anyone can immediately register with this user again. It cannot be reversed. Are you absolutely sure?').'</div>';
$msg .= '<form method="post"><input type="hidden" name="csrf_token" value="' . $_SESSION[ 'csrf_token' ] . '">'; $msg .= '<form method="post"><input type="hidden" name="csrf_token" value="' . $_SESSION[ 'csrf_token' ] . '">';
$msg .= '<button type="submit" name="action" value="delete_account2">Yes, I want to permanently delete my account</button></form>'; $msg .= '<button type="submit" name="action" value="delete_account2">'._('Yes, I want to permanently delete my account').'</button></form>';
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'disable_account' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'disable_account' ) {
$msg .= '<div class="red" role="alert">Warning: This will disable your account for a year and delete all your data. After a year it is available for registrations again. It cannot be reversed. Are you absolutely sure?</div>'; $msg .= '<div class="red" role="alert">'._('Warning: This will disable your account for a year and delete all your data. After a year it is available for registrations again. It cannot be reversed. Are you absolutely sure?').'</div>';
$msg .= '<form method="post"><input type="hidden" name="csrf_token" value="' . $_SESSION[ 'csrf_token' ] . '">'; $msg .= '<form method="post"><input type="hidden" name="csrf_token" value="' . $_SESSION[ 'csrf_token' ] . '">';
$msg .= '<button type="submit" name="action" value="disable_account2">Yes, I want to disable my account</button></form>'; $msg .= '<button type="submit" name="action" value="disable_account2">'._('Yes, I want to disable my account').'</button></form>';
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'delete_account2' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'delete_account2' ) {
$stmt = $db->prepare( 'DELETE FROM alias WHERE address = ?;' ); $stmt = $db->prepare( 'DELETE FROM alias WHERE address = ?;' );
$stmt->execute( [ $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $_SESSION[ 'email_user' ] ] );
@ -120,7 +120,7 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
$_SESSION = []; $_SESSION = [];
session_regenerate_id( true ); session_regenerate_id( true );
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
$msg .= '<div class="green" role="alert">Successfully deleted account</div>'; $msg .= '<div class="green" role="alert">'._('Successfully deleted account').'</div>';
} elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'disable_account2' ) { } elseif ( ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'disable_account2' ) {
$stmt = $db->prepare( 'UPDATE alias SET active = 0 WHERE address = ?;' ); $stmt = $db->prepare( 'UPDATE alias SET active = 0 WHERE address = ?;' );
$stmt->execute( [ $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $_SESSION[ 'email_user' ] ] );
@ -129,11 +129,11 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
$_SESSION = []; $_SESSION = [];
session_regenerate_id( true ); session_regenerate_id( true );
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
$msg .= '<div class="green" role="alert">Successfully disabled account</div>'; $msg .= '<div class="green" role="alert">'._('Successfully disabled account').'</div>';
} elseif ( isset( $_POST[ 'pgp_key' ] ) && ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_pgp_key' ) { } elseif ( isset( $_POST[ 'pgp_key' ] ) && ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'update_pgp_key' ) {
$pgp_key = trim( $_POST[ 'pgp_key' ] ); $pgp_key = trim( $_POST[ 'pgp_key' ] );
if ( empty( $pgp_key ) ) { if ( empty( $pgp_key ) ) {
$msg .= "<p class=\"green\">Successfully removed the key</p>"; $msg .= '<p class="green">'._('Successfully removed the key').'</p>';
$stmt = $db->prepare( 'UPDATE mailbox SET pgp_key = "", tfa = 0, pgp_verified = 0 WHERE username = ?;' ); $stmt = $db->prepare( 'UPDATE mailbox SET pgp_key = "", tfa = 0, pgp_verified = 0 WHERE username = ?;' );
$stmt->execute( [ $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $_SESSION[ 'email_user' ] ] );
} else { } else {
@ -142,7 +142,7 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
gnupg_setarmor( $gpg, 1 ); gnupg_setarmor( $gpg, 1 );
$imported_key = gnupg_import( $gpg, $pgp_key ); $imported_key = gnupg_import( $gpg, $pgp_key );
if ( ! $imported_key ) { if ( ! $imported_key ) {
$msg .= "<p class=\"red\">There was an error importing the key</p>"; $msg .= '<p class="red">'._('There was an error importing the key').'</p>';
} else { } else {
$has_this_email = false; $has_this_email = false;
$key_info = gnupg_keyinfo( $gpg, $imported_key[ 'fingerprint' ] ); $key_info = gnupg_keyinfo( $gpg, $imported_key[ 'fingerprint' ] );
@ -155,36 +155,43 @@ if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
} }
} }
if ( $has_this_email ) { if ( $has_this_email ) {
$msg .= "<p class=\"green\">Successfully imported the key</p>"; $msg .= '<p class="green">'._('Successfully imported the key').'</p>';
$stmt = $db->prepare( 'UPDATE mailbox SET pgp_key = ?, tfa = 0, pgp_verified = 0 WHERE username = ?;' ); $stmt = $db->prepare( 'UPDATE mailbox SET pgp_key = ?, tfa = 0, pgp_verified = 0 WHERE username = ?;' );
$stmt->execute( [ $pgp_key, $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $pgp_key, $_SESSION[ 'email_user' ] ] );
} else { } else {
$msg .= sprintf( '<p class="red">Oops, looks like the key is missing this email address as user id. Please add your address "%s" as user ID to your pgp key or create a new key pair.</p>', htmlspecialchars( $_SESSION[ 'email_user' ] ) ); $msg .= '<p class="red">' . sprintf( _('Oops, looks like the key is missing this email address as user id. Please add your address "%s" as user ID to your pgp key or create a new key pair.'), htmlspecialchars( $_SESSION[ 'email_user' ] ) ) . '</p>';
} }
} }
} }
} elseif ( isset( $_POST[ 'enable_2fa_code' ] ) && ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'enable_2fa' ) { } elseif ( isset( $_POST[ 'enable_2fa_code' ] ) && ! empty( $_SESSION[ 'email_user' ] ) && $_POST[ 'action' ] === 'enable_2fa' ) {
if ( $_POST[ 'enable_2fa_code' ] !== $_SESSION[ 'enable_2fa_code' ] ) { if ( $_POST[ 'enable_2fa_code' ] !== $_SESSION[ 'enable_2fa_code' ] ) {
$msg .= "<p class=\"red\">Sorry, the code was incorrect</p>"; $msg .= '<p class="red">'._('Sorry, the code was incorrect').'</p>';
} else { } else {
$stmt = $db->prepare( 'UPDATE mailbox SET tfa = 1, pgp_verified = 1 WHERE username = ?;' ); $stmt = $db->prepare( 'UPDATE mailbox SET tfa = 1, pgp_verified = 1 WHERE username = ?;' );
$stmt->execute( [ $_SESSION[ 'email_user' ] ] ); $stmt->execute( [ $_SESSION[ 'email_user' ] ] );
$msg .= "<p class=\"green\">Successfully enabled 2FA</p>"; $msg .= '<p class="green">'._('Successfully enabled 2FA').'</p>';
} }
} }
} }
} }
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-gb"> <html lang="<?php echo $language; ?>" dir="<?php echo $dir; ?>">
<head> <head>
<title>Daniel - E-Mail and XMPP - Manage account</title> <title><?php echo _('E-Mail and XMPP - Manage account'); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Daniel Winzen"> <meta name="author" content="Daniel Winzen">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" <meta name="description"
content="Manage your free and anonymous E-Mail address and an XMPP/Jabber account. Add forwarding addresses, change your password or disable/delete your account."> content="<?php echo _('Manage your free and anonymous E-Mail address and an XMPP/Jabber account. Add forwarding addresses, change your password or disable/delete your account.'); ?>">
<link rel="canonical" href="https://danwin1210.de/mail/manage_account.php"> <link rel="canonical" href="<?php echo CANONICAL_URL; ?>manage_account.php">
<link rel="alternate" href="<?php echo CANONICAL_URL; ?>manage_account.php" hreflang="x-default">
<?php alt_links(); ?>
<meta property="og:type" content="website">
<meta property="og:title" content="<?php echo _('E-Mail and XMPP - Manage account'); ?>">
<meta property="og:description" content="<?php echo _('Manage your free and anonymous E-Mail address and an XMPP/Jabber account. Add forwarding addresses, change your password or disable/delete your account.'); ?>">
<meta property="og:url" content="<?php echo CANONICAL_URL; ?>manage_account.php">
<meta property="og:locale" content="<?php echo $locale; ?>">
</head> </head>
<body> <body>
<main> <main>
@ -203,21 +210,21 @@ foreach ( $key_info as $key ) {
} }
} }
} }
$encrypted = gnupg_encrypt( $gpg, "To login, please enter the following code to confirm ownership of your key:\n\n" . $_SESSION[ '2fa_code' ] . "\n" ); $encrypted = gnupg_encrypt( $gpg, _('To login, please enter the following code to confirm ownership of your key:')."\n\n" . $_SESSION[ '2fa_code' ] . "\n" );
echo $msg; echo $msg;
echo "<p>To login, please decrypt the following PGP encrypted message and confirm the code:</p>"; echo '<p>'._('To login, please decrypt the following PGP encrypted message and confirm the code:').'</p>';
echo "<pre>$encrypted</pre>"; echo "<pre>$encrypted</pre>";
?> ?>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><input type="text" name="2fa_code" aria-label="2FA code"></div> <div class="col"><input type="text" name="2fa_code" aria-label="<?php echo _('2FA code'); ?>"></div>
<div class="col"> <div class="col">
<button type="submit">Confirm</button> <button type="submit"><?php echo _('Confirm'); ?></button>
</div> </div>
</div> </div>
</form> </form>
</maim></body> </main></body>
</html> </html>
<?php <?php
exit; exit;
@ -226,36 +233,36 @@ exit;
if ( ! empty( $_SESSION[ 'email_user' ] ) ){ ?> if ( ! empty( $_SESSION[ 'email_user' ] ) ){ ?>
<form method="post"><input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <form method="post"><input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<?php } ?> <?php } ?>
<p><a href="/mail/">Info</a> |<?php <p><a href="<?php echo ROOT_URL; ?>"><?php echo _('Info'); ?></a> |<?php
if ( ! empty( $_SESSION[ 'email_user' ] ) ) { ?> if ( ! empty( $_SESSION[ 'email_user' ] ) ) {
Logged in as <?php echo htmlspecialchars( $_SESSION[ 'email_user' ] ); printf(_('Logged in as %s'), htmlspecialchars( $_SESSION[ 'email_user' ] ) );
} else { ?> } else { ?>
<a href="/mail/register.php">Register</a> <a href="<?php echo ROOT_URL; ?>register.php"><?php echo _('Register'); ?></a>
<?php } ?> | <a href="/mail/squirrelmail/src/login.php" target="_blank">Webmail-Login</a> <?php <?php } ?> | <a href="<?php echo ROOT_URL; ?>squirrelmail/src/login.php" target="_blank"><?php echo _('Webmail-Login'); ?></a> <?php
if ( ! empty( $_SESSION[ 'email_user' ] ) ) { ?> if ( ! empty( $_SESSION[ 'email_user' ] ) ) { ?>
| |
<button name="action" value="logout" type="submit">Logout</button> <button name="action" value="logout" type="submit"><?php echo _('Logout'); ?></button>
<?php } else { ?> <?php } else { ?>
| Manage account<?php | Manage account');
} ?> | <a href="https://danwin1210.de:5281/conversejs" target="_blank" rel="noopener">Web-XMPP</a></p> } ?> | <a href="<?php echo WEB_XMPP_URL; ?>" target="_blank" rel="noopener"><?php echo _('Web-XMPP'); ?></a></p>
<?php if ( ! empty( $_SESSION[ 'email_user' ] ) ){ ?></form><?php } <?php if ( ! empty( $_SESSION[ 'email_user' ] ) ){ ?></form><?php }
echo "<p>$msg</p>"; echo "<p>$msg</p>";
if ( empty( $_SESSION[ 'email_user' ] ) ) { ?> if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><label for="user">Username</label></div> <div class="col"><label for="user"><?php echo _('Username'); ?></label></div>
<div class="col"><input type="text" name="user" id="user" autocomplete="username" required <div class="col"><input type="text" name="user" id="user" autocomplete="username" required
value="<?php echo htmlspecialchars( $_POST[ 'user' ] ?? '' ); ?>"></div> value="<?php echo htmlspecialchars( $_POST[ 'user' ] ?? '' ); ?>"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="pwd">Password</label></div> <div class="col"><label for="pwd"><?php echo _('Password'); ?></label></div>
<div class="col"><input type="password" name="pwd" id="pwd" autocomplete="new-password" required></div> <div class="col"><input type="password" name="pwd" id="pwd" autocomplete="new-password" required></div>
</div> </div>
<?php send_captcha(); ?> <?php send_captcha(); ?>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button name="action" value="login" type="submit">Login</button> <button name="action" value="login" type="submit"><?php echo _('Login'); ?></button>
</div> </div>
</div> </div>
</form> </form>
@ -272,62 +279,58 @@ if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
$tls_status = $stmt->fetch( PDO::FETCH_ASSOC ); $tls_status = $stmt->fetch( PDO::FETCH_ASSOC );
?> ?>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<h2>Settings</h2> <h2><?php echo _('Settings'); ?></h2>
<h3>Delivery</h3> <h3><?php echo _('Delivery'); ?></h3>
<p>Edit how your mail is delivered. You can add forwarding addresses one per line, or comma seperated. When you <p><?php echo _('Change how your mail is delivered. You can add forwarding addresses one per line, or comma seperated. When you disable the "keep a local copy" checkbox, your mail will only be sent to your forwarding addresses.'); ?></p>
disable the "keep a local copy" checkbox, your mail will only be sent to your forwarding addresses.</p>
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><label for="alias_to">Forward to</label></div> <div class="col"><label for="alias_to"><?php echo _('Forward to'); ?></label></div>
<div class="col"><textarea name="alias_to" <div class="col"><textarea name="alias_to"
id="alias_to"><?php echo htmlspecialchars( $aliases_to ); ?></textarea></div> id="alias_to"><?php echo htmlspecialchars( $aliases_to ); ?></textarea></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="alias_keep_copy">Keep a local copy</label></div> <div class="col"><label for="alias_keep_copy"><?php echo _('Keep a local copy'); ?></label></div>
<div class="col"><input type="checkbox" name="alias_keep_copy" <div class="col"><input type="checkbox" name="alias_keep_copy"
id="alias_keep_copy"<?php echo in_array( $_SESSION[ 'email_user' ], $aliases, true ) ? ' checked' : ''; ?>> id="alias_keep_copy"<?php echo in_array( $_SESSION[ 'email_user' ], $aliases, true ) ? ' checked' : ''; ?>>
</div> </div>
</div> </div>
<h3>Encryption</h3> <h3><?php echo _('Encryption'); ?></h3>
<p>If you are having issues sending or receiving mails with some other provider, you can try disabling forced <p><?php echo _('If you are having issues sending or receiving mails with some other provider, you can try disabling forced encryption here. But be aware, that this makes it possible for 3rd parties on the network to read your emails. Make sure to ask your correspondent to demand encryption support from their provider for a safer internet.'); ?></p>
encryption here. But be aware, that this makes it possible for 3rd parties on the network to read your
emails. Make sure to ask your correspondent to demand encryption support from their provider for a safer
internet.</p>
<div class="row"> <div class="row">
<div class="col"><label for="enforce_tls_in">Enforce encryption for incoming mail</label></div> <div class="col"><label for="enforce_tls_in"><?php echo _('Enforce encryption for incoming mail'); ?></label></div>
<div class="col"><input type="checkbox" name="enforce_tls_in" <div class="col"><input type="checkbox" name="enforce_tls_in"
id="enforce_tls_in"<?php echo ! empty( $tls_status[ 'enforce_tls_in' ] ) ? ' checked' : ''; ?>> id="enforce_tls_in"<?php echo ! empty( $tls_status[ 'enforce_tls_in' ] ) ? ' checked' : ''; ?>>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="enforce_tls_out">Enforce encryption for outgoing mail</label></div> <div class="col"><label for="enforce_tls_out"><?php echo _('Enforce encryption for outgoing mail'); ?></label></div>
<div class="col"><input type="checkbox" name="enforce_tls_out" <div class="col"><input type="checkbox" name="enforce_tls_out"
id="enforce_tls_out"<?php echo ! empty( $tls_status[ 'enforce_tls_out' ] ) ? ' checked' : ''; ?>> id="enforce_tls_out"<?php echo ! empty( $tls_status[ 'enforce_tls_out' ] ) ? ' checked' : ''; ?>>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button name="action" value="update_settings" type="submit">Update settings</button> <button name="action" value="update_settings" type="submit"><?php echo _('Update settings'); ?></button>
</div> </div>
</div> </div>
</form> </form>
<h2>Change password</h2> <h2><?php echo _('Change password'); ?></h2>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><label for="pass_update">Password</label></div> <div class="col"><label for="pass_update"><?php echo _('Password'); ?></label></div>
<div class="col"><input type="password" name="pass_update" id="pass_update" autocomplete="new-password" <div class="col"><input type="password" name="pass_update" id="pass_update" autocomplete="new-password"
required></div> required></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="pass_update2">Password again</label></div> <div class="col"><label for="pass_update2"><?php echo _('Password again'); ?></label></div>
<div class="col"><input type="password" name="pass_update2" id="pass_update2" autocomplete="new-password" <div class="col"><input type="password" name="pass_update2" id="pass_update2" autocomplete="new-password"
required></div> required></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button name="action" value="update_password" type="submit">Change password</button> <button name="action" value="update_password" type="submit"><?php echo _('Change password'); ?></button>
</div> </div>
</div> </div>
</form> </form>
@ -338,7 +341,7 @@ if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
$pgp_status = $stmt->fetch( PDO::FETCH_ASSOC ); $pgp_status = $stmt->fetch( PDO::FETCH_ASSOC );
if ( ! empty( $pgp_status[ 'pgp_key' ] ) ) { if ( ! empty( $pgp_status[ 'pgp_key' ] ) ) {
if ( $pgp_status[ 'tfa' ] === 1 ) { if ( $pgp_status[ 'tfa' ] === 1 ) {
echo "<p class=\"green\">Yay, PGP based 2FA is enabled!</p>"; echo '<p class="green">'._('Yay, PGP based 2FA is enabled!').'</p>';
} else { } else {
$gpg = gnupg_init(); $gpg = gnupg_init();
gnupg_seterrormode( $gpg, GNUPG_ERROR_WARNING ); gnupg_seterrormode( $gpg, GNUPG_ERROR_WARNING );
@ -348,7 +351,7 @@ if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
$key_info = gnupg_keyinfo( $gpg, $imported_key[ 'fingerprint' ] ); $key_info = gnupg_keyinfo( $gpg, $imported_key[ 'fingerprint' ] );
foreach ( $key_info as $key ) { foreach ( $key_info as $key ) {
if ( ! $key[ 'can_encrypt' ] ) { if ( ! $key[ 'can_encrypt' ] ) {
echo "<p>Sorry, this key can't be used to encrypt a message to you. Your key may have expired or has been revoked.</p>"; echo '<p>'._('Sorry, this key can\'t be used to encrypt a message to you. Your key may have expired or has been revoked.').'</p>';
} else { } else {
foreach ( $key[ 'subkeys' ] as $subkey ) { foreach ( $key[ 'subkeys' ] as $subkey ) {
gnupg_addencryptkey( $gpg, $subkey[ 'fingerprint' ] ); gnupg_addencryptkey( $gpg, $subkey[ 'fingerprint' ] );
@ -356,17 +359,17 @@ if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
} }
} }
$_SESSION[ 'enable_2fa_code' ] = bin2hex( random_bytes( 3 ) ); $_SESSION[ 'enable_2fa_code' ] = bin2hex( random_bytes( 3 ) );
if ( $encrypted = gnupg_encrypt( $gpg, "To enable 2FA, please enter the following code to confirm ownership of your key:\n\n$_SESSION[enable_2fa_code]\n" ) ) { if ( $encrypted = gnupg_encrypt( $gpg, _('To enable 2FA, please enter the following code to confirm ownership of your key:'). "\n\n$_SESSION[enable_2fa_code]\n" ) ) {
echo '<h2>Enable 2FA</h2>'; echo '<h2>'._( 'Enable 2FA').'</h2>';
echo "<p>To enable 2FA using your PGP key, please decrypt the following PGP encrypted message and confirm the code:</p>"; echo '<p>'._('To enable 2FA using your PGP key, please decrypt the following PGP encrypted message and confirm the code:').'</p>';
echo "<pre>$encrypted</pre>"; echo "<pre>$encrypted</pre>";
?> ?>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><input type="text" name="enable_2fa_code" aria-label="2FA Code"></div> <div class="col"><input type="text" name="enable_2fa_code" aria-label="<?php echo _('2FA code'); ?>"></div>
<div> <div>
<button type="submit" name="action" value="enable_2fa">Confirm</button> <button type="submit" name="action" value="enable_2fa"><?php echo _('Confirm'); ?></button>
</div> </div>
</div> </div>
</form> </form>
@ -377,39 +380,36 @@ if ( empty( $_SESSION[ 'email_user' ] ) ) { ?>
} }
?> ?>
<h2>Add PGP key for 2FA and end-to-end encryption</h2> <h2><?php echo _('Add PGP key for 2FA and end-to-end encryption'); ?></h2>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"><textarea name="pgp_key" rows="10" cols="50" <div class="col"><textarea name="pgp_key" rows="10" cols="50"
aria-label="PGP key"><?php echo htmlspecialchars( $pgp_status[ 'pgp_key' ] ?? '' ); ?></textarea> aria-label="<?php echo _('PGP key'); ?>"><?php echo htmlspecialchars( $pgp_status[ 'pgp_key' ] ?? '' ); ?></textarea>
</div> </div>
</div> </div>
<div> <div>
<div> <div>
<button type="submit" name="action" value="update_pgp_key">Update PGP key</button> <button type="submit" name="action" value="update_pgp_key"><?php echo _('Update PGP key'); ?></button>
</div> </div>
</div> </div>
</form> </form>
<form class="form_limit" action="manage_account.php" method="post"> <form class="form_limit" action="manage_account.php" method="post">
<h2>Disable/Delete account</h2> <h2><?php echo _('Disable/Delete account'); ?></h2>
<p>Warning, this is permanent and cannot be undone. Disabling an account will delete your email data from the <p><?php echo _('Warning, this is permanent and cannot be undone. Disabling an account will delete your email data from the server, but leave the account blocked in the database for a year, so no one else can use it. Deleting your account will completely wipe all records of it and it will be available for new registrations again.'); ?></p>
server, but leave the account blocked in the database for a year, so no one else can use it. Deleting your
account will completely wipe all records of it and it will be available for new registrations again.</p>
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION[ 'csrf_token' ]; ?>">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button type="submit" name="action" value="disable_account">Disable account</button> <button type="submit" name="action" value="disable_account"><?php echo _('Disable account'); ?></button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button type="submit" name="action" value="delete_account">Delete account</button> <button type="submit" name="action" value="delete_account"><?php echo _('Delete account'); ?></button>
</div> </div>
</div> </div>
</form> </form>
<?php } ?> <?php } ?>
</main> </main>
</body></html> </body></html>

View file

@ -4,6 +4,7 @@ use Egulias\EmailValidator\EmailValidator;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation; use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
require_once( '../common_config.php' ); require_once( '../common_config.php' );
global $language, $dir, $locale;
session_start(); session_start();
if ( empty( $_SESSION[ 'csrf_token' ] ) || $_SESSION[ 'UA' ] !== $_SERVER[ 'HTTP_USER_AGENT' ] ) { if ( empty( $_SESSION[ 'csrf_token' ] ) || $_SESSION[ 'UA' ] !== $_SERVER[ 'HTTP_USER_AGENT' ] ) {
$_SESSION[ 'csrf_token' ] = sha1( uniqid() ); $_SESSION[ 'csrf_token' ] = sha1( uniqid() );
@ -14,22 +15,22 @@ if ( isset( $_POST[ 'user' ] ) ) {
$ok = true; $ok = true;
if ( $_SESSION[ 'csrf_token' ] !== $_POST[ 'csrf_token' ] ?? '' ) { if ( $_SESSION[ 'csrf_token' ] !== $_POST[ 'csrf_token' ] ?? '' ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Invalid csfr token</div>'; $msg .= '<div class="red" role="alert">'._('Invalid CSRF token').'</div>';
} }
if ( ! check_captcha( $_POST[ 'challenge' ] ?? '', $_POST[ 'captcha' ] ?? '' ) ) { if ( ! check_captcha( $_POST[ 'challenge' ] ?? '', $_POST[ 'captcha' ] ?? '' ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Invalid captcha</div>'; $msg .= '<div class="red" role="alert">'._('Invalid captcha').'</div>';
} }
$db = get_db_instance(); $db = get_db_instance();
if ( ! preg_match( '/^([^+\/\'"]+?)(@([^@]+))?$/iu', $_POST[ 'user' ], $match ) ) { if ( ! preg_match( '/^([^+\/\'"]+?)(@([^@]+))?$/iu', $_POST[ 'user' ], $match ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Invalid username. It may not contain a +, \', " or /.</div>'; $msg .= '<div class="red" role="alert">'._('Invalid username. It may not contain a +, \', " or /.').'</div>';
} }
$user = mb_strtolower( $match[ 1 ] ?? '' ); $user = mb_strtolower( $match[ 1 ] ?? '' );
$domain = $match[ 3 ] ?? 'danwin1210.de'; $domain = $match[ 3 ] ?? 'danwin1210.de';
if ( $ok && ( empty( $_POST[ 'pwd' ] ) || empty( $_POST[ 'pwd2' ] ) || $_POST[ 'pwd' ] !== $_POST[ 'pwd2' ] ) ) { if ( $ok && ( empty( $_POST[ 'pwd' ] ) || empty( $_POST[ 'pwd2' ] ) || $_POST[ 'pwd' ] !== $_POST[ 'pwd2' ] ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Passwords empty or don\'t match</div>'; $msg .= '<div class="red" role="alert">'._('Passwords empty or don\'t match').'</div>';
} elseif ( $ok ) { } elseif ( $ok ) {
$stmt = $db->prepare( 'SELECT target_domain FROM alias_domain WHERE alias_domain = ? AND active=1;' ); $stmt = $db->prepare( 'SELECT target_domain FROM alias_domain WHERE alias_domain = ? AND active=1;' );
$stmt->execute( [ $domain ] ); $stmt->execute( [ $domain ] );
@ -40,15 +41,15 @@ if ( isset( $_POST[ 'user' ] ) ) {
$stmt->execute( [ $domain ] ); $stmt->execute( [ $domain ] );
if ( ! $stmt->fetch() ) { if ( ! $stmt->fetch() ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">The domain you specified is not allowed</div>'; $msg .= '<div class="red" role="alert">'._('The domain you specified is not allowed').'</div>';
} else { } else {
$validator = new EmailValidator(); $validator = new EmailValidator();
if ( ! $validator->isValid( "$user@$domain", new NoRFCWarningsValidation() ) ) { if ( ! $validator->isValid( "$user@$domain", new NoRFCWarningsValidation() ) ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">The email address you specified is not valid</div>'; $msg .= '<div class="red" role="alert">'._('The email address you specified is not valid').'</div>';
} elseif(in_array($user, RESERVED_USERNAMES, true)){ } elseif(in_array($user, RESERVED_USERNAMES, true)){
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">The user name you specified is reserved</div>'; $msg .= '<div class="red" role="alert">'._('The username you specified is reserved').'</div>';
} }
} }
@ -58,7 +59,7 @@ if ( isset( $_POST[ 'user' ] ) ) {
$stmt->execute( [ "$user@$domain", "$user@$domain" ] ); $stmt->execute( [ "$user@$domain", "$user@$domain" ] );
if ( $stmt->fetch() ) { if ( $stmt->fetch() ) {
$ok = false; $ok = false;
$msg .= '<div class="red" role="alert">Sorry, this user already exists</div>'; $msg .= '<div class="red" role="alert">'._('Sorry, this user already exists').'</div>';
} }
if ( $ok ) { if ( $ok ) {
$hash = password_hash( $_POST[ 'pwd' ], PASSWORD_ARGON2ID ); $hash = password_hash( $_POST[ 'pwd' ], PASSWORD_ARGON2ID );
@ -66,52 +67,58 @@ if ( isset( $_POST[ 'user' ] ) ) {
$stmt->execute( [ "$user@$domain", "$user@$domain", $domain ] ); $stmt->execute( [ "$user@$domain", "$user@$domain", $domain ] );
$stmt = $db->prepare( 'INSERT INTO mailbox (username, password, quota, local_part, domain, created, modified, password_hash_type, openpgpkey_wkd) VALUES(?, ?, 51200000, ?, ?, NOW(), NOW(), ?, ?);' ); $stmt = $db->prepare( 'INSERT INTO mailbox (username, password, quota, local_part, domain, created, modified, password_hash_type, openpgpkey_wkd) VALUES(?, ?, 51200000, ?, ?, NOW(), NOW(), ?, ?);' );
$stmt->execute( [ "$user@$domain", $hash, $user, $domain, '{ARGON2ID}', z_base32_encode( hash( 'sha1', mb_strtolower( $user ), true ) ) ] ); $stmt->execute( [ "$user@$domain", $hash, $user, $domain, '{ARGON2ID}', z_base32_encode( hash( 'sha1', mb_strtolower( $user ), true ) ) ] );
$msg .= '<div class="green" role="alert">Successfully created new mailbox!</div>'; $msg .= '<div class="green" role="alert">'._('Successfully created new mailbox!').'</div>';
} }
} }
} }
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-gb"> <html lang="<?php echo $language; ?>" dir="<?php echo $dir; ?>">
<head> <head>
<title>Daniel - E-Mail and XMPP - Register</title> <title><?php echo _('E-Mail and XMPP - Register'); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Daniel Winzen"> <meta name="author" content="Daniel Winzen">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Register for a free and anonymous E-Mail address and an XMPP/Jabber account"> <meta name="description" content="<?php echo _('Register for a free and anonymous E-Mail address and an XMPP/Jabber account'); ?>">
<link rel="canonical" href="https://danwin1210.de/mail/register.php"> <link rel="canonical" href="<?php echo CANONICAL_URL; ?>register.php">
<link rel="alternate" href="<?php echo CANONICAL_URL; ?>register.php" hreflang="x-default">
<?php alt_links(); ?>
<meta property="og:type" content="website">
<meta property="og:title" content="<?php echo _('E-Mail and XMPP - Register'); ?>">
<meta property="og:description" content="<?php echo _('Register for a free and anonymous E-Mail address and an XMPP/Jabber account'); ?>">
<meta property="og:url" content="<?php echo CANONICAL_URL; ?>register.php">
<meta property="og:locale" content="<?php echo $locale; ?>">
</head> </head>
<body> <body>
<main> <main>
<p><a href="/mail/">Info</a> | Register | <a href="/mail/squirrelmail/src/login.php" target="_blank">Webmail-Login</a> | <p><a href="<?php echo ROOT_URL; ?>"><?php echo _('Info'); ?></a> | <?php echo _('Register'); ?> | <a href="<?php echo ROOT_URL; ?>squirrelmail/src/login.php" target="_blank"><?php echo _('Webmail-Login'); ?></a> |
<a href="/mail/manage_account.php">Manage account</a> | <a href="https://danwin1210.de:5281/conversejs" target="_blank" rel="noopener">Web-XMPP</a> <a href="<?php echo ROOT_URL; ?>manage_account.php"><?php echo _('Manage account'); ?></a> | <a href="<?php echo WEB_XMPP_URL; ?>" target="_blank" rel="noopener"><?php echo _('Web-XMPP'); ?></a>
</p> </p>
<?php echo "<p>$msg</p>"; ?> <?php echo "<p>$msg</p>"; ?>
<form class="form_limit" action="register.php" method="post"><input type="hidden" name="csrf_token" <form class="form_limit" action="register.php" method="post"><input type="hidden" name="csrf_token"
value="<?php echo $_SESSION[ 'csrf_token' ] ?>"> value="<?php echo $_SESSION[ 'csrf_token' ] ?>">
<div class="row"> <div class="row">
<div class="col"><label for="user">Username</label></div> <div class="col"><label for="user"><?php echo _('Username'); ?></label></div>
<div class="col"><input type="text" name="user" id="user" autocomplete="username" required <div class="col"><input type="text" name="user" id="user" autocomplete="username" required
value="<?php echo htmlspecialchars( $_POST[ 'user' ] ?? '' ); ?>"></div> value="<?php echo htmlspecialchars( $_POST[ 'user' ] ?? '' ); ?>"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="pwd">Password</label></div> <div class="col"><label for="pwd"><?php echo _('Password'); ?></label></div>
<div class="col"><input type="password" name="pwd" id="pwd" autocomplete="new-password" required></div> <div class="col"><input type="password" name="pwd" id="pwd" autocomplete="new-password" required></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="pwd2">Password again</label></div> <div class="col"><label for="pwd2"><?php echo _('Password again'); ?></label></div>
<div class="col"><input type="password" name="pwd2" id="pwd2" autocomplete="new-password" required></div> <div class="col"><input type="password" name="pwd2" id="pwd2" autocomplete="new-password" required></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><label for="accept_privacy">I have read and agreed to the <a href="/privacy.php" <div class="col"><label for="accept_privacy"><?php echo _('I have read and agreed to the <a href="%s" target="_blank">Privacy Policy</a>', PRIVACY_POLICY_URL); ?></label>
target="_blank">Privacy Policy</a></label>
</div> </div>
<div class="col"><input type="checkbox" id="accept_privacy" name="accept_privacy" required></div> <div class="col"><input type="checkbox" id="accept_privacy" name="accept_privacy" required></div>
</div> </div>
<?php send_captcha(); ?> <?php send_captcha(); ?>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button type="submit">Register</button> <button type="submit"><?php echo _('Register'); ?></button>
</div> </div>
</div> </div>
</form> </form>