155 lines
4.7 KiB
Plaintext
155 lines
4.7 KiB
Plaintext
{
|
|
$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.8 12/2/2004 4:23:54 PM JPMugaas
|
|
Adjusted for changes in Core.
|
|
|
|
Rev 1.7 2004.02.03 5:43:48 PM czhower
|
|
Name changes
|
|
|
|
Rev 1.6 1/21/2004 3:10:38 PM JPMugaas
|
|
InitComponent
|
|
|
|
Rev 1.5 3/27/2003 3:42:02 PM BGooijen
|
|
Changed because some properties are moved to IOHandler
|
|
|
|
Rev 1.4 2/24/2003 09:00:38 PM JPMugaas
|
|
|
|
Rev 1.3 1/17/2003 07:10:32 PM JPMugaas
|
|
Now compiles under new framework.
|
|
|
|
Rev 1.2 1-1-2003 20:13:20 BGooijen
|
|
Changed to support the new TIdContext class
|
|
|
|
Rev 1.1 12/6/2002 04:35:16 PM JPMugaas
|
|
Now compiles with new code.
|
|
|
|
Rev 1.0 11/13/2002 07:54:44 AM JPMugaas
|
|
|
|
2001 - Feb 11 - J. Peter Mugaas
|
|
Started this component.
|
|
}
|
|
|
|
unit IdIdentServer;
|
|
|
|
{
|
|
This is based on RFC 1413 - Identification Protocol
|
|
|
|
Note that the default port is assigned to IdPORT_AUTH
|
|
The reason for this is that the RFC specifies port 113 and the old protocol
|
|
name was Authentication Server Protocol. This was renamed Ident to better
|
|
reflect what it does.
|
|
}
|
|
|
|
interface
|
|
|
|
{$i IdCompilerDefines.inc}
|
|
|
|
uses
|
|
IdAssignedNumbers, IdContext, IdCustomTCPServer, IdGlobal;
|
|
|
|
const
|
|
IdDefIdentQueryTimeOut = 60000; // 1 minute
|
|
|
|
type
|
|
TIdIdentQueryEvent = procedure (AContext:TIdContext; AServerPort, AClientPort : TIdPort) of object;
|
|
TIdIdentErrorType = (ieInvalidPort, ieNoUser, ieHiddenUser, ieUnknownError);
|
|
|
|
TIdIdentServer = class(TIdCustomTCPServer)
|
|
protected
|
|
FOnIdentQuery : TIdIdentQueryEvent;
|
|
FQueryTimeOut : Integer;
|
|
function DoExecute(AContext:TIdContext): boolean; override;
|
|
procedure InitComponent; override;
|
|
public
|
|
Procedure ReplyError(AContext:TIdContext; AServerPort, AClientPort : TIdPort; AErr : TIdIdentErrorType);
|
|
Procedure ReplyIdent(AContext:TIdContext; AServerPort, AClientPort : TIdPort; AOS, AUserName : String; const ACharset : String = ''); {Do not Localize}
|
|
Procedure ReplyOther(AContext:TIdContext; AServerPort, AClientPort : TIdPort; AOther : String);
|
|
published
|
|
property QueryTimeOut : Integer read FQueryTimeOut write FQueryTimeOut default IdDefIdentQueryTimeOut;
|
|
Property OnIdentQuery : TIdIdentQueryEvent read FOnIdentQuery write FOnIdentQuery;
|
|
Property DefaultPort default IdPORT_AUTH;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils;
|
|
|
|
{ TIdIdentServer }
|
|
|
|
procedure TIdIdentServer.InitComponent;
|
|
begin
|
|
inherited;
|
|
DefaultPort := IdPORT_AUTH;
|
|
FQueryTimeOut := IdDefIdentQueryTimeOut;
|
|
end;
|
|
|
|
function TIdIdentServer.DoExecute(AContext:TIdContext): Boolean;
|
|
var
|
|
s : String;
|
|
ServerPort, ClientPort : TIdPort;
|
|
begin
|
|
Result := True;
|
|
s := AContext.Connection.IOHandler.ReadLn('', FQueryTimeOut); {Do not Localize}
|
|
if not AContext.Connection.IOHandler.ReadLnTimedOut then begin
|
|
ServerPort := IndyStrToInt(Fetch(s,',')); {Do not Localize}
|
|
ClientPort := IndyStrToInt(s);
|
|
if Assigned(FOnIdentQuery) then begin
|
|
FOnIdentQuery(AContext, ServerPort, ClientPort);
|
|
Exit;
|
|
end;
|
|
ReplyError(AContext, ServerPort, ClientPort, ieUnknownError);
|
|
end;
|
|
AContext.Connection.Disconnect;
|
|
end;
|
|
|
|
procedure TIdIdentServer.ReplyError(AContext:TIdContext; AServerPort,
|
|
AClientPort: TIdPort; AErr : TIdIdentErrorType);
|
|
var s : String;
|
|
begin
|
|
s := IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : ERROR : '; {Do not Localize}
|
|
case AErr of
|
|
ieInvalidPort : s := s + 'INVALID-PORT'; {Do not Localize}
|
|
ieNoUser : s := s + 'NO-USER'; {Do not Localize}
|
|
ieHiddenUser : s := s + 'HIDDEN-USER'; {Do not Localize}
|
|
ieUnknownError : s := s + 'UNKNOWN-ERROR'; {Do not Localize}
|
|
end;
|
|
AContext.Connection.IOHandler.WriteLn(s);
|
|
end;
|
|
|
|
procedure TIdIdentServer.ReplyIdent(AContext:TIdContext; AServerPort,
|
|
AClientPort: TIdPort; AOS, AUserName: String; const ACharset: String);
|
|
var s : String;
|
|
begin
|
|
s := IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : USERID : '; {Do not Localize}
|
|
s := s + AOS;
|
|
if Length(ACharset) > 0 then
|
|
s := s + ','+ACharset; {Do not Localize}
|
|
s := s + ' : '+AUserName; {Do not Localize}
|
|
AContext.Connection.IOHandler.WriteLn(s);
|
|
end;
|
|
|
|
procedure TIdIdentServer.ReplyOther(AContext:TIdContext; AServerPort,
|
|
AClientPort: TIdPort; AOther: String);
|
|
begin
|
|
AContext.Connection.IOHandler.WriteLn(IntToStr(AServerPort)+', '+IntToStr(AClientPort) + ' : USERID : OTHER : '+AOther); {Do not Localize}
|
|
end;
|
|
|
|
end.
|