#include "signals.h"
#include "levels.h"
#include "settings.h"
+#include "ignore.h"
#include "fe-common/core/printtext.h"
#include "fe-common/core/fe-channels.h"
#include "fe-common/core/keyboard.h"
+#include "fe-common/core/window-items.h"
#include "fe-common/silc/module-formats.h"
#include "core.h"
strcat(buf, " [blocks invites]");
}
+/* print "nick appears as" message to every channel of a server */
+static void
+silc_print_nick_change_channel(SILC_SERVER_REC *server, const char *channel,
+ const char *newnick, const char *oldnick,
+ const char *address)
+{
+ if (ignore_check(SERVER(server), oldnick, address,
+ channel, newnick, MSGLEVEL_NICKS))
+ return;
+
+ printformat_module("fe-common/silc", server, channel, MSGLEVEL_NICKS,
+ SILCTXT_CHANNEL_APPEARS,
+ oldnick, newnick, channel, address);
+}
+
+static void
+silc_print_nick_change(SILC_SERVER_REC *server, const char *newnick,
+ const char *oldnick, const char *address)
+{
+ GSList *tmp, *windows;
+
+ /* Print to each channel/query where the nick is.
+ Don't print more than once to the same window. */
+ windows = NULL;
+
+ for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
+ CHANNEL_REC *channel = tmp->data;
+ WINDOW_REC *window = window_item_window((WI_ITEM_REC *) channel);
+
+ if (nicklist_find(channel, newnick) == NULL ||
+ g_slist_find(windows, window) != NULL)
+ continue;
+
+ windows = g_slist_append(windows, window);
+ silc_print_nick_change_channel(server, channel->visible_name,
+ newnick, oldnick, address);
+ }
+
+ g_slist_free(windows);
+}
+
void silc_say(SilcClient client, SilcClientConnection conn,
SilcClientMessageType type, char *msg, ...)
{
!strstr(type, "text/vnd")) {
/* It is something textual, display it */
message = (const unsigned char *)data;
+ } else {
+ printformat_module("fe-common/silc", server, channel->channel_name,
+ MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA,
+ nick == NULL ? "[<unknown>]" : nick->nick, type);
+ message = NULL;
}
}
!strstr(type, "text/vnd")) {
/* It is something textual, display it */
message = (const unsigned char *)data;
+ } else {
+ printformat_module("fe-common/silc", server, NULL,
+ MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ type);
+ message = NULL;
}
}
switch (command) {
case SILC_COMMAND_INVITE:
- printformat_module("fe-common/silc", server, NULL,
- MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITING,
- cmd_context->argv[2],
- (cmd_context->argv[1][0] == '*' ?
- (char *)conn->current_channel->channel_name :
- (char *)cmd_context->argv[1]));
+ if (cmd_context->argc > 2)
+ printformat_module("fe-common/silc", server, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITING,
+ cmd_context->argv[2],
+ (cmd_context->argv[1][0] == '*' ?
+ (char *)conn->current_channel->channel_name :
+ (char *)cmd_context->argv[1]));
break;
case SILC_COMMAND_DETACH:
case SILC_COMMAND_NICK:
{
char *old;
- SilcClientEntry client = va_arg(vp, SilcClientEntry);
+ SilcClientEntry client_entry = va_arg(vp, SilcClientEntry);
+ GSList *nicks;
if (!success)
return;
+ nicks = nicklist_get_same(SERVER(server), client_entry->nickname);
+ if (nicks != NULL) {
+ char buf[512];
+ SilcClientEntry collider, old;
+
+ old = ((SILC_NICK_REC *)(nicks->next->data))->silc_user->client;
+ collider = silc_client_get_client_by_id(client, conn,
+ old->id);
+
+ memset(buf, 0, sizeof(buf));
+ snprintf(buf, sizeof(buf) - 1, "%s@%s",
+ collider->username, collider->hostname);
+ nicklist_rename_unique(SERVER(server),
+ old, old->nickname,
+ collider, collider->nickname);
+ silc_print_nick_change(server, collider->nickname,
+ client_entry->nickname, buf);
+ g_slist_free(nicks);
+ }
+
old = g_strdup(server->nick);
- server_change_nick(SERVER(server), client->nickname);
+ server_change_nick(SERVER(server), client_entry->nickname);
nicklist_rename_unique(SERVER(server),
server->conn->local_entry, server->nick,
- client, client->nickname);
+ client_entry, client_entry->nickname);
signal_emit("message own_nick", 4, server, server->nick, old, "");
g_free(old);
break;
char *topic, *name;
int usercount;
char users[20];
+ char tmp[256], *cp, *dm = NULL;
if (!success)
return;
name = va_arg(vp, char *);
topic = va_arg(vp, char *);
usercount = va_arg(vp, int);
+
+ if (topic && !silc_term_utf8() &&
+ silc_utf8_valid(topic, strlen(topic))) {
+ memset(tmp, 0, sizeof(tmp));
+ cp = tmp;
+ if (strlen(topic) > sizeof(tmp) - 1) {
+ dm = silc_calloc(strlen(topic) + 1, sizeof(*dm));
+ cp = dm;
+ }
+
+ silc_utf8_decode(topic, strlen(topic), SILC_STRING_LANGUAGE,
+ cp, strlen(topic));
+ topic = cp;
+ }
if (status == SILC_STATUS_LIST_START ||
status == SILC_STATUS_OK)
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_LIST,
name, users, topic ? topic : "");
+ silc_free(dm);
}
break;
case SILC_COMMAND_UMODE:
{
SilcUInt32 mode;
+ char *reason;
if (!success)
return;
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_ROUTER_OPER);
+ if ((mode & SILC_UMODE_GONE) != (server->umode & SILC_UMODE_GONE)) {
+ if (mode & SILC_UMODE_GONE) {
+ if ((server->away_reason != NULL) && (server->away_reason[0] != '\0'))
+ reason = g_strdup(server->away_reason);
+ else
+ reason = g_strdup("away");
+ } else
+ reason = g_strdup("");
+
+ silc_set_away(reason, server);
+
+ g_free(reason);
+ }
+
server->umode = mode;
signal_emit("user mode changed", 2, server, NULL);
}
{
SilcChannelEntry channel;
char *topic;
+ char tmp[256], *cp, *dm = NULL;
if (!success)
return;
channel = va_arg(vp, SilcChannelEntry);
topic = va_arg(vp, char *);
-
+
+ if (topic && !silc_term_utf8() &&
+ silc_utf8_valid(topic, strlen(topic))) {
+ memset(tmp, 0, sizeof(tmp));
+ cp = tmp;
+ if (strlen(topic) > sizeof(tmp) - 1) {
+ dm = silc_calloc(strlen(topic) + 1, sizeof(*dm));
+ cp = dm;
+ }
+
+ silc_utf8_decode(topic, strlen(topic), SILC_STRING_LANGUAGE,
+ cp, strlen(topic));
+ topic = cp;
+ }
+
if (topic) {
chanrec = silc_channel_find_entry(server, channel);
if (chanrec) {
MSGLEVEL_CRAP, SILCTXT_CHANNEL_TOPIC_NOT_SET,
channel->channel_name);
}
+ silc_free(dm);
}
break;
verify->entity_name = (conn_type != SILC_SOCKET_TYPE_CLIENT ?
(name ? strdup(name) : strdup(conn->sock->hostname))
: NULL);
- verify->pk = silc_calloc(pk_len, sizeof(*verify->pk));
- memcpy(verify->pk, pk, pk_len);
+ verify->pk = silc_memdup(pk, pk_len);
verify->pk_len = pk_len;
verify->pk_type = pk_type;
verify->completion = completion;
if (completion)
completion(TRUE, context);
silc_free(fingerprint);
+ silc_free(verify->filename);
+ silc_free(verify->entity);
+ silc_free(verify->entity_name);
+ silc_free(verify->pk);
+ silc_free(verify);
}
}
{
SILC_SERVER_REC *server;
char portstr[12];
- FtpSession ftp = silc_calloc(1, sizeof(*ftp));
+ FtpSession ftp = NULL;
SILC_LOG_DEBUG(("Start"));
server = conn->context;
- ftp->client_entry = client_entry;
- ftp->session_id = session_id;
- ftp->send = FALSE;
- ftp->conn = conn;
- silc_dlist_add(server->ftp_sessions, ftp);
- server->current_session = ftp;
+ silc_dlist_start(server->ftp_sessions);
+ while ((ftp = silc_dlist_get(server->ftp_sessions)) != SILC_LIST_END) {
+ if (ftp->client_entry == client_entry &&
+ ftp->session_id == session_id) {
+ server->current_session = ftp;
+ break;
+ }
+ }
+ if (ftp == SILC_LIST_END) {
+ ftp = silc_calloc(1, sizeof(*ftp));
+ ftp->client_entry = client_entry;
+ ftp->session_id = session_id;
+ ftp->send = FALSE;
+ ftp->conn = conn;
+ silc_dlist_add(server->ftp_sessions, ftp);
+ server->current_session = ftp;
+ }
if (hostname)
snprintf(portstr, sizeof(portstr) - 1, "%d", port);