Skip to content

Commit 7e953c2

Browse files
authored
Merge pull request #77 from jm66/get-groups
Adds get_groups method to provide an interface for
2 parents 09c62e9 + 7c8ddf1 commit 7e953c2

File tree

4 files changed

+50
-7
lines changed

4 files changed

+50
-7
lines changed

docs/index.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ directives:
8080
Default: '(&(objectclass=Person)(userPrincipalName=%s))'
8181
``LDAP_USER_GROUPS_FIELD`` The field to return when searching for a user's
8282
groups. Default: 'memberOf'.
83+
``LDAP_GROUPS_OBJECT_FILTER`` The filter to use when searching for groups objects.
84+
Default: 'objectclass=Group'
8385
``LDAP_GROUP_FIELDS`` ``list`` of fields to return when searching for a group's
8486
object details. Default: ``list`` (all).
8587
``LDAP_GROUP_OBJECT_FILTER`` The filter to use when searching for a group object.

examples/basic_auth/app_oldap.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
app.config['LDAP_OBJECTS_DN'] = 'dn'
1616
app.config['LDAP_USER_OBJECT_FILTER'] = '(&(objectclass=inetOrgPerson)(uid=%s))'
1717

18-
# Groups
19-
app.config['LDAP_GROUP_MEMBERS_FIELD'] = "uniquemember"
20-
app.config['LDAP_GROUP_OBJECT_FILTER'] = "(&(objectclass=groupOfUniqueNames)(cn=%s))"
21-
app.config['LDAP_GROUP_MEMBER_FILTER'] = "(&(cn=*)(objectclass=groupOfUniqueNames)(uniquemember=%s))"
18+
# Groups configuration
19+
app.config['LDAP_GROUP_MEMBERS_FIELD'] = 'uniquemember'
20+
app.config['LDAP_GROUP_OBJECT_FILTER'] = '(&(objectclass=groupOfUniqueNames)(cn=%s))'
21+
app.config['LDAP_GROUPS_OBJECT_FILTER'] = 'objectclass=groupOfUniqueNames'
22+
app.config['LDAP_GROUP_FIELDS'] = ['cn', 'entryDN', 'member', 'description']
23+
app.config['LDAP_GROUP_MEMBER_FILTER'] = '(&(cn=*)(objectclass=groupOfUniqueNames)(member=%s))'
2224
app.config['LDAP_GROUP_MEMBER_FILTER_FIELD'] = "cn"
2325

2426
ldap = LDAP(app)

examples/groups/app_oldap.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
app.config['LDAP_USER_OBJECT_FILTER'] = '(&(objectclass=inetOrgPerson)(uid=%s))'
1616

1717
# Group configuration
18-
app.config['LDAP_GROUP_MEMBERS_FIELD'] = "uniquemember"
19-
app.config['LDAP_GROUP_OBJECT_FILTER'] = "(&(objectclass=groupOfUniqueNames)(uniquemember=%s))"
20-
app.config['LDAP_GROUP_MEMBER_FILTER'] = "(&(cn=*)(objectclass=groupOfUniqueNames)(uniquemember=%s))"
18+
app.config['LDAP_GROUP_MEMBERS_FIELD'] = 'uniquemember'
19+
app.config['LDAP_GROUP_OBJECT_FILTER'] = '(&(objectclass=groupOfUniqueNames)(cn=%s))'
20+
app.config['LDAP_GROUPS_OBJECT_FILTER'] = 'objectclass=groupOfUniqueNames'
21+
app.config['LDAP_GROUP_FIELDS'] = ['cn', 'entryDN', 'member', 'description']
22+
app.config['LDAP_GROUP_MEMBER_FILTER'] = '(&(cn=*)(objectclass=groupOfUniqueNames)(member=%s))'
2123
app.config['LDAP_GROUP_MEMBER_FILTER_FIELD'] = "cn"
2224

2325
ldap = LDAP(app)

flask_simpleldap/__init__.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def init_app(app):
4949
'(&(objectclass=Person)(userPrincipalName=%s))')
5050
app.config.setdefault('LDAP_USER_GROUPS_FIELD', 'memberOf')
5151
app.config.setdefault('LDAP_GROUP_FIELDS', [])
52+
app.config.setdefault('LDAP_GROUPS_OBJECT_FILTER', 'objectclass=Group')
5253
app.config.setdefault('LDAP_GROUP_OBJECT_FILTER',
5354
'(&(objectclass=Group)(userPrincipalName=%s))')
5455
app.config.setdefault('LDAP_GROUP_MEMBERS_FIELD', 'member')
@@ -201,6 +202,42 @@ def get_object_details(self, user=None, group=None, query_filter=None,
201202
except ldap.LDAPError as e:
202203
raise LDAPException(self.error(e.args))
203204

205+
def get_groups(self, fields=None, dn_only=False):
206+
"""Returns a ``list`` with the groups in base dn
207+
or an empty``list`` if unsuccessful.
208+
209+
LDAP query setting is ``LDAP_GROUPS_OBJECT_FILTER``
210+
211+
:param fields: list of group fields to retrieve.
212+
if ``None`` or empty, default group fields is used
213+
:type fields: list
214+
:param bool dn_only: If we should only retrieve the object's
215+
distinguished name or not. Default: ``False``.
216+
"""
217+
conn = self.bind
218+
try:
219+
fields = fields or current_app.config['LDAP_GROUP_FIELDS']
220+
if current_app.config['LDAP_OPENLDAP']:
221+
records = conn.search_s(
222+
current_app.config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE,
223+
current_app.config['LDAP_GROUPS_OBJECT_FILTER'],
224+
fields)
225+
else:
226+
records = conn.search_s(
227+
current_app.config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE,
228+
current_app.config['LDAP_GROUPS_OBJECT_FILTER'],
229+
fields)
230+
conn.unbind_s()
231+
if records:
232+
if dn_only:
233+
return [r[0] for r in records]
234+
else:
235+
return [r[1] for r in records]
236+
else:
237+
return []
238+
except ldap.LDAPError as e:
239+
raise LDAPException(self.error(e.args))
240+
204241
def get_user_groups(self, user):
205242
"""Returns a ``list`` with the user's groups or ``None`` if
206243
unsuccessful.

0 commit comments

Comments
 (0)