summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--forms.py10
-rw-r--r--templates/about.html2
-rw-r--r--templates/register.html8
-rw-r--r--utils.py17
4 files changed, 28 insertions, 9 deletions
diff --git a/forms.py b/forms.py
index a65d45c..bbdfabe 100644
--- a/forms.py
+++ b/forms.py
@@ -4,7 +4,7 @@ from flask import g, current_app, session, url_for, Markup
from flask.ext.wtf import Form, validators, TextField, PasswordField,\
ValidationError, BooleanField
from functools import partial
-from utils import _username_re, decrypt_password
+from utils import _username_re, _username_exclude_re, decrypt_password, NotRegexp
username = partial(TextField, 'Benutzername', [validators.Regexp(_username_re,
@@ -12,7 +12,11 @@ username = partial(TextField, 'Benutzername', [validators.Regexp(_username_re,
class RegisterForm(Form):
- username = username()
+ 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)])
def validate_username(form, field):
@@ -49,7 +53,7 @@ class RegisterCompleteForm(Form):
class LoginForm(Form):
- username = username()
+ username = TextField(u'Benutzername')
password = PasswordField('Passwort', [validators.Required()])
diff --git a/templates/about.html b/templates/about.html
index 03d56e4..3056e97 100644
--- a/templates/about.html
+++ b/templates/about.html
@@ -1,6 +1,6 @@
{%- extends 'base.html' %}
{%- from '_macros.html' import render_field %}
-{%- set title = 'Über spline account' %}
+{%- set title = 'Über spline accounts' %}
{%- block content %}
<h2>Was ist ein Spline-Account?</h2>
<p>
diff --git a/templates/register.html b/templates/register.html
index c5cad1b..e724e2f 100644
--- a/templates/register.html
+++ b/templates/register.html
@@ -6,12 +6,12 @@
<p>Hier kannst du dir einen Spline-Account erstellen.</p>
<p>
Da der Benutzername von möglichst vielen Diensten verarbeitet werden
- können soll, sind nur normale Buchstaben (keine Umlaute) und Unterstriche
- erlaubt.
+ können soll, sind nur normale Buchstaben (keine Umlaute), Zahlen und
+ Bindestriche erlaubt (beim ersten Zeichen nur Buchstaben).
</p>
<p>
- Bitte such dir deinen Benutzernamen gut aus. Er kann später nicht mehr geändert
- werden.
+ Bitte such dir deinen Benutzernamen gut aus. Er kann später nicht mehr
+ geändert werden.
</p>
<form action="{{ url_for('register') }}" method="post" class="form-horizontal">
{{ render_field(form.username, autofocus="autofocus") }}
diff --git a/utils.py b/utils.py
index 24a17b2..573345d 100644
--- a/utils.py
+++ b/utils.py
@@ -10,14 +10,17 @@ from Crypto.Cipher import AES
from email.mime.text import MIMEText
from functools import wraps
from flask import current_app, flash, g, redirect, render_template, request, session, url_for
+from flask.ext.wtf import ValidationError
from hashlib import sha1
from random import randint
from time import time
from werkzeug.exceptions import Forbidden
+from wtforms.validators import Regexp
-_username_re = re.compile(r'^[-a-zA-Z]{2,16}')
+_username_re = re.compile(r'^[a-zA-Z][a-zA-Z0-9-]{1,15}')
+_username_exclude_re = re.compile(r'^(admin|root)')
# using http://flask.pocoo.org/docs/patterns/viewdecorators/
def templated(template=None):
@@ -212,3 +215,15 @@ def send_register_confirmation_mail(username, mail):
send_mail(mail, u'E-Mail-Adresse bestätigen', body,
sender=current_app.config.get('MAIL_CONFIRM_SENDER'))
+
+
+class NotRegexp(Regexp):
+ """
+ Like wtforms.validators.Regexp, but rejects data that DOES match the regex.
+ """
+ def __call__(self, form, field):
+ if self.regex.match(field.data or u''):
+ if self.message is None:
+ self.message = field.gettext(u'Invalid input.')
+
+ raise ValidationError(self.message)