mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: FTP - reuse ssl session for data connection (GnuTLS)
This commit is contained in:
parent
0c25b15d41
commit
e39d537380
2 changed files with 36 additions and 0 deletions
|
|
@ -74,6 +74,7 @@ type
|
|||
TSSLGnuTLS = class(TCustomSSL)
|
||||
private
|
||||
FShutdown: Integer;
|
||||
FDatum: gnutls_datum_t;
|
||||
FSession: gnutls_session_t;
|
||||
FPriorities: array[Byte] of AnsiChar;
|
||||
FCredentials: gnutls_certificate_credentials_t;
|
||||
|
|
@ -192,6 +193,14 @@ function TSSLGnuTLS.DeInit: Boolean;
|
|||
begin
|
||||
Result := True;
|
||||
|
||||
if Assigned(FSessionNew) then
|
||||
begin
|
||||
gnutls_free(FDatum.data);
|
||||
FSessionNew := nil;
|
||||
FDatum.data := nil;
|
||||
FDatum.size := 0
|
||||
end;
|
||||
|
||||
if Assigned(FCredentials) then
|
||||
begin
|
||||
gnutls_certificate_free_credentials(FCredentials);
|
||||
|
|
@ -244,6 +253,10 @@ begin
|
|||
if Prepare then
|
||||
begin
|
||||
gnutls_transport_set_ptr(FSession, gnutls_transport_ptr_t(FSocket.Socket));
|
||||
// Reuse session
|
||||
if Assigned(FSessionOld) then begin
|
||||
gnutls_session_set_data(FSession, gnutls_datum_ptr_t(FSessionOld)^.data, gnutls_datum_ptr_t(FSessionOld)^.size);
|
||||
end;
|
||||
// do blocking call of SSL_Connect
|
||||
if FSocket.ConnectionTimeout <= 0 then
|
||||
begin
|
||||
|
|
@ -262,6 +275,13 @@ begin
|
|||
end;
|
||||
if SSLCheck then
|
||||
begin
|
||||
if (FSessionOld = nil) then
|
||||
begin
|
||||
if (gnutls_session_get_data2(FSession, @FDatum) = GNUTLS_E_SUCCESS) then
|
||||
begin
|
||||
FSessionNew := @FDatum;
|
||||
end;
|
||||
end;
|
||||
FSSLEnabled := True;
|
||||
FShutdown := 0;
|
||||
Result := True;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
unit ssl_gnutls_lib;
|
||||
|
||||
{$mode delphi}
|
||||
{$packrecords c}
|
||||
|
||||
interface
|
||||
|
||||
|
|
@ -125,6 +126,13 @@ type
|
|||
GNUTLS_SHUT_WR = 1
|
||||
);
|
||||
|
||||
type
|
||||
gnutls_datum_t = record
|
||||
data: pcuchar;
|
||||
size: cuint;
|
||||
end;
|
||||
gnutls_datum_ptr_t = ^gnutls_datum_t;
|
||||
|
||||
type
|
||||
gnutls_session_st = record end;
|
||||
gnutls_session_t = ^gnutls_session_st;
|
||||
|
|
@ -147,6 +155,10 @@ var
|
|||
gnutls_certificate_allocate_credentials: function(out res: gnutls_certificate_credentials_t): cint; cdecl;
|
||||
gnutls_certificate_free_credentials: procedure(sc: gnutls_certificate_credentials_t); cdecl;
|
||||
|
||||
gnutls_free: procedure(ptr: Pointer); cdecl;
|
||||
gnutls_session_get_data2: function(session: gnutls_session_t; data: gnutls_datum_ptr_t): cint; cdecl;
|
||||
gnutls_session_set_data: function(session: gnutls_session_t; session_data: Pointer; session_data_size: csize_t): cint; cdecl;
|
||||
|
||||
gnutls_transport_set_ptr: procedure(session: gnutls_session_t; ptr: gnutls_transport_ptr_t); cdecl;
|
||||
gnutls_record_check_pending: function(session: gnutls_session_t): csize_t; cdecl;
|
||||
|
||||
|
|
@ -216,6 +228,10 @@ begin
|
|||
@gnutls_certificate_allocate_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_allocate_credentials');
|
||||
@gnutls_certificate_free_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_free_credentials');
|
||||
|
||||
@gnutls_free:= SafeGetProcAddress(gnutls, 'gnutls_free');
|
||||
@gnutls_session_get_data2:= SafeGetProcAddress(gnutls, 'gnutls_session_get_data2');
|
||||
@gnutls_session_set_data:= SafeGetProcAddress(gnutls, 'gnutls_session_set_data');
|
||||
|
||||
@gnutls_transport_set_ptr:= SafeGetProcAddress(gnutls, 'gnutls_transport_set_ptr');
|
||||
@gnutls_record_check_pending:= SafeGetProcAddress(gnutls, 'gnutls_record_check_pending');
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue