Prise en charge de l'attribut mailExterieur comme redirection.

This commit is contained in:
Pierre-Elliott Bécue 2015-02-18 19:58:33 +01:00
parent 60d7087c60
commit 962d9df0f3
5 changed files with 100 additions and 54 deletions

View file

@ -56,7 +56,9 @@ def try_decode(string):
avoir en réception. avoir en réception.
""" """
unicode_str = "" if isinstance(string, unicode):
return string
try: try:
return string.decode("UTF-8") return string.decode("UTF-8")
except UnicodeDecodeError: except UnicodeDecodeError:

View file

@ -25,6 +25,7 @@ except:
# Machine sans mailman, les ML ne seront pas reconfigurées # Machine sans mailman, les ML ne seront pas reconfigurées
pass pass
CONN = crans_ldap()
class del_user: class del_user:
""" Suppression des fichiers d'un compte utilisateur """ """ Suppression des fichiers d'un compte utilisateur """
@ -114,11 +115,15 @@ class home:
for args in self.args: for args in self.args:
anim('\t' + args) anim('\t' + args)
try: try:
try: login, oldLogin, oldHome = args.split(",")
home, uid, login, mail_redirect = args.split(',') if login:
except ValueError: adh = CONN.search("uid=%s" % (uid,))['adherent'][0]
home, uid, login = args.split(',') home = adh.home()
mail_redirect = None uid = adh.uidNumber()
mail_redirect = adh.email_exterieur()
if oldHome and hostname == "zbee":
home_service = del_user([oldLogin, oldHome])
home_service.delete_zbee()
homesplit = home.split("/") homesplit = home.split("/")
symlink = "/home-adh/%s" % (homesplit[-1],) symlink = "/home-adh/%s" % (homesplit[-1],)
### Home ### Home

View file

