From 1bc0f0fa6b90ae0aff2e2d38f26b7fe087a68d4c Mon Sep 17 00:00:00 2001 From: JD Date: Sat, 30 Jan 2021 15:48:31 +0100 Subject: [PATCH 1/8] [Api docs] Add sogo_visible property to alias endpoints (#3956) --- data/web/api/openapi.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/web/api/openapi.yaml b/data/web/api/openapi.yaml index a14c47d8..3c8ef032 100644 --- a/data/web/api/openapi.yaml +++ b/data/web/api/openapi.yaml @@ -126,6 +126,9 @@ paths: goto_spam: description: learn as spam type: boolean + sogo_visible: + description: toggle visibility as selectable sender in SOGo + type: boolean type: object summary: Create alias /api/v1/add/app-passwd: @@ -2752,6 +2755,9 @@ paths: type: string public_comment: type: string + sogo_visible: + description: toggle visibility as selectable sender in SOGo + type: boolean type: object items: description: contains list of aliases you want update From 0a0d9e873e6e1c3479f6158ec17cbc225c963ab8 Mon Sep 17 00:00:00 2001 From: ValdikSS Date: Sun, 31 Jan 2021 11:45:34 +0300 Subject: [PATCH 2/8] Use tmpfs for watchdog's /tmp, reduce disk writes (#3923) --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index cde626d9..b5d49a61 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -411,6 +411,8 @@ services: #command: /watchdog.sh dns: - ${IPV4_NETWORK:-172.22.1}.254 + tmpfs: + - /tmp volumes: - rspamd-vol-1:/var/lib/rspamd:z - mysql-socket-vol-1:/var/run/mysqld/:z From 0a102444fcb64cf9dedd8274cf1197ca201d0145 Mon Sep 17 00:00:00 2001 From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com> Date: Sun, 31 Jan 2021 10:56:47 +0200 Subject: [PATCH 3/8] [Rspamd] Add FUZZY_SPAM_MISMATCH (#3958) Remove score from FUZZY_HAM_MISMATCH --- data/conf/rspamd/local.d/composites.conf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/conf/rspamd/local.d/composites.conf b/data/conf/rspamd/local.d/composites.conf index 2fe2b489..ebd4f698 100644 --- a/data/conf/rspamd/local.d/composites.conf +++ b/data/conf/rspamd/local.d/composites.conf @@ -56,6 +56,9 @@ BOUNCE_FUZZY { } # Remove bayes ham if fuzzy denied FUZZY_HAM_MISMATCH { - expression = "(-FUZZY_DENIED | -MAILCOW_FUZZY_DENIED | -LOCAL_FUZZY_DENIED) & (^BAYES_HAM | ^NEURAL_HAM_LONG | ^NEURAL_HAM_SHORT)"; - score = 1.0; + expression = "( -FUZZY_DENIED | -MAILCOW_FUZZY_DENIED | -LOCAL_FUZZY_DENIED ) & ( ^BAYES_HAM | ^NEURAL_HAM_LONG | ^NEURAL_HAM_SHORT )" +} +# Remove bayes spam if local fuzzy white +FUZZY_SPAM_MISMATCH { + expression = "( -LOCAL_FUZZY_WHITE ) & ( ^BAYES_SPAM | ^NEURAL_SPAM_LONG | ^NEURAL_SPAM_SHORT )" } From a2783d44ad51d8204692c67bb5c2803aa75bd5e8 Mon Sep 17 00:00:00 2001 From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com> Date: Sun, 31 Jan 2021 10:58:08 +0200 Subject: [PATCH 4/8] [SOGo] Add custom favicon (#3957) * [SOGo] Add custom favicon * Update docker-compose.yml --- data/conf/sogo/custom-favicon.ico | Bin 0 -> 4887 bytes docker-compose.yml | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 data/conf/sogo/custom-favicon.ico diff --git a/data/conf/sogo/custom-favicon.ico b/data/conf/sogo/custom-favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d5cb322fc12975941b1a22ad47ecde580941f3c GIT binary patch literal 4887 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 JPDHLkV1mZOm*M~b literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml index b5d49a61..e7a9510e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -182,8 +182,9 @@ services: volumes: - ./data/conf/sogo/:/etc/sogo/:z - ./data/web/inc/init_db.inc.php:/init_db.inc.php:Z - - ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z + - ./data/conf/sogo/custom-favicon.ico:/usr/lib/GNUstep/SOGo/WebServerResources/img/sogo.ico:z - ./data/conf/sogo/custom-theme.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/theme.js:z + - ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z - mysql-socket-vol-1:/var/run/mysqld/:z - sogo-web-vol-1:/sogo_web:z - sogo-userdata-backup-vol-1:/sogo_backup:Z From 7ad07a8fddd2be6fb54d022c746c51b1e7098b56 Mon Sep 17 00:00:00 2001 From: myOmikron Date: Sun, 7 Feb 2021 00:16:27 +0100 Subject: [PATCH 5/8] Changed type of items parameter to list --- data/web/api/openapi.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/web/api/openapi.yaml b/data/web/api/openapi.yaml index 3c8ef032..38ca70c0 100644 --- a/data/web/api/openapi.yaml +++ b/data/web/api/openapi.yaml @@ -3035,7 +3035,8 @@ paths: - domain3.tld - "*" sogo_access: "1" - items: info@domain.tld + items: + - info@domain.tld properties: attr: properties: From c55baed20bdf1029342fb358e03c940c88c38133 Mon Sep 17 00:00:00 2001 From: guiguir68 Date: Mon, 8 Feb 2021 14:36:23 +0100 Subject: [PATCH 6/8] Added missing french parts, based on the english file --- data/web/lang/lang.fr.json | 77 ++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/data/web/lang/lang.fr.json b/data/web/lang/lang.fr.json index 94f86570..47ab0fdb 100644 --- a/data/web/lang/lang.fr.json +++ b/data/web/lang/lang.fr.json @@ -9,10 +9,12 @@ "filters": "Filtres", "login_as": "S'identifier en tant qu'utilisateur", "prohibited": "Interdit par les ACL", + "protocol_access": "Modifier le protocol d'acces", "pushover": "Pushover", "quarantine": "Actions de quarantaine", "quarantine_attachments": "Pièces jointes en quarantaine", "quarantine_notification": "Modifier la notification de quarantaine", + "quarantine_category": "Modifier la catégorie de la notification de quarantaine", "ratelimit": "Limite d'envoi", "recipient_maps": "Cartes destinataire", "smtp_ip_access": "Changer les hôtes autorisés pour SMTP", @@ -23,7 +25,8 @@ "spam_score": "Score SPAM", "syncjobs": "Tâches de synchronisation", "tls_policy": "Police TLS", - "unlimited_quota": "Quota illimité pour les boites de courriel" + "unlimited_quota": "Quota illimité pour les boites de courriel", + "domain_desc": "Modifier la description du domaine" }, "add": { "activate_filter_warn": "Tous les autres filtres seront désactivés, quand activé est coché.", @@ -31,7 +34,7 @@ "add": "Ajouter", "add_domain_only": "Ajouter uniquement le domaine", "add_domain_restart": "Ajouter le domaine et redémarrer SOGo", - "alias_address": "Alias d'adresse/s", + "alias_address": "Alias d'adresse(s)", "alias_address_info": "Adresse(s) courriel complète(s) ou @example.com, pour capturer tous les messages d'un domaine (séparées par des virgules). Seulement des domaines Mailcow.", "alias_domain": "Alias de domaine", "alias_domain_info": "Seulement des noms de domaines valides (séparés par des virgules).", @@ -136,6 +139,7 @@ "ban_list_info": "Consultez la liste des adresses IP interdites ci-dessous: réseau (durée d'interdiction restante) - [actions].
Les adresses IP mises en file d'attente pour être interdites seront supprimées de la liste d'interdiction active dans quelques secondes.
Les étiquettes rouges indiquent des interdictions permanentes actives par liste noire.", "change_logo": "Changer de logo", "configuration": "Configuration", + "convert_html_to_text": "Convertir le code HTML en texte brut", "credentials_transport_warning": "Attention: L’ajout d’une nouvelle entrée de carte de transport mettra à jour les informations d’identification pour toutes les entrées avec une colonne nexthop correspondante.", "customer_id": "ID client", "customize": "Personnaliser", @@ -156,20 +160,23 @@ "dkim_to": "Vers", "dkim_to_title": "Les domaines ciblés seront réécrits", "domain": "Domaine", + "domain_admin": "Administrateur de domaine", "domain_admins": "Administrateurs de domaine", - "domain_s": "Domaine/s", + "domain_s": "Domaine(s)", "duplicate": "Dupliquer", "duplicate_dkim": "Dupliquer l'enregistrement DKIM", "edit": "Editer", "empty": "Aucun résultat", "excludes": "Exclure ces destinataires", - "f2b_ban_time": "Durée du bannissement (s)", + "f2b_ban_time": "Durée du bannissement(s)", "f2b_blacklist": "Réseaux/Domaines sur Liste Noire", + "f2b_filter": "Filtre(s) Regex", "f2b_list_info": "Un hôte ou un réseau sur liste noire l'emportera toujours sur une entité de liste blanche. L'application des mises à jour de liste prendra quelques secondes.", "f2b_max_attempts": "Nb max. de tentatives", "f2b_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)", "f2b_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)", "f2b_parameters": "Paramètres Fail2ban", + "f2b_regex_info": "Logs pris en compte: SOGo, Postfix, Dovecot, PHP-FPM.", "f2b_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives", "f2b_whitelist": "Réseaux/hôtes en liste blanche", "filter_table": "Table de filtrage", @@ -184,6 +191,7 @@ "hash_remove_info": "La suppression d'un hachage ratelimit (s'il existe toujours) réinitialisera complètement son compteur.
\r\n Chaque hachage est indiqué par une couleur individuelle.", "help_text": "Remplacer le texte d'aide sous le masque de connexion (HTML autorisé)", "host": "Hôte", + "html": "HTML", "import": "Importer", "import_private_key": "Importer la clè privée", "in_use_by": "Utilisé par", @@ -212,6 +220,7 @@ "oauth2_redirect_uri": "URI de redirection", "oauth2_renew_secret": "Générer un nouveau secret client", "oauth2_revoke_tokens": "Révoquer tous les jetons", + "optional": "Optionnel", "password": "Mot de passe", "password_repeat": "Confirmation du mot de passe (répéter)", "priority": "Priorité", @@ -221,6 +230,7 @@ "quarantine_exclude_domains": "Exclure les domaines et les alias de domaine", "quarantine_max_age": "Âge maximun en jour(s)
La valeur doit être égale ou supérieure à 1 jour.", "quarantine_max_size": "Taille maximum en Mo (les éléments plus grands sont mis au rebut):
0 ne signifie pas illimité.", + "quarantine_max_score": "Ignorer la notification si le score de spam est au dessus de cette valeur:
Par défaut: 9999.0", "quarantine_notification_html": "Modèle de courriel de notification:
Laisser vide pour restaurer le modèle par défaut.", "quarantine_notification_sender": "Notification par e-mail de l’expéditeur", "quarantine_notification_subject": "Objet du courriel de notification", @@ -397,6 +407,7 @@ "redis_error": "Erreur Redis: %s", "relayhost_invalid": "La saisie de la carte %s est invalide", "release_send_failed": "Le message n’a pas pu être diffusé: %s", + "reset_f2b_regex": "Le filtre regex n'a pas pu être réinitialisé à temps, veuillez réessayer ou attendre quelques secondes de plus et recharger le site web.", "resource_invalid": "Le nom de la resource %s n'est pas valide", "rl_timeframe": "Le délai limite du taux est incorrect", "rspamd_ui_pw_length": "Le mot de passe de l'interface Rspamd doit être de 6 caratères au minimum", @@ -412,19 +423,21 @@ "targetd_relay_domain": "Le domaine cible %s est un domaine de relais", "temp_error": "Erreur temporaire", "text_empty": "La zone texte ne peut pas être vide", + "tfa_token_invalid": "Le token TFA est invalide", "tls_policy_map_dest_invalid": "La politique de destination n'est pas valide", "tls_policy_map_entry_exists": "Une entrée de carte de politique \"%s\" existe", "tls_policy_map_parameter_invalid": "Le paramètre Policy est invalide", "totp_verification_failed": "Echec de la vérification TOTP", "transport_dest_exists": "La destination de transport \"%s\" existe", "u2f_verification_failed": "Echec de la vérification U2F: %s", + "fido2_verification_failed": "La vérification FIDO2 a échoué: %s", "unknown": "Une erreur inconnue est survenue", "unknown_tfa_method": "Methode TFA inconnue", "unlimited_quota_acl": "Quota illimité interdit par les ACL", "username_invalid": "Le nom d'utilisateur %s ne peut pas être utilisé", "validity_missing": "Veuillez attribuer une période de validité", "value_missing": "Veuillez fournir toutes les valeurs", - "yotp_verification_failed": "La vérification Yubico OTP en échec: %s" + "yotp_verification_failed": "La vérification Yubico OTP a échoué: %s" }, "debug": { "chart_this_server": "Graphique (ce serveur)", @@ -452,6 +465,7 @@ "cname_from_a": "Valeur dérivée de l’enregistrement A/AAAA. Ceci est supporté tant que l’enregistrement indique la bonne ressource.", "dns_records": "Enregistrements DNS", "dns_records_24hours": "Veuillez noter que les modifications apportées au DNS peuvent prendre jusqu’à 24 heures pour que leurs états actuels soient correctement reflétés sur cette page. Il est conçu comme un moyen pour vous de voir facilement comment configurer vos enregistrements DNS et de vérifier si tous vos enregistrements sont correctement stockés dans les DNS.", + "dns_records_docs": "Veuillez également consulter la documentation.", "dns_records_data": "Données correcte", "dns_records_name": "Nom", "dns_records_status": "Etat courant", @@ -464,6 +478,7 @@ "alias": "Editer les alias", "allow_from_smtp": "Restreindre l'utilisation de SMTP à ces adresses IP", "allow_from_smtp_info": "Laissez vide pour autoriser tous les expéditeurs.
Adresses IPv4/IPv6 et réseaux.", + "allowed_protocols": "Protocoles autorisés", "app_name": "Nom de l'application", "app_passwd": "Mot de passe de l'application", "automap": "Essayer d’automatiser les dossiers (\"Sent items\", \"Sent\" => \"Sent\" etc.)", @@ -550,7 +565,7 @@ "spam_score": "Définir un score spam personnalisé", "subfolder2": "Synchronisation dans le sous-dossier sur la destination
(vide = ne pas utiliser de sous-dossier)", "syncjob": "Modifier la tâche de synchronisation", - "target_address": "Adresse/s Goto(séparé/s par des virgules)", + "target_address": "Adresse(s) Goto(séparé(s) par des virgules)", "target_domain": "Domaine cible", "timeout1": "Délai de connexion à l’hôte distant", "timeout2": "Délai de connexion à l’hôte local", @@ -590,8 +605,10 @@ }, "login": { "delayed": "La connexion a été retardée de %s secondes.", + "fido2_webauthn": "FIDO2/WebAuthn", "login": "Connexion", "mobileconfig_info": "Veuillez vous connecter en tant qu’utilisateur de la boîte pour télécharger le profil de connexion Apple demandé.", + "other_logins": "Clé d'authentification", "password": "Mot de passe", "username": "Nom d'utilisateur" }, @@ -617,6 +634,7 @@ "aliases": "Aliases", "allow_from_smtp": "Restreindre l'utilisation de SMTP à ces adresses IP", "allow_from_smtp_info": "Laissez vide pour autoriser tous les expéditeurs.
Adresses IPv4/IPv6 et réseaux.", + "allowed_protocols": "Protocoles autorisés", "backup_mx": "Sauvegarde MX", "bcc": "BCC", "bcc_destination": "Destination BCC", @@ -666,6 +684,8 @@ "mailbox_defquota": "Taille de boîte par défaut", "mailbox_quota": "Taille max. d’une boîte", "mailboxes": "Boîtes mail", + "mailbox_defaults": "Paramètres par défaut", + "mailbox_defaults_info": "Définir les paramètres par défaut pour les nouvelles boîtes aux lettres.", "mins_interval": "Intervalle (min)", "msg_num": "Message #", "multiple_bookings": "Réservations multiples", @@ -676,7 +696,11 @@ "owner": "Propriétaire", "private_comment": "Commentaire privé", "public_comment": "Commentaire public", + "q_add_header": "Courriers indésirables", + "q_all": "Toutes les catégories", + "q_reject": "Rejecté", "quarantine_notification": "Avis de quarantaine", + "quarantine_category": "Catégorie de la notification de quarantaine", "quick_actions": "Actions", "recipient_map": "Carte du destinataire", "recipient_map_info": "Les cartes des destinataires sont utilisées pour remplacer l’adresse de destination d’un message avant sa livraison.", @@ -711,7 +735,7 @@ "table_size": "Taille de la table", "table_size_show_n": "Montrer %s articles", "target_address": "Goto adresse", - "target_domain": "Domain cible", + "target_domain": "Domaine cible", "tls_enforce_in": "Appliquer le TLS entrant", "tls_enforce_out": "Appliquer le TLS sortant", "tls_map_dest": "Destination", @@ -742,12 +766,16 @@ "action": "Action", "atts": "Pièces jointes", "check_hash": "Hachage du fichier de recherche @ VT", + "confirm": "Confirmer", "confirm_delete": "Confirmer la suppression de cet élément.", "danger": "Danger", + "deliver_inbox": "Envoyer dans la boîte de reception", "disabled_by_config": "La configuration actuelle du système désactive la fonctionnalité de quarantaine. Veuillez définir \"retentions par boîte\" et une \"taille maximum\" pour les éléments en quarantaine.", "download_eml": "Télécharger (.eml)", "empty": "Pas de résultat", "high_danger": "Haut", + "info": "Information", + "junk_folder": "Courriers indésirables", "learn_spam_delete": "Apprendre comme spam et supprimer", "low_danger": "Danger faible", "medium_danger": "Danger moyen", @@ -755,6 +783,7 @@ "notified": "Notifié", "qhandler_success": "Demande envoyée avec succès au système. Vous pouvez maintenant fermer la fenêtre.", "qid": "Rspamd QID", + "qinfo": "Le système de quarantaine enregistrera le courrier rejeté dans la base de données (l'expéditeur n'aura pas l'impression d'un courrier remis) ainsi que le courrier, qui est remis sous forme de copie dans le dossier indésirable d'une boîte aux lettres.\r\n
\"Apprendre comme spam et supprimer\" apprendra un message comme spam via le théorème Bayesianet calculera également des hachages flous pour refuser des messages similaires à l'avenir.\r\n
Veuillez noter que l'apprentissage de plusieurs messages peut prendre du temps, selon votre système.
Les éléments figurant sur la liste noire sont exclus de la quarantaine.", "qitem": "Élément de quarantaine", "quarantine": "Quarantaine", "quick_actions": "Actions", @@ -762,16 +791,21 @@ "received": "Reçu", "recipients": "Destinataires", "refresh": "Rafraîchir", + "rejected": "Rejeté", "release": "Libérer", "release_body": "Nous avons joint votre message comme fichier eml à ce message.", "release_subject": "Article de quarantaine potentiellement dommageable %s", "remove": "Enlever", + "rewrite_subject": "Réécrire le sujet", "rspamd_result": "Résultat Rspamd", "sender": "Expéditeur (SMTP)", "sender_header": "Expéditeur (\"From\" header)", + "type": "Type", "quick_release_link": "Ouvrir le lien de dégagement rapide", "quick_delete_link": "Ouvrir le lien de suppression rapide", + "quick_info_link": "Ouvrir le lien d'informations", "show_item": "Montrer l'article", + "spam": "Spam", "spam_score": "Score", "subj": "Sujet", "table_size": "Dimension de la table", @@ -859,6 +893,7 @@ "upload_success": "Fichier téléchargé avec succès", "verified_totp_login": "Authentification TOTP vérifiée", "verified_u2f_login": "Authentification U2F vérifiée", + "verified_fido2_login": "Authentification FIDO2 vérifiée", "verified_yotp_login": "Authentification Yubico OTP vérifiée" }, "tfa": { @@ -879,15 +914,30 @@ "set_tfa": "Définir une méthode d’authentification à deux facteurs", "start_u2f_validation": "Début de la validation", "tfa": "Authentification à deux facteurs", + "tfa_token_invalid": "Token TFA invalide", "totp": "OTP (One Time Password = Mot de passe à usage unique : Google Authenticator, Authy, etc.)", "u2f": "Authentification U2F", "waiting_usb_auth": "En attente d’un périphérique USB...

S’il vous plaît appuyez maintenant sur le bouton de votre périphérique USB U2F.", "waiting_usb_register": "En attente d’un périphérique USB...

Veuillez entrer votre mot de passe ci-dessus et confirmer votre inscription U2F en appuyant sur le bouton de votre périphérique USB U2F.", "yubi_otp": "Authentification OTP Yubico" }, + "fido2": { + "set_fn": "Définir un nom", + "fn": "Nom", + "rename": "renommer", + "confirm": "Confirmer", + "register_status": "Etat de l'enregistrement", + "known_ids": "Identifiant(s) connu(s)", + "none": "Désactivé", + "set_fido2": "Enregistrer un nouvel appareil FIDO2", + "start_fido2_validation": "Tester la validation FIDO2", + "fido2_auth": "Se connecter avec FIDO2", + "fido2_success": "L'appareil est enregistré avec succès", + "fido2_validation_failed": "La validation a échoué" + }, "user": { "action": "Action", - "active": "Active", + "active": "Actif", "active_sieve": "Filtre actif", "advanced_settings": "Paramètres avancés", "alias": "Alias", @@ -904,8 +954,8 @@ "app_name": "Nom d'application", "app_passwds": "Mots de passe de l'application", "apple_connection_profile": "Profil de connexion Apple", - "apple_connection_profile_complete": "Ce profil de connexion inclut les paramètres IMAP et SMTP ainsi que les chemins Caldav (calendriers) et Carddav (contacts) pour un appareil Apple." , - "apple_connection_profile_mailonly" : "Ce profil de connexion inclut les paramètres de configuration IMAP et SMTP pour un périphérique Apple.", + "apple_connection_profile_complete": "Ce profil de connexion inclut les paramètres IMAP et SMTP ainsi que les chemins Caldav (calendriers) et Carddav (contacts) pour un appareil Apple.", + "apple_connection_profile_mailonly": "Ce profil de connexion inclut les paramètres de configuration IMAP et SMTP pour un périphérique Apple.", "change_password": "Changer le mot de passe", "client_configuration": "Afficher les guides de configuration pour les clients de messagerie et les smartphones", "create_app_passwd": "Créer un mot de passe application", @@ -931,7 +981,7 @@ "hours": "heures", "in_use": "Utilisé", "interval": "Intervalle", - "is_catch_all": "Attrape-tout pour le domaine/s", + "is_catch_all": "Attrape-tout pour le domaine(s)", "last_mail_login": "Dernière connexion mail", "last_run": "Dernière exécution", "loading": "Chargement...", @@ -956,8 +1006,13 @@ "pushover_title": "Titre de la notification", "pushover_vars": "Lorsqu’aucun filtre d’expéditeur n’est défini, tous les messages seront considérés.
Les filtres Regex ainsi que les vérifications exactes de l’expéditeur peuvent être définis individuellement et seront considérés de façon séquentielle. Ils ne dépendent pas les uns des autres.
Variables utilisables pour le texte et le titre (veuillez prendre note des politiques de protection des données)", "pushover_verify": "Vérifier les justificatifs", + "q_add_header": "Courrier indésirable", + "q_all": "Toutes les catégories", + "q_reject": "Rejeté", "quarantine_notification": "Avis de quarantaine", + "quarantine_category": "Catégorie de la notification de quarantaine", "quarantine_notification_info": "Une fois qu’un avis a été envoyé, les articles seront marqués comme \"notified\" et aucune autre notification ne sera envoyée pour ce point particulier.", + "quarantine_category_info": "La catégorie de notification \"Rejeté\" inclut le courrier qui a été rejeté, tandis que \"Dossier indésirable\" informera un utilisateur des e-mails qui ont été placés dans le dossier indésirable.", "remove": "Enlever", "running": "En fonction", "save": "Sauvegarder les changements", From 32b6495ea31f990bbdef273776b9a156f45feee8 Mon Sep 17 00:00:00 2001 From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com> Date: Mon, 8 Feb 2021 16:09:23 +0200 Subject: [PATCH 7/8] [Dovecot] Add Russian and Ukrainian folders (#3967) Update dovecot.conf --- data/conf/dovecot/dovecot.conf | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index cef7de85..740e0e6c 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -130,6 +130,24 @@ namespace inbox { mailbox "Verwijderde items" { special_use = \Trash } + mailbox "Удаленные" { + special_use = \Trash + } + mailbox "Удаленные элементы" { + special_use = \Trash + } + mailbox "Корзина" { + special_use = \Trash + } + mailbox "Видалені" { + special_use = \Trash + } + mailbox "Видалені елементи" { + special_use = \Trash + } + mailbox "Кошик" { + special_use = \Trash + } mailbox "废件箱" { special_use = \Trash } @@ -167,6 +185,12 @@ namespace inbox { mailbox "归档" { special_use = \Archive } + mailbox "Архив" { + special_use = \Archive + } + mailbox "Архів" { + special_use = \Archive + } mailbox "Sent" { auto = subscribe special_use = \Sent @@ -186,6 +210,18 @@ namespace inbox { mailbox "已发送邮件" { special_use = \Sent } + mailbox "Отправленные" { + special_use = \Sent + } + mailbox "Отправленные элементы" { + special_use = \Sent + } + mailbox "Надіслані" { + special_use = \Sent + } + mailbox "Надіслані елементи" { + special_use = \Sent + } mailbox "Gesendet" { special_use = \Sent } @@ -235,6 +271,12 @@ namespace inbox { mailbox "草稿箱" { special_use = \Drafts } + mailbox "Черновики" { + special_use = \Drafts + } + mailbox "Чернетки" { + special_use = \Drafts + } mailbox "Junk" { auto = subscribe special_use = \Junk @@ -266,6 +308,15 @@ namespace inbox { mailbox "垃圾箱" { special_use = \Junk } + mailbox "Нежелательная почта" { + special_use = \Junk + } + mailbox "Спам" { + special_use = \Junk + } + mailbox "Небажана пошта" { + special_use = \Junk + } mailbox "Koncepty" { special_use = \Drafts } From 31805f165632f80f25ce3f2887bd9bda821771c8 Mon Sep 17 00:00:00 2001 From: Felix Kaechele Date: Thu, 11 Feb 2021 03:31:53 -0500 Subject: [PATCH 8/8] [Web] Implement all supported dovecot password schemas (#3974) When migrating from other Dovecot based installations it can be very convenient to just copy over existing hashed passwords. However, mailcow currently only supports a limited number of password schemes. This commit implements all password schemes that do not require challenge/response or OTP mechanisms. A convenient way to generate the regex with all supported schemas is `docker-compose exec dovecot-mailcow doveadm pw -l | awk -F' ' '{printf "/^{("; for(i=1;i<=NF-1;i++){printf "%s%s", sep, $i; sep="|"}; printf ")}/i\n"}'` Note that this will also include unsupported challenge/response and OTP schemas. Furthermore this increases the vsz_limit for the dovecot auth service to 2G for the use of ARGON2I and ARGON2ID schemas. Signed-off-by: Felix Kaechele --- data/conf/dovecot/dovecot.conf | 1 + data/web/inc/functions.inc.php | 155 ++++++++++++++----------- data/web/inc/functions.mailbox.inc.php | 4 +- 3 files changed, 90 insertions(+), 70 deletions(-) diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index 740e0e6c..f826eb46 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -382,6 +382,7 @@ service auth { mode = 0600 user = vmail } + vsz_limit = 2G } service managesieve-login { inet_listener sieve { diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index e3f28822..36bd3e9e 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -483,75 +483,94 @@ function alertbox_log_parser($_data){ } return false; } -function verify_hash($hash, $password) { - if (preg_match('/^{SSHA256}/i', $hash)) { - // Remove tag if any - $hash = preg_replace('/^{SSHA256}/i', '', $hash); - // Decode hash - $dhash = base64_decode($hash); - // Get first 32 bytes of binary which equals a SHA256 hash - $ohash = substr($dhash, 0, 32); - // Remove SHA256 hash from decoded hash to get original salt string - $osalt = str_replace($ohash, '', $dhash); - // Check single salted SHA256 hash against extracted hash - if (hash_equals(hash('sha256', $password . $osalt, true), $ohash)) { - return true; - } +function verify_salted_hash($hash, $password, $algo, $salt_length) +{ + // Decode hash + $dhash = base64_decode($hash); + // Get first 20 bytes of binary which equals a SSHA hash + $ohash = substr($dhash, 0, $salt_length); + // Remove SSHA hash from decoded hash to get original salt string + $osalt = str_replace($ohash, '', $dhash); + // Check single salted SSHA hash against extracted hash + if (hash_equals(hash($algo, $password . $osalt, true), $ohash)) { + return true; } - elseif (preg_match('/^{SSHA}/i', $hash)) { - // Remove tag if any - $hash = preg_replace('/^{SSHA}/i', '', $hash); - // Decode hash - $dhash = base64_decode($hash); - // Get first 20 bytes of binary which equals a SSHA hash - $ohash = substr($dhash, 0, 20); - // Remove SSHA hash from decoded hash to get original salt string - $osalt = str_replace($ohash, '', $dhash); - // Check single salted SSHA hash against extracted hash - if (hash_equals(hash('sha1', $password . $osalt, true), $ohash)) { - return true; - } - } - elseif (preg_match('/^{PLAIN-MD5}/i', $hash)) { - $hash = preg_replace('/^{PLAIN-MD5}/i', '', $hash); - if (md5($password) == $hash) { - return true; - } - } - elseif (preg_match('/^{SHA512-CRYPT}/i', $hash)) { - // Remove tag if any - $hash = preg_replace('/^{SHA512-CRYPT}/i', '', $hash); - // Decode hash - preg_match('/\\$6\\$(.*)\\$(.*)/i', $hash, $hash_array); - $osalt = $hash_array[1]; - $ohash = $hash_array[2]; - if (hash_equals(crypt($password, '$6$' . $osalt . '$'), $hash)) { - return true; - } - } - elseif (preg_match('/^{SSHA512}/i', $hash)) { - $hash = preg_replace('/^{SSHA512}/i', '', $hash); - // Decode hash - $dhash = base64_decode($hash); - // Get first 64 bytes of binary which equals a SHA512 hash - $ohash = substr($dhash, 0, 64); - // Remove SHA512 hash from decoded hash to get original salt string - $osalt = str_replace($ohash, '', $dhash); - // Check single salted SHA512 hash against extracted hash - if (hash_equals(hash('sha512', $password . $osalt, true), $ohash)) { - return true; - } - } - elseif (preg_match('/^{MD5-CRYPT}/i', $hash)) { - $hash = preg_replace('/^{MD5-CRYPT}/i', '', $hash); - if (password_verify($password, $hash)) { - return true; - } - } - elseif (preg_match('/^{BLF-CRYPT}/i', $hash)) { - $hash = preg_replace('/^{BLF-CRYPT}/i', '', $hash); - if (password_verify($password, $hash)) { - return true; + return false; +} + +function verify_hash($hash, $password) +{ + if (preg_match('/^{(.+)}(.+)/i', $hash, $hash_array)) { + $scheme = strtoupper($hash_array[1]); + $hash = $hash_array[2]; + switch ($scheme) { + case "ARGON2I": + case "ARGON2ID": + case "BLF-CRYPT": + case "CRYPT": + case "DES-CRYPT": + case "MD5-CRYPT": + case "MD5": + case "SHA256-CRYPT": + case "SHA512-CRYPT": + return password_verify($password, $hash); + + case "CLEAR": + case "CLEARTEXT": + case "PLAIN": + return $password == $hash; + + case "LDAP-MD5": + $hash = base64_decode($hash); + return hash_equals(hash('md5', $password, true), $hash); + + case "PBKDF2": + $components = explode('$', $hash); + $salt = $components[2]; + $rounds = $components[3]; + $hash = $components[4]; + return hash_equals(hash_pbkdf2('sha1', $password, $salt, $rounds), $hash); + + case "PLAIN-MD4": + return hash_equals(hash('md4', $password), $hash); + + case "PLAIN-MD5": + return md5($password) == $hash; + + case "PLAIN-TRUNC": + $components = explode('-', $hash); + if (count($components) > 1) { + $trunc_len = $components[0]; + $trunc_password = $components[1]; + + return substr($password, 0, $trunc_len) == $trunc_password; + } else { + return $password == $hash; + } + + case "SHA": + case "SHA1": + case "SHA256": + case "SHA512": + // SHA is an alias for SHA1 + $scheme = $scheme == "SHA" ? "sha1" : strtolower($scheme); + $hash = base64_decode($hash); + return hash_equals(hash($scheme, $password, true), $hash); + + case "SMD5": + return verify_salted_hash($hash, $password, 'md5', 16); + + case "SSHA": + return verify_salted_hash($hash, $password, 'sha1', 20); + + case "SSHA256": + return verify_salted_hash($hash, $password, 'sha256', 32); + + case "SSHA512": + return verify_salted_hash($hash, $password, 'sha512', 64); + + default: + return false; } } return false; diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index fff41900..c724ffac 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -1055,7 +1055,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return false; } // support pre hashed passwords - if (preg_match('/^({SSHA256}|{SSHA}|{SHA512-CRYPT}|{SSHA512}|{MD5-CRYPT}|{PLAIN-MD5})/i', $password)) { + if (preg_match('/^{(ARGON2I|ARGON2ID|BLF-CRYPT|CLEAR|CLEARTEXT|CRYPT|DES-CRYPT|LDAP-MD5|MD5|MD5-CRYPT|PBKDF2|PLAIN|PLAIN-MD4|PLAIN-MD5|PLAIN-TRUNC|PLAIN-TRUNC|SHA|SHA1|SHA256|SHA256-CRYPT|SHA512|SHA512-CRYPT|SMD5|SSHA|SSHA256|SSHA512)}/i', $password)) { $password_hashed = $password; } else { @@ -2557,7 +2557,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { continue; } // support pre hashed passwords - if (preg_match('/^({SSHA256}|{SSHA}|{SHA512-CRYPT}|{SSHA512}|{MD5-CRYPT}|{PLAIN-MD5})/i', $password)) { + if (preg_match('/^{(ARGON2I|ARGON2ID|BLF-CRYPT|CLEAR|CLEARTEXT|CRYPT|DES-CRYPT|LDAP-MD5|MD5|MD5-CRYPT|PBKDF2|PLAIN|PLAIN-MD4|PLAIN-MD5|PLAIN-TRUNC|PLAIN-TRUNC|SHA|SHA1|SHA256|SHA256-CRYPT|SHA512|SHA512-CRYPT|SMD5|SSHA|SSHA256|SSHA512)}/i', $password)) { $password_hashed = $password; } else {