Skip to content

Commit 497e2be

Browse files
author
blackhedd
committed
Added unit tests for search-filters
1 parent ca38bfc commit 497e2be

File tree

3 files changed

+56
-15
lines changed

3 files changed

+56
-15
lines changed

lib/net/ldap/filter.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,41 @@ def coalesce operator
171171
end
172172

173173

174+
175+
# We get a Ruby object which comes from parsing an RFC-1777 "Filter"
176+
# object. Convert it to a Net::LDAP::Filter.
177+
# TODO, we're hardcoding the RFC-1777 BER-encodings of the various
178+
# filter types. Could pull them out into a constant.
179+
#
180+
def Filter::parse_ldap_filter obj
181+
case obj.ber_identifier
182+
when 0x87 # present. context-specific primitive 7.
183+
Filter.eq( obj.to_s, "*" )
184+
when 0xa3 # equalityMatch. context-specific constructed 3.
185+
Filter.eq( obj[0], obj[1] )
186+
else
187+
raise LdapError.new( "unknown ldap search-filter type: #{obj.ber_identifier}" )
188+
end
189+
end
190+
191+
192+
# We got a hash of attribute values.
193+
# Do we match the attributes?
194+
# Return T/F, and call match recursively as necessary.
195+
def match entry
196+
case @op
197+
when :eq
198+
if @right == "*"
199+
l = entry[@left] and l.length > 0
200+
else
201+
l = entry[@left] and l = l.to_a and l.index(@right)
202+
end
203+
else
204+
raise LdapError.new( "unknown filter type in match: #{@op}" )
205+
end
206+
end
207+
208+
174209
end # class Net::LDAP::Filter
175210

176211
end # class Net::LDAP

tests/testldap.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def test_search_filters
141141
ldap = Net::LDAP.new :host => @host, :port => @port, :auth => @auth
142142
search = {
143143
:base => "dc=bayshorenetworks,dc=com",
144-
:filter => Net::LDAP::Filter.eq( "sn", "Verdon" )
144+
:filter => Net::LDAP::Filter.eq( "sn", "Fosse" )
145145
}
146146

147147
ldap.search( search ) {|res|

testserver/ldapserver.rb

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ def handle_bind_request pdu
122122
# }
123123
def handle_search_request pdu
124124
unless @authenticated
125+
# NOTE, early exit.
125126
send_ldap_response 5, pdu[0].to_i, 50, "", "Who did you say you were?"
126127
return
127128
end
@@ -143,23 +144,28 @@ def handle_search_request pdu
143144
end
144145

145146
filters = pdu[1][6]
146-
if filters.length > 0
147-
p filters.ber_identifier
147+
if filters.length == 0
148+
# NOTE, early exit.
149+
send_ldap_response 5, pdu[0].to_i, 53, "", "No filter specified"
148150
end
149151

150-
$ldif.each {|dn, entry|
151-
152-
attrs = []
153-
entry.each {|k, v|
154-
if requested_attrs == :all or requested_attrs.include?(k.downcase)
155-
attrvals = v.map {|v1| v1.to_ber}.to_ber_set
156-
attrs << [k.to_ber, attrvals].to_ber_sequence
157-
end
158-
}
152+
# TODO, what if this returns nil?
153+
filter = Net::LDAP::Filter.parse_ldap_filter( filters )
159154

160-
appseq = [dn.to_ber, attrs.to_ber_sequence].to_ber_appsequence(4)
161-
pkt = [msgid.to_ber, appseq].to_ber_sequence
162-
send_data pkt
155+
$ldif.each {|dn, entry|
156+
if filter.match( entry )
157+
attrs = []
158+
entry.each {|k, v|
159+
if requested_attrs == :all or requested_attrs.include?(k.downcase)
160+
attrvals = v.map {|v1| v1.to_ber}.to_ber_set
161+
attrs << [k.to_ber, attrvals].to_ber_sequence
162+
end
163+
}
164+
165+
appseq = [dn.to_ber, attrs.to_ber_sequence].to_ber_appsequence(4)
166+
pkt = [msgid.to_ber, appseq].to_ber_sequence
167+
send_data pkt
168+
end
163169
}
164170

165171

0 commit comments

Comments
 (0)