Delphi6+SynapseでLDAP、その後
SynapseでLDAPにバイナリのアトリビュート値を追加するには、AttributeNameに”;binary"パラメータを付けるらしい。
ただし、これは全てのアトリビュートに使えるわけではなく、アトリビュートの属性に依存している(のではないかと想像している)。
そもそも、”;binary"パラメータはString属性のアトリビュートに2バイト文字を設定する、といった用途は考慮していないんだろう。
けれども、”;binary"パラメータを付加すると、読み取り専用のIsBinaryがTrueに変わってくれる。すると、そのアトリビュートはバイナリとして書き込まれる。これは2バイト文字の場合にも使えるのだ。
そこで、今回は2バイト文字描き込み用に”;Base64″というパラメータを勝手に設定することにした。”;binary"パラメータを使い回すと、本来の使用に影響が出る可能性があるからだ。
まず、Synapseのldapsend.pasを書き換える。
procedure TLDAPAttribute.SetAttributeName(Value: string);
begin
FAttributeName := Value;
FIsBinary := Pos(’;binary’, Lowercase(value)) > 0;
if not FIsBinary then begin
FIsBinary := Pos(’;base64′, Lowercase(value)) > 0;
FAttributeName := StringReplace(Lowercase(value), ‘;base64′, ‘’, [rfIgnoreCase]);
end;
end;
AttributeNameに”;Base64″パラメータが付加されていたら、IsBinaryをTrueにし、AttributeNameからパラメータ部分を取り除く。
LDAPにエントリーを追加するルーチンは次のようになる。
Function LdapAdd(userID : String; AttrList : TStringList) : Boolean;
var
ldap: TLDAPsend;
AL : TLDAPAttributeList;
j : Integer;
begin
ldap:= TLDAPsend.Create;
AL := TLDAPAttributeList.Create;
try
ldap.TargetHost := ‘ldap.hogehoge.jp’;
ldap.TargetPort := cLDAPProtocol;
ldap.Version := 3;
ldap.SearchScope := TLDAPSearchScope(SS_WholeSubtree);
ldap.UserName := AdminUser;
ldap.Password := AdminPass;
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := ‘objectClass’;
AL[j].Add(’inetOrgPerson’);
AL[j].Add(’person’);
AL[j].Add(’top’);
AL[j].Add(’hostObject’);
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := ‘cn’;
AL[j].Add(’CUTE01′);
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := ‘mail’;
AL[j].Add(’maimi-y@mail.cute.idol’);
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := ’sn’;
AL[j].Add(’Yajima’);
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := ‘displayName;Base64′; // ”;Base64″ パラメータを勝手に付け加えた
AL[j].Add(’55+i5bO2IOiInue+jg0K’); // “矢島 舞美” を UTF-8に変換し、Base64エンコードしたもの
if ldap.Login then begin
if ldap.Bind then begin
Result := ldap.Add(’cn=CUTE01,ou=users,dc=cute,dc=idol’, AL);
end else begin
Result := False;
end;
ldap.Logout;
end else begin
Result := False;
end;
finally
AL.Free;
ldap.Free;
end;
end;
ここでは"displayName"に日本語名"矢島 舞美"をセットしている。この要領で他のアトリビュートにも日本語の書き込みが可能だ。
ただし、一つのアトリビュートにセットできるのはバイナリかアスキーか、どちらか一方だけだ。例えば、
sn: Yajima
sn: 矢島
のような事は、現時点では出来ない。出来るようになるかも知れないが、そこまでSynapseをハックする力は、私にはない。それよりは別のアトリビュートを活用した方が現実的だ。
以上は、私が適当にハックして見つけた方法だが、落とし穴が無いとも限らないので、眉にツバして読んで欲しい。
Synapse自身もBase64エンコードのルーチンを持っているようだし(未確認)、もっと良い方法があるのだと思う。もし、そんなワザをご存じの方がいらしたら、ぜひ私にも教えて欲しい。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/220
この投稿には、まだコメントが付いていません