summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/chat-commands.c62
-rw-r--r--src/core/commands.c5
-rw-r--r--src/core/misc.c2
-rw-r--r--src/core/network-openssl.c36
-rw-r--r--src/fe-common/core/fe-channels.c2
-rw-r--r--src/fe-common/core/window-commands.c18
-rw-r--r--src/fe-common/irc/fe-netjoin.c16
-rw-r--r--src/fe-common/irc/fe-netsplit.c2
-rw-r--r--src/fe-text/mainwindows-layout.c2
-rw-r--r--src/irc/dcc/dcc-autoget.c9
-rw-r--r--src/irc/notifylist/notify-ison.c4
-rw-r--r--src/perl/perl-core.c4
12 files changed, 120 insertions, 42 deletions
diff --git a/src/core/chat-commands.c b/src/core/chat-commands.c
index c737b810..e86fdf9d 100644
--- a/src/core/chat-commands.c
+++ b/src/core/chat-commands.c
@@ -250,19 +250,14 @@ static void cmd_server(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
command_runsub("server", data, server, item);
}
-static void sig_default_command_server(const char *data, SERVER_REC *server,
- WI_ITEM_REC *item)
-{
- signal_emit("command server connect", 3, data, server, item);
-}
-
-/* SYNTAX: SERVER [-4 | -6] [-ssl] [-ssl_cert <cert>] [-ssl_pkey <pkey>] [-ssl_pass <password>]
- [-ssl_verify] [-ssl_cafile <cafile>] [-ssl_capath <capath>]
- [-ssl_ciphers <list>]
- [-!] [-noautosendcmd]
+/* SYNTAX: SERVER CONNECT [-4 | -6] [-ssl] [-ssl_cert <cert>] [-ssl_pkey <pkey>]
+ [-ssl_pass <password>] [-ssl_verify] [-ssl_cafile <cafile>]
+ [-ssl_capath <capath>]
+ [-ssl_ciphers <list>]
+ [-!] [-noautosendcmd]
[-noproxy] [-network <network>] [-host <hostname>]
[-rawlog <file>]
- [+]<address>|<chatnet> [<port> [<password> [<nick>]]] */
+ [+]<address>|<chatnet> [<port> [<password> [<nick>]]] */
/* NOTE: -network replaces the old -ircnet flag. */
static void cmd_server_connect(const char *data, SERVER_REC *server)
{
@@ -443,41 +438,66 @@ static void cmd_foreach(const char *data, SERVER_REC *server,
/* SYNTAX: FOREACH SERVER <command> */
static void cmd_foreach_server(const char *data, SERVER_REC *server)
{
- GSList *list;
+ GSList *list;
+ const char *cmdchars;
+ char *str;
+
+ cmdchars = settings_get_str("cmdchars");
+ str = strchr(cmdchars, *data) != NULL ? g_strdup(data) :
+ g_strdup_printf("%c%s", *cmdchars, data);
list = g_slist_copy(servers);
while (list != NULL) {
- signal_emit("send command", 3, data, list->data, NULL);
- list = g_slist_remove(list, list->data);
+ signal_emit("send command", 3, str, list->data, NULL);
+ list = g_slist_remove(list, list->data);
}
+
+ g_free(str);
}
/* SYNTAX: FOREACH CHANNEL <command> */
static void cmd_foreach_channel(const char *data)
{
- GSList *list;
+ GSList *list;
+ const char *cmdchars;
+ char *str;
+
+ cmdchars = settings_get_str("cmdchars");
+ str = strchr(cmdchars, *data) != NULL ? g_strdup(data) :
+ g_strdup_printf("%c%s", *cmdchars, data);
list = g_slist_copy(channels);
while (list != NULL) {
CHANNEL_REC *rec = list->data;
- signal_emit("send command", 3, data, rec->server, rec);
- list = g_slist_remove(list, list->data);
+ signal_emit("send command", 3, str, rec->server, rec);
+ list = g_slist_remove(list, list->data);
}
+
+ g_free(str);
}
/* SYNTAX: FOREACH QUERY <command> */
static void cmd_foreach_query(const char *data)
{
- GSList *list;
+ GSList *list;
+ const char *cmdchars;
+ char *str;
+
+ cmdchars = settings_get_str("cmdchars");
+ str = strchr(cmdchars, *data) != NULL ? g_strdup(data) :
+ g_strdup_printf("%c%s", *cmdchars, data);
+
list = g_slist_copy(queries);
while (list != NULL) {
QUERY_REC *rec = list->data;
- signal_emit("send command", 3, data, rec->server, rec);
- list = g_slist_remove(list, list->data);
+ signal_emit("send command", 3, str, rec->server, rec);
+ list = g_slist_remove(list, list->data);
}
+
+ g_free(str);
}
void chat_commands_init(void)
@@ -495,7 +515,6 @@ void chat_commands_init(void)
command_bind("foreach channel", NULL, (SIGNAL_FUNC) cmd_foreach_channel);
command_bind("foreach query", NULL, (SIGNAL_FUNC) cmd_foreach_query);
- signal_add("default command server", (SIGNAL_FUNC) sig_default_command_server);
signal_add("server sendmsg", (SIGNAL_FUNC) sig_server_sendmsg);
command_set_options("connect", "4 6 !! -network ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_pinned_cert +ssl_pinned_pubkey tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey +host noproxy -rawlog noautosendcmd");
@@ -515,6 +534,5 @@ void chat_commands_deinit(void)
command_unbind("foreach channel", (SIGNAL_FUNC) cmd_foreach_channel);
command_unbind("foreach query", (SIGNAL_FUNC) cmd_foreach_query);
- signal_remove("default command server", (SIGNAL_FUNC) sig_default_command_server);
signal_remove("server sendmsg", (SIGNAL_FUNC) sig_server_sendmsg);
}
diff --git a/src/core/commands.c b/src/core/commands.c
index 607baf77..8e21a88a 100644
--- a/src/core/commands.c
+++ b/src/core/commands.c
@@ -567,13 +567,14 @@ static int get_cmd_options(char **data, int ignore_unknown,
option = NULL; pos = -1;
for (;;) {
- if (**data == '-') {
+ if (**data == '\0' || **data == '-') {
if (option != NULL && *optlist[pos] == '+') {
/* required argument missing! */
*data = optlist[pos] + 1;
return CMDERR_OPTION_ARG_MISSING;
}
-
+ }
+ if (**data == '-') {
(*data)++;
if (**data == '-' && (*data)[1] == ' ') {
/* -- option means end of options even
diff --git a/src/core/misc.c b/src/core/misc.c
index 1cfa15b6..d8437430 100644
--- a/src/core/misc.c
+++ b/src/core/misc.c
@@ -690,6 +690,8 @@ int expand_escape(const char **data)
return '\n';
case 'e':
return 27; /* ESC */
+ case '\\':
+ return '\\';
case 'x':
/* hex digit */
diff --git a/src/core/network-openssl.c b/src/core/network-openssl.c
index 36b8d887..4de3cb3c 100644
--- a/src/core/network-openssl.c
+++ b/src/core/network-openssl.c
@@ -438,16 +438,38 @@ static GIOChannel *irssi_ssl_get_iochannel(GIOChannel *handle, int port, SERVER_
if (mycert && *mycert) {
char *scert = NULL, *spkey = NULL;
+ FILE *fp;
scert = convert_home(mycert);
if (mypkey && *mypkey)
spkey = convert_home(mypkey);
- ERR_clear_error();
- if (! SSL_CTX_use_certificate_file(ctx, scert, SSL_FILETYPE_PEM))
- g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
- else if (! SSL_CTX_use_PrivateKey_file(ctx, spkey ? spkey : scert, SSL_FILETYPE_PEM))
- g_warning("Loading of private key '%s' failed: %s", mypkey ? mypkey : mycert, ERR_reason_error_string(ERR_get_error()));
- else if (! SSL_CTX_check_private_key(ctx))
- g_warning("Private key does not match the certificate");
+
+ if ((fp = fopen(scert, "r"))) {
+ X509 *cert;
+ /* Let's parse the certificate by hand instead of using
+ * SSL_CTX_use_certificate_file so that we can validate
+ * some parts of it. */
+ cert = PEM_read_X509(fp, NULL, get_pem_password_callback, (void *)mypass);
+ if (cert != NULL) {
+ /* Only the expiration date is checked right now */
+ if (X509_cmp_current_time(X509_get_notAfter(cert)) <= 0 ||
+ X509_cmp_current_time(X509_get_notBefore(cert)) >= 0)
+ g_warning("The client certificate is expired");
+
+ ERR_clear_error();
+ if (! SSL_CTX_use_certificate(ctx, cert))
+ g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
+ else if (! SSL_CTX_use_PrivateKey_file(ctx, spkey ? spkey : scert, SSL_FILETYPE_PEM))
+ g_warning("Loading of private key '%s' failed: %s", mypkey ? mypkey : mycert, ERR_reason_error_string(ERR_get_error()));
+ else if (! SSL_CTX_check_private_key(ctx))
+ g_warning("Private key does not match the certificate");
+
+ X509_free(cert);
+ } else
+ g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
+
+ fclose(fp);
+ } else
+ g_warning("Could not find client certificate '%s'", scert);
g_free(scert);
g_free(spkey);
}
diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c
index 00aac885..8e434ab5 100644
--- a/src/fe-common/core/fe-channels.c
+++ b/src/fe-common/core/fe-channels.c
@@ -453,7 +453,7 @@ static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist)
}
}
- if (str->len > strlen(prefix_format)) {
+ if (prefix_format != NULL && str->len > strlen(prefix_format)) {
printtext(channel->server, channel->visible_name,
MSGLEVEL_CLIENTCRAP, "%s", str->str);
}
diff --git a/src/fe-common/core/window-commands.c b/src/fe-common/core/window-commands.c
index 9e4aab3a..57c81ac2 100644
--- a/src/fe-common/core/window-commands.c
+++ b/src/fe-common/core/window-commands.c
@@ -839,23 +839,31 @@ static void cmd_layout(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
/* SYNTAX: FOREACH WINDOW <command> */
static void cmd_foreach_window(const char *data)
{
- WINDOW_REC *old;
- GSList *list;
+ WINDOW_REC *old;
+ GSList *list;
+ const char *cmdchars;
+ char *str;
- old = active_win;
+ cmdchars = settings_get_str("cmdchars");
+ str = strchr(cmdchars, *data) != NULL ? g_strdup(data) :
+ g_strdup_printf("%c%s", *cmdchars, data);
+
+ old = active_win;
list = g_slist_copy(windows);
while (list != NULL) {
WINDOW_REC *rec = list->data;
active_win = rec;
- signal_emit("send command", 3, data, rec->active_server,
+ signal_emit("send command", 3, str, rec->active_server,
rec->active);
- list = g_slist_remove(list, list->data);
+ list = g_slist_remove(list, list->data);
}
if (g_slist_find(windows, old) != NULL)
active_win = old;
+
+ g_free(str);
}
void window_commands_init(void)
diff --git a/src/fe-common/irc/fe-netjoin.c b/src/fe-common/irc/fe-netjoin.c
index 4eb388c0..8272093f 100644
--- a/src/fe-common/irc/fe-netjoin.c
+++ b/src/fe-common/irc/fe-netjoin.c
@@ -470,6 +470,20 @@ static void read_settings(void)
}
}
+static void sig_server_disconnected(IRC_SERVER_REC *server)
+{
+ NETJOIN_SERVER_REC *netjoin_server;
+
+ g_return_if_fail(server != NULL);
+
+ if (!IS_IRC_SERVER(server))
+ return;
+
+ if ((netjoin_server = netjoin_find_server(server))) {
+ netjoin_server_remove(netjoin_server);
+ }
+}
+
void fe_netjoin_init(void)
{
settings_add_bool("misc", "hide_netsplit_quits", TRUE);
@@ -480,6 +494,7 @@ void fe_netjoin_init(void)
read_settings();
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
+ signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
}
void fe_netjoin_deinit(void)
@@ -492,6 +507,7 @@ void fe_netjoin_deinit(void)
}
signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
+ signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_remove("message quit", (SIGNAL_FUNC) msg_quit);
signal_remove("message join", (SIGNAL_FUNC) msg_join);
diff --git a/src/fe-common/irc/fe-netsplit.c b/src/fe-common/irc/fe-netsplit.c
index 17fb1994..4c69dd10 100644
--- a/src/fe-common/irc/fe-netsplit.c
+++ b/src/fe-common/irc/fe-netsplit.c
@@ -148,6 +148,8 @@ static void print_server_splits(IRC_SERVER_REC *server, TEMP_SPLIT_REC *rec, con
char *sourceserver;
GSList *tmp;
+ g_return_if_fail(rec->servers != NULL);
+
destservers = g_string_new(NULL);
for (tmp = rec->servers; tmp != NULL; tmp = tmp->next) {
NETSPLIT_SERVER_REC *rec = tmp->data;
diff --git a/src/fe-text/mainwindows-layout.c b/src/fe-text/mainwindows-layout.c
index 020969e6..fae02539 100644
--- a/src/fe-text/mainwindows-layout.c
+++ b/src/fe-text/mainwindows-layout.c
@@ -121,6 +121,8 @@ static void sig_layout_restore(void)
if (node == NULL) return;
sorted_config = get_sorted_windows_config(node);
+ if (sorted_config == NULL) return;
+
windows_count = g_slist_length(sorted_config);
/* calculate the saved terminal height */
diff --git a/src/irc/dcc/dcc-autoget.c b/src/irc/dcc/dcc-autoget.c
index de23a5d1..dd12f438 100644
--- a/src/irc/dcc/dcc-autoget.c
+++ b/src/irc/dcc/dcc-autoget.c
@@ -23,6 +23,7 @@
#include "masks.h"
#include "settings.h"
#include "servers.h"
+#include "misc.h"
#include "dcc-get.h"
@@ -30,7 +31,7 @@ static void sig_dcc_request(GET_DCC_REC *dcc, const char *nickaddr)
{
struct stat statbuf;
const char *masks;
- char *str, *file;
+ char *str, *file, *esc_arg;
int max_size;
if (!IS_DCC_GET(dcc)) return;
@@ -68,11 +69,13 @@ static void sig_dcc_request(GET_DCC_REC *dcc, const char *nickaddr)
/* ok. but do we want/need to resume? */
file = dcc_get_download_path(dcc->arg);
+ esc_arg = escape_string(dcc->arg);
str = g_strdup_printf(settings_get_bool("dcc_autoresume") &&
stat(file, &statbuf) == 0 ?
- "RESUME %s %s" : "GET %s %s",
- dcc->nick, dcc->arg);
+ "RESUME %s \"%s\"" : "GET %s \"%s\"",
+ dcc->nick, esc_arg);
signal_emit("command dcc", 2, str, dcc->server);
+ g_free(esc_arg);
g_free(file);
g_free(str);
}
diff --git a/src/irc/notifylist/notify-ison.c b/src/irc/notifylist/notify-ison.c
index f9ca7b37..8a8865cc 100644
--- a/src/irc/notifylist/notify-ison.c
+++ b/src/irc/notifylist/notify-ison.c
@@ -80,6 +80,10 @@ static void ison_send(IRC_SERVER_REC *server, GString *cmd)
{
MODULE_SERVER_REC *mserver;
+ if (!server->connected) {
+ return;
+ }
+
mserver = MODULE_DATA(server);
mserver->ison_count++;
diff --git a/src/perl/perl-core.c b/src/perl/perl-core.c
index e4bde559..39389157 100644
--- a/src/perl/perl-core.c
+++ b/src/perl/perl-core.c
@@ -67,11 +67,11 @@ static void perl_script_destroy(PERL_SCRIPT_REC *script)
{
perl_scripts = g_slist_remove(perl_scripts, script);
- signal_emit("script destroyed", 1, script);
-
perl_signal_remove_script(script);
perl_source_remove_script(script);
+ signal_emit("script destroyed", 1, script);
+
g_free(script->name);
g_free(script->package);
g_free_not_null(script->path);