Skip to content
Snippets Groups Projects
Verified Commit ef2619bd authored by nd's avatar nd
Browse files

merged user and group blueprint

parent e1b6cc1f
No related branches found
No related tags found
No related merge requests found
...@@ -40,10 +40,10 @@ def create_app(test_config=None): ...@@ -40,10 +40,10 @@ def create_app(test_config=None):
db.init_app(app) db.init_app(app)
# pylint: disable=C0415 # pylint: disable=C0415
from uffd import user, group, selfservice, session, csrf, ldap from uffd import user, selfservice, session, csrf, ldap
# pylint: enable=C0415 # pylint: enable=C0415
for i in user.bp + group.bp + selfservice.bp + session.bp + csrf.bp + ldap.bp: for i in user.bp + selfservice.bp + session.bp + csrf.bp + ldap.bp:
app.register_blueprint(i) app.register_blueprint(i)
@app.route("/") @app.route("/")
......
...@@ -8,3 +8,4 @@ LDAP_USER_GID=20001 ...@@ -8,3 +8,4 @@ LDAP_USER_GID=20001
LDAP_USER_MIN_UID=10000 LDAP_USER_MIN_UID=10000
LDAP_USER_MAX_UID=18999 LDAP_USER_MAX_UID=18999
SESSION_LIFETIME_SECONDS=3600 SESSION_LIFETIME_SECONDS=3600
ACL_LDAP_GROUP_USEREDIT="admins"
from .views import bp as ui_bp
bp = [ui_bp]
from uffd import ldap
class Group():
gid = None
name = None
description = None
def __init__(self, gid=None, name='', members=None, description=''):
self.gid = gid
self.name = name
if isinstance(members, str):
members = [members]
self.members_ldap = members
self._members = None
self.description = description
@classmethod
def from_ldap(cls, ldapobject):
return Group(
gid=ldapobject['gidNumber'].value,
name=ldapobject['cn'].value,
members=ldapobject['uniqueMember'],
description=ldapobject['description'].value if 'description' in ldapobject else '',
)
@classmethod
def from_ldap_dn(cls, dn):
conn = ldap.get_conn()
conn.search(dn, '(objectClass=groupOfUniqueNames)')
if not len(conn.entries) == 1:
return None
return Group.from_ldap(conn.entries[0])
def to_ldap(self, new):
pass
def get_members(self):
from uffd.user.models import User
if self._members:
return self._members
members = []
for i in self.members_ldap:
newmember = User.from_ldap_dn(i)
if newmember:
members.append(newmember)
self._members = members
return members
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, is_valid_session
from .models import Group
bp = Blueprint("group", __name__, template_folder='templates', url_prefix='/group/')
@bp.before_request
@login_required()
def group_acl():
pass
@bp.route("/")
@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)')
groups = []
for i in conn.entries:
groups.append(Group.from_ldap(i))
return render_template('group_list.html', groups=groups)
@bp.route("/<int:gid>")
def group_show(gid):
conn = get_conn()
conn.search(current_app.config["LDAP_BASE_GROUPS"], '(&(objectclass=groupOfUniqueNames)(gidNumber={}))'.format((escape_filter_chars(gid))))
assert len(conn.entries) == 1
group = Group.from_ldap(conn.entries[0])
return render_template('group.html', group=group)
...@@ -3,8 +3,7 @@ from flask import Blueprint, render_template, request, url_for, redirect, flash, ...@@ -3,8 +3,7 @@ from flask import Blueprint, render_template, request, url_for, redirect, flash,
from uffd.navbar import register_navbar from uffd.navbar import register_navbar
from uffd.csrf import csrf_protect from uffd.csrf import csrf_protect
from uffd.user.models import User from uffd.user.models import User, Group
from uffd.group.models import Group
from uffd.session import get_current_user, login_required, is_valid_session from uffd.session import get_current_user, login_required, is_valid_session
from uffd.ldap import get_conn, escape_filter_chars from uffd.ldap import get_conn, escape_filter_chars
......
from .views import bp as ui_bp from .views import bp_user, bp_group
bp = [ui_bp] bp = [bp_user, bp_group]
...@@ -71,7 +71,6 @@ class User(): ...@@ -71,7 +71,6 @@ class User():
return result return result
def get_groups(self): def get_groups(self):
from uffd.group.models import Group
if self._groups: if self._groups:
return self._groups return self._groups
groups = [] groups = []
...@@ -108,3 +107,48 @@ class User(): ...@@ -108,3 +107,48 @@ class User():
def set_password(self, value): def set_password(self, value):
self.newpassword = value self.newpassword = value
class Group():
gid = None
name = None
description = None
def __init__(self, gid=None, name='', members=None, description=''):
self.gid = gid
self.name = name
if isinstance(members, str):
members = [members]
self.members_ldap = members
self._members = None
self.description = description
@classmethod
def from_ldap(cls, ldapobject):
return Group(
gid=ldapobject['gidNumber'].value,
name=ldapobject['cn'].value,
members=ldapobject['uniqueMember'],
description=ldapobject['description'].value if 'description' in ldapobject else '',
)
@classmethod
def from_ldap_dn(cls, dn):
conn = ldap.get_conn()
conn.search(dn, '(objectClass=groupOfUniqueNames)')
if not len(conn.entries) == 1:
return None
return Group.from_ldap(conn.entries[0])
def to_ldap(self, new):
pass
def get_members(self):
if self._members:
return self._members
members = []
for i in self.members_ldap:
newmember = User.from_ldap_dn(i)
if newmember:
members.append(newmember)
self._members = members
return members
File moved
...@@ -5,17 +5,17 @@ from uffd.csrf import csrf_protect ...@@ -5,17 +5,17 @@ from uffd.csrf import csrf_protect
from uffd.ldap import get_conn, escape_filter_chars from uffd.ldap import get_conn, escape_filter_chars
from uffd.session import login_required, is_valid_session from uffd.session import login_required, is_valid_session
from .models import User from .models import User, Group
bp = Blueprint("user", __name__, template_folder='templates', url_prefix='/user/') bp_user = Blueprint("user", __name__, template_folder='templates', url_prefix='/user/')
@bp_user.before_request
@bp.before_request #@login_required(group=current_app.config('ACL_LDAP_GROUP_USEREDIT'))
@login_required(group='admins') @login_required()
def user_acl(): def user_acl():
pass pass
@bp.route("/") @bp_user.route("/")
@register_navbar('Users', icon='users', blueprint=bp, visible=is_valid_session) @register_navbar('Users', icon='users', blueprint=bp_user, visible=is_valid_session)
def user_list(): def user_list():
conn = get_conn() conn = get_conn()
conn.search(current_app.config["LDAP_BASE_USER"], '(objectclass=person)') conn.search(current_app.config["LDAP_BASE_USER"], '(objectclass=person)')
...@@ -24,8 +24,8 @@ def user_list(): ...@@ -24,8 +24,8 @@ def user_list():
users.append(User.from_ldap(i)) users.append(User.from_ldap(i))
return render_template('user_list.html', users=users) return render_template('user_list.html', users=users)
@bp.route("/<int:uid>") @bp_user.route("/<int:uid>")
@bp.route("/new") @bp_user.route("/new")
def user_show(uid=None): def user_show(uid=None):
if not uid: if not uid:
user = User() user = User()
...@@ -38,8 +38,8 @@ def user_show(uid=None): ...@@ -38,8 +38,8 @@ def user_show(uid=None):
ldif = conn.entries[0].entry_to_ldif() ldif = conn.entries[0].entry_to_ldif()
return render_template('user.html', user=user, user_ldif=ldif) return render_template('user.html', user=user, user_ldif=ldif)
@bp.route("/<int:uid>/update", methods=['POST']) @bp_user.route("/<int:uid>/update", methods=['POST'])
@bp.route("/new", methods=['POST']) @bp_user.route("/new", methods=['POST'])
def user_update(uid=False): def user_update(uid=False):
conn = get_conn() conn = get_conn()
if uid: if uid:
...@@ -65,7 +65,7 @@ def user_update(uid=False): ...@@ -65,7 +65,7 @@ def user_update(uid=False):
flash('Error updating user: {}'.format(conn.result['message'])) flash('Error updating user: {}'.format(conn.result['message']))
return redirect(url_for('.user_list')) return redirect(url_for('.user_list'))
@bp.route("/<int:uid>/del") @bp_user.route("/<int:uid>/del")
@csrf_protect @csrf_protect
def user_delete(uid): def user_delete(uid):
conn = get_conn() conn = get_conn()
...@@ -76,3 +76,27 @@ def user_delete(uid): ...@@ -76,3 +76,27 @@ def user_delete(uid):
else: else:
flash('Could not delete user: {}'.format(conn.result['message'])) flash('Could not delete user: {}'.format(conn.result['message']))
return redirect(url_for('.user_list')) return redirect(url_for('.user_list'))
bp_group = Blueprint("group", __name__, template_folder='templates', url_prefix='/group/')
@bp_group.before_request
@login_required()
def group_acl():
pass
@bp_group.route("/")
@register_navbar('Groups', icon='layer-group', blueprint=bp_group, visible=is_valid_session)
def group_list():
conn = get_conn()
conn.search(current_app.config["LDAP_BASE_GROUPS"], '(objectclass=groupOfUniqueNames)')
groups = []
for i in conn.entries:
groups.append(Group.from_ldap(i))
return render_template('group_list.html', groups=groups)
@bp_group.route("/<int:gid>")
def group_show(gid):
conn = get_conn()
conn.search(current_app.config["LDAP_BASE_GROUPS"], '(&(objectclass=groupOfUniqueNames)(gidNumber={}))'.format((escape_filter_chars(gid))))
assert len(conn.entries) == 1
group = Group.from_ldap(conn.entries[0])
return render_template('group.html', group=group)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment