class LdapFluff::Generic

Attributes

ldap[RW]
member_service[RW]

Public Class Methods

new(config = {}) click to toggle source
# File lib/ldap_fluff/generic.rb, line 4
def initialize(config = {})
  @ldap = Net::LDAP.new(:host => config.host,
                        :base => config.base_dn,
                        :port => config.port,
                        :encryption => config.encryption,
                        :instrumentation_service => config.instrumentation_service)
  @bind_user  = config.service_user
  @bind_pass  = config.service_pass
  @anon       = config.anon_queries
  @attr_login = config.attr_login
  @base       = config.base_dn
  @group_base = (config.group_base.empty? ? config.base_dn : config.group_base)
  @use_netgroups = config.use_netgroups
  @member_service = create_member_service(config)
end

Public Instance Methods

group_exists?(gid) click to toggle source
# File lib/ldap_fluff/generic.rb, line 28
def group_exists?(gid)
  service_bind
  @member_service.find_group(gid)
  true
rescue self.class::MemberService::GIDNotFoundException
  false
end
groups_for_uid(uid) click to toggle source
# File lib/ldap_fluff/generic.rb, line 36
def groups_for_uid(uid)
  service_bind
  @member_service.find_user_groups(uid)
rescue self.class::MemberService::UIDNotFoundException
  return []
end
includes_cn?(cn) click to toggle source
# File lib/ldap_fluff/generic.rb, line 69
def includes_cn?(cn)
  filter = Net::LDAP::Filter.eq('cn', cn)
  @ldap.search(:base => @ldap.base, :filter => filter).present?
end
is_in_groups(uid, gids = [], all = true) click to toggle source

returns whether a user is a member of ALL or ANY particular groups note: this method is much faster than groups_for_uid

gids should be an array of group common names

returns true if owner is in ALL of the groups if all=true, otherwise returns true if owner is in ANY of the groups

# File lib/ldap_fluff/generic.rb, line 58
def is_in_groups(uid, gids = [], all = true)
  service_bind
  groups = @member_service.find_user_groups(uid).sort
  gids = gids.sort
  if all
    return groups & gids == gids
  else
    return (groups & gids).any?
  end
end
service_bind() click to toggle source
# File lib/ldap_fluff/generic.rb, line 74
def service_bind
  unless @anon || bind?(@bind_user, @bind_pass, :search => false)
    raise UnauthenticatedException,
          "Could not bind to #{class_name} user #{@bind_user}"
  end
end
user_exists?(uid) click to toggle source
# File lib/ldap_fluff/generic.rb, line 20
def user_exists?(uid)
  service_bind
  @member_service.find_user(uid)
  true
rescue self.class::MemberService::UIDNotFoundException
  false
end
users_for_gid(gid) click to toggle source
# File lib/ldap_fluff/generic.rb, line 43
def users_for_gid(gid)
  return [] unless group_exists?(gid)
  search = @member_service.find_group(gid).last
  method = select_member_method(search)
  return [] if method.nil?
  users_from_search_results(search, method)
end

Private Instance Methods

class_name() click to toggle source
# File lib/ldap_fluff/generic.rb, line 98
def class_name
  self.class.name.split('::').last
end
create_member_service(config) click to toggle source
# File lib/ldap_fluff/generic.rb, line 90
def create_member_service(config)
  if @use_netgroups
    self.class::NetgroupMemberService.new(@ldap, config)
  else
    self.class::MemberService.new(@ldap, config)
  end
end
select_member_method(search_result) click to toggle source
# File lib/ldap_fluff/generic.rb, line 82
def select_member_method(search_result)
  if @use_netgroups
    :nisnetgrouptriple
  else
    [:member, :memberuid, :uniquemember].find { |m| search_result.respond_to? m }
  end
end
users_from_search_results(search, method) click to toggle source
# File lib/ldap_fluff/generic.rb, line 102
def users_from_search_results(search, method)
  members = search.send method
  if method == :memberuid
    # memberuid contains an array ['user1','user2'], no need to parse it
    members
  elsif method == :nisnetgrouptriple
    @member_service.get_netgroup_users(members)
  else
    @member_service.get_logins(members)
  end
end