diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-06-25 14:15:42 +0200 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-06-25 14:15:42 +0200 | 
| commit | df1694b9559d4abec748b0506b5f44e684d022a8 (patch) | |
| tree | 4a86737f6edc6a72c0cf8ddf6c946c64c36572b4 /protocols | |
| parent | 812a41362a9316da1734fdaa8b1aad36bde9cb5c (diff) | |
Moving all generic files to lib/ instead of having some in / and some in
protocols/, and adding RC4 code.
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/Makefile | 2 | ||||
| -rw-r--r-- | protocols/events.h | 66 | ||||
| -rw-r--r-- | protocols/events_glib.c | 137 | ||||
| -rw-r--r-- | protocols/events_libevent.c | 247 | ||||
| -rw-r--r-- | protocols/http_client.c | 453 | ||||
| -rw-r--r-- | protocols/http_client.h | 57 | ||||
| -rw-r--r-- | protocols/md5.c | 392 | ||||
| -rw-r--r-- | protocols/md5.h | 85 | ||||
| -rw-r--r-- | protocols/proxy.c | 556 | ||||
| -rw-r--r-- | protocols/proxy.h | 53 | ||||
| -rw-r--r-- | protocols/sha.c | 173 | ||||
| -rw-r--r-- | protocols/sha.h | 21 | ||||
| -rw-r--r-- | protocols/ssl_bogus.c | 57 | ||||
| -rw-r--r-- | protocols/ssl_client.h | 42 | ||||
| -rw-r--r-- | protocols/ssl_gnutls.c | 206 | ||||
| -rw-r--r-- | protocols/ssl_nss.c | 190 | ||||
| -rw-r--r-- | protocols/ssl_openssl.c | 221 | 
17 files changed, 1 insertions, 2957 deletions
| diff --git a/protocols/Makefile b/protocols/Makefile index b74212f4..cc45fb09 100644 --- a/protocols/Makefile +++ b/protocols/Makefile @@ -9,7 +9,7 @@  -include ../Makefile.settings  # [SH] Program variables -objects = $(EVENT_HANDLER) http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT) +objects = nogaim.o  # [SH] The next two lines should contain the directory name (in $(subdirs))  #      and the name of the object file, which should be linked into diff --git a/protocols/events.h b/protocols/events.h deleted file mode 100644 index 781fca6a..00000000 --- a/protocols/events.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * nogaim - * - * Copyright (C) 2006 Wilmer van der Gaast and others - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - * - */ - -/* - * Split off the event handling things from proxy.[ch] (and adding timer - * stuff. This to allow BitlBee to use other libs than GLib for event - * handling. - */ - - -#ifndef _EVENTS_H_ -#define _EVENTS_H_ - -#include <sys/types.h> -#ifndef _WIN32 -#include <sys/socket.h> -#include <netdb.h> -#include <netinet/in.h> -#endif -#include <glib.h> -#include <gmodule.h> - -typedef enum { -	GAIM_INPUT_READ = 1 << 1, -	GAIM_INPUT_WRITE = 1 << 2 -} b_input_condition; -typedef gboolean (*b_event_handler)(gpointer data, gint fd, b_input_condition cond); - -#define GAIM_READ_COND  (G_IO_IN | G_IO_HUP | G_IO_ERR) -#define GAIM_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL) -#define GAIM_ERR_COND   (G_IO_HUP | G_IO_ERR | G_IO_NVAL) - -// #define event_debug( x... ) printf( x ) -#define event_debug( x... ) - -G_MODULE_EXPORT void b_main_init(); -G_MODULE_EXPORT void b_main_run(); -G_MODULE_EXPORT void b_main_quit(); - -G_MODULE_EXPORT gint b_input_add(int fd, b_input_condition cond, b_event_handler func, gpointer data); -G_MODULE_EXPORT gint b_timeout_add(gint timeout, b_event_handler func, gpointer data); -G_MODULE_EXPORT void b_event_remove(gint id); - -#ifdef EVENTS_LIBEVENT -G_MODULE_EXPORT void closesocket(int fd); -#endif - -#endif /* _EVENTS_H_ */ diff --git a/protocols/events_glib.c b/protocols/events_glib.c deleted file mode 100644 index 620720cd..00000000 --- a/protocols/events_glib.c +++ /dev/null @@ -1,137 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2006 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* - * Event handling (using GLib) - */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#define BITLBEE_CORE -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#ifndef _WIN32 -#include <sys/socket.h> -#include <netdb.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#else -#include "sock.h" -#define ETIMEDOUT WSAETIMEDOUT -#define EINPROGRESS WSAEINPROGRESS -#endif -#include <fcntl.h> -#include <errno.h> -#include "proxy.h" - -typedef struct _GaimIOClosure { -	b_event_handler function; -	guint result; -	gpointer data; -} GaimIOClosure; - -static GMainLoop *loop; - -void b_main_init() -{ -	loop = g_main_new( FALSE ); -} - -void b_main_run() -{ -	g_main_run( loop ); -} - -void b_main_quit() -{ -	g_main_quit( loop ); -} - -static gboolean gaim_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data) -{ -	GaimIOClosure *closure = data; -	b_input_condition gaim_cond = 0; -	gboolean st; - -	if (condition & GAIM_READ_COND) -		gaim_cond |= GAIM_INPUT_READ; -	if (condition & GAIM_WRITE_COND) -		gaim_cond |= GAIM_INPUT_WRITE; -	 -	event_debug( "gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data ); - -	st = closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); -	 -	if( !st ) -		event_debug( "Returned FALSE, cancelling.\n" ); -	 -	return st; -} - -static void gaim_io_destroy(gpointer data) -{ -	event_debug( "gaim_io_destroy( 0x%x )\n", data ); -	g_free(data); -} - -gint b_input_add(gint source, b_input_condition condition, b_event_handler function, gpointer data) -{ -	GaimIOClosure *closure = g_new0(GaimIOClosure, 1); -	GIOChannel *channel; -	GIOCondition cond = 0; -	 -	closure->function = function; -	closure->data = data; -	 -	if (condition & GAIM_INPUT_READ) -		cond |= GAIM_READ_COND; -	if (condition & GAIM_INPUT_WRITE) -		cond |= GAIM_WRITE_COND; -	 -	channel = g_io_channel_unix_new(source); -	closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond, -					      gaim_io_invoke, closure, gaim_io_destroy); -	 -	event_debug( "b_input_add( %d, %d, 0x%x, 0x%x ) = %d (0x%x)\n", source, condition, function, data, closure->result, closure ); -	 -	g_io_channel_unref(channel); -	return closure->result; -} - -gint b_timeout_add(gint timeout, b_event_handler func, gpointer data) -{ -	gint st = g_timeout_add(timeout, func, data); -	 -	event_debug( "b_timeout_add( %d, %d, %d ) = %d\n", timeout, func, data, st ); -	 -	return st; -} - -void b_event_remove(gint tag) -{ -	event_debug( "b_event_remove( %d )\n", tag ); -	 -	if (tag > 0) -		g_source_remove(tag); -} diff --git a/protocols/events_libevent.c b/protocols/events_libevent.c deleted file mode 100644 index 1119c2ab..00000000 --- a/protocols/events_libevent.c +++ /dev/null @@ -1,247 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2006 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* - * Event handling (using libevent) - */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#define BITLBEE_CORE -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/types.h> -#include "proxy.h" - -#include <sys/time.h> -#include <event.h> - -static guint id_next; -static GHashTable *id_hash; -static int quitting = 0; - -/* Since libevent doesn't handle two event handlers for one fd-condition -   very well (which happens sometimes when BitlBee changes event handlers -   for a combination), let's buid some indexes so we can delete them here -   already, just in time. */ -static GHashTable *read_hash; -static GHashTable *write_hash; - -struct b_event_data -{ -	guint id; -	struct event evinfo; -	gint timeout; -	b_event_handler function; -	void *data; -}; - -void b_main_init() -{ -	event_init(); -	 -	id_next = 1; -	id_hash = g_hash_table_new( g_int_hash, g_int_equal ); -	read_hash = g_hash_table_new( g_int_hash, g_int_equal ); -	write_hash = g_hash_table_new( g_int_hash, g_int_equal ); -} - -void b_main_run() -{ -	event_dispatch(); -} - -void b_main_quit() -{ -	struct timeval tv; -	 -	/* libevent sometimes generates events before really quitting, -	   we want to stop them. */ -	quitting = 1; -	 -	memset( &tv, 0, sizeof( struct timeval ) ); -	event_loopexit( &tv ); -} - -static void b_event_passthrough( int fd, short event, void *data ) -{ -	struct b_event_data *b_ev = data; -	b_input_condition cond = 0; -	int id; -	 -	if( fd >= 0 ) -	{ -		if( event & EV_READ ) -			cond |= GAIM_INPUT_READ; -		if( event & EV_WRITE ) -			cond |= GAIM_INPUT_WRITE; -	} -	 -	event_debug( "b_event_passthrough( %d, %d, 0x%x ) (%d)\n", fd, event, (int) data, b_ev->id ); -	 -	/* Since the called function might cancel this handler already -	   (which free()s b_ev, we have to remember the ID here. */ -	id = b_ev->id; -	 -	if( quitting ) -	{ -		b_event_remove( id ); -		return; -	} -	 -	if( !b_ev->function( b_ev->data, fd, cond ) ) -	{ -		event_debug( "Handler returned FALSE: " ); -		b_event_remove( id ); -	} -	else if( fd == -1 ) -	{ -		struct timeval tv; -		 -		tv.tv_sec = b_ev->timeout / 1000; -		tv.tv_usec = ( b_ev->timeout % 1000 ) * 1000; -		 -		evtimer_add( &b_ev->evinfo, &tv ); -	} -} - -gint b_input_add( gint fd, b_input_condition condition, b_event_handler function, gpointer data ) -{ -	struct b_event_data *b_ev; -	 -	event_debug( "b_input_add( %d, %d, 0x%x, 0x%x ) ", fd, condition, function, data ); -	 -	if( ( condition & GAIM_INPUT_READ  && ( b_ev = g_hash_table_lookup( read_hash,  &fd ) ) ) || -	    ( condition & GAIM_INPUT_WRITE && ( b_ev = g_hash_table_lookup( write_hash, &fd ) ) ) ) -	{ -		/* We'll stick with this libevent entry, but give it a new BitlBee id. */ -		g_hash_table_remove( id_hash, &b_ev->id ); -		 -		event_debug( "(replacing old handler (id = %d)) = %d\n", b_ev->id, id_next ); -		 -		b_ev->id = id_next++; -		b_ev->function = function; -		b_ev->data = data; -	} -	else -	{ -		GIOCondition out_cond; -		 -		event_debug( "(new) = %d\n", id_next ); -		 -		b_ev = g_new0( struct b_event_data, 1 ); -		b_ev->id = id_next++; -		b_ev->function = function; -		b_ev->data = data; -		 -		out_cond = EV_PERSIST; -		if( condition & GAIM_INPUT_READ ) -			out_cond |= EV_READ; -		if( condition & GAIM_INPUT_WRITE ) -			out_cond |= EV_WRITE; -		 -		event_set( &b_ev->evinfo, fd, out_cond, b_event_passthrough, b_ev ); -		event_add( &b_ev->evinfo, NULL ); -		 -		if( out_cond & EV_READ ) -			g_hash_table_insert( read_hash, &b_ev->evinfo.ev_fd, b_ev ); -		if( out_cond & EV_WRITE ) -			g_hash_table_insert( write_hash, &b_ev->evinfo.ev_fd, b_ev ); -	} -	 -	g_hash_table_insert( id_hash, &b_ev->id, b_ev ); -	return b_ev->id; -} - -/* TODO: Persistence for timers! */ -gint b_timeout_add( gint timeout, b_event_handler function, gpointer data ) -{ -	struct b_event_data *b_ev = g_new0( struct b_event_data, 1 ); -	struct timeval tv; -	 -	b_ev->id = id_next++; -	b_ev->timeout = timeout; -	b_ev->function = function; -	b_ev->data = data; -	 -	tv.tv_sec = timeout / 1000; -	tv.tv_usec = ( timeout % 1000 ) * 1000; -	 -	evtimer_set( &b_ev->evinfo, b_event_passthrough, b_ev ); -	evtimer_add( &b_ev->evinfo, &tv ); -	 -	event_debug( "b_timeout_add( %d, 0x%x, 0x%x ) = %d\n", timeout, function, data, b_ev->id ); -	 -	g_hash_table_insert( id_hash, &b_ev->id, b_ev ); -	 -	return b_ev->id; -} - -void b_event_remove( gint id ) -{ -	struct b_event_data *b_ev = g_hash_table_lookup( id_hash, &id ); -	 -	event_debug( "b_event_remove( %d )\n", id ); -	if( b_ev ) -	{ -		g_hash_table_remove( id_hash, &b_ev->id ); -		if( b_ev->evinfo.ev_fd >= 0 ) -		{ -			if( b_ev->evinfo.ev_events & EV_READ ) -				g_hash_table_remove( read_hash, &b_ev->evinfo.ev_fd ); -			if( b_ev->evinfo.ev_events & EV_WRITE ) -				g_hash_table_remove( write_hash, &b_ev->evinfo.ev_fd ); -		} -		 -		event_del( &b_ev->evinfo ); -		g_free( b_ev ); -	} -	else -	{ -		event_debug( "Already removed?\n" ); -	} -} - -void closesocket( int fd ) -{ -	struct b_event_data *b_ev; -	 -	/* Since epoll() (the main reason we use libevent) automatically removes sockets from -	   the epoll() list when a socket gets closed and some modules have a habit of -	   closing sockets before removing event handlers, our and libevent's administration -	   get a little bit messed up. So this little function will remove the handlers -	   properly before closing a socket. */ -	 -	if( ( b_ev = g_hash_table_lookup( read_hash, &fd ) ) ) -	{ -		event_debug( "Warning: fd %d still had a read event handler when shutting down.\n", fd ); -		b_event_remove( b_ev->id ); -	} -	if( ( b_ev = g_hash_table_lookup( write_hash, &fd ) ) ) -	{ -		event_debug( "Warning: fd %d still had a write event handler when shutting down.\n", fd ); -		b_event_remove( b_ev->id ); -	} -	 -	close( fd ); -} diff --git a/protocols/http_client.c b/protocols/http_client.c deleted file mode 100644 index b00fcf98..00000000 --- a/protocols/http_client.c +++ /dev/null @@ -1,453 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2005 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* HTTP(S) module                                                       */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include <string.h> -#include <stdio.h> - -#include "http_client.h" -#include "url.h" -#include "sock.h" - - -static gboolean http_connected( gpointer data, int source, b_input_condition cond ); -static gboolean http_ssl_connected( gpointer data, void *source, b_input_condition cond ); -static gboolean http_incoming_data( gpointer data, int source, b_input_condition cond ); - - -void *http_dorequest( char *host, int port, int ssl, char *request, http_input_function func, gpointer data ) -{ -	struct http_request *req; -	int error = 0; -	 -	req = g_new0( struct http_request, 1 ); -	 -	if( ssl ) -	{ -		req->ssl = ssl_connect( host, port, http_ssl_connected, req ); -		if( req->ssl == NULL ) -			error = 1; -	} -	else -	{ -		req->fd = proxy_connect( host, port, http_connected, req ); -		if( req->fd < 0 ) -			error = 1; -	} -	 -	if( error ) -	{ -		g_free( req ); -		return( NULL ); -	} -	 -	req->func = func; -	req->data = data; -	req->request = g_strdup( request ); -	req->request_length = strlen( request ); -	 -	return( req ); -} - -void *http_dorequest_url( char *url_string, http_input_function func, gpointer data ) -{ -	url_t *url = g_new0( url_t, 1 ); -	char *request; -	void *ret; -	 -	if( !url_set( url, url_string ) ) -	{ -		g_free( url ); -		return NULL; -	} -	 -	if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS ) -	{ -		g_free( url ); -		return NULL; -	} -	 -	request = g_strdup_printf( "GET %s HTTP/1.0\r\n" -	                           "Host: %s\r\n" -	                           "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n" -	                           "\r\n", url->file, url->host ); -	 -	ret = http_dorequest( url->host, url->port, -	                      url->proto == PROTO_HTTPS, request, func, data ); -	 -	g_free( url ); -	g_free( request ); -	return ret; -} - -/* This one is actually pretty simple... Might get more calls if we can't write  -   the whole request at once. */ -static gboolean http_connected( gpointer data, int source, b_input_condition cond ) -{ -	struct http_request *req = data; -	int st; -	 -	if( source < 0 ) -		goto error; -	 -	if( req->inpa > 0 ) -		b_event_remove( req->inpa ); -	 -	sock_make_nonblocking( req->fd ); -	 -	if( req->ssl ) -	{ -		st = ssl_write( req->ssl, req->request + req->bytes_written, -		                req->request_length - req->bytes_written ); -		if( st < 0 ) -		{ -			if( ssl_errno != SSL_AGAIN ) -			{ -				ssl_disconnect( req->ssl ); -				goto error; -			} -		} -	} -	else -	{ -		st = write( source, req->request + req->bytes_written, -		                    req->request_length - req->bytes_written ); -		if( st < 0 ) -		{ -			if( !sockerr_again() ) -			{ -				closesocket( req->fd ); -				goto error; -			} -		} -	} -	 -	if( st > 0 ) -		req->bytes_written += st; -	 -	if( req->bytes_written < req->request_length ) -		req->inpa = b_input_add( source, -		                         req->ssl ? ssl_getdirection( req->ssl ) : GAIM_INPUT_WRITE, -	        	                 http_connected, req ); -	else -		req->inpa = b_input_add( source, GAIM_INPUT_READ, http_incoming_data, req ); -	 -	return FALSE; -	 -error: -	req->status_string = g_strdup( "Error while writing HTTP request" ); -	 -	req->func( req ); -	 -	g_free( req->request ); -	g_free( req ); -	 -	return FALSE; -} - -static gboolean http_ssl_connected( gpointer data, void *source, b_input_condition cond ) -{ -	struct http_request *req = data; -	 -	if( source == NULL ) -		return http_connected( data, -1, cond ); -	 -	req->fd = ssl_getfd( source ); -	 -	return http_connected( data, req->fd, cond ); -} - -static gboolean http_incoming_data( gpointer data, int source, b_input_condition cond ) -{ -	struct http_request *req = data; -	int evil_server = 0; -	char buffer[2048]; -	char *end1, *end2; -	int st; -	 -	if( req->inpa > 0 ) -		b_event_remove( req->inpa ); -	 -	if( req->ssl ) -	{ -		st = ssl_read( req->ssl, buffer, sizeof( buffer ) ); -		if( st < 0 ) -		{ -			if( ssl_errno != SSL_AGAIN ) -			{ -				/* goto cleanup; */ -				 -				/* YAY! We have to deal with crappy Microsoft -				   servers that LOVE to send invalid TLS -				   packets that abort connections! \o/ */ -				 -				goto got_reply; -			} -		} -		else if( st == 0 ) -		{ -			goto got_reply; -		} -	} -	else -	{ -		st = read( req->fd, buffer, sizeof( buffer ) ); -		if( st < 0 ) -		{ -			if( !sockerr_again() ) -			{ -				req->status_string = g_strdup( strerror( errno ) ); -				goto cleanup; -			} -		} -		else if( st == 0 ) -		{ -			goto got_reply; -		} -	} -	 -	if( st > 0 ) -	{ -		req->reply_headers = g_realloc( req->reply_headers, req->bytes_read + st + 1 ); -		memcpy( req->reply_headers + req->bytes_read, buffer, st ); -		req->bytes_read += st; -	} -	 -	/* There will be more! */ -	req->inpa = b_input_add( req->fd, -	                         req->ssl ? ssl_getdirection( req->ssl ) : GAIM_INPUT_READ, -	                         http_incoming_data, req ); -	 -	return FALSE; - -got_reply: -	/* Maybe if the webserver is overloaded, or when there's bad SSL -	   support... */ -	if( req->bytes_read == 0 ) -	{ -		req->status_string = g_strdup( "Empty HTTP reply" ); -		goto cleanup; -	} -	 -	/* Zero termination is very convenient. */ -	req->reply_headers[req->bytes_read] = 0; -	 -	/* Find the separation between headers and body, and keep stupid -	   webservers in mind. */ -	end1 = strstr( req->reply_headers, "\r\n\r\n" ); -	end2 = strstr( req->reply_headers, "\n\n" ); -	 -	if( end2 && end2 < end1 ) -	{ -		end1 = end2 + 1; -		evil_server = 1; -	} -	else if( end1 ) -	{ -		end1 += 2; -	} -	else -	{ -		req->status_string = g_strdup( "Malformed HTTP reply" ); -		goto cleanup; -	} -	 -	*end1 = 0; -	 -	if( evil_server ) -		req->reply_body = end1 + 1; -	else -		req->reply_body = end1 + 2; -	 -	req->body_size = req->reply_headers + req->bytes_read - req->reply_body; -	 -	if( ( end1 = strchr( req->reply_headers, ' ' ) ) != NULL ) -	{ -		if( sscanf( end1 + 1, "%d", &req->status_code ) != 1 ) -		{ -			req->status_string = g_strdup( "Can't parse status code" ); -			req->status_code = -1; -		} -		else -		{ -			char *eol; -			 -			if( evil_server ) -				eol = strchr( end1, '\n' ); -			else -				eol = strchr( end1, '\r' ); -			 -			req->status_string = g_strndup( end1 + 1, eol - end1 - 1 ); -			 -			/* Just to be sure... */ -			if( ( eol = strchr( req->status_string, '\r' ) ) ) -				*eol = 0; -			if( ( eol = strchr( req->status_string, '\n' ) ) ) -				*eol = 0; -		} -	} -	else -	{ -		req->status_string = g_strdup( "Can't locate status code" ); -		req->status_code = -1; -	} -	 -	if( req->status_code == 301 || req->status_code == 302 ) -	{ -		char *loc, *new_request, *new_host; -		int error = 0, new_port, new_proto; -		 -		/* We might fill it again, so let's not leak any memory. */ -		g_free( req->status_string ); -		req->status_string = NULL; -		 -		loc = strstr( req->reply_headers, "\nLocation: " ); -		if( loc == NULL ) /* We can't handle this redirect... */ -		{ -			req->status_string = g_strdup( "Can't locate Location: header" ); -			goto cleanup; -		} -		 -		loc += 11; -		while( *loc == ' ' ) -			loc ++; -		 -		/* TODO/FIXME: Possibly have to handle relative redirections, -		   and rewrite Host: headers. Not necessary for now, it's -		   enough for passport authentication like this. */ -		 -		if( *loc == '/' ) -		{ -			/* Just a different pathname... */ -			 -			/* Since we don't cache the servername, and since we -			   don't need this yet anyway, I won't implement it. */ -			 -			req->status_string = g_strdup( "Can't handle recursive redirects" ); -			 -			goto cleanup; -		} -		else -		{ -			/* A whole URL */ -			url_t *url; -			char *s; -			 -			s = strstr( loc, "\r\n" ); -			if( s == NULL ) -				goto cleanup; -			 -			url = g_new0( url_t, 1 ); -			*s = 0; -			 -			if( !url_set( url, loc ) ) -			{ -				req->status_string = g_strdup( "Malformed redirect URL" ); -				g_free( url ); -				goto cleanup; -			} -			 -			/* Okay, this isn't fun! We have to rebuild the request... :-( */ -			new_request = g_malloc( req->request_length + strlen( url->file ) ); -			 -			/* So, now I just allocated enough memory, so I'm -			   going to use strcat(), whether you like it or not. :-) */ -			 -			sprintf( new_request, "GET %s HTTP/1.0", url->file ); -			 -			s = strstr( req->request, "\r\n" ); -			if( s == NULL ) -			{ -				req->status_string = g_strdup( "Error while rebuilding request string" ); -				g_free( new_request ); -				g_free( url ); -				goto cleanup; -			} -			 -			strcat( new_request, s ); -			new_host = g_strdup( url->host ); -			new_port = url->port; -			new_proto = url->proto; -			 -			g_free( url ); -		} -		 -		if( req->ssl ) -			ssl_disconnect( req->ssl ); -		else -			closesocket( req->fd ); -		 -		req->fd = -1; -		req->ssl = NULL; -		 -		if( new_proto == PROTO_HTTPS ) -		{ -			req->ssl = ssl_connect( new_host, new_port, http_ssl_connected, req ); -			if( req->ssl == NULL ) -				error = 1; -		} -		else -		{ -			req->fd = proxy_connect( new_host, new_port, http_connected, req ); -			if( req->fd < 0 ) -				error = 1; -		} -		g_free( new_host ); -		 -		if( error ) -		{ -			req->status_string = g_strdup( "Connection problem during redirect" ); -			g_free( new_request ); -			goto cleanup; -		} -		 -		g_free( req->request ); -		g_free( req->reply_headers ); -		req->request = new_request; -		req->request_length = strlen( new_request ); -		req->bytes_read = req->bytes_written = req->inpa = 0; -		req->reply_headers = req->reply_body = NULL; -		 -		return FALSE; -	} -	 -	/* Assume that a closed connection means we're finished, this indeed -	   breaks with keep-alive connections and faulty connections. */ -	req->finished = 1; - -cleanup: -	if( req->ssl ) -		ssl_disconnect( req->ssl ); -	else -		closesocket( req->fd ); -	 -	req->func( req ); -	 -	g_free( req->request ); -	g_free( req->reply_headers ); -	g_free( req->status_string ); -	g_free( req ); -	 -	return FALSE; -} diff --git a/protocols/http_client.h b/protocols/http_client.h deleted file mode 100644 index 50ee80cf..00000000 --- a/protocols/http_client.h +++ /dev/null @@ -1,57 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2005 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* HTTP(S) module                                                       */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include <glib.h> - -#include "ssl_client.h" - -struct http_request; - -typedef void (*http_input_function)( struct http_request * ); - -struct http_request -{ -	char *request; -	int request_length; -	int status_code; -	char *status_string; -	char *reply_headers; -	char *reply_body; -	int body_size; -	int finished; -	 -	void *ssl; -	int fd; -	 -	int inpa; -	int bytes_written; -	int bytes_read; -	 -	http_input_function func; -	gpointer data; -}; - -void *http_dorequest( char *host, int port, int ssl, char *request, http_input_function func, gpointer data ); -void *http_dorequest_url( char *url_string, http_input_function func, gpointer data ); diff --git a/protocols/md5.c b/protocols/md5.c deleted file mode 100644 index e6273585..00000000 --- a/protocols/md5.c +++ /dev/null @@ -1,392 +0,0 @@ -/* -  Copyright (C) 1999 Aladdin Enterprises.  All rights reserved. - -  This software is provided 'as-is', without any express or implied -  warranty.  In no event will the authors be held liable for any damages -  arising from the use of this software. - -  Permission is granted to anyone to use this software for any purpose, -  including commercial applications, and to alter it and redistribute it -  freely, subject to the following restrictions: - -  1. The origin of this software must not be misrepresented; you must not -     claim that you wrote the original software. If you use this software -     in a product, an acknowledgment in the product documentation would be -     appreciated but is not required. -  2. Altered source versions must be plainly marked as such, and must not be -     misrepresented as being the original software. -  3. This notice may not be removed or altered from any source distribution. - -  L. Peter Deutsch -  ghost@aladdin.com - - */ -/* -  Independent implementation of MD5 (RFC 1321). - -  This code implements the MD5 Algorithm defined in RFC 1321. -  It is derived directly from the text of the RFC and not from the -  reference implementation. - -  The original and principal author of md5.c is L. Peter Deutsch -  <ghost@aladdin.com>.  Other authors are noted in the change history -  that follows (in reverse chronological order): - -  1999-11-04 lpd Edited comments slightly for automatic TOC extraction. -  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). -  1999-05-03 lpd Original version. - */ - -#include "md5.h" -#include <string.h> - -#ifdef TEST -/* - * Compile with -DTEST to create a self-contained executable test program. - * The test program should print out the same values as given in section - * A.5 of RFC 1321, reproduced below. - */ -#include <string.h> -main() -{ -    static const char *const test[7] = { -	"", /*d41d8cd98f00b204e9800998ecf8427e*/ -	"945399884.61923487334tuvga", /*0cc175b9c0f1b6a831c399e269772661*/ -	"abc", /*900150983cd24fb0d6963f7d28e17f72*/ -	"message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/ -	"abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/ -	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", -				/*d174ab98d277d9f5a5611c2c9f419d9f*/ -	"12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/ -    }; -    int i; - -    for (i = 0; i < 7; ++i) { -	md5_state_t state; -	md5_byte_t digest[16]; -	int di; - -	md5_init(&state); -	md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i])); -	md5_finish(&state, digest); -	printf("MD5 (\"%s\") = ", test[i]); -	for (di = 0; di < 16; ++di) -	    printf("%02x", digest[di]); -	printf("\n"); -    } -    return 0; -} -#endif /* TEST */ - - -/* - * For reference, here is the program that computed the T values. - */ -#if 0 -#include <math.h> -main() -{ -    int i; -    for (i = 1; i <= 64; ++i) { -	unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i))); -	printf("#define T%d 0x%08lx\n", i, v); -    } -    return 0; -} -#endif -/* - * End of T computation program. - */ -#define T1 0xd76aa478 -#define T2 0xe8c7b756 -#define T3 0x242070db -#define T4 0xc1bdceee -#define T5 0xf57c0faf -#define T6 0x4787c62a -#define T7 0xa8304613 -#define T8 0xfd469501 -#define T9 0x698098d8 -#define T10 0x8b44f7af -#define T11 0xffff5bb1 -#define T12 0x895cd7be -#define T13 0x6b901122 -#define T14 0xfd987193 -#define T15 0xa679438e -#define T16 0x49b40821 -#define T17 0xf61e2562 -#define T18 0xc040b340 -#define T19 0x265e5a51 -#define T20 0xe9b6c7aa -#define T21 0xd62f105d -#define T22 0x02441453 -#define T23 0xd8a1e681 -#define T24 0xe7d3fbc8 -#define T25 0x21e1cde6 -#define T26 0xc33707d6 -#define T27 0xf4d50d87 -#define T28 0x455a14ed -#define T29 0xa9e3e905 -#define T30 0xfcefa3f8 -#define T31 0x676f02d9 -#define T32 0x8d2a4c8a -#define T33 0xfffa3942 -#define T34 0x8771f681 -#define T35 0x6d9d6122 -#define T36 0xfde5380c -#define T37 0xa4beea44 -#define T38 0x4bdecfa9 -#define T39 0xf6bb4b60 -#define T40 0xbebfbc70 -#define T41 0x289b7ec6 -#define T42 0xeaa127fa -#define T43 0xd4ef3085 -#define T44 0x04881d05 -#define T45 0xd9d4d039 -#define T46 0xe6db99e5 -#define T47 0x1fa27cf8 -#define T48 0xc4ac5665 -#define T49 0xf4292244 -#define T50 0x432aff97 -#define T51 0xab9423a7 -#define T52 0xfc93a039 -#define T53 0x655b59c3 -#define T54 0x8f0ccc92 -#define T55 0xffeff47d -#define T56 0x85845dd1 -#define T57 0x6fa87e4f -#define T58 0xfe2ce6e0 -#define T59 0xa3014314 -#define T60 0x4e0811a1 -#define T61 0xf7537e82 -#define T62 0xbd3af235 -#define T63 0x2ad7d2bb -#define T64 0xeb86d391 - -static void -md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) -{ -    md5_word_t -	a = pms->abcd[0], b = pms->abcd[1], -	c = pms->abcd[2], d = pms->abcd[3]; -    md5_word_t t; - -#ifndef ARCH_IS_BIG_ENDIAN -# define ARCH_IS_BIG_ENDIAN 1	/* slower, default implementation */ -#endif -#if ARCH_IS_BIG_ENDIAN - -    /* -     * On big-endian machines, we must arrange the bytes in the right -     * order.  (This also works on machines of unknown byte order.) -     */ -    md5_word_t X[16]; -    const md5_byte_t *xp = data; -    int i; - -    for (i = 0; i < 16; ++i, xp += 4) -	X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); - -#else  /* !ARCH_IS_BIG_ENDIAN */ - -    /* -     * On little-endian machines, we can process properly aligned data -     * without copying it. -     */ -    md5_word_t xbuf[16]; -    const md5_word_t *X; - -    if (!((data - (const md5_byte_t *)0) & 3)) { -	/* data are properly aligned */ -	X = (const md5_word_t *)data; -    } else { -	/* not aligned */ -	memcpy(xbuf, data, 64); -	X = xbuf; -    } -#endif - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - -    /* Round 1. */ -    /* Let [abcd k s i] denote the operation -       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ -#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) -#define SET(a, b, c, d, k, s, Ti)\ -  t = a + F(b,c,d) + X[k] + Ti;\ -  a = ROTATE_LEFT(t, s) + b -    /* Do the following 16 operations. */ -    SET(a, b, c, d,  0,  7,  T1); -    SET(d, a, b, c,  1, 12,  T2); -    SET(c, d, a, b,  2, 17,  T3); -    SET(b, c, d, a,  3, 22,  T4); -    SET(a, b, c, d,  4,  7,  T5); -    SET(d, a, b, c,  5, 12,  T6); -    SET(c, d, a, b,  6, 17,  T7); -    SET(b, c, d, a,  7, 22,  T8); -    SET(a, b, c, d,  8,  7,  T9); -    SET(d, a, b, c,  9, 12, T10); -    SET(c, d, a, b, 10, 17, T11); -    SET(b, c, d, a, 11, 22, T12); -    SET(a, b, c, d, 12,  7, T13); -    SET(d, a, b, c, 13, 12, T14); -    SET(c, d, a, b, 14, 17, T15); -    SET(b, c, d, a, 15, 22, T16); -#undef SET - -     /* Round 2. */ -     /* Let [abcd k s i] denote the operation -          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ -#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ -  t = a + G(b,c,d) + X[k] + Ti;\ -  a = ROTATE_LEFT(t, s) + b -     /* Do the following 16 operations. */ -    SET(a, b, c, d,  1,  5, T17); -    SET(d, a, b, c,  6,  9, T18); -    SET(c, d, a, b, 11, 14, T19); -    SET(b, c, d, a,  0, 20, T20); -    SET(a, b, c, d,  5,  5, T21); -    SET(d, a, b, c, 10,  9, T22); -    SET(c, d, a, b, 15, 14, T23); -    SET(b, c, d, a,  4, 20, T24); -    SET(a, b, c, d,  9,  5, T25); -    SET(d, a, b, c, 14,  9, T26); -    SET(c, d, a, b,  3, 14, T27); -    SET(b, c, d, a,  8, 20, T28); -    SET(a, b, c, d, 13,  5, T29); -    SET(d, a, b, c,  2,  9, T30); -    SET(c, d, a, b,  7, 14, T31); -    SET(b, c, d, a, 12, 20, T32); -#undef SET - -     /* Round 3. */ -     /* Let [abcd k s t] denote the operation -          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define SET(a, b, c, d, k, s, Ti)\ -  t = a + H(b,c,d) + X[k] + Ti;\ -  a = ROTATE_LEFT(t, s) + b -     /* Do the following 16 operations. */ -    SET(a, b, c, d,  5,  4, T33); -    SET(d, a, b, c,  8, 11, T34); -    SET(c, d, a, b, 11, 16, T35); -    SET(b, c, d, a, 14, 23, T36); -    SET(a, b, c, d,  1,  4, T37); -    SET(d, a, b, c,  4, 11, T38); -    SET(c, d, a, b,  7, 16, T39); -    SET(b, c, d, a, 10, 23, T40); -    SET(a, b, c, d, 13,  4, T41); -    SET(d, a, b, c,  0, 11, T42); -    SET(c, d, a, b,  3, 16, T43); -    SET(b, c, d, a,  6, 23, T44); -    SET(a, b, c, d,  9,  4, T45); -    SET(d, a, b, c, 12, 11, T46); -    SET(c, d, a, b, 15, 16, T47); -    SET(b, c, d, a,  2, 23, T48); -#undef SET - -     /* Round 4. */ -     /* Let [abcd k s t] denote the operation -          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ -#define I(x, y, z) ((y) ^ ((x) | ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ -  t = a + I(b,c,d) + X[k] + Ti;\ -  a = ROTATE_LEFT(t, s) + b -     /* Do the following 16 operations. */ -    SET(a, b, c, d,  0,  6, T49); -    SET(d, a, b, c,  7, 10, T50); -    SET(c, d, a, b, 14, 15, T51); -    SET(b, c, d, a,  5, 21, T52); -    SET(a, b, c, d, 12,  6, T53); -    SET(d, a, b, c,  3, 10, T54); -    SET(c, d, a, b, 10, 15, T55); -    SET(b, c, d, a,  1, 21, T56); -    SET(a, b, c, d,  8,  6, T57); -    SET(d, a, b, c, 15, 10, T58); -    SET(c, d, a, b,  6, 15, T59); -    SET(b, c, d, a, 13, 21, T60); -    SET(a, b, c, d,  4,  6, T61); -    SET(d, a, b, c, 11, 10, T62); -    SET(c, d, a, b,  2, 15, T63); -    SET(b, c, d, a,  9, 21, T64); -#undef SET - -     /* Then perform the following additions. (That is increment each -        of the four registers by the value it had before this block -        was started.) */ -    pms->abcd[0] += a; -    pms->abcd[1] += b; -    pms->abcd[2] += c; -    pms->abcd[3] += d; -} - -void -md5_init(md5_state_t *pms) -{ -    pms->count[0] = pms->count[1] = 0; -    pms->abcd[0] = 0x67452301; -    pms->abcd[1] = 0xefcdab89; -    pms->abcd[2] = 0x98badcfe; -    pms->abcd[3] = 0x10325476; -} - -void -md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) -{ -    const md5_byte_t *p = data; -    int left = nbytes; -    int offset = (pms->count[0] >> 3) & 63; -    md5_word_t nbits = (md5_word_t)(nbytes << 3); - -    if (nbytes <= 0) -	return; - -    /* Update the message length. */ -    pms->count[1] += nbytes >> 29; -    pms->count[0] += nbits; -    if (pms->count[0] < nbits) -	pms->count[1]++; - -    /* Process an initial partial block. */ -    if (offset) { -	int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); - -	memcpy(pms->buf + offset, p, copy); -	if (offset + copy < 64) -	    return; -	p += copy; -	left -= copy; -	md5_process(pms, pms->buf); -    } - -    /* Process full blocks. */ -    for (; left >= 64; p += 64, left -= 64) -	md5_process(pms, p); - -    /* Process a final partial block. */ -    if (left) -	memcpy(pms->buf, p, left); -} - -void -md5_finish(md5_state_t *pms, md5_byte_t digest[16]) -{ -    static const md5_byte_t pad[64] = { -	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -    }; -    md5_byte_t data[8]; -    int i; - -    /* Save the length before padding. */ -    for (i = 0; i < 8; ++i) -	data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); -    /* Pad to 56 bytes mod 64. */ -    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); -    /* Append the length. */ -    md5_append(pms, data, 8); -    for (i = 0; i < 16; ++i) -	digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); -} diff --git a/protocols/md5.h b/protocols/md5.h deleted file mode 100644 index f24f2ff1..00000000 --- a/protocols/md5.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -  Copyright (C) 1999 Aladdin Enterprises.  All rights reserved. -   -  This software is provided 'as-is', without any express or implied -  warranty.  In no event will the authors be held liable for any damages -  arising from the use of this software. - -  Permission is granted to anyone to use this software for any purpose, -  including commercial applications, and to alter it and redistribute it -  freely, subject to the following restrictions: - -  1. The origin of this software must not be misrepresented; you must not -     claim that you wrote the original software. If you use this software -     in a product, an acknowledgment in the product documentation would be -     appreciated but is not required. -  2. Altered source versions must be plainly marked as such, and must not be -     misrepresented as being the original software. -  3. This notice may not be removed or altered from any source distribution. - -  L. Peter Deutsch -  ghost@aladdin.com - - */ -/* -  Independent implementation of MD5 (RFC 1321). - -  This code implements the MD5 Algorithm defined in RFC 1321. -  It is derived directly from the text of the RFC and not from the -  reference implementation. - -  The original and principal author of md5.h is L. Peter Deutsch -  <ghost@aladdin.com>.  Other authors are noted in the change history -  that follows (in reverse chronological order): - -  2004-03-09 Jelmer Vernooij add G_MODULE_EXPORT for Bitlbee -  1999-11-04 lpd Edited comments slightly for automatic TOC extraction. -  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); -	added conditionalization for C++ compilation from Martin -	Purschke <purschke@bnl.gov>. -  1999-05-03 lpd Original version. - */ - -#ifndef md5_INCLUDED -#  define md5_INCLUDED - -#include <glib.h> -#include <gmodule.h> - -/* - * This code has some adaptations for the Ghostscript environment, but it - * will compile and run correctly in any environment with 8-bit chars and - * 32-bit ints.  Specifically, it assumes that if the following are - * defined, they have the same meaning as in Ghostscript: P1, P2, P3, - * ARCH_IS_BIG_ENDIAN. - */ - -typedef unsigned char md5_byte_t; /* 8-bit byte */ -typedef unsigned int md5_word_t; /* 32-bit word */ - -/* Define the state of the MD5 Algorithm. */ -typedef struct md5_state_s { -    md5_word_t count[2];	/* message length in bits, lsw first */ -    md5_word_t abcd[4];		/* digest buffer */ -    md5_byte_t buf[64];		/* accumulate block */ -} md5_state_t; - -#ifdef __cplusplus -extern "C"  -{ -#endif - -/* Initialize the algorithm. */ -G_MODULE_EXPORT void md5_init(md5_state_t *pms); - -/* Append a string to the message. */ -G_MODULE_EXPORT void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); - -/* Finish the message and return the digest. */ -G_MODULE_EXPORT void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); - -#ifdef __cplusplus -}  /* end extern "C" */ -#endif - -#endif /* md5_INCLUDED */ diff --git a/protocols/proxy.c b/protocols/proxy.c deleted file mode 100644 index b8aa304d..00000000 --- a/protocols/proxy.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * gaim - * - * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> - * Copyright (C) 2002-2004, Wilmer van der Gaast, Jelmer Vernooij - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - * - */ - -#define BITLBEE_CORE -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#ifndef _WIN32 -#include <sys/socket.h> -#include <netdb.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#else -#include "sock.h" -#define ETIMEDOUT WSAETIMEDOUT -#define EINPROGRESS WSAEINPROGRESS -#endif -#include <fcntl.h> -#include <errno.h> -#include "nogaim.h" -#include "proxy.h" - -char proxyhost[128] = ""; -int proxyport = 0; -int proxytype = PROXY_NONE; -char proxyuser[128] = ""; -char proxypass[128] = ""; - -struct PHB { -	b_event_handler func, proxy_func; -	gpointer data, proxy_data; -	char *host; -	int port; -	int fd; -	gint inpa; -}; - - - -static struct sockaddr_in *gaim_gethostbyname(const char *host, int port) -{ -	static struct sockaddr_in sin; - -	if (!inet_aton(host, &sin.sin_addr)) { -		struct hostent *hp; -		if (!(hp = gethostbyname(host))) { -			return NULL; -		} -		memset(&sin, 0, sizeof(struct sockaddr_in)); -		memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); -		sin.sin_family = hp->h_addrtype; -	} else -		sin.sin_family = AF_INET; -	sin.sin_port = htons(port); - -	return &sin; -} - -static gboolean gaim_io_connected(gpointer data, gint source, b_input_condition cond) -{ -	struct PHB *phb = data; -	unsigned int len; -	int error = ETIMEDOUT; -	len = sizeof(error); -	 -#ifndef _WIN32 -	if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { -		closesocket(source); -		b_event_remove(phb->inpa); -		if( phb->proxy_func ) -			phb->proxy_func(phb->proxy_data, -1, GAIM_INPUT_READ); -		else { -			phb->func(phb->data, -1, GAIM_INPUT_READ); -			g_free(phb); -		} -		return FALSE; -	} -#endif -	sock_make_blocking(source); -	b_event_remove(phb->inpa); -	if( phb->proxy_func ) -		phb->proxy_func(phb->proxy_data, source, GAIM_INPUT_READ); -	else { -		phb->func(phb->data, source, GAIM_INPUT_READ); -		g_free(phb); -	} -	 -	return FALSE; -} - -static int proxy_connect_none(const char *host, unsigned short port, struct PHB *phb) -{ -	struct sockaddr_in *sin; -	int fd = -1; - -	if (!(sin = gaim_gethostbyname(host, port))) { -		g_free(phb); -		return -1; -	} - -	if ((fd = socket(sin->sin_family, SOCK_STREAM, 0)) < 0) { -		g_free(phb); -		return -1; -	} - -	sock_make_nonblocking(fd); -	 -	event_debug("proxy_connect_none( \"%s\", %d ) = %d\n", host, port, fd); -	 -	if (connect(fd, (struct sockaddr *)sin, sizeof(*sin)) < 0) { -		if (sockerr_again()) { -			phb->inpa = b_input_add(fd, GAIM_INPUT_WRITE, gaim_io_connected, phb); -			phb->fd = fd; -		} else { -			closesocket(fd); -			g_free(phb); -			return -1; -		} -	} - -	return fd; -} - - -/* Connecting to HTTP proxies */ - -#define HTTP_GOODSTRING "HTTP/1.0 200 Connection established" -#define HTTP_GOODSTRING2 "HTTP/1.1 200 Connection established" - -static gboolean http_canread(gpointer data, gint source, b_input_condition cond) -{ -	int nlc = 0; -	int pos = 0; -	struct PHB *phb = data; -	char inputline[8192]; - -	b_event_remove(phb->inpa); - -	while ((pos < sizeof(inputline)-1) && (nlc != 2) && (read(source, &inputline[pos++], 1) == 1)) { -		if (inputline[pos - 1] == '\n') -			nlc++; -		else if (inputline[pos - 1] != '\r') -			nlc = 0; -	} -	inputline[pos] = '\0'; - -	if ((memcmp(HTTP_GOODSTRING, inputline, strlen(HTTP_GOODSTRING)) == 0) || -	    (memcmp(HTTP_GOODSTRING2, inputline, strlen(HTTP_GOODSTRING2)) == 0)) { -		phb->func(phb->data, source, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	close(source); -	phb->func(phb->data, -1, GAIM_INPUT_READ); -	g_free(phb->host); -	g_free(phb); -	 -	return FALSE; -} - -static gboolean http_canwrite(gpointer data, gint source, b_input_condition cond) -{ -	char cmd[384]; -	struct PHB *phb = data; -	unsigned int len; -	int error = ETIMEDOUT; -	if (phb->inpa > 0) -		b_event_remove(phb->inpa); -	len = sizeof(error); -	if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} -	sock_make_blocking(source); - -	g_snprintf(cmd, sizeof(cmd), "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", phb->host, phb->port, -		   phb->host, phb->port); -	if (send(source, cmd, strlen(cmd), 0) < 0) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	if (proxyuser && *proxyuser) { -		char *t1, *t2; -		t1 = g_strdup_printf("%s:%s", proxyuser, proxypass); -		t2 = tobase64(t1); -		g_free(t1); -		g_snprintf(cmd, sizeof(cmd), "Proxy-Authorization: Basic %s\r\n", t2); -		g_free(t2); -		if (send(source, cmd, strlen(cmd), 0) < 0) { -			close(source); -			phb->func(phb->data, -1, GAIM_INPUT_READ); -			g_free(phb->host); -			g_free(phb); -			return FALSE; -		} -	} - -	g_snprintf(cmd, sizeof(cmd), "\r\n"); -	if (send(source, cmd, strlen(cmd), 0) < 0) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	phb->inpa = b_input_add(source, GAIM_INPUT_READ, http_canread, phb); -	 -	return FALSE; -} - -static int proxy_connect_http(const char *host, unsigned short port, struct PHB *phb) -{ -	phb->host = g_strdup(host); -	phb->port = port; -	phb->proxy_func = http_canwrite; -	phb->proxy_data = phb; -	 -	return( proxy_connect_none( proxyhost, proxyport, phb ) ); -} - - -/* Connecting to SOCKS4 proxies */ - -static gboolean s4_canread(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char packet[12]; -	struct PHB *phb = data; - -	b_event_remove(phb->inpa); - -	memset(packet, 0, sizeof(packet)); -	if (read(source, packet, 9) >= 4 && packet[1] == 90) { -		phb->func(phb->data, source, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	close(source); -	phb->func(phb->data, -1, GAIM_INPUT_READ); -	g_free(phb->host); -	g_free(phb); -	 -	return FALSE; -} - -static gboolean s4_canwrite(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char packet[12]; -	struct hostent *hp; -	struct PHB *phb = data; -	unsigned int len; -	int error = ETIMEDOUT; -	if (phb->inpa > 0) -		b_event_remove(phb->inpa); -	len = sizeof(error); -	if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} -	sock_make_blocking(source); - -	/* XXX does socks4 not support host name lookups by the proxy? */ -	if (!(hp = gethostbyname(phb->host))) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	packet[0] = 4; -	packet[1] = 1; -	packet[2] = phb->port >> 8; -	packet[3] = phb->port & 0xff; -	packet[4] = (unsigned char)(hp->h_addr_list[0])[0]; -	packet[5] = (unsigned char)(hp->h_addr_list[0])[1]; -	packet[6] = (unsigned char)(hp->h_addr_list[0])[2]; -	packet[7] = (unsigned char)(hp->h_addr_list[0])[3]; -	packet[8] = 0; -	if (write(source, packet, 9) != 9) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	phb->inpa = b_input_add(source, GAIM_INPUT_READ, s4_canread, phb); -	 -	return FALSE; -} - -static int proxy_connect_socks4(const char *host, unsigned short port, struct PHB *phb) -{ -	phb->host = g_strdup(host); -	phb->port = port; -	phb->proxy_func = s4_canwrite; -	phb->proxy_data = phb; -	 -	return( proxy_connect_none( proxyhost, proxyport, phb ) ); -} - - -/* Connecting to SOCKS5 proxies */ - -static gboolean s5_canread_again(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char buf[512]; -	struct PHB *phb = data; - -	b_event_remove(phb->inpa); - -	if (read(source, buf, 10) < 10) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} -	if ((buf[0] != 0x05) || (buf[1] != 0x00)) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	phb->func(phb->data, source, GAIM_INPUT_READ); -	g_free(phb->host); -	g_free(phb); -	 -	return FALSE; -} - -static void s5_sendconnect(gpointer data, gint source) -{ -	unsigned char buf[512]; -	struct PHB *phb = data; -	int hlen = strlen(phb->host); -	 -	buf[0] = 0x05; -	buf[1] = 0x01;		/* CONNECT */ -	buf[2] = 0x00;		/* reserved */ -	buf[3] = 0x03;		/* address type -- host name */ -	buf[4] = hlen; -	memcpy(buf + 5, phb->host, hlen); -	buf[5 + strlen(phb->host)] = phb->port >> 8; -	buf[5 + strlen(phb->host) + 1] = phb->port & 0xff; - -	if (write(source, buf, (5 + strlen(phb->host) + 2)) < (5 + strlen(phb->host) + 2)) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return; -	} - -	phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_canread_again, phb); -} - -static gboolean s5_readauth(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char buf[512]; -	struct PHB *phb = data; - -	b_event_remove(phb->inpa); - -	if (read(source, buf, 2) < 2) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	if ((buf[0] != 0x01) || (buf[1] != 0x00)) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	s5_sendconnect(phb, source); -	 -	return FALSE; -} - -static gboolean s5_canread(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char buf[512]; -	struct PHB *phb = data; - -	b_event_remove(phb->inpa); - -	if (read(source, buf, 2) < 2) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	if ((buf[0] != 0x05) || (buf[1] == 0xff)) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	if (buf[1] == 0x02) { -		unsigned int i = strlen(proxyuser), j = strlen(proxypass); -		buf[0] = 0x01;	/* version 1 */ -		buf[1] = i; -		memcpy(buf + 2, proxyuser, i); -		buf[2 + i] = j; -		memcpy(buf + 2 + i + 1, proxypass, j); -		if (write(source, buf, 3 + i + j) < 3 + i + j) { -			close(source); -			phb->func(phb->data, -1, GAIM_INPUT_READ); -			g_free(phb->host); -			g_free(phb); -			return FALSE; -		} - -		phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_readauth, phb); -	} else { -		s5_sendconnect(phb, source); -	} -	 -	return FALSE; -} - -static gboolean s5_canwrite(gpointer data, gint source, b_input_condition cond) -{ -	unsigned char buf[512]; -	int i; -	struct PHB *phb = data; -	unsigned int len; -	int error = ETIMEDOUT; -	if (phb->inpa > 0) -		b_event_remove(phb->inpa); -	len = sizeof(error); -	if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} -	sock_make_blocking(source); - -	i = 0; -	buf[0] = 0x05;		/* SOCKS version 5 */ -	if (proxyuser[0]) { -		buf[1] = 0x02;	/* two methods */ -		buf[2] = 0x00;	/* no authentication */ -		buf[3] = 0x02;	/* username/password authentication */ -		i = 4; -	} else { -		buf[1] = 0x01; -		buf[2] = 0x00; -		i = 3; -	} - -	if (write(source, buf, i) < i) { -		close(source); -		phb->func(phb->data, -1, GAIM_INPUT_READ); -		g_free(phb->host); -		g_free(phb); -		return FALSE; -	} - -	phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_canread, phb); -	 -	return FALSE; -} - -static int proxy_connect_socks5(const char *host, unsigned short port, struct PHB *phb) -{ -	phb->host = g_strdup(host); -	phb->port = port; -	phb->proxy_func = s5_canwrite; -	phb->proxy_data = phb; -	 -	return( proxy_connect_none( proxyhost, proxyport, phb ) ); -} - - -/* Export functions */ - -int proxy_connect(const char *host, int port, b_event_handler func, gpointer data) -{ -	struct PHB *phb; -	 -	if (!host || !port || (port == -1) || !func || strlen(host) > 128) { -		return -1; -	} -	 -	phb = g_new0(struct PHB, 1); -	phb->func = func; -	phb->data = data; -	 -#ifndef _WIN32 -	sethostent(1); -#endif -	 -	if ((proxytype == PROXY_NONE) || !proxyhost || !proxyhost[0] || !proxyport || (proxyport == -1)) -		return proxy_connect_none(host, port, phb); -	else if (proxytype == PROXY_HTTP) -		return proxy_connect_http(host, port, phb); -	else if (proxytype == PROXY_SOCKS4) -		return proxy_connect_socks4(host, port, phb); -	else if (proxytype == PROXY_SOCKS5) -		return proxy_connect_socks5(host, port, phb); -	 -	if (phb->host) g_free(phb); -	g_free(phb); -	return -1; -} diff --git a/protocols/proxy.h b/protocols/proxy.h deleted file mode 100644 index 680790a5..00000000 --- a/protocols/proxy.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * nogaim - * - * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - * - */ - -/* this is the export part of the proxy.c file. it does a little -   prototype-ing stuff and redefine some net function to mask them -   with some kind of transparent layer */  - -#ifndef _PROXY_H_ -#define _PROXY_H_ - -#include <sys/types.h> -#ifndef _WIN32 -#include <sys/socket.h> -#include <netdb.h> -#include <netinet/in.h> -#endif -#include <glib.h> -#include <gmodule.h> - -#include "events.h" - -#define PROXY_NONE 0 -#define PROXY_HTTP 1 -#define PROXY_SOCKS4 2 -#define PROXY_SOCKS5 3 - -extern char proxyhost[128]; -extern int  proxyport; -extern int  proxytype; -extern char proxyuser[128]; -extern char proxypass[128]; - -G_MODULE_EXPORT int proxy_connect(const char *host, int port, b_event_handler func, gpointer data); - -#endif /* _PROXY_H_ */ diff --git a/protocols/sha.c b/protocols/sha.c deleted file mode 100644 index 895505a1..00000000 --- a/protocols/sha.c +++ /dev/null @@ -1,173 +0,0 @@ -/*  - * The contents of this file are subject to the Mozilla Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - *  - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - *  - * The Original Code is SHA 180-1 Reference Implementation (Compact version) - *  - * The Initial Developer of the Original Code is Paul Kocher of - * Cryptography Research.  Portions created by Paul Kocher are  - * Copyright (C) 1995-9 by Cryptography Research, Inc.  All - * Rights Reserved. - *  - * Contributor(s): - * - */ - -#define BITLBEE_CORE -#include "nogaim.h" - -static void shaHashBlock(SHA_CTX *ctx); - -void shaInit(SHA_CTX *ctx) { -  int i; - -  ctx->lenW = 0; -  ctx->sizeHi = ctx->sizeLo = 0; - -  /* Initialize H with the magic constants (see FIPS180 for constants) -   */ -  ctx->H[0] = 0x67452301L; -  ctx->H[1] = 0xefcdab89L; -  ctx->H[2] = 0x98badcfeL; -  ctx->H[3] = 0x10325476L; -  ctx->H[4] = 0xc3d2e1f0L; - -  for (i = 0; i < 80; i++) -    ctx->W[i] = 0; -} - - -void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len) { -  int i; - -  /* Read the data into W and process blocks as they get full -   */ -  for (i = 0; i < len; i++) { -    ctx->W[ctx->lenW / 4] <<= 8; -    ctx->W[ctx->lenW / 4] |= (guint32)dataIn[i]; -    if ((++ctx->lenW) % 64 == 0) { -      shaHashBlock(ctx); -      ctx->lenW = 0; -    } -    ctx->sizeLo += 8; -    ctx->sizeHi += (ctx->sizeLo < 8); -  } -} - - -void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]) { -  unsigned char pad0x80 = 0x80; -  unsigned char pad0x00 = 0x00; -  unsigned char padlen[8]; -  int i; - -  /* Pad with a binary 1 (e.g. 0x80), then zeroes, then length -   */ -  padlen[0] = (unsigned char)((ctx->sizeHi >> 24) & 255); -  padlen[1] = (unsigned char)((ctx->sizeHi >> 16) & 255); -  padlen[2] = (unsigned char)((ctx->sizeHi >> 8) & 255); -  padlen[3] = (unsigned char)((ctx->sizeHi >> 0) & 255); -  padlen[4] = (unsigned char)((ctx->sizeLo >> 24) & 255); -  padlen[5] = (unsigned char)((ctx->sizeLo >> 16) & 255); -  padlen[6] = (unsigned char)((ctx->sizeLo >> 8) & 255); -  padlen[7] = (unsigned char)((ctx->sizeLo >> 0) & 255); -  shaUpdate(ctx, &pad0x80, 1); -  while (ctx->lenW != 56) -    shaUpdate(ctx, &pad0x00, 1); -  shaUpdate(ctx, padlen, 8); - -  /* Output hash -   */ -  for (i = 0; i < 20; i++) { -    hashout[i] = (unsigned char)(ctx->H[i / 4] >> 24); -    ctx->H[i / 4] <<= 8; -  } - -  /* -   *  Re-initialize the context (also zeroizes contents) -   */ -  shaInit(ctx);  -} - - -void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]) { -  SHA_CTX ctx; - -  shaInit(&ctx); -  shaUpdate(&ctx, dataIn, len); -  shaFinal(&ctx, hashout); -} - - -#define SHA_ROTL(X,n) ((((X) << (n)) | ((X) >> (32-(n)))) & 0xffffffffL) - -static void shaHashBlock(SHA_CTX *ctx) { -  int t; -  guint32 A,B,C,D,E,TEMP; - -  for (t = 16; t <= 79; t++) -    ctx->W[t] = -      SHA_ROTL(ctx->W[t-3] ^ ctx->W[t-8] ^ ctx->W[t-14] ^ ctx->W[t-16], 1); - -  A = ctx->H[0]; -  B = ctx->H[1]; -  C = ctx->H[2]; -  D = ctx->H[3]; -  E = ctx->H[4]; - -  for (t = 0; t <= 19; t++) { -    TEMP = (SHA_ROTL(A,5) + (((C^D)&B)^D)     + E + ctx->W[t] + 0x5a827999L) & 0xffffffffL; -    E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; -  } -  for (t = 20; t <= 39; t++) { -    TEMP = (SHA_ROTL(A,5) + (B^C^D)           + E + ctx->W[t] + 0x6ed9eba1L) & 0xffffffffL; -    E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; -  } -  for (t = 40; t <= 59; t++) { -    TEMP = (SHA_ROTL(A,5) + ((B&C)|(D&(B|C))) + E + ctx->W[t] + 0x8f1bbcdcL) & 0xffffffffL; -    E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; -  } -  for (t = 60; t <= 79; t++) { -    TEMP = (SHA_ROTL(A,5) + (B^C^D)           + E + ctx->W[t] + 0xca62c1d6L) & 0xffffffffL; -    E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; -  } - -  ctx->H[0] += A; -  ctx->H[1] += B; -  ctx->H[2] += C; -  ctx->H[3] += D; -  ctx->H[4] += E; -} - -/*---------------------------------------------------------------------------- - * - * This code added by Thomas "temas" Muldowney for Jabber compatability - * - *---------------------------------------------------------------------------*/ -char *shahash(char *str) -{ -    static char final[41]; -    char *pos; -    unsigned char hashval[20]; -    int x; - -    if(!str || strlen(str) == 0) -        return NULL; - -    shaBlock((unsigned char *)str, strlen(str), hashval); - -    pos = final; -    for(x=0;x<20;x++) -    { -        g_snprintf(pos, 3, "%02x", hashval[x]); -        pos += 2; -    } -    return (char *)final; -} diff --git a/protocols/sha.h b/protocols/sha.h deleted file mode 100644 index e8152b1b..00000000 --- a/protocols/sha.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __SHA_H__ -#define __SHA_H__ - -#include <gmodule.h> - -G_MODULE_EXPORT int strprintsha(char *dest, int *hashval); -  -typedef struct { -  guint32 H[5]; -  guint32 W[80]; -  int lenW; -  guint32 sizeHi,sizeLo; -} SHA_CTX; -  -G_MODULE_EXPORT void shaInit(SHA_CTX *ctx); -G_MODULE_EXPORT void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len); -G_MODULE_EXPORT void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]); -G_MODULE_EXPORT void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]); -G_MODULE_EXPORT char *shahash(char *str); - -#endif diff --git a/protocols/ssl_bogus.c b/protocols/ssl_bogus.c deleted file mode 100644 index 00aaa7c4..00000000 --- a/protocols/ssl_bogus.c +++ /dev/null @@ -1,57 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2004 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* SSL module - dummy version                                           */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include "ssl_client.h" - -int ssl_errno; - -void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data ) -{ -	return( NULL ); -} - -int ssl_read( void *conn, char *buf, int len ) -{ -	return( -1 ); -} - -int ssl_write( void *conn, const char *buf, int len ) -{ -	return( -1 ); -} - -void ssl_disconnect( void *conn_ ) -{ -} - -int ssl_getfd( void *conn ) -{ -	return( -1 ); -} - -b_input_condition ssl_getdirection( void *conn ) -{ -	return GAIM_INPUT_READ; -} diff --git a/protocols/ssl_client.h b/protocols/ssl_client.h deleted file mode 100644 index 1a9c79e9..00000000 --- a/protocols/ssl_client.h +++ /dev/null @@ -1,42 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2004 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* SSL module                                                           */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include <glib.h> -#include "proxy.h" - -#define SSL_OK            0 -#define SSL_NOHANDSHAKE   1 -#define SSL_AGAIN         2 - -extern int ssl_errno; - -typedef gboolean (*ssl_input_function)(gpointer, void*, b_input_condition); - -G_MODULE_EXPORT void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data ); -G_MODULE_EXPORT int ssl_read( void *conn, char *buf, int len ); -G_MODULE_EXPORT int ssl_write( void *conn, const char *buf, int len ); -G_MODULE_EXPORT void ssl_disconnect( void *conn_ ); -G_MODULE_EXPORT int ssl_getfd( void *conn ); -G_MODULE_EXPORT b_input_condition ssl_getdirection( void *conn ); diff --git a/protocols/ssl_gnutls.c b/protocols/ssl_gnutls.c deleted file mode 100644 index 3ebe1756..00000000 --- a/protocols/ssl_gnutls.c +++ /dev/null @@ -1,206 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2004 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* SSL module - GnuTLS version                                          */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include <gnutls/gnutls.h> -#include <fcntl.h> -#include <unistd.h> -#include "proxy.h" -#include "ssl_client.h" -#include "sock.h" -#include "stdlib.h" - -int ssl_errno = 0; - -static gboolean initialized = FALSE; - -struct scd -{ -	ssl_input_function func; -	gpointer data; -	int fd; -	gboolean established; -	int inpa; -	 -	gnutls_session session; -	gnutls_certificate_credentials xcred; -}; - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ); - - -void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data ) -{ -	struct scd *conn = g_new0( struct scd, 1 ); -	 -	conn->fd = proxy_connect( host, port, ssl_connected, conn ); -	conn->func = func; -	conn->data = data; -	conn->inpa = -1; -	 -	if( conn->fd < 0 ) -	{ -		g_free( conn ); -		return( NULL ); -	} -	 -	if( !initialized ) -	{ -		gnutls_global_init(); -		initialized = TRUE; -		atexit( gnutls_global_deinit ); -	} -	 -	gnutls_certificate_allocate_credentials( &conn->xcred ); -	gnutls_init( &conn->session, GNUTLS_CLIENT ); -	gnutls_set_default_priority( conn->session ); -	gnutls_credentials_set( conn->session, GNUTLS_CRD_CERTIFICATE, conn->xcred ); -	 -	return( conn ); -} - -static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond ); - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ) -{ -	struct scd *conn = data; -	 -	if( source == -1 ) -	{ -		conn->func( conn->data, NULL, cond ); -		 -		gnutls_deinit( conn->session ); -		gnutls_certificate_free_credentials( conn->xcred ); -		 -		g_free( conn ); -		 -		return FALSE; -	} -	 -	sock_make_nonblocking( conn->fd ); -	gnutls_transport_set_ptr( conn->session, (gnutls_transport_ptr) conn->fd ); -	 -	return ssl_handshake( data, source, cond ); -} - -static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond ) -{ -	struct scd *conn = data; -	int st; -	 -	if( ( st = gnutls_handshake( conn->session ) ) < 0 ) -	{ -		if( st == GNUTLS_E_AGAIN || st == GNUTLS_E_INTERRUPTED ) -		{ -			conn->inpa = b_input_add( conn->fd, ssl_getdirection( conn ), -			                          ssl_handshake, data ); -		} -		else -		{ -			conn->func( conn->data, NULL, cond ); -			 -			gnutls_deinit( conn->session ); -			gnutls_certificate_free_credentials( conn->xcred ); -			closesocket( conn->fd ); -			 -			g_free( conn ); -		} -	} -	else -	{ -		/* For now we can't handle non-blocking perfectly everywhere... */ -		sock_make_blocking( conn->fd ); -		 -		conn->established = TRUE; -		conn->func( conn->data, conn, cond ); -	} -	 -	return FALSE; -} - -int ssl_read( void *conn, char *buf, int len ) -{ -	int st; -	 -	if( !((struct scd*)conn)->established ) -	{ -		ssl_errno = SSL_NOHANDSHAKE; -		return( -1 ); -	} -	 -	st = gnutls_record_recv( ((struct scd*)conn)->session, buf, len ); -	 -	ssl_errno = SSL_OK; -	if( st == GNUTLS_E_AGAIN || st == GNUTLS_E_INTERRUPTED ) -		ssl_errno = SSL_AGAIN; -	 -	return st; -} - -int ssl_write( void *conn, const char *buf, int len ) -{ -	int st; -	 -	if( !((struct scd*)conn)->established ) -	{ -		ssl_errno = SSL_NOHANDSHAKE; -		return( -1 ); -	} -	 -	st = gnutls_record_send( ((struct scd*)conn)->session, buf, len ); -	 -	ssl_errno = SSL_OK; -	if( st == GNUTLS_E_AGAIN || st == GNUTLS_E_INTERRUPTED ) -		ssl_errno = SSL_AGAIN; -	 -	return st; -} - -void ssl_disconnect( void *conn_ ) -{ -	struct scd *conn = conn_; -	 -	if( conn->inpa != -1 ) -		b_event_remove( conn->inpa ); -	 -	if( conn->established ) -		gnutls_bye( conn->session, GNUTLS_SHUT_WR ); -	 -	closesocket( conn->fd ); -	 -	gnutls_deinit( conn->session ); -	gnutls_certificate_free_credentials( conn->xcred ); -	g_free( conn ); -} - -int ssl_getfd( void *conn ) -{ -	return( ((struct scd*)conn)->fd ); -} - -b_input_condition ssl_getdirection( void *conn ) -{ -	return( gnutls_record_get_direction( ((struct scd*)conn)->session ) ? -	        GAIM_INPUT_WRITE : GAIM_INPUT_READ ); -} diff --git a/protocols/ssl_nss.c b/protocols/ssl_nss.c deleted file mode 100644 index 218b3a80..00000000 --- a/protocols/ssl_nss.c +++ /dev/null @@ -1,190 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2005 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* SSL module - NSS version                                             */ - -/* Copyright 2005 Jelmer Vernooij                                       */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include "bitlbee.h" -#include "proxy.h" -#include "ssl_client.h" -#include "sock.h" -#include <nspr.h> -#include <prio.h> -#include <sslproto.h> -#include <nss.h> -#include <private/pprio.h> -#include <ssl.h> -#include <secerr.h> -#include <sslerr.h> - -int ssl_errno = 0; - -static gboolean initialized = FALSE; - -struct scd -{ -	ssl_input_function func; -	gpointer data; -	int fd; -	PRFileDesc *prfd; -	gboolean established; -}; - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ); - - -static SECStatus nss_auth_cert (void *arg, PRFileDesc *socket, PRBool checksig, PRBool isserver) -{ -	return SECSuccess; -} - -static SECStatus nss_bad_cert (void *arg, PRFileDesc *socket)  -{ -	PRErrorCode err; - -	if(!arg) return SECFailure; - -	*(PRErrorCode *)arg = err = PORT_GetError(); - -	switch(err) { -	case SEC_ERROR_INVALID_AVA: -	case SEC_ERROR_INVALID_TIME: -	case SEC_ERROR_BAD_SIGNATURE: -	case SEC_ERROR_EXPIRED_CERTIFICATE: -	case SEC_ERROR_UNKNOWN_ISSUER: -	case SEC_ERROR_UNTRUSTED_CERT: -	case SEC_ERROR_CERT_VALID: -	case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE: -	case SEC_ERROR_CRL_EXPIRED: -	case SEC_ERROR_CRL_BAD_SIGNATURE: -	case SEC_ERROR_EXTENSION_VALUE_INVALID: -	case SEC_ERROR_CA_CERT_INVALID: -	case SEC_ERROR_CERT_USAGES_INVALID: -	case SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION: -		return SECSuccess; - -	default: -		return SECFailure; -	} -} - - -void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data ) -{ -	struct scd *conn = g_new0( struct scd, 1 ); -	 -	conn->fd = proxy_connect( host, port, ssl_connected, conn ); -	conn->func = func; -	conn->data = data; -	 -	if( conn->fd < 0 ) -	{ -		g_free( conn ); -		return( NULL ); -	} -	 -	if( !initialized ) -	{ -		PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1); -		NSS_NoDB_Init(NULL); -		NSS_SetDomesticPolicy(); -	} - -	 -	return( conn ); -} - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ) -{ -	struct scd *conn = data; -	 -	if( source == -1 ) -		goto ssl_connected_failure; -	 -	/* Until we find out how to handle non-blocking I/O with NSS... */ -	sock_make_blocking( conn->fd ); -	 -	conn->prfd = SSL_ImportFD(NULL, PR_ImportTCPSocket(source)); -	SSL_OptionSet(conn->prfd, SSL_SECURITY, PR_TRUE); -	SSL_OptionSet(conn->prfd, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE); -	SSL_BadCertHook(conn->prfd, (SSLBadCertHandler)nss_bad_cert, NULL); -	SSL_AuthCertificateHook(conn->prfd, (SSLAuthCertificate)nss_auth_cert, (void *)CERT_GetDefaultCertDB()); -	SSL_ResetHandshake(conn->prfd, PR_FALSE); - -	if (SSL_ForceHandshake(conn->prfd)) { -		goto ssl_connected_failure; -	} -	 -	 -	conn->established = TRUE; -	conn->func( conn->data, conn, cond ); -	return FALSE; -	 -	ssl_connected_failure: -	 -	conn->func( conn->data, NULL, cond ); -	 -	PR_Close( conn -> prfd ); -	if( source >= 0 ) closesocket( source ); -	g_free( conn ); -	 -	return FALSE; -} - -int ssl_read( void *conn, char *buf, int len ) -{ -	if( !((struct scd*)conn)->established ) -		return( 0 ); -	 -	return( PR_Read( ((struct scd*)conn)->prfd, buf, len ) ); -} - -int ssl_write( void *conn, const char *buf, int len ) -{ -	if( !((struct scd*)conn)->established ) -		return( 0 ); -	 -	return( PR_Write ( ((struct scd*)conn)->prfd, buf, len ) ); -} - -void ssl_disconnect( void *conn_ ) -{ -	struct scd *conn = conn_; -	 -	PR_Close( conn->prfd ); -	closesocket( conn->fd ); -	 -	g_free( conn ); -} - -int ssl_getfd( void *conn ) -{ -	return( ((struct scd*)conn)->fd ); -} - -b_input_condition ssl_getdirection( void *conn ) -{ -	/* Just in case someone calls us, let's return the most likely case: */ -	return GAIM_INPUT_READ; -} diff --git a/protocols/ssl_openssl.c b/protocols/ssl_openssl.c deleted file mode 100644 index b6f6c520..00000000 --- a/protocols/ssl_openssl.c +++ /dev/null @@ -1,221 +0,0 @@ -  /********************************************************************\ -  * BitlBee -- An IRC to other IM-networks gateway                     * -  *                                                                    * -  * Copyright 2002-2004 Wilmer van der Gaast and others                * -  \********************************************************************/ - -/* SSL module - OpenSSL version                                         */ - -/* -  This program is free software; you can redistribute it and/or modify -  it under the terms of the GNU General Public License as published by -  the Free Software Foundation; either version 2 of the License, or -  (at your option) any later version. - -  This program is distributed in the hope that it will be useful, -  but WITHOUT ANY WARRANTY; without even the implied warranty of -  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License with -  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; -  if not, write to the Free Software Foundation, Inc., 59 Temple Place, -  Suite 330, Boston, MA  02111-1307  USA -*/ - -#include <openssl/crypto.h> -#include <openssl/rand.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/ssl.h> -#include <openssl/err.h> - -#include "proxy.h" -#include "ssl_client.h" -#include "sock.h" - -int ssl_errno = 0; - -static gboolean initialized = FALSE; - -struct scd -{ -	ssl_input_function func; -	gpointer data; -	int fd; -	gboolean established; -	 -	int inpa; -	int lasterr;		/* Necessary for SSL_get_error */ -	SSL *ssl; -	SSL_CTX *ssl_ctx; -}; - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ); - - -void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data ) -{ -	struct scd *conn = g_new0( struct scd, 1 ); -	SSL_METHOD *meth; -	 -	conn->fd = proxy_connect( host, port, ssl_connected, conn ); -	conn->func = func; -	conn->data = data; -	 -	if( conn->fd < 0 ) -	{ -		g_free( conn ); -		return( NULL ); -	} -	 -	if( !initialized ) -	{ -		initialized = TRUE; -		SSLeay_add_ssl_algorithms(); -	} -	 -	meth = TLSv1_client_method(); -	conn->ssl_ctx = SSL_CTX_new( meth ); -	if( conn->ssl_ctx == NULL ) -	{ -		conn->fd = -1; -		return( NULL ); -	} -	 -	conn->ssl = SSL_new( conn->ssl_ctx ); -	if( conn->ssl == NULL ) -	{ -		conn->fd = -1; -		return( NULL ); -	} -	 -	return( conn ); -} - -static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond ); - -static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond ) -{ -	struct scd *conn = data; -	 -	if( source == -1 ) -		return ssl_handshake( data, -1, cond ); -	 -	/* We can do at least the handshake with non-blocking I/O */ -	sock_make_nonblocking( conn->fd ); -	SSL_set_fd( conn->ssl, conn->fd ); -	 -	return ssl_handshake( data, source, cond ); -}	 - -static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond ) -{ -	struct scd *conn = data; -	int st; -	 -	if( ( st = SSL_connect( conn->ssl ) ) < 0 ) -	{ -		conn->lasterr = SSL_get_error( conn->ssl, st ); -		if( conn->lasterr != SSL_ERROR_WANT_READ && conn->lasterr != SSL_ERROR_WANT_WRITE ) -			goto ssl_connected_failure; -		 -		conn->inpa = b_input_add( conn->fd, ssl_getdirection( conn ), ssl_handshake, data ); -		return FALSE; -	} -	 -	conn->established = TRUE; -	sock_make_blocking( conn->fd );		/* For now... */ -	conn->func( conn->data, conn, cond ); -	return FALSE; -	 -ssl_connected_failure: -	conn->func( conn->data, NULL, cond ); -	 -	if( conn->ssl ) -	{ -		SSL_shutdown( conn->ssl ); -		SSL_free( conn->ssl ); -	} -	if( conn->ssl_ctx ) -	{ -		SSL_CTX_free( conn->ssl_ctx ); -	} -	if( source >= 0 ) closesocket( source ); -	g_free( conn ); -	 -	return FALSE; -} - -int ssl_read( void *conn, char *buf, int len ) -{ -	int st; -	 -	if( !((struct scd*)conn)->established ) -	{ -		ssl_errno = SSL_NOHANDSHAKE; -		return -1; -	} -	 -	st = SSL_read( ((struct scd*)conn)->ssl, buf, len ); -	 -	ssl_errno = SSL_OK; -	if( st <= 0 ) -	{ -		((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st ); -		if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ) -			ssl_errno = SSL_AGAIN; -	} -	 -	return st; -} - -int ssl_write( void *conn, const char *buf, int len ) -{ -	int st; -	 -	if( !((struct scd*)conn)->established ) -	{ -		ssl_errno = SSL_NOHANDSHAKE; -		return -1; -	} -	 -	st = SSL_write( ((struct scd*)conn)->ssl, buf, len ); -	 -	ssl_errno = SSL_OK; -	if( st <= 0 ) -	{ -		((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st ); -		if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ) -			ssl_errno = SSL_AGAIN; -	} -	 -	return st; -} - -void ssl_disconnect( void *conn_ ) -{ -	struct scd *conn = conn_; -	 -	if( conn->inpa != -1 ) -		b_event_remove( conn->inpa ); -	 -	if( conn->established ) -		SSL_shutdown( conn->ssl ); -	 -	closesocket( conn->fd ); -	 -	SSL_free( conn->ssl ); -	SSL_CTX_free( conn->ssl_ctx ); -	g_free( conn ); -} - -int ssl_getfd( void *conn ) -{ -	return( ((struct scd*)conn)->fd ); -} - -b_input_condition ssl_getdirection( void *conn ) -{ -	return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? GAIM_INPUT_WRITE : GAIM_INPUT_READ ); -} | 
