]> git.ipfire.org Git - ipfire.org.git/commitdiff
people: Show group memberships
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 28 Oct 2019 19:35:16 +0000 (19:35 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 28 Oct 2019 19:35:16 +0000 (19:35 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/accounts.py
src/backend/base.py
src/templates/people/user.html

index 3e6412f26a4d40c7eed6ccf803f391f1781d5716..57e3b8c272750aeb0190770b89ca2c294257af92 100644 (file)
@@ -679,16 +679,14 @@ class Account(Object):
        @lazy_property
        def groups(self):
                groups = self.memcache.get("accounts:%s:groups" % self.dn)
-               if groups:
-                       return groups
+               if not groups:
+                       # Fetch groups from LDAP
+                       groups = self._get_groups()
 
-               # Fetch groups from LDAP
-               groups = self._get_groups()
+                       # Cache groups for 5 min
+                       self.memcache.set("accounts:%s:groups" % self.dn, groups, 300)
 
-               # Cache groups for 5 min
-               self.memcache.set("accounts:%s:groups" % self.dn, groups, 300)
-
-               return groups
+               return sorted((Group(self.backend, gid) for gid in groups))
 
        def _get_groups(self):
                groups = []
@@ -1066,6 +1064,67 @@ class StopForumSpam(Object):
                return 100 - min(confidences)
 
 
+
+class Groups(Object):
+       @property
+       def search_base(self):
+               return "ou=Group,%s" % self.backend.accounts.search_base
+
+
+class Group(Object):
+       def init(self, gid):
+               self.gid = gid
+
+       def __repr__(self):
+               if self.description:
+                       return "<%s %s (%s)>" % (
+                               self.__class__.__name__,
+                               self.gid,
+                               self.description,
+                       )
+
+               return "<%s %s>" % (self.__class__.__name__, self.gid)
+
+       def __str__(self):
+               return self.description or self.gid
+
+       def __eq__(self, other):
+               if isinstance(other, self.__class__):
+                       return self.gid == other.gid
+
+       def __lt__(self, other):
+               if isinstance(other, self.__class__):
+                       return (self.description or self.gid) < (other.description or other.gid)
+
+       @lazy_property
+       def attributes(self):
+               attrs = self.memcache.get("groups:%s:attrs" % self.gid)
+               if not attrs:
+                       attrs = self._get_attrs()
+
+                       # Cache this for 5 mins
+                       self.memcache.set("groups:%s:attrs" % self.gid, attrs, 300)
+
+               return attrs
+
+       def _get_attrs(self):
+               res = self.backend.accounts._query(
+                       "(&(|(objectClass=posixGroup)(objectClass=groupOfNames))(cn=%s))" % self.gid,
+                       search_base=self.backend.groups.search_base, limit=1)
+
+               for dn, attrs in res:
+                       return attrs
+
+       @property
+       def description(self):
+               try:
+                       description = self.attributes["description"][0]
+               except KeyError:
+                       return None
+
+               return description.decode()
+
+
 if __name__ == "__main__":
        a = Accounts()
 
index e0af11caa4a47fa12a79693d85b8e8bef37cacef..ebd74a00b70345271e7500cc8077b34e5a920912 100644 (file)
@@ -121,6 +121,10 @@ class Backend(object):
                if r:
                        raise SystemExit(r)
 
+       @lazy_property
+       def groups(self):
+               return accounts.Groups(self)
+
        @lazy_property
        def messages(self):
                return messages.Messages(self)
index edbef8aed830fb96b01c70d80b27428c48ef62df..f3736729da8a3683003b7a2c59d1ba9ebc48d330 100644 (file)
@@ -3,7 +3,7 @@
 {% block main %}
        {% import phonenumbers %}
 
-       <div class="card p-3 mb-3">
+       <div class="card mb-3">
                <div class="card-body">
                        <div class="row">
                                <div class="col">
                                </div>
                        {% end %}
                </div>
+
+               {% if account.groups %}
+                       <div class="card-body">
+                               <div class="row">
+                                       <div class="col">
+                                               <h6 class="mb-0">{{ _("Groups") }}</h6>
+                                       </div>
+                               </div>
+                       </div>
+
+                       <ul class="list-group list-group-flush">
+                               {% for g in account.groups %}
+                                       <li class="list-group-item">
+                                               <i class="fas fa-users mr-2"></i>
+                                               {{ g }}
+                                       </li>
+                               {% end %}
+                       </ul>
+               {% end %}
        </div>
 
        <ul class="list-unstyled small text-muted">