Merge branch 'staging' into nightly
This commit is contained in:
commit
cf5fa96a93
@ -307,12 +307,29 @@ namespace {
|
|||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Get SOGo IPv6 from Dig
|
||||||
|
SOGO_V6=$(dig +answer sogo AAAA +short)
|
||||||
|
|
||||||
|
if [ $SOGO_V6 ]; then
|
||||||
|
cat <<EOF > /etc/dovecot/sogo_trusted_ip.conf
|
||||||
|
# Autogenerated by mailcow
|
||||||
|
remote ${IPV4_NETWORK}.248 {
|
||||||
|
disable_plaintext_auth = no
|
||||||
|
}
|
||||||
|
|
||||||
|
remote ${SOGO_V6} {
|
||||||
|
disable_plaintext_auth = no
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
else
|
||||||
cat <<EOF > /etc/dovecot/sogo_trusted_ip.conf
|
cat <<EOF > /etc/dovecot/sogo_trusted_ip.conf
|
||||||
# Autogenerated by mailcow
|
# Autogenerated by mailcow
|
||||||
remote ${IPV4_NETWORK}.248 {
|
remote ${IPV4_NETWORK}.248 {
|
||||||
disable_plaintext_auth = no
|
disable_plaintext_auth = no
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
# Create random master Password for SOGo SSO
|
# Create random master Password for SOGo SSO
|
||||||
RAND_PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1)
|
RAND_PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1)
|
||||||
|
@ -2,7 +2,7 @@ FROM debian:bullseye-slim
|
|||||||
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
ARG SOGO_DEBIAN_REPOSITORY=http://packages.inverse.ca/SOGo/nightly/5/debian/
|
ARG SOGO_DEBIAN_REPOSITORY=http://packages.sogo.nu/nightly/5/debian/
|
||||||
ENV LC_ALL C
|
ENV LC_ALL C
|
||||||
ENV GOSU_VERSION 1.14
|
ENV GOSU_VERSION 1.14
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \
|
|||||||
&& gosu nobody true \
|
&& gosu nobody true \
|
||||||
&& mkdir /usr/share/doc/sogo \
|
&& mkdir /usr/share/doc/sogo \
|
||||||
&& touch /usr/share/doc/sogo/empty.sh \
|
&& touch /usr/share/doc/sogo/empty.sh \
|
||||||
&& apt-key adv --keyserver keyserver.ubuntu.com --recv-key 0x810273C4 \
|
&& apt-key adv --keyserver keys.openpgp.org --recv-key 74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9 \
|
||||||
&& echo "deb ${SOGO_DEBIAN_REPOSITORY} bullseye bullseye" > /etc/apt/sources.list.d/sogo.list \
|
&& echo "deb ${SOGO_DEBIAN_REPOSITORY} bullseye bullseye" > /etc/apt/sources.list.d/sogo.list \
|
||||||
&& apt-get update && apt-get install -y --no-install-recommends \
|
&& apt-get update && apt-get install -y --no-install-recommends \
|
||||||
sogo \
|
sogo \
|
||||||
@ -52,4 +52,4 @@ RUN chmod +x /bootstrap-sogo.sh \
|
|||||||
|
|
||||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
|
|
||||||
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
@ -938,13 +938,16 @@ function check_login($user, $pass, $app_passwd_data = false) {
|
|||||||
$stmt->execute(array(':user' => $user));
|
$stmt->execute(array(':user' => $user));
|
||||||
$rows = array_merge($rows, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
$rows = array_merge($rows, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
}
|
}
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
// verify password
|
// verify password
|
||||||
if ($app_passwd_data['eas'] !== true && $app_passwd_data['dav'] !== true){
|
if (verify_hash($row['password'], $pass) !== false) {
|
||||||
if (verify_hash($row['password'], $pass) !== false) {
|
if (!array_key_exists("app_passwd_id", $row)){
|
||||||
|
// password is not a app password
|
||||||
// check for tfa authenticators
|
// check for tfa authenticators
|
||||||
$authenticators = get_tfa($user);
|
$authenticators = get_tfa($user);
|
||||||
if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0) {
|
if (isset($authenticators['additional']) && is_array($authenticators['additional']) && count($authenticators['additional']) > 0 &&
|
||||||
|
$app_passwd_data['eas'] !== true && $app_passwd_data['dav'] !== true) {
|
||||||
|
// authenticators found, init TFA flow
|
||||||
$_SESSION['pending_mailcow_cc_username'] = $user;
|
$_SESSION['pending_mailcow_cc_username'] = $user;
|
||||||
$_SESSION['pending_mailcow_cc_role'] = "user";
|
$_SESSION['pending_mailcow_cc_role'] = "user";
|
||||||
$_SESSION['pending_tfa_methods'] = $authenticators['additional'];
|
$_SESSION['pending_tfa_methods'] = $authenticators['additional'];
|
||||||
@ -955,7 +958,8 @@ function check_login($user, $pass, $app_passwd_data = false) {
|
|||||||
'msg' => array('logged_in_as', $user)
|
'msg' => array('logged_in_as', $user)
|
||||||
);
|
);
|
||||||
return "pending";
|
return "pending";
|
||||||
} else {
|
} else if (!isset($authenticators['additional']) || !is_array($authenticators['additional']) || count($authenticators['additional']) == 0) {
|
||||||
|
// no authenticators found, login successfull
|
||||||
// Reactivate TFA if it was set to "deactivate TFA for next login"
|
// Reactivate TFA if it was set to "deactivate TFA for next login"
|
||||||
$stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
|
$stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
|
||||||
$stmt->execute(array(':user' => $user));
|
$stmt->execute(array(':user' => $user));
|
||||||
@ -963,22 +967,19 @@ function check_login($user, $pass, $app_passwd_data = false) {
|
|||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
return "user";
|
return "user";
|
||||||
}
|
}
|
||||||
}
|
} elseif ($app_passwd_data['eas'] === true || $app_passwd_data['dav'] === true) {
|
||||||
} elseif ($app_passwd_data['eas'] === true || $app_passwd_data['dav'] === true) {
|
// password is a app password
|
||||||
if (array_key_exists("app_passwd_id", $row)){
|
$service = ($app_passwd_data['eas'] === true) ? 'EAS' : 'DAV';
|
||||||
if (verify_hash($row['password'], $pass) !== false) {
|
$stmt = $pdo->prepare("REPLACE INTO sasl_log (`service`, `app_password`, `username`, `real_rip`) VALUES (:service, :app_id, :username, :remote_addr)");
|
||||||
$service = ($app_passwd_data['eas'] === true) ? 'EAS' : 'DAV';
|
$stmt->execute(array(
|
||||||
$stmt = $pdo->prepare("REPLACE INTO sasl_log (`service`, `app_password`, `username`, `real_rip`) VALUES (:service, :app_id, :username, :remote_addr)");
|
':service' => $service,
|
||||||
$stmt->execute(array(
|
':app_id' => $row['app_passwd_id'],
|
||||||
':service' => $service,
|
':username' => $user,
|
||||||
':app_id' => $row['app_passwd_id'],
|
':remote_addr' => ($_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'])
|
||||||
':username' => $user,
|
));
|
||||||
':remote_addr' => ($_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'])
|
|
||||||
));
|
|
||||||
|
|
||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
return "user";
|
return "user";
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,7 @@ $AVAILABLE_LANGUAGES = array(
|
|||||||
'ru' => 'Pусский (Russian)',
|
'ru' => 'Pусский (Russian)',
|
||||||
'sk' => 'Slovenčina (Slovak)',
|
'sk' => 'Slovenčina (Slovak)',
|
||||||
'sv' => 'Svenska (Swedish)',
|
'sv' => 'Svenska (Swedish)',
|
||||||
|
'tr' => 'Türkçe (Turkish)',
|
||||||
'uk' => 'Українська (Ukrainian)',
|
'uk' => 'Українська (Ukrainian)',
|
||||||
'zh' => '中文 (Chinese)'
|
'zh' => '中文 (Chinese)'
|
||||||
);
|
);
|
||||||
|
@ -839,7 +839,7 @@
|
|||||||
"confirm_delete": "Potvrdit smazání prvku.",
|
"confirm_delete": "Potvrdit smazání prvku.",
|
||||||
"danger": "Nebezpečí",
|
"danger": "Nebezpečí",
|
||||||
"deliver_inbox": "Doručit do schránky",
|
"deliver_inbox": "Doručit do schránky",
|
||||||
"disabled_by_config": "Funkce karanténa je momentálně vypnuta v nastavení systému.",
|
"disabled_by_config": "Funkce karanténa je momentálně vypnuta v nastavení systému. Nastavte, prosím, prvkům karantény hodnoty \"počet zadržených zpráv\" a \"maximální velikost\".",
|
||||||
"download_eml": "Stáhnout (.eml)",
|
"download_eml": "Stáhnout (.eml)",
|
||||||
"empty": "Žádné výsledky",
|
"empty": "Žádné výsledky",
|
||||||
"high_danger": "Vysoké nebezpečí",
|
"high_danger": "Vysoké nebezpečí",
|
||||||
|
@ -102,7 +102,8 @@
|
|||||||
"timeout2": "Délai d'expiration pour la connexion à l'hôte local",
|
"timeout2": "Délai d'expiration pour la connexion à l'hôte local",
|
||||||
"username": "Nom d'utilisateur",
|
"username": "Nom d'utilisateur",
|
||||||
"validate": "Valider",
|
"validate": "Valider",
|
||||||
"validation_success": "Validation réussie"
|
"validation_success": "Validation réussie",
|
||||||
|
"bcc_dest_format": "La destination Cci doit être une seule adresse e-mail valide.<br>Si vous avez besoin d'envoyer une copie à plusieurs adresses, créez un alias et utilisez-le ici."
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"access": "Accès",
|
"access": "Accès",
|
||||||
@ -322,7 +323,9 @@
|
|||||||
"yes": "✓",
|
"yes": "✓",
|
||||||
"api_read_write": "Accès Lecture-Écriture",
|
"api_read_write": "Accès Lecture-Écriture",
|
||||||
"oauth2_add_client": "Ajouter un client OAuth2",
|
"oauth2_add_client": "Ajouter un client OAuth2",
|
||||||
"password_policy": "Politique de mots de passe"
|
"password_policy": "Politique de mots de passe",
|
||||||
|
"admins": "Administrateurs",
|
||||||
|
"api_read_only": "Accès lecture-seule"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Accès refusé ou données de formulaire non valides",
|
"access_denied": "Accès refusé ou données de formulaire non valides",
|
||||||
|
@ -973,7 +973,8 @@
|
|||||||
"verified_fido2_login": "Verified FIDO2 login",
|
"verified_fido2_login": "Verified FIDO2 login",
|
||||||
"verified_totp_login": "Verified TOTP login",
|
"verified_totp_login": "Verified TOTP login",
|
||||||
"verified_webauthn_login": "Verified WebAuthn login",
|
"verified_webauthn_login": "Verified WebAuthn login",
|
||||||
"verified_yotp_login": "Verified Yubico OTP login"
|
"verified_yotp_login": "Verified Yubico OTP login",
|
||||||
|
"domain_add_dkim_available": "Esisteva già una chiave DKIM"
|
||||||
},
|
},
|
||||||
"tfa": {
|
"tfa": {
|
||||||
"api_register": "%s usa le API Yubico Cloud. Richiedi una chiave API <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">qui</a>",
|
"api_register": "%s usa le API Yubico Cloud. Richiedi una chiave API <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">qui</a>",
|
||||||
|
@ -979,7 +979,8 @@
|
|||||||
"verified_totp_login": "Autentificarea TOTP verificată",
|
"verified_totp_login": "Autentificarea TOTP verificată",
|
||||||
"verified_webauthn_login": "Autentificarea WebAuthn verificată",
|
"verified_webauthn_login": "Autentificarea WebAuthn verificată",
|
||||||
"verified_fido2_login": "Conectare FIDO2 verificată",
|
"verified_fido2_login": "Conectare FIDO2 verificată",
|
||||||
"verified_yotp_login": "Autentificarea Yubico OTP verificată"
|
"verified_yotp_login": "Autentificarea Yubico OTP verificată",
|
||||||
|
"domain_add_dkim_available": "O cheie DKIM deja a existat"
|
||||||
},
|
},
|
||||||
"tfa": {
|
"tfa": {
|
||||||
"api_register": "%s utilizează API-ul Yubico Cloud. Obțineți o cheie API pentru cheia dvs. de <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">aici</a>",
|
"api_register": "%s utilizează API-ul Yubico Cloud. Obțineți o cheie API pentru cheia dvs. de <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">aici</a>",
|
||||||
@ -990,7 +991,7 @@
|
|||||||
"enter_qr_code": "Codul tău TOTP dacă dispozitivul tău nu poate scana codurile QR",
|
"enter_qr_code": "Codul tău TOTP dacă dispozitivul tău nu poate scana codurile QR",
|
||||||
"error_code": "Cod de eroare",
|
"error_code": "Cod de eroare",
|
||||||
"init_webauthn": "Inițializare, vă rugăm așteptați...",
|
"init_webauthn": "Inițializare, vă rugăm așteptați...",
|
||||||
"key_id": "Un identificator pentru YubiKey",
|
"key_id": "Un identificator pentru dispozitiv",
|
||||||
"key_id_totp": "Un identificator pentru cheia ta",
|
"key_id_totp": "Un identificator pentru cheia ta",
|
||||||
"none": "Dezactivează",
|
"none": "Dezactivează",
|
||||||
"reload_retry": "- (reîncărcați browserul dacă eroarea persistă)",
|
"reload_retry": "- (reîncărcați browserul dacă eroarea persistă)",
|
||||||
|
85
data/web/lang/lang.tr.json
Normal file
85
data/web/lang/lang.tr.json
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"acl": {
|
||||||
|
"alias_domains": "Takma alan adı ekle",
|
||||||
|
"app_passwds": "Uygulama şifrelerini yönet",
|
||||||
|
"delimiter_action": "Sınırlama işlemi",
|
||||||
|
"domain_relayhost": "Bir alan adı için relayhost sunucusunu değiştir",
|
||||||
|
"eas_reset": "EAS cihazlarını sıfırla",
|
||||||
|
"mailbox_relayhost": "Bir posta kutusunun relayhost sunucularını değiştir",
|
||||||
|
"pushover": "Bildirim",
|
||||||
|
"quarantine": "Karantina işlemleri",
|
||||||
|
"quarantine_attachments": "Ekleri karantinaya al",
|
||||||
|
"quarantine_notification": "Karantina bildirimlerini değiştir",
|
||||||
|
"smtp_ip_access": "SMTP sunucularının değiştirilmesine izin ver",
|
||||||
|
"sogo_access": "SOGo erişiminin yönetilmesine izin ver",
|
||||||
|
"domain_desc": "Alan adı açıklamasını değiştir",
|
||||||
|
"extend_sender_acl": "Gönderenin acl'sini harici adreslere göre genişletmeye izin ver",
|
||||||
|
"spam_policy": "Engellenenler / İzin verilenler"
|
||||||
|
},
|
||||||
|
"add": {
|
||||||
|
"activate_filter_warn": "Aktif edilirse diğer tüm filtreler devre dışı bırakılacak.",
|
||||||
|
"add_domain_only": "Sadece alan adı ekle",
|
||||||
|
"alias_address": "Takma ad adres(leri)",
|
||||||
|
"alias_domain": "Takma alan adı",
|
||||||
|
"alias_domain_info": "<small>Sadece geçerli alan adları (virgülle ayırın).</small>",
|
||||||
|
"backup_mx_options": "İletme ayarları",
|
||||||
|
"delete2": "Kaynakta olmayan hedefteki mesajları sil",
|
||||||
|
"delete2duplicates": "Hedefteki kopyaları sil",
|
||||||
|
"disable_login": "Giriş yapmaya izin verme ( Gelen mailler yine de kabul edilir)",
|
||||||
|
"domain": "Alan adı",
|
||||||
|
"domain_matches_hostname": "Alan adı %s ana bilgisayar adıyla eşleşiyor",
|
||||||
|
"add_domain_restart": "Alan adı ekleyin ve SOGo'yu yeniden başlatın",
|
||||||
|
"alias_address_info": "<small>Bir alan adına ilişkin tüm iletileri yakalamak için tam e-posta adresi veya @example.com olacak şeklinde girin (virgülle ayırın).<b>sadece mailcow alan adları</b>.</small>",
|
||||||
|
"domain_quota_m": "Toplam alan adı kotası (MiB)",
|
||||||
|
"generate": "oluştur",
|
||||||
|
"goto_ham": "Ham olarak<span class=\"text-success\"><b>işaretle</b></span>",
|
||||||
|
"goto_null": "Postaları sessizce çöpe at",
|
||||||
|
"goto_spam": "Spam olarak<span class=\"text-danger\"><b>işaretle</b></span>",
|
||||||
|
"hostname": "Ana sunucu",
|
||||||
|
"kind": "Tür",
|
||||||
|
"mailbox_quota_m": "Posta kutusu başına maksimum kota (MiB)",
|
||||||
|
"max_aliases": "Maksimum olası takma adı",
|
||||||
|
"max_mailboxes": "Maksimum olası posta kutusu",
|
||||||
|
"nexthop": "Sonraki atlama",
|
||||||
|
"port": "Port",
|
||||||
|
"public_comment": "Genel yorum",
|
||||||
|
"relay_all": "Tüm alıcılara ilet",
|
||||||
|
"relay_all_info": "Eğer <b>hiçbir</b> alıcıya iletilmemesini seçerseniz, aktarılması gereken her alıcı için bir (\"kör\") posta kutusu eklemeniz gerekecektir.",
|
||||||
|
"relay_domain": "Bu alan adını ilet",
|
||||||
|
"relay_transport_info": "<div class=\"label label-info\">Bilgi</div> Bu etki alanı için özel bir hedef için aktarım eşlemeleri tanımlayabilirsiniz. Ayarlanmazsa, bir MX araması yapılacaktır.",
|
||||||
|
"relay_unknown_only": "Yalnızca mevcut olmayan posta kutularını ilet. Mevcut posta kutuları yerel olarak teslim edilecektir.",
|
||||||
|
"relayhost_wrapped_tls_info": "Lütfen TLS ile örtülmüş portları <b> kullanmayın</b> (çoğu 465 portunda çalışır).<br>\nÖrtülmemiş port kullan ve STARTTLS üzerinden yayınla. TLS'yi zorlamak için bir TLS ilkesi \"TLS ilke eşlemeleri\" sayfası içinde oluşturulabilir.",
|
||||||
|
"skipcrossduplicates": "Klasörler arasında yinelenen mesajları atlayın (ilk mesaj seçilir)",
|
||||||
|
"target_address": "Adreslere git",
|
||||||
|
"target_address_info": "<small>Tam e-posta adres(leri) girin ( virgülle ayırın).</small>",
|
||||||
|
"target_domain": "Hedef alan adı",
|
||||||
|
"timeout1": "Uzak ana bilgisayara bağlantısı zaman aşımına uğradı",
|
||||||
|
"timeout2": "Yerel ana bilgisayara bağlantı zaman aşımına uğradı"
|
||||||
|
},
|
||||||
|
"admin": {
|
||||||
|
"action": "İşlem",
|
||||||
|
"add_forwarding_host": "Yönlendirme sunucusu ekle",
|
||||||
|
"add_transport": "İletim ekle",
|
||||||
|
"admin_details": "Yönetici detaylarını düzenle",
|
||||||
|
"admin_domains": "Alan adı atamaları",
|
||||||
|
"add_domain_admin": "Alan adı yöneticisi ekle",
|
||||||
|
"api_info": "API üzerinde çalışmalar devam etmektedir. Belgeler <a href=\"/api\">/api</a>adresinde bulunabilir",
|
||||||
|
"apps_name": "\"mailcow Uygulamaları\" adı",
|
||||||
|
"authed_user": "Yetkili kullanıcı",
|
||||||
|
"ban_list_info": "Aşağıdaki yasaklı IP'lerin listesine bakın: <b>ağ (kalan yasak süresi) - [işlemler]</b>.<br />Yasağı kaldırılmak üzere sıraya alınan IP'ler birkaç saniye içinde aktif yasak listesinden kaldırılacaktır.<br />Kırmızı etiketler, kara listeye alınarak aktif kalıcı yasakları gösterir.",
|
||||||
|
"configuration": "Yapılandırma",
|
||||||
|
"dkim_from_title": "Verilerin kopyalanacağı kaynak alan adı",
|
||||||
|
"dkim_to": "Kime",
|
||||||
|
"dkim_to_title": "Hedef alan ad(ları) üzerinde yazılacak",
|
||||||
|
"dkim_domains_wo_keys": "Eksik anahtarları olan alan adlarını seçin",
|
||||||
|
"domain": "Alan adı",
|
||||||
|
"domain_admin": "Alan adı yöneticisi",
|
||||||
|
"domain_admins": "Alan adı yöneticileri",
|
||||||
|
"domain_s": "Alan ad(ları)",
|
||||||
|
"duplicate": "Çift",
|
||||||
|
"duplicate_dkim": "Çift DKIM kayıtları",
|
||||||
|
"f2b_ban_time": "Yasaklama süresi (saniye)",
|
||||||
|
"f2b_max_attempts": "Maksimum giriş denemesi",
|
||||||
|
"f2b_retry_window": "Maksimum girişim için deneme pencere(leri)"
|
||||||
|
}
|
||||||
|
}
|
@ -168,7 +168,7 @@ services:
|
|||||||
- phpfpm
|
- phpfpm
|
||||||
|
|
||||||
sogo-mailcow:
|
sogo-mailcow:
|
||||||
image: mailcow/sogo:1.109
|
image: mailcow/sogo:1.110
|
||||||
environment:
|
environment:
|
||||||
- DBNAME=${DBNAME}
|
- DBNAME=${DBNAME}
|
||||||
- DBUSER=${DBUSER}
|
- DBUSER=${DBUSER}
|
||||||
|
Loading…
Reference in New Issue
Block a user