diff --git a/uffd/group/views.py b/uffd/group/views.py index 07f4ee00d92208a5f99cdc976e469c8b85d43550..cc4583ecb7eaccce5b46bcbf5b3e2f1099abc157 100644 --- a/uffd/group/views.py +++ b/uffd/group/views.py @@ -2,7 +2,7 @@ from flask import Blueprint, current_app, render_template from uffd.navbar import register_navbar from uffd.ldap import get_conn, escape_filter_chars -from uffd.session import login_required +from uffd.session import login_required, is_valid_session from .models import Group @@ -14,7 +14,7 @@ def group_acl(): pass @bp.route("/") -@register_navbar('Groups', icon='layer-group', blueprint=bp) +@register_navbar('Groups', icon='layer-group', blueprint=bp, visible=is_valid_session) def group_list(): conn = get_conn() conn.search(current_app.config["LDAP_BASE_GROUPS"], '(objectclass=groupOfUniqueNames)') diff --git a/uffd/navbar.py b/uffd/navbar.py index d3ff77d4e35da0c30b708434d7ed36b6adda80f4..462626a2b89c40c16b35087332ad03200b367042 100644 --- a/uffd/navbar.py +++ b/uffd/navbar.py @@ -9,7 +9,7 @@ def setup_navbar(app): # ( see: http://getbootstrap.com/components/#glyphicons ) # or 'fa' # ( see: http://fontawesome.io/icons/ ) -def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None): +def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None): def wrapper(func): urlendpoint = endpoint if not endpoint: @@ -26,6 +26,7 @@ def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, bl item['endpoint'] = urlendpoint item['name'] = name item['blueprint'] = blueprint + item['visible'] = visible navbarList.append(item) return func return wrapper diff --git a/uffd/selfservice/views.py b/uffd/selfservice/views.py index a6204a5695b9cbb615ef6a468290cf01b38a744c..fe8e50354ab8c8cc23ed2fe0e2c1796d62235b2c 100644 --- a/uffd/selfservice/views.py +++ b/uffd/selfservice/views.py @@ -5,7 +5,7 @@ from uffd.csrf import csrf_protect from uffd.user.models import User from uffd.group.models import Group -from uffd.session import get_current_user, login_required +from uffd.session import get_current_user, login_required, is_valid_session from uffd.ldap import get_conn, escape_filter_chars bp = Blueprint("selfservice", __name__, template_folder='templates', url_prefix='/self/') @@ -16,7 +16,7 @@ def self_acl(): pass @bp.route("/") -@register_navbar('Selfservice', icon='portrait', blueprint=bp) +@register_navbar('Selfservice', icon='portrait', blueprint=bp, visible=is_valid_session) def self_index(): return render_template('self.html', user=get_current_user()) diff --git a/uffd/session/__init__.py b/uffd/session/__init__.py index 2009dfac27a084a878256dd63ac19ac73603f832..a7391f91f1b2289966aaefa00479469d8734b9a6 100644 --- a/uffd/session/__init__.py +++ b/uffd/session/__init__.py @@ -1,3 +1,3 @@ -from .views import bp as bp_ui, get_current_user, login_required, is_user_in_group +from .views import bp as bp_ui, get_current_user, login_required, is_user_in_group, is_valid_session bp = [bp_ui] diff --git a/uffd/session/views.py b/uffd/session/views.py index d1364e40a8b243ae60337856c47e2e2318331edf..d65dc3fa9d94f292e8eddd7b63c87dde0fd6e302 100644 --- a/uffd/session/views.py +++ b/uffd/session/views.py @@ -10,7 +10,6 @@ from uffd.ldap import get_conn, user_conn, uid_to_dn bp = Blueprint("session", __name__, template_folder='templates', url_prefix='/') -@register_navbar('Logout', icon='sign-out-alt', blueprint=bp) @bp.route("/logout") def logout(): session.clear() @@ -34,7 +33,7 @@ def login(): user = User.from_ldap(conn.entries[0]) session['user_uid'] = user.uid session['logintime'] = datetime.datetime.now().timestamp() - return redirect(url_for('index')) + return redirect(request.values.get('ref', url_for('index'))) def get_current_user(): if not session.get('user_uid'): @@ -49,16 +48,18 @@ def is_valid_session(): flash('Session timed out') return False return True +bp.add_app_template_global(is_valid_session) def is_user_in_group(user, group): return True +bp.add_app_template_global(is_user_in_group) def login_required(view, group=None): @functools.wraps(view) def wrapped_view(**kwargs): if not is_valid_session(): flash('You need to login first') - return redirect(url_for('session.login')) + return redirect(url_for('session.login', ref=request.url)) if not is_user_in_group(get_current_user, group): flash('Access denied') return redirect(url_for('index')) diff --git a/uffd/templates/base.html b/uffd/templates/base.html index 8e3db3000ffd2f52dc4ef1da6950f950c3f8af62..bc28ec2fd012260918fcca83c37cd50d6cd42518 100644 --- a/uffd/templates/base.html +++ b/uffd/templates/base.html @@ -42,7 +42,7 @@ <div class="collapse navbar-collapse" id="baseNavbar"> <ul class="navbar-nav mr-auto"> - {% for n in navbar if (not n.group) %} + {% for n in navbar if (not n.group) and (not n.visible or n.visible()) %} {{ navbaricon(n) }} {% endfor %} @@ -66,6 +66,16 @@ </li> {% endfor %} </ul> + {% if is_valid_session() %} + <ul class="navbar-nav ml-auto"> + <li class="nav-item"> + <a class="nav-link" href="{{ url_for("session.logout") }}"> + <span aria-hidden="true" class="fa fa-sign-out-alt"></span> + Logout + </a> + </li> + </ul> + {% endif %} </div> diff --git a/uffd/user/views.py b/uffd/user/views.py index ca0a78238f333261e2866eb11637e18375ab5851..ed38feaa2fb82815ea76373bd041fee36a0daea2 100644 --- a/uffd/user/views.py +++ b/uffd/user/views.py @@ -3,7 +3,7 @@ from flask import Blueprint, render_template, request, url_for, redirect, flash, from uffd.navbar import register_navbar from uffd.csrf import csrf_protect from uffd.ldap import get_conn, escape_filter_chars -from uffd.session import login_required +from uffd.session import login_required, is_valid_session from .models import User @@ -15,7 +15,7 @@ def user_acl(): pass @bp.route("/") -@register_navbar('Users', icon='users', blueprint=bp) +@register_navbar('Users', icon='users', blueprint=bp, visible=is_valid_session) def user_list(): conn = get_conn() conn.search(current_app.config["LDAP_BASE_USER"], '(objectclass=person)')