2010年11月5日金曜日

OpenLDAP 検索時のDNの正規化

OpenLDAPに登録したエントリのDNに全角のアルファベットなどが含まれている時、
検索時に小文字のアルファベットでもマッチします。

例えば、「uid=テストA,dc=example,dc=com」 (Aは全角) が登録されている時、
「uid=テストA,dc=example,dc=com」(Aは半角)を登録することができません。

これは、検索時に検索条件として使われる「caseIgnoreMatch」や「caseExactMatch」などの
条件を処理する場合には、DNを正規化して処理するため、この2つが同一とみなされるためです。

例えば、caseIgnoreMatchは次のように定義されています。
servers/slapd/schema_init.c

        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes,
                NULL, UTF8StringNormalize, octetStringMatch,
                octetStringIndexer, octetStringFilter,
                directoryStringApproxMatchOID },

この「UTF8StringNormalize」が正規化処理を行う場合に呼ばれる関数です。

OpenLDAPが文字を扱う場合に利用しているUnicodeでは、「全角のA」と「半角のA」は
正規化すると、同じ「半角のA」として扱われます。

エントリの検索時にはUTF8StringNormalizeで正規化した結果でDNの比較を行うため、全角アルファベットと半角アルファベットは同じ文字として扱われます。

ただしエントリの登録時には正規化されていないDNが登録されるため、
先に登録したDNがそのまま登録されます。

0 件のコメント:

コメントを投稿