diff --git a/uffd/__init__.py b/uffd/__init__.py index bef39eba8c45091e02a8ed8a29651ba0264938aa..30280972254264079a66fbbbca645776340bfb0b 100644 --- a/uffd/__init__.py +++ b/uffd/__init__.py @@ -40,10 +40,10 @@ def create_app(test_config=None): db.init_app(app) # pylint: disable=C0415 - from uffd import user, group, selfservice, session, csrf, ldap + from uffd import user, selfservice, session, csrf, ldap # 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.route("/") diff --git a/uffd/default_config.cfg b/uffd/default_config.cfg index c1c227a984324040e43915bb959b6c10e20f2ef5..d616cc5fe22da5b23e1bf8fac9eef9695ee792c1 100644 --- a/uffd/default_config.cfg +++ b/uffd/default_config.cfg @@ -8,3 +8,4 @@ LDAP_USER_GID=20001 LDAP_USER_MIN_UID=10000 LDAP_USER_MAX_UID=18999 SESSION_LIFETIME_SECONDS=3600 +ACL_LDAP_GROUP_USEREDIT="admins" diff --git a/uffd/group/__init__.py b/uffd/group/__init__.py deleted file mode 100644 index 1cb45d0ffb61bed50f81e37e30cb7e5dc8cc1ba9..0000000000000000000000000000000000000000 --- a/uffd/group/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .views import bp as ui_bp - -bp = [ui_bp] diff --git a/uffd/group/models.py b/uffd/group/models.py deleted file mode 100644 index 5006c097a3878e47c8fac2fcef188824f404048a..0000000000000000000000000000000000000000 --- a/uffd/group/models.py +++ /dev/null @@ -1,47 +0,0 @@ -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 diff --git a/uffd/group/views.py b/uffd/group/views.py deleted file mode 100644 index d14e2ad33b41f41f8494b4dfdd43a0caffc17e89..0000000000000000000000000000000000000000 --- a/uffd/group/views.py +++ /dev/null @@ -1,32 +0,0 @@ -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) diff --git a/uffd/selfservice/views.py b/uffd/selfservice/views.py index 360779854ff54e5b6e0bfc731fbe610a9fb61f37..21b01a20aaddb5b24aeacaa029d80972e7211a43 100644 --- a/uffd/selfservice/views.py +++ b/uffd/selfservice/views.py @@ -3,8 +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.user.models import User -from uffd.group.models import Group +from uffd.user.models import User, Group from uffd.session import get_current_user, login_required, is_valid_session from uffd.ldap import get_conn, escape_filter_chars diff --git a/uffd/user/__init__.py b/uffd/user/__init__.py index 1cb45d0ffb61bed50f81e37e30cb7e5dc8cc1ba9..fc51d02b877849cd9e815f853c917d5001ab451e 100644 --- a/uffd/user/__init__.py +++ b/uffd/user/__init__.py @@ -1,3 +1,3 @@ -from .views import bp as ui_bp +from .views import bp_user, bp_group -bp = [ui_bp] +bp = [bp_user, bp_group] diff --git a/uffd/user/models.py b/uffd/user/models.py index 4a711b1319cd7b761b74efc33c9dd247435df921..2c8792aec698f84f3691c0e06c3106019303cbde 100644 --- a/uffd/user/models.py +++ b/uffd/user/models.py @@ -71,7 +71,6 @@ class User(): return result def get_groups(self): - from uffd.group.models import Group if self._groups: return self._groups groups = [] @@ -108,3 +107,48 @@ class User(): def set_password(self, 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 diff --git a/uffd/group/templates/group.html b/uffd/user/templates/group.html similarity index 100% rename from uffd/group/templates/group.html rename to uffd/user/templates/group.html diff --git a/uffd/group/templates/group_list.html b/uffd/user/templates/group_list.html similarity index 100% rename from uffd/group/templates/group_list.html rename to uffd/user/templates/group_list.html diff --git a/uffd/user/views.py b/uffd/user/views.py index b2217d814398e1e8524ac1d21b3dbebf228e7f93..c24ab9facaab06a45e7a079ac6bd13bc363d3d77 100644 --- a/uffd/user/views.py +++ b/uffd/user/views.py @@ -5,17 +5,17 @@ from uffd.csrf import csrf_protect from uffd.ldap import get_conn, escape_filter_chars 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.before_request -@login_required(group='admins') +bp_user = Blueprint("user", __name__, template_folder='templates', url_prefix='/user/') +@bp_user.before_request +#@login_required(group=current_app.config('ACL_LDAP_GROUP_USEREDIT')) +@login_required() def user_acl(): pass -@bp.route("/") -@register_navbar('Users', icon='users', blueprint=bp, visible=is_valid_session) +@bp_user.route("/") +@register_navbar('Users', icon='users', blueprint=bp_user, visible=is_valid_session) def user_list(): conn = get_conn() conn.search(current_app.config["LDAP_BASE_USER"], '(objectclass=person)') @@ -24,8 +24,8 @@ def user_list(): users.append(User.from_ldap(i)) return render_template('user_list.html', users=users) -@bp.route("/<int:uid>") -@bp.route("/new") +@bp_user.route("/<int:uid>") +@bp_user.route("/new") def user_show(uid=None): if not uid: user = User() @@ -38,8 +38,8 @@ def user_show(uid=None): ldif = conn.entries[0].entry_to_ldif() return render_template('user.html', user=user, user_ldif=ldif) -@bp.route("/<int:uid>/update", methods=['POST']) -@bp.route("/new", methods=['POST']) +@bp_user.route("/<int:uid>/update", methods=['POST']) +@bp_user.route("/new", methods=['POST']) def user_update(uid=False): conn = get_conn() if uid: @@ -65,7 +65,7 @@ def user_update(uid=False): flash('Error updating user: {}'.format(conn.result['message'])) return redirect(url_for('.user_list')) -@bp.route("/<int:uid>/del") +@bp_user.route("/<int:uid>/del") @csrf_protect def user_delete(uid): conn = get_conn() @@ -76,3 +76,27 @@ def user_delete(uid): else: flash('Could not delete user: {}'.format(conn.result['message'])) 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)