diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/econf.erl | 5 | ||||
-rw-r--r-- | src/ejabberd.erl | 1 | ||||
-rw-r--r-- | src/ejabberd_admin.erl | 8 | ||||
-rw-r--r-- | src/ejabberd_logger.erl | 3 | ||||
-rw-r--r-- | src/ejabberd_options.erl | 12 |
5 files changed, 24 insertions, 5 deletions
diff --git a/src/econf.erl b/src/econf.erl index fdb807588..42bc0f6cf 100644 --- a/src/econf.erl +++ b/src/econf.erl @@ -148,8 +148,7 @@ format_error({bad_enum, Known, Bad} = Why, Ctx) -> format_error({bad_yaml, _, _} = Why, _) -> format_error(Why); format_error(Reason, Ctx) -> - [H|T] = format_error(Reason), - yconf:format_ctx(Ctx) ++ ": " ++ [string:to_lower(H)|T]. + yconf:format_ctx(Ctx) ++ ": " ++ format_error(Reason). format_error({bad_db_type, _, Atom}) -> format("unsupported database: ~ts", [Atom]); @@ -162,6 +161,8 @@ format_error({bad_cert, Why, Path}) -> format_error({bad_pem, Why, Path}); format_error({bad_jwt_key, Path}) -> format("No valid JWT key found in file: ~ts", [Path]); +format_error({bad_jwt_key_set, Path}) -> + format("JWK set contains multiple JWT keys in file: ~ts", [Path]); format_error({bad_jid, Bad}) -> format("Invalid XMPP address: ~ts", [Bad]); format_error({bad_user, Bad}) -> diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 861714d26..4758fd2f9 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -49,7 +49,6 @@ stop() -> application:stop(ejabberd). halt() -> - application:stop(sasl), ejabberd_logger:flush(), erlang:halt(1, [{flush, true}]). diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 2dddb3cad..3e02e6bd0 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -58,6 +58,7 @@ mnesia_change_nodename/4, restore/1, % Still used by some modules clear_cache/0, + gc/0, get_commands_spec/0 ]). %% gen_server callbacks @@ -384,6 +385,10 @@ get_commands_spec() -> #ejabberd_commands{name = clear_cache, tags = [server], desc = "Clear database cache on all nodes", module = ?MODULE, function = clear_cache, + args = [], result = {res, rescode}}, + #ejabberd_commands{name = gc, tags = [server], + desc = "Force full garbage collection", + module = ?MODULE, function = gc, args = [], result = {res, rescode}} ]. @@ -834,6 +839,9 @@ clear_cache() -> Nodes = ejabberd_cluster:get_nodes(), lists:foreach(fun(T) -> ets_cache:clear(T, Nodes) end, ets_cache:all()). +gc() -> + lists:foreach(fun erlang:garbage_collect/1, processes()). + -spec is_my_host(binary()) -> boolean(). is_my_host(Host) -> try ejabberd_router:is_my_host(Host) diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl index 2a8c1a199..a63aca5cb 100644 --- a/src/ejabberd_logger.erl +++ b/src/ejabberd_logger.erl @@ -242,7 +242,8 @@ get_lager_version() -> end. flush() -> - application:stop(lager). + application:stop(lager), + application:stop(sasl). -else. -include_lib("kernel/include/logger.hrl"). diff --git a/src/ejabberd_options.erl b/src/ejabberd_options.erl index 518091d98..ba2fdf02f 100644 --- a/src/ejabberd_options.erl +++ b/src/ejabberd_options.erl @@ -407,7 +407,17 @@ opt_type(jwt_key) -> {ok, Data} -> try jose_jwk:from_binary(Data) of {error, _} -> econf:fail({bad_jwt_key, Path}); - Ret -> Ret + JWK -> + case jose_jwk:to_map(JWK) of + {_, #{<<"keys">> := [Key]}} -> + jose_jwk:from_map(Key); + {_, #{<<"keys">> := [_|_]}} -> + econf:fail({bad_jwt_key_set, Path}); + {_, #{<<"keys">> := _}} -> + econf:fail({bad_jwt_key, Path}); + _ -> + JWK + end catch _:_ -> econf:fail({bad_jwt_key, Path}) end; |