コードは以下のような感じです。
Function LdapAdd : Boolean;
var
ldap: TLDAPsend;
AL : TLDAPAttributeList;
j : Integer;
begin
Result := True;
ldap:= TLDAPsend.Create;
AL := TLDAPAttributeList.Create;
try
ldap.TargetHost := '192.168.0.1';
ldap.TargetPort := cLDAPProtocol;
ldap.Version := 3;
ldap.UserName := 'cn=AdminUser,ou=users,dc=Hello,dc=Project';
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.Add;
j := AL.Count - 1;
AL[j].AttributeName := 'cn';
AL[j].Add('CUTE1');
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := 'sn';
AL[j].Add('Yajima');
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := 'employeeType';
(1)AL[j].Add('PROPER'); // これは OK
(2)AL[j].Add('正社員'); // これは NG
(3)AL[j].Add('5q2j56S+5ZOh'); // これはエンコードされた文字がそのまま登録される
if ldap.Login then begin
if ldap.Bind then begin
Result := ldap.Add('cn=CUTE1,ou=users,dc=Hello,dc=Project', AL);
end else begin
Result := False;
end;
ldap.Logout;
end else begin
Result := False;
end;
finally
AL.Free;
ldap.Free;
end;
end;
(2)はTLDAPsend.AddでFalseが返り、追加できません(値が不正)。
(3)のように2バイト文字をエンコードしたものを書き込むと、LDIFにエクスポートしたときに
employeeType: 5q2j56S+5ZOh
のように、そのままのデータが書かれてしまいます。これを
employeeType:: 5q2j56S+5ZOh
のようにしたいのですが。
TLDAPAttributeにはIsBinaryプロパティがあり、これがTrueになれば良いのではないかと思いますが、IsBinaryは読み出し専用であり、これをいじることが出来ません。ソースを覗いてみましたが、ちょっと私の手には負えませんでした。
宜敷お願いします。
--
flyman <y.h...@nitco.co.jp>
procedure TLDAPAttribute.SetAttributeName(Value: string);
begin
FAttributeName := Value;
FIsBinary := Pos(';binary', Lowercase(value)) > 0;
end;
となっているので,
AL[j].AttributeName := 'objectClass;binary';
とすれば良いのでは.
> AL[j].AttributeName := 'objectClass;binary';
>とすれば良いのでは.
その後色々と調べて、
AL[j].AttributeName := 'employeeType;binary';
AL[j].Add('***Some japanese characters in UTF-8***');
も試してみたのですが、
"employeeType;binary: option ;binary not supported with type"
とエラーが返り、うまく行きませんでした。
引き続き、何か情報がありましたらよろしくお願いします。
LDAPSend.pasを次のように書き換えました。
procedure TLDAPAttribute.SetAttributeName(Value: string);
begin
// FAttributeName := Value;
FAttributeName := StringReplace(Value, ';binary', '', [rfIgnoreCase]);
FIsBinary := Pos(';binary', Lowercase(value)) > 0;
end;
これで、
AL[j].AttributeName := 'employeeType;binary';
AL[j].Add('5q2j56S+5ZOh'); // UTF-8をBase64エンコードしたものを渡してやる
とすると、
漢字のアトリビュート値が書き加えられました。
しかし、
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := 'sn';
AL[j].Add('Yajima');
AL.Add;
j := AL.Count - 1;
AL[j].AttributeName := 'sn;binary';
AL[j].Add('55+i5bO2');
のように、同じ[sn]にアスキーとバイナリの値を追加しようとするとエラーになります。
ちょっと、Synapseの【仕様】かなぁ、と思い始めました。
どなたか、TLDAPsend.addで、
sn: YAJIMA
sn: 矢島
のように、同じアトリビュートにアスキー値と漢字の両方を設定する方法をご存じの方、宜敷ご教示下さい。
--
flyman <y.h...@nitco.co.jp>