This is an automated email from the ASF dual-hosted git repository. dill0wn pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/allura.git
commit caa87afece25600b2dd973fd25615d0ea6e0f5f4 Author: Dave Brondsema <[email protected]> AuthorDate: Tue Nov 30 16:10:48 2021 -0500 Fix LdapUserPreferencesProvider.get_pref return. Support multi-valued ldap prefs --- Allura/allura/lib/plugin.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py index ce842ad..7e9c85d 100644 --- a/Allura/allura/lib/plugin.py +++ b/Allura/allura/lib/plugin.py @@ -1735,14 +1735,14 @@ class LdapUserPreferencesProvider(UserPreferencesProvider): def fields(self): return h.config_with_prefix(config, 'user_prefs_storage.ldap.fields.') - def get_pref(self, user, pref_name): + def get_pref(self, user, pref_name, multi=False): from allura import model as M if pref_name in self.fields and user != M.User.anonymous(): - self._get_pref(user.username, pref_name) + return self._get_pref(user.username, pref_name, multi=multi) else: return LocalUserPreferencesProvider().get_pref(user, pref_name) - def _get_pref(self, username, pref_name): + def _get_pref(self, username, pref_name, multi=False): con = ldap_conn() try: rs = con.search_s(ldap_user_dn(username), ldap.SCOPE_BASE) @@ -1755,15 +1755,24 @@ class LdapUserPreferencesProvider(UserPreferencesProvider): return '' user_dn, user_attrs = rs[0] ldap_attr = self.fields[pref_name] - # assume single-valued list - return user_attrs[ldap_attr][0].decode('utf-8') + attr_list = user_attrs.get(ldap_attr, []) + if multi: + return [attr.decode('utf-8', errors='replace') for attr in attr_list] + elif attr_list: + return attr_list[0].decode('utf-8', errors='replace') + else: + return '' def set_pref(self, user, pref_name, pref_value): if pref_name in self.fields: - con = ldap_conn() ldap_attr = self.fields[pref_name] + if isinstance(pref_value, list): + ldap_val = [v.encode('utf-8', errors='replace') for v in pref_value] + else: + ldap_val = pref_value.encode('utf-8', errors='replace') + con = ldap_conn() con.modify_s(ldap_user_dn(user.username), - [(ldap.MOD_REPLACE, ldap_attr, pref_value.encode('utf-8'))]) + [(ldap.MOD_REPLACE, ldap_attr, ldap_val)]) con.unbind_s() else: return LocalUserPreferencesProvider().set_pref(user, pref_name, pref_value)
