X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fsilc-servers.c;h=e16fb02cdc056fef1116a982f49259c3bf0d7483;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=09c6532d48688649aa766a6aae81211870e28318;hpb=7d6007af61ca40fd1a4e467ad17925e7f8631dc1;p=silc.git diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index 09c6532d..e16fb02c 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -1,7 +1,7 @@ /* silc-server.c : irssi - Copyright (C) 2000 - 2006 Timo Sirainen + Copyright (C) 2000 - 2007 Timo Sirainen Pekka Riikonen This program is free software; you can redistribute it and/or modify @@ -33,6 +33,7 @@ #include "settings.h" #include "servers-setup.h" +#include "channels-setup.h" #include "client_ops.h" #include "silc-servers.h" @@ -88,48 +89,38 @@ static void silc_send_msg_clients(SilcClient client, PRIVMSG_REC *rec = context; SILC_SERVER_REC *server = rec->server; SilcClientEntry target; - char nickname[128 + 1]; - SilcDList lclients = NULL; if (!clients) { printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "%s: There is no such client", rec->nick); - } else { - if (silc_dlist_count(clients) > 1) { - silc_parse_userfqdn(rec->nick, nickname, sizeof(nickname), NULL, 0); - - /* Find the correct one. The rec->nick might be a formatted nick - so this will find the correct one. */ - clients = lclients = - silc_client_get_clients_local(silc_client, server->conn, - nickname, rec->nick); - if (!clients) { - printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, - "%s: There is no such client", rec->nick); - goto out; - } - } - - target = silc_dlist_get(clients); + goto out; + } - /* Still check for exact math for nickname, this compares the - real (formatted) nickname and the nick (maybe formatted) that - user gave. This is to assure that `nick' does not match - `nick@host'. */ - if (!silc_utf8_strcasecmp(rec->nick, target->nickname)) { + /* Find the correct one. The rec->nick might be a formatted nick + so this will find the correct one. */ + target = silc_dlist_get(clients); + clients = silc_client_get_clients_local(silc_client, server->conn, + rec->nick, FALSE); + if (!clients) { + if (strchr(rec->nick, '@') && target->server) printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, - "%s: There is no such client", rec->nick); - goto out; - } - - /* Send the private message */ - silc_client_send_private_message(client, conn, target, - rec->flags, sha1hash, - rec->msg, rec->len); + "%s: There is no such client (did you mean %s@%s?)", rec->nick, + target->nickname, target->server); + else + printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, + "%s: There is no such client (did you mean %s?)", rec->nick, + target->nickname); + goto out; } + /* Send the private message */ + silc_dlist_start(clients); + target = silc_dlist_get(clients); + silc_client_send_private_message(client, conn, target, rec->flags, sha1hash, + rec->msg, rec->len); + out: - silc_client_list_free(silc_client, server->conn, lclients); + silc_client_list_free(silc_client, server->conn, clients); g_free(rec->nick); g_free(rec->msg); g_free(rec); @@ -139,21 +130,16 @@ int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, int msg_len, SilcMessageFlags flags) { PRIVMSG_REC *rec; - char nickname[128 + 1]; SilcDList clients; SilcClientEntry target; int ret; - if (!silc_parse_userfqdn(nick, nickname, sizeof(nickname), NULL, 0)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_BAD_NICK, nick); - return FALSE; - } - /* Find client entry */ - clients = silc_client_get_clients_local(silc_client, server->conn, - nickname, nick); + clients = silc_client_get_clients_local(silc_client, server->conn, nick, + FALSE); if (!clients) { + char *nickname = NULL; + rec = g_new0(PRIVMSG_REC, 1); rec->nick = g_strdup(nick); rec->msg = g_strdup(msg); @@ -161,9 +147,14 @@ int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, rec->flags = flags; rec->len = msg_len; + silc_client_nickname_parse(silc_client, server->conn, nick, &nickname); + if (!nickname) + nickname = strdup(nick); + /* Could not find client with that nick, resolve it from server. */ - silc_client_get_clients(silc_client, server->conn, - nickname, NULL, silc_send_msg_clients, rec); + silc_client_get_clients_whois(silc_client, server->conn, nickname, + NULL, NULL, silc_send_msg_clients, rec); + silc_free(nickname); return TRUE; } @@ -222,7 +213,7 @@ void silc_send_mime(SILC_SERVER_REC *server, int channel, const char *to, silc_free(unescaped_data); } -static int isnickflag_func(char flag) +static int isnickflag_func(SERVER_REC *server, char flag) { return flag == '@' || flag == '+'; } @@ -232,7 +223,7 @@ static int ischannel_func(SERVER_REC *server, const char *data) return FALSE; } -const char *get_nick_flags(void) +const char *get_nick_flags(SERVER_REC *server) { return "@\0\0"; } @@ -242,6 +233,7 @@ static void send_message(SILC_SERVER_REC *server, char *target, { char *message = NULL, *t = NULL; int len; + SilcBool sign; g_return_if_fail(server != NULL); g_return_if_fail(target != NULL); @@ -254,10 +246,13 @@ static void send_message(SILC_SERVER_REC *server, char *target, silc_utf8_encode(msg, strlen(msg), SILC_STRING_LOCALE, message, len); } - if (target_type == SEND_TARGET_CHANNEL) + if (target_type == SEND_TARGET_CHANNEL) { + sign = settings_get_bool("sign_channel_messages"); silc_send_channel(server, target, message ? message : msg, - SILC_MESSAGE_FLAG_UTF8); - else { + SILC_MESSAGE_FLAG_UTF8 | + (sign ? SILC_MESSAGE_FLAG_SIGNED : 0)); + } else { + sign = settings_get_bool("sign_private_messages"); if (!silc_term_utf8()) { len = silc_utf8_encoded_len(target, strlen(target), SILC_STRING_LOCALE); t = silc_calloc(len + 1, sizeof(*t)); @@ -267,7 +262,8 @@ static void send_message(SILC_SERVER_REC *server, char *target, silc_send_msg(server, t ? t : target, message ? message : msg, message ? strlen(message) : strlen(msg), - SILC_MESSAGE_FLAG_UTF8); + SILC_MESSAGE_FLAG_UTF8 | + (sign ? SILC_MESSAGE_FLAG_SIGNED : 0)); } silc_free(message); @@ -284,23 +280,33 @@ static void silc_connect_cb(SilcClient client, void *context) { SILC_SERVER_REC *server = context; + FtpSession ftp; char *file; - if (server->disconnected) { - silc_client_close_connection(client, conn); - return; - } + SILC_LOG_DEBUG(("Connection callback %p, status %d, error %d, message %s", + conn, status, error, message ? message : "N/A")); + + server->op = NULL; switch (status) { case SILC_CLIENT_CONN_SUCCESS: + if (server->disconnected) { + silc_client_close_connection(client, conn); + return; + } + /* We have successfully connected to server */ /* Enable queueing until we have our requested nick */ -#if 0 - if (settings_get_str("nick") && - !strcmp(conn->local_entry->nickname, conn->local_entry->username)) + if (((opt_nickname && + !silc_utf8_strcasecmp(opt_nickname, + conn->local_entry->nickname)) || + (settings_get_str("nick") && + !silc_utf8_strcasecmp(settings_get_str("nick"), + conn->local_entry->nickname))) && + silc_utf8_strcasecmp(conn->local_entry->nickname, + conn->local_entry->username)) silc_queue_enable(conn); -#endif /* Put default attributes */ silc_query_attributes_default(silc_client, conn); @@ -312,6 +318,11 @@ static void silc_connect_cb(SilcClient client, break; case SILC_CLIENT_CONN_SUCCESS_RESUME: + if (server->disconnected) { + silc_client_close_connection(client, conn); + return; + } + /* We have successfully resumed old detached session */ server->connected = TRUE; server->conn = conn; @@ -321,19 +332,6 @@ static void silc_connect_cb(SilcClient client, /* Put default attributes */ silc_query_attributes_default(silc_client, conn); - /* If we resumed old session check whether we need to update - our nickname */ - if (strcmp(server->nick, conn->local_entry->nickname)) { - char *old; - old = g_strdup(server->nick); - server_change_nick(SERVER(server), conn->local_entry->nickname); - nicklist_rename_unique(SERVER(server), - conn->local_entry, server->nick, - conn->local_entry, conn->local_entry->nickname); - signal_emit("message own_nick", 4, server, server->nick, old, ""); - g_free(old); - } - /* Remove the detach data now */ file = silc_get_session_filename(server); unlink(file); @@ -356,11 +354,19 @@ static void silc_connect_cb(SilcClient client, silc_get_status_message(error), error, message ? message : ""); + /* Close FTP sessions */ + silc_dlist_start(server->ftp_sessions); + while ((ftp = silc_dlist_get(server->ftp_sessions))) + silc_client_file_close(client, conn, ftp->session_id); + silc_dlist_uninit(server->ftp_sessions); + if (server->conn) server->conn->context = NULL; server->conn = NULL; server->connection_lost = TRUE; - server_disconnect(SERVER(server)); + if (!server->disconnected) + server_disconnect(SERVER(server)); + server_unref(SERVER(server)); break; default: @@ -368,17 +374,21 @@ static void silc_connect_cb(SilcClient client, if (silc_file_size(file) > 0) printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_REATTACH_FAILED, file); - silc_free(file); server->connection_lost = TRUE; + server->conn = NULL; if (server->conn) server->conn->context = NULL; - server_disconnect(SERVER(server)); + if (!server->disconnected) + server_disconnect(SERVER(server)); + server_unref(SERVER(server)); break; } } +/* Called after TCP stream has been created */ + static void sig_connected_stream_created(SilcSocketStreamStatus status, SilcStream stream, void *context) { @@ -386,6 +396,7 @@ static void sig_connected_stream_created(SilcSocketStreamStatus status, SilcClientConnectionParams params; char *file; + server->tcp_op = NULL; if (!stream) { server->connection_lost = TRUE; server_disconnect(SERVER(server)); @@ -399,7 +410,11 @@ static void sig_connected_stream_created(SilcSocketStreamStatus status, /* Set connection parameters */ memset(¶ms, 0, sizeof(params)); - params.nickname = (char *)settings_get_str("nick"); + params.nickname = (opt_nickname ? (char *)opt_nickname : + (char *)settings_get_str("nick")); + params.timeout_secs = settings_get_int("key_exchange_timeout_secs"); + params.rekey_secs = settings_get_int("key_exchange_rekey_secs"); + params.pfs = settings_get_bool("key_exchange_rekey_pfs"); /* Try to read detached session data and use it if found. */ file = silc_get_session_filename(server); @@ -409,11 +424,21 @@ static void sig_connected_stream_created(SilcSocketStreamStatus status, if (params.detach_data) printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_REATTACH, server->tag); + silc_free(file); /* Start key exchange */ - silc_client_key_exchange(silc_client, ¶ms, irssi_pubkey, irssi_privkey, - stream, SILC_CONN_SERVER, silc_connect_cb, server); + server->op = silc_client_key_exchange(silc_client, ¶ms, + irssi_pubkey, irssi_privkey, + stream, SILC_CONN_SERVER, + silc_connect_cb, server); + if (!server->op) { + server->connection_lost = TRUE; + server_disconnect(SERVER(server)); + silc_stream_destroy(stream); + return; + } + server_ref(SERVER(server)); server->ftp_sessions = silc_dlist_init(); server->isnickflag = isnickflag_func; server->ischannel = ischannel_func; @@ -430,8 +455,10 @@ static void sig_connected(SILC_SERVER_REC *server) /* Wrap the socket to TCP stream */ fd = g_io_channel_unix_get_fd(net_sendbuffer_handle(server->handle)); - silc_socket_tcp_stream_create(fd, TRUE, FALSE, silc_client->schedule, - sig_connected_stream_created, server); + server->tcp_op = + silc_socket_tcp_stream_create(fd, TRUE, FALSE, + silc_client->schedule, + sig_connected_stream_created, server); } static void sig_disconnected(SILC_SERVER_REC *server) @@ -439,12 +466,21 @@ static void sig_disconnected(SILC_SERVER_REC *server) if (!IS_SILC_SERVER(server)) return; - silc_dlist_uninit(server->ftp_sessions); - if (server->conn) { + /* Close connection */ silc_client_close_connection(silc_client, server->conn); + } else if (server->op) { + /* Abort on going connecting (key exchange) */ + silc_async_abort(server->op, NULL, NULL); + server->op = NULL; + } else if (server->tcp_op) { + /* Abort on going TCP stream creation */ + silc_async_abort(server->tcp_op, NULL, NULL); + server->tcp_op = NULL; + } - /* SILC closes the handle */ + /* SILC closes the handle */ + if (server->handle) { g_io_channel_unref(net_sendbuffer_handle(server->handle)); net_sendbuffer_destroy(server->handle, FALSE); server->handle = NULL; @@ -498,8 +534,14 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) chans = g_string_new(NULL); for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { CHANNEL_REC *channel = tmp->data; + CHANNEL_SETUP_REC *schannel; - g_string_sprintfa(chans, "%s,", channel->name); + if ((schannel = channel_setup_find(channel->name, server->connrec->chatnet)) && + schannel->password) + g_string_sprintfa(chans, "%s %s,", channel->name, + schannel->password); + else + g_string_sprintfa(chans, "%s,", channel->name); } if (chans->len > 0) @@ -531,7 +573,6 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: WHOIS [[@]] [-details] [-pubkey ] [] */ /* SYNTAX: WHOWAS [@] [] */ /* SYNTAX: CLOSE [] */ -/* SYNTAX: SHUTDOWN */ /* SYNTAX: MOTD [] */ /* SYNTAX: LIST [] */ /* SYNTAX: ME */ @@ -542,7 +583,6 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: NOTICE [-sign] [-channel] */ /* SYNTAX: PART [] */ /* SYNTAX: PING */ -/* SYNTAX: SCONNECT [] */ /* SYNTAX: USERS */ /* SYNTAX: FILE SEND [ []] [-no-listener]*/ /* SYNTAX: FILE ACCEPT [] */ @@ -591,21 +631,6 @@ static void command_self(const char *data, SILC_SERVER_REC *server, signal_stop(); } -/* SCONNECT command. Calls actually SILC's CONNECT command since Irssi - has CONNECT command for other purposes. */ - -static void command_sconnect(const char *data, SILC_SERVER_REC *server) -{ - CMD_SILC_SERVER(server); - if (!IS_SILC_SERVER(server) || !server->connected) { - printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Not connected to server"); - return; - } - - silc_command_exec(server, "CONNECT", data); - signal_stop(); -} - /* SMSG command, to send digitally signed messages */ static void command_smsg(const char *data, SILC_SERVER_REC *server, @@ -686,7 +711,6 @@ out: cmd_params_free(free_arg); } -#if 0 /* FILE command */ SILC_TASK_CALLBACK(silc_client_file_close_later) @@ -732,7 +756,8 @@ static void silc_client_file_monitor(SilcClient client, if (ftp == SILC_LIST_END) return; - if (status == SILC_CLIENT_FILE_MONITOR_ERROR) { + if (status == SILC_CLIENT_FILE_MONITOR_ERROR || + status == SILC_CLIENT_FILE_MONITOR_DISCONNECT) { if (error == SILC_CLIENT_FILE_NO_SUCH_FILE) printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_FILE_ERROR_NO_SUCH_FILE, @@ -745,9 +770,9 @@ static void silc_client_file_monitor(SilcClient client, else printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_FILE_ERROR, client_entry->nickname); - silc_schedule_task_add(silc_client->schedule, 0, - silc_client_file_close_later, ftp, - 1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); + silc_schedule_task_add_timeout(silc_client->schedule, + silc_client_file_close_later, ftp, + 1, 0); silc_dlist_del(server->ftp_sessions, ftp); if (ftp == server->current_session) { server->current_session = NULL; @@ -785,9 +810,9 @@ static void silc_client_file_monitor(SilcClient client, printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_FILE_TRANSMITTED, filepath, fsize, client_entry->nickname, ftp->kps); - silc_schedule_task_add(silc_client->schedule, 0, - silc_client_file_close_later, ftp, - 1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); + silc_schedule_task_add_timeout(silc_client->schedule, + silc_client_file_close_later, ftp, + 1, 0); silc_dlist_del(server->ftp_sessions, ftp); if (ftp == server->current_session) { server->current_session = NULL; @@ -810,9 +835,9 @@ static void silc_client_file_monitor(SilcClient client, printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP, SILCTXT_FILE_RECEIVED, filepath, fsize, client_entry->nickname, ftp->kps); - silc_schedule_task_add(silc_client->schedule, 0, - silc_client_file_close_later, ftp, - 1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); + silc_schedule_task_add_timeout(silc_client->schedule, + silc_client_file_close_later, ftp, + 1, 0); silc_dlist_del(server->ftp_sessions, ftp); if (ftp == server->current_session) { server->current_session = NULL; @@ -833,15 +858,15 @@ typedef struct { static void silc_client_command_file_get_clients(SilcClient client, SilcClientConnection conn, - SilcClientEntry *clients, - SilcUInt32 clients_count, + SilcStatus status, + SilcDList clients, void *context) { FileGetClients internal = (FileGetClients)context; if (!clients) { - printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown nick: %s", - internal->nick); + printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, + "There was no such nickname: %s", internal->nick); silc_free(internal->data); silc_free(internal->nick); silc_free(internal); @@ -860,9 +885,9 @@ static void command_file(const char *data, SILC_SERVER_REC *server, WI_ITEM_REC *item) { SilcClientConnection conn; - SilcClientEntry *entrys, client_entry; + SilcClientEntry client_entry; + SilcDList entries; SilcClientFileError ret; - SilcUInt32 entry_count; char *nickname = NULL, *tmp; unsigned char **argv; SilcUInt32 argc; @@ -873,6 +898,7 @@ static void command_file(const char *data, SILC_SERVER_REC *server, SilcUInt32 local_port = 0; SilcUInt32 session_id; bool do_not_bind = FALSE; + SilcClientConnectionParams params; CMD_SILC_SERVER(server); if (!server || !IS_SILC_SERVER(server) || !server->connected) @@ -906,27 +932,24 @@ static void command_file(const char *data, SILC_SERVER_REC *server, cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); /* Parse the typed nickname. */ - if (!silc_parse_userfqdn(argv[3], &nickname, NULL)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_BAD_NICK, argv[3]); - goto out; - } + silc_client_nickname_parse(silc_client, conn, argv[3], &nickname); + if (!nickname) + nickname = strdup(argv[3]); /* Find client entry */ - entrys = silc_client_get_clients_local(silc_client, conn, nickname, - argv[3], &entry_count); - if (!entrys) { + entries = silc_client_get_clients_local(silc_client, conn, argv[3], FALSE); + if (!entries) { FileGetClients inter = silc_calloc(1, sizeof(*inter)); inter->server = server; inter->data = strdup(data); inter->nick = strdup(nickname); inter->item = item; - silc_client_get_clients(silc_client, conn, nickname, argv[3], + silc_client_get_clients(silc_client, conn, nickname, NULL, silc_client_command_file_get_clients, inter); goto out; } - client_entry = entrys[0]; - silc_free(entrys); + silc_dlist_start(entries); + client_entry = silc_dlist_get(entries); if (argc >= 5) { if (!strcasecmp(argv[4], "-no-listener")) @@ -945,10 +968,31 @@ static void command_file(const char *data, SILC_SERVER_REC *server, do_not_bind = TRUE; } - ret = - silc_client_file_send(silc_client, conn, silc_client_file_monitor, - server, local_ip, local_port, do_not_bind, - client_entry, argv[2], &session_id); + memset(¶ms, 0, sizeof(params)); + if (!do_not_bind) { + if (local_ip) + params.local_ip = strdup(local_ip); + params.local_port = local_port; + if (!params.local_ip && settings_get_bool("use_auto_addr")) { + params.local_ip = (char *)settings_get_str("auto_public_ip"); + if ((params.local_ip) && (*params.local_ip == '\0')) { + params.local_ip = silc_net_localip(); + } else { + params.bind_ip = (char *)settings_get_str("auto_bind_ip"); + if ((params.bind_ip) && (*params.bind_ip == '\0')) + params.bind_ip = NULL; + params.local_port = settings_get_int("auto_bind_port"); + } + } + if (!params.local_ip) + params.local_ip = silc_net_localip(); + } + params.timeout_secs = settings_get_int("key_exchange_timeout_secs"); + + ret = silc_client_file_send(silc_client, conn, client_entry, ¶ms, + irssi_pubkey, irssi_privkey, + silc_client_file_monitor, server, argv[2], + &session_id); if (ret == SILC_CLIENT_FILE_OK) { ftp = silc_calloc(1, sizeof(*ftp)); ftp->session_id = session_id; @@ -974,32 +1018,33 @@ static void command_file(const char *data, SILC_SERVER_REC *server, client_entry->nickname, argv[2]); } + silc_client_list_free(silc_client, server->conn, entries); break; case 2: /* Parse the typed nickname. */ if (argc >= 3) { - if (!silc_parse_userfqdn(argv[2], &nickname, NULL)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_BAD_NICK, argv[2]); - goto out; - } + /* Parse the typed nickname. */ + silc_client_nickname_parse(silc_client, conn, argv[2], &nickname); + if (!nickname) + nickname = strdup(argv[2]); /* Find client entry */ - entrys = silc_client_get_clients_local(silc_client, conn, nickname, - argv[2], &entry_count); - if (!entrys) { + entries = silc_client_get_clients_local(silc_client, conn, argv[2], + FALSE); + if (!entries) { FileGetClients inter = silc_calloc(1, sizeof(*inter)); inter->server = server; inter->data = strdup(data); inter->nick = strdup(nickname); inter->item = item; - silc_client_get_clients(silc_client, conn, nickname, argv[2], + silc_client_get_clients(silc_client, conn, nickname, NULL, silc_client_command_file_get_clients, inter); goto out; } - client_entry = entrys[0]; - silc_free(entrys); + silc_dlist_start(entries); + client_entry = silc_dlist_get(entries); + silc_client_list_free(silc_client, server->conn, entries); } else { if (!server->current_session) { printformat_module("fe-common/silc", server, NULL, @@ -1007,7 +1052,24 @@ static void command_file(const char *data, SILC_SERVER_REC *server, goto out; } - ret = silc_client_file_receive(silc_client, conn, + memset(¶ms, 0, sizeof(params)); + if (settings_get_bool("use_auto_addr")) { + params.local_ip = (char *)settings_get_str("auto_public_ip"); + if ((params.local_ip) && (*params.local_ip == '\0')) { + params.local_ip = silc_net_localip(); + } else { + params.bind_ip = (char *)settings_get_str("auto_bind_ip"); + if ((params.bind_ip) && (*params.bind_ip == '\0')) + params.bind_ip = NULL; + params.local_port = settings_get_int("auto_bind_port"); + } + } + if (!params.local_ip) + params.local_ip = silc_net_localip(); + params.timeout_secs = settings_get_int("key_exchange_timeout_secs"); + + ret = silc_client_file_receive(silc_client, conn, ¶ms, + irssi_pubkey, irssi_privkey, silc_client_file_monitor, server, NULL, server->current_session->session_id, NULL, NULL); @@ -1039,7 +1101,24 @@ static void command_file(const char *data, SILC_SERVER_REC *server, silc_dlist_start(server->ftp_sessions); while ((ftp = silc_dlist_get(server->ftp_sessions)) != SILC_LIST_END) { if (ftp->client_entry == client_entry && !ftp->filepath) { - ret = silc_client_file_receive(silc_client, conn, + memset(¶ms, 0, sizeof(params)); + if (settings_get_bool("use_auto_addr")) { + params.local_ip = (char *)settings_get_str("auto_public_ip"); + if ((params.local_ip) && (*params.local_ip == '\0')) { + params.local_ip = silc_net_localip(); + } else { + params.bind_ip = (char *)settings_get_str("auto_bind_ip"); + if ((params.bind_ip) && (*params.bind_ip == '\0')) + params.bind_ip = NULL; + params.local_port = settings_get_int("auto_bind_port"); + } + } + if (!params.local_ip) + params.local_ip = silc_net_localip(); + params.timeout_secs = settings_get_int("key_exchange_timeout_secs"); + + ret = silc_client_file_receive(silc_client, conn, ¶ms, + irssi_pubkey, irssi_privkey, silc_client_file_monitor, server, NULL, ftp->session_id, NULL, NULL); if (ret != SILC_CLIENT_FILE_OK) { @@ -1077,27 +1156,27 @@ static void command_file(const char *data, SILC_SERVER_REC *server, case 3: /* Parse the typed nickname. */ if (argc >= 3) { - if (!silc_parse_userfqdn(argv[2], &nickname, NULL)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_BAD_NICK, argv[2]); - goto out; - } + /* Parse the typed nickname. */ + silc_client_nickname_parse(silc_client, conn, argv[2], &nickname); + if (!nickname) + nickname = strdup(argv[2]); /* Find client entry */ - entrys = silc_client_get_clients_local(silc_client, conn, nickname, - argv[2], &entry_count); - if (!entrys) { + entries = silc_client_get_clients_local(silc_client, conn, argv[2], + FALSE); + if (!entries) { FileGetClients inter = silc_calloc(1, sizeof(*inter)); inter->server = server; inter->data = strdup(data); inter->nick = strdup(nickname); inter->item = item; - silc_client_get_clients(silc_client, conn, nickname, argv[2], + silc_client_get_clients(silc_client, conn, nickname, NULL, silc_client_command_file_get_clients, inter); goto out; } - client_entry = entrys[0]; - silc_free(entrys); + silc_dlist_start(entries); + client_entry = silc_dlist_get(entries); + silc_client_list_free(silc_client, server->conn, entries); } else { if (!server->current_session) { printformat_module("fe-common/silc", server, NULL, @@ -1182,8 +1261,8 @@ static void command_file(const char *data, SILC_SERVER_REC *server, out: silc_free(nickname); + return; } -#endif /* 0 */ void silc_server_init(void) { @@ -1211,10 +1290,8 @@ void silc_server_init(void) command_bind_silc("ping", MODULE_NAME, (SIGNAL_FUNC) command_self); command_bind_silc("motd", MODULE_NAME, (SIGNAL_FUNC) command_self); command_bind_silc("close", MODULE_NAME, (SIGNAL_FUNC) command_self); - command_bind_silc("shutdown", MODULE_NAME, (SIGNAL_FUNC) command_self); command_bind_silc("getkey", MODULE_NAME, (SIGNAL_FUNC) command_self); - command_bind_silc("sconnect", MODULE_NAME, (SIGNAL_FUNC) command_sconnect); -// command_bind_silc("file", MODULE_NAME, (SIGNAL_FUNC) command_file); + command_bind_silc("file", MODULE_NAME, (SIGNAL_FUNC) command_file); command_bind_silc("detach", MODULE_NAME, (SIGNAL_FUNC) command_self); command_bind_silc("watch", MODULE_NAME, (SIGNAL_FUNC) command_self); command_bind_silc("stats", MODULE_NAME, (SIGNAL_FUNC) command_self); @@ -1250,10 +1327,8 @@ void silc_server_deinit(void) command_unbind("motd", (SIGNAL_FUNC) command_self); command_unbind("ban", (SIGNAL_FUNC) command_self); command_unbind("close", (SIGNAL_FUNC) command_self); - command_unbind("shutdown", (SIGNAL_FUNC) command_self); command_unbind("getkey", (SIGNAL_FUNC) command_self); - command_unbind("sconnect", (SIGNAL_FUNC) command_sconnect); -// command_unbind("file", (SIGNAL_FUNC) command_file); + command_unbind("file", (SIGNAL_FUNC) command_file); command_unbind("detach", (SIGNAL_FUNC) command_self); command_unbind("watch", (SIGNAL_FUNC) command_self); command_unbind("stats", (SIGNAL_FUNC) command_self); @@ -1261,7 +1336,6 @@ void silc_server_deinit(void) command_unbind("smsg", (SIGNAL_FUNC) command_smsg); } -#if 0 void silc_server_free_ftp(SILC_SERVER_REC *server, SilcClientEntry client_entry) { @@ -1276,12 +1350,11 @@ void silc_server_free_ftp(SILC_SERVER_REC *server, } } } -#endif /* 0 */ bool silc_term_utf8(void) { const char *str; - str = settings_get_str("term_type"); + str = settings_get_str("term_charset"); if (str) if (g_strcasecmp(str, "utf-8") == 0) return TRUE;