SILC_NICK_REC *nick;
SILC_CHANNEL_REC *chanrec;
+ SILC_LOG_DEBUG(("Start"));
+
server = conn == NULL ? NULL : conn->context;
chanrec = silc_channel_find_entry(server, channel);
if (!chanrec)
return;
nick = silc_nicklist_find(chanrec, sender);
+ if (!nick) {
+ /* We didn't find client but it clearly exists, add it. */
+ SilcChannelUser chu;
+
+ silc_list_start(channel->clients);
+ while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+ if (chu->client == sender) {
+ nick = silc_nicklist_insert(chanrec, chu, FALSE);
+ break;
+ }
+ }
+ }
if (flags & SILC_MESSAGE_FLAG_ACTION)
printformat_module("fe-common/silc", server, channel->channel_name,
SILC_SERVER_REC *server;
char userhost[256];
+ SILC_LOG_DEBUG(("Start"));
+
server = conn == NULL ? NULL : conn->context;
+ memset(userhost, 0, sizeof(userhost));
if (sender->username)
snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
sender->username, sender->hostname);
SILC_SERVER_REC *server;
va_list va;
+ SILC_LOG_DEBUG(("Start"));
+
server = conn == NULL ? NULL : conn->context;
va_start(va, type);
/* Called to indicate that connection was either successfully established
or connecting failed. This is also the first time application receives
- the SilcClientConnection objecet which it should save somewhere. */
+ the SilcClientConnection object which it should save somewhere. */
void silc_connect(SilcClient client, SilcClientConnection conn, int success)
{
{
SILC_SERVER_REC *server = conn->context;
+ SILC_LOG_DEBUG(("Start"));
+
+ if (server->conn) {
+ nicklist_rename_unique(SERVER(server),
+ server->conn->local_entry, server->nick,
+ server->conn->local_entry,
+ silc_client->username);
+ silc_change_nick(server, silc_client->username);
+ }
+
server->conn->context = NULL;
server->conn = NULL;
server->connection_lost = TRUE;
{
SILC_SERVER_REC *server = conn->context;
+ SILC_LOG_DEBUG(("Start"));
+
if (!success)
return;
silc_list_start(channel->clients);
while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+ if (!chu->client->nickname)
+ continue;
if (chu->mode & SILC_CHANNEL_UMODE_CHANFO)
founder = chu->client;
silc_nicklist_insert(chanrec, chu, FALSE);
}
}
+typedef struct {
+ SilcClient client;
+ SilcClientConnection conn;
+ void *entry;
+ SilcIdType id_type;
+ char *fingerprint;
+} *GetkeyContext;
+
+void silc_getkey_cb(bool success, void *context)
+{
+ GetkeyContext getkey = (GetkeyContext)context;
+ char *entity = (getkey->id_type == SILC_ID_CLIENT ? "user" : "server");
+ char *name = (getkey->id_type == SILC_ID_CLIENT ?
+ ((SilcClientEntry)getkey->entry)->nickname :
+ ((SilcServerEntry)getkey->entry)->server_name);
+
+ if (success) {
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_GETKEY_VERIFIED, entity, name);
+ } else {
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_GETKEY_DISCARD, entity, name);
+ }
+
+ silc_free(getkey->fingerprint);
+ silc_free(getkey);
+}
+
/* Command reply handler. This function is called always in the command reply
function. If error occurs it will be called as well. Normal scenario
is that it will be called after the received command data has been parsed
va_start(vp, status);
+ SILC_LOG_DEBUG(("Start"));
+
switch(command) {
case SILC_COMMAND_WHOIS:
{
char buf[1024], *nickname, *username, *realname, *nick;
+ unsigned char *fingerprint;
uint32 idle, mode;
SilcBuffer channels;
SilcClientEntry client_entry;
- if (status == SILC_STATUS_ERR_NO_SUCH_NICK ||
- status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
- char *tmp;
- tmp = silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
- 3, NULL);
+ if (status == SILC_STATUS_ERR_NO_SUCH_NICK) {
+ /* Print the unknown nick for user */
+ unsigned char *tmp =
+ silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
+ 3, NULL);
if (tmp)
silc_say_error("%s: %s", tmp,
silc_client_command_status_message(status));
- else
- silc_say_error("%s", silc_client_command_status_message(status));
+ break;
+ } else if (status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
+ /* Try to find the entry for the unknown client ID, since we
+ might have, and print the nickname of it for user. */
+ uint32 tmp_len;
+ unsigned char *tmp =
+ silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
+ 2, &tmp_len);
+ if (tmp) {
+ SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len);
+ if (client_id) {
+ client_entry = silc_client_get_client_by_id(client, conn,
+ client_id);
+ if (client_entry && client_entry->nickname)
+ silc_say_error("%s: %s", client_entry->nickname,
+ silc_client_command_status_message(status));
+ silc_free(client_id);
+ }
+ }
break;
}
channels = va_arg(vp, SilcBuffer);
mode = va_arg(vp, uint32);
idle = va_arg(vp, uint32);
+ fingerprint = va_arg(vp, unsigned char *);
silc_parse_userfqdn(nickname, &nick, NULL);
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
silc_free(nick);
if (channels) {
- SilcDList list = silc_channel_payload_parse_list(channels);
+ SilcDList list = silc_channel_payload_parse_list(channels->data,
+ channels->len);
if (list) {
SilcChannelPayload entry;
memset(buf, 0, sizeof(buf));
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
SILCTXT_WHOIS_IDLE, buf);
}
+
+ if (fingerprint) {
+ fingerprint = silc_fingerprint(fingerprint, 20);
+ printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
+ SILCTXT_WHOIS_FINGERPRINT, fingerprint);
+ silc_free(fingerprint);
+ }
}
break;
+ case SILC_COMMAND_IDENTIFY:
+ {
+ SilcClientEntry client_entry;
+
+ if (status == SILC_STATUS_ERR_NO_SUCH_NICK) {
+ /* Print the unknown nick for user */
+ unsigned char *tmp =
+ silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
+ 3, NULL);
+ if (tmp)
+ silc_say_error("%s: %s", tmp,
+ silc_client_command_status_message(status));
+ break;
+ } else if (status == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
+ /* Try to find the entry for the unknown client ID, since we
+ might have, and print the nickname of it for user. */
+ uint32 tmp_len;
+ unsigned char *tmp =
+ silc_argument_get_arg_type(silc_command_get_args(cmd_payload),
+ 2, &tmp_len);
+ if (tmp) {
+ SilcClientID *client_id = silc_id_payload_parse_id(tmp, tmp_len);
+ if (client_id) {
+ client_entry = silc_client_get_client_by_id(client, conn,
+ client_id);
+ if (client_entry && client_entry->nickname)
+ silc_say_error("%s: %s", client_entry->nickname,
+ silc_client_command_status_message(status));
+ silc_free(client_id);
+ }
+ }
+ break;
+ }
+
+ break;
+ }
+
case SILC_COMMAND_WHOWAS:
{
char *nickname, *username, *realname;
if (tmp)
silc_say_error("%s: %s", tmp,
silc_client_command_status_message(status));
- else
- silc_say_error("%s", silc_client_command_status_message(status));
break;
}
}
mode = silc_client_chmode(modei,
- channel_entry->channel_key->cipher->name,
- channel_entry->hmac->hmac->name);
+ channel_entry->channel_key ?
+ channel_entry->channel_key->cipher->name : "",
+ channel_entry->hmac ?
+ silc_hmac_get_name(channel_entry->hmac) : "");
g_free_not_null(chanrec->mode);
chanrec->mode = g_strdup(mode == NULL ? "" : mode);
signal_emit("channel mode changed", 1, chanrec);
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_LIST_HEADER);
- snprintf(users, sizeof(users) - 1, "%d", usercount);
+ if (!usercount)
+ snprintf(users, sizeof(users) - 1, "N/A");
+ else
+ snprintf(users, sizeof(users) - 1, "%d", usercount);
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_LIST,
name, users, topic ? topic : "");
mode = va_arg(vp, uint32);
- if (mode & SILC_UMODE_SERVER_OPERATOR)
+ if (mode & SILC_UMODE_SERVER_OPERATOR &&
+ !(server->umode & SILC_UMODE_SERVER_OPERATOR))
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_SERVER_OPER);
- if (mode & SILC_UMODE_ROUTER_OPERATOR)
+ if (mode & SILC_UMODE_ROUTER_OPERATOR &&
+ !(server->umode & SILC_UMODE_ROUTER_OPERATOR))
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_ROUTER_OPER);
+
+ server->umode = mode;
}
break;
while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
SilcClientEntry e = chu->client;
char stat[5], *mode;
+
+ if (!e->nickname)
+ continue;
memset(stat, 0, sizeof(stat));
mode = silc_client_chumode_char(chu->mode);
printformat_module("fe-common/silc", server, channel->channel_name,
MSGLEVEL_CRAP, SILCTXT_USERS,
- e->nickname, stat, e->username,
- e->hostname, e->realname ? e->realname : "");
+ e->nickname, stat,
+ e->username ? e->username : "",
+ e->hostname ? e->hostname : "",
+ e->realname ? e->realname : "");
if (mode)
silc_free(mode);
}
SilcPublicKey public_key;
unsigned char *pk;
uint32 pk_len;
+ GetkeyContext getkey;
if (!success)
return;
if (public_key) {
pk = silc_pkcs_public_key_encode(public_key, &pk_len);
+
+ getkey = silc_calloc(1, sizeof(*getkey));
+ getkey->entry = entry;
+ getkey->id_type = id_type;
+ getkey->client = client;
+ getkey->conn = conn;
+ getkey->fingerprint = silc_hash_fingerprint(NULL, pk, pk_len);
silc_verify_public_key_internal(client, conn,
(id_type == SILC_ID_CLIENT ?
SILC_SOCKET_TYPE_CLIENT :
SILC_SOCKET_TYPE_SERVER),
pk, pk_len, SILC_SKE_PK_TYPE_SILC,
- NULL, NULL);
+ silc_getkey_cb, getkey);
silc_free(pk);
} else {
printformat_module("fe-common/silc", server, NULL,
}
}
break;
+
+ case SILC_COMMAND_INFO:
+ {
+ SilcServerEntry server_entry;
+ char *server_name;
+ char *server_info;
+
+ if (!success)
+ return;
+
+ server_entry = va_arg(vp, SilcServerEntry);
+ server_name = va_arg(vp, char *);
+ server_info = va_arg(vp, char *);
+
+ if (server_name && server_info )
+ {
+ printtext(server, NULL, MSGLEVEL_CRAP, "Server: %s", server_name);
+ printtext(server, NULL, MSGLEVEL_CRAP, "%s", server_info);
+ }
+ }
+ break;
case SILC_COMMAND_TOPIC:
{
SilcVerifyPublicKey completion, void *context)
{
int i;
- char file[256], filename[256], *fingerprint, *format;
+ char file[256], filename[256], *fingerprint, *babbleprint, *format;
struct passwd *pw;
struct stat st;
char *entity = ((conn_type == SILC_SOCKET_TYPE_SERVER ||
if (conn_type == SILC_SOCKET_TYPE_SERVER ||
conn_type == SILC_SOCKET_TYPE_ROUTER) {
snprintf(file, sizeof(file) - 1, "%skey_%s_%d.pub", entity,
- conn->sock->hostname, conn->sock->port);
+ conn->sock->ip, conn->sock->port);
snprintf(filename, sizeof(filename) - 1, "%s/.silc/%skeys/%s",
pw->pw_dir, entity, file);
} else {
/* Take fingerprint of the public key */
fingerprint = silc_hash_fingerprint(NULL, pk, pk_len);
+ babbleprint = silc_hash_babbleprint(NULL, pk, pk_len);
verify = silc_calloc(1, sizeof(*verify));
verify->client = client;
SILCTXT_PUBKEY_RECEIVED, entity);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_FINGERPRINT, entity, fingerprint);
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_BABBLEPRINT, babbleprint);
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_ACCEPT);
keyboard_entry_redirect((SIGNAL_FUNC)verify_public_key_completion,
SILCTXT_PUBKEY_RECEIVED, entity);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_FINGERPRINT, entity, fingerprint);
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_BABBLEPRINT, babbleprint);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_COULD_NOT_LOAD, entity);
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_RECEIVED, entity);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_FINGERPRINT, entity, fingerprint);
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_BABBLEPRINT, babbleprint);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_MALFORMED, entity);
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_RECEIVED, entity);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_FINGERPRINT, entity, fingerprint);
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_BABBLEPRINT, babbleprint);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_NO_MATCH, entity);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
{
InternalGetAuthMethod internal = (InternalGetAuthMethod)context;
+ SILC_LOG_DEBUG(("Start"));
+
switch (auth_meth) {
case SILC_AUTH_NONE:
/* No authentication required. */
{
InternalGetAuthMethod internal;
+ SILC_LOG_DEBUG(("Start"));
+
/* XXX must resolve from configuration whether this connection has
any specific authentication data */
void silc_failure(SilcClient client, SilcClientConnection conn,
SilcProtocol protocol, void *failure)
{
+ SILC_LOG_DEBUG(("Start"));
+
if (protocol->protocol->type == SILC_PROTOCOL_CLIENT_KEY_EXCHANGE) {
SilcSKEStatus status = (SilcSKEStatus)failure;
silc_client_perform_key_agreement). */
int silc_key_agreement(SilcClient client, SilcClientConnection conn,
- SilcClientEntry client_entry, char *hostname,
- int port,
- SilcKeyAgreementCallback *completion,
+ SilcClientEntry client_entry, const char *hostname,
+ uint16 port, SilcKeyAgreementCallback *completion,
void **context)
{
char portstr[12];
+ SILC_LOG_DEBUG(("Start"));
+
/* We will just display the info on the screen and return FALSE and user
will have to start the key agreement with a command. */
snprintf(portstr, sizeof(portstr) - 1, "%d", port);
if (!hostname)
- printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_NOTICES,
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_KEY_AGREEMENT_REQUEST, client_entry->nickname);
else
- printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_NOTICES,
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_KEY_AGREEMENT_REQUEST_HOST,
client_entry->nickname, hostname, portstr);
return FALSE;
}
+void silc_ftp(SilcClient client, SilcClientConnection conn,
+ SilcClientEntry client_entry, uint32 session_id,
+ const char *hostname, uint16 port)
+{
+ SILC_SERVER_REC *server;
+ char portstr[12];
+ FtpSession ftp = silc_calloc(1, sizeof(*ftp));
+
+ 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;
+
+ if (hostname)
+ snprintf(portstr, sizeof(portstr) - 1, "%d", port);
+
+ if (!hostname)
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_FILE_REQUEST, client_entry->nickname);
+ else
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_FILE_REQUEST_HOST,
+ client_entry->nickname, hostname, portstr);
+}
+
/* SILC client operations */
SilcClientOperations ops = {
silc_say,
silc_ask_passphrase,
silc_failure,
silc_key_agreement,
+ silc_ftp,
};