restemplate/indy/Protocols/IdIdentServer.pas

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.