summaryrefslogtreecommitdiffstats
path: root/forms.py
blob: 06c7800d91d0c36609831f7defa66a517fde32ee (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- coding: utf-8 -*-
from account import SERVICES, NoSuchUserError
from flask import g, current_app, session, Markup
from flask.ext.wtf import Form, validators, TextField, PasswordField,\
                          ValidationError, BooleanField
from functools import partial
from utils import _username_re, _username_exclude_re, decrypt_password,\
                  NotRegexp, url_for


username = partial(TextField, 'Benutzername', [validators.Regexp(_username_re,
    message=u'Benutzername darf nur aus a-z und - bestehen (2-16 Zeichen)')])


class RegisterForm(Form):
    username = TextField('Benutzername', [
        validators.Regexp(_username_re, message=u'Benutzername darf nur aus '
            u'a-z, Zahlen und - bestehen (2-16 Zeichen, am Anfang nur a-z).'),
        NotRegexp(_username_exclude_re, message=u'Dieser Benutzername ist nicht erlaubt.'),
    ])
    mail = TextField('E-Mail-Adresse', [validators.Email(), validators.Length(min=6, max=50)])
    question = TextField('Hauptstadt von Deutschland?', [validators.AnyOf(('Berlin', 'berlin'),
                         message=u'Bitte beantworte die Frage.')])

    def validate_username(form, field):
        try:
            g.ldap.get_by_uid(field.data)
        except NoSuchUserError:
            if current_app.username_blacklist:
                if field.data.lower() in current_app.username_blacklist:

                    raise ValidationError(Markup(u'Dieser Benutzername ist momentan nicht erlaubt. '
                                          u'<a href="%s">Weitere Informationen</a>' % url_for('about')))
        else:
            raise ValidationError(u'Dieser Benutzername ist schon vergeben.')

    def validate_mail(form, field):
        try:
            g.ldap.get_by_mail(field.data)
        except NoSuchUserError:
            pass
        else:
            raise ValidationError(Markup(u'Ein Benutzername mit dieser Adresse existiert bereits. '
                                         u'Falls du deinen Benutzernamen vergessen hast, kannst du die '
                                         u'<a href="%s">Passwort-vergessen-Funktion</a> benutzen'
                                         % url_for('lost_password')))

class AdminCreateAccountForm(RegisterForm):
    def validate_username(form, field):
        try:
            g.ldap.get_by_uid(field.data)
        except NoSuchUserError:
            return
        else:
            raise ValidationError(u'Dieser Benutzername ist schon vergeben')

    question = None


class RegisterCompleteForm(Form):
    password = PasswordField('Passwort', [validators.Required(),
                                          validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')])
    password_confirm = PasswordField(u'Passwort bestätigen')
    # n.b. this form is also used in lost_password_complete


class LoginForm(Form):
    username = TextField(u'Benutzername')
    password = PasswordField('Passwort', [validators.Required()])


class LostPasswordForm(Form):
    username_or_mail = TextField(u'Benutzername oder E-Mail')

    def validate_username_or_mail(form, field):
        if '@' not in field.data:
            try:
                form.user = g.ldap.get_by_uid(field.data)
            except NoSuchUserError:
                raise ValidationError(u'Es gibt keinen Benutzer mit diesem Namen.')
        else:
            try:
                form.user = g.ldap.get_by_mail(field.data)
            except NoSuchUserError:
                raise ValidationError(u'Es gibt keinen Benutzer mit dieser Adresse.')




class SettingsForm(Form):
    old_password = PasswordField('Altes Passwort')
    password = PasswordField('Neues Passwort', [validators.Optional(),
                                                validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')])
    password_confirm = PasswordField(u'Passwort bestätigen')
    mail = TextField('E-Mail-Adresse', [validators.Optional(), validators.Email(), validators.Length(min=6, max=50)])

    def validate_old_password(form, field):
        if form.password.data:
            if not field.data:
                raise ValidationError(u'Gib bitte dein altes Passwort ein, um ein neues zu setzen.')
            if field.data != decrypt_password(session['password']):
                raise ValidationError(u'Altes Passwort ist falsch.')

    def validate_mail(form, field):
        results = g.ldap.find_by_mail(field.data)
        for user in results:
            if user.uid != g.user.uid:
                raise ValidationError(u'Diese E-Mail-Adresse wird schon von einem anderen Account benutzt!')

    def get_servicepassword(self, service_id):
        return getattr(self, 'password_%s' % service_id)
    def get_servicepasswordconfirm(self, service_id):
        return getattr(self, 'password_confirm_%s' % service_id)
    def get_servicedelete(self, service_id):
        return getattr(self, 'delete_%s' % service_id)


#TODO: find out how we can use app.all_services in that early state
for service in SERVICES:
    setattr(SettingsForm, 'password_%s' % service.id,
            PasswordField(u'Passwort für %s' % service.name, [
                validators.Optional(),
                validators.EqualTo('password_confirm_%s' % service.id, message=u'Passwörter stimmen nicht überein'),
            ]))
    setattr(SettingsForm, 'password_confirm_%s' % service.id,
            PasswordField(u'Passwort für %s (Bestätigung)' % service.name))
    setattr(SettingsForm, 'delete_%s' % service.id,
            BooleanField(u'Passwort für %s löschen' % service.name))