diff options
author | Tom Smeding <tom.smeding@gmail.com> | 2020-09-14 17:14:47 +0200 |
---|---|---|
committer | Tom Smeding <tom.smeding@gmail.com> | 2020-09-14 17:15:15 +0200 |
commit | 535566cf29c045a954dc87f6072ccf90da778818 (patch) | |
tree | 76c400f35447fa900b2ad54c904d26f2a3e7580b | |
parent | 78b5312816498315acc921b05c8980a534dfecbb (diff) |
server/protocol: Add 'change_password' command
-rw-r--r-- | command.c | 20 | ||||
-rw-r--r-- | protocol.md | 3 |
2 files changed, 21 insertions, 2 deletions
@@ -98,6 +98,21 @@ static struct cmd_retval cmd_logout(struct conn_data *data,const char *tag,const return RET_OK; } +static struct cmd_retval cmd_change_password(struct conn_data *data, const char *tag, const char **args) { + // TODO: use sodium_mlock correctly for the password + + // Note: this function has exactly ONE return point, so that it is easier + // to see that we indeed return MEMZERO. + + if (data->userid == -1) { + net_send_error(data->fd, tag, "Not logged in"); + } else { + db_set_pass(data->userid, args[0]); + net_send_ok(data->fd, tag); + } + return RET_MEMZERO; +} + static struct cmd_retval cmd_list_rooms(struct conn_data *data,const char *tag,const char **args){ (void)args; if(data->userid==-1){ @@ -465,8 +480,8 @@ struct cmd_info{ // Use CommandHash.hs to re-generate this perfect hash function for a different // list of commands. -#define COMMAND_HASH_MODULUS 34 -#define COMMAND_HASH(cmd0, len) ((4 * cmd0 + 7 * len) % COMMAND_HASH_MODULUS) +#define COMMAND_HASH_MODULUS 35 +#define COMMAND_HASH(cmd0, len) ((1 * cmd0 + 6 * len) % COMMAND_HASH_MODULUS) #define COMMAND_ENTRY(cmd0, cmd, nargs, longlast, handler) \ [COMMAND_HASH(cmd0, strlen(cmd))] = {cmd, nargs, longlast, handler} @@ -478,6 +493,7 @@ static const struct cmd_info commands[COMMAND_HASH_MODULUS] = { COMMAND_ENTRY('r', "register", 2, true, cmd_register), COMMAND_ENTRY('l', "login", 2, true, cmd_login), COMMAND_ENTRY('l', "logout", 0, false, cmd_logout), + COMMAND_ENTRY('c', "change_password", 1, true, cmd_change_password), COMMAND_ENTRY('l', "list_rooms", 0, false, cmd_list_rooms), COMMAND_ENTRY('l', "list_members", 1, false, cmd_list_members), COMMAND_ENTRY('c', "create_room", 0, false, cmd_create_room), diff --git a/protocol.md b/protocol.md index 1b31f47..f3db156 100644 --- a/protocol.md +++ b/protocol.md @@ -107,6 +107,9 @@ tomsg server. - `<tag> login <user:word> <pass:string...>` - Logs in as the specified user. - Returns `ok` or `error`. +- `<tag> change_password <pass:string...>` + - Changes the password of the current user to the given string. + - Returns `ok` or `error`. - `<tag> logout` - Logs out of the user the client is currently logged in as. If the client is not logged in, does nothing. |