From ef2619bdf488b2d11f19e87a8bdf09c4fcbacda4 Mon Sep 17 00:00:00 2001
From: nd <git@notandy.de>
Date: Mon, 13 Jul 2020 01:09:06 +0200
Subject: [PATCH] merged user and group blueprint

---
 uffd/__init__.py                              |  4 +-
 uffd/default_config.cfg                       |  1 +
 uffd/group/__init__.py                        |  3 --
 uffd/group/models.py                          | 47 ------------------
 uffd/group/views.py                           | 32 -------------
 uffd/selfservice/views.py                     |  3 +-
 uffd/user/__init__.py                         |  4 +-
 uffd/user/models.py                           | 46 +++++++++++++++++-
 uffd/{group => user}/templates/group.html     |  0
 .../{group => user}/templates/group_list.html |  0
 uffd/user/views.py                            | 48 ++++++++++++++-----
 11 files changed, 87 insertions(+), 101 deletions(-)
 delete mode 100644 uffd/group/__init__.py
 delete mode 100644 uffd/group/models.py
 delete mode 100644 uffd/group/views.py
 rename uffd/{group => user}/templates/group.html (100%)
 rename uffd/{group => user}/templates/group_list.html (100%)

diff --git a/uffd/__init__.py b/uffd/__init__.py
index bef39eba..30280972 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 c1c227a9..d616cc5f 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 1cb45d0f..00000000
--- 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 5006c097..00000000
--- 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 d14e2ad3..00000000
--- 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 36077985..21b01a20 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 1cb45d0f..fc51d02b 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 4a711b13..2c8792ae 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 b2217d81..c24ab9fa 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)
-- 
GitLab