254 lines
8.9 KiB
Plaintext
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.
|
||
|
|