creer_compte_wiki.py 4.53 KB
Newer Older
1
#!/bin/bash /usr/scripts/python.sh
2
# -*- mode: python; coding: utf-8 -*-
glondu's avatar
glondu committed
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
glondu's avatar
glondu committed
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
glondu's avatar
glondu committed
20

21
bugmail = ["root@crans.org"]
glondu's avatar
glondu committed
22
bugreport = u"""
23
Nom d'utilisateur : %(name)s
glondu's avatar
glondu committed
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
glondu's avatar
glondu committed
35
    msg['To'] = ','.join(bugmail)
36
    msg['User-Agent'] = 'creer_compte_wiki.py'
glondu's avatar
glondu committed
37 38
    smtp = SMTP()
    smtp.connect()
39
    smtp.sendmail('%s@crans.org' % user, bugmail, msg.as_string())
glondu's avatar
glondu committed
40 41
    smtp.quit()

42
def creer_compte(nom, mdp, email, user=user):
Daniel STAN's avatar
Daniel STAN committed
43
    form = {'action': 'crans_newaccount',
44
            'name': nom.encode(encoding),
45
            'password': mdp.encode(encoding),
glondu's avatar
glondu committed
46
            'email': email.encode(encoding),
47
            'create_only': 'Create+Profile'}
glondu's avatar
glondu committed
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()
Daniel STAN's avatar
Daniel STAN committed
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
Daniel STAN's avatar
Daniel STAN committed
61
    elif 'nonunique name' in data:
62
        return u"Le compte %s existe déjà !" % nom, True
Daniel STAN's avatar
Daniel STAN committed
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
Daniel STAN's avatar
Daniel STAN committed
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
glondu's avatar
glondu committed
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
glondu's avatar
glondu committed
89 90 91

if __name__ == '__main__':
    try:
92
        nom = prompt("Nom d'utilisateur (utiliser un WikiNom) : ")
glondu's avatar
glondu committed
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:
glondu's avatar
glondu committed
96
                break
97
            else:
98
                cprint(u"Les deux mots de passe sont différents, veuillez réessayer...", "jaune")
glondu's avatar
glondu committed
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

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

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

glondu's avatar
glondu committed
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."