creer_compte_wiki.py 4.53 KB
Newer Older
1
#!/bin/bash /usr/scripts/python.sh
2
# -*- mode: python; coding: utf-8 -*-
3

4 5
# Script de création de compte sur le wiki
# Auteur : Stéphane Glondu
glondu's avatar
glondu committed
6 7
# Licence : GPLv2

8
import sys, os, httplib, urllib, locale
9 10 11 12 13 14 15
from getpass import getpass
from smtplib import SMTP
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.Encoders import encode_7or8bit

16 17 18 19
if '/usr/scripts' not in sys.path:
    sys.path.append("/usr/scripts")
from gestion.affich_tools import coul, prompt, cprint
from gestion.user_tests import getuser
20

21
bugmail = ["root@crans.org"]
22
bugreport = u"""
23
Nom d'utilisateur : %(name)s
24 25 26 27 28 29
Adresse e-mail : %(email)s
"""

# C'est l'encodage du wiki et des bugreports
encoding = "utf-8"

30 31 32
# Utilisateur qui lance le script
user = getuser()

33
def send(msg, user=user):
34
    msg['From'] = '%s@crans.org' % user
35
    msg['To'] = ','.join(bugmail)
36
    msg['User-Agent'] = 'creer_compte_wiki.py'
37 38
    smtp = SMTP()
    smtp.connect()
39
    smtp.sendmail('%s@crans.org' % user, bugmail, msg.as_string())
40 41
    smtp.quit()

42
def creer_compte(nom, mdp, email, user=user):
43
    form = {'action': 'crans_newaccount',
44
            'name': nom.encode(encoding),
45
            'password': mdp.encode(encoding),
46
            'email': email.encode(encoding),
47
            'create_only': 'Create+Profile'}
48 49 50 51 52 53 54 55
    params = urllib.urlencode(form)
    headers = {"Content-type": "application/x-www-form-urlencoded",
               "Accept": "text/plain"}
    conn = httplib.HTTPSConnection("wiki.crans.org")
    conn.request("POST", "/UserPreferences", params, headers)
    response = conn.getresponse()
    data = response.read()
    conn.close()
56
    if 'created' in data:
57 58
        msg = MIMEText(bugreport.encode(encoding) % form, 'plain', encoding)
        msg['Subject'] = "creer_compte_wiki.py: success"
59
        send(msg, user)
60
        return u"Compte %s créé avec succès !" % nom, False
61
    elif 'nonunique name' in data:
62
        return u"Le compte %s existe déjà !" % nom, True
63
    elif 'nonunique email' in data:
64
        return u"L'adresse %s est déjà utilisée !" % email, True
65
    elif 'Password not acceptable: Password too short.' in data:
66
        return u"Le mot de passe choisi est trop court", True
67
    elif 'invalid name' in data:
68
        msg = u"Le nom d'utilisateur %s est invalide !" % nom
glondu's avatar
glondu committed
69
        msg += u"""
70
Le nom d'utilisateur doit être un WikiNom, voir à ce sujet :
71
    http://wiki.crans.org/NomWiki
72 73
Il peut contenir n'importe quel caractère alphanumérique, avec
éventuellement un espace facultatif entre chaque mot. Il peut aussi
glondu's avatar
glondu committed
74
contenir des accents, mais assurez-vous que votre terminal est
75
correctement configuré (en %s).""" % (locale.getdefaultlocale()[1])
76
        return msg, True
77 78 79 80 81 82 83 84 85
    else:
        html = MIMEBase('text', 'html')
        html.set_payload(data)
        html.add_header('Content-Disposition', 'attachment', filename='response.html')
        txt = MIMEText(bugreport.encode(encoding) % form, 'plain', encoding)
        msg = MIMEMultipart()
        msg['Subject'] = '[Bugreport] creer_compte_wiki.py: creer_compte'
        msg.attach(txt)
        msg.attach(html)
86
        send(msg, user)
87 88
        return (u"Erreur inconnue\nUn rapport de bug a été envoyé."
                u"Réessayez plus tard."), False
89 90 91

if __name__ == '__main__':
    try:
92
        nom = prompt("Nom d'utilisateur (utiliser un WikiNom) : ")
93
        while True:
94
            mdp = getpass(coul("Mot de passe (ne pas utiliser le même que pour zamok) : ", "gras"))
95
            if getpass(coul("Confirmation du mot de passe : ", "gras")) == mdp:
96
                break
97
            else:
98
                cprint(u"Les deux mots de passe sont différents, veuillez réessayer...", "jaune")
99
        email = prompt("Adresse e-mail : ")
100 101 102 103 104 105
        message, erreur = creer_compte(nom, mdp, email)

        if erreur:
            print coul(message, "rouge")
        else:
            print coul(message, "vert")
106

107 108 109
    except KeyboardInterrupt:
        print "Interruption par l'utilisateur."
        exit = 255
110

111 112 113
    except SystemExit, c:
        if c.__str__() == '254':
            os.system('reset')
114
            print "Votre session d'édition à été tuée."
115
        exit = c
116

117 118 119 120 121 122
    except:
        import traceback
        msg = MIMEText('\n'.join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)).encode(encoding), 'plain', encoding)
        msg['Subject'] = '[Bugreport] creer_compte_wiki.py: __main__'
        send(msg)
        print coul(u"Erreur inconnue\n", "rouge") + \
123
              u"Un rapport de bug a été automatiquement envoyé. Réessayez plus tard."