class LdapDisambiguate::LdapUser

This class provides an api for quering 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/ldap_disambiguate/ldap_user.rb, line 8
def directory_attributes(login, attrs = [])
  filter = Net::LDAP::Filter.eq('uid', login)
  result = get_ldap_response(filter, attrs)
  format_users(result, attrs)
end
get_users(name_filter, attrs = []) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 32
def get_users(name_filter, attrs = [])
  attrs = (attrs + default_attributes).uniq
  filter = Net::LDAP::Filter.construct("(& (& #{name_filter}) #{person_filter})")
  get_ldap_response(filter, attrs)
end
query_ldap_by_mail(email, attrs = []) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 14
def query_ldap_by_mail(email, attrs = [])
  filter = Net::LDAP::Filter.construct("(& (| (psmailid=#{email} ) (mail=#{email}) (psmailbox=#{email}) (edupersonprincipalname=#{email})) #{person_filter})")
  users  = get_users(filter, attrs)
  format_users(users, attrs)
end
query_ldap_by_name(given_name, surname, attrs = []) click to toggle source
# File lib/ldap_disambiguate/ldap_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_users(filter, attrs)
    break if users.count > 0 # stop running through the filters if we get results
  end
  format_users(users, attrs)
end
results_hash(opts) click to toggle source
# File lib/ldap_disambiguate/ldap_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/ldap_disambiguate/ldap_user.rb, line 123
def cache
  @cache ||= {}
end
default_attributes() click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 119
def default_attributes
  %i[uid givenname sn mail eduPersonPrimaryAffiliation displayname]
end
fetch(opts, key, default = ['']) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 51
def fetch(opts, key, default = [''])
  opts[key].blank? ? default : opts[key]
end
format_user(user, extra_attrs) click to toggle source
# File lib/ldap_disambiguate/ldap_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/ldap_disambiguate/ldap_user.rb, line 55
def format_users(users, attrs)
  user_attrs = attrs - default_attributes
  users.map { |u| format_user(u, user_attrs) }
end
get_ldap_response(filter, attributes) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 71
def get_ldap_response(filter, attributes)
  return cache[filter.to_s] if cache.key?(filter.to_s)
  tries.times.each do
    result = Hydra::LDAP.get_user(filter, attributes)
    unless unwilling?
      cache[filter.to_s] = result
      return result
    end
    sleep(sleep_time)
  end
  nil
end
get_user_by_partial_id(id) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 66
def get_user_by_partial_id(id)
  filter = Net::LDAP::Filter.construct("(& (uid=#{id}* ) #{person_filter})")
  get_ldap_response(filter, %w[uid displayname])
end
name_filters(first_name, middle_name, surname) click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 105
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/ldap_disambiguate/ldap_user.rb, line 101
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/ldap_disambiguate/ldap_user.rb, line 93
def size_limit_exceeded?
  Hydra::LDAP.connection.get_operation_result[:message] == 'Size Limit Exceeded'
end
sleep_time() click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 97
def sleep_time
  1.0
end
tries() click to toggle source
# File lib/ldap_disambiguate/ldap_user.rb, line 84
def tries
  7
end
unwilling?() click to toggle source

Numeric code returned by LDAP if it is feeling “unwilling”

# File lib/ldap_disambiguate/ldap_user.rb, line 89
def unwilling?
  Hydra::LDAP.connection.get_operation_result.code == 53
end