Ruby/LDAP がいただけない
Ruby/LDAP
LDAP::Conn#bound? メソッドでどハマリ(;´Д`)
LDAP::Conn#bind メソッドで LDAP セッションを確立した後、LDAP サーバで slapd を再起動しても、LDAP::Conn#bound? が true を返しやがる。誰だよ、こんな役に立たないメソッド作った奴。graceless disconnect ならどうしようもないのは分かるけど、graceful disconnect だぜ?ちゃんと状態遷移させろよなー!!
仕方がないので、セッション取得メソッドが呼ばれるたびに、無駄な LDAP query を発行して、例外帰ってきたら再接続するとかいう激しく後ろ向きな対応をしました。
は〜萎えるわぁ…
# #= LDAP base class # # Version:: $Id: ldapbase.rb 2405 2009-02-05 12:03:16Z xcorp $ # #== SEE ALSO #* Ruby/LDAP http://ruby-ldap.sourceforge.net/rdoc/ require 'ldap' require 'ldap/ldif' class LdapBase attr_accessor :dn def LdapBase.connect(isReconnect = false) if !isReconnect then return if (defined?(@@conn) && @@conn) end begin @@conn = LDAP::Conn.new(ldapHost, LDAP::LDAP_PORT) @@conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3) @@conn.bind("cn=admin,dc=hoge,dc=xcorp,dc=jp", passwd) rescue => e @@conn = nil raise e end end def LdapBase.disconnect return if (!defined?(@@conn) || !@@conn) begin @@conn.unbind @@conn = nil rescue => e @@conn = nil raise e end end def LdapBase.conn LdapBase.connect if (!defined?(@@conn) || !@@conn || !@@conn.bound?) begin @@conn.search("cn=admin,dc=hoge,dc=xcorp,dc=jp", LDAP::LDAP_SCOPE_ONELEVEL, '(objectClass=OpenLDAProotDSE)') { |e| } rescue => e LdapBase.connect(true) end return @@conn end # 以下略 end