| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- {
- $Project$
- $Workfile$
- $Revision$
- $DateUTC$
- $Id$
- This file is part of the Indy (Internet Direct) project, and is offered
- under the dual-licensing agreement described on the Indy website.
- (http://www.indyproject.org/)
- Copyright:
- (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
- }
- {
- $Log$
- }
- {
- Rev 1.6 2004.02.03 5:43:46 PM czhower
- Name changes
- Rev 1.5 1/21/2004 3:10:36 PM JPMugaas
- InitComponent
- Rev 1.4 3/27/2003 3:42:00 PM BGooijen
- Changed because some properties are moved to IOHandler
- Rev 1.3 2/24/2003 09:00:34 PM JPMugaas
- Rev 1.2 12/8/2002 07:25:18 PM JPMugaas
- Added published host and port properties.
- Rev 1.1 12/6/2002 05:30:00 PM JPMugaas
- Now decend from TIdTCPClientCustom instead of TIdTCPClient.
- Rev 1.0 11/13/2002 07:54:40 AM JPMugaas
- 2001 - Feb 12 - J. Peter Mugaas
- started this client
- }
- unit IdIdent;
- {
- This is the Ident client which is based on RFC 1413.
- }
- interface
- {$i IdCompilerDefines.inc}
- uses
- IdAssignedNumbers, IdException, IdTCPClient;
- const
- IdIdentQryTimeout = 60000;
- type
- TIdIdent = class(TIdTCPClientCustom)
- protected
- FQueryTimeOut : Integer;
- FReplyString : String;
- function GetReplyCharset: String;
- function GetReplyOS: String;
- function GetReplyOther: String;
- function GetReplyUserName: String;
- function FetchUserReply : String;
- function FetchOS : String;
- procedure ParseError;
- public
- constructor Create(AOwner: TComponent); override;
- procedure Query(APortOnServer, APortOnClient : Word);
- property Reply : String read FReplyString;
- property ReplyCharset : String read GetReplyCharset;
- property ReplyOS : String read GetReplyOS;
- property ReplyOther : String read GetReplyOther;
- property ReplyUserName : String read GetReplyUserName;
- published
- property QueryTimeOut : Integer read FQueryTimeOut write FQueryTimeOut default IdIdentQryTimeout;
- property Port default IdPORT_AUTH;
- property Host;
- end;
- EIdIdentException = class(EIdException);
- EIdIdentReply = class(EIdIdentException);
- EIdIdentInvalidPort = class(EIdIdentReply);
- EIdIdentNoUser = class(EIdIdentReply);
- EIdIdentHiddenUser = class(EIdIdentReply);
- EIdIdentUnknownError = class(EIdIdentReply);
- EIdIdentQueryTimeOut = class(EIdIdentReply);
- implementation
- uses
- IdGlobal,
- IdGlobalProtocols,
- IdResourceStringsProtocols,
- SysUtils;
- const
- IdentErrorText : Array[0..3] of string = (
- 'INVALID-PORT', 'NO-USER', 'HIDDEN-USER', 'UNKNOWN-ERROR' {Do not Localize}
- );
- { TIdIdent }
- constructor TIdIdent.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- FQueryTimeOut := IdIdentQryTimeout;
- Port := IdPORT_AUTH;
- end;
- function TIdIdent.FetchOS: String;
- var
- Buf : String;
- begin
- Buf := FetchUserReply;
- Result := Trim(Fetch(Buf,':')); {Do not Localize}
- end;
- function TIdIdent.FetchUserReply: String;
- var
- Buf : String;
- begin
- Result := ''; {Do not Localize}
- Buf := FReplyString;
- Fetch(Buf,':'); {Do not Localize}
- if TextIsSame(Trim(Fetch(Buf,':')), 'USERID') then begin {Do not Localize}
- Result := TrimLeft(Buf);
- end;
- end;
- function TIdIdent.GetReplyCharset: String;
- var
- Buf : String;
- begin
- Buf := FetchOS;
- if (Buf <> '') and (Pos(',', Buf) > 0) then begin {Do not Localize}
- Result := Trim(Fetch(Buf,',')); {Do not Localize}
- end else begin
- Result := 'US-ASCII'; {Do not Localize}
- end;
- end;
- function TIdIdent.GetReplyOS: String;
- var
- Buf : String;
- begin
- Buf := FetchOS;
- if Buf <> '' then begin
- Result := Trim(Fetch(Buf,',')); {Do not Localize}
- end else begin
- Result := ''; {Do not Localize}
- end;
- end;
- function TIdIdent.GetReplyOther: String;
- var
- Buf : String;
- begin
- if FetchOS = 'OTHER' then begin {Do not Localize}
- Buf := FetchUserReply;
- Fetch(Buf,':'); {Do not Localize}
- Result := TrimLeft(Buf);
- end;
- end;
- function TIdIdent.GetReplyUserName: String;
- var
- Buf : String;
- begin
- if FetchOS <> 'OTHER' then begin {Do not Localize}
- Buf := FetchUserReply;
- {OS ID}
- Fetch(Buf, ':'); {Do not Localize}
- Result := TrimLeft(Buf);
- end;
- end;
- procedure TIdIdent.ParseError;
- var
- Buf : String;
- begin
- Buf := FReplyString;
- Fetch(Buf, ':'); {Do not Localize}
- if Trim(Fetch(Buf, ':')) = 'ERROR' then begin {Do not Localize}
- case PosInStrArray(Trim(Buf), IdentErrorText, False) of
- {Invalid Port}
- 0 : Raise EIdIdentInvalidPort.Create(RSIdentInvalidPort);
- {No user}
- 1 : Raise EIdIdentNoUser.Create(RSIdentNoUser);
- {Hidden User}
- 2 : Raise EIdIdentHiddenUser.Create(RSIdentHiddenUser)
- else
- {Unknown or other error}
- raise EIdIdentUnknownError.Create(RSIdentUnknownError);
- end;
- end;
- end;
- procedure TIdIdent.Query(APortOnServer, APortOnClient: Word);
- var
- RTO : Boolean;
- begin
- FReplyString := ''; {Do not Localize}
- Connect;
- try
- WriteLn(IntToStr(APortOnServer) + ', ' + IntToStr(APortOnClient)); {Do not Localize}
- FReplyString := IOHandler.ReadLn('', FQueryTimeOut); {Do not Localize}
- {We check here and not return an exception at the moment so we can close our
- connection before raising our exception if the read timed out}
- RTO := IOHandler.ReadLnTimedOut;
- finally
- Disconnect;
- end;
- if RTO then begin
- raise EIdIdentQueryTimeOut.Create(RSIdentReplyTimeout);
- end;
- ParseError;
- end;
- end.
|