aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/econf.erl5
-rw-r--r--src/ejabberd.erl1
-rw-r--r--src/ejabberd_admin.erl8
-rw-r--r--src/ejabberd_logger.erl3
-rw-r--r--src/ejabberd_options.erl12
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;