DN の途中に日本語が含まれている場合に、chpasswd へのログインに失敗
http://www.secioss.co.jp/2008/01/lismactive_directoryopenldap.html にある設定例を元に、Active Directory と OpenLDAP の連携をしようとして設定(但し、Active Directory に対するストレージの設定では、<storage name="AD" hash="AD"> とした)し、chpasswd の basedn を AD 側を指定した時に、chpasswd のログイン画面で認証に失敗する。
仮に、cn=テストユーザ,ou=テストグループ,ou=ad,dc=example,dc=com という DN で、saMAccountName が testuser だった場合、chpasswd のユーザ名を testuser としてログインしようとすると、LISM.pm の sub bind 中の $binddn が、「cn=テストユーザ」の部分が文字化けしたものになっていた。「ou=テストグループ」の部分は正常。
この DN の生成は、おそらく、LISM/Handler/Rewrite.pm の _rewriteParse 中で
$tmpstr =~ s/$match/$subst/gi;
回避ポイントを探したところ、LISM/Handler.pm の _searchLdap 中と、LISM/Storage/LDAP.pm 中の _do_search の間で、Net::LDAP の結果に対する処理に違いがあり、LISM/Storage/LDAP.pm の場合には、検索結果に対して
my $dn = decode('utf8', $entry->dn);
LISM/Handler.pm の処理を LISM/Storage/LDAP.pm に合わせるように、下記のように修正すると、chpasswd へのログインができた。
if ($msg->count) { my $entry = $msg->entry(0); my $tmpdn = Encode::decode_utf8($entry->dn); if ($ldapopts->{attr} eq 'dn') { # $values[0] = $entry->dn; $values[0] = $tmpdn; } elsif ($ldapopts->{attr} eq 'parentrdn') { # @values = ($entry->dn =~ /^[^,]+,([^,]+)/); @values = ($tmpdn =~ /^[^,]+,([^,]+)/); } else { # @values = $entry->get_value($ldapopts->{attr}); foreach my $value ($entry->get_value($ldapopts->{attr})) { my $tmpval = Encode::decode_utf8($value); push(@values, $tmpval); } } if (!defined($values[0])) { @values = (''); } }
http://www.secioss.co.jp/2008/01/lismactive_directoryopenldap.html にある設定例を元に、Active Directory と OpenLDAP の連携をしようとして設定(但し、Active Directory に対するストレージの設定では、<storage name="AD" hash="AD"> とした)し、chpasswd の basedn を AD 側を指定した時に、chpasswd のログイン画面で認証に失敗する。
仮に、cn=テストユーザ,ou=テストグループ,ou=ad,dc=example,dc=com という DN で、saMAccountName が testuser だった場合、chpasswd のユーザ名を testuser としてログインしようとすると、LISM.pm の sub bind 中の $binddn が、「cn=テストユーザ」の部分が文字化けしたものになっていた。「ou=テストグループ」の部分は正常。
この DN の生成は、おそらく、LISM/Handler/Rewrite.pm の _rewriteParse 中で
としているところで、$tmpstr、$match、$subst の utf8 フラグが揃っていない時に、前述のような文字化けした文字列が生成されるらしい。回避ポイントを探したところ、LISM/Handler.pm の _searchLdap 中と、LISM/Storage/LDAP.pm 中の _do_search の間で、Net::LDAP の結果に対する処理に違いがあり、LISM/Storage/LDAP.pm の場合には、検索結果に対して
といった処理が入っているのに対し、LISM/Handler.pm では何もしていなかった。LISM/Handler.pm の処理を LISM/Storage/LDAP.pm に合わせるように、下記のように修正すると、chpasswd へのログインができた。