summaryrefslogtreecommitdiffstats
path: root/contrib/create_account.py
blob: 17e4646b511a938f6866709feb558dd725abf7ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from os.path import dirname, abspath
sys.path.append(dirname(dirname(abspath(__file__))))

from account import AccountService, NoSuchUserError
from app import app
from flask import g, render_template, url_for
from utils import make_confirmation, send_mail

"""
Create an account.

The default operation is to send an activation mail to the given address. So
the only difference to the register form on the website is that the username
blacklist is not checked.
The user can click the link and enter a password to finish account creation.

Usage:
    $0 username mail        Send an activation mail.
    $0 -p username mail     Only print the link.
"""

def main(username, mail, print_only=False):
    service = AccountService(app.config['LDAP_HOST'], app.config['LDAP_BASE_DN'],
        app.config['LDAP_ADMIN_USER'], app.config['LDAP_ADMIN_PASS'],
        app.all_services)

    try:
        service.get_by_uid(username)
    except NoSuchUserError:
        pass
    else:
        raise CreationError(u'There is already a user named %s' % username)

    try:
        u = service.get_by_mail(mail)
    except NoSuchUserError:
        pass
    else:
        raise CreationError(u'There is already a user with email %s (uid: %s)' % (mail, u.uid))

    confirm_token = make_confirmation('register', (username, mail))
    confirm_link = url_for('register_complete', token=confirm_token, _external=True)

    if print_only:
        print confirm_link
        return

    body = render_template('mail/register.txt', username=username,
                           mail=mail, link=confirm_link)

    send_mail(mail, u'E-Mail-Adresse bestätigen', body,
              sender=app.config.get('MAIL_CONFIRM_SENDER'))

    print 'Mail versandt.'



class CreationError(ValueError):
    pass


if __name__ == '__main__':
    try:
        sys.argv.remove('-p')
    except ValueError:
        print_only = False
    else:
        print_only = True

    if len(sys.argv) == 3:
        #XXX: I have the strong feeling that could be done better
        try:
            with app.test_request_context(base_url='http://%s/' % (app.config['SERVER_NAME'] or 'localhost')):
                main(sys.argv[1], sys.argv[2], print_only=print_only)
        except CreationError, e:
            print 'Error:', e
    else:
        print "Usage: %s username email" % sys.argv[0]