1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-29 06:16:40 +02:00

Added SSL support with gnutls lib

This commit is contained in:
Sebastien Helleu
2005-06-19 20:55:10 +00:00
parent bbd373c44d
commit 4e9193a943
24 changed files with 1478 additions and 1198 deletions
+1
View File
@@ -5,6 +5,7 @@ ChangeLog - 2005-06-19
Version 0.1.3 (under dev!):
* SSL support (currently in development, NOT WORKING!)
* channel notify levels are saved in config file (new option
"server_notify_levels" for server sections)
* part message now accepts %v (replaced by WeeChat version), like quit message
+214 -195
View File
File diff suppressed because it is too large Load Diff
+212 -193
View File
File diff suppressed because it is too large Load Diff
+210 -192
View File
File diff suppressed because it is too large Load Diff
+6 -2
View File
@@ -84,13 +84,14 @@ t_weechat_command weechat_commands[] =
0, 2, weechat_cmd_python, NULL },
{ "server", N_("list, add or remove servers"),
N_("[servername] | "
"[servername hostname port [-auto | -noauto] [-pwd password] [-nicks nick1 "
"[servername hostname port [-auto | -noauto] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
N_("servername: server name, for internal & display use\n"
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
@@ -1764,6 +1765,8 @@ weechat_cmd_server (int argc, char **argv)
server.autoconnect = 1;
if (strcasecmp (argv[i], "-noauto") == 0)
server.autoconnect = 0;
if (strcasecmp (argv[i], "-ssl") == 0)
server.ssl = 1;
if (strcasecmp (argv[i], "-pwd") == 0)
{
if (i == (argc - 1))
@@ -1851,7 +1854,8 @@ weechat_cmd_server (int argc, char **argv)
new_server = server_new (server.name, server.autoconnect,
server.autoreconnect,
server.autoreconnect_delay,
0, server.address, server.port, server.password,
0, server.address, server.port, server.ssl,
server.password,
server.nick1, server.nick2, server.nick3,
server.username, server.realname,
server.command, 1, server.autojoin, 1, NULL);
+12 -3
View File
@@ -47,6 +47,7 @@
#include <sys/stat.h>
#include <time.h>
#include <signal.h>
#include <gnutls/gnutls.h>
#ifdef HAVE_ICONV
#include <iconv.h>
@@ -70,9 +71,11 @@ int sigsegv = 0; /* SIGSEGV received?
char *weechat_home = NULL; /* WeeChat home dir. (example: /home/toto/.weechat) */
FILE *weechat_log_file = NULL; /* WeeChat log file (~/.weechat/weechat.log) */
char *local_charset = NULL; /* local charset, for example: ISO-8859-1 */
char *local_charset = NULL; /* local charset, for example: ISO-8859-1 */
int server_cmd_line; /* at least one server on WeeChat command line */
int server_cmd_line; /* at least one server on WeeChat command line */
gnutls_anon_client_credentials gnutls_anoncred; /* gnutls client credentials */
/*
@@ -368,7 +371,7 @@ wee_parse_args (int argc, char *argv[])
if (!server_new (server_tmp.name, server_tmp.autoconnect,
server_tmp.autoreconnect,
server_tmp.autoreconnect_delay,
1, server_tmp.address, server_tmp.port,
1, server_tmp.address, server_tmp.port, 0,
server_tmp.password, server_tmp.nick1,
server_tmp.nick2, server_tmp.nick3,
NULL, NULL, NULL, 0, server_tmp.autojoin, 1, NULL))
@@ -516,6 +519,10 @@ wee_init_vars ()
/* init received messages queue */
recv_msgq = NULL;
msgq_last_msg = NULL;
/* init gnutls */
gnutls_global_init ();
gnutls_anon_allocate_client_credentials (&gnutls_anoncred);
}
/*
@@ -609,6 +616,8 @@ wee_shutdown (int return_code)
if (local_charset)
free (local_charset);
alias_free_all ();
gnutls_anon_free_client_credentials (gnutls_anoncred);
gnutls_global_deinit();
exit (return_code);
}
+2
View File
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <sys/time.h>
#include <gnutls/gnutls.h>
#if defined(ENABLE_NLS) && !defined(_)
#include <locale.h>
@@ -107,6 +108,7 @@
extern int quit_weechat;
extern char *weechat_home;
extern char *local_charset;
extern gnutls_anon_client_credentials gnutls_anoncred;
extern void wee_log_printf (char *, ...);
extern void wee_dump (int);
+9 -1
View File
@@ -650,6 +650,10 @@ t_config_option weechat_options_server[] =
N_("port for connecting to server"),
OPTION_TYPE_INT, 0, 65535, 6667,
NULL, NULL, &(cfg_server.port), NULL, NULL },
{ "server_ssl", N_("use SSL for server communication"),
N_("use SSL for server communication"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
NULL, NULL, &(cfg_server.ssl), NULL, NULL },
{ "server_password", N_("server password"),
N_("password for IRC server"),
OPTION_TYPE_STRING, 0, 0, 0,
@@ -920,6 +924,8 @@ config_get_server_option_ptr (t_irc_server *server, char *option_name)
return (void *)(&server->address);
if (strcasecmp (option_name, "server_port") == 0)
return (void *)(&server->port);
if (strcasecmp (option_name, "server_ssl") == 0)
return (void *)(&server->ssl);
if (strcasecmp (option_name, "server_password") == 0)
return (void *)(&server->password);
if (strcasecmp (option_name, "server_nick1") == 0)
@@ -1095,7 +1101,7 @@ config_allocate_server (char *filename, int line_number)
if (!server_new (cfg_server.name,
cfg_server.autoconnect, cfg_server.autoreconnect,
cfg_server.autoreconnect_delay, 0, cfg_server.address, cfg_server.port,
cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.ssl, cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.nick3, cfg_server.username, cfg_server.realname,
cfg_server.command, cfg_server.command_delay, cfg_server.autojoin,
cfg_server.autorejoin, cfg_server.notify_levels))
@@ -1672,6 +1678,8 @@ config_write (char *config_name)
ptr_server->autoreconnect_delay);
fprintf (file, "server_address=%s\n", ptr_server->address);
fprintf (file, "server_port=%d\n", ptr_server->port);
fprintf (file, "server_ssl=%s\n",
(ptr_server->ssl) ? "on" : "off");
fprintf (file, "server_password=%s\n",
(ptr_server->password) ? ptr_server->password : "");
fprintf (file, "server_nick1=%s\n", ptr_server->nick1);
+2 -1
View File
@@ -23,7 +23,8 @@ weechat_curses_LDADD = ../lib_weechat_gui_common.a \
../../common/lib_weechat_main.a \
../../irc/lib_weechat_irc.a \
$(NCURSES_LIBS) \
../../plugins/lib_weechat_plugins.a $(PLUGINS_LIBS)
../../plugins/lib_weechat_plugins.a $(PLUGINS_LIBS) \
-lgnutls
weechat_curses_SOURCES = gui-display.c \
gui-input.c
+3
View File
@@ -175,6 +175,9 @@ irc_display_server (t_irc_server *server)
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_port . . . . . . .: %d\n",
server->port);
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_ssl . . . . . . . .: %s\n",
(server->ssl) ? _("yes") : _("no"));
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_password . . . . .: %s\n",
(server->password && server->password[0]) ?
+63 -10
View File
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* irc-server.c: (dis)connection and communication with irc server */
/* irc-server.c: connection and communication with IRC server */
#ifdef HAVE_CONFIG_H
@@ -38,6 +38,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <gnutls/gnutls.h>
#include "../common/weechat.h"
#include "irc.h"
@@ -67,6 +68,7 @@ server_init (t_irc_server *server)
server->command_line = 0;
server->address = NULL;
server->port = -1;
server->ssl = 0;
server->password = NULL;
server->nick1 = NULL;
server->nick2 = NULL;
@@ -317,7 +319,7 @@ server_free_all ()
t_irc_server *
server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_delay,
int command_line, char *address, int port, char *password,
int command_line, char *address, int port, int ssl, char *password,
char *nick1, char *nick2, char *nick3, char *username,
char *realname, char *command, int command_delay, char *autojoin,
int autorejoin, char *notify_levels)
@@ -347,6 +349,7 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de
new_server->command_line = command_line;
new_server->address = strdup (address);
new_server->port = port;
new_server->ssl = ssl;
new_server->password = (password) ? strdup (password) : strdup ("");
new_server->nick1 = (nick1) ? strdup (nick1) : strdup ("weechat_user");
new_server->nick2 = (nick2) ? strdup (nick2) : strdup ("weechat2");
@@ -371,7 +374,7 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de
}
/*
* server_send: send data to irc server
* server_send: send data to IRC server
*/
int
@@ -380,11 +383,14 @@ server_send (t_irc_server *server, char *buffer, int size_buf)
if (!server)
return -1;
return send (server->sock, buffer, size_buf, 0);
if (server->ssl)
return gnutls_record_send (server->gnutls_sess, buffer, size_buf);
else
return send (server->sock, buffer, size_buf, 0);
}
/*
* server_sendf: send formatted data to irc server
* server_sendf: send formatted data to IRC server
*/
void
@@ -651,7 +657,14 @@ server_recv (t_irc_server *server)
static char buffer[4096 + 2];
int num_read;
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0);
if (!server)
return;
if (server->ssl)
num_read = gnutls_record_recv (server->gnutls_sess, buffer, sizeof (buffer) - 2);
else
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0);
if (num_read > 0)
{
buffer[num_read] = '\0';
@@ -708,8 +721,12 @@ server_close_connection (t_irc_server *server)
/* close network socket */
if (server->sock != -1)
{
if (server->ssl)
gnutls_bye (server->gnutls_sess, GNUTLS_SHUT_RDWR);
close (server->sock);
server->sock = -1;
if (server->ssl)
gnutls_deinit (server->gnutls_sess);
}
/* free any pending message */
@@ -758,6 +775,22 @@ server_child_read (t_irc_server *server)
{
/* connection OK */
case '0':
/* enable SSL if asked */
if (server->ssl)
{
gnutls_transport_set_ptr (server->gnutls_sess, (gnutls_transport_ptr) server->sock);
if (gnutls_handshake (server->gnutls_sess) < 0)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s gnutls handshake failed\n"),
WEECHAT_ERROR);
server_close_connection (server);
server_reconnect_schedule (server);
return;
}
}
/* kill child and login to server */
server_kill_child (server);
irc_login (server);
break;
@@ -845,17 +878,37 @@ server_connect (t_irc_server *server)
{
int child_pipe[2], set;
pid_t pid;
const int proto_prio[] = { GNUTLS_TLS1, GNUTLS_SSL3, 0 };
const int kx_prio[] = { GNUTLS_KX_ANON_DH, 0 };
irc_display_prefix (server->buffer, PREFIX_INFO);
gui_printf (server->buffer,
_("%s: connecting to %s:%d...\n"),
PACKAGE_NAME, server->address, server->port);
wee_log_printf (_("Connecting to server %s:%d...\n"),
server->address, server->port);
_("%s: connecting to %s:%d%s...\n"),
PACKAGE_NAME, server->address, server->port,
(server->ssl) ? "(ssl)" : "");
wee_log_printf (_("Connecting to server %s:%d%s...\n"),
server->address, server->port,
(server->ssl) ? "(ssl)" : "");
/* close any opened connection and kill child process if running */
server_close_connection (server);
/* init SSL if asked */
if (server->ssl)
{
if (gnutls_init (&server->gnutls_sess, GNUTLS_CLIENT) != 0)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s gnutls init error\n"), WEECHAT_ERROR);
return 0;
}
gnutls_set_default_priority (server->gnutls_sess);
gnutls_protocol_set_priority (server->gnutls_sess, proto_prio);
gnutls_kx_set_priority (server->gnutls_sess, kx_prio);
gnutls_credentials_set (server->gnutls_sess, GNUTLS_CRD_ANON, &gnutls_anoncred);
}
/* create pipe for child process */
if (pipe (child_pipe) < 0)
{
+5 -2
View File
@@ -24,6 +24,7 @@
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <gnutls/gnutls.h>
#include "../gui/gui.h"
/* prefixes for chat window */
@@ -137,6 +138,7 @@ struct t_irc_server
int command_line; /* server was given on command line */
char *address; /* address of server (IP or name) */
int port; /* port for server (6667 by default) */
int ssl; /* SSL protocol */
char *password; /* password for server */
char *nick1; /* first nickname for the server */
char *nick2; /* alternate nickname */
@@ -154,6 +156,7 @@ struct t_irc_server
int child_read; /* to read into child pipe */
int child_write; /* to write into child pipe */
int sock; /* socket for server */
gnutls_session gnutls_sess; /* gnutls session (only if SSL is used) */
int is_connected; /* 1 if WeeChat is connected to server */
char *unterminated_message; /* beginning of a message in input buf */
char *nick; /* current nickname */
@@ -249,9 +252,9 @@ extern t_irc_server *server_alloc ();
extern void server_destroy (t_irc_server *);
extern void server_free (t_irc_server *);
extern void server_free_all ();
extern t_irc_server *server_new (char *, int, int, int, int, char *, int, char *,
extern t_irc_server *server_new (char *, int, int, int, int, char *, int, int,
char *, char *, char *, char *, char *, char *,
int, char *, int, char *);
char *, int, char *, int, char *);
extern int server_send (t_irc_server *, char *, int);
extern void server_sendf (t_irc_server *, char *, ...);
extern void server_recv (t_irc_server *);
+1
View File
@@ -5,6 +5,7 @@ ChangeLog - 2005-06-19
Version 0.1.3 (under dev!):
* SSL support (currently in development, NOT WORKING!)
* channel notify levels are saved in config file (new option
"server_notify_levels" for server sections)
* part message now accepts %v (replaced by WeeChat version), like quit message
+214 -195
View File
File diff suppressed because it is too large Load Diff
+212 -193
View File
File diff suppressed because it is too large Load Diff
+210 -192
View File
File diff suppressed because it is too large Load Diff
+6 -2
View File
@@ -84,13 +84,14 @@ t_weechat_command weechat_commands[] =
0, 2, weechat_cmd_python, NULL },
{ "server", N_("list, add or remove servers"),
N_("[servername] | "
"[servername hostname port [-auto | -noauto] [-pwd password] [-nicks nick1 "
"[servername hostname port [-auto | -noauto] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
N_("servername: server name, for internal & display use\n"
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
@@ -1764,6 +1765,8 @@ weechat_cmd_server (int argc, char **argv)
server.autoconnect = 1;
if (strcasecmp (argv[i], "-noauto") == 0)
server.autoconnect = 0;
if (strcasecmp (argv[i], "-ssl") == 0)
server.ssl = 1;
if (strcasecmp (argv[i], "-pwd") == 0)
{
if (i == (argc - 1))
@@ -1851,7 +1854,8 @@ weechat_cmd_server (int argc, char **argv)
new_server = server_new (server.name, server.autoconnect,
server.autoreconnect,
server.autoreconnect_delay,
0, server.address, server.port, server.password,
0, server.address, server.port, server.ssl,
server.password,
server.nick1, server.nick2, server.nick3,
server.username, server.realname,
server.command, 1, server.autojoin, 1, NULL);
+12 -3
View File
@@ -47,6 +47,7 @@
#include <sys/stat.h>
#include <time.h>
#include <signal.h>
#include <gnutls/gnutls.h>
#ifdef HAVE_ICONV
#include <iconv.h>
@@ -70,9 +71,11 @@ int sigsegv = 0; /* SIGSEGV received?
char *weechat_home = NULL; /* WeeChat home dir. (example: /home/toto/.weechat) */
FILE *weechat_log_file = NULL; /* WeeChat log file (~/.weechat/weechat.log) */
char *local_charset = NULL; /* local charset, for example: ISO-8859-1 */
char *local_charset = NULL; /* local charset, for example: ISO-8859-1 */
int server_cmd_line; /* at least one server on WeeChat command line */
int server_cmd_line; /* at least one server on WeeChat command line */
gnutls_anon_client_credentials gnutls_anoncred; /* gnutls client credentials */
/*
@@ -368,7 +371,7 @@ wee_parse_args (int argc, char *argv[])
if (!server_new (server_tmp.name, server_tmp.autoconnect,
server_tmp.autoreconnect,
server_tmp.autoreconnect_delay,
1, server_tmp.address, server_tmp.port,
1, server_tmp.address, server_tmp.port, 0,
server_tmp.password, server_tmp.nick1,
server_tmp.nick2, server_tmp.nick3,
NULL, NULL, NULL, 0, server_tmp.autojoin, 1, NULL))
@@ -516,6 +519,10 @@ wee_init_vars ()
/* init received messages queue */
recv_msgq = NULL;
msgq_last_msg = NULL;
/* init gnutls */
gnutls_global_init ();
gnutls_anon_allocate_client_credentials (&gnutls_anoncred);
}
/*
@@ -609,6 +616,8 @@ wee_shutdown (int return_code)
if (local_charset)
free (local_charset);
alias_free_all ();
gnutls_anon_free_client_credentials (gnutls_anoncred);
gnutls_global_deinit();
exit (return_code);
}
+2
View File
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <sys/time.h>
#include <gnutls/gnutls.h>
#if defined(ENABLE_NLS) && !defined(_)
#include <locale.h>
@@ -107,6 +108,7 @@
extern int quit_weechat;
extern char *weechat_home;
extern char *local_charset;
extern gnutls_anon_client_credentials gnutls_anoncred;
extern void wee_log_printf (char *, ...);
extern void wee_dump (int);
+9 -1
View File
@@ -650,6 +650,10 @@ t_config_option weechat_options_server[] =
N_("port for connecting to server"),
OPTION_TYPE_INT, 0, 65535, 6667,
NULL, NULL, &(cfg_server.port), NULL, NULL },
{ "server_ssl", N_("use SSL for server communication"),
N_("use SSL for server communication"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
NULL, NULL, &(cfg_server.ssl), NULL, NULL },
{ "server_password", N_("server password"),
N_("password for IRC server"),
OPTION_TYPE_STRING, 0, 0, 0,
@@ -920,6 +924,8 @@ config_get_server_option_ptr (t_irc_server *server, char *option_name)
return (void *)(&server->address);
if (strcasecmp (option_name, "server_port") == 0)
return (void *)(&server->port);
if (strcasecmp (option_name, "server_ssl") == 0)
return (void *)(&server->ssl);
if (strcasecmp (option_name, "server_password") == 0)
return (void *)(&server->password);
if (strcasecmp (option_name, "server_nick1") == 0)
@@ -1095,7 +1101,7 @@ config_allocate_server (char *filename, int line_number)
if (!server_new (cfg_server.name,
cfg_server.autoconnect, cfg_server.autoreconnect,
cfg_server.autoreconnect_delay, 0, cfg_server.address, cfg_server.port,
cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.ssl, cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.nick3, cfg_server.username, cfg_server.realname,
cfg_server.command, cfg_server.command_delay, cfg_server.autojoin,
cfg_server.autorejoin, cfg_server.notify_levels))
@@ -1672,6 +1678,8 @@ config_write (char *config_name)
ptr_server->autoreconnect_delay);
fprintf (file, "server_address=%s\n", ptr_server->address);
fprintf (file, "server_port=%d\n", ptr_server->port);
fprintf (file, "server_ssl=%s\n",
(ptr_server->ssl) ? "on" : "off");
fprintf (file, "server_password=%s\n",
(ptr_server->password) ? ptr_server->password : "");
fprintf (file, "server_nick1=%s\n", ptr_server->nick1);
+2 -1
View File
@@ -23,7 +23,8 @@ weechat_curses_LDADD = ../lib_weechat_gui_common.a \
../../common/lib_weechat_main.a \
../../irc/lib_weechat_irc.a \
$(NCURSES_LIBS) \
../../plugins/lib_weechat_plugins.a $(PLUGINS_LIBS)
../../plugins/lib_weechat_plugins.a $(PLUGINS_LIBS) \
-lgnutls
weechat_curses_SOURCES = gui-display.c \
gui-input.c
+3
View File
@@ -175,6 +175,9 @@ irc_display_server (t_irc_server *server)
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_port . . . . . . .: %d\n",
server->port);
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_ssl . . . . . . . .: %s\n",
(server->ssl) ? _("yes") : _("no"));
gui_printf_color (NULL, COLOR_WIN_CHAT,
" server_password . . . . .: %s\n",
(server->password && server->password[0]) ?
+63 -10
View File
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* irc-server.c: (dis)connection and communication with irc server */
/* irc-server.c: connection and communication with IRC server */
#ifdef HAVE_CONFIG_H
@@ -38,6 +38,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <gnutls/gnutls.h>
#include "../common/weechat.h"
#include "irc.h"
@@ -67,6 +68,7 @@ server_init (t_irc_server *server)
server->command_line = 0;
server->address = NULL;
server->port = -1;
server->ssl = 0;
server->password = NULL;
server->nick1 = NULL;
server->nick2 = NULL;
@@ -317,7 +319,7 @@ server_free_all ()
t_irc_server *
server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_delay,
int command_line, char *address, int port, char *password,
int command_line, char *address, int port, int ssl, char *password,
char *nick1, char *nick2, char *nick3, char *username,
char *realname, char *command, int command_delay, char *autojoin,
int autorejoin, char *notify_levels)
@@ -347,6 +349,7 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de
new_server->command_line = command_line;
new_server->address = strdup (address);
new_server->port = port;
new_server->ssl = ssl;
new_server->password = (password) ? strdup (password) : strdup ("");
new_server->nick1 = (nick1) ? strdup (nick1) : strdup ("weechat_user");
new_server->nick2 = (nick2) ? strdup (nick2) : strdup ("weechat2");
@@ -371,7 +374,7 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de
}
/*
* server_send: send data to irc server
* server_send: send data to IRC server
*/
int
@@ -380,11 +383,14 @@ server_send (t_irc_server *server, char *buffer, int size_buf)
if (!server)
return -1;
return send (server->sock, buffer, size_buf, 0);
if (server->ssl)
return gnutls_record_send (server->gnutls_sess, buffer, size_buf);
else
return send (server->sock, buffer, size_buf, 0);
}
/*
* server_sendf: send formatted data to irc server
* server_sendf: send formatted data to IRC server
*/
void
@@ -651,7 +657,14 @@ server_recv (t_irc_server *server)
static char buffer[4096 + 2];
int num_read;
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0);
if (!server)
return;
if (server->ssl)
num_read = gnutls_record_recv (server->gnutls_sess, buffer, sizeof (buffer) - 2);
else
num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0);
if (num_read > 0)
{
buffer[num_read] = '\0';
@@ -708,8 +721,12 @@ server_close_connection (t_irc_server *server)
/* close network socket */
if (server->sock != -1)
{
if (server->ssl)
gnutls_bye (server->gnutls_sess, GNUTLS_SHUT_RDWR);
close (server->sock);
server->sock = -1;
if (server->ssl)
gnutls_deinit (server->gnutls_sess);
}
/* free any pending message */
@@ -758,6 +775,22 @@ server_child_read (t_irc_server *server)
{
/* connection OK */
case '0':
/* enable SSL if asked */
if (server->ssl)
{
gnutls_transport_set_ptr (server->gnutls_sess, (gnutls_transport_ptr) server->sock);
if (gnutls_handshake (server->gnutls_sess) < 0)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s gnutls handshake failed\n"),
WEECHAT_ERROR);
server_close_connection (server);
server_reconnect_schedule (server);
return;
}
}
/* kill child and login to server */
server_kill_child (server);
irc_login (server);
break;
@@ -845,17 +878,37 @@ server_connect (t_irc_server *server)
{
int child_pipe[2], set;
pid_t pid;
const int proto_prio[] = { GNUTLS_TLS1, GNUTLS_SSL3, 0 };
const int kx_prio[] = { GNUTLS_KX_ANON_DH, 0 };
irc_display_prefix (server->buffer, PREFIX_INFO);
gui_printf (server->buffer,
_("%s: connecting to %s:%d...\n"),
PACKAGE_NAME, server->address, server->port);
wee_log_printf (_("Connecting to server %s:%d...\n"),
server->address, server->port);
_("%s: connecting to %s:%d%s...\n"),
PACKAGE_NAME, server->address, server->port,
(server->ssl) ? "(ssl)" : "");
wee_log_printf (_("Connecting to server %s:%d%s...\n"),
server->address, server->port,
(server->ssl) ? "(ssl)" : "");
/* close any opened connection and kill child process if running */
server_close_connection (server);
/* init SSL if asked */
if (server->ssl)
{
if (gnutls_init (&server->gnutls_sess, GNUTLS_CLIENT) != 0)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s gnutls init error\n"), WEECHAT_ERROR);
return 0;
}
gnutls_set_default_priority (server->gnutls_sess);
gnutls_protocol_set_priority (server->gnutls_sess, proto_prio);
gnutls_kx_set_priority (server->gnutls_sess, kx_prio);
gnutls_credentials_set (server->gnutls_sess, GNUTLS_CRD_ANON, &gnutls_anoncred);
}
/* create pipe for child process */
if (pipe (child_pipe) < 0)
{
+5 -2
View File
@@ -24,6 +24,7 @@
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <gnutls/gnutls.h>
#include "../gui/gui.h"
/* prefixes for chat window */
@@ -137,6 +138,7 @@ struct t_irc_server
int command_line; /* server was given on command line */
char *address; /* address of server (IP or name) */
int port; /* port for server (6667 by default) */
int ssl; /* SSL protocol */
char *password; /* password for server */
char *nick1; /* first nickname for the server */
char *nick2; /* alternate nickname */
@@ -154,6 +156,7 @@ struct t_irc_server
int child_read; /* to read into child pipe */
int child_write; /* to write into child pipe */
int sock; /* socket for server */
gnutls_session gnutls_sess; /* gnutls session (only if SSL is used) */
int is_connected; /* 1 if WeeChat is connected to server */
char *unterminated_message; /* beginning of a message in input buf */
char *nick; /* current nickname */
@@ -249,9 +252,9 @@ extern t_irc_server *server_alloc ();
extern void server_destroy (t_irc_server *);
extern void server_free (t_irc_server *);
extern void server_free_all ();
extern t_irc_server *server_new (char *, int, int, int, int, char *, int, char *,
extern t_irc_server *server_new (char *, int, int, int, int, char *, int, int,
char *, char *, char *, char *, char *, char *,
int, char *, int, char *);
char *, int, char *, int, char *);
extern int server_send (t_irc_server *, char *, int);
extern void server_sendf (t_irc_server *, char *, ...);
extern void server_recv (t_irc_server *);