81473fb2b4
This is an alternative implementation of #37 . It doesn't need additional configuration, but enables range retrieval automatic. It also add some testing. Fixes #32
41 lines
1.2 KiB
Ruby
41 lines
1.2 KiB
Ruby
#!/usr/local/bin/ruby -w
|
|
|
|
# This is a trivial LDAP server which just stores directory entries in RAM.
|
|
# It does no validation or authentication. This is intended just to
|
|
# demonstrate the API, it's not for real-world use!!
|
|
|
|
require 'rubygems'
|
|
require 'ldap/server'
|
|
|
|
# We subclass the Operation class, overriding the methods to do what we need
|
|
|
|
class HashOperation < LDAP::Server::Operation
|
|
def initialize(connection, messageID, hash)
|
|
super(connection, messageID)
|
|
@hash = hash # an object reference to our directory data
|
|
end
|
|
|
|
def search(basedn, scope, deref, filter)
|
|
basedn.downcase!
|
|
case scope
|
|
when LDAP::Server::BaseObject
|
|
# client asked for single object by DN
|
|
obj = @hash.transform_keys(&:downcase)[basedn]
|
|
raise LDAP::ResultError::NoSuchObject unless obj
|
|
send_SearchResultEntry(basedn, obj) if LDAP::Server::Filter.run(filter, obj)
|
|
|
|
when LDAP::Server::WholeSubtree
|
|
@hash.each do |dn, av|
|
|
next unless dn.index(basedn, -basedn.length) # under basedn?
|
|
next unless LDAP::Server::Filter.run(filter, av) # attribute filter?
|
|
send_SearchResultEntry(dn, av)
|
|
end
|
|
|
|
else
|
|
raise LDAP::ResultError::UnwillingToPerform, "OneLevel not implemented"
|
|
|
|
end
|
|
end
|
|
end
|
|
|