From 52358888bbcdb11a252a1b114ef734ff2a23fa0e Mon Sep 17 00:00:00 2001 From: Kasownik Date: Fri, 12 May 2017 17:53:10 +0200 Subject: [PATCH] web: workaround for LDAP crashes when syncing groups --- web/webapp/directory.py | 30 ++++++++++++++++++++++++++++-- web/webapp/views.py | 13 ++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/web/webapp/directory.py b/web/webapp/directory.py index 16a4040..32b9b1a 100644 --- a/web/webapp/directory.py +++ b/web/webapp/directory.py @@ -65,15 +65,41 @@ def get_ldap_group_diff(members): return None return result +# kinda clunky with all the member fetching, transforming the list in various ways and updating it again here, but it's a workaround for LDAP crashing on modify_s, no fucks given def update_member_groups(c, changes): + for group in changes: + target_members = set(get_group_members(g.ldap, group)) + changed = False + for op in changes[group]: + for username in changes[group][op]: + if op == 'add': + changed = True + target_members.add(username) + elif op == 'remove': + changed = True + target_members.remove(username) + if not changed: + continue + values = [] + for username in target_members: + values.append('uid={},{}'.format(username.encode('utf-8'),app.config['LDAP_USER_BASE'])) + modlist = [(ldap.MOD_REPLACE,'uniqueMember',values)] + #print group,modlist + c.modify_s('cn={},{}'.format(group.encode('utf-8'),app.config['LDAP_GROUP_BASE']), modlist) + +# keeping it here instead of git history because it's preferable to the other method, as long as LDAP stops crashing +def update_member_groups_fucked(c, changes): ops = {'add': ldap.MOD_ADD, 'remove': ldap.MOD_DELETE} for group in changes: modlist = [] for op in changes[group]: + values = [] for username in changes[group][op]: - modlist.append((ops[op],'uniqueMember','uid={},{}'.format(username.encode('utf-8'),app.config['LDAP_USER_BASE']))) + values.append('uid={},{}'.format(username.encode('utf-8'),app.config['LDAP_USER_BASE'])) + if values: + modlist.append((ops[op],'uniqueMember',values)) + print group, modlist c.modify_s('cn={},{}'.format(group.encode('utf-8'),app.config['LDAP_GROUP_BASE']), modlist) - #print group, modlist def get_group_members(c, group): lfilter = '(&(cn={}){})'.format(group, app.config['LDAP_GROUP_FILTER']) diff --git a/web/webapp/views.py b/web/webapp/views.py index b9f39a3..c522b2a 100644 --- a/web/webapp/views.py +++ b/web/webapp/views.py @@ -135,11 +135,14 @@ def admin_ldap_sync(): @admin_required @login_required def admin_csv(): - members = [m.get_status() for m in models.Member.get_members(True)] - for member in members: - member["cn"] = directory.get_member_fields(g.ldap, member['username'], 'cn')['cn'] - - active_members = filter(lambda m: m['judgement'] and not m['type'] == 'supporting', members) + members = [] + for m in models.Member.get_members(True): + member = m.get_status() + member['contact_email'] = m.get_contact_email() + member['cn'] = directory.get_member_fields(g.ldap, member['username'], 'cn')['cn'] + members.append(member) + + active_members = filter(lambda m: m['judgement'], members) output = render_template("admin_csv.html", active_members=active_members) return Response(output)