Ticket #1622: LdapPlugin-api.py-2262-group_rdn-patch.txt

File LdapPlugin-api.py-2262-group_rdn-patch.txt, 3.2 kB (added by JimPage, 1 year ago)

Subversion diff ldapplugin/api.py

Line 
1 Index: ldapplugin/api.py
2 ===================================================================
3 --- ldapplugin/api.py   (revision 2262)
4 +++ ldapplugin/api.py   (working copy)
5 @@ -146,15 +146,24 @@
6
7      def _get_user_groups(self, username):
8          """Returns a list of all groups a user belongs to"""
9 -        ldap_groups = self._ldap.get_groups()
10 +        ldap_groups = self._ldap.get_groups(self.util.get_group_rdn())
11 +        ## dump some useful debug
12 +        ## outp = open("/tmp/trac2.log","a")
13          groups = []
14          for group in ldap_groups:
15 -            if self._ldap.is_in_group(self.util.user_attrdn(username), group):
16 -                m = DN_RE.search(group)
17 -                if m:
18 -                    groupname = GROUP_PREFIX + m.group('rdn')
19 -                    if groupname not in groups:
20 -                        groups.append(groupname)
21 +            rdntuple = self.util.user_attrdn(username)
22 +            for rdnitem in rdntuple:
23 +                ## print >> outp, ("user: %s - trying group %s (userdn=%s)" % (username,group,rdnitem))
24 +                if group!=None:
25 +                    if self._ldap.is_in_group(rdnitem, group):
26 +                        m = DN_RE.search(group)
27 +                        if m:
28 +                            groupname = GROUP_PREFIX + m.group('rdn')
29 +                            if groupname not in groups:
30 +                                groups.append(groupname)
31 +                            ##print >> outp, ("  group %s: found %s" % (group,groupname))
32 +        ##print >> outp, ("---")
33 +        ##outp.close()
34          return groups
35
36  class LdapPermissionStore(Component):
37 @@ -453,6 +462,9 @@
38
39      def is_group(self, username):
40          return username.startswith(GROUP_PREFIX)
41 +
42 +    def get_group_rdn(self):
43 +        return self.group_rdn
44
45      def create_dn(self, username):
46          """Create a user or group LDAP DN from his/its name"""
47 @@ -471,11 +483,13 @@
48
49      def user_attrdn(self, user):
50          """Build the dn for a user"""
51 +        # in all cases we return a list, even if the list
52 +        # consists of one item
53          if self.user_rdn:
54 -            return "%s=%s,%s,%s" % \
55 -                   (self.uidattr, user, self.user_rdn, self.basedn)
56 +            rdntuple = self.user_rdn.split('|')
57 +            return [ "%s=%s,%s,%s" % (self.uidattr, user, rdnitem, self.basedn) for rdnitem in rdntuple ]
58          else:
59 -            return "%s=%s,%s" % (self.uidattr, user, self.basedn)
60 +            return ["%s=%s,%s" % (self.uidattr, user, self.basedn)]
61
62      def extract_user_from_dn(self, dn):
63          m = DN_RE.search(dn)
64 @@ -536,9 +550,12 @@
65          self._ds.unbind_s()
66          self._ds = None
67
68 -    def get_groups(self):
69 +    def get_groups(self, group_rdn):
70          """Return a list of available group dns"""
71 -        groups = self.get_dn(self.basedn, 'objectclass=' + self.groupname)
72 +        if group_rdn:
73 +            groups = self.get_dn("%s,%s" % (group_rdn,self.basedn), 'objectclass=' + self.groupname)
74 +        else:
75 +            groups = self.get_dn(self.basedn, 'objectclass=' + self.groupname)
76          return groups
77
78      def is_in_group(self, userdn, groupdn):