#include "silc-queries.h"
#include "silc-nicklist.h"
#include "silc-cmdqueue.h"
+#include "clientutil.h"
#include "signals.h"
#include "levels.h"
server = conn == NULL ? NULL : conn->context;
memset(userhost, 0, sizeof(userhost));
- if (sender->username)
+ if (sender->username[0])
snprintf(userhost, sizeof(userhost) - 1, "%s@%s",
sender->username, sender->hostname);
if (flags & SILC_MESSAGE_FLAG_DATA) {
silc_emit_mime_sig(server,
- sender->nickname ?
+ sender->nickname[0] ?
(WI_ITEM_REC *)query_find(SERVER(server), sender->nickname) :
NULL,
message, message_len,
- sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
flags & SILC_MESSAGE_FLAG_SIGNED ? verified : -1);
message = NULL;
}
cp, message_len);
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message silc signed_private_action", 6, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL,
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL,
NULL, verified);
else
signal_emit("message silc private_action", 5, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, NULL);
silc_free(dm);
} else {
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message silc signed_private_action", 6, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL,
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL,
NULL, verified);
else
signal_emit("message silc private_action", 5, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, NULL);
}
else if (flags & SILC_MESSAGE_FLAG_NOTICE)
if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
cp, message_len);
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message silc signed_private_notice", 6, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL,
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL,
NULL, verified);
else
signal_emit("message silc private_notice", 5, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, NULL);
silc_free(dm);
} else {
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message silc signed_private_notice", 6, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL,
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL,
NULL, verified);
else
signal_emit("message silc private_notice", 5, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, NULL);
}
else {
if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
cp, message_len);
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message signed_private", 5, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, verified);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, verified);
else
signal_emit("message private", 4, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL);
silc_free(dm);
return;
}
if (flags & SILC_MESSAGE_FLAG_SIGNED)
signal_emit("message signed_private", 5, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL, verified);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL, verified);
else
signal_emit("message private", 4, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL);
+ sender->nickname[0] ? sender->nickname : "[<unknown>]",
+ sender->username[0] ? userhost : NULL);
}
}
char buf[512];
char *name, *tmp, *cipher, *hmac;
GSList *list1, *list_tmp;
- SilcDList chpks;
+ SilcDList chpks, clients;
SILC_LOG_DEBUG(("Start"));
name = va_arg(va, char *);
client_entry = va_arg(va, SilcClientEntry);
- memset(buf, 0, sizeof(buf));
- snprintf(buf, sizeof(buf) - 1, "%s@%s",
- client_entry->username, client_entry->hostname);
- signal_emit("message invite", 4, server, channel ? channel->channel_name :
- name, client_entry->nickname, buf);
+ silc_snprintf(buf, sizeof(buf) - 1, "%s@%s",
+ client_entry->username, client_entry->hostname);
+ signal_emit("message invite", 4, server, name,
+ client_entry->nickname, buf);
break;
case SILC_NOTIFY_TYPE_JOIN:
if (client_entry == server->conn->local_entry) {
/* You joined to channel */
chanrec = silc_channel_find(server, channel->channel_name);
- if (chanrec != NULL && !chanrec->joined)
+ if (chanrec == NULL)
+ chanrec = silc_channel_create(server, channel->channel_name,
+ channel->channel_name, TRUE);
+ if (!chanrec->joined)
chanrec->entry = channel;
} else {
chanrec = silc_channel_find_entry(server, channel);
}
memset(buf, 0, sizeof(buf));
- if (client_entry->username)
- snprintf(buf, sizeof(buf) - 1, "%s@%s",
- client_entry->username, client_entry->hostname);
+ if (client_entry->username[0])
+ snprintf(buf, sizeof(buf) - 1, "%s@%s",
+ client_entry->username, client_entry->hostname);
signal_emit("message join", 4, server, channel->channel_name,
client_entry->nickname,
- client_entry->username == NULL ? "" : buf);
+ !client_entry->username[0] ? "" : buf);
+
+ /* If there are multiple same nicknames on channel now, tell it to user. */
+ if (client_entry != server->conn->local_entry) {
+ char *nick, tmp[32];
+ int count = 0;
+
+ silc_client_nickname_parse(client, conn, client_entry->nickname, &nick);
+ clients = silc_client_get_clients_local(client, conn, nick, TRUE);
+ if (!clients || silc_dlist_count(clients) < 2) {
+ silc_free(nick);
+ silc_client_list_free(client, conn, clients);
+ break;
+ }
+ silc_dlist_start(clients);
+ while ((client_entry2 = silc_dlist_get(clients)))
+ if (silc_client_on_channel(channel, client_entry2))
+ count++;
+ if (count > 1) {
+ silc_snprintf(tmp, sizeof(tmp), "%d", silc_dlist_count(clients));
+ printformat_module("fe-common/silc", server, channel->channel_name,
+ MSGLEVEL_CRAP, SILCTXT_CHANNEL_MANY_NICKS,
+ tmp, nick);
+ printformat_module("fe-common/silc", server, channel->channel_name,
+ MSGLEVEL_CRAP, SILCTXT_CHANNEL_USER_APPEARS,
+ buf, client_entry->nickname);
+ }
+ silc_client_list_free(client, conn, clients);
+ silc_free(nick);
+ }
break;
case SILC_NOTIFY_TYPE_LEAVE:
snprintf(buf, sizeof(buf) - 1, "%s@%s",
client_entry->username, client_entry->hostname);
signal_emit("message part", 5, server, channel->channel_name,
- client_entry->nickname, client_entry->username ?
+ client_entry->nickname, client_entry->username[0] ?
buf : "", client_entry->nickname);
chanrec = silc_channel_find_entry(server, channel);
if (nickrec != NULL)
nicklist_remove(CHANNEL(chanrec), NICK(nickrec));
}
+
+ /* If there is only one client with this same nickname on channel now
+ change it to the base format if it is formatted nickname. */
+ if (channel) {
+ silc_client_nickname_parse(client, conn, client_entry->nickname, &name);
+ clients = silc_client_get_clients_local(client, conn, name, TRUE);
+ if (!clients || silc_dlist_count(clients) != 2) {
+ silc_free(name);
+ silc_client_list_free(client, conn, clients);
+ break;
+ }
+ silc_dlist_start(clients);
+ client_entry2 = silc_dlist_get(clients);
+ if (client_entry2 == client_entry)
+ client_entry2 = silc_dlist_get(clients);
+ if (silc_client_on_channel(channel, client_entry2)) {
+ silc_snprintf(buf, sizeof(buf), "%s", client_entry2->nickname);
+ silc_client_nickname_format(client, conn, client_entry2, TRUE);
+ if (!silc_utf8_strcasecmp(buf, client_entry2->nickname)) {
+ nicklist_rename_unique(SERVER(server), client_entry2, buf,
+ client_entry2, client_entry2->nickname);
+ printformat_module("fe-common/silc", server, channel->channel_name,
+ MSGLEVEL_CRAP, SILCTXT_CHANNEL_USER_APPEARS,
+ buf, client_entry2->nickname);
+ }
+ }
+ silc_client_list_free(client, conn, clients);
+ silc_free(name);
+ }
break;
case SILC_NOTIFY_TYPE_SIGNOFF:
client_entry = va_arg(va, SilcClientEntry);
tmp = va_arg(va, char *);
+ channel = va_arg(va, SilcChannelEntry);
-#if 0
silc_server_free_ftp(server, client_entry);
-#endif
- /* Print only if we have the nickname. If this cliente has just quit
- when we were only resolving it, it is possible we don't have the
- nickname. */
- if (client_entry->nickname) {
- memset(buf, 0, sizeof(buf));
- if (client_entry->username)
- snprintf(buf, sizeof(buf) - 1, "%s@%s",
- client_entry->username, client_entry->hostname);
- signal_emit("message quit", 4, server, client_entry->nickname,
- client_entry->username ? buf : "",
- tmp ? tmp : "");
- }
+ memset(buf, 0, sizeof(buf));
+ if (client_entry->username)
+ snprintf(buf, sizeof(buf) - 1, "%s@%s",
+ client_entry->username, client_entry->hostname);
+ signal_emit("message quit", 4, server, client_entry->nickname,
+ client_entry->username[0] ? buf : "", tmp ? tmp : "");
list1 = nicklist_get_same_unique(SERVER(server), client_entry);
for (list_tmp = list1; list_tmp != NULL; list_tmp =
nicklist_remove(channel, nickrec);
}
+
+ /* If there is only one client with this same nickname on channel now
+ change it to the base format if it is formatted nickname. */
+ if (channel) {
+ silc_client_nickname_parse(client, conn, client_entry->nickname, &name);
+ clients = silc_client_get_clients_local(client, conn, name, TRUE);
+ if (!clients || silc_dlist_count(clients) != 2) {
+ silc_free(name);
+ silc_client_list_free(client, conn, clients);
+ break;
+ }
+ silc_dlist_start(clients);
+ client_entry2 = silc_dlist_get(clients);
+ if (client_entry2 == client_entry)
+ client_entry2 = silc_dlist_get(clients);
+ if (silc_client_on_channel(channel, client_entry2)) {
+ silc_snprintf(buf, sizeof(buf), "%s", client_entry2->nickname);
+ silc_client_nickname_format(client, conn, client_entry2, TRUE);
+ if (!silc_utf8_strcasecmp(buf, client_entry2->nickname)) {
+ nicklist_rename_unique(SERVER(server), client_entry2, buf,
+ client_entry2, client_entry2->nickname);
+ printformat_module("fe-common/silc", server, channel->channel_name,
+ MSGLEVEL_CRAP, SILCTXT_CHANNEL_USER_APPEARS,
+ buf, client_entry2->nickname);
+ }
+ }
+ silc_client_list_free(client, conn, clients);
+ silc_free(name);
+ }
break;
case SILC_NOTIFY_TYPE_TOPIC_SET:
"server signoff");
}
-#if 0
silc_server_free_ftp(server, client_entry);
-#endif
list1 = nicklist_get_same_unique(SERVER(server), client_entry);
for (list_tmp = list1; list_tmp != NULL; list_tmp =
char *name = (getkey->id_type == SILC_ID_CLIENT ?
((SilcClientEntry)getkey->entry)->nickname :
((SilcServerEntry)getkey->entry)->server_name);
+ SilcPublicKey public_key = (getkey->id_type == SILC_ID_CLIENT ?
+ ((SilcClientEntry)getkey->entry)->public_key :
+ ((SilcServerEntry)getkey->entry)->public_key);
+ SilcSILCPublicKey silc_pubkey;
+
+ silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key);
if (success) {
- printformat_module("fe-common/silc", NULL, NULL,
- MSGLEVEL_CRAP, SILCTXT_PUBKEY_VERIFIED, entity, name);
+ if (getkey->id_type == SILC_ID_CLIENT)
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_PUBKEY_VERIFIED_CLIENT,
+ name,
+ silc_pubkey->identifier.realname ?
+ silc_pubkey->identifier.realname : "",
+ silc_pubkey->identifier.email ?
+ silc_pubkey->identifier.email : "");
+ else
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_PUBKEY_VERIFIED,
+ entity, name);
} else {
printformat_module("fe-common/silc", NULL, NULL,
MSGLEVEL_CRAP, SILCTXT_PUBKEY_NOTVERIFIED,
entity, name);
}
+ /*
+ * Drop our references as need be.
+ */
+ switch (getkey->id_type)
+ {
+ case SILC_ID_CLIENT:
+ silc_client_unref_client(getkey->client, getkey->conn, (SilcClientEntry)getkey->entry);
+ break;
+
+ case SILC_ID_SERVER:
+ silc_client_unref_server(getkey->client, getkey->conn, (SilcServerEntry)getkey->entry);
+ break;
+ }
+
silc_free(getkey);
}
switch(command) {
case SILC_COMMAND_WHOIS:
{
- char buf[1024], *nickname, *username, *realname, nick[128 + 1];
+ char buf[1024], *nickname, *username, *realname, *nick;
unsigned char *fingerprint;
SilcUInt32 idle, mode, *user_modes;
SilcDList channels;
user_modes = va_arg(vp, SilcUInt32 *);
attrs = va_arg(vp, SilcDList);
- silc_parse_userfqdn(nickname, nick, sizeof(nick), NULL, 0);
+ silc_client_nickname_parse(client, conn, client_entry->nickname, &nick);
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
SILCTXT_WHOIS_USERINFO, nickname,
client_entry->username, client_entry->hostname,
nick, client_entry->nickname);
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
SILCTXT_WHOIS_REALNAME, realname);
+ silc_free(nick);
if (channels && user_modes) {
SilcChannelPayload entry;
NICK_REC *ownnick;
if (SILC_STATUS_IS_ERROR(status)) {
+ if (status == SILC_STATUS_ERR_NO_SUCH_SERVER) {
+ char *tmp = va_arg(vp, char *);
+ if (tmp)
+ silc_say_error("JOIN: %s: %s", tmp,
+ silc_get_status_message(status));
+ return;
+ }
+ if (status == SILC_STATUS_ERR_NO_SUCH_CHANNEL) {
+ char *tmp = va_arg(vp, char *);
+ if (tmp)
+ silc_say_error("JOIN: %s: %s", tmp,
+ silc_get_status_message(status));
+ return;
+ }
silc_say_error("JOIN: %s", silc_get_status_message(status));
return;
}
/* Get user list */
while (silc_hash_table_get(user_list, NULL, (void *)&chu)) {
- if (!chu->client->nickname)
+ if (!chu->client->nickname[0])
continue;
if (chu->mode & SILC_CHANNEL_UMODE_CHANFO)
founder = chu->client;
if (!ownnick)
break;
nicklist_set_own(CHANNEL(chanrec), ownnick);
- signal_emit("channel joined", 1, chanrec);
chanrec->entry = channel_entry;
+ signal_emit("channel joined", 1, chanrec);
if (chanrec->topic)
printformat_module("fe-common/silc", server,
SilcClientEntry e = chu->client;
char stat[5], *mode;
- if (!e->nickname)
+ if (!e->nickname[0])
continue;
memset(stat, 0, sizeof(stat));
printformat_module("fe-common/silc", server, channel->channel_name,
MSGLEVEL_CRAP, SILCTXT_USERS,
e->nickname, stat,
- e->username ? e->username : "",
- e->hostname ? e->hostname : "",
+ e->username[0] ? e->username : "",
+ e->hostname[0] ? e->hostname : "",
e->realname ? e->realname : "");
if (mode)
silc_free(mode);
((SilcClientEntry)entry)->nickname :
((SilcServerEntry)entry)->server_name);
+ switch (id_type)
+ {
+ case SILC_ID_CLIENT:
+ name = ((SilcClientEntry)entry)->nickname;
+ silc_client_ref_client(client, conn, (SilcClientEntry)entry);
+ break;
+
+ case SILC_ID_SERVER:
+ name = ((SilcServerEntry)entry)->server_name;
+ silc_client_ref_server(client, conn, (SilcServerEntry)entry);
+ break;
+ }
+
silc_verify_public_key_internal(client, conn, name,
(id_type == SILC_ID_CLIENT ?
SILC_CONN_CLIENT :
void *context;
} *PublicKeyVerify;
-static void verify_public_key_completion(const char *line, void *context)
+static void verify_public_key_completion(const char *line, void *context,
+ SilcKeyboardPromptStatus reason)
{
PublicKeyVerify verify = (PublicKeyVerify)context;
+ bool success = (reason == KeyboardCompletionSuccess);
- if (line[0] == 'Y' || line[0] == 'y') {
+ if (success && (line[0] == 'Y' || line[0] == 'y')) {
/* Call the completion */
if (verify->completion)
verify->completion(TRUE, verify->context);
verify->entity);
}
+ /*
+ * If we were not called due to a failure to begin the callback, then we
+ * shall zero the async context block in the server record. If we were
+ * called due to a failure to begin the callback, then it is possible that
+ * we failed due to an overlapping callback, in which case we shouldn't
+ * overwrite the async context block pointer.
+ */
+
+ if (reason != KeyboardCompletionFailed)
+ {
+ /*
+ * Null out the completion context in the server record as this operation
+ * is done as far as we are concerned. The underlying keyboard library
+ * routine will take care of freeing the async context memory when the
+ * actual callback is called by irssi in the abort case. In the success
+ * case, it will free the async context memory after we return from this
+ * routine.
+ */
+
+ SILC_SERVER_REC *server = (SILC_SERVER_REC*)(verify->conn->context);
+
+ server->prompt_op = NULL;
+ }
+
silc_free(verify->filename);
silc_free(verify->entity);
silc_free(verify->entity_name);
char file[256], filename[256], filename2[256], *ipf, *hostf = NULL;
char *fingerprint, *babbleprint, *format;
SilcPublicKey local_pubkey;
+ SilcSILCPublicKey silc_pubkey;
SilcUInt16 port;
+ SILC_SERVER_REC *server;
const char *hostname, *ip;
unsigned char *pk;
SilcUInt32 pk_len;
"server" : "client");
int i;
+ server = (SILC_SERVER_REC*)conn->context;
+
+ /*
+ * If we don't have a context yet, then we'll set it up based on the
+ * stream context associated with the SilcPacketStream that is attached
+ * to the SilcClientConnection. This is a bit ugly, but we need to have a
+ * per-connection context value to perform the public key verify operation,
+ * and the public API was not designed to let us have this in a particularly
+ * straightforward fashion.
+ */
+
+ if (!server) {
+ SilcPacketStream packet_stream;
+ SilcStream stream;
+
+ packet_stream = conn->stream;
+
+ if (!packet_stream)
+ {
+ if (completion)
+ completion(FALSE, context);
+ return;
+ }
+
+ stream = silc_packet_stream_get_stream(packet_stream);
+
+ if (!stream)
+ {
+ if (completion)
+ completion(FALSE, context);
+ return;
+ }
+
+ server = (SILC_SERVER_REC*)(silc_socket_stream_get_context(stream));
+
+ if (!server)
+ {
+ if (completion)
+ completion(FALSE, context);
+ return;
+ }
+
+ conn->context = (void *)server;
+ }
+
if (silc_pkcs_get_type(public_key) != SILC_PKCS_SILC) {
printformat_module("fe-common/silc", NULL, NULL,
MSGLEVEL_CRAP, SILCTXT_PUBKEY_UNSUPPORTED,
return;
}
+ silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key);
+
pw = getpwuid(getuid());
if (!pw) {
if (completion)
completion(FALSE, context);
+ silc_free(pk);
return;
}
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_RECEIVED,verify->entity_name ?
verify->entity_name : entity);
+ if (conn_type == SILC_CONN_CLIENT && name &&
+ silc_pubkey->identifier.realname)
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_RECEIVED_CLIENT, name,
+ silc_pubkey->identifier.realname,
+ silc_pubkey->identifier.email ?
+ silc_pubkey->identifier.email : "");
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,
- format, 0, verify);
+ silc_keyboard_entry_redirect(verify_public_key_completion,
+ format, 0, verify, &server->prompt_op);
g_free(format);
silc_free(fingerprint);
+ silc_free(babbleprint);
+ silc_free(pk);
return;
} else {
/* The key already exists, verify it. */
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_RECEIVED,verify->entity_name ?
verify->entity_name : entity);
+ if (conn_type == SILC_CONN_CLIENT && name &&
+ silc_pubkey->identifier.realname)
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_RECEIVED_CLIENT, name,
+ silc_pubkey->identifier.realname,
+ silc_pubkey->identifier.email ?
+ silc_pubkey->identifier.email : "");
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_COULD_NOT_LOAD, entity);
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_ACCEPT_ANYWAY);
- keyboard_entry_redirect((SIGNAL_FUNC)verify_public_key_completion,
- format, 0, verify);
+ silc_keyboard_entry_redirect(verify_public_key_completion,
+ format, 0, verify, &server->prompt_op);
g_free(format);
silc_free(fingerprint);
+ silc_free(babbleprint);
+ silc_free(pk);
return;
}
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_RECEIVED,verify->entity_name ?
verify->entity_name : entity);
+ if (conn_type == SILC_CONN_CLIENT && name &&
+ silc_pubkey->identifier.realname)
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_RECEIVED_CLIENT, name,
+ silc_pubkey->identifier.realname,
+ silc_pubkey->identifier.email ?
+ silc_pubkey->identifier.email : "");
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_MALFORMED, entity);
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_ACCEPT_ANYWAY);
- keyboard_entry_redirect((SIGNAL_FUNC)verify_public_key_completion,
- format, 0, verify);
+ silc_keyboard_entry_redirect(verify_public_key_completion,
+ format, 0, verify, &server->prompt_op);
g_free(format);
silc_free(fingerprint);
+ silc_free(babbleprint);
+ silc_free(pk);
return;
}
+ silc_pkcs_public_key_free(local_pubkey);
/* Compare the keys */
if (memcmp(encpk, pk, encpk_len)) {
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_RECEIVED,verify->entity_name ?
verify->entity_name : entity);
+ if (conn_type == SILC_CONN_CLIENT && name &&
+ silc_pubkey->identifier.realname)
+ printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
+ SILCTXT_PUBKEY_RECEIVED_CLIENT, name,
+ silc_pubkey->identifier.realname,
+ silc_pubkey->identifier.email ?
+ silc_pubkey->identifier.email : "");
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
SILCTXT_PUBKEY_FINGERPRINT, entity, fingerprint);
printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CRAP,
/* Ask user to verify the key and save it */
format = format_get_text("fe-common/silc", NULL, NULL, NULL,
SILCTXT_PUBKEY_ACCEPT_ANYWAY);
- keyboard_entry_redirect((SIGNAL_FUNC)verify_public_key_completion,
- format, 0, verify);
+ silc_keyboard_entry_redirect(verify_public_key_completion,
+ format, 0, verify, &server->prompt_op);
g_free(format);
silc_free(fingerprint);
+ silc_free(babbleprint);
silc_free(encpk);
+ silc_free(pk);
return;
}
completion(TRUE, context);
silc_free(encpk);
silc_free(fingerprint);
+ silc_free(babbleprint);
silc_free(verify->filename);
silc_free(verify->entity);
silc_free(verify->entity_name);
silc_free(verify);
+ silc_free(pk);
}
}
typedef struct {
SilcAskPassphrase completion;
+ SilcClientConnection conn;
void *context;
} *AskPassphrase;
-void ask_passphrase_completion(const char *passphrase, void *context)
+void ask_passphrase_completion(const char *passphrase, void *context,
+ SilcKeyboardPromptStatus reason)
{
AskPassphrase p = (AskPassphrase)context;
if (passphrase && passphrase[0] == '\0')
passphrase = NULL;
p->completion((unsigned char *)passphrase,
passphrase ? strlen(passphrase) : 0, p->context);
+
+ if (reason != KeyboardCompletionFailed)
+ {
+ SILC_SERVER_REC *server = (SILC_SERVER_REC *)(p->conn->context);
+
+ server->prompt_op = NULL;
+ }
+
silc_free(p);
}
void silc_ask_passphrase(SilcClient client, SilcClientConnection conn,
SilcAskPassphrase completion, void *context)
{
+ SILC_SERVER_REC *server = (SILC_SERVER_REC*)(conn->context);
AskPassphrase p = silc_calloc(1, sizeof(*p));
+
p->completion = completion;
- p->context = context;
+ p->conn = conn;
+ p->context = context;
- keyboard_entry_redirect((SIGNAL_FUNC)ask_passphrase_completion,
- "Passphrase: ", ENTRY_REDIRECT_FLAG_HIDDEN, p);
+ silc_keyboard_entry_redirect(ask_passphrase_completion,
+ "Passphrase: ", ENTRY_REDIRECT_FLAG_HIDDEN, p, &server->prompt_op);
}
typedef struct {
void *context;
} *GetAuthMethod;
-static void silc_get_auth_ask_passphrase(unsigned char *passphrase,
+static void silc_get_auth_ask_passphrase(const unsigned char *passphrase,
SilcUInt32 passphrase_len,
void *context)
{