Changes in / [68c7c14:9fae35c]
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/README
r68c7c14 r9fae35c 50 50 51 51 These days, MSN Messenger clients have to connect to the MS Passport servers 52 through HTTPS. BitlBee can use se rveral SSL libraries for this: GnuTLS, NSS52 through HTTPS. BitlBee can use several SSL libraries for this: GnuTLS, NSS 53 53 (which comes with Mozilla) and OpenSSL. OpenSSL is not GPL-compatible in some 54 54 situations, so using GnuTLS or NSS is preferred. However, especially on *BSD, -
protocols/ssl_openssl.c
r68c7c14 r9fae35c 5 5 \********************************************************************/ 6 6 7 /* SSL module - GnuTLS version */7 /* SSL module - OpenTLS version */ 8 8 9 9 /* … … 41 41 struct scd 42 42 { 43 ssl_input_function func;43 SslInputFunction func; 44 44 gpointer data; 45 45 int fd; 46 46 gboolean established; 47 47 48 int inpa;49 int lasterr; /* Necessary for SSL_get_error */50 48 SSL *ssl; 51 49 SSL_CTX *ssl_ctx; … … 56 54 57 55 58 void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )56 void *ssl_connect( char *host, int port, SslInputFunction func, gpointer data ) 59 57 { 60 58 struct scd *conn = g_new0( struct scd, 1 ); … … 95 93 } 96 94 97 static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond );98 99 95 static void ssl_connected( gpointer data, gint source, GaimInputCondition cond ) 100 96 { … … 102 98 103 99 if( source == -1 ) 104 return ssl_handshake( data, -1, cond );100 goto ssl_connected_failure; 105 101 106 /* Make it non-blocking at least during the handshake... */107 sock_make_nonblocking( conn->fd );108 102 SSL_set_fd( conn->ssl, conn->fd ); 109 103 110 return ssl_handshake( data, source, cond ); 111 } 112 113 static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond ) 114 { 115 struct scd *conn = data; 116 int st; 117 118 if( conn->inpa != -1 ) 119 { 120 gaim_input_remove( conn->inpa ); 121 conn->inpa = -1; 122 } 123 124 if( ( st = SSL_connect( conn->ssl ) ) < 0 ) 125 { 126 conn->lasterr = SSL_get_error( conn->ssl, st ); 127 if( conn->lasterr != SSL_ERROR_WANT_READ && conn->lasterr != SSL_ERROR_WANT_WRITE ) 128 goto ssl_connected_failure; 129 130 conn->inpa = gaim_input_add( conn->fd, ssl_getdirection( conn ), ssl_handshake, data ); 131 return; 132 } 104 if( SSL_connect( conn->ssl ) < 0 ) 105 goto ssl_connected_failure; 133 106 134 107 conn->established = TRUE; 135 sock_make_blocking( conn->fd ); /* For now... */136 108 conn->func( conn->data, conn, cond ); 137 109 return; … … 155 127 int ssl_read( void *conn, char *buf, int len ) 156 128 { 157 int st; 129 if( !((struct scd*)conn)->established ) 130 return( 0 ); 158 131 159 if( !((struct scd*)conn)->established ) 160 { 161 ssl_errno = SSL_NOHANDSHAKE; 162 return -1; 163 } 164 165 st = SSL_read( ((struct scd*)conn)->ssl, buf, len ); 166 167 ssl_errno = SSL_OK; 168 if( st <= 0 ) 169 { 170 ((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st ); 171 if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ) 172 ssl_errno = SSL_AGAIN; 173 } 174 175 return st; 132 return( SSL_read( ((struct scd*)conn)->ssl, buf, len ) ); 176 133 } 177 134 178 135 int ssl_write( void *conn, const char *buf, int len ) 179 136 { 180 int st; 137 if( !((struct scd*)conn)->established ) 138 return( 0 ); 181 139 182 if( !((struct scd*)conn)->established ) 183 { 184 ssl_errno = SSL_NOHANDSHAKE; 185 return -1; 186 } 187 188 st = SSL_write( ((struct scd*)conn)->ssl, buf, len ); 189 190 ssl_errno = SSL_OK; 191 if( st <= 0 ) 192 { 193 ((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st ); 194 if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ) 195 ssl_errno = SSL_AGAIN; 196 } 197 198 return st; 140 return( SSL_write( ((struct scd*)conn)->ssl, buf, len ) ); 199 141 } 200 142 … … 202 144 { 203 145 struct scd *conn = conn_; 204 205 if( conn->inpa != -1 )206 gaim_input_remove( conn->inpa );207 146 208 147 if( conn->established ) … … 220 159 return( ((struct scd*)conn)->fd ); 221 160 } 222 223 GaimInputCondition ssl_getdirection( void *conn )224 {225 return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? GAIM_INPUT_WRITE : GAIM_INPUT_READ );226 }
Note: See TracChangeset
for help on using the changeset viewer.