diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/chat-commands.c | 62 | ||||
-rw-r--r-- | src/core/commands.c | 5 | ||||
-rw-r--r-- | src/core/misc.c | 2 | ||||
-rw-r--r-- | src/core/network-openssl.c | 36 | ||||
-rw-r--r-- | src/fe-common/core/fe-channels.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/window-commands.c | 18 | ||||
-rw-r--r-- | src/fe-common/irc/fe-netjoin.c | 16 | ||||
-rw-r--r-- | src/fe-common/irc/fe-netsplit.c | 2 | ||||
-rw-r--r-- | src/fe-text/mainwindows-layout.c | 2 | ||||
-rw-r--r-- | src/irc/dcc/dcc-autoget.c | 9 | ||||
-rw-r--r-- | src/irc/notifylist/notify-ison.c | 4 | ||||
-rw-r--r-- | src/perl/perl-core.c | 4 |
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); |