X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fcommand.c;h=b449b1150ed9da09d1d1eccd113d1f948bf63754;hb=017dec75a98209fbef49eb496c2269b0c49e736d;hp=6a8335fe7ab5da1cf710c3b6d45e37d33f0c03ff;hpb=20cf6a02a72e97a63a93ffb478d02fee4fbb9e38;p=silc.git diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index 6a8335fe..b449b115 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -320,8 +320,6 @@ SILC_CLIENT_CMD_FUNC(identify) } if (cmd->argc < 2 || cmd->argc > 3) { - cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Usage: /IDENTIFY [@] []"); COMMAND_ERROR; goto out; } @@ -551,8 +549,8 @@ SILC_CLIENT_CMD_FUNC(invite) SilcClientEntry client_entry = NULL; SilcChannelEntry channel; SilcBuffer buffer, clidp, chidp; - uint32 num = 0, type = 0; - char *nickname = NULL, *server = NULL, *name; + uint32 type = 0; + char *nickname = NULL, *name; char *invite = NULL; if (!cmd->conn) { @@ -593,21 +591,16 @@ SILC_CLIENT_CMD_FUNC(invite) /* Parse the typed nickname. */ if (cmd->argc == 3) { if (cmd->argv[2][0] != '+' && cmd->argv[2][0] != '-') { - if (!silc_parse_nickname(cmd->argv[2], &nickname, &server, &num)) { - cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Bad nickname"); - COMMAND_ERROR; - goto out; - } - + if (client->params->nickname_parse) + client->params->nickname_parse(cmd->argv[2], &nickname); + else + nickname = strdup(cmd->argv[2]); + /* Find client entry */ client_entry = silc_idlist_get_client(client, conn, nickname, - server, num, TRUE); + cmd->argv[2], TRUE); if (!client_entry) { - if (nickname) - silc_free(nickname); - if (server) - silc_free(server); + silc_free(nickname); if (cmd->pending) { COMMAND_ERROR; @@ -662,10 +655,7 @@ SILC_CLIENT_CMD_FUNC(invite) COMMAND; out: - if (nickname) - silc_free(nickname); - if (server) - silc_free(server); + silc_free(nickname); silc_client_command_free(cmd); } @@ -733,11 +723,11 @@ SILC_CLIENT_CMD_FUNC(quit) SILC_CLIENT_CMD_FUNC(kill) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; + SilcClient client = cmd->client; SilcClientConnection conn = cmd->conn; SilcBuffer buffer, idp; SilcClientEntry target; - uint32 num = 0; - char *nickname = NULL, *server = NULL; + char *nickname = NULL; if (!cmd->conn) { SILC_NOT_CONNECTED(cmd->client, cmd->conn); @@ -753,20 +743,16 @@ SILC_CLIENT_CMD_FUNC(kill) } /* Parse the typed nickname. */ - if (!silc_parse_nickname(cmd->argv[1], &nickname, &server, &num)) { - cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Bad nickname"); - COMMAND_ERROR; - goto out; - } + if (client->params->nickname_parse) + client->params->nickname_parse(cmd->argv[1], &nickname); + else + nickname = strdup(cmd->argv[1]); /* Get the target client */ target = silc_idlist_get_client(cmd->client, conn, nickname, - server, num, TRUE); + cmd->argv[1], TRUE); if (!target) { silc_free(nickname); - if (server) - silc_free(server); if (cmd->pending) { COMMAND_ERROR; @@ -803,10 +789,7 @@ SILC_CLIENT_CMD_FUNC(kill) COMMAND; out: - if (nickname) - silc_free(nickname); - if (server) - silc_free(server); + silc_free(nickname); silc_client_command_free(cmd); } @@ -1332,6 +1315,7 @@ SILC_CLIENT_CMD_FUNC(cmode) SILC_CLIENT_CMD_FUNC(cumode) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; + SilcClient client = cmd->client; SilcClientConnection conn = cmd->conn; SilcChannelEntry channel; SilcChannelUser chu; @@ -1339,8 +1323,7 @@ SILC_CLIENT_CMD_FUNC(cumode) SilcBuffer buffer, clidp, chidp, auth = NULL; unsigned char *name, *cp, modebuf[4]; uint32 mode = 0, add, len; - char *nickname = NULL, *server = NULL; - uint32 num = 0; + char *nickname = NULL; int i; if (!cmd->conn) { @@ -1378,16 +1361,17 @@ SILC_CLIENT_CMD_FUNC(cumode) } /* Parse the typed nickname. */ - if (!silc_parse_nickname(cmd->argv[3], &nickname, &server, &num)) { - cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, "Bad nickname"); - COMMAND_ERROR; - goto out; - } + if (client->params->nickname_parse) + client->params->nickname_parse(cmd->argv[3], &nickname); + else + nickname = strdup(cmd->argv[3]); /* Find client entry */ - client_entry = silc_idlist_get_client(cmd->client, conn, - nickname, server, num, TRUE); + client_entry = silc_idlist_get_client(cmd->client, conn, nickname, + cmd->argv[3], TRUE); if (!client_entry) { + silc_free(nickname); + if (cmd->pending) { COMMAND_ERROR; goto out; @@ -1488,10 +1472,7 @@ SILC_CLIENT_CMD_FUNC(cumode) COMMAND; out: - if (nickname) - silc_free(nickname); - if (server) - silc_free(server); + silc_free(nickname); silc_client_command_free(cmd); } @@ -1500,14 +1481,14 @@ SILC_CLIENT_CMD_FUNC(cumode) SILC_CLIENT_CMD_FUNC(kick) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; + SilcClient client = cmd->client; SilcClientConnection conn = cmd->conn; SilcIDCacheEntry id_cache = NULL; SilcChannelEntry channel; SilcBuffer buffer, idp, idp2; SilcClientEntry target; char *name; - uint32 num = 0; - char *nickname = NULL, *server = NULL; + char *nickname = NULL; if (!cmd->conn) { SILC_NOT_CONNECTED(cmd->client, cmd->conn); @@ -1552,16 +1533,14 @@ SILC_CLIENT_CMD_FUNC(kick) channel = (SilcChannelEntry)id_cache->context; /* Parse the typed nickname. */ - if (!silc_parse_nickname(cmd->argv[2], &nickname, &server, &num)) { - cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Bad nickname"); - COMMAND_ERROR; - goto out; - } + if (client->params->nickname_parse) + client->params->nickname_parse(cmd->argv[2], &nickname); + else + nickname = strdup(cmd->argv[2]); /* Get the target client */ target = silc_idlist_get_client(cmd->client, conn, nickname, - server, num, FALSE); + cmd->argv[2], FALSE); if (!target) { cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, "No such client: %s", @@ -1593,10 +1572,7 @@ SILC_CLIENT_CMD_FUNC(kick) COMMAND; out: - if (nickname) - silc_free(nickname); - if (server) - silc_free(server); + silc_free(nickname); silc_client_command_free(cmd); } @@ -1607,11 +1583,15 @@ static void silc_client_command_oper_send(unsigned char *data, SilcClientConnection conn = cmd->conn; SilcBuffer buffer, auth; - if (cmd->argc == 3) { - /* Pulic key auth XXX TODO */ - auth = NULL; + if (cmd->argc >= 3) { + /* Encode the public key authentication payload */ + auth = silc_auth_public_key_auth_generate(cmd->client->public_key, + cmd->client->private_key, + conn->hash, + conn->local_id, + SILC_ID_CLIENT); } else { - /* Encode the authentication payload */ + /* Encode the password authentication payload */ auth = silc_auth_payload_encode(SILC_AUTH_PASSWORD, NULL, 0, data, data_len); } @@ -1636,8 +1616,6 @@ SILC_CLIENT_CMD_FUNC(oper) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; SilcClientConnection conn = cmd->conn; - unsigned char *auth_data; - uint32 auth_data_len = 0; if (!cmd->conn) { SILC_NOT_CONNECTED(cmd->client, cmd->conn); @@ -1647,17 +1625,12 @@ SILC_CLIENT_CMD_FUNC(oper) if (cmd->argc < 2) { cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Usage: /OPER []"); + "Usage: /OPER [-pubkey]"); COMMAND_ERROR; goto out; } - if (cmd->argc == 3) { - /* XXX Get public key */ - auth_data = NULL; - COMMAND_ERROR; - goto out; - } else { + if (cmd->argc < 3) { /* Get passphrase */ cmd->client->ops->ask_passphrase(cmd->client, conn, silc_client_command_oper_send, @@ -1665,13 +1638,7 @@ SILC_CLIENT_CMD_FUNC(oper) return; } - silc_client_command_oper_send(auth_data, auth_data_len, context); - - memset(auth_data, 0, auth_data_len); - silc_free(auth_data); - - /* Notify application */ - COMMAND; + silc_client_command_oper_send(NULL, 0, context); out: silc_client_command_free(cmd); @@ -1684,11 +1651,15 @@ static void silc_client_command_silcoper_send(unsigned char *data, SilcClientConnection conn = cmd->conn; SilcBuffer buffer, auth; - if (cmd->argc == 3) { - /* Pulic key auth XXX TODO */ - auth = NULL; + if (cmd->argc >= 3) { + /* Encode the public key authentication payload */ + auth = silc_auth_public_key_auth_generate(cmd->client->public_key, + cmd->client->private_key, + conn->hash, + conn->local_id, + SILC_ID_CLIENT); } else { - /* Encode the authentication payload */ + /* Encode the password authentication payload */ auth = silc_auth_payload_encode(SILC_AUTH_PASSWORD, NULL, 0, data, data_len); } @@ -1713,8 +1684,6 @@ SILC_CLIENT_CMD_FUNC(silcoper) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; SilcClientConnection conn = cmd->conn; - unsigned char *auth_data; - uint32 auth_data_len = 0; if (!cmd->conn) { SILC_NOT_CONNECTED(cmd->client, cmd->conn); @@ -1724,17 +1693,12 @@ SILC_CLIENT_CMD_FUNC(silcoper) if (cmd->argc < 2) { cmd->client->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Usage: /SILCOPER []"); + "Usage: /SILCOPER [-pubkey]"); COMMAND_ERROR; goto out; } - if (cmd->argc == 3) { - /* XXX Get public key */ - auth_data = NULL; - COMMAND_ERROR; - goto out; - } else { + if (cmd->argc < 3) { /* Get passphrase */ cmd->client->ops->ask_passphrase(cmd->client, conn, silc_client_command_silcoper_send, @@ -1742,13 +1706,7 @@ SILC_CLIENT_CMD_FUNC(silcoper) return; } - silc_client_command_silcoper_send(auth_data, auth_data_len, context); - - memset(auth_data, 0, auth_data_len); - silc_free(auth_data); - - /* Notify application */ - COMMAND; + silc_client_command_silcoper_send(NULL, 0, context); out: silc_client_command_free(cmd); @@ -2079,8 +2037,7 @@ SILC_CLIENT_CMD_FUNC(getkey) SilcClient client = cmd->client; SilcClientEntry client_entry = NULL; SilcServerEntry server_entry = NULL; - uint32 num = 0; - char *nickname = NULL, *server = NULL; + char *nickname = NULL; SilcBuffer idp, buffer; if (!cmd->conn) { @@ -2097,18 +2054,17 @@ SILC_CLIENT_CMD_FUNC(getkey) } /* Parse the typed nickname. */ - if (!silc_parse_nickname(cmd->argv[1], &nickname, &server, &num)) { - client->ops->say(client, conn, SILC_CLIENT_MESSAGE_INFO, "Bad nickname"); - COMMAND_ERROR; - goto out; - } + if (client->params->nickname_parse) + client->params->nickname_parse(cmd->argv[1], &nickname); + else + nickname = strdup(cmd->argv[1]); /* Find client entry */ - client_entry = silc_idlist_get_client(client, conn, nickname, server, num, + client_entry = silc_idlist_get_client(client, conn, nickname, cmd->argv[1], FALSE); if (!client_entry) { /* Check whether user requested server actually */ - server_entry = silc_client_get_server(client, conn, nickname); + server_entry = silc_client_get_server(client, conn, cmd->argv[1]); if (!server_entry) { /* No. what ever user wants we don't have it, so resolve it. We @@ -2116,7 +2072,7 @@ SILC_CLIENT_CMD_FUNC(getkey) bound to be wrong. */ /* This will send the IDENTIFY command */ - silc_idlist_get_client(client, conn, nickname, server, num, TRUE); + silc_idlist_get_client(client, conn, nickname, cmd->argv[1], TRUE); silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, silc_client_command_destructor, @@ -2126,7 +2082,7 @@ SILC_CLIENT_CMD_FUNC(getkey) /* This sends the INFO command to resolve the server. */ silc_client_send_command(client, conn, SILC_COMMAND_INFO, ++conn->cmd_ident, 1, - 1, nickname, strlen(nickname)); + 1, cmd->argv[1], cmd->argv_lens[1]); silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, silc_client_command_destructor, @@ -2134,6 +2090,7 @@ SILC_CLIENT_CMD_FUNC(getkey) silc_client_command_dup(cmd)); cmd->pending = 1; + silc_free(nickname); return; } @@ -2153,5 +2110,6 @@ SILC_CLIENT_CMD_FUNC(getkey) COMMAND; out: + silc_free(nickname); silc_client_command_free(cmd); }