restemplate/indy/Core/IdCustomTransparentProxy.pas

254 lines
8.9 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.10 11/12/2004 11:30:16 AM JPMugaas
Expansions for IPv6.
Rev 1.9 11/11/2004 10:25:22 PM JPMugaas
Added OpenProxy and CloseProxy so you can do RecvFrom and SendTo functions
from the UDP client with SOCKS. You must call OpenProxy before using
RecvFrom or SendTo. When you are finished, you must use CloseProxy to close
any connection to the Proxy. Connect and disconnect also call OpenProxy and
CloseProxy.
Rev 1.8 11/11/2004 3:42:52 AM JPMugaas
Moved strings into RS. Socks will now raise an exception if you attempt to
use SOCKS4 and SOCKS4A with UDP. Those protocol versions do not support UDP
at all.
Rev 1.7 11/9/2004 8:18:00 PM JPMugaas
Attempt to add SOCKS support in UDP.
Rev 1.6 6/6/2004 11:51:56 AM JPMugaas
Fixed TODO with an exception
Rev 1.5 2004.02.03 4:17:04 PM czhower
For unit name changes.
Rev 1.4 10/15/2003 10:59:06 PM DSiders
Corrected spelling error in resource string name.
Added resource string for circular links exception in transparent proxy.
Rev 1.3 10/15/2003 10:10:18 PM DSiders
Added localization comments.
Rev 1.2 5/16/2003 9:22:38 AM BGooijen
Added Listen(...)
Rev 1.1 5/14/2003 6:41:00 PM BGooijen
Added Bind(...)
Rev 1.0 12/2/2002 05:01:26 PM JPMugaas
Rechecked in due to file corruption.
}
unit IdCustomTransparentProxy;
interface
{$I IdCompilerDefines.inc}
//we need to put this in Delphi mode to work
uses
Classes,
IdComponent,
IdException,
IdGlobal,
IdIOHandler,
IdSocketHandle,
IdBaseComponent;
type
EIdTransparentProxyCircularLink = class(EIdException);
EIdTransparentProxyUDPNotSupported = class(EIdException);
TIdCustomTransparentProxyClass = class of TIdCustomTransparentProxy;
TIdCustomTransparentProxy = class(TIdComponent)
protected
FHost: String;
FPassword: String;
FPort: TIdPort;
FIPVersion : TIdIPVersion;
FUsername: String;
{$IFDEF USE_OBJECT_ARC}[Weak]{$ENDIF} FChainedProxy: TIdCustomTransparentProxy;
//
function GetEnabled: Boolean; virtual; abstract;
procedure SetEnabled(AValue: Boolean); virtual;
procedure MakeConnection(AIOHandler: TIdIOHandler; const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION); virtual; abstract;
{$IFNDEF USE_OBJECT_ARC}
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
{$ENDIF}
procedure SetChainedProxy(const AValue: TIdCustomTransparentProxy);
public
procedure Assign(ASource: TPersistent); override;
procedure OpenUDP(AHandle : TIdSocketHandle; const AHost: string = ''; const APort: TIdPort = 0; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION); virtual;
procedure CloseUDP(AHandle: TIdSocketHandle); virtual;
function RecvFromUDP(AHandle: TIdSocketHandle; var ABuffer : TIdBytes;
var VPeerIP: string; var VPeerPort: TIdPort; var VIPVersion: TIdIPVersion;
AMSec: Integer = IdTimeoutDefault): Integer; virtual;
procedure SendToUDP(AHandle: TIdSocketHandle;
const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion;
const ABuffer : TIdBytes); virtual;
procedure Connect(AIOHandler: TIdIOHandler; const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);
//
procedure Bind(AIOHandler: TIdIOHandler; const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);overload;virtual;
procedure Bind(AIOHandler: TIdIOHandler; const APort: TIdPort); overload;
function Listen(AIOHandler: TIdIOHandler; const ATimeOut: Integer): Boolean; virtual;
//
property Enabled: Boolean read GetEnabled write SetEnabled;
property Host: String read FHost write FHost;
property Password: String read FPassword write FPassword;
property Port: TIdPort read FPort write FPort;
property IPVersion : TIdIPVersion read FIPVersion write FIPVersion default ID_DEFAULT_IP_VERSION;
property Username: String read FUsername write FUsername;
property ChainedProxy: TIdCustomTransparentProxy read FChainedProxy write SetChainedProxy;
end;
implementation
uses
IdResourceStringsCore, IdExceptionCore;
{ TIdCustomTransparentProxy }
procedure TIdCustomTransparentProxy.Assign(ASource: TPersistent);
var
LSource: TIdCustomTransparentProxy;
Begin
if ASource is TIdCustomTransparentProxy then begin
LSource := TIdCustomTransparentProxy(ASource);
FHost := LSource.Host;
FPassword := LSource.Password;
FPort := LSource.Port;
FIPVersion := LSource.IPVersion;
FUsername := LSource.Username;
end else begin
inherited Assign(ASource);
end;
End;//
procedure TIdCustomTransparentProxy.Connect(AIOHandler: TIdIOHandler; const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);
var
// under ARC, convert a weak reference to a strong reference before working with it
LChainedProxy: TIdCustomTransparentProxy;
begin
LChainedProxy := FChainedProxy;
if Assigned(LChainedProxy) and LChainedProxy.Enabled then begin
MakeConnection(AIOHandler, LChainedProxy.Host, LChainedProxy.Port);
LChainedProxy.Connect(AIOHandler, AHost, APort, AIPVersion);
end else begin
MakeConnection(AIOHandler, AHost, APort, AIPVersion);
end;
end;
function TIdCustomTransparentProxy.Listen(AIOHandler: TIdIOHandler; const ATimeOut: integer):boolean;
begin
raise EIdTransparentProxyCantBind.Create(RSTransparentProxyCannotBind);
end;
procedure TIdCustomTransparentProxy.Bind(AIOHandler: TIdIOHandler; const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);
begin
raise EIdTransparentProxyCantBind.Create(RSTransparentProxyCannotBind);
end;
procedure TIdCustomTransparentProxy.Bind(AIOHandler: TIdIOHandler; const APort: TIdPort);
begin
Bind(AIOHandler, '0.0.0.0', APort); {do not localize}
end;
procedure TIdCustomTransparentProxy.SetEnabled(AValue: Boolean);
Begin
End;
// under ARC, all weak references to a freed object get nil'ed automatically
{$IFNDEF USE_OBJECT_ARC}
procedure TIdCustomTransparentProxy.Notification(AComponent: TComponent; Operation: TOperation);
begin
if (Operation = opRemove) and (AComponent = FChainedProxy) then begin
FChainedProxy := nil;
end;
inherited Notification(AComponent,Operation);
end;
{$ENDIF}
procedure TIdCustomTransparentProxy.SetChainedProxy(const AValue: TIdCustomTransparentProxy);
var
LNextValue: TIdCustomTransparentProxy;
// under ARC, convert a weak reference to a strong reference before working with it
LChainedProxy: TIdCustomTransparentProxy;
begin
LChainedProxy := FChainedProxy;
if LChainedProxy <> AValue then
begin
LNextValue := AValue;
while Assigned(LNextValue) do begin
if LNextValue = Self then begin
raise EIdTransparentProxyCircularLink.CreateFmt(RSInterceptCircularLink, [ClassName]);// -> One EIDCircularLink exception
end;
LNextValue := LNextValue.ChainedProxy;
end;
// under ARC, all weak references to a freed object get nil'ed automatically
{$IFNDEF USE_OBJECT_ARC}
if Assigned(LChainedProxy) then begin
LChainedProxy.RemoveFreeNotification(Self);
end;
{$ENDIF}
FChainedProxy := AValue;
{$IFNDEF USE_OBJECT_ARC}
if Assigned(AValue) then begin
AValue.FreeNotification(Self);
end;
{$ENDIF}
end;
end;
procedure TIdCustomTransparentProxy.CloseUDP(AHandle: TIdSocketHandle);
begin
raise EIdTransparentProxyUDPNotSupported.Create(RSTransparentProxyCanNotSupportUDP);
end;
procedure TIdCustomTransparentProxy.OpenUDP(AHandle: TIdSocketHandle;
const AHost: string = ''; const APort: TIdPort = 0;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);
begin
raise EIdTransparentProxyUDPNotSupported.Create(RSTransparentProxyCanNotSupportUDP);
end;
function TIdCustomTransparentProxy.RecvFromUDP(AHandle: TIdSocketHandle;
var ABuffer : TIdBytes; var VPeerIP: string; var VPeerPort: TIdPort;
var VIPVersion: TIdIPVersion; AMSec: Integer = IdTimeoutDefault): Integer;
begin
raise EIdTransparentProxyUDPNotSupported.Create(RSTransparentProxyCanNotSupportUDP);
end;
procedure TIdCustomTransparentProxy.SendToUDP(AHandle: TIdSocketHandle;
const AHost: string; const APort: TIdPort; const AIPVersion: TIdIPVersion;
const ABuffer : TIdBytes);
begin
raise EIdTransparentProxyUDPNotSupported.Create(RSTransparentProxyCanNotSupportUDP);
end;
end.