From 4d127a57e2fe83131bad5fb60546403b9653fb1b Mon Sep 17 00:00:00 2001 From: Fanch Date: Mon, 28 Jul 2025 17:07:01 +0200 Subject: [PATCH] =?UTF-8?q?inscription=20utilisateur=20compl=C3=A8te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/lib/mattermost.py | 12 ++++ bin/lib/sympa.py | 9 ++- bin/lib/template.py | 8 +++ bin/lib/user.py | 80 ++++++++++++++--------- bin/templates/email.css | 82 ++++++++++++++++++++++++ bin/templates/email_footer.html | 9 +++ bin/templates/email_header.html | 6 ++ bin/templates/email_inscription.html | 94 ++++++++++++++++++++++++++++ bin/templates/email_inscription.txt | 70 +++++++++++++++++++++ 9 files changed, 338 insertions(+), 32 deletions(-) create mode 100644 bin/lib/template.py create mode 100644 bin/templates/email.css create mode 100644 bin/templates/email_footer.html create mode 100644 bin/templates/email_header.html create mode 100644 bin/templates/email_inscription.html create mode 100644 bin/templates/email_inscription.txt diff --git a/bin/lib/mattermost.py b/bin/lib/mattermost.py index fddd6a1..57f67c0 100644 --- a/bin/lib/mattermost.py +++ b/bin/lib/mattermost.py @@ -10,7 +10,14 @@ mmctl = "docker exec -i mattermostServ bin/mmctl" class Mattermost: def __init__(self): + pass + + def __enter__(self): self.authenticate() + return self + + def __exit__(self, tp, e, traceback): + self.logout() def authenticate(self): @@ -19,6 +26,11 @@ class Mattermost: subprocess.run(cmd, shell=True, stderr=subprocess.STDOUT, check=True) + def logout(self): + # Authentification sur MM + cmd = f"{mmctl} auth clean" + subprocess.run(cmd, shell=True, stderr=subprocess.STDOUT, check=True) + def post_message(self, message, equipe="kaz", canal="creation-comptes"): """ Envoyer un message dans une Equipe/Canal de MM diff --git a/bin/lib/sympa.py b/bin/lib/sympa.py index ac74635..2a34e0d 100644 --- a/bin/lib/sympa.py +++ b/bin/lib/sympa.py @@ -1,4 +1,5 @@ import subprocess +from email_validator import validate_email, EmailNotValidError from .config import getDockersConfig, getSecretConfig @@ -7,7 +8,9 @@ sympa_pass = getSecretConfig("sympaServ", "SOAP_PASSWORD") sympa_listmaster = getSecretConfig("sympaServ", "ADMINEMAIL") sympa_url = f"https://{getDockersConfig('sympaHost')}.{getDockersConfig('domain')}" sympa_soap = "docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl" -sympa_liste_info = f"info@{getDockersConfig('domain_sympa')}" +sympa_domain = getDockersConfig('domain_sympa') +sympa_liste_info = "infos" + # docker exec -i sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\"" | tee -a "${CMD_SYMPA}" @@ -23,14 +26,14 @@ class Sympa: """ Ajouter un email dans une liste sympa """ - output = self._execute_sympa_command(email, liste, 'add') + output = self._execute_sympa_command(email, f"{liste}@{sympa_domain}", 'add') return output def delete_email_from_list(self, email, liste=sympa_liste_info): """ Supprimer un email dans une liste sympa """ - output = self._execute_sympa_command(email, liste, 'del') + output = self._execute_sympa_command(email, f"{liste}@{sympa_domain}", 'del') return output diff --git a/bin/lib/template.py b/bin/lib/template.py new file mode 100644 index 0000000..b3cf5c6 --- /dev/null +++ b/bin/lib/template.py @@ -0,0 +1,8 @@ +import jinja2 + +templateLoader = jinja2.FileSystemLoader(searchpath="../templates") +templateEnv = jinja2.Environment(loader=templateLoader) + +def render_template(filename, args): + template = templateEnv.get_template(filename) + return template.render(args) diff --git a/bin/lib/user.py b/bin/lib/user.py index 75acb82..d5ff7fd 100644 --- a/bin/lib/user.py +++ b/bin/lib/user.py @@ -3,14 +3,27 @@ from glob import glob import tempfile import subprocess import re - +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +import smtplib from .paheko import Paheko from .ldap import Ldap from .mattermost import Mattermost +from .sympa import Sympa +from .template import render_template +from .config import getDockersConfig, getSecretConfig DEFAULT_FILE = "/kaz/tmp/createUser.txt" +webmail_url = f"https://webmail.{getDockersConfig('domain')}" +mattermost_url = f"https://agora.{getDockersConfig('domain')}" +mdp_url = f"https://mdp.{getDockersConfig('domain')}" +sympa_url = f"https://listes.{getDockersConfig('domain')}" +site_url = f"https://{getDockersConfig('domain')}" +cloud_url = f"https://cloud.{getDockersConfig('domain')}" + + def _generate_password(self): cmd="apg -n 1 -m 10 -M NCL -d" output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) @@ -81,36 +94,45 @@ def create_user(email, email_secours, admin_orga, nom_orga, quota_disque, nom, p mm.add_user_to_team(email, nom_orga) - # #on inscrit email et email_secours à la nl sympa_liste_info - # res, status_code = self.sympa_user_resource.post(email,sympa_liste_info) - # if status_code != 200: raise ValueError(f"ERREUR 9 sur Sympa: {email} : {res}, on arrête tout ") - # res, status_code = self.sympa_user_resource.post(email_secours,sympa_liste_info) - # if status_code != 200: raise ValueError(f"ERREUR 10 sur Sympa: {email_secours} : {res}, on arrête tout ") - # - # #on construit/envoie le mail - # context = { - # 'ADMIN_ORGA': tab['admin_orga'], - # 'NOM': tab['nom'], - # 'EMAIL_SOUHAITE': email, - # 'PASSWORD': password, - # 'QUOTA': tab['quota_disque'], - # 'URL_WEBMAIL': webmail_url, - # 'URL_AGORA': mattermost_url, - # 'URL_MDP': mdp_url, - # 'URL_LISTE': sympa_url, - # 'URL_SITE': site_url, - # 'URL_CLOUD': cloud_url - # } - # subject="KAZ: confirmation d'inscription !" - # sender=app.config['MAIL_USERNAME'] - # reply_to = app.config['MAIL_REPLY_TO'] - # msg = Message(subject=subject, sender=sender, reply_to=reply_to, recipients=[email,email_secours]) - # msg.html = render_template('email_inscription.html', **context) - # mail.send(msg) + #on inscrit email et email_secours à la nl sympa_liste_info + sympa = Sympa() + sympa.add_email_to_list(email) + sympa.add_email_to_list(email_secours) + + #on construit/envoie le mail + context = { + 'ADMIN_ORGA': admin_orga, + 'NOM': f"{prenom} {nom}", + 'EMAIL_SOUHAITE': email, + 'PASSWORD': password, + 'QUOTA': quota_disque, + 'URL_WEBMAIL': webmail_url, + 'URL_AGORA': mattermost_url, + 'URL_MDP': mdp_url, + 'URL_LISTE': sympa_url, + 'URL_SITE': site_url, + 'URL_CLOUD': cloud_url, + } + + html = render_template("email_inscription.html", context) + raw = render_template("email_inscription.txt", context) + + message = MIMEMultipart() + message["Subject"] = "KAZ: confirmation d'inscription !" + message["From"] = f"contact@{getDockersConfig('domain')}" + message["To"] = f"{email}, {email_secours}" + message.attach(MIMEText(raw, "plain")) + message.attach(MIMEText(html, "html")) + + with smtplib.SMTP(f"mail.{getDockersConfig('domain')}", 25) as server: + server.sendmail(f"contact@{getDockersConfig('domain')}", [email,email_secours], message.as_string()) #on met le flag paheko action à Aucune - # paheko = Paheko() - # paheko.set_user(email, "action_auto", "Aucune") + paheko = Paheko() + try: + paheko.set_user(email, "action_auto", "Aucune") + except: + print(f"Erreur paheko pour remettre action_auto = Aucune pour {email}") #on post sur MM pour dire ok with Mattermost() as mm: diff --git a/bin/templates/email.css b/bin/templates/email.css new file mode 100644 index 0000000..be4dea7 --- /dev/null +++ b/bin/templates/email.css @@ -0,0 +1,82 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 0; +} + +.email-content { + background-color: #f0f0f0; /* Light gray background */ + margin: 20px auto; + padding: 20px; + border: 1px solid #dddddd; + max-width: 600px; + width: 90%; /* This makes the content take 90% width of its container */ + text-align: left; /* Remove text justification */ +} + +header { + background-color: #E16969; + color: white; + text-align: center; + height: 50px; /* Fixed height for header */ + line-height: 50px; /* Vertically center the text */ + width: 100%; /* Make header full width */ +} + +footer { + background-color: #E16969; + color: white; + text-align: center; + height: 50px; /* Fixed height for footer */ + line-height: 50px; /* Vertically center the text */ + width: 100%; /* Make footer full width */ +} + +.header-container { + position: relative; /* Pour positionner le logo et le texte dans le header */ + height: 50px; /* Hauteur maximale du header */ +} + +.logo { + position: absolute; /* Pour positionner le logo */ + max-height: 100%; /* Taille maximale du logo égale à la hauteur du header */ + top: 0; /* Aligner le logo en haut */ + left: 0; /* Aligner le logo à gauche */ + margin-right: 10px; /* Marge à droite du logo */ +} + +.header-container h1, .footer-container p { + margin: 0; + font-size: 24px; +} + +.footer-container p { + font-size: 12px; +} + +.footer-container a { + color: #FFFFFF; /* White color for links in footer */ + text-decoration: none; +} + +.footer-container a:hover { + text-decoration: underline; /* Optional: add underline on hover */ +} + +a { + color: #E16969; /* Same color as header/footer background for all other links */ + text-decoration: none; +} + +a:hover { + text-decoration: underline; /* Optional: add underline on hover */ +} + +h2 { + color: #E16969; +} + +p { + line-height: 1.6; +} diff --git a/bin/templates/email_footer.html b/bin/templates/email_footer.html new file mode 100644 index 0000000..6648e87 --- /dev/null +++ b/bin/templates/email_footer.html @@ -0,0 +1,9 @@ + diff --git a/bin/templates/email_header.html b/bin/templates/email_header.html new file mode 100644 index 0000000..955e1ce --- /dev/null +++ b/bin/templates/email_header.html @@ -0,0 +1,6 @@ +
+
+ +

