diff options
author | Nico von Geyso <Nico.Geyso@FU-Berlin.de> | 2012-09-24 18:39:05 +0200 |
---|---|---|
committer | Nico von Geyso <Nico.Geyso@FU-Berlin.de> | 2012-09-24 18:39:05 +0200 |
commit | bc90a8d13e575e6a0535798160850b6b4bfbd58f (patch) | |
tree | f2585b0ef3725b440a07e24c8200951c4cbb0c85 | |
parent | 120e36c4c54b844fc6a3f7bca93a1629fb50f077 (diff) | |
parent | 9c2ce8952287cc626cb8babad2a9ad23098b0c24 (diff) | |
download | web-bc90a8d13e575e6a0535798160850b6b4bfbd58f.tar.gz web-bc90a8d13e575e6a0535798160850b6b4bfbd58f.tar.bz2 web-bc90a8d13e575e6a0535798160850b6b4bfbd58f.zip |
Merge branch 'master' of ssh://git.spline.de/account-web
-rw-r--r-- | account.py | 4 | ||||
-rw-r--r-- | app.py | 20 | ||||
-rw-r--r-- | static/bootstrap-form.css | 67 | ||||
-rw-r--r-- | templates/_macros.html | 35 | ||||
-rw-r--r-- | templates/base.html | 6 | ||||
-rw-r--r-- | templates/index.html | 10 | ||||
-rw-r--r-- | templates/register.html | 12 | ||||
-rw-r--r-- | templates/register_complete.html | 24 | ||||
-rw-r--r-- | templates/settings.html | 21 | ||||
-rw-r--r-- | utils.py | 14 |
10 files changed, 153 insertions, 60 deletions
@@ -17,7 +17,7 @@ class AccountService: its own authentication request (bind). To test you stuff against our test setup use Port-Forwarding - ssh spline -L 5678:vm-acocunt:389 -N + ssh spline -L 5678:vm-account:389 -N * register a new user >> service = AccountService(LDAP_HOST, LDAP_BASE_DN, ADMIN_USER, ADMIN_PW, SERVICES) @@ -108,7 +108,7 @@ class AccountService: accounts = [] for a in data: - accounts.append(Account(a[1]['uid'],a[1]['mail'])) + accounts.append(Account(a[1]['uid'],a[1]['mail'])) self._unbind() @@ -16,10 +16,12 @@ app.config.from_object('default_settings') if 'SPLINE_ACCOUNT_WEB_SETTINGS' in os.environ: app.config.from_envvar('SPLINE_ACCOUNT_WEB_SETTINGS') +app.all_services = account.SERVICES #TODO: take that from our json file or so + @app.before_request def ldap_connect(): g.ldap = account.AccountService(account.LDAP_HOST, account.LDAP_BASE_DN, - account.LDAP_ADMIN_USER, account.LDAP_ADMIN_PASS, account.SERVICES) + account.LDAP_ADMIN_USER, account.LDAP_ADMIN_PASS, app.all_services) g.user = None @@ -47,7 +49,9 @@ def index(): @app.route('/register', methods=['GET', 'POST']) @templated('register.html') +@logout_required def register(): + #TODO: check for double uids form = RegisterForm(request.form) if request.method == 'POST' and form.validate(): username = form.username.data @@ -73,7 +77,9 @@ def register(): @app.route('/register/<token>', methods=['GET', 'POST']) @templated('register_complete.html') +@logout_required def register_complete(token): + #TODO: check for double uids username, mail = http_verify_confirmation('register', token.encode('ascii'), timeout=3*24*60*60) @@ -135,10 +141,17 @@ def settings(): else: flash(u'Nichts geändert') - return {'form': form} -@login_required + # (name, changed) + services = [(name, name in g.user.services) for name in app.all_services] + + return { + 'form': form, + 'services': services, + } + @app.route('/settings/change_mail/<token>') +@login_required def change_mail(token): username, mail = http_verify_confirmation('change_mail', token.encode('ascii'), timeout=3*24*60*60) @@ -154,6 +167,7 @@ def change_mail(token): @app.route('/logout') def logout(): logout_user() + flash(u'Erfolgreich ausgeloggt.', 'success') return redirect(url_for('index')) diff --git a/static/bootstrap-form.css b/static/bootstrap-form.css new file mode 100644 index 0000000..8c84910 --- /dev/null +++ b/static/bootstrap-form.css @@ -0,0 +1,67 @@ +/*! + * based on + * Bootstrap v2.1.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + + +.form-horizontal .control-label, +.form-horizontal label { + float: left; + width: 10em; + text-align: right; +} + +.form-horizontal input, +.form-horizontal textarea, +.form-horizontal select { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.control-group { + margin-bottom: .4em; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 10em; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 11em; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 11em; +} +.form-horizontal .help-block { + margin-bottom: 0; +} +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block { + margin-top: 10px; +} +.form-horizontal .form-actions { + padding-left: 11em; +} diff --git a/templates/_macros.html b/templates/_macros.html index 2c933be..265584f 100644 --- a/templates/_macros.html +++ b/templates/_macros.html @@ -1,16 +1,23 @@ {% macro render_field(field) %} - <dt>{{ field.label }} - <dd>{{ field(**kwargs)|safe }} - {% if field.errors|length == 1 %} - <div class="errors"> - {{ field.errors.0 }} - </div> - {% elif field.errors %} - <ul class="errors"> - {% for error in field.errors %} - <li>{{ error }}</li> - {% endfor %} - </ul> +<div class="control-group"> + {{ field.label }} + <div class="controls"> + {{ field(**kwargs)|safe }} + {{ render_errors(field.errors) }} + </div> +</div> +{%- endmacro %} + +{% macro render_errors(errors) %} + {%- if errors|length == 1 %} + <div class="errors"> + {{ errors.0 }} + </div> + {% elif errors %} + <ul class="errors"> + {% for error in errors %} + <li>{{ error }}</li> + {% endfor %} + </ul> {% endif %} - </dd> -{% endmacro %} +{%- endmacro %} diff --git a/templates/base.html b/templates/base.html index 1886d12..c3ed80b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,4 +1,4 @@ -{%- set styles = ['layout.css'] + styles|default([]) %} +{%- set styles = ['layout.css', 'bootstrap-form.css'] + styles|default([]) %} {%- set scripts = [] + scripts|default([]) %} <!doctype html> <html> @@ -19,11 +19,13 @@ <h2>{{ title }}</h2> {% endif %} + {%- if not no_login_message %} {%- if g.user %} <p>Logged in as {{ g.user.uid }}. <a href="{{ url_for('logout') }}">Log out</a></p> {%- else %} <p>Not logged in. <a href="{{ url_for('index') }}">Log in</a></p> {%- endif %} + {%- endif %} {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} @@ -36,7 +38,5 @@ {% endwith %} {% block content %}{% endblock %} - - <pre>{{ session.__repr__() }}</pre> </body> </html> diff --git a/templates/index.html b/templates/index.html index 6147883..abcbb1d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,13 +6,11 @@ <p>Hallo {{ session.username }}. <a href="{{ url_for('settings') }}">Einstellungen</a></p> {%- else %} <p><a href="/register">Account erstellen</a></p> -<form action="{{ url_for('index') }}" method="post"> - <dl> - {{ render_field(form.username) }} - {{ render_field(form.password) }} - </dl> +<form action="{{ url_for('index') }}" method="post" class="form-horizontal"> + {{ render_field(form.username) }} + {{ render_field(form.password) }} {{ form.csrf_token }} - <input type="submit" value="Login" /> + <div class="form-actions"><input type="submit" value="Login" /></div> </form> {%- endif %} {%- endblock %} diff --git a/templates/register.html b/templates/register.html index e04baac..ab785ea 100644 --- a/templates/register.html +++ b/templates/register.html @@ -1,14 +1,12 @@ {%- extends 'base.html' %} {%- from '_macros.html' import render_field %} {%- set title = 'Account erstellen' %} +{%- set no_login_message = true %} {%- block content %} -<form action="{{ url_for('register') }}" method="post"> - <dl> - {{ form.errors }} - {{ render_field(form.username) }} - {{ render_field(form.mail) }} - </dl> +<form action="{{ url_for('register') }}" method="post" class="form-horizontal"> + {{ render_field(form.username) }} + {{ render_field(form.mail) }} {{ form.csrf_token }} - <input type="submit" value="E-Mail-Adresse bestätigen" /> + <div class="form-actions"><input type="submit" value="E-Mail-Adresse bestätigen" /></div> </form> {%- endblock %} diff --git a/templates/register_complete.html b/templates/register_complete.html index f44e43a..9320995 100644 --- a/templates/register_complete.html +++ b/templates/register_complete.html @@ -1,21 +1,25 @@ {%- extends 'base.html' %} {%- from '_macros.html' import render_field %} {%- set title = 'Account erstellen' %} +{%- set no_login_message = true %} {%- block content %} -<form action="{{ url_for('register_complete', token=token) }}" method="post"> +<form action="{{ url_for('register_complete', token=token) }}" method="post" class="form-horizontal"> <p> Deine E-Mail-Adresse wurde erfolgreich bestätigt. Bitte setze nun ein Passwort, um die Registrierung abzuschließen. </p> - <dl> - <dt>Benutzername</dt> - <dd><input readonly="readonly" value="{{ username }}" /></dd> - <dt>E-Mail-Adresse</dt> - <dd><input readonly="readonly" value="{{ mail }}" /></dd> - {{ render_field(form.password) }} - {{ render_field(form.password_confirm) }} - </dl> + <p><strong>Achtung:</strong> Bitte fürs erste keine wertvollen Passwörter verwenden, das ist noch alpha!</p> + <div class="control-group"> + <div class="control-label">Benutzername</div> + <div class="controls"><input readonly="readonly" value="{{ username }}" /></div> + </div> + <div class="control-group"> + <div class="control-label">E-Mail-Adresse</div> + <div class="controls"><input readonly="readonly" value="{{ mail }}" /></div> + </div> + {{ render_field(form.password) }} + {{ render_field(form.password_confirm) }} {{ form.csrf_token }} - <input type="submit" value="Registrieren" /> + <div class="form-actions"><input type="submit" value="Registrieren" /></div> </form> {%- endblock %} diff --git a/templates/settings.html b/templates/settings.html index 29391b2..13d63f4 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -2,24 +2,21 @@ {%- from '_macros.html' import render_field %} {%- set title = 'Einstellungen' %} {%- block content %} -<form action="{{ url_for('settings') }}" method="post"> +<form action="{{ url_for('settings') }}" method="post" class="form-horizontal"> <h2>Globale Einstellungen ändern</h2> - <p> - <dl> - {{ render_field(form.old_password) }} - {{ render_field(form.mail) }} - {{ render_field(form.password) }} - {{ render_field(form.password_confirm) }} - </dl> + {{ render_field(form.old_password) }} + {{ render_field(form.mail) }} + {{ render_field(form.password) }} + {{ render_field(form.password_confirm) }} {{ form.csrf_token }} - <input type="submit" value="Speichern" /> + <div class="form-actions"><input type="submit" value="Speichern" /></div> <h2>Dienste verwalten</h2> <ul> - {%- for service in services %} + {%- for service, changed in services %} <li> - <strong>{{ service.name }}</strong> - {%- if service.own_password %} + <strong>{{ service }}</strong> + {%- if changed %} ändern, löschen {%- else %} setzen @@ -41,10 +41,18 @@ def login_required(f): @wraps(f) def login_required_(*args, **kwargs): if not g.user: - raise Forbidden + raise Forbidden(u'Bitte einloggen!') return f(*args, **kwargs) return login_required_ +def logout_required(f): + @wraps(f) + def logout_required_(*args, **kwargs): + if g.user: + raise Forbidden(u'Diese Seite ist nur für nicht eingeloggte Benutzer gedacht!') + return f(*args, **kwargs) + return logout_required_ + def login_user(username, password): try: @@ -140,9 +148,9 @@ def http_verify_confirmation(*args, **kwargs): try: return verify_confirmation(*args, **kwargs) except ConfirmationInvalid: - raise Forbidden(u'Ungültiger Bestätigungslink') + raise Forbidden(u'Ungültiger Bestätigungslink.') except ConfirmationTimeout: - raise Forbidden(u'Bestätigungslink ist zu alt') + raise Forbidden(u'Bestätigungslink ist zu alt.') def send_mail(recipient, subject, body, sender=None): |