class PsuDir::Disambiguate::User
This class provides an api for querying LDAP with different portions of the user's information (name parts or id)
Public Class Methods
directory_attributes(login, attrs = [])
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 8 def directory_attributes(login, attrs = []) filter = Net::LDAP::Filter.eq('uid', login) result = get_users(filter, attrs) format_users(result, attrs) end
get_filtered_users(name_filter, attrs = [])
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 32 def get_filtered_users(name_filter, attrs = []) attrs = (attrs + default_attributes).uniq filter = Net::LDAP::Filter.construct("(& (& #{name_filter}) #{person_filter})") get_users(filter, attrs) end
query_ldap_by_mail(email, attrs = [])
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 14 def query_ldap_by_mail(email, attrs = []) filter = Net::LDAP::Filter.construct(email_filter(email)) users = get_filtered_users(filter, attrs) format_users(users, attrs) end
query_ldap_by_name(given_name, surname, attrs = [])
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 20 def query_ldap_by_name(given_name, surname, attrs = []) return [] if given_name.blank? # this method only work if we have a first name to play with first_names = given_name.split(/[\s.]+/) users = [] name_filters(first_names[0], first_names[1], surname).each do |filter| users = get_filtered_users(filter, attrs) break if users.count.positive? # stop running through the filters if we get results end format_users(users, attrs) end
results_hash(opts)
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 38 def results_hash(opts) { id: fetch(opts, :uid).first, given_name: fetch(opts, :givenname).first, surname: fetch(opts, :sn).first, email: fetch(opts, :mail).first, affiliation: fetch(opts, :eduPersonPrimaryAffiliation, []), displayname: fetch(opts, :displayname).first } end
Private Class Methods
cache()
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 109 def cache @cache ||= {} end
default_attributes()
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 105 def default_attributes %i[uid givenname sn mail eduPersonPrimaryAffiliation displayname] end
email_filter(email)
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 70 def email_filter(email) '(& (|'\ " (psmailid=#{email})"\ " (mail=#{email})"\ " (psmailbox=#{email})"\ " (edupersonprincipalname=#{email})"\ ") #{person_filter})" end
fetch(opts, key, default = [''])
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 51 def fetch(opts, key, default = ['']) opts[key].presence || default end
format_user(user, extra_attrs)
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 60 def format_user(user, extra_attrs) hash = results_hash(user) extra_attrs.each { |attr| hash[attr] = user[attr].first } hash end
format_users(users, attrs)
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 55 def format_users(users, attrs) user_attrs = attrs - default_attributes users.map { |u| format_user(u, user_attrs) } end
name_filters(first_name, middle_name, surname)
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 91 def name_filters(first_name, middle_name, surname) filters = [] if middle_name.blank? filters << "(givenname=#{first_name}) (sn=#{surname})" filters << "(givenname=#{first_name}*) (sn=#{surname})" else filters << "(givenname=#{first_name}*) (givenname=* #{middle_name}*) (sn=#{surname})" middle_initial = middle_name[0] filters << "(givenname=#{first_name}* #{middle_initial}*) (sn=#{surname})" end filters << "(givenname=#{first_name}) (sn=#{surname})" filters end
person_filter()
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 79 def person_filter '(|'\ ' (eduPersonPrimaryAffiliation=STUDENT)'\ ' (eduPersonPrimaryAffiliation=FACULTY)'\ ' (eduPersonPrimaryAffiliation=STAFF)'\ ' (eduPersonPrimaryAffiliation=EMPLOYEE)'\ ' (eduPersonPrimaryAffiliation=RETIREE)'\ ' (eduPersonPrimaryAffiliation=EMERITUS)'\ ' (eduPersonPrimaryAffiliation=MEMBER)'\ '))' end
size_limit_exceeded?()
click to toggle source
# File lib/psu_dir/disambiguate/user.rb, line 66 def size_limit_exceeded? Hydra::LDAP.connection.get_operation_result[:message] == 'Size Limit Exceeded' end