2009/10/15

OpenLDAP 2.4: 格納したUTF-8データの読み出し

さてOpenLDAPに登録されるデータについて、rfc2849でいうところの"SAFE-STRING"に収まらないものはBase64でエンコードされた上で格納される事になっています。 その時の目印はAttributeの区切りが':'から'::'になっているものです。

rfc2849をみると他にURLを使う':>'が記述されていますが、これは放っておきましょう。

郵便番号の県名などの日本語データはLDAP上では自動的にbase64エンコーディングされて格納されています。 そのためそのままldapsearchをすると、あまりうれしくない表示になります。

$ ldapsearch -x -b dc=example,dc=org postalCode=9650000
dn: ou=020258,ou=Address,dc=example,dc=org
objectClass: organizationalUnit
ou: 020258
st:: 56aP5bO255yM
l:: 5Lya5rSl6Iul5p2+5biC
street:: 5Lul5LiL44Gr5o6y6LyJ44GM44Gq44GE5aC05ZCI
postalCode: 9650000
description: 0,0,0,0,0

base64をデコードする簡単なフィルタを作る

そこでパイプに渡すと'::'を認識してbase64デコードするスクリプトを作ってみました。

#!/usr/bin/ruby
require 'base64'
$stdin.each do |line|
  if line !~ /^\w+::\s/
    print line
    next
  end
  (label, item) = line.split(/\s+/, 2)
  printf "%s %s\n", label, Base64.decode64(item)
end

例えばlsuf.rbとかいう名前のファイルに保存して、パイプでそのまま渡してみます。

$ ldapsearch -x -b dc=example,dc=org postalCode=9310000 | ./lsuf.rb 
dn: ou=020258,ou=Address,dc=example,dc=org
objectClass: organizationalUnit
ou: 020258
st:: 福島県
l:: 会津若松市
street:: 以下に掲載がない場合
postalCode: 9650000
description: 0,0,0,0,0

実際のところ、これぐらいして確認しないと、本当にデータが保存されているのか自信なくなりますね。

ldapsearchの引数にutf-8(日本語)を渡す

例えば"会津若松市"にある郵便番号を全て表示したい場合には、次のようにする事ができます。

$ ldapsearch -x -b dc=example,dc=org '(l=会津若松市)' postalCode street | ./lsuf.rb
# 020258, Address, example.org
dn: ou=020258,ou=Address,dc=example,dc=org
street:: 以下に掲載がない場合
postalCode: 9650000
...
...
# 020480, Address, example.org
dn: ou=020480,ou=Address,dc=example,dc=org
street:: 和田
postalCode: 9650811

とりあえずこれでだいたい使えるようになったかな…。

0 件のコメント: