From bef47ee8a388c996db9169254d03a715a1df1346 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 29 Oct 2019 11:15:13 +0000 Subject: [PATCH] people: List group members Signed-off-by: Michael Tremer --- src/backend/accounts.py | 34 ++++++++++++++++++++++++++++++ src/templates/people/group.html | 37 +++++++++++++++++++++++++++++++++ src/web/__init__.py | 1 + src/web/people.py | 15 +++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 src/templates/people/group.html diff --git a/src/backend/accounts.py b/src/backend/accounts.py index ca6b991e..1a6b90b3 100644 --- a/src/backend/accounts.py +++ b/src/backend/accounts.py @@ -1104,11 +1104,25 @@ class Groups(Object): return sorted(groups) + def _get_group(self, query, **kwargs): + kwargs.update({ + "limit" : 1, + }) + + groups = self._get_groups(query, **kwargs) + if groups: + return groups[0] + def get_all(self): return self._get_groups( "(|(objectClass=posixGroup)(objectClass=groupOfNames))", ) + def get_by_gid(self, gid): + return self._get_group( + "(&(|(objectClass=posixGroup)(objectClass=groupOfNames))(cn=%s))" % gid, + ) + class Group(Object): def init(self, dn, attrs=None): @@ -1150,6 +1164,9 @@ class Group(Object): return l + def __iter__(self): + return iter(self.members) + @property def gid(self): try: @@ -1168,6 +1185,23 @@ class Group(Object): return description.decode() + @lazy_property + def members(self): + members = [] + + # Get all members by DN + for dn in self.attributes.get("member", []): + member = self.backend.accounts.get_by_dn(dn.decode()) + if member: + members.append(member) + + # Get all meembers by UID + for uid in self.attributes.get("memberUid", []): + member = self.backend.accounts.get_by_uid(uid.decode()) + if member: + members.append(member) + + return sorted(members) if __name__ == "__main__": a = Accounts() diff --git a/src/templates/people/group.html b/src/templates/people/group.html new file mode 100644 index 00000000..849c3037 --- /dev/null +++ b/src/templates/people/group.html @@ -0,0 +1,37 @@ +{% extends "base.html" %} + +{% block title %}{{ group }}{% end block %} + +{% block sidebar %} +
+

+ {{ group }} +

+
+{% end block %} + +{% block main %} +
+
+
+ + {% if len(group) > 0 %} +
+
+
+
{{ _("Members") }}
+
+
+
+ +
    + {% for account in group %} +
  • + + {{ account }} +
  • + {% end %} +
+ {% end %} +
+{% end block %} diff --git a/src/web/__init__.py b/src/web/__init__.py index 072856f8..b40de815 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -271,6 +271,7 @@ class Application(tornado.web.Application): (r"/activate/(\w+)/(\w+)", auth.ActivateHandler), (r"/conferences", people.ConferencesHandler), (r"/groups", people.GroupsHandler), + (r"/groups/(\w+)", people.GroupHandler), (r"/register", auth.RegisterHandler), (r"/search", people.SearchHandler), (r"/users", people.UsersHandler), diff --git a/src/web/people.py b/src/web/people.py index 2d265cfa..fe167763 100644 --- a/src/web/people.py +++ b/src/web/people.py @@ -123,6 +123,21 @@ class GroupsHandler(auth.CacheMixin, base.BaseHandler): self.render("people/groups.html") +class GroupHandler(auth.CacheMixin, base.BaseHandler): + @tornado.web.authenticated + def get(self, gid): + # Only staff can see other groups + if not self.current_user.is_staff(): + raise tornado.web.HTTPError(403) + + # Fetch group + group = self.backend.groups.get_by_gid(gid) + if not group: + raise tornado.web.HTTPError(404, "Could not find group %s" % gid) + + self.render("people/group.html", group=group) + + class SearchHandler(auth.CacheMixin, base.BaseHandler): @tornado.web.authenticated def get(self): -- 2.47.3