[Delphi:91284] synapseでLDAPにユーザー追加

181 views
Skip to first unread message

HOMMA, YUSAKU

unread,
Apr 9, 2009, 9:59:48 PM4/9/09
to Del...@ml.users.gr.jp
Delphi6+Synapse環境で、OpenLDAPにユーザーを追加するプログラムを書いています。
追加自体は出来ているのですが、2バイト文字のアトリビュートが書き込めません。
どなたか対策をご存じでしたらご教示下さい。

コードは以下のような感じです。

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>


sprh...@ka4.koalanet.ne.jp

unread,
Apr 11, 2009, 9:51:58 PM4/11/09
to Del...@ml.users.gr.jp
> TLDAPAttributeにはIsBinaryプロパティがあり、これがTrueになれば良いのではないかと思いますが、IsBinaryは読み出し専用であり、これをいじることが出来ません。ソースを覗いてみましたが、ちょっと私の手には負えませんでした。

procedure TLDAPAttribute.SetAttributeName(Value: string);
begin
FAttributeName := Value;
FIsBinary := Pos(';binary', Lowercase(value)) > 0;
end;

となっているので,

AL[j].AttributeName := 'objectClass;binary';

とすれば良いのでは.

HOMMA, YUSAKU

unread,
Apr 12, 2009, 9:28:26 AM4/12/09
to Del...@ml.users.gr.jp
RESありがとうございます。

> 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"
とエラーが返り、うまく行きませんでした。

引き続き、何か情報がありましたらよろしくお願いします。

HOMMA, YUSAKU

unread,
Apr 12, 2009, 10:29:40 PM4/12/09
to Del...@ml.users.gr.jp
自己レスです。
まだ解決はしていませんが、途中経過です。

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>

Reply all
Reply to author
Forward
0 new messages