def get_or_init_user(self, username): username = escape(username) query = "(cn=" + username + ")" results = ldapsearch(query, using='groups') # create a backdoor for people in the arc group ldap_query = "(& (memberuid=" + username + ") (cn=arc))" ldap_results = ldapsearch(ldap_query) # Get the list of groups that the user belongs too. memberOf = results[0][1]['memberOf'] # Add the username as a list for the uid dictionary key. results[0][1]['uid'] = [username] user_info = parse_profile(results[0][1]) first_name = user_info['first_name'] last_name = user_info['last_name'] email = user_info['email'] staff = False student = False if re.search("(CN=ITS_LAB_Students_GG)", str(memberOf)): student = True if re.search("(CN=ITS_CAVS_Staff_GG)", str(memberOf)): staff = True if re.search("(CN=TLC_GG)", str(memberOf)): staff = True if ldap_results: staff = True if student or staff: User = get_user_model() user = User.objects.filter(username=username).first() if user is None: user = User(first_name=first_name, last_name=last_name, email=email, username=username) # Always need to reset the users permissions, to stay up to date with # group changes. user.is_active = True user.is_staff = staff user.save() return user else: return None
def get_or_init_user(self, username): try: user = User.objects.get(username=username) except User.DoesNotExist: # user will have an "unusable" password user = User.objects.create_user(username, '') user.save() # get the user's first and last name results = ldap.ldapsearch("(& (uid=" + ldap.escape(username) + ") (cn=*))") info = ldap.parse_profile(results[0][1]) user.first_name = info['first_name'] user.last_name = info['last_name'] user.email = info['email'] user.save() return user
def autocomplete(request): """ Does an LDAP search and returns a JSON array of objects """ q = escape(request.GET.get('query', "")) if len(q) < 3: return JsonResponse([], safe=False) # only return a handful of results MAX_RESULTS = 5 search = '(uid={q}*)'.format(q=q) results = ldapsearch(search, size_limit=MAX_RESULTS) # I don't think LDAP guarantees the sort order, so we have to sort ourselves results.sort(key=lambda o: o[1]['uid'][0]) output = [] for result in results[:MAX_RESULTS]: output.append(parse_profile(result[1])) return JsonResponse(output, safe=False)
def get_profile(self, username): results = ldap.ldapsearch("(uid=" + ldap.escape(username) + ")") dn, entry = results[0] profile = ldap.parse_profile(entry) return profile