/* 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)
{
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));
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;
}
if (!success)
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;
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;
}
}
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,