LoginSignup
2
2

More than 5 years have passed since last update.

ActiveLDAPで日本語が含まれる検索ができなくてハマった

Last updated at Posted at 2013-09-19

ActiveDirectoryなんかと連携する場合、設定触る権限なかったりでどうしても日本語で検索できないと困るって場合がある。
ところが、Net::LDAPでエラーが返ってしまう。

example.rb
Group.find(:first, :filter => "(sAMAccountName=営業部)")
=>Invalid filter syntax. (Net::LDAP::LdapError)

ひょっとしてNet::LDAP日本語使えないのかなと思って試してみると、そういうわけではない。

net_ldap_sample.rb
# coding: utf-8
require 'net/ldap'

# net_ldap=Net::LDAP.newの詳しい記述は省略

net_ldap.open do |ldap|
  treebase = "dc=example,dc=com"
  filter = Net::LDAP::Filter.eq( "sAMAccountName", "営業部" )
  attrs = ["cn"]
  ldap.search(:base => treebase, :filter => filter, :attributes => attrs, :return_result => false ) do |entry|
    entry.each do |attr, values|
      puts"#{attr}: "      
      values.each do |value|
        puts "  #{value}"
      end
    end
  end
end

=>cn:
  営業部

Net::LDAPのソースを漁ってみると、Net::LDAP::Filter内のFilterParserに正規表現が。
どうもここで日本語がはねられてるようなので別ファイルでオーバーライドする。
※変更箇所以外はparse_filter_branchメソッドまるごとコピペ

class Net::LDAP::Filter
  class FilterParser
    def parse_filter_branch(scanner)
- if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\]|\\[a-fA-F\d]{2})+/)
+ if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\p{Letter}]|\\[a-fA-F\d]{2})+/u)

本当は漢字セットの\p{Han}でマッチさせたかったが、マッチングできず正規表現深追いしたくなかったので\p{Letter}で逃げの一手に出ることに。。。

2014/4/22追記
Net::LDAPの0.6ではこの問題解決されてそうです(未検証)。
多分この対処はいらなくなるはず。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2