From 52b3c07356f0c9cedfbd5d9445d8ec55e828549c Mon Sep 17 00:00:00 2001
From: Sebastian Hugentobler <shugentobler@vanwa.ch>
Date: Mon, 7 Dec 2015 13:00:27 +0100
Subject: [PATCH 1/1] Adds the possibility to filter ldap users at login (eg.
with groups). Set the *LDAP_USER_FILTER* to use this.
---
mediagoblin/plugins/ldap/tools.py | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/mediagoblin/plugins/ldap/tools.py b/mediagoblin/plugins/ldap/tools.py
index 2be2dcd..858b47a 100644
a
|
b
|
class LDAP(object):
|
48 | 48 | |
49 | 49 | return email |
50 | 50 | |
| 51 | def is_user_allowed(self, config, username): |
| 52 | """ Apply a configured user filter. |
| 53 | |
| 54 | If an user filter is configured apply it and check whether there is |
| 55 | exactly one result. |
| 56 | |
| 57 | Do nothing if there is no filter. |
| 58 | |
| 59 | Args: |
| 60 | config (dict of str: str): The mediagoblin config dictionary. |
| 61 | username (string): Username to use (replaces '{username}' in the filter). |
| 62 | Returns: |
| 63 | bool: True if the filter yields ecactly one result or if there is |
| 64 | no filter configured, False otherwise. |
| 65 | """ |
| 66 | user_allowed = True |
| 67 | use_user_filter = (config['LDAP_USER_FILTER'] is not None |
| 68 | if 'LDAP_USER_FILTER' in config else False) |
| 69 | |
| 70 | if use_user_filter: |
| 71 | _log.info('Applying user filter') |
| 72 | |
| 73 | user_filter_result = self.conn.search_s( |
| 74 | config['LDAP_SEARCH_BASE'], |
| 75 | ldap.SCOPE_SUBTREE, |
| 76 | config['LDAP_USER_FILTER'].format(username=username)) |
| 77 | |
| 78 | user_allowed = len(user_filter_result) == 1 |
| 79 | |
| 80 | return user_allowed |
| 81 | |
51 | 82 | def login(self, username, password): |
52 | 83 | for k, v in six.iteritems(self.ldap_settings): |
53 | 84 | try: |
… |
… |
class LDAP(object):
|
55 | 86 | user_dn = v['LDAP_USER_DN_TEMPLATE'].format(username=username) |
56 | 87 | self.conn.simple_bind_s(user_dn, password.encode('utf8')) |
57 | 88 | email = self._get_email(v, username) |
58 | | return username, email |
| 89 | |
| 90 | user_allowed = self.is_user_allowed(v, username) |
| 91 | |
| 92 | return (username, email) if user_allowed else (False, None) |
59 | 93 | |
60 | 94 | except ldap.LDAPError, e: |
61 | 95 | _log.info(e) |