From 3ee20cbb3a4d11701c61edff4ef26e3dbdc760a7 Mon Sep 17 00:00:00 2001 From: nd <git@notandy.de> Date: Sun, 12 Jul 2020 23:52:09 +0200 Subject: [PATCH] hide not accessable items from navbar --- uffd/group/views.py | 4 ++-- uffd/navbar.py | 3 ++- uffd/selfservice/views.py | 4 ++-- uffd/session/__init__.py | 2 +- uffd/session/views.py | 7 ++++--- uffd/templates/base.html | 12 +++++++++++- uffd/user/views.py | 4 ++-- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/uffd/group/views.py b/uffd/group/views.py index 07f4ee00..cc4583ec 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 d3ff77d4..462626a2 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 a6204a56..fe8e5035 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 2009dfac..a7391f91 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 d1364e40..d65dc3fa 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 8e3db300..bc28ec2f 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 ca0a7823..ed38feaa 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)') -- GitLab