Mercurial > wikked
changeset 349:128df013c9c0
Fix login/logout workflows.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 19 Sep 2015 22:01:42 -0700 |
parents | 5ff3b1639154 |
children | 1df31795fcab |
files | wikked/commands/users.py wikked/templates/login.html wikked/templates/logout.html wikked/views/__init__.py wikked/views/admin.py |
diffstat | 5 files changed, 73 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/wikked/commands/users.py Sat Sep 19 22:01:14 2015 -0700 +++ b/wikked/commands/users.py Sat Sep 19 22:01:42 2015 -0700 @@ -28,8 +28,9 @@ def __init__(self): super(NewUserCommand, self).__init__() self.name = 'newuser' - self.description = ("Generates the entry for a new user so you can " - "copy/paste it in your `.wikirc`.") + self.description = ( + "Generates the entry for a new user so you can " + "copy/paste it in your `.wikirc`.") def setupParser(self, parser): parser.add_argument('username', nargs=1) @@ -40,3 +41,4 @@ password = ctx.args.password or getpass.getpass('Password: ') password = generate_password_hash(password) logger.info("%s = %s" % (username[0], password)) +
--- a/wikked/templates/login.html Sat Sep 19 22:01:14 2015 -0700 +++ b/wikked/templates/login.html Sat Sep 19 22:01:42 2015 -0700 @@ -11,7 +11,7 @@ <strong>Begone!</strong> Those credentials don't seem to work here. </div> {%endif%} - <form id="login" class="pure-form pure-form-stacked" role="form"> + <form id="login" class="pure-form pure-form-stacked" role="form" action="/login" method="POST"> <fieldset> <input type="text" name="username" for="remember" class="form-control" placeholder="Username" required="true" autofocus="true"></input> <input type="password" name="password" placeholder="Password" required="true"></input>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wikked/templates/logout.html Sat Sep 19 22:01:42 2015 -0700 @@ -0,0 +1,22 @@ +{% extends 'index.html' %} +{% block content %} +<article> + <header> + <h1>Logout</h1> + </header> + <section> + <form id="login" class="pure-form pure-form-stacked" role="form" action="/logout" method="POST"> + {%if already_logged_in%} + <p>You're already logged in as <a href="{{auth.url_profile}}">{{auth.username}}</a>. + If you want to log in as someone else, you can log out first.</p> + {%else%} + <p>Hi <a href="{{auth.url_profile}}">{{auth.username}}</a>, you can log out here.</p> + {%endif%} + <fieldset> + <button class="pure-button pure-button-primary" type="submit">Log out</button> + </fieldset> + </form> + </section> +</article> +{% endblock %} +
--- a/wikked/views/__init__.py Sat Sep 19 22:01:14 2015 -0700 +++ b/wikked/views/__init__.py Sat Sep 19 22:01:42 2015 -0700 @@ -3,14 +3,15 @@ def add_auth_data(data): + username = current_user.get_id() if current_user.is_authenticated(): - user_page_url = 'user:/%s' % current_user.get_id() + user_page_url = 'user:/%s' % username.title() data['auth'] = { 'is_logged_in': True, - 'username': current_user.username, + 'username': username, 'is_admin': current_user.is_admin(), 'url_logout': '/logout', - 'url_profile': '/read/' % user_page_url + 'url_profile': '/read/%s' % user_page_url } else: data['auth'] = {
--- a/wikked/views/admin.py Sat Sep 19 22:01:14 2015 -0700 +++ b/wikked/views/admin.py Sat Sep 19 22:01:42 2015 -0700 @@ -1,28 +1,53 @@ from flask import request, redirect, render_template -from flask.ext.login import login_user, logout_user +from flask.ext.login import login_user, logout_user, current_user +from wikked.views import add_auth_data, add_navigation_data from wikked.web import app, get_wiki -@app.route('/login') +@app.route('/login', methods=['GET', 'POST']) def login(): - username = request.form.get('username') - password = request.form.get('password') - remember = request.form.get('remember') - back_url = request.form.get('back_url') - wiki = get_wiki() - user = wiki.auth.getUser(username) - if user is not None and app.bcrypt: - if app.bcrypt.check_password_hash(user.password, password): - login_user(user, remember=bool(remember)) - return redirect(back_url or '/') + + data = {} + add_auth_data(data) + add_navigation_data( + None, data, + raw_url='/api/user/login') + + if request.method == 'GET': + if current_user.is_authenticated(): + data['already_logged_in'] = True + return render_template('logout.html', **data) + else: + return render_template('login.html', **data) - data = {'has_error': True} - return render_template('login.html', **data) + if request.method == 'POST': + username = request.form.get('username') + password = request.form.get('password') + remember = request.form.get('remember') + back_url = request.form.get('back_url') + + user = wiki.auth.getUser(username) + if user is not None and app.bcrypt: + if app.bcrypt.check_password_hash(user.password, password): + login_user(user, remember=bool(remember)) + return redirect(back_url or '/') + + data['has_error'] = True + return render_template('login.html', **data) -@app.route('/logout') +@app.route('/logout', methods=['GET', 'POST']) def logout(): - logout_user() - redirect('/') + if request.method == 'GET': + data = {} + add_auth_data(data) + add_navigation_data( + None, data, + raw_url='/api/user/logout') + return render_template('logout.html', **data) + if request.method == 'POST': + logout_user() + return redirect('/') +