IdIdentServer.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10203: IdIdentServer.pas
  11. {
  12. { Rev 1.0 2002.11.12 10:41:52 PM czhower
  13. }
  14. unit IdIdentServer;
  15. {2001 - Feb 11 - J. Peter Mugaas
  16. Started this component.
  17. This is based on RFC 1413 - Identification Protocol
  18. Note that the default port is assigned to IdPORT_AUTH
  19. The reason for this is that the RFC specifies port 113 and the old protocol name was
  20. Authentication Server Protocol. This was renamed Ident to better reflect what it does.
  21. }
  22. interface
  23. uses IdAssignedNumbers, IdTCPServer, Classes;
  24. const IdDefIdentQueryTimeOut = 60000; // 1 minute
  25. type TIdIdentQueryEvent = procedure (AThread: TIdPeerThread; AServerPort, AClientPort : Integer) of object;
  26. TIdIdentErrorType = (ieInvalidPort, ieNoUser, ieHiddenUser, ieUnknownError);
  27. TIdIdentServer = class(TIdTCPServer)
  28. protected
  29. FOnIdentQuery : TIdIdentQueryEvent;
  30. FQueryTimeOut : Integer;
  31. function DoExecute(AThread: TIdPeerThread): boolean; override;
  32. public
  33. Constructor Create(AOwner : TComponent); override;
  34. Procedure ReplyError(AThread : TIdPeerThread; AServerPort, AClientPort : Integer; AErr : TIdIdentErrorType);
  35. Procedure ReplyIdent(AThread : TIdPeerThread; AServerPort, AClientPort : Integer; AOS, AUserName : String; const ACharset : String = ''); {Do not Localize}
  36. Procedure ReplyOther(AThread : TIdPeerThread; AServerPort, AClientPort : Integer; AOther : String);
  37. published
  38. property QueryTimeOut : Integer read FQueryTimeOut write FQueryTimeOut default IdDefIdentQueryTimeOut;
  39. Property OnIdentQuery : TIdIdentQueryEvent read FOnIdentQuery write FOnIdentQuery;
  40. Property DefaultPort default IdPORT_AUTH;
  41. end;
  42. implementation
  43. uses IdGlobal, SysUtils;
  44. { TIdIdentServer }
  45. constructor TIdIdentServer.Create(AOwner: TComponent);
  46. begin
  47. inherited;
  48. DefaultPort := IdPORT_AUTH;
  49. FQueryTimeOut := IdDefIdentQueryTimeOut;
  50. end;
  51. function TIdIdentServer.DoExecute(AThread: TIdPeerThread): boolean;
  52. var s : String;
  53. ServerPort, ClientPort : Integer;
  54. begin
  55. Result := True;
  56. s := AThread.Connection.ReadLn('',FQueryTimeOut); {Do not Localize}
  57. if AThread.Connection.ReadLnTimedOut then
  58. begin
  59. AThread.Connection.Disconnect;
  60. end
  61. else
  62. begin
  63. ServerPort := StrToInt(Trim(Fetch(s,','))); {Do not Localize}
  64. ClientPort := StrToInt(Trim(s));
  65. If Assigned(FOnIdentQuery) then
  66. FOnIdentQuery(AThread,ServerPort,ClientPort)
  67. else
  68. begin
  69. ReplyError(AThread,ServerPort,ClientPort,ieUnknownError);
  70. AThread.Connection.Disconnect;
  71. end;
  72. end;
  73. end;
  74. procedure TIdIdentServer.ReplyError(AThread: TIdPeerThread; AServerPort,
  75. AClientPort: Integer; AErr : TIdIdentErrorType);
  76. var s : String;
  77. begin
  78. s := IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : ERROR : '; {Do not Localize}
  79. case AErr of
  80. ieInvalidPort : s := s + 'INVALID-PORT'; {Do not Localize}
  81. ieNoUser : s := s + 'NO-USER'; {Do not Localize}
  82. ieHiddenUser : s := s + 'HIDDEN-USER'; {Do not Localize}
  83. ieUnknownError : s := s + 'UNKNOWN-ERROR'; {Do not Localize}
  84. end;
  85. AThread.Connection.WriteLn(s);
  86. end;
  87. procedure TIdIdentServer.ReplyIdent(AThread: TIdPeerThread; AServerPort,
  88. AClientPort: Integer; AOS, AUserName: String; const ACharset: String);
  89. var s : String;
  90. begin
  91. s := IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : USERID : '; {Do not Localize}
  92. s := s + AOS;
  93. if Length(ACharset) > 0 then
  94. s := s + ','+ACharset; {Do not Localize}
  95. s := s + ' : '+AUserName; {Do not Localize}
  96. AThread.Connection.WriteLn(s);
  97. end;
  98. procedure TIdIdentServer.ReplyOther(AThread: TIdPeerThread; AServerPort,
  99. AClientPort: Integer; AOther: String);
  100. begin
  101. AThread.Connection.WriteLn(IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : USERID : OTHER : '+AOther); {Do not Localize}
  102. end;
  103. end.