@ -392,11 +392,11 @@ def set_etudes(adher):
dialog(arg) dialog(arg)
return set_etudes(adher) return set_etudes(adher)
def set_mail(adher): def set_contact(adher):
u""" u"""
Choix d'une adresse mail crans ou extérieure. Choix d'une adresse mail crans ou extérieure.
Retourne ensuite le résultat de : Retourne ensuite le résultat de :
* set_mail_ext si adresse ext * set_mail si adresse ext
* set_compte si compte crans * set_compte si compte crans
""" """
if u'Nounou' in adher.droits() and not isadm: if u'Nounou' in adher.droits() and not isadm:
@ -406,7 +406,7 @@ def set_mail(adher):
return return
if not isinstance(adher, Club) and not adher.adherentPayant(): if not isinstance(adher, Club) and not adher.adherentPayant():
set_mail_ext(adher) set_mail(adher)
return return
while 1: while 1:
@ -426,31 +426,72 @@ def set_mail(adher):
elif result[0].split()[1] == u'un': elif result[0].split()[1] == u'un':
if not set_compte(adher): break if not set_compte(adher): break
else: else:
if not set_mail_ext(adher): break if not set_mail(adher): break
def set_mail_ext(adher): def set_mail(adher):
u""" """Demande l'adresse mail extérieure d'un adhérent
Demande l'adresse mail extérieure d'un adhérent
""" """
default = adher.mail() default = adher.mail()
if default.endswith('@crans.org'): if default.endswith('@crans.org'):
# C'était une adresse crans # C'était une adresse crans
default = '' default = ''
arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom() arg = u'--title "Adresse mail pour %s" ' % adher.Nom()
arg += u'--inputbox "Adresse : " 0 0 "%s"' % default arg += u'--inputbox "Adresse : " 0 0 "%s"' % default
annul, result = dialog(arg) annul, result = dialog(arg)
if annul: return 1 if annul: return 1
try: adher.mail(result[0]) try: adher.mail(result[0])
except ValueError, c: except ValueError, c:
arg = u'--title "Adresse mail de %s" ' % adher.Nom()
arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0])
dialog(arg)
return set_mail(adher)
def set_mail_ext(adher):
"""Récupère une éventuelle adresse de redirection en cas de choix de compte
Crans. Permet en règle générale d'ajouter un mail extérieur au moins pour
les récupérations de mot de passe ou autre.
"""
if not adher.compte():
return 0
if u'Nounou' in adher.droits() and not isadm:
arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom()
arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0'
dialog(arg)
return
no = False
if 'compte' in adher.modifs:
arg = u'--title "Redirection des mails de %s" ' % (adher.Nom(),)
arg += u'--colors --yesno '
arg += u'"L\'adhérent souhaite-t-il mettre en place une redirection de ses emails vers une autre boîte ?\n'
arg += u'Cette redirection lui permettra aussi de récupérer son mot de passe Crans en cas de perte de celui-ci." '
arg += u'0 0'
no, _ = dialog(arg)
if no:
return 0
arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom()
arg += u'--inputbox "Adresse : " 0 0 "%s"' % default
annul, result = dialog(arg)
if annul:
return 1
try:
adher.email_exterieur(result[0])
except ValueError as c:
arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom() arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom()
arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0]) arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0])
dialog(arg) dialog(arg)
return set_mail_ext(adher) return set_mail_ext(adher)
def set_etat_civil(adher): def set_etat_civil(adher):
u""" """
Modifie l'état-civil (nom, prénom) d'un adhérent. Modifie l'état-civil (nom, prénom) d'un adhérent.
""" """
if u'Nounou' in adher.droits() and not isadm: if u'Nounou' in adher.droits() and not isadm:
@ -502,7 +543,7 @@ def set_etat_civil(adher):
# L'utilisateur n'utilise pas son compte, on le supprime... # L'utilisateur n'utilise pas son compte, on le supprime...
adher.supprimer_compte() adher.supprimer_compte()
# ..et on le recrée (ou on met une adresse mail extérieure) # ..et on le recrée (ou on met une adresse mail extérieure)
if set_mail(adher): if set_contact(adher):
# Le changement d'adresse a été annulé, on recommence tout # Le changement d'adresse a été annulé, on recommence tout
adher.restore() adher.restore()
return set_etat_civil(adher) return set_etat_civil(adher)
@ -2027,7 +2068,7 @@ def new_adher(adher):
* set_bases * set_bases
* set_etudes * set_etudes
* set_admin * set_admin
* set_mail * set_contact
* set_rque * set_rque
Retourne 1 si annulation. Retourne 1 si annulation.
""" """
@ -2035,12 +2076,15 @@ def new_adher(adher):
while True: while True:
if set_bases(adher): return 1 if set_bases(adher): return 1
steps = [set_etudes, steps = [
set_adhesion, set_etudes,
set_connexion, set_adhesion,
set_admin, set_connexion,
set_mail, set_admin,
set_rque] set_contact,
set_mail_ext,
set_rque,
]
step = 0 step = 0
while step < len(steps): while step < len(steps):
@ -2084,6 +2128,8 @@ def modif_adher(adher):
arg += u'"Telephone" "Changement de numéro de téléphone" ' arg += u'"Telephone" "Changement de numéro de téléphone" '
if payant: if payant:
arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" ' arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" '
if 'cransAccount' in adher._data['objectClass']:
arg += u'"MailExt" "Ajouter une adresse mail de contact extérieur." '
arg += u'"Alias" "Créer ou supprimer un alias mail" ' arg += u'"Alias" "Créer ou supprimer un alias mail" '
arg += u'"GPGFingerprint" "Ajouter ou supprimer une empreinte GPG" ' arg += u'"GPGFingerprint" "Ajouter ou supprimer une empreinte GPG" '
arg += u'"Remarque" "Ajouter ou modifer un commentaire" ' arg += u'"Remarque" "Ajouter ou modifer un commentaire" '
@ -2111,7 +2157,9 @@ def modif_adher(adher):
elif res[0] == 'Administratif': elif res[0] == 'Administratif':
set_admin(adher) set_admin(adher)
elif res[0] == 'Mail': elif res[0] == 'Mail':
set_mail(adher) set_contact(adher)
elif res[0] == 'MailExt':
set_mail_ext(adher)
elif res[0] == 'Remarque': elif res[0] == 'Remarque':
set_rque(adher) set_rque(adher)
elif res[0] == 'Droits': elif res[0] == 'Droits':

View file

