Add LDAP group owner import and small rework
Showing
... | ... | @@ -401,36 +401,48 @@ if hasattr(settings, 'SAML_ORG_ID_ATTRIBUTE'): |
pre_user_save.connect(saml_save_org_id) | ||
if hasattr(settings, 'LDAP_ORG_ID_ATTRIBUTE'): | ||
if (hasattr(settings, 'LDAP_ORG_ID_ATTRIBUTE') and | ||
Please
register
or
sign in
to reply
|
||
settings.LDAP_ORG_ID_ATTRIBUTE): | ||
logger.debug("Register ldap_save_org_id to django-ldap-auth populate user") | ||
from django_auth_ldap.backend import populate_user | ||
from django_auth_ldap.backend import populate_user, LDAPSettings | ||
import ldap | ||
def ldap_connect(ldap_settings): | ||
conn = ldap.initialize(ldap_settings.SERVER_URI) | ||
for opt, value in ldap_settings.CONNECTION_OPTIONS.items(): | ||
conn.set_option(opt, value) | ||
conn.simple_bind_s(ldap_settings.BIND_DN, ldap_settings.BIND_PASSWORD) | ||
return conn | ||
def owns(conn, ldap_settings, ownerattr, user_dn, group_name): | ||
group = ldap_settings.GROUP_SEARCH.search_with_additional_term_string( | ||
"(cn=%s)" % group_name).execute(conn) | ||
if len(group) == 0: | ||
return False | ||
group = group[0] | ||
owners = group[1].get(ownerattr, []) | ||
return user_dn in map(unicode.upper, owners) | ||
def ldap_save_org_id(sender, user, ldap_user, **kwargs): | ||
logger.debug("ldap_save_org_id called by %s", user.username) | ||
attributes = ldap_user.attrs | ||
attr = settings.LDAP_ORG_ID_ATTRIBUTE | ||
try: | ||
value = attributes[attr][0].upper() | ||
except Exception as e: | ||
value = None | ||
logger.info("ldap_save_org_id couldn't find attribute. %s", | ||
unicode(e)) | ||
user_dn = ldap_user.dn.upper() | ||
if user.pk is None: | ||
user.save() | ||
logger.debug("ldap_save_org_id saved user %s", unicode(user)) | ||
profile, created = Profile.objects.get_or_create(user=user) | ||
if created or profile.org_id != value: | ||
if created or profile.org_id != user_dn: | ||
logger.info("org_id of %s added to user %s's profile", | ||
value, user.username) | ||
profile.org_id = value | ||
user_dn, user.username) | ||
profile.org_id = user_dn | ||
profile.save() | ||
else: | ||
logger.debug("org_id of %s already added to user %s's profile", | ||
value, user.username) | ||
logger.error(ldap_user.group_dns) | ||
for group in ldap_user.group_names: | ||
user_dn, user.username) | ||
group_dns = map(unicode.upper, ldap_user.group_dns) | ||
for group in group_dns: | ||
try: | ||
g = GroupProfile.search(group) | ||
except Group.DoesNotExist: | ||
... | ... | @@ -440,10 +452,28 @@ if hasattr(settings, 'LDAP_ORG_ID_ATTRIBUTE'): |
group, unicode(g)) | ||
g.user_set.add(user) | ||
for i in FutureMember.objects.filter(org_id__iexact=value): | ||
for i in FutureMember.objects.filter(org_id__iexact=user_dn): | ||
i.group.user_set.add(user) | ||
i.delete() | ||
ownerattr = settings.LDAP_GROUP_OWNER_ATTRIBUTE | ||
ldap_settings = LDAPSettings() | ||
# connection will close, when object destroys | ||
# https://www.python-ldap.org/doc/html/ldap.html#ldap-objects | ||
conn = ldap_connect(ldap_settings) | ||
for group in zip(group_dns, ldap_user.group_names): | ||
try: | ||
g = GroupProfile.search(group[0]) | ||
except Group.DoesNotExist: | ||
logger.debug('cant find ownergroup %s', group[0]) | ||
else: | ||
if owns(conn, ldap_settings, ownerattr, user_dn, group[1]): | ||
logger.debug('could find ownergroup %s (%s)', | ||
group[0], unicode(g)) | ||
g.profile.set_level(user, 'owner') | ||
else: | ||
logger.debug('cant find ownergroup %s', group[0]) | ||
return False # User did not change | ||
populate_user.connect(ldap_save_org_id) | ||
... | ... |