Selaa lähdekoodia

UPD: GnuTLS for Linux

Alexander Koblov 10 vuotta sitten
vanhempi
commit
bf55acd9b8
1 muutettua tiedostoa jossa 56 lisäystä ja 41 poistoa
  1. 56 41
      plugins/wfx/ftp/synapse/ssl_gnutls_lib.pas

+ 56 - 41
plugins/wfx/ftp/synapse/ssl_gnutls_lib.pas

@@ -1,7 +1,7 @@
 {
   GnuTLS to OpenSSL wrapper (based on GNUTLS-EXTRA)
 
-  Copyright (c) 2013 Alexander Koblov <[email protected]>
+  Copyright (c) 2013-2015 Alexander Koblov <[email protected]>
   Copyright (c) 2004, 2005, 2006 Free Software Foundation
   Copyright (c) 2002 Andrew McDonald <[email protected]>
 
@@ -31,7 +31,7 @@ implementation
 
 uses
   SysUtils, CTypes, DynLibs,
-  ssl_openssl_lib, ssl_openssl, blcksock, windows;
+  ssl_openssl_lib, ssl_openssl, blcksock, dl;
 
 type
   gnutls_protocol_t =
@@ -207,6 +207,8 @@ var
 
   gnutls_strerror: function(error: cint): PAnsiChar; cdecl;
 
+  gnutls_check_version: function(const req_version: PAnsiChar): PAnsiChar; cdecl;
+
 (* Library initialisation functions *)
 
 function SSL_library_init (): cint; cdecl;
@@ -501,59 +503,72 @@ begin
   if (Result = nil) then raise Exception.Create(EmptyStr);
 end;
 
+const
+  libgnutls: array[0..2] of String = ('30', '28', '26');
 var
+  index: Integer;
+  dlinfo: dl_info;
   gnutls: TLibHandle = NilHandle;
-  lpBuffer: TMemoryBasicInformation;
 begin
-  gnutls:= LoadLibrary('libgnutls-28.dll');
-
-  if (gnutls <> NilHandle) then
+  if (IsSSLloaded = False) then
   begin
-    @gnutls_global_init:= SafeGetProcAddress(gnutls, 'gnutls_global_init');
+    for index:= Low(libgnutls) to High(libgnutls) do
+    begin
+      gnutls:= LoadLibrary('libgnutls.so.' + libgnutls[index]);
+      if gnutls <> NilHandle then Break;
+    end;
 
-    @gnutls_init:= SafeGetProcAddress(gnutls, 'gnutls_init');
-    @gnutls_deinit:= SafeGetProcAddress(gnutls, 'gnutls_deinit');
+    if (gnutls <> NilHandle) then
+    try
+      @gnutls_check_version:= SafeGetProcAddress(gnutls, 'gnutls_check_version');
 
-    @gnutls_priority_set_direct:= SafeGetProcAddress(gnutls, 'gnutls_priority_set_direct');
-    @gnutls_credentials_set:= SafeGetProcAddress(gnutls, 'gnutls_credentials_set');
-    @gnutls_certificate_set_x509_trust_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_trust_file');
-    @gnutls_certificate_set_x509_key_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_key_file');
+      if (gnutls_check_version('3.0.0') = nil) then raise Exception.Create(EmptyStr);
 
-    @gnutls_certificate_allocate_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_allocate_credentials');
-    @gnutls_certificate_free_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_free_credentials');
+      @gnutls_global_init:= SafeGetProcAddress(gnutls, 'gnutls_global_init');
 
-    @gnutls_transport_set_ptr:= SafeGetProcAddress(gnutls, 'gnutls_transport_set_ptr');
-    @gnutls_record_check_pending:= SafeGetProcAddress(gnutls, 'gnutls_record_check_pending');
+      @gnutls_init:= SafeGetProcAddress(gnutls, 'gnutls_init');
+      @gnutls_deinit:= SafeGetProcAddress(gnutls, 'gnutls_deinit');
 
-    @gnutls_handshake:= SafeGetProcAddress(gnutls, 'gnutls_handshake');
-    @gnutls_bye:= SafeGetProcAddress(gnutls, 'gnutls_bye');
+      @gnutls_priority_set_direct:= SafeGetProcAddress(gnutls, 'gnutls_priority_set_direct');
+      @gnutls_credentials_set:= SafeGetProcAddress(gnutls, 'gnutls_credentials_set');
+      @gnutls_certificate_set_x509_trust_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_trust_file');
+      @gnutls_certificate_set_x509_key_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_key_file');
 
-    @gnutls_record_send:= SafeGetProcAddress(gnutls, 'gnutls_record_send');
-    @gnutls_record_recv:= SafeGetProcAddress(gnutls, 'gnutls_record_recv');
+      @gnutls_certificate_allocate_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_allocate_credentials');
+      @gnutls_certificate_free_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_free_credentials');
 
-    @gnutls_protocol_get_version:= SafeGetProcAddress(gnutls, 'gnutls_protocol_get_version');
-    @gnutls_cipher_get:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get');
-    @gnutls_kx_get:= SafeGetProcAddress(gnutls, 'gnutls_kx_get');
-    @gnutls_mac_get:= SafeGetProcAddress(gnutls, 'gnutls_mac_get');
-    @gnutls_compression_get:= SafeGetProcAddress(gnutls, 'gnutls_compression_get');
-    @gnutls_certificate_type_get:= SafeGetProcAddress(gnutls, 'gnutls_certificate_type_get');
-    @gnutls_cipher_suite_get_name:= SafeGetProcAddress(gnutls, 'gnutls_cipher_suite_get_name');
-    @gnutls_cipher_get_key_size:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get_key_size');
+      @gnutls_transport_set_ptr:= SafeGetProcAddress(gnutls, 'gnutls_transport_set_ptr');
+      @gnutls_record_check_pending:= SafeGetProcAddress(gnutls, 'gnutls_record_check_pending');
 
-    @gnutls_strerror:= SafeGetProcAddress(gnutls, 'gnutls_strerror');
-  end;
+      @gnutls_handshake:= SafeGetProcAddress(gnutls, 'gnutls_handshake');
+      @gnutls_bye:= SafeGetProcAddress(gnutls, 'gnutls_bye');
 
-  if (IsSSLloaded = False) then
-  begin
-    if VirtualQuery(@lpBuffer, @lpBuffer, SizeOf(lpBuffer)) = SizeOf(lpBuffer) then
-    begin
-      SetLength(DLLSSLName, MAX_PATH);
-      SetLength(DLLSSLName, GetModuleFileName(THandle(lpBuffer.AllocationBase),
-                                              PAnsiChar(DLLSSLName), MAX_PATH));
-      DLLUtilName := DLLSSLName;
+      @gnutls_record_send:= SafeGetProcAddress(gnutls, 'gnutls_record_send');
+      @gnutls_record_recv:= SafeGetProcAddress(gnutls, 'gnutls_record_recv');
+
+      @gnutls_protocol_get_version:= SafeGetProcAddress(gnutls, 'gnutls_protocol_get_version');
+      @gnutls_cipher_get:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get');
+      @gnutls_kx_get:= SafeGetProcAddress(gnutls, 'gnutls_kx_get');
+      @gnutls_mac_get:= SafeGetProcAddress(gnutls, 'gnutls_mac_get');
+      @gnutls_compression_get:= SafeGetProcAddress(gnutls, 'gnutls_compression_get');
+      @gnutls_certificate_type_get:= SafeGetProcAddress(gnutls, 'gnutls_certificate_type_get');
+      @gnutls_cipher_suite_get_name:= SafeGetProcAddress(gnutls, 'gnutls_cipher_suite_get_name');
+      @gnutls_cipher_get_key_size:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get_key_size');
+
+      @gnutls_strerror:= SafeGetProcAddress(gnutls, 'gnutls_strerror');
+
+
+      FillChar(dlinfo, SizeOf(dlinfo), 0);
+      if dladdr(@dlinfo, @dlinfo) <> 0 then
+      begin
+        DLLSSLName:= dlinfo.dli_fname;
+        DLLUtilName:= DLLSSLName;
 
-      if InitSSLInterface then
-        SSLImplementation := TSSLOpenSSL;
+        if InitSSLInterface then
+          SSLImplementation:= TSSLOpenSSL;
+      end;
+    except
+      FreeLibrary(gnutls);
     end;
   end;