aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/Makefile2
-rw-r--r--protocols/events.h66
-rw-r--r--protocols/events_glib.c137
-rw-r--r--protocols/events_libevent.c247
-rw-r--r--protocols/http_client.c453
-rw-r--r--protocols/http_client.h57
-rw-r--r--protocols/md5.c392
-rw-r--r--protocols/md5.h85
-rw-r--r--protocols/proxy.c556
-rw-r--r--protocols/proxy.h53
-rw-r--r--protocols/sha.c173
-rw-r--r--protocols/sha.h21
-rw-r--r--protocols/ssl_bogus.c57
-rw-r--r--protocols/ssl_client.h42
-rw-r--r--protocols/ssl_gnutls.c206
-rw-r--r--protocols/ssl_nss.c190
-rw-r--r--protocols/ssl_openssl.c221
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 );
-}