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 @@
+
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:
+
+- soit depuis votre webmail : {{URL_WEBMAIL}}
+- soit depuis votre bureau virtuel : {{URL_CLOUD}}
+- soit depuis un client de messagerie comme thunderbird
+
+
+
+{% 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 comptabilité : un service de gestion adhérents/clients
+- un site web de type WordPress
+- un cloud : bureau virtuel pour stocker des fichiers/calendriers/contacts et partager avec vos connaissances
+
+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:
+
+- soit depuis votre webmail : {{URL_WEBMAIL}}
+- soit depuis votre bureau virtuel : {{URL_CLOUD}}
+- soit depuis un client de messagerie comme thunderbird
+
+
+
+{% 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 comptabilité : un service de gestion adhérents/clients
+- un site web de type WordPress
+- un cloud : bureau virtuel pour stocker des fichiers/calendriers/contacts et partager avec vos connaissances
+
+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.
+