1: -module(auth_methods_for_c2s_SUITE).
    2: 
    3: -compile([export_all, nowarn_export_all]).
    4: 
    5: -include_lib("common_test/include/ct.hrl").
    6: -include_lib("eunit/include/eunit.hrl").
    7: -include_lib("exml/include/exml.hrl").
    8: 
    9: -import(distributed_helper, [mim/0, rpc/4]).
   10: 
   11: all() ->
   12:     [{group, two_methods_enabled}].
   13: 
   14: groups() ->
   15:     [{two_methods_enabled, [parallel],
   16:       [can_login_with_allowed_method,
   17:        cannot_login_with_not_allowed_method,
   18:        can_login_to_another_listener]}].
   19: 
   20: init_per_suite(Config) ->
   21:     Config0 = escalus:init_per_suite(Config),
   22:     Config1 = ejabberd_node_utils:init(Config0),
   23:     ejabberd_node_utils:backup_config_file(Config1),
   24:     Config1.
   25: 
   26: end_per_suite(Config) ->
   27:     ejabberd_node_utils:restore_config_file(Config),
   28:     ejabberd_node_utils:restart_application(mongooseim),
   29:     escalus:end_per_suite(Config).
   30: 
   31: init_per_group(_, Config) ->
   32:     modify_config_and_restart(Config),
   33:     escalus_cleaner:start(Config).
   34: 
   35: end_per_group(_, _Config) ->
   36:     escalus_fresh:clean().
   37: 
   38: init_per_testcase(TC, Config) ->
   39:     Spec = escalus_fresh:freshen_spec(Config, alice),
   40:     Clean = register_internal_user(Spec),
   41:     [{clean_fn, Clean}, {spec, Spec}|escalus:init_per_testcase(TC, Config)].
   42: 
   43: end_per_testcase(TC, Config) ->
   44:     Clean = proplists:get_value(clean_fn, Config),
   45:     Clean(),
   46:     escalus:end_per_testcase(TC, Config).
   47: 
   48: modify_config_and_restart(Config) ->
   49:     NewConfigValues = [{auth_method, "internal]\n  [auth.dummy"},
   50:                        {auth_method_opts, false},
   51:                        {allowed_auth_methods, "\"internal\""}],
   52:     ejabberd_node_utils:modify_config_file(NewConfigValues, Config),
   53:     ejabberd_node_utils:restart_application(mongooseim).
   54: 
   55: can_login_with_allowed_method(Config) ->
   56:     Spec = proplists:get_value(spec, Config),
   57:     {ok, _, _} = escalus_connection:start(Spec).
   58: 
   59: cannot_login_with_not_allowed_method(Config) ->
   60:     Spec = proplists:get_value(spec, Config),
   61:     {error, _} = escalus_connection:start([{password, <<"wrong">>}|Spec]).
   62: 
   63: can_login_to_another_listener(Config) ->
   64:     Spec = proplists:get_value(spec, Config),
   65:     Spec2 = [{port, ct:get_config({hosts, mim, c2s_tls_port})},
   66:              {password, <<"wrong">>}|Spec],
   67:     {ok, _, _} = escalus_connection:start(Spec2).
   68: 
   69: %% Helpers
   70: 
   71: %% If dummy backend is enabled, it is not possible to create new users
   72: %% (we check if an user does exist before registering the user).
   73: register_internal_user(Spec) ->
   74:     #{username := User, server := Server,
   75:       password := Password} = maps:from_list(Spec),
   76:     LUser = jid:nodeprep(User),
   77:     LServer = escalus_utils:jid_to_lower(Server),
   78:     HostType = domain_helper:host_type(),
   79:     rpc(mim(), ejabberd_auth_internal, try_register,
   80:         [HostType, LUser, LServer, Password]),
   81:     fun() -> rpc(mim(), ejabberd_auth_internal, remove_user,
   82:                  [HostType, LUser, LServer]) end.