@ -2043,34 +2043,18 @@ class BaseProprietaire(BaseClasseCrans):
# Faut-il créer un compte sur vert ? # Faut-il créer un compte sur vert ?
if 'compte' in self.modifs: if 'compte' in self.modifs:
ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte() compte = self._data.get('uid', [''])[0]
args = self._data['homeDirectory'][0] + ',' if compte:
args+= self._data['uidNumber'][0] + ',' ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte()
args+= self._data['uid'][0] r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O")
r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O") if r == 'O' or r == 'o':
if r == 'O' or r == 'o': change_password(login=self.compte())
change_password(login=self.compte()) else:
else: ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune')
ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') # Le deuxième argument est le potentiel chemin de l'ancien compte
# s'il a jamais existé, ça permet de supprimer le home associé.
args = "%s,%s" % (compte, self.modifs.get('compte', ''))
r = prompt(u"Redirection mail ? [O/N]")
mail1 = mail2 = None
if r.lower().startswith('o'):
while True:
mail1 = prompt(u"Adresse mail ? (ANNUL pour annuler la redirection)")
if mail1 == "ANNUL":
mail1 = None
break
try:
validate_mail(mail1)
except ValueError, e:
print coul(e.message.encode('utf-8'), 'rouge')
continue
mail2 = prompt(u"Adresse mail (répéter) ?")
if mail1 == mail2 and mail1:
break
if mail1:
args += ',' + mail1
self.services_to_restart('home', [ args ]) self.services_to_restart('home', [ args ])
# Modif des droits ? # Modif des droits ?
@ -2269,7 +2253,7 @@ class Adherent(BaseProprietaire):
if new == None: if new == None:
email = self._data.get('mail', [''])[0] email = self._data.get('mail', [''])[0]
if not '@' in email: if not '@' in email:
return decode(email)+'@crans.org' return decode(email) + '@crans.org'
else: else:
return decode(email) return decode(email)
@ -2451,6 +2435,8 @@ class Adherent(BaseProprietaire):
raise ValueError(u"Le solde d'un adhérent doit être nul pour supprimer son compte crans.") raise ValueError(u"Le solde d'un adhérent doit être nul pour supprimer son compte crans.")
self._data['objectClass'] = ['adherent'] self._data['objectClass'] = ['adherent']
if not 'compte' in self.modifs:
self.modifs['compte'] = "%s,%s" % (self.compte(), self.home())
for c in [ 'uid', 'cn', 'shadowLastChange', 'shadowMax', for c in [ 'uid', 'cn', 'shadowLastChange', 'shadowMax',
'shadowWarning', 'loginShell', 'userPassword', 'shadowWarning', 'loginShell', 'userPassword',
'uidNumber', 'gidNumber', 'homeDirectory', 'gecos', 'uidNumber', 'gidNumber', 'homeDirectory', 'gecos',
@ -2567,7 +2553,7 @@ class Adherent(BaseProprietaire):
self._data['mail'] = ["%s@crans.org" % (login)] self._data['mail'] = ["%s@crans.org" % (login)]
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.setdefault('compte', None) self.modifs.setdefault('compte', '')
# Création de l'alias canonique # Création de l'alias canonique
if self.nom() and self.prenom(): if self.nom() and self.prenom():
@ -2904,7 +2890,7 @@ class Club(BaseProprietaire):
self.lock('mail', login) self.lock('mail', login)
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.setdefault('compte', None) self.modifs.setdefault('compte', '')
self._data['objectClass'] = ['club', 'cransAccount', 'posixAccount', 'shadowAccount'] self._data['objectClass'] = ['club', 'cransAccount', 'posixAccount', 'shadowAccount']
self._data['uid'] = [ login ] self._data['uid'] = [ login ]

View file

@ -547,6 +547,11 @@ def adher_details(adher) :
f += GL f += GL
f += RMH f += RMH
f += u'\n' f += u'\n'
if adher.email_exterieur():
f += coul(u'Mail extérieur : ', 'gras')
f += adher.email_exterieur()
f += u'\n'
# Réservé aux comptes Crans.
if len(adher.gpgFingerprint()) > 0: if len(adher.gpgFingerprint()) > 0:
f += u"\n".join([coul(u'Fingerprint GPG : ', 'gras') + u"%s" % (i) for i in adher.gpgFingerprint()])+"\n" f += u"\n".join([coul(u'Fingerprint GPG : ', 'gras') + u"%s" % (i) for i in adher.gpgFingerprint()])+"\n"
try: try: