unit usecuretunnel;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, IdSSLOpenSSL, IdMappedPortTCP;
type
TSecureTunnelType = (sttClient, sttServer);
{ TSecureTunnel }
TSecureTunnel = class
private
FIOHandlerSSL : TIdServerIOHandlerSSLOpenSSL;
FTCPMappedPort : TIdMappedPortTCP;
FSecureTunnelType : TSecureTunnelType;
procedure MyOnOutboundConnect(AContext: TIdContext);
procedure MyOnConnect(AContext: TIdContext);
public
constructor Create(DefaultPort : integer; MappedHost : string; MappedPort : integer; TypeOfTunnel : TSecureTunnelType);
destructor Free;
end;
implementation
{ TSecureTunnel }
procedure TSecureTunnel.MyOnOutboundConnect(AContext: TIdContext);
begin
if (FSecureTunnelType = sttClient) then
begin
FTCPMappedPort(AContext).OutboundClient.IOHandler := FIOHandlerSSL;
TIdSSLIOHandlerSocketBase(FTCPMappedPort.IOHandler).PassThrough := False;
end;
end;
procedure TSecureTunnel.MyOnConnect(AContext: TIdContext);
begin
if (FSecureTunnelType = sttServer) then
begin
FTCPMappedPort(AContext).OutboundClient.IOHandler := FIOHandlerSSL;
TIdSSLIOHandlerSocketBase(FTCPMappedPort.IOHandler).PassThrough := False;
end;
end;
constructor TSecureTunnel.Create(DefaultPort: integer; MappedHost: string;
MappedPort: integer; TypeOfTunnel: TSecureTunnelType);
begin
FIOHandlerSSL := TIdServerIOHandlerSSLOpenSSL.Create(nil);
FTCPMappedPort := TIdMappedPortTCP.Create;
FTCPMappedPort.DefaultPort := DefaultPort;
FTCPMappedPort.MappedHost := MappedHost;
FTCPMappedPort.MappedPort := MappedPort;
FSecureTunnelType := TypeOfTunnel;
FTCPMappedPort.OnOutboundConnect := @MyOnOutboundConnect;
FTCPMappedPort.OnConnect := @MyOnConnect;
end;
destructor TSecureTunnel.Free;
begin
if Assigned(FTCPMappedPort) then
begin
FTCPMappedPort.Free;
FTCPMappedPort:=nil;
end;
if Assigned(FIOHandlerSSL) then
begin
FIOHandlerSSL.Free;
FIOHandlerSSL:=nil;
end;
end;
end.