From ac410445af65b9d332d4606a08ff549672042766 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Thu, 27 Feb 2020 01:22:05 +0200 Subject: [PATCH] Add option for legacy authentication New options: /connect [auth default|legacy] /account set auth default|legacy Fixes #1236. --- src/command/cmd_ac.c | 90 +++++++++++++++++++++++++- src/command/cmd_defs.c | 9 ++- src/command/cmd_funcs.c | 33 +++++++++- src/config/account.c | 15 ++++- src/config/account.h | 4 +- src/config/accounts.c | 20 +++++- src/config/accounts.h | 3 +- src/event/client_events.c | 4 +- src/event/client_events.h | 2 +- src/ui/console.c | 3 + src/xmpp/connection.c | 34 ++++++++-- src/xmpp/connection.h | 2 +- src/xmpp/session.c | 19 ++++-- src/xmpp/xmpp.h | 2 +- tests/unittests/config/stub_accounts.c | 1 + tests/unittests/test_cmd_account.c | 14 ++-- tests/unittests/test_cmd_connect.c | 8 +-- tests/unittests/test_cmd_join.c | 8 +-- tests/unittests/test_cmd_otr.c | 2 +- tests/unittests/test_cmd_rooms.c | 4 +- tests/unittests/xmpp/stub_xmpp.c | 3 +- 21 files changed, 234 insertions(+), 46 deletions(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 94081510..09de573c 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -195,6 +195,7 @@ static Autocomplete omemo_sendfile_ac; #endif static Autocomplete connect_property_ac; static Autocomplete tls_property_ac; +static Autocomplete auth_property_ac; static Autocomplete alias_ac; static Autocomplete aliases_ac; static Autocomplete join_property_ac; @@ -425,6 +426,7 @@ cmd_ac_init(void) autocomplete_add(account_set_ac, "pgpkeyid"); autocomplete_add(account_set_ac, "startscript"); autocomplete_add(account_set_ac, "tls"); + autocomplete_add(account_set_ac, "auth"); autocomplete_add(account_set_ac, "theme"); account_clear_ac = autocomplete_new(); @@ -686,6 +688,7 @@ cmd_ac_init(void) #endif connect_property_ac = autocomplete_new(); + autocomplete_add(connect_property_ac, "auth"); autocomplete_add(connect_property_ac, "server"); autocomplete_add(connect_property_ac, "port"); autocomplete_add(connect_property_ac, "tls"); @@ -697,6 +700,10 @@ cmd_ac_init(void) autocomplete_add(tls_property_ac, "legacy"); autocomplete_add(tls_property_ac, "disable"); + auth_property_ac = autocomplete_new(); + autocomplete_add(auth_property_ac, "default"); + autocomplete_add(auth_property_ac, "legacy"); + join_property_ac = autocomplete_new(); autocomplete_add(join_property_ac, "nick"); autocomplete_add(join_property_ac, "password"); @@ -1263,6 +1270,7 @@ cmd_ac_reset(ProfWin *window) #endif autocomplete_reset(connect_property_ac); autocomplete_reset(tls_property_ac); + autocomplete_reset(auth_property_ac); autocomplete_reset(alias_ac); autocomplete_reset(aliases_ac); autocomplete_reset(join_property_ac); @@ -1419,6 +1427,7 @@ cmd_ac_uninit(void) #endif autocomplete_free(connect_property_ac); autocomplete_free(tls_property_ac); + autocomplete_free(auth_property_ac); autocomplete_free(alias_ac); autocomplete_free(aliases_ac); autocomplete_free(join_property_ac); @@ -3206,7 +3215,7 @@ _connect_autocomplete(ProfWin *window, const char *const input, gboolean previou char *found = NULL; gboolean result = FALSE; - gchar **args = parse_args(input, 1, 7, &result); + gchar **args = parse_args(input, 1, 9, &result); if (result) { gboolean space_at_end = g_str_has_suffix(input, " "); @@ -3274,6 +3283,74 @@ _connect_autocomplete(ProfWin *window, const char *const input, gboolean previou return found; } } + if ((num_args == 7 && space_at_end) || (num_args == 8 && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s %s %s %s %s %s", args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + found = autocomplete_param_with_ac(input, beginning->str, connect_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } + if ((num_args == 8 && space_at_end && (g_strcmp0(args[7], "tls") == 0)) + || (num_args == 9 && (g_strcmp0(args[7], "tls") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s %s %s %s %s %s %s", args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); + found = autocomplete_param_with_ac(input, beginning->str, tls_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } + + /* auth option */ + + if ((num_args == 2 && space_at_end && (g_strcmp0(args[1], "auth") == 0)) + || (num_args == 3 && (g_strcmp0(args[1], "auth") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s", args[0], args[1]); + found = autocomplete_param_with_ac(input, beginning->str, auth_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } + if ((num_args == 4 && space_at_end && (g_strcmp0(args[3], "auth") == 0)) + || (num_args == 5 && (g_strcmp0(args[3], "auth") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s %s %s", args[0], args[1], args[2], args[3]); + found = autocomplete_param_with_ac(input, beginning->str, auth_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } + if ((num_args == 6 && space_at_end && (g_strcmp0(args[5], "auth") == 0)) + || (num_args == 7 && (g_strcmp0(args[5], "auth") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s %s %s %s %s", args[0], args[1], args[2], args[3], args[4], args[5]); + found = autocomplete_param_with_ac(input, beginning->str, auth_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } + if ((num_args == 8 && space_at_end && (g_strcmp0(args[7], "auth") == 0)) + || (num_args == 9 && (g_strcmp0(args[7], "auth") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/connect"); + g_string_append_printf(beginning, " %s %s %s %s %s %s %s %s", args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); + found = autocomplete_param_with_ac(input, beginning->str, auth_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } } g_strfreev(args); @@ -3484,6 +3561,17 @@ _account_autocomplete(ProfWin *window, const char *const input, gboolean previou return found; } } + if ((num_args == 3 && space_at_end && (g_strcmp0(args[2], "auth") == 0)) + || (num_args == 4 && (g_strcmp0(args[2], "auth") == 0) && !space_at_end)) { + GString *beginning = g_string_new("/account"); + g_string_append_printf(beginning, " %s %s %s", args[0], args[1], args[2]); + found = autocomplete_param_with_ac(input, beginning->str, auth_property_ac, TRUE, previous); + g_string_free(beginning, TRUE); + if (found) { + g_strfreev(args); + return found; + } + } if ((num_args == 3 && space_at_end && (g_strcmp0(args[2], "startscript") == 0)) || (num_args == 4 && (g_strcmp0(args[2], "startscript") == 0) && !space_at_end)) { GString *beginning = g_string_new("/account"); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 70331542..85140430 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -160,7 +160,7 @@ static struct cmd_t command_defs[] = CMD_TAG_CONNECTION) CMD_SYN( "/connect []", - "/connect [server ] [port ] [tls force|allow|trust|legacy|disable]") + "/connect [server ] [port ] [tls force|allow|trust|legacy|disable] [auth default|legacy]") CMD_DESC( "Login to a chat service. " "If no account is specified, the default is used if one is configured. " @@ -173,7 +173,9 @@ static struct cmd_t command_defs[] = { "tls allow", "Use TLS for the connection if it is available." }, { "tls trust", "Force TLS connection and trust server's certificate." }, { "tls legacy", "Use legacy TLS for the connection. It means server doesn't support STARTTLS and TLS is forced just after TCP connection is established." }, - { "tls disable", "Disable TLS for the connection." }) + { "tls disable", "Disable TLS for the connection." }, + { "auth default", "Default authentication process." }, + { "auth legacy", "Allow legacy authentication." }) CMD_EXAMPLES( "/connect", "/connect odin@valhalla.edda", @@ -2003,6 +2005,7 @@ static struct cmd_t command_defs[] = "/account set pgpkeyid ", "/account set startscript