Kaz : Le numérique sobre, libre, éthique et local

+
+
diff --git a/bin/templates/email_inscription.html b/bin/templates/email_inscription.html new file mode 100644 index 0000000..8716d2b --- /dev/null +++ b/bin/templates/email_inscription.html @@ -0,0 +1,94 @@ + + + + + + Email d'inscription' + + + + +{% include 'email_header.html' %} + +
+ +

+Bonjour {{NOM}}!

+ +Bienvenue chez KAZ!

+ +Vous disposez de : +

+Votre email et identifiant pour ces services : {{EMAIL_SOUHAITE}}
+Le mot de passe : {{PASSWORD}}

+ +Pour changer votre mot de passe de messagerie, c'est ici: {{URL_MDP}}
+Si vous avez perdu votre mot de passe, c'est ici: {{URL_MDP}}/?action=sendtoken

+ +Vous pouvez accéder à votre messagerie classique: + +

+ +{% if ADMIN_ORGA == '1' %} +

+En tant qu'association/famille/société. Vous avez la possibilité d'ouvrir, quand vous le voulez, des services kaz, il vous suffit de nous le demander.

+ +Pourquoi n'ouvrons-nous pas tous les services tout de suite ? parce que nous aimons la sobriété et que nous préservons notre espace disque ;)
+A quoi sert d'avoir un site web si on ne l'utilise pas, n'est-ce pas ?

+ +Par retour de mail, dites-nous de quoi vous avez besoin tout de suite entre: +

+Une fois que vous aurez répondu à ce mail, votre demande sera traitée manuellement. +

+{% endif %} + +

+Vous avez quelques docs intéressantes sur le wiki de kaz: +

+ +Votre quota est de {{QUOTA}}GB. Si vous souhaitez plus de place pour vos fichiers ou la messagerie, faites-nous signe !

+ +Pour accéder à la messagerie instantanée et communiquer avec les membres de votre équipe ou ceux de kaz : {{URL_AGORA}}/login
+

+ +{% if ADMIN_ORGA == '1' %} +

+Comme administrateur de votre organisation, vous pouvez créer des listes de diffusion en vous rendant sur {{URL_LISTE}}
+

+{% endif %} + +

+Enfin, vous disposez de tous les autres services KAZ où l'authentification n'est pas nécessaire : {{URL_SITE}}

+ +En cas de soucis, n'hésitez pas à poser vos questions sur le canal 'Une question ? un soucis' de l'agora dispo ici : {{URL_AGORA}}

+ +Si vous avez besoin d'accompagnement pour votre site, votre cloud, votre compta, votre migration de messagerie,...
nous proposons des formations mensuelles gratuites. Si vous souhaitez être accompagné par un professionnel, nous pouvons vous donner une liste de pros, référencés par KAZ.

+ +À bientôt 😉

+ +La collégiale de KAZ.
+ +

+ +
+ +{% include 'email_footer.html' %} + + diff --git a/bin/templates/email_inscription.txt b/bin/templates/email_inscription.txt new file mode 100644 index 0000000..c35a8db --- /dev/null +++ b/bin/templates/email_inscription.txt @@ -0,0 +1,70 @@ +Bonjour {{NOM}}! + +Bienvenue chez KAZ!

+ +Vous disposez de : + +Votre email et identifiant pour ces services : {{EMAIL_SOUHAITE}}
+Le mot de passe : {{PASSWORD}}

+ +Pour changer votre mot de passe de messagerie, c'est ici: {{URL_MDP}}
+Si vous avez perdu votre mot de passe, c'est ici: {{URL_MDP}}/?action=sendtoken

+ +Vous pouvez accéder à votre messagerie classique: + +

+ +{% if ADMIN_ORGA == '1' %} +

+En tant qu'association/famille/société. Vous avez la possibilité d'ouvrir, quand vous le voulez, des services kaz, il vous suffit de nous le demander.

+ +Pourquoi n'ouvrons-nous pas tous les services tout de suite ? parce que nous aimons la sobriété et que nous préservons notre espace disque ;)
+A quoi sert d'avoir un site web si on ne l'utilise pas, n'est-ce pas ?

+ +Par retour de mail, dites-nous de quoi vous avez besoin tout de suite entre: +

+Une fois que vous aurez répondu à ce mail, votre demande sera traitée manuellement. +

+{% endif %} + +

+Vous avez quelques docs intéressantes sur le wiki de kaz: +

+ +Votre quota est de {{QUOTA}}GB. Si vous souhaitez plus de place pour vos fichiers ou la messagerie, faites-nous signe !

+ +Pour accéder à la messagerie instantanée et communiquer avec les membres de votre équipe ou ceux de kaz : {{URL_AGORA}}/login
+

+ +{% if ADMIN_ORGA == '1' %} +

+Comme administrateur de votre organisation, vous pouvez créer des listes de diffusion en vous rendant sur {{URL_LISTE}}
+

+{% endif %} + +

+Enfin, vous disposez de tous les autres services KAZ où l'authentification n'est pas nécessaire : {{URL_SITE}}

+ +En cas de soucis, n'hésitez pas à poser vos questions sur le canal 'Une question ? un soucis' de l'agora dispo ici : {{URL_AGORA}}

+ +Si vous avez besoin d'accompagnement pour votre site, votre cloud, votre compta, votre migration de messagerie,...
nous proposons des formations mensuelles gratuites. Si vous souhaitez être accompagné par un professionnel, nous pouvons vous donner une liste de pros, référencés par KAZ.

+ +À bientôt 😉

+ +La collégiale de KAZ.
+