]> granicus.if.org Git - ejabberd/commitdiff
* src/tls/tls_drv.c: Added a flag to avoid certificate validation
authorAlexey Shchepin <alexey@process-one.net>
Mon, 5 Jan 2009 17:21:10 +0000 (17:21 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Mon, 5 Jan 2009 17:21:10 +0000 (17:21 +0000)
* src/tls/tls.erl: Likewise
* src/ejabberd_c2s.erl: Likewise

SVN Revision: 1774

ChangeLog
src/ejabberd_c2s.erl
src/tls/tls.erl
src/tls/tls_drv.c

index 30f57fbba1c9cd41e79518837cad41044e2ca3b1..b92d9d54b7f548bba59f5e457ec9bb9627d75cc6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-01-05  Alexey Shchepin  <alexey@process-one.net>
+
+       * src/tls/tls_drv.c: Added a flag to avoid certificate validation
+       * src/tls/tls.erl: Likewise
+       * src/ejabberd_c2s.erl: Likewise
+
 2009-01-03  Badlop  <badlop@process-one.net>
 
        * src/*.erl: Fix EDoc comments
index 3ad6085d3009af14f7463ae763a7612f64782be8..d900f3bf4cc930573e3cc4fdfa77321f08be1b2c 100644 (file)
@@ -176,9 +176,11 @@ init([{SockMod, Socket}, Opts]) ->
     StartTLSRequired = lists:member(starttls_required, Opts),
     TLSEnabled = lists:member(tls, Opts),
     TLS = StartTLS orelse StartTLSRequired orelse TLSEnabled,
-    TLSOpts = lists:filter(fun({certfile, _}) -> true;
-                             (_) -> false
-                          end, Opts),
+    TLSOpts1 =
+       lists:filter(fun({certfile, _}) -> true;
+                       (_) -> false
+                    end, Opts),
+    TLSOpts = [verify_none | TLSOpts1],
     Zlib = lists:member(zlib, Opts) andalso (not StartTLSRequired),
     IP = peerip(SockMod, Socket),
     %% Check if IP is blacklisted:
index 72897cf085cae858435736547963d6c543784901..7281fd475eb1ea66210b330c89d73d0612409943 100644 (file)
@@ -59,6 +59,7 @@
 -define(GET_DECRYPTED_INPUT,  6).
 -define(GET_PEER_CERTIFICATE, 7).
 -define(GET_VERIFY_RESULT,    8).
+-define(VERIFY_NONE, 16#10000).
 
 -record(tlssock, {tcpsock, tlsport}).
 
@@ -120,13 +121,20 @@ tcp_to_tls(TCPSocket, Options) ->
                {error, already_loaded} -> ok
            end,
            Port = open_port({spawn, tls_drv}, [binary]),
+           Flags =
+               case lists:member(verify_none, Options) of
+                   true ->
+                       ?VERIFY_NONE;
+                   false ->
+                       0
+               end,
            Command = case lists:member(connect, Options) of
                          true ->
                              ?SET_CERTIFICATE_FILE_CONNECT;
                          false ->
                              ?SET_CERTIFICATE_FILE_ACCEPT
                      end,
-           case port_control(Port, Command, CertFile ++ [0]) of
+           case port_control(Port, Command bor Flags, CertFile ++ [0]) of
                <<0>> ->
                    {ok, #tlssock{tcpsock = TCPSocket, tlsport = Port}};
                <<1, Error/binary>> ->
index b90cab87c6d6cc66012242461fb0b8153302eb64..2f8e56150cac448456e08252fbdfd58cba346db1 100644 (file)
@@ -272,6 +272,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
 #define GET_DECRYPTED_INPUT  6
 #define GET_PEER_CERTIFICATE 7
 #define GET_VERIFY_RESULT    8
+#define VERIFY_NONE 0x10000
 
 
 #define die_unless(cond, errstr)                               \
@@ -312,6 +313,9 @@ static int tls_drv_control(ErlDrvData handle,
    int size;
    ErlDrvBinary *b;
    X509 *cert;
+   unsigned int flags = command;
+
+   command &= 0xffff;
 
    ERR_clear_error();
    switch (command)
@@ -354,6 +358,9 @@ static int tls_drv_control(ErlDrvData handle,
         d->ssl = SSL_new(ssl_ctx);
         die_unless(d->ssl, "SSL_new failed");
 
+        if (flags & VERIFY_NONE)
+           SSL_set_verify(d->ssl, SSL_VERIFY_NONE, verify_callback);
+
         d->bio_read = BIO_new(BIO_s_mem());
         d->bio_write = BIO_new(BIO_s_mem());