1: -module(auth_external_SUITE).
    2: 
    3: -compile([export_all, nowarn_export_all]).
    4: 
    5: -include_lib("common_test/include/ct.hrl").
    6: 
    7: -define(HOST_TYPE, <<"test host type">>).
    8: 
    9: all() ->
   10:     [{group, no_cache}].
   11: 
   12: groups() ->
   13:     [{no_cache, [], all_tests()}].
   14: 
   15: all_tests() ->
   16:     [try_register_ok,
   17:      remove_user_ok,
   18:      set_password_ok,
   19:      does_user_exist,
   20:      get_password_returns_false_if_no_cache,
   21:      get_password_s_returns_empty_bin_if_no_cache,
   22:      supported_sasl_mechanisms
   23:     ].
   24: 
   25: init_per_suite(C) ->
   26:     {ok, _} = application:ensure_all_started(jid),
   27:     C.
   28: 
   29: end_per_suite(C) ->
   30:     C.
   31: 
   32: init_per_group(_G, Config) ->
   33:     set_opts(Config),
   34:     ejabberd_auth_external:start(host_type()),
   35:     Config.
   36: 
   37: end_per_group(_G, Config) ->
   38:     ejabberd_auth_external:stop(host_type()),
   39:     unset_opts(),
   40:     Config.
   41: 
   42: try_register_ok(_C) ->
   43:     {U, P} = given_user_registered(),
   44:     true = ejabberd_auth_external:check_password(host_type(), U, domain(), P).
   45: 
   46: remove_user_ok(_C) ->
   47:     {U, P} = given_user_registered(),
   48:     ok = ejabberd_auth_external:remove_user(host_type(), U, domain()),
   49:     false = ejabberd_auth_external:check_password(host_type(), U, domain(), P).
   50: 
   51: set_password_ok(_C) ->
   52:     {U, P} = given_user_registered(),
   53:     NewP = random_binary(7),
   54:     ok = ejabberd_auth_external:set_password(host_type(), U, domain(), NewP),
   55:     false = ejabberd_auth_external:check_password(host_type(), U, domain(), P),
   56:     true = ejabberd_auth_external:check_password(host_type(), U, domain(), NewP).
   57: 
   58: does_user_exist(_C) ->
   59:     {U, _P} = given_user_registered(),
   60:     true = ejabberd_auth_external:does_user_exist(host_type(), U, domain()).
   61: 
   62: get_password_returns_false_if_no_cache(_C) ->
   63:     false = ejabberd_auth_external:get_password(host_type(), random_binary(8), domain()).
   64: 
   65: get_password_s_returns_empty_bin_if_no_cache(_C) ->
   66:     <<"">> = ejabberd_auth_external:get_password_s(host_type(), random_binary(8), domain()).
   67: 
   68: supported_sasl_mechanisms(_C) ->
   69:     Modules = [cyrsasl_plain, cyrsasl_digest, cyrsasl_external,
   70:                cyrsasl_scram_sha1, cyrsasl_scram_sha224, cyrsasl_scram_sha256,
   71:                cyrsasl_scram_sha384, cyrsasl_scram_sha512],
   72:     [true, false, false, false, false, false, false, false] =
   73:         [ejabberd_auth_external:supports_sasl_module(domain(), Mod) || Mod <- Modules].
   74: 
   75: given_user_registered() ->
   76:     {U, P} = UP = gen_user(),
   77:     ok = ejabberd_auth_external:try_register(host_type(), U, domain(), P),
   78:     UP.
   79: 
   80: set_opts(Config) ->
   81:     DataDir = ?config(data_dir, Config),
   82:     mongoose_config:set_opts(#{{auth, ?HOST_TYPE} =>
   83:                                    #{external => #{program => DataDir ++ "sample_external_auth.py",
   84:                                                    instances => 1}}}).
   85: 
   86: unset_opts() ->
   87:     mongoose_config:erase_opts().
   88: 
   89: gen_user() ->
   90:     U = random_binary(5),
   91:     P = random_binary(6),
   92:     {U, P}.
   93: 
   94: random_binary(S) ->
   95:     base16:encode(crypto:strong_rand_bytes(S)).
   96: 
   97: domain() ->
   98:     <<"mim1.esl.com">>.
   99: 
  100: host_type() ->
  101:     ?HOST_TYPE.