From 5f8114974f8df671ce9774e68b267be03312eb95 Mon Sep 17 00:00:00 2001 From: Pouriya Date: Tue, 15 Jun 2021 15:13:03 +0430 Subject: [PATCH 001/440] ref: fix WS typos --- src/ejabberd_http_ws.erl | 16 +++++----- src/ejabberd_websocket.erl | 64 +++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl index 911a69a58..eb2100a42 100644 --- a/src/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -51,7 +51,7 @@ active = false :: boolean(), c2s_pid :: pid(), ws :: {#ws{}, pid()}, - rfc_compilant = undefined :: boolean() | undefined}). + rfc_compliant = undefined :: boolean() | undefined}). %-define(DBGFSM, true). @@ -166,7 +166,7 @@ handle_event({new_shaper, Shaper}, StateName, #state{ws = {_, WsPid}} = StateDat {next_state, StateName, StateData}. handle_sync_event({send_xml, Packet}, _From, StateName, - #state{ws = {_, WsPid}, rfc_compilant = R} = StateData) -> + #state{ws = {_, WsPid}, rfc_compliant = R} = StateData) -> Packet2 = case {case R of undefined -> true; V -> V end, Packet} of {true, {xmlstreamstart, _, Attrs}} -> Attrs2 = [{<<"xmlns">>, <<"urn:ietf:params:xml:ns:xmpp-framing">>} | @@ -215,7 +215,7 @@ handle_sync_event({send_xml, Packet}, _From, StateName, StateName end, {reply, ok, SN2, StateData}; -handle_sync_event(close, _From, StateName, #state{ws = {_, WsPid}, rfc_compilant = true} = StateData) +handle_sync_event(close, _From, StateName, #state{ws = {_, WsPid}, rfc_compliant = true} = StateData) when StateName /= stream_end_sent -> Close = #xmlel{name = <<"close">>, attrs = [{<<"xmlns">>, <<"urn:ietf:params:xml:ns:xmpp-framing">>}]}, @@ -313,7 +313,7 @@ get_human_html_xmlel() -> "client that supports it.">>}]}]}]}. -parse(#state{rfc_compilant = C} = State, Data) -> +parse(#state{rfc_compliant = C} = State, Data) -> case C of undefined -> P = fxml_stream:new(self()), @@ -321,13 +321,13 @@ parse(#state{rfc_compilant = C} = State, Data) -> fxml_stream:close(P2), case parsed_items([]) of error -> - {State#state{rfc_compilant = true}, <<"parse error">>}; + {State#state{rfc_compliant = true}, <<"parse error">>}; [] -> - {State#state{rfc_compilant = true}, <<"parse error">>}; + {State#state{rfc_compliant = true}, <<"parse error">>}; [{xmlstreamstart, <<"open">>, _} | _] -> - parse(State#state{rfc_compilant = true}, Data); + parse(State#state{rfc_compliant = true}, Data); _ -> - parse(State#state{rfc_compilant = false}, Data) + parse(State#state{rfc_compliant = false}, Data) end; true -> El = fxml_stream:parse_element(Data), diff --git a/src/ejabberd_websocket.erl b/src/ejabberd_websocket.erl index 5eb5ab1a2..5f9d284a6 100644 --- a/src/ejabberd_websocket.erl +++ b/src/ejabberd_websocket.erl @@ -187,32 +187,32 @@ find_subprotocol(Headers) -> end. -ws_loop(FrameInfo, Socket, WsHandleLoopPid, SocketMode, Shaper) -> +ws_loop(FrameInfo, Socket, WsHandleLoopPid, SockMod, Shaper) -> receive {DataType, _Socket, Data} when DataType =:= tcp orelse DataType =:= raw -> - case handle_data(DataType, FrameInfo, Data, Socket, WsHandleLoopPid, SocketMode, Shaper) of + case handle_data(DataType, FrameInfo, Data, Socket, WsHandleLoopPid, SockMod, Shaper) of {error, Error} -> ?DEBUG("TLS decode error ~p", [Error]), - websocket_close(Socket, WsHandleLoopPid, SocketMode, 1002); % protocol error + websocket_close(Socket, WsHandleLoopPid, SockMod, 1002); % protocol error {NewFrameInfo, ToSend, NewShaper} -> - lists:foreach(fun(Pkt) -> SocketMode:send(Socket, Pkt) + lists:foreach(fun(Pkt) -> SockMod:send(Socket, Pkt) end, ToSend), - ws_loop(NewFrameInfo, Socket, WsHandleLoopPid, SocketMode, NewShaper) + ws_loop(NewFrameInfo, Socket, WsHandleLoopPid, SockMod, NewShaper) end; {new_shaper, NewShaper} -> NewShaper = case NewShaper of none when Shaper /= none -> - activate(Socket, SocketMode, true), none; + activate(Socket, SockMod, true), none; _ -> NewShaper end, - ws_loop(FrameInfo, Socket, WsHandleLoopPid, SocketMode, NewShaper); + ws_loop(FrameInfo, Socket, WsHandleLoopPid, SockMod, NewShaper); {tcp_closed, _Socket} -> ?DEBUG("TCP connection was closed, exit", []), - websocket_close(Socket, WsHandleLoopPid, SocketMode, 0); + websocket_close(Socket, WsHandleLoopPid, SockMod, 0); {tcp_error, Socket, Reason} -> ?DEBUG("TCP connection error: ~ts", [inet:format_error(Reason)]), - websocket_close(Socket, WsHandleLoopPid, SocketMode, 0); + websocket_close(Socket, WsHandleLoopPid, SockMod, 0); {'DOWN', Ref, process, WsHandleLoopPid, Reason} -> Code = case Reason of normal -> @@ -224,39 +224,39 @@ ws_loop(FrameInfo, Socket, WsHandleLoopPid, SocketMode, Shaper) -> 1011 % internal error end, erlang:demonitor(Ref), - websocket_close(Socket, WsHandleLoopPid, SocketMode, Code); + websocket_close(Socket, WsHandleLoopPid, SockMod, Code); {text_with_reply, Data, Sender} -> - SocketMode:send(Socket, encode_frame(Data, 1)), + SockMod:send(Socket, encode_frame(Data, 1)), Sender ! {text_reply, self()}, ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper); + SockMod, Shaper); {data_with_reply, Data, Sender} -> - SocketMode:send(Socket, encode_frame(Data, 2)), + SockMod:send(Socket, encode_frame(Data, 2)), Sender ! {data_reply, self()}, ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper); + SockMod, Shaper); {text, Data} -> - SocketMode:send(Socket, encode_frame(Data, 1)), + SockMod:send(Socket, encode_frame(Data, 1)), ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper); + SockMod, Shaper); {data, Data} -> - SocketMode:send(Socket, encode_frame(Data, 2)), + SockMod:send(Socket, encode_frame(Data, 2)), ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper); + SockMod, Shaper); {ping, Data} -> - SocketMode:send(Socket, encode_frame(Data, 9)), + SockMod:send(Socket, encode_frame(Data, 9)), ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper); + SockMod, Shaper); shutdown -> ?DEBUG("Shutdown request received, closing websocket " "with pid ~p", [self()]), - websocket_close(Socket, WsHandleLoopPid, SocketMode, 1001); % going away + websocket_close(Socket, WsHandleLoopPid, SockMod, 1001); % going away _Ignored -> ?WARNING_MSG("Received unexpected message, ignoring: ~p", [_Ignored]), ws_loop(FrameInfo, Socket, WsHandleLoopPid, - SocketMode, Shaper) + SockMod, Shaper) end. encode_frame(Data, Opcode) -> @@ -421,7 +421,7 @@ handle_data(tcp, FrameInfo, Data, Socket, WsHandleLoopPid, fast_tls, Shaper) -> handle_data(_, FrameInfo, Data, Socket, WsHandleLoopPid, SockMod, Shaper) -> handle_data_int(FrameInfo, Data, Socket, WsHandleLoopPid, SockMod, Shaper). -handle_data_int(FrameInfo, Data, Socket, WsHandleLoopPid, SocketMode, Shaper) -> +handle_data_int(FrameInfo, Data, Socket, WsHandleLoopPid, SockMod, Shaper) -> {NewFrameInfo, Recv, Send} = process_frame(FrameInfo, Data), lists:foreach(fun (El) -> case El of @@ -434,27 +434,27 @@ handle_data_int(FrameInfo, Data, Socket, WsHandleLoopPid, SocketMode, Shaper) -> end end, Recv), - {NewFrameInfo, Send, handle_shaping(Data, Socket, SocketMode, Shaper)}. + {NewFrameInfo, Send, handle_shaping(Data, Socket, SockMod, Shaper)}. websocket_close(Socket, WsHandleLoopPid, - SocketMode, CloseCode) when CloseCode > 0 -> + SockMod, CloseCode) when CloseCode > 0 -> Frame = encode_frame(<>, 8), - SocketMode:send(Socket, Frame), - websocket_close(Socket, WsHandleLoopPid, SocketMode, 0); -websocket_close(Socket, WsHandleLoopPid, SocketMode, _CloseCode) -> + SockMod:send(Socket, Frame), + websocket_close(Socket, WsHandleLoopPid, SockMod, 0); +websocket_close(Socket, WsHandleLoopPid, SockMod, _CloseCode) -> WsHandleLoopPid ! closed, - SocketMode:close(Socket). + SockMod:close(Socket). get_origin() -> ejabberd_option:websocket_origin(). -handle_shaping(_Data, _Socket, _SocketMode, none) -> +handle_shaping(_Data, _Socket, _SockMod, none) -> none; -handle_shaping(Data, Socket, SocketMode, Shaper) -> +handle_shaping(Data, Socket, SockMod, Shaper) -> {NewShaper, Pause} = ejabberd_shaper:update(Shaper, byte_size(Data)), if Pause > 0 -> activate_after(Socket, self(), Pause); - true -> activate(Socket, SocketMode, once) + true -> activate(Socket, SockMod, once) end, NewShaper. From fce7fe8558b36478381f3c95a7cae16ce6dd4be9 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 28 Jul 2021 18:29:19 +0200 Subject: [PATCH 002/440] PubSub: Bump default value for 'max_items' limit Bump the default value for mod_pubsub's 'max_items_node' option, which hard-limits the 'max_items' value requested by clients. These days, use cases such as microblogging or XEP-0402 may need a large number of items per node. Bumping the limit makes sure such functionality is properly supported with the default configuration. --- include/pubsub.hrl | 2 +- src/mod_pubsub.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/pubsub.hrl b/include/pubsub.hrl index 8496b95ac..da919e9e2 100644 --- a/include/pubsub.hrl +++ b/include/pubsub.hrl @@ -23,7 +23,7 @@ -define(ERR_EXTENDED(E, C), mod_pubsub:extended_error(E, C)). %% The actual limit can be configured with mod_pubsub's option max_items_node --define(MAXITEMS, 10). +-define(MAXITEMS, 1000). %% this is currently a hard limit. %% Would be nice to have it configurable. diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index fecb35341..e64b73083 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -4276,7 +4276,7 @@ mod_doc() -> #{value => "MaxItems", desc => ?T("Define the maximum number of items that can be " - "stored in a node. Default value is: '10'.")}}, + "stored in a node. Default value is: '1000'.")}}, {max_nodes_discoitems, #{value => "pos_integer() | infinity", desc => From ccb4328d06bd39a10c2ecc109a6647cf1eafdaa9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 29 Jul 2021 23:13:17 +0200 Subject: [PATCH 003/440] Store who defines a command, specially when defined by ejabberd modules --- include/ejabberd_commands.hrl | 1 + src/ejabberd_commands.erl | 6 +++++- src/mod_admin_extra.erl | 2 +- src/mod_admin_update_sql.erl | 2 +- src/mod_fail2ban.erl | 2 +- src/mod_mam.erl | 2 +- src/mod_muc_admin.erl | 2 +- src/mod_private.erl | 2 +- src/mod_push.erl | 2 +- 9 files changed, 13 insertions(+), 8 deletions(-) diff --git a/include/ejabberd_commands.hrl b/include/ejabberd_commands.hrl index bfef47080..d0f5ba70a 100644 --- a/include/ejabberd_commands.hrl +++ b/include/ejabberd_commands.hrl @@ -59,6 +59,7 @@ policy = restricted :: open | restricted | admin | user, %% access is: [accessRuleName] or [{Module, AccessOption, DefaultAccessRuleName}] access = [] :: [{atom(),atom(),atom()}|atom()], + definer = unknown :: atom(), result = {res, rescode} :: rterm() | '_' | '$2', args_rename = [] :: [{atom(),atom()}], args_desc = none :: none | [string()] | '_', diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index 0f86f23d3..8d875e82f 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -41,6 +41,7 @@ get_tags_commands/0, get_tags_commands/1, register_commands/1, + register_commands/2, unregister_commands/1, get_commands_spec/0, get_commands_definition/0, @@ -129,10 +130,13 @@ code_change(_OldVsn, State, _Extra) -> -spec register_commands([ejabberd_commands()]) -> ok. register_commands(Commands) -> + register_commands(unknown, Commands). + +register_commands(Definer, Commands) -> lists:foreach( fun(Command) -> %% XXX check if command exists - mnesia:dirty_write(Command) + mnesia:dirty_write(Command#ejabberd_commands{definer = Definer}) %% ?DEBUG("This command is already defined:~n~p", [Command]) end, Commands), diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index 04cb39cfb..fe0dd2757 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -92,7 +92,7 @@ %%% start(_Host, _Opts) -> - ejabberd_commands:register_commands(get_commands_spec()). + ejabberd_commands:register_commands(?MODULE, get_commands_spec()). stop(Host) -> case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index 0215a5172..eae481385 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -46,7 +46,7 @@ %%% start(_Host, _Opts) -> - ejabberd_commands:register_commands(get_commands_spec()). + ejabberd_commands:register_commands(?MODULE, get_commands_spec()). stop(_Host) -> ejabberd_commands:unregister_commands(get_commands_spec()). diff --git a/src/mod_fail2ban.erl b/src/mod_fail2ban.erl index 99ff3d127..8751653d8 100644 --- a/src/mod_fail2ban.erl +++ b/src/mod_fail2ban.erl @@ -107,7 +107,7 @@ c2s_stream_started(#{ip := {Addr, _}} = State, _) -> start(Host, Opts) -> catch ets:new(failed_auth, [named_table, public, {heir, erlang:group_leader(), none}]), - ejabberd_commands:register_commands(get_commands_spec()), + ejabberd_commands:register_commands(?MODULE, get_commands_spec()), gen_mod:start_child(?MODULE, Host, Opts). stop(Host) -> diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 12542bfa5..e894f5f7d 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -148,7 +148,7 @@ start(Host, Opts) -> ejabberd_hooks:add(check_create_room, Host, ?MODULE, check_create_room, 50) end, - ejabberd_commands:register_commands(get_commands_spec()), + ejabberd_commands:register_commands(?MODULE, get_commands_spec()), ok; Err -> Err diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 72a29a45b..360d414b1 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -57,7 +57,7 @@ %%---------------------------- start(Host, _Opts) -> - ejabberd_commands:register_commands(get_commands_spec()), + ejabberd_commands:register_commands(?MODULE, get_commands_spec()), ejabberd_hooks:add(webadmin_menu_main, ?MODULE, web_menu_main, 50), ejabberd_hooks:add(webadmin_menu_host, Host, ?MODULE, web_menu_host, 50), ejabberd_hooks:add(webadmin_page_main, ?MODULE, web_page_main, 50), diff --git a/src/mod_private.erl b/src/mod_private.erl index ad36c8494..36f1e8d2c 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -66,7 +66,7 @@ start(Host, Opts) -> ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50), ejabberd_hooks:add(pubsub_publish_item, Host, ?MODULE, pubsub_publish_item, 50), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE, ?MODULE, process_sm_iq), - ejabberd_commands:register_commands(get_commands_spec()). + ejabberd_commands:register_commands(?MODULE, get_commands_spec()). stop(Host) -> ejabberd_hooks:delete(remove_user, Host, ?MODULE, remove_user, 50), diff --git a/src/mod_push.erl b/src/mod_push.erl index b4dd48234..ea1c3e649 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -98,7 +98,7 @@ start(Host, Opts) -> init_cache(Mod, Host, Opts), register_iq_handlers(Host), register_hooks(Host), - ejabberd_commands:register_commands(get_commands_spec()). + ejabberd_commands:register_commands(?MODULE, get_commands_spec()). -spec stop(binary()) -> ok. stop(Host) -> From 41808a63a0c7ccd5deb3498c4946f88f1ddd1960 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 29 Jul 2021 23:13:53 +0200 Subject: [PATCH 004/440] Show definer module in "ejabberdctl help" when it's a gen_mod --- src/ejabberd_ctl.erl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index ce642727f..04e383d53 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -827,6 +827,7 @@ print_usage_command(Cmd, MaxC, ShCode, Version) -> print_usage_command2(Cmd, C, MaxC, ShCode) -> #ejabberd_commands{ tags = TagsAtoms, + definer = Definer, desc = Desc, args = ArgsDef, longdesc = LongDesc, @@ -851,6 +852,15 @@ print_usage_command2(Cmd, C, MaxC, ShCode) -> TagsFmt = [" ",?B("Tags"),":", prepare_long_line(8, MaxC, [?G(atom_to_list(TagA)) || TagA <- TagsAtoms])], + IsDefinerMod = case Definer of + unknown -> true; + _ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes))) + end, + ModuleFmt = case IsDefinerMod of + true -> [" ",?B("Module"),": ", atom_to_list(Definer), "\n\n"]; + false -> [] + end, + DescFmt = [" ",?B("Description"),":", prepare_description(15, MaxC, Desc)], LongDescFmt = case LongDesc of @@ -866,7 +876,7 @@ print_usage_command2(Cmd, C, MaxC, ShCode) -> case Cmd of "help" -> ok; _ -> print([NameFmt, "\n", ArgsFmt, "\n", ReturnsFmt, - "\n\n", XmlrpcFmt, TagsFmt, "\n\n", DescFmt, "\n\n"], []) + "\n\n", XmlrpcFmt, TagsFmt, "\n\n", ModuleFmt, DescFmt, "\n\n"], []) end, print([LongDescFmt, NoteEjabberdctl], []). From b22779f0185924de8bed2773ca2144389b1337ba Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 29 Jul 2021 23:14:34 +0200 Subject: [PATCH 005/440] Show tags and definer module in generated API document when it's a gen_mod --- src/ejabberd_commands_doc.erl | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index 4981577b6..582908723 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -360,8 +360,8 @@ gen_param(Name, Type, Desc, HTMLOutput) -> [?TAG(dt, [?TAG_R(strong, atom_to_list(Name)), <<" :: ">>, ?RAW(format_type(Type))]), ?TAG(dd, ?RAW(Desc))]. -gen_doc(#ejabberd_commands{name=Name, tags=_Tags, desc=Desc, longdesc=LongDesc, - args=Args, args_desc=ArgsDesc, note=Note, +gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc, + args=Args, args_desc=ArgsDesc, note=Note, definer=Definer, result=Result, result_desc=ResultDesc}=Cmd, HTMLOutput, Langs) -> try ArgsText = case ArgsDesc of @@ -389,6 +389,17 @@ gen_doc(#ejabberd_commands{name=Name, tags=_Tags, desc=Desc, longdesc=LongDesc, [?TAG(dl, [gen_param(RName, Type, ResultDesc, HTMLOutput)])] end end, + TagsText = [?RAW(atom_to_list(Tag) ++ " ") || Tag <- Tags], + IsDefinerMod = case Definer of + unknown -> true; + _ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes))) + end, + ModuleText = case IsDefinerMod of + true -> + [?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW(atom_to_list(Definer)))]; + false -> + [] + end, NoteEl = case Note of "" -> []; _ -> ?TAG('div', "note-down", ?RAW(Note)) @@ -403,6 +414,8 @@ gen_doc(#ejabberd_commands{name=Name, tags=_Tags, desc=Desc, longdesc=LongDesc, end, ?TAG(h2, <<"Arguments:">>), ArgsText, ?TAG(h2, <<"Result:">>), ResultText, + ?TAG(h2, <<"Tags:">>), ?TAG(p, TagsText)] + ++ ModuleText ++ [ ?TAG(h2, <<"Examples:">>), gen_calls(Cmd, HTMLOutput, Langs)] catch _:Ex -> @@ -421,12 +434,13 @@ find_commands_definitions() -> lists:flatmap(fun(P) -> Mod = list_to_atom(filename:rootname(P)), code:ensure_loaded(Mod), - case erlang:function_exported(Mod, get_commands_spec, 0) of + Cs = case erlang:function_exported(Mod, get_commands_spec, 0) of true -> apply(Mod, get_commands_spec, []); _ -> [] - end + end, + [C#ejabberd_commands{definer = Mod} || C <- Cs] end, filelib:wildcard("*.beam", Path)) end. From ab5e726176d7165a07faf896d8839892c03ad392 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 30 Jul 2021 00:58:08 +0200 Subject: [PATCH 006/440] Use the most specific tag for ejabberd commands with several ones --- src/ejabberd_admin.erl | 12 ++++++------ src/ext_mod.erl | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 2eeb97b99..23becc7f2 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -119,12 +119,12 @@ get_commands_spec() -> desc = "Restart ejabberd gracefully", module = init, function = restart, args = [], result = {res, rescode}}, - #ejabberd_commands{name = reopen_log, tags = [logs, server], + #ejabberd_commands{name = reopen_log, tags = [logs], desc = "Reopen the log files", policy = admin, module = ?MODULE, function = reopen_log, args = [], result = {res, rescode}}, - #ejabberd_commands{name = rotate_log, tags = [logs, server], + #ejabberd_commands{name = rotate_log, tags = [logs], desc = "Rotate the log files", module = ?MODULE, function = rotate_log, args = [], result = {res, rescode}}, @@ -139,14 +139,14 @@ get_commands_spec() -> args_example = [60, <<"Server will stop now.">>], args = [{delay, integer}, {announcement, string}], result = {res, rescode}}, - #ejabberd_commands{name = get_loglevel, tags = [logs, server], + #ejabberd_commands{name = get_loglevel, tags = [logs], desc = "Get the current loglevel", module = ejabberd_logger, function = get, result_desc = "Tuple with the log level number, its keyword and description", result_example = warning, args = [], result = {levelatom, atom}}, - #ejabberd_commands{name = set_loglevel, tags = [logs, server], + #ejabberd_commands{name = set_loglevel, tags = [logs], desc = "Set the loglevel", module = ?MODULE, function = set_loglevel, args_desc = ["Desired logging level: none | emergency | alert | critical " @@ -200,7 +200,7 @@ get_commands_spec() -> result_example = [<<"example.com">>, <<"anon.example.com">>], args = [], result = {vhosts, {list, {vhost, string}}}}, - #ejabberd_commands{name = reload_config, tags = [server, config], + #ejabberd_commands{name = reload_config, tags = [config], desc = "Reload config file in memory", module = ?MODULE, function = reload_config, args = [], @@ -268,7 +268,7 @@ get_commands_spec() -> args_example = ["/var/lib/ejabberd/", "example.com"], args = [{dir, string}, {host, string}], result = {res, rescode}}, - #ejabberd_commands{name = delete_mnesia, tags = [mnesia, sql], + #ejabberd_commands{name = delete_mnesia, tags = [mnesia], desc = "Delete elements in Mnesia database for a given vhost", module = ejd2sql, function = delete, args_desc = ["Vhost which content will be deleted in Mnesia database"], diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 5353019bb..b3e88a9cb 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -84,14 +84,14 @@ code_change(_OldVsn, State, _Extra) -> %% -- ejabberd commands get_commands_spec() -> [#ejabberd_commands{name = modules_update_specs, - tags = [admin,modules], + tags = [modules], desc = "Update the module source code from Git", longdesc = "A connection to Internet is required", module = ?MODULE, function = update, args = [], result = {res, rescode}}, #ejabberd_commands{name = modules_available, - tags = [admin,modules], + tags = [modules], desc = "List the contributed modules available to install", module = ?MODULE, function = available_command, result_desc = "List of tuples with module name and description", @@ -103,7 +103,7 @@ get_commands_spec() -> [{name, atom}, {summary, string}]}}}}}, #ejabberd_commands{name = modules_installed, - tags = [admin,modules], + tags = [modules], desc = "List the contributed modules already installed", module = ?MODULE, function = installed_command, result_desc = "List of tuples with module name and description", @@ -115,7 +115,7 @@ get_commands_spec() -> [{name, atom}, {summary, string}]}}}}}, #ejabberd_commands{name = module_install, - tags = [admin,modules], + tags = [modules], desc = "Compile, install and start an available contributed module", module = ?MODULE, function = install, args_desc = ["Module name"], @@ -123,7 +123,7 @@ get_commands_spec() -> args = [{module, binary}], result = {res, rescode}}, #ejabberd_commands{name = module_uninstall, - tags = [admin,modules], + tags = [modules], desc = "Uninstall a contributed module", module = ?MODULE, function = uninstall, args_desc = ["Module name"], @@ -131,7 +131,7 @@ get_commands_spec() -> args = [{module, binary}], result = {res, rescode}}, #ejabberd_commands{name = module_upgrade, - tags = [admin,modules], + tags = [modules], desc = "Upgrade the running code of an installed module", longdesc = "In practice, this uninstalls and installs the module", module = ?MODULE, function = upgrade, @@ -140,7 +140,7 @@ get_commands_spec() -> args = [{module, binary}], result = {res, rescode}}, #ejabberd_commands{name = module_check, - tags = [admin,modules], + tags = [modules], desc = "Check the contributed module repository compliance", module = ?MODULE, function = check, args_desc = ["Module name"], From 76c49f314f3c8422ed3f60dc5b5f8ce14340b4cb Mon Sep 17 00:00:00 2001 From: pitchum Date: Sun, 1 Aug 2021 09:53:07 +0200 Subject: [PATCH 007/440] Add missing SQL migration for table push_session --- sql/pg.new.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sql/pg.new.sql b/sql/pg.new.sql index 8a35ec6c9..b3473a1a0 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -156,6 +156,12 @@ -- CREATE INDEX i_sm_sh_username ON sm USING btree (server_host, username); -- ALTER TABLE sm ALTER COLUMN server_host DROP DEFAULT; +-- ALTER TABLE push_session ADD COLUMN server_host text NOT NULL DEFAULT ''; +-- DROP INDEX i_push_usn; +-- DROP INDEX i_push_ut; +-- ALTER TABLE push_session ADD PRIMARY KEY (server_host, username, timestamp); +-- CREATE UNIQUE INDEX i_push_session_susn ON push_session USING btree (server_host, username, service, node); + CREATE TABLE users ( username text NOT NULL, From 99ffd9bb9564768d90a20d5c8920b6abf8b7c190 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 2 Aug 2021 21:09:55 +0200 Subject: [PATCH 008/440] mod_pubsub: Fix check_opt_range/3 spec --- src/mod_pubsub.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index b0dca4b0d..d49a11817 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3548,7 +3548,8 @@ decode_get_pending(#xdata{fields = Fs}, Lang) -> {error, xmpp:err_resource_constraint(Txt, Lang)} end. --spec check_opt_range(atom(), [proplists:property()], non_neg_integer()) -> boolean(). +-spec check_opt_range(atom(), [proplists:property()], + non_neg_integer() | undefined) -> boolean(). check_opt_range(_Opt, _Opts, undefined) -> true; check_opt_range(Opt, Opts, Max) -> From d7e330c8eff3bb40a301705bfab7a9510b2c6fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 4 Aug 2021 15:30:29 +0200 Subject: [PATCH 009/440] Allow storing non-composing x:events in offline --- src/mod_offline.erl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mod_offline.erl b/src/mod_offline.erl index c3fda25db..ff95767b6 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -572,6 +572,16 @@ check_event(#message{from = From, to = To, id = ID, type = Type} = Msg) -> sub_els = [#xevent{id = ID, offline = true}]}, ejabberd_router:route(NewMsg), true; + % Don't store composing events + #xevent{id = V, composing = true} when V /= undefined -> + false; + % Nor composing stopped events + #xevent{id = V, composing = false, delivered = false, + displayed = false, offline = false} when V /= undefined -> + false; + % But store other received notifications + #xevent{id = V} when V /= undefined -> + true; _ -> false end. From 4c61ea9091a5d0bca3c2e35fb68c99de3c21324d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 4 Aug 2021 17:45:31 +0200 Subject: [PATCH 010/440] Update tests after last commit --- test/offline_tests.erl | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/offline_tests.erl b/test/offline_tests.erl index 1021c86e8..b5a90e7ee 100644 --- a/test/offline_tests.erl +++ b/test/offline_tests.erl @@ -489,6 +489,14 @@ wait_for_complete(Config, N) -> end end, error, [0, 100, 200, 2000, 5000, 10000]). +xevent_stored(#message{body = [], subject = []}, _) -> false; +xevent_stored(#message{type = T}, _) when T /= chat, T /= normal -> false; +xevent_stored(_, #xevent{id = undefined}) -> true; +xevent_stored(_, #xevent{offline = true}) -> true; +xevent_stored(_, #xevent{delivered = true}) -> true; +xevent_stored(_, #xevent{displayed = true}) -> true; +xevent_stored(_, _) -> false. + message_iterator(Config) -> ServerJID = server_jid(Config), ChatStates = [[#chatstate{type = composing}]], @@ -511,8 +519,14 @@ message_iterator(Config) -> fun(#message{type = error}) -> true; (#message{type = groupchat}) -> false; (#message{sub_els = [#hint{type = store}|_]}) when MamEnabled -> true; + (#message{sub_els = [#hint{type = 'no-store'}|_]}) -> false; (#message{sub_els = [#offline{}|_]}) when not MamEnabled -> false; - (#message{sub_els = [_, #xevent{id = I}]}) when I /= undefined, not MamEnabled -> false; + (#message{sub_els = [#hint{type = store}, #xevent{} = Event | _]} = Msg) when not MamEnabled -> + xevent_stored(Msg#message{body = body, type = chat}, Event); + (#message{sub_els = [#xevent{} = Event]} = Msg) when not MamEnabled -> + xevent_stored(Msg, Event); + (#message{sub_els = [_, #xevent{} = Event | _]} = Msg) when not MamEnabled -> + xevent_stored(Msg, Event); (#message{sub_els = [#xevent{id = I}]}) when I /= undefined, not MamEnabled -> false; (#message{sub_els = [#hint{type = store}|_]}) -> true; (#message{sub_els = [#hint{type = 'no-store'}|_]}) -> false; From aefc374317860aa1e7fd1ed305cbf71b3ce132a8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 5 Aug 2021 13:52:38 +0200 Subject: [PATCH 011/440] Fix typo when creating index (thanks to Millesimus) Reference: https://github.com/processone/ejabberd/commit/95fa43aa96514b7e8b77fa7c29d2c0b5b1c1331a#r54157330 --- sql/mysql.new.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql index c6d74bb91..01aeffbc5 100644 --- a/sql/mysql.new.sql +++ b/sql/mysql.new.sql @@ -86,7 +86,7 @@ CREATE TABLE sr_user ( PRIMARY KEY (server_host(191), jid, grp) ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE UNIQUE INDEX i_sr_user_sh_jid_group ON sr_group(server_host(191), jid, grp); +CREATE UNIQUE INDEX i_sr_user_sh_jid_group ON sr_user(server_host(191), jid, grp); CREATE INDEX i_sr_user_sh_jid ON sr_user(server_host(191), jid); CREATE INDEX i_sr_user_sh_grp ON sr_user(server_host(191), grp); From 5b0a28bbc9dc842ec2cc4270f4593e69c3ab0bbe Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 23 Jul 2021 11:21:21 +0200 Subject: [PATCH 012/440] Fix CHANGELOG: rebar2's elixir workaround was problematic and was reverted Problems: - That workaround required running "make" twice - CEAN (used to build installers) doesn't support that make && make - Support for Elixir in rebar3 doesn't yet exist - Preferable path for Elixir usage: install Elixir and use --with-rebar=mix --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f55ce7127..13385b864 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,6 @@ Compilation - Add rebar3 3.15.2 binary - Add support for mix to: `./configure --enable-rebar=mix` -- Add workaround so rebar2 can use Elixir 1.12.0 - Improved `make rel` to work with rebar3 and mix - Add `make dev` to build a development release with rebar3 or mix - Hex: Add `sql/` and `vars.config` to Hex package files From fdfd202a30b740ab30c014c2d459cf1c0539f1fa Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 3 Aug 2021 17:54:49 +0200 Subject: [PATCH 013/440] Determine the default handlerid at runtime Apparently Elixir's default is not called 'default' --- src/ejabberd_logger.erl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl index 5ace8115f..05e197b3e 100644 --- a/src/ejabberd_logger.erl +++ b/src/ejabberd_logger.erl @@ -288,10 +288,11 @@ start(Level) -> ConsoleFmtConfig = FmtConfig#{template => console_template()}, try ok = logger:set_primary_config(level, Level), - ok = logger:update_formatter_config(default, ConsoleFmtConfig), + DefaultHandlerId = get_default_handlerid(), + ok = logger:update_formatter_config(DefaultHandlerId, ConsoleFmtConfig), case quiet_mode() of true -> - ok = logger:set_handler_config(default, level, critical); + ok = logger:set_handler_config(DefaultHandlerId, level, critical); _ -> ok end, @@ -319,6 +320,13 @@ start(Level) -> Err end. +get_default_handlerid() -> + Ids = logger:get_handler_ids(), + case lists:member(default, Ids) of + true -> default; + false -> hd(Ids) + end. + -spec restart() -> ok. restart() -> ok. From 3e942bf4acac02eccba837b0f1e9ce4f6f69aff4 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 7 Aug 2021 12:57:57 +0200 Subject: [PATCH 014/440] mod_mam_sql: Remove duplicated functions --- src/mod_mam_sql.erl | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index e5069b9a2..269b4c963 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -72,7 +72,7 @@ remove_from_archive(LUser, LServer, WithJid) -> end. delete_old_messages(ServerHost, TimeStamp, Type) -> - TS = now_to_usec(TimeStamp), + TS = misc:now_to_usec(TimeStamp), case Type of all -> ejabberd_sql:sql_query( @@ -315,7 +315,7 @@ export(_Server) -> id = _ID, timestamp = TS, peer = Peer, type = Type, nick = Nick, packet = Pkt}) when LServer == Host -> - TStmp = now_to_usec(TS), + TStmp = misc:now_to_usec(TS), SUser = case Type of chat -> LUser; groupchat -> jid:encode({LUser, LServer, <<>>}) @@ -372,16 +372,6 @@ is_empty_for_room(LServer, LName, LHost) -> %%%=================================================================== %%% Internal functions %%%=================================================================== -now_to_usec({MSec, Sec, USec}) -> - (MSec*1000000 + Sec)*1000000 + USec. - -usec_to_now(Int) -> - Secs = Int div 1000000, - USec = Int rem 1000000, - MSec = Secs div 1000000, - Sec = Secs rem 1000000, - {MSec, Sec, USec}. - make_sql_query(User, LServer, MAMQuery, RSM, ExtraUsernames) -> Start = proplists:get_value(start, MAMQuery), End = proplists:get_value('end', MAMQuery), @@ -432,14 +422,14 @@ make_sql_query(User, LServer, MAMQuery, RSM, ExtraUsernames) -> StartClause = case Start of {_, _, _} -> [<<" and timestamp >= ">>, - integer_to_binary(now_to_usec(Start))]; + integer_to_binary(misc:now_to_usec(Start))]; _ -> [] end, EndClause = case End of {_, _, _} -> [<<" and timestamp <= ">>, - integer_to_binary(now_to_usec(End))]; + integer_to_binary(misc:now_to_usec(End))]; _ -> [] end, @@ -526,7 +516,7 @@ make_archive_el(User, TS, XML, Peer, Kind, Nick, MsgType, JidRequestor, JidArchi TSInt -> try jid:decode(Peer) of PeerJID -> - Now = usec_to_now(TSInt), + Now = misc:usec_to_now(TSInt), PeerLJID = jid:tolower(PeerJID), T = case Kind of <<"">> -> chat; From 14bf197be1effaa9fd6e9272aba2398288333431 Mon Sep 17 00:00:00 2001 From: ballerburg9005 <50874674+ballerburg9005@users.noreply.github.com> Date: Thu, 12 Aug 2021 15:14:31 +0200 Subject: [PATCH 015/440] "sort -R" command not POSIX, added "shuf" and "cat" as fallback --- tools/captcha-ng.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/captcha-ng.sh b/tools/captcha-ng.sh index cbcb95407..bb57385c4 100755 --- a/tools/captcha-ng.sh +++ b/tools/captcha-ng.sh @@ -42,7 +42,8 @@ INTRUDER() { NUMBERS=$(echo "$INPUT" | grep -o . | tr '\n' ' ') SORTED_UNIQ_NUM=$(echo "${NUMBERS[@]}" | sort -u | tr '\n' ' ') -RANDOM_DIGITS=$(echo 123456789 | grep -o . | sort -R | tr '\n' ' ') +SORT_RANDOM_CMD="$( ( echo x|sort -R >&/dev/null && echo "sort -R" ) || ( echo x|shuf >&/dev/null && echo shuf ) || echo cat)" +RANDOM_DIGITS=$(echo 123456789 | grep -o . | eval "$SORT_RANDOM_CMD" | tr '\n' ' ') INTRUDER=-1 for i in $RANDOM_DIGITS From 8f8de0403bab0a819420db69bb44bdb2a474d137 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 20 Aug 2021 20:30:11 +0200 Subject: [PATCH 016/440] PubSub: Support 'max_items=max' node configuration Let clients request the maximum limit for the node configuration option 'max_items' by specifying the special value 'max' instead of an integer. This was added to XEP-0060, revision 1.17.0 (and clarified in revision 1.20.0). Thanks to Ammonit Measurement GmbH for sponsoring this work. --- mix.exs | 2 +- rebar.config | 2 +- src/mod_pubsub.erl | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mix.exs b/mix.exs index c33710b45..0b5d40b09 100644 --- a/mix.exs +++ b/mix.exs @@ -124,7 +124,7 @@ defmodule Ejabberd.MixProject do {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, {:stun, "~> 1.0"}, - {:xmpp, "~> 1.5"}, + {:xmpp, git: "https://github.com/processone/xmpp", ref: "e943c0285aa85e3cbd4bfb9259f6b7de32b00395", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/rebar.config b/rebar.config index 798e6350b..a70ccfba3 100644 --- a/rebar.config +++ b/rebar.config @@ -59,7 +59,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.44"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.4"}}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "e943c0285aa85e3cbd4bfb9259f6b7de32b00395"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index d49a11817..49a54c9b4 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3553,8 +3553,10 @@ decode_get_pending(#xdata{fields = Fs}, Lang) -> check_opt_range(_Opt, _Opts, undefined) -> true; check_opt_range(Opt, Opts, Max) -> - Val = proplists:get_value(Opt, Opts, Max), - Val =< Max. + case proplists:get_value(Opt, Opts, Max) of + max -> true; + Val -> Val =< Max + end. -spec get_max_items_node(host()) -> undefined | non_neg_integer(). get_max_items_node(Host) -> @@ -3708,6 +3710,7 @@ features() -> <<"access-whitelist">>, % OPTIONAL <<"collections">>, % RECOMMENDED <<"config-node">>, % RECOMMENDED + <<"config-node-max">>, <<"create-and-configure">>, % RECOMMENDED <<"item-ids">>, % RECOMMENDED <<"last-published">>, % RECOMMENDED From 1b0e59bb139f83d1f027ece08606446c30d35ae5 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 21 Aug 2021 12:29:37 +0200 Subject: [PATCH 017/440] PubSub: Support unlimited number of items Allow for setting the mod_pubsub option 'max_items_node' to 'unlimited'. If clients then request a 'max_items' limit of 'max', old items aren't deleted when publishing new ones. Thanks to Ammonit Measurement GmbH for sponsoring this work. --- src/mod_pubsub.erl | 14 ++++++++------ src/node_flat.erl | 3 ++- src/node_flat_sql.erl | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 49a54c9b4..c6f485077 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -210,7 +210,7 @@ pep_mapping :: [{binary(), binary()}], ignore_pep_from_offline :: boolean(), last_item_cache :: boolean(), - max_items_node :: non_neg_integer(), + max_items_node :: non_neg_integer()|unlimited, max_subscriptions_node :: non_neg_integer()|undefined, default_node_config :: [{atom(), binary()|boolean()|integer()|atom()}], nodetree :: binary(), @@ -3399,7 +3399,7 @@ node_config(_, _, []) -> %% @doc

Return the maximum number of items for a given node.

%%

Unlimited means that there is no limit in the number of items that can %% be stored.

--spec max_items(host(), [{atom(), any()}]) -> non_neg_integer(). +-spec max_items(host(), [{atom(), any()}]) -> non_neg_integer() | unlimited. max_items(Host, Options) -> case get_option(Options, persist_items) of true -> @@ -3549,16 +3549,18 @@ decode_get_pending(#xdata{fields = Fs}, Lang) -> end. -spec check_opt_range(atom(), [proplists:property()], - non_neg_integer() | undefined) -> boolean(). + non_neg_integer() | unlimited | undefined) -> boolean(). check_opt_range(_Opt, _Opts, undefined) -> true; +check_opt_range(_Opt, _Opts, unlimited) -> + true; check_opt_range(Opt, Opts, Max) -> case proplists:get_value(Opt, Opts, Max) of max -> true; Val -> Val =< Max end. --spec get_max_items_node(host()) -> undefined | non_neg_integer(). +-spec get_max_items_node(host()) -> undefined | unlimited | non_neg_integer(). get_max_items_node(Host) -> config(Host, max_items_node, undefined). @@ -4150,7 +4152,7 @@ mod_opt_type(ignore_pep_from_offline) -> mod_opt_type(last_item_cache) -> econf:bool(); mod_opt_type(max_items_node) -> - econf:non_neg_int(); + econf:non_neg_int(unlimited); mod_opt_type(max_nodes_discoitems) -> econf:non_neg_int(infinity); mod_opt_type(max_subscriptions_node) -> @@ -4277,7 +4279,7 @@ mod_doc() -> "and allows to raise user connection rate. The cost " "is memory usage, as every item is stored in memory.")}}, {max_items_node, - #{value => "MaxItems", + #{value => "non_neg_integer() | infinity", desc => ?T("Define the maximum number of items that can be " "stored in a node. Default value is: '10'.")}}, diff --git a/src/node_flat.erl b/src/node_flat.erl index 4a2a60971..fe08be258 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -375,7 +375,8 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload, or (Subscribed == true)) -> {error, xmpp:err_forbidden()}; true -> - if MaxItems > 0 -> + if MaxItems > 0; + MaxItems == unlimited -> Now = erlang:timestamp(), case get_item(Nidx, ItemId) of {result, #pubsub_item{creation = {_, GenKey}} = OldItem} -> diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 1e197a51d..1309c2886 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -247,7 +247,8 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload, or (Subscribed == true)) -> {error, xmpp:err_forbidden()}; true -> - if MaxItems > 0 -> + if MaxItems > 0; + MaxItems == unlimited -> Now = erlang:timestamp(), case get_item(Nidx, ItemId) of {result, #pubsub_item{creation = {_, GenKey}} = OldItem} -> From 29751a6174d181f80bbcde7c92f8cc958eee85a1 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 21 Aug 2021 20:02:58 +0200 Subject: [PATCH 018/440] PubSub: Optimize publishing on large nodes (SQL) Avoid an unnecessary SQL query while publishing an item on a PubSub node without 'max_items' limit. The query in question can be expensive if the node has a large number of items. Thanks to Ammonit Measurement GmbH for sponsoring this work. --- src/node_flat_sql.erl | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 1309c2886..5033eda51 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -259,14 +259,14 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload, {result, _} -> {error, xmpp:err_forbidden()}; _ -> - Items = [ItemId | itemids(Nidx, GenKey)], - {result, {_NI, OI}} = remove_extra_items(Nidx, MaxItems, Items), + OldIds = maybe_remove_extra_items(Nidx, MaxItems, + GenKey, ItemId), set_item(#pubsub_item{ itemid = {ItemId, Nidx}, creation = {Now, GenKey}, modification = {Now, SubKey}, payload = Payload}), - {result, {default, broadcast, OI}} + {result, {default, broadcast, OldIds}} end; true -> {result, {default, broadcast, []}} @@ -934,6 +934,16 @@ update_subscription(Nidx, JID, Subscription) -> "-affiliation='n'" ]). +-spec maybe_remove_extra_items(mod_pubsub:nodeIdx(), + non_neg_integer() | unlimited, ljid(), + mod_pubsub:itemId()) -> [mod_pubsub:itemId()]. +maybe_remove_extra_items(_Nidx, unlimited, _GenKey, _ItemId) -> + []; +maybe_remove_extra_items(Nidx, MaxItems, GenKey, ItemId) -> + ItemIds = [ItemId | itemids(Nidx, GenKey)], + {result, {_NewIds, OldIds}} = remove_extra_items(Nidx, MaxItems, ItemIds), + OldIds. + -spec decode_jid(SJID :: binary()) -> ljid(). decode_jid(SJID) -> jid:tolower(jid:decode(SJID)). From 8d5025076f53abc0474c86a0f879ff1736714844 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 22 Aug 2021 12:44:50 +0200 Subject: [PATCH 019/440] PubSub: Add delete_old_pubsub_items command Add a command for keeping only the specified number of items on each node and removing all older items. This might be especially useful if nodes may be configured to have no 'max_items' limit. Thanks to Ammonit Measurement GmbH for sponsoring this work. --- src/gen_pubsub_node.erl | 5 ++++ src/gen_pubsub_nodetree.erl | 3 +++ src/mod_pubsub.erl | 53 ++++++++++++++++++++++++++++++++++++- src/node_flat.erl | 13 ++++++++- src/node_flat_sql.erl | 22 ++++++++++++--- src/node_pep.erl | 6 ++++- src/node_pep_sql.erl | 6 ++++- src/nodetree_tree.erl | 11 +++++++- src/nodetree_tree_sql.erl | 31 +++++++++++++++++++++- src/nodetree_virtual.erl | 6 ++++- 10 files changed, 146 insertions(+), 10 deletions(-) diff --git a/src/gen_pubsub_node.erl b/src/gen_pubsub_node.erl index 5bdebdfc6..625e490fc 100644 --- a/src/gen_pubsub_node.erl +++ b/src/gen_pubsub_node.erl @@ -122,6 +122,11 @@ {result, {default, broadcast}} | {error, stanza_error()}. +-callback remove_extra_items(NodeIdx :: nodeIdx(), + Max_Items :: unlimited | non_neg_integer()) -> + {result, {[itemId()], [itemId()]} + }. + -callback remove_extra_items(NodeIdx :: nodeIdx(), Max_Items :: unlimited | non_neg_integer(), ItemIds :: [itemId()]) -> diff --git a/src/gen_pubsub_nodetree.erl b/src/gen_pubsub_nodetree.erl index 5a24db2c4..b6b73b8cb 100644 --- a/src/gen_pubsub_nodetree.erl +++ b/src/gen_pubsub_nodetree.erl @@ -67,6 +67,9 @@ -callback get_nodes(Host :: host())-> [pubsubNode()]. +-callback get_all_nodes(Host :: host()) -> + [pubsubNode()]. + -callback get_parentnodes(Host :: host(), NodeId :: nodeId(), From :: jid:jid()) -> diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index c6f485077..8792b2ab9 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -45,6 +45,7 @@ -include("mod_roster.hrl"). -include("translate.hrl"). -include("ejabberd_stacktrace.hrl"). +-include("ejabberd_commands.hrl"). -define(STDTREE, <<"tree">>). -define(STDNODE, <<"flat">>). @@ -93,6 +94,9 @@ handle_call/3, handle_cast/2, handle_info/2, mod_doc/0, terminate/2, code_change/3, depends/2, mod_opt_type/1, mod_options/1]). +%% ejabberd commands +-export([get_commands_spec/0, delete_old_items/1]). + -export([route/1]). %%==================================================================== @@ -337,6 +341,7 @@ init([ServerHost|_]) -> false -> ok end, + ejabberd_commands:register_commands(?MODULE, get_commands_spec()), NodeTree = config(ServerHost, nodetree), Plugins = config(ServerHost, plugins), PepMapping = config(ServerHost, pep_mapping), @@ -806,7 +811,13 @@ terminate(_Reason, gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_COMMANDS), terminate_plugins(Host, ServerHost, Plugins, TreePlugin), ejabberd_router:unregister_route(Host) - end, Hosts). + end, Hosts), + case gen_mod:is_loaded_elsewhere(ServerHost, ?MODULE) of + false -> + ejabberd_commands:unregister_commands(get_commands_spec()); + true -> + ok + end. %%-------------------------------------------------------------------- %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} @@ -4142,6 +4153,46 @@ purge_offline(Host, LJID, Node) -> {error, xmpp:err_internal_server_error(Txt, Lang)} end. +-spec delete_old_items(non_neg_integer()) -> ok | error. +delete_old_items(N) -> + Results = lists:flatmap( + fun(Host) -> + case tree_action(Host, get_all_nodes, [Host]) of + Nodes when is_list(Nodes) -> + lists:map( + fun(#pubsub_node{id = Nidx, type = Type}) -> + case node_action(Host, Type, + remove_extra_items, + [Nidx , N]) of + {result, _} -> + ok; + {error, _} -> + error + end + end, Nodes); + _ -> + error + end + end, ejabberd_option:hosts()), + case lists:member(error, Results) of + true -> + error; + false -> + ok + end. + +-spec get_commands_spec() -> [ejabberd_commands()]. +get_commands_spec() -> + [#ejabberd_commands{name = delete_old_pubsub_items, tags = [purge], + desc = "Keep only NUMBER of PubSub items per node", + module = ?MODULE, function = delete_old_items, + args_desc = ["Number of items to keep per node"], + args = [{number, integer}], + result = {res, rescode}, + result_desc = "0 if command failed, 1 when succeeded", + args_example = [1000], + result_example = ok}]. + -spec mod_opt_type(atom()) -> econf:validator(). mod_opt_type(access_createnode) -> econf:acl(); diff --git a/src/node_flat.erl b/src/node_flat.erl index fe08be258..97f149f9c 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -39,7 +39,8 @@ -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, - publish_item/7, delete_item/4, remove_extra_items/3, + publish_item/7, delete_item/4, + remove_extra_items/2, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -403,6 +404,16 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload, end end. +remove_extra_items(Nidx, MaxItems) -> + {result, States} = get_states(Nidx), + Records = States ++ mnesia:read({pubsub_orphan, Nidx}), + ItemIds = lists:flatmap(fun(#pubsub_state{items = Is}) -> + Is; + (#pubsub_orphan{items = Is}) -> + Is + end, Records), + remove_extra_items(Nidx, MaxItems, ItemIds). + %% @doc

This function is used to remove extra items, most notably when the %% maximum number of items has been reached.

%%

This function is used internally by the core PubSub module, as no diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 5033eda51..724958eb1 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -40,9 +40,10 @@ -include("translate.hrl"). -export([init/3, terminate/2, options/0, features/0, - create_node_permission/6, create_node/2, delete_node/1, - purge_node/2, subscribe_node/8, unsubscribe_node/4, - publish_item/7, delete_item/4, remove_extra_items/3, + create_node_permission/6, create_node/2, delete_node/1, purge_node/2, + subscribe_node/8, unsubscribe_node/4, + publish_item/7, delete_item/4, + remove_extra_items/2, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -273,6 +274,9 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload, end end. +remove_extra_items(Nidx, MaxItems) -> + remove_extra_items(Nidx, MaxItems, itemids(Nidx)). + remove_extra_items(_Nidx, unlimited, ItemIds) -> {result, {ItemIds, []}}; remove_extra_items(Nidx, MaxItems, ItemIds) -> @@ -863,6 +867,18 @@ first_in_list(Pred, [H | T]) -> _ -> first_in_list(Pred, T) end. +itemids(Nidx) -> + case catch + ejabberd_sql:sql_query_t( + ?SQL("select @(itemid)s from pubsub_item where " + "nodeid=%(Nidx)d order by modification desc")) + of + {selected, RItems} -> + [ItemId || {ItemId} <- RItems]; + _ -> + [] + end. + itemids(Nidx, {_U, _S, _R} = JID) -> SJID = encode_jid(JID), SJIDLike = <<(encode_jid_like(JID))/binary, "/%">>, diff --git a/src/node_pep.erl b/src/node_pep.erl index 58c3050a0..44388ca31 100644 --- a/src/node_pep.erl +++ b/src/node_pep.erl @@ -35,7 +35,8 @@ -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, - publish_item/7, delete_item/4, remove_extra_items/3, + publish_item/7, delete_item/4, + remove_extra_items/2, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -135,6 +136,9 @@ publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload, PubOpts) -> node_flat:publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload, PubOpts). +remove_extra_items(Nidx, MaxItems) -> + node_flat:remove_extra_items(Nidx, MaxItems). + remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat:remove_extra_items(Nidx, MaxItems, ItemIds). diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index 7b21aa901..c0cf2b166 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -37,7 +37,8 @@ -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, - publish_item/7, delete_item/4, remove_extra_items/3, + publish_item/7, delete_item/4, + remove_extra_items/2, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -92,6 +93,9 @@ publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload, PubOpts) -> node_flat_sql:publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload, PubOpts). +remove_extra_items(Nidx, MaxItems) -> + node_flat_sql:remove_extra_items(Nidx, MaxItems). + remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat_sql:remove_extra_items(Nidx, MaxItems, ItemIds). diff --git a/src/nodetree_tree.erl b/src/nodetree_tree.erl index fe15f3323..853c1fb93 100644 --- a/src/nodetree_tree.erl +++ b/src/nodetree_tree.erl @@ -46,7 +46,8 @@ -export([init/3, terminate/2, options/0, set_node/1, get_node/3, get_node/2, get_node/1, get_nodes/2, - get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, + get_nodes/1, get_all_nodes/1, + get_parentnodes/3, get_parentnodes_tree/3, get_subnodes/3, get_subnodes_tree/3, create_node/6, delete_node/2]). @@ -98,6 +99,14 @@ get_nodes(Host, Limit) -> {Nodes, _} -> Nodes end. +get_all_nodes({_U, _S, _R} = Owner) -> + Host = jid:tolower(jid:remove_resource(Owner)), + mnesia:match_object(#pubsub_node{nodeid = {Host, '_'}, _ = '_'}); +get_all_nodes(Host) -> + mnesia:match_object(#pubsub_node{nodeid = {Host, '_'}, _ = '_'}) + ++ mnesia:match_object(#pubsub_node{nodeid = {{'_', Host, '_'}, '_'}, + _ = '_'}). + get_parentnodes(Host, Node, _From) -> case catch mnesia:read({pubsub_node, {Host, Node}}) of [Record] when is_record(Record, pubsub_node) -> diff --git a/src/nodetree_tree_sql.erl b/src/nodetree_tree_sql.erl index d68355202..402c50901 100644 --- a/src/nodetree_tree_sql.erl +++ b/src/nodetree_tree_sql.erl @@ -45,7 +45,8 @@ -export([init/3, terminate/2, options/0, set_node/1, get_node/3, get_node/2, get_node/1, get_nodes/2, - get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, + get_nodes/1, get_all_nodes/1, + get_parentnodes/3, get_parentnodes_tree/3, get_subnodes/3, get_subnodes_tree/3, create_node/6, delete_node/2]). @@ -165,6 +166,34 @@ get_nodes(Host, Limit) -> [] end. +get_all_nodes({_U, _S, _R} = JID) -> + SubKey = jid:tolower(JID), + GenKey = jid:remove_resource(SubKey), + EncKey = node_flat_sql:encode_jid(GenKey), + Pattern = <<(node_flat_sql:encode_jid_like(GenKey))/binary, "/%">>, + case ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(EncKey)s " + "or host like %(Pattern)s %ESCAPE")) of + {selected, RItems} -> + [raw_to_node(GenKey, Item) || Item <- RItems]; + _ -> + [] + end; +get_all_nodes(Host) -> + Pattern1 = <<"%@", Host/binary>>, + Pattern2 = <<"%@", Host/binary, "/%">>, + case ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(Host)s " + "or host like %(Pattern1)s " + "or host like %(Pattern2)s %ESCAPE")) of + {selected, RItems} -> + [raw_to_node(Host, Item) || Item <- RItems]; + _ -> + [] + end. + get_parentnodes(Host, Node, _From) -> case get_node(Host, Node) of Record when is_record(Record, pubsub_node) -> diff --git a/src/nodetree_virtual.erl b/src/nodetree_virtual.erl index 9cf7a80ca..c0274a795 100644 --- a/src/nodetree_virtual.erl +++ b/src/nodetree_virtual.erl @@ -38,7 +38,8 @@ -export([init/3, terminate/2, options/0, set_node/1, get_node/3, get_node/2, get_node/1, get_nodes/2, - get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, + get_nodes/1, get_all_nodes/1, + get_parentnodes/3, get_parentnodes_tree/3, get_subnodes/3, get_subnodes_tree/3, create_node/6, delete_node/2]). @@ -71,6 +72,9 @@ get_nodes(Host) -> get_nodes(_Host, _Limit) -> []. +get_all_nodes(_Host) -> + []. + get_parentnodes(_Host, _Node, _From) -> []. From 8af66b08316abc8efe2f549d202ded5aee703f94 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 18 Aug 2021 16:40:13 +0200 Subject: [PATCH 020/440] Update API Reference page menu name and order --- src/ejabberd_commands_doc.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index 582908723..f63326182 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -480,7 +480,7 @@ generate_md_output(File, RegExp, Languages) -> end, Cmds2), Cmds4 = [maybe_add_policy_arguments(Cmd) || Cmd <- Cmds3], Langs = binary:split(Languages, <<",">>, [global]), - Header = <<"---\ntitle: Administration API reference\ntoc: true\nmenu: Administration API\norder: 40\n" + Header = <<"---\ntitle: Administration API reference\ntoc: true\nmenu: API Reference\norder: 1\n" "// Autogenerated with 'ejabberdctl gen_markdown_doc_for_commands'\n---\n\n" "This section describes API of ejabberd.">>, Out = lists:map(fun(C) -> gen_doc(C, false, Langs) end, Cmds4), From b7f7713faefeab6f45994c0c940497b1c3ee7619 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 18 Aug 2021 13:39:17 +0200 Subject: [PATCH 021/440] Add example config to mod_http_api documentation --- src/mod_http_api.erl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mod_http_api.erl b/src/mod_http_api.erl index 0a3942024..0f494bb3a 100644 --- a/src/mod_http_api.erl +++ b/src/mod_http_api.erl @@ -533,4 +533,14 @@ mod_doc() -> "in the request_handlers, add a 'vN'. " "For example: '/api/v2: mod_http_api'"), "", ?T("To run a command, send a POST request to the corresponding " - "URL: 'http://localhost:5280/api/'")]}. + "URL: 'http://localhost:5280/api/'")], + example => + ["listen:", + " -", + " port: 5280", + " module: ejabberd_http", + " request_handlers:", + " /api: mod_http_api", + "", + "modules:", + " mod_http_api: {}"]}. From 69d362595e5aab86383f0596a0613af233358d31 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 18 Aug 2021 13:40:09 +0200 Subject: [PATCH 022/440] Remove obsolete mod_register_web ideas and improve documentation --- src/mod_register_web.erl | 56 ++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index 9c2179302..28bac0558 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -23,32 +23,6 @@ %%% %%%---------------------------------------------------------------------- -%%% IDEAS: -%%% -%%% * Implement those options, already present in mod_register: -%%% + access -%%% + captcha_protected -%%% + password_strength -%%% + welcome_message -%%% + registration_timeout -%%% -%%% * Improve this module to allow each virtual host to have different -%%% options. See http://support.process-one.net/browse/EJAB-561 -%%% -%%% * Check that all the text is translatable. -%%% -%%% * Add option to use a custom CSS file, or custom CSS lines. -%%% -%%% * Don't hardcode the "register" path in URL. -%%% -%%% * Allow private email during register, and store in custom table. -%%% * Optionally require private email to register. -%%% * Optionally require email confirmation to register. -%%% * Allow to set a private email address anytime. -%%% * Allow to recover password using private email to confirm (mod_passrecover) -%%% * Optionally require invitation -%%% * Optionally register request is forwarded to admin, no account created. - -module(mod_register_web). -author('badlop@process-one.net'). @@ -625,13 +599,27 @@ mod_doc() -> ?T("- Register a new account on the server."), "", ?T("- Change the password from an existing account on the server."), "", ?T("- Unregister an existing account on the server."), "", - ?T("This module supports CAPTCHA image to register a new account. " - "To enable this feature, configure the options 'captcha\_cmd' " - "and 'captcha\_url', which are documented in the section with " - "top-level options."), "", - ?T("As an example usage, the users of the host 'example.org' can " - "visit the page: 'https://example.org:5281/register/' It is " + ?T("This module supports http://../basic/#captcha[CAPTCHA] " + "to register a new account. " + "To enable this feature, configure the " + "top-level _`captcha_cmd`_ and " + "top-level _`captcha_url`_ options."), "", + ?T("As an example usage, the users of the host 'localhost' can " + "visit the page: 'https://localhost:5280/register/' It is " "important to include the last / character in the URL, " "otherwise the subpages URL will be incorrect."), "", - ?T("The module depends on 'mod_register' where all the configuration " - "is performed.")]}. + ?T("This module is enabled in 'listen' -> 'ejabberd_http' -> " + "http://../listen-options/#request-handlers[request_handlers], " + "no need to enable in 'modules'."), + ?T("The module depends on _`mod_register`_ where all the " + "configuration is performed.")], + example => + ["listen:", + " -", + " port: 5280", + " module: ejabberd_http", + " request_handlers:", + " /register: mod_register_web", + "", + "modules:", + " mod_register: {}"]}. From 94fb0a65b0af8a26c21c08d2e43d3528a4bffdc6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 21 Aug 2021 23:20:35 +0200 Subject: [PATCH 023/440] Change set_master command tag from mnesia to cluster --- src/ejabberd_admin.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 23becc7f2..9cebd0bb5 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -326,7 +326,7 @@ get_commands_spec() -> args_example = ["example.com", "/var/lib/ejabberd/example.com.sql"], args = [{host, string}, {file, string}], result = {res, rescode}}, - #ejabberd_commands{name = set_master, tags = [mnesia], + #ejabberd_commands{name = set_master, tags = [cluster], desc = "Set master node of the clustered Mnesia tables", longdesc = "If you provide as nodename \"self\", this " "node will be set as its own master.", From 9446b251fd0aa6b858ad35bf779841659252f2d0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 11:51:01 +0200 Subject: [PATCH 024/440] Export function, so ACME API commands are listed in the documentation --- src/ejabberd_acme.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_acme.erl b/src/ejabberd_acme.erl index 42f17baa1..93ce3c815 100644 --- a/src/ejabberd_acme.erl +++ b/src/ejabberd_acme.erl @@ -27,7 +27,8 @@ %% Hooks -export([ejabberd_started/0, register_certfiles/0, cert_expired/2]). %% ejabberd commands --export([request_certificate/1, revoke_certificate/1, list_certificates/0]). +-export([get_commands_spec/0, request_certificate/1, + revoke_certificate/1, list_certificates/0]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3, format_status/2]). From f5038b86f83d811e33c81e3282f9469c9f370dd9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 12:48:06 +0200 Subject: [PATCH 025/440] Copy log_rotate_count explanation from docs site --- src/ejabberd_options_doc.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 64eb850d8..8f6ab45b1 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -799,7 +799,8 @@ doc() -> #{value => ?T("Number"), desc => ?T("The number of rotated log files to keep. " - "The default value is '1'.")}}, + "The default value is '1', which means that only keeps " + "`ejabberd.log.0`, `error.log.0` and `crash.log.0`.")}}, {log_rotate_size, #{value => "pos_integer() | infinity", desc => From 30ae66e99e4a7499886436b195311ff012f09fda Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 13:40:19 +0200 Subject: [PATCH 026/440] Improve formatting and add sections links --- src/ejabberd_options_doc.erl | 30 +++++++++++++++++------------- src/mod_admin_update_sql.erl | 2 +- src/mod_http_api.erl | 4 ++-- src/mod_http_upload.erl | 5 +++-- src/mod_mqtt.erl | 5 +++-- src/mod_register.erl | 11 +++++------ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 8f6ab45b1..ee1cf9add 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -313,10 +313,12 @@ doc() -> {anonymous_protocol, #{value => "login_anon | sasl_anon | both", desc => - ?T("'login_anon' means that the anonymous login method will be used. " - "'sasl_anon' means that the SASL Anonymous method will be used. " - "'both' means that SASL Anonymous and login anonymous are both " - "enabled. The default value is 'sasl_anon'.")}}, + [?T("Define what anonymous protocol will be used: "), "", + ?T("* 'login_anon' means that the anonymous login method will be used. "), "", + ?T("* 'sasl_anon' means that the SASL Anonymous method will be used. "), "", + ?T("* 'both' means that SASL Anonymous and login anonymous are both " + "enabled."), "", + ?T("The default value is 'sasl_anon'."), ""]}}, {api_permissions, #{value => "[Permission, ...]", desc => @@ -359,26 +361,28 @@ doc() -> desc => ?T("This is used by the contributed module " "'ejabberd_auth_http' that can be installed from the " - "'ejabberd-contrib' Git repository. Please refer to that " + "https://github.com/processone/ejabberd-contrib[ejabberd-contrib] " + "Git repository. Please refer to that " "module's README file for details.")}}, {auth_password_format, #{value => "plain | scram", note => "improved in 20.01", desc => - ?T("The option defines in what format the users passwords " - "are stored. 'plain': The password is stored as plain text " + [?T("The option defines in what format the users passwords " + "are stored:"), "", + ?T("* 'plain': The password is stored as plain text " "in the database. This is risky because the passwords " "can be read if your database gets compromised. " "This is the default value. This format allows clients to " "authenticate using: the old Jabber Non-SASL (XEP-0078), " - "SASL PLAIN, SASL DIGEST-MD5, and SASL SCRAM-SHA-1. " - "'scram': The password is not stored, only some information " + "SASL PLAIN, SASL DIGEST-MD5, and SASL SCRAM-SHA-1. "), "", + ?T("* 'scram': The password is not stored, only some information " "that allows to verify the hash provided by the client. " "It is impossible to obtain the original plain password " "from the stored information; for this reason, when this " "value is configured it cannot be changed to plain anymore. " "This format allows clients to authenticate using: " - "SASL PLAIN and SASL SCRAM-SHA-1.")}}, + "SASL PLAIN and SASL SCRAM-SHA-1.")]}}, {auth_scram_hash, #{value => "sha | sha256 | sha512", desc => @@ -449,13 +453,13 @@ doc() -> {captcha_cmd, #{value => ?T("Path"), desc => - ?T("Full path to a script that generates CAPTCHA images. " + ?T("Full path to a script that generates http://../basic/#captcha[CAPTCHA] images. " "There is no default value: when this option is not " "set, CAPTCHA functionality is completely disabled.")}}, {captcha_limit, #{value => "pos_integer() | infinity", desc => - ?T("Maximum number of CAPTCHA generated images per minute for " + ?T("Maximum number of http://../basic/#captcha[CAPTCHA] generated images per minute for " "any given JID. The option is intended to protect the server " "from CAPTCHA DoS. The default value is 'infinity'.")}}, {captcha_host, @@ -464,7 +468,7 @@ doc() -> {captcha_url, #{value => ?T("URL"), desc => - ?T("An URL where CAPTCHA requests should be sent. NOTE: you need " + ?T("An URL where http://../basic/#captcha[CAPTCHA] requests should be sent. NOTE: you need " "to configure 'request_handlers' for 'ejabberd_http' listener " "as well. There is no default value.")}}, {certfiles, diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index eae481385..c87849748 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -364,6 +364,6 @@ mod_doc() -> #{desc => ?T("This module can be used to update existing SQL database " "from the default to the new schema. Check the section " - "http://../database-ldap/#default-and-new-schemas[Default and New Schemas] for details. " + "http://../database/#default-and-new-schemas[Default and New Schemas] for details. " "Please note that only PostgreSQL is supported. " "When the module is loaded use 'update_sql' ejabberdctl command.")}. diff --git a/src/mod_http_api.erl b/src/mod_http_api.erl index 0f494bb3a..427833584 100644 --- a/src/mod_http_api.erl +++ b/src/mod_http_api.erl @@ -527,8 +527,8 @@ mod_doc() -> [?T("This module provides a ReST API to call ejabberd commands " "using JSON data."), "", ?T("To use this module, in addition to adding it to the 'modules' " - "section, you must also add it to 'request_handlers' of some " - "listener."), "", + "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " + "http://../listen-options/#request-handlers[request_handlers]."), "", ?T("To use a specific API version N, when defining the URL path " "in the request_handlers, add a 'vN'. " "For example: '/api/v2: mod_http_api'"), "", diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 0cc8d8488..040cb6085 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -232,8 +232,9 @@ mod_doc() -> "[XEP-0363: HTTP File Upload]. If the request is accepted, " "the client receives a URL for uploading the file and " "another URL from which that file can later be downloaded."), "", - ?T("In order to use this module, it must be configured as " - "a 'request_handler' for 'ejabberd_http' listener.")], + ?T("In order to use this module, it must be enabled " + "in 'listen' -> 'ejabberd_http' -> " + "http://../listen-options/#request-handlers[request_handlers].")], opts => [{host, #{desc => ?T("Deprecated. Use 'hosts' instead.")}}, diff --git a/src/mod_mqtt.erl b/src/mod_mqtt.erl index 8734c778d..a1621cc01 100644 --- a/src/mod_mqtt.erl +++ b/src/mod_mqtt.erl @@ -278,8 +278,9 @@ listen_options() -> %%%=================================================================== mod_doc() -> #{desc => - ?T("This module adds support for the MQTT protocol " - "version '3.1.1' and '5.0'. Remember to configure " + ?T("This module adds " + "https://docs.ejabberd.im/admin/guide/mqtt/[support for the MQTT] " + "protocol version '3.1.1' and '5.0'. Remember to configure " "'mod_mqtt' in 'modules' and 'listen' sections."), opts => [{access_subscribe, diff --git a/src/mod_register.erl b/src/mod_register.erl index a864c0df2..919440b23 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -638,9 +638,9 @@ mod_doc() -> ?T("* Register a new account on the server."), "", ?T("* Change the password from an existing account on the server."), "", ?T("* Delete an existing account on the server."), "", - ?T("This module reads also another option defined globally for the " - "server: 'registration_timeout'. Please check that option " - "documentation in the section with top-level options.")], + ?T("This module reads also the top-level _`registration_timeout`_ " + "option defined globally for the server, " + "so please check that option documentation too.")], opts => [{access, #{value => ?T("AccessName"), @@ -664,9 +664,8 @@ mod_doc() -> {captcha_protected, #{value => "true | false", desc => - ?T("Protect registrations with CAPTCHA (see section " - "https://docs.ejabberd.im/admin/configuration/basic/#captcha[CAPTCHA] " - "of the Configuration Guide). The default is 'false'.")}}, + ?T("Protect registrations with http://../basic/#captcha[CAPTCHA]. " + "The default is 'false'.")}}, {ip_access, #{value => ?T("AccessName"), desc => From 506e2f3b972a7e1b6d4fdd40836b9574c4937908 Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 21 Aug 2021 18:31:21 +0200 Subject: [PATCH 027/440] Use specific syntax so modules and top-level will be links If we use _`whatever`_ here in ejabberd man pages, it is converted to *`whatever`* in markdown, and docs.ejabberd.im/Makefile converts to the proper links --- src/ejabberd_options_doc.erl | 142 ++++++++++++++++----------------- src/mod_admin_update_sql.erl | 2 +- src/mod_announce.erl | 14 ++-- src/mod_avatar.erl | 4 +- src/mod_bosh.erl | 12 +-- src/mod_caps.erl | 12 +-- src/mod_configure.erl | 2 +- src/mod_delegation.erl | 2 +- src/mod_http_upload.erl | 2 +- src/mod_last.erl | 10 +-- src/mod_mam.erl | 14 ++-- src/mod_mix.erl | 6 +- src/mod_mix_pam.erl | 10 +-- src/mod_mqtt.erl | 14 ++-- src/mod_muc.erl | 4 +- src/mod_muc_admin.erl | 2 +- src/mod_muc_log.erl | 2 +- src/mod_offline.erl | 8 +- src/mod_ping.erl | 4 +- src/mod_privacy.erl | 12 +-- src/mod_private.erl | 10 +-- src/mod_privilege.erl | 2 +- src/mod_pubsub.erl | 4 +- src/mod_push.erl | 10 +-- src/mod_push_keepalive.erl | 8 +- src/mod_roster.erl | 14 ++-- src/mod_shared_roster.erl | 14 ++-- src/mod_shared_roster_ldap.erl | 2 +- src/mod_stream_mgmt.erl | 6 +- src/mod_vcard.erl | 10 +-- src/mod_vcard_ldap.erl | 2 +- src/mod_vcard_xupdate.erl | 12 +-- 32 files changed, 186 insertions(+), 186 deletions(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index ee1cf9add..28a6f6333 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -64,8 +64,8 @@ doc() -> "erased from cache. The default value is 'one hour'. " "Several modules have a similar option; and some core " "ejabberd parts support similar options too, see " - "'auth_cache_life_time', 'oauth_cache_life_time', " - "'router_cache_life_time', and 'sm_cache_life_time'.")}}, + "_`auth_cache_life_time`_, _`oauth_cache_life_time`_, " + "_`router_cache_life_time`_, and _`sm_cache_life_time`_.")}}, {cache_missed, #{value => "true | false", desc => @@ -73,12 +73,12 @@ doc() -> "an attempt to lookup for a value in a database and " "this value is not found and the option is set to 'true', " "this attempt will be cached and no attempts will be " - "performed until the cache expires (see 'cache_life_time'). " + "performed until the cache expires (see _`cache_life_time`_). " "Usually you don't want to change it. Default is 'true'. " "Several modules have a similar option; and some core " "ejabberd parts support similar options too, see " - "'auth_cache_missed', 'oauth_cache_missed', " - "'router_cache_missed', and 'sm_cache_missed'.")}}, + "_`auth_cache_missed`_, _`oauth_cache_missed`_, " + "_`router_cache_missed`_, and _`sm_cache_missed`_.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => @@ -93,16 +93,16 @@ doc() -> "performance. The default value is '1000'. " "Several modules have a similar option; and some core " "ejabberd parts support similar options too, see " - "'auth_cache_size', 'oauth_cache_size', " - "'router_cache_size', and 'sm_cache_size'.")}}, + "_`auth_cache_size`_, _`oauth_cache_size`_, " + "_`router_cache_size`_, and _`sm_cache_size`_.")}}, {use_cache, #{value => "true | false", desc => ?T("Enable or disable cache. The default is 'true'. " "Several modules have a similar option; and some core " "ejabberd parts support similar options too, see " - "'auth_use_cache', 'oauth_use_cache', 'router_use_cache', " - "and 'sm_use_cache'.")}}, + "_`auth_use_cache`_, _`oauth_use_cache`_, _`router_use_cache`_, " + "and _`sm_use_cache`_.")}}, {default_db, #{value => "mnesia | sql", desc => @@ -122,14 +122,14 @@ doc() -> "Modules may have its own value of the option. " "The value of 'ram' means that queues will be kept in memory. " "If value 'file' is set, you may also specify directory " - "in 'queue_dir' option where file queues will be placed. " + "in _`queue_dir`_ option where file queues will be placed. " "The default value is 'ram'.")}}, {version, #{value => "string()", desc => ?T("The option can be used to set custom ejabberd version, " "that will be used by different parts of ejabberd, for " - "example by 'mod_version' module. The default value is " + "example by _`mod_version`_ module. The default value is " "obtained at compile time from the underlying version " "control system.")}}, {acl, @@ -141,7 +141,7 @@ doc() -> "has name 'ACLName': it can be any string except 'all' or 'none' " "(those are predefined names for the rules that match all or nothing " "respectively). The name 'ACLName' can be referenced from other " - "parts of the configuration file, for example in 'access_rules' " + "parts of the configuration file, for example in _`access_rules`_ " "option. The rules of 'ACLName' are represented by mapping " "'pass:[{ACLType: ACLValue}]'. These can be one of the following:")}, [{user, @@ -225,7 +225,7 @@ doc() -> "of the configuration file (mostly from 'access' options of " "ejabberd modules). Each rule definition may contain " "arbitrary number of 'allow' or 'deny' sections, and each " - "section may contain any number of ACL rules (see 'acl' option). " + "section may contain any number of ACL rules (see _`acl`_ option). " "There are no access rules defined by default."), example => ["access_rules:", @@ -336,18 +336,18 @@ doc() -> {auth_cache_life_time, #{value => "timeout()", desc => - ?T("Same as 'cache_life_time', but applied to authentication cache " - "only. If not set, the value from 'cache_life_time' will be used.")}}, + ?T("Same as _`cache_life_time`_, but applied to authentication cache " + "only. If not set, the value from _`cache_life_time`_ will be used.")}}, {auth_cache_missed, #{value => "true | false", desc => - ?T("Same as 'cache_missed', but applied to authentication cache " - "only. If not set, the value from 'cache_missed' will be used.")}}, + ?T("Same as _`cache_missed`_, but applied to authentication cache " + "only. If not set, the value from _`cache_missed`_ will be used.")}}, {auth_cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as 'cache_size', but applied to authentication cache " - "only. If not set, the value from 'cache_size' will be used.")}}, + ?T("Same as _`cache_size`_, but applied to authentication cache " + "only. If not set, the value from _`cache_size`_ will be used.")}}, {auth_method, #{value => "[mnesia | sql | anonymous | external | jwt | ldap | pam, ...]", desc => @@ -393,8 +393,8 @@ doc() -> {auth_use_cache, #{value => "true | false", desc => - ?T("Same as 'use_cache', but applied to authentication cache " - "only. If not set, the value from 'use_cache' will be used.")}}, + ?T("Same as _`use_cache`_, but applied to authentication cache " + "only. If not set, the value from _`use_cache`_ will be used.")}}, {c2s_cafile, #{value => ?T("Path"), desc => @@ -464,7 +464,7 @@ doc() -> "from CAPTCHA DoS. The default value is 'infinity'.")}}, {captcha_host, #{value => "String", - desc => ?T("Deprecated. Use 'captcha_url' instead.")}}, + desc => ?T("Deprecated. Use _`captcha_url`_ instead.")}}, {captcha_url, #{value => ?T("URL"), desc => @@ -688,7 +688,7 @@ doc() -> #{value => "[Host, ...]", desc => ?T("A list of IP addresses or DNS names of LDAP backup servers. " - "When no servers listed in 'ldap_servers' option are reachable, " + "When no servers listed in _`ldap_servers`_ option are reachable, " "ejabberd will try to connect to these backup servers. " "The default is an empty list, i.e. no backup servers specified. " "WARNING: ejabberd doesn't try to reconnect back to the main " @@ -795,7 +795,7 @@ doc() -> "the result set. There is no default value, which means the " "result is not filtered. WARNING: Since this filter makes " "additional LDAP lookups, use it only as the last resort: " - "try to define all filter rules in 'ldap_filter' option if possible."), + "try to define all filter rules in _`ldap_filter`_ option if possible."), example => ["ldap_dn_filter:", " \"(&(name=%s)(owner=%D)(user=%u@%d))\": [sn]"]}}, @@ -866,13 +866,13 @@ doc() -> {oauth_cache_life_time, #{value => "timeout()", desc => - ?T("Same as 'cache_life_time', but applied to OAuth cache " - "only. If not set, the value from 'cache_life_time' will be used.")}}, + ?T("Same as _`cache_life_time`_, but applied to OAuth cache " + "only. If not set, the value from _`cache_life_time`_ will be used.")}}, {oauth_cache_missed, #{value => "true | false", desc => - ?T("Same as 'cache_missed', but applied to OAuth cache " - "only. If not set, the value from 'cache_missed' will be used.")}}, + ?T("Same as _`cache_missed`_, but applied to OAuth cache " + "only. If not set, the value from _`cache_missed`_ will be used.")}}, {oauth_cache_rest_failure_life_time, #{value => "timeout()", note => "added in 21.01", @@ -882,8 +882,8 @@ doc() -> {oauth_cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as 'cache_size', but applied to OAuth cache " - "only. If not set, the value from 'cache_size' will be used.")}}, + ?T("Same as _`cache_size`_, but applied to OAuth cache " + "only. If not set, the value from _`cache_size`_ will be used.")}}, {oauth_client_id_check, #{value => "allow | db | deny", desc => @@ -893,13 +893,13 @@ doc() -> {oauth_use_cache, #{value => "true | false", desc => - ?T("Same as 'use_cache', but applied to OAuth cache " - "only. If not set, the value from 'use_cache' will be used.")}}, + ?T("Same as _`use_cache`_, but applied to OAuth cache " + "only. If not set, the value from _`use_cache`_ will be used.")}}, {oauth_db_type, #{value => "mnesia | sql", desc => ?T("Database backend to use for OAuth authentication. " - "The default value is picked from 'default_db' option, or " + "The default value is picked from _`default_db`_ option, or " "if it's not set, 'mnesia' will be used.")}}, {oauth_expire, #{value => "timeout()", @@ -913,7 +913,7 @@ doc() -> desc => ?T("Enable or disable OOM (out-of-memory) killer. " "When system memory raises above the limit defined in " - "'oom_watermark' option, ejabberd triggers OOM killer " + "_`oom_watermark`_ option, ejabberd triggers OOM killer " "to terminate most memory consuming Erlang processes. " "Note that in order to maintain functionality, ejabberd only " "attempts to kill transient processes, such as those managing " @@ -924,14 +924,14 @@ doc() -> desc => ?T("Trigger OOM killer when some of the running Erlang processes " "have messages queue above this 'Size'. Note that " - "such processes won't be killed if 'oom_killer' option is set " + "such processes won't be killed if _`oom_killer`_ option is set " "to 'false' or if 'oom_watermark' is not reached yet.")}}, {oom_watermark, #{value => ?T("Percent"), desc => ?T("A percent of total system memory consumed at which " "OOM killer should be activated with some of the processes " - "possibly be killed (see 'oom_killer' option). Later, when " + "possibly be killed (see _`oom_killer`_ option). Later, when " "memory drops below this 'Percent', OOM killer is deactivated. " "The default value is '80' percents.")}}, {outgoing_s2s_families, @@ -984,7 +984,7 @@ doc() -> {queue_dir, #{value => ?T("Directory"), desc => - ?T("If 'queue_type' option is set to 'file', use this 'Directory' " + ?T("If _`queue_type`_ option is set to 'file', use this 'Directory' " "to store file queues. The default is to keep queues inside " "Mnesia directory.")}}, {redis_connect_timeout, @@ -1014,8 +1014,8 @@ doc() -> #{value => "ram | file", desc => ?T("The type of request queue for the Redis server. " - "See description of 'queue_type' option for the explanation. " - "The default value is the value defined in 'queue_type' " + "See description of _`queue_type`_ option for the explanation. " + "The default value is the value defined in _`queue_type`_ " "or 'ram' if the latter is not set.")}}, {redis_server, #{value => ?T("Hostname"), @@ -1025,7 +1025,7 @@ doc() -> {registration_timeout, #{value => "timeout()", desc => - ?T("This is a global option for module 'mod_register'. " + ?T("This is a global option for module _`mod_register`_. " "It limits the frequency of registrations from a given " "IP or username. So, a user that tries to register a " "new account from the same IP address or JID during " @@ -1048,29 +1048,29 @@ doc() -> {router_cache_life_time, #{value => "timeout()", desc => - ?T("Same as 'cache_life_time', but applied to routing table cache " - "only. If not set, the value from 'cache_life_time' will be used.")}}, + ?T("Same as _`cache_life_time`_, but applied to routing table cache " + "only. If not set, the value from _`cache_life_time`_ will be used.")}}, {router_cache_missed, #{value => "true | false", desc => - ?T("Same as 'cache_missed', but applied to routing table cache " - "only. If not set, the value from 'cache_missed' will be used.")}}, + ?T("Same as _`cache_missed`_, but applied to routing table cache " + "only. If not set, the value from _`cache_missed`_ will be used.")}}, {router_cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as 'cache_size', but applied to routing table cache " - "only. If not set, the value from 'cache_size' will be used.")}}, + ?T("Same as _`cache_size`_, but applied to routing table cache " + "only. If not set, the value from _`cache_size`_ will be used.")}}, {router_db_type, #{value => "mnesia | redis | sql", desc => ?T("Database backend to use for routing information. " - "The default value is picked from 'default_ram_db' option, or " + "The default value is picked from _`default_ram_db`_ option, or " "if it's not set, 'mnesia' will be used.")}}, {router_use_cache, #{value => "true | false", desc => - ?T("Same as 'use_cache', but applied to routing table cache " - "only. If not set, the value from 'use_cache' will be used.")}}, + ?T("Same as _`use_cache`_, but applied to routing table cache " + "only. If not set, the value from _`use_cache`_ will be used.")}}, {rpc_timeout, #{value => "timeout()", desc => @@ -1147,8 +1147,8 @@ doc() -> #{value => "ram | file", desc => ?T("The type of a queue for s2s packets. " - "See description of 'queue_type' option for the explanation. " - "The default value is the value defined in 'queue_type' " + "See description of _`queue_type`_ option for the explanation. " + "The default value is the value defined in _`queue_type`_ " "or 'ram' if the latter is not set.")}}, {s2s_timeout, #{value => "timeout()", @@ -1176,7 +1176,7 @@ doc() -> desc => ?T("The option defines a set of shapers. Every shaper is assigned " "a name 'ShaperName' that can be used in other parts of the " - "configuration file, such as 'shaper_rules' option. The shaper " + "configuration file, such as _`shaper_rules`_ option. The shaper " "itself is defined by its 'Rate', where 'Rate' stands for the " "maximum allowed incoming rate in **bytes** per second. " "When a connection exceeds this limit, ejabberd stops reading " @@ -1192,9 +1192,9 @@ doc() -> #{value => "{ShaperRuleName: {Number|ShaperName: ACLRule|ACLName}}", desc => ?T("An entry allowing to declaring shaper to use for matching user/hosts. " - "Semantics is similar to 'access_rules' option, the only difference is " + "Semantics is similar to _`access_rules`_ option, the only difference is " "that instead using 'allow' or 'deny', a name of a shaper (defined in " - "'shaper' option) or a positive number should be used."), + "_`shaper`_ option) or a positive number should be used."), example => ["shaper_rules:", " connections_limit:", @@ -1210,29 +1210,29 @@ doc() -> {sm_cache_life_time, #{value => "timeout()", desc => - ?T("Same as 'cache_life_time', but applied to client sessions table cache " - "only. If not set, the value from 'cache_life_time' will be used.")}}, + ?T("Same as _`cache_life_time`_, but applied to client sessions table cache " + "only. If not set, the value from _`cache_life_time`_ will be used.")}}, {sm_cache_missed, #{value => "true | false", desc => - ?T("Same as 'cache_missed', but applied to client sessions table cache " - "only. If not set, the value from 'cache_missed' will be used.")}}, + ?T("Same as _`cache_missed`_, but applied to client sessions table cache " + "only. If not set, the value from _`cache_missed`_ will be used.")}}, {sm_cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as 'cache_size', but applied to client sessions table cache " - "only. If not set, the value from 'cache_size' will be used.")}}, + ?T("Same as _`cache_size`_, but applied to client sessions table cache " + "only. If not set, the value from _`cache_size`_ will be used.")}}, {sm_db_type, #{value => "mnesia | redis | sql", desc => ?T("Database backend to use for client sessions information. " - "The default value is picked from 'default_ram_db' option, or " + "The default value is picked from _`default_ram_db`_ option, or " "if it's not set, 'mnesia' will be used.")}}, {sm_use_cache, #{value => "true | false", desc => - ?T("Same as 'use_cache', but applied to client sessions table cache " - "only. If not set, the value from 'use_cache' will be used.")}}, + ?T("Same as _`use_cache`_, but applied to client sessions table cache " + "only. If not set, the value from _`use_cache`_ will be used.")}}, {sql_type, #{value => "mssql | mysql | odbc | pgsql | sqlite", desc => @@ -1258,7 +1258,7 @@ doc() -> note => "added in 20.12", desc => ?T("Path to the ODBC driver to use to connect to a Microsoft SQL " - "Server database. This option is only valid if the 'sql_type' " + "Server database. This option is only valid if the _`sql_type`_ " "option is set to 'mssql'. " "The default value is: 'libtdsodbc.so'")}}, {sql_password, @@ -1293,8 +1293,8 @@ doc() -> #{value => "ram | file", desc => ?T("The type of a request queue for the SQL server. " - "See description of 'queue_type' option for the explanation. " - "The default value is the value defined in 'queue_type' " + "See description of _`queue_type`_ option for the explanation. " + "The default value is the value defined in _`queue_type`_ " "or 'ram' if the latter is not set.")}}, {sql_server, #{value => ?T("Host"), @@ -1312,15 +1312,15 @@ doc() -> #{value => ?T("Path"), desc => ?T("A path to a file with CA root certificates that will " - "be used to verify SQL connections. Implies 'sql_ssl' " - "and 'sql_ssl_verify' options are set to 'true'. " + "be used to verify SQL connections. Implies _`sql_ssl`_ " + "and _`sql_ssl_verify`_ options are set to 'true'. " "There is no default which means " "certificate verification is disabled.")}}, {sql_ssl_certfile, #{value => ?T("Path"), desc => ?T("A path to a certificate file that will be used " - "for SSL connections to the SQL server. Implies 'sql_ssl' " + "for SSL connections to the SQL server. Implies _`sql_ssl`_ " "option is set to 'true'. There is no default which means " "ejabberd won't provide a client certificate to the SQL " "server.")}}, @@ -1328,8 +1328,8 @@ doc() -> #{value => "true | false", desc => ?T("Whether to verify SSL connection to the SQL server against " - "CA root certificates defined in 'sql_ssl_cafile' option. " - "Implies 'sql_ssl' option is set to 'true'. " + "CA root certificates defined in _`sql_ssl_cafile`_ option. " + "Implies _`sql_ssl`_ option is set to 'true'. " "The default value is 'false'.")}}, {sql_start_interval, #{value => "timeout()", diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index c87849748..4e932fe83 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -366,4 +366,4 @@ mod_doc() -> "from the default to the new schema. Check the section " "http://../database/#default-and-new-schemas[Default and New Schemas] for details. " "Please note that only PostgreSQL is supported. " - "When the module is loaded use 'update_sql' ejabberdctl command.")}. + "When the module is loaded use _`update_sql`_ API.")}. diff --git a/src/mod_announce.erl b/src/mod_announce.erl index e0501d96b..21213615c 100644 --- a/src/mod_announce.erl +++ b/src/mod_announce.erl @@ -930,7 +930,7 @@ mod_doc() -> "should be disabled for instances of ejabberd with hundreds of " "thousands users."), "", ?T("The Ad-hoc Commands are listed in the Server Discovery. " - "For this feature to work, 'mod_adhoc' must be enabled."), "", + "For this feature to work, _`mod_adhoc`_ must be enabled."), "", ?T("The specific JIDs where messages can be sent are listed below. " "The first JID in each entry will apply only to the specified " "virtual host example.org, while the JID between brackets " @@ -940,7 +940,7 @@ mod_doc() -> "online and connected to several resources, only the resource " "with the highest priority will receive the message. " "If the registered user is not connected, the message will be " - "stored offline in assumption that offline storage (see 'mod_offline') " + "stored offline in assumption that offline storage (see _`mod_offline`_) " "is enabled."), "- example.org/announce/online (example.org/announce/all-hosts/online)::", ?T("The message is sent to all connected users. If the user is " @@ -965,20 +965,20 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. diff --git a/src/mod_avatar.erl b/src/mod_avatar.erl index 3ad55f6d0..09329853d 100644 --- a/src/mod_avatar.erl +++ b/src/mod_avatar.erl @@ -469,8 +469,8 @@ mod_doc() -> "[XEP-0398: User Avatar to vCard-Based Avatars Conversion]."), "", ?T("Also, the module supports conversion between avatar " "image formats on the fly."), "", - ?T("The module depends on 'mod_vcard', 'mod_vcard_xupdate' and " - "'mod_pubsub'.")], + ?T("The module depends on _`mod_vcard`_, _`mod_vcard_xupdate`_ and " + "_`mod_pubsub`_.")], opts => [{convert, #{value => "{From: To}", diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 1770d27a7..37a7fa809 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -240,27 +240,27 @@ mod_doc() -> {queue_type, #{value => "ram | file", desc => - ?T("Same as top-level 'queue_type' option, but applied to this module only.")}}, + ?T("Same as top-level _`queue_type`_ option, but applied to this module only.")}}, {ram_db_type, #{value => "mnesia | sql | redis", desc => - ?T("Same as 'default_ram_db' but applied to this module only.")}}, + ?T("Same as _`default_ram_db`_ but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}], + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}], example => ["listen:", " -", diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 92869fc7d..c8f548169 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -595,25 +595,25 @@ mod_doc() -> "https://xmpp.org/extensions/xep-0115.html" "[XEP-0115: Entity Capabilities]."), ?T("The main purpose of the module is to provide " - "PEP functionality (see 'mod_pubsub').")], + "PEP functionality (see _`mod_pubsub`_).")], opts => [{db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 99a20ef3a..32c7ebb31 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -1564,4 +1564,4 @@ mod_doc() -> ?T("The module provides server configuration functionality via " "https://xmpp.org/extensions/xep-0050.html" "[XEP-0050: Ad-Hoc Commands]. This module requires " - "'mod_adhoc' to be loaded.")}. + "_`mod_adhoc`_ to be loaded.")}. diff --git a/src/mod_delegation.erl b/src/mod_delegation.erl index a588e81ef..3ae3b8a51 100644 --- a/src/mod_delegation.erl +++ b/src/mod_delegation.erl @@ -95,7 +95,7 @@ mod_doc() -> ?T("WARNING: Security issue: Namespace delegation gives components " "access to sensitive data, so permission should be granted " "carefully, only if you trust the component."), "", - ?T("NOTE: This module is complementary to 'mod_privilege' but can " + ?T("NOTE: This module is complementary to _`mod_privilege`_ but can " "also be used separately.")], opts => [{namespaces, diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 040cb6085..3303f17c0 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -331,7 +331,7 @@ mod_doc() -> "replaced with the virtual host name. NOTE: if GET requests " "are handled by 'mod_http_upload', the 'get_url' must match the " "'put_url'. Setting it to a different value only makes " - "sense if an external web server or 'mod_http_fileserver' " + "sense if an external web server or _`mod_http_fileserver`_ " "is used to serve the uploaded files.")}}, {service_url, #{desc => ?T("Deprecated.")}}, diff --git a/src/mod_last.erl b/src/mod_last.erl index 295a546f2..a7d36c791 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -344,20 +344,20 @@ mod_doc() -> [{db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. diff --git a/src/mod_mam.erl b/src/mod_mam.erl index e894f5f7d..abb2333cc 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -1456,7 +1456,7 @@ mod_doc() -> #{value => "true | false", desc => ?T("This option determines how ejabberd's " - "stream management code (see 'mod_stream_mgmt') " + "stream management code (see _`mod_stream_mgmt`_) " "handles unacknowledged messages when the " "connection is lost. Usually, such messages are " "either bounced or resent. However, neither is " @@ -1495,28 +1495,28 @@ mod_doc() -> #{value => "true | false", desc => ?T("Whether to destroy message archive of a room " - "(see 'mod_muc') when it gets destroyed. " + "(see _`mod_muc`_) when it gets destroyed. " "The default value is 'true'.")}}, {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}, {user_mucsub_from_muc_archive, #{value => "true | false", desc => diff --git a/src/mod_mix.erl b/src/mod_mix.erl index 82b5e41a4..002ef5696 100644 --- a/src/mod_mix.erl +++ b/src/mod_mix.erl @@ -106,12 +106,12 @@ mod_doc() -> "experimental feature, updated in 19.02, and is not " "yet ready to use in production. It's asserted that " "the MIX protocol is going to replace the MUC protocol " - "in the future (see 'mod_muc')."), "", + "in the future (see _`mod_muc`_)."), "", ?T("To learn more about how to use that feature, you can refer to " "our tutorial: https://docs.ejabberd.im/tutorials/mix-010/" "[Getting started with XEP-0369: Mediated Information " "eXchange (MIX) v0.1]."), "", - ?T("The module depends on 'mod_mam'.")], + ?T("The module depends on _`mod_mam`_.")], opts => [{access_create, #{value => ?T("AccessName"), @@ -136,7 +136,7 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}]}. -spec route(stanza()) -> ok. route(#iq{} = IQ) -> diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index c6348b92f..1fa5c1861 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -120,23 +120,23 @@ mod_doc() -> [{db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. -spec bounce_sm_packet({term(), stanza()}) -> {term(), stanza()}. bounce_sm_packet({_, #message{to = #jid{lresource = <<>>} = To, diff --git a/src/mod_mqtt.erl b/src/mod_mqtt.erl index a1621cc01..5d00408df 100644 --- a/src/mod_mqtt.erl +++ b/src/mod_mqtt.erl @@ -327,37 +327,37 @@ mod_doc() -> {queue_type, #{value => "ram | file", desc => - ?T("Same as top-level 'queue_type' option, " + ?T("Same as top-level _`queue_type`_ option, " "but applied to this module only.")}}, {ram_db_type, #{value => "mnesia", desc => - ?T("Same as top-level 'default_ram_db' option, " + ?T("Same as top-level _`default_ram_db`_ option, " "but applied to this module only.")}}, {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, " + ?T("Same as top-level _`default_db`_ option, " "but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, " + ?T("Same as top-level _`use_cache`_ option, " "but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, " + ?T("Same as top-level _`cache_size`_ option, " "but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, " + ?T("Same as top-level _`cache_missed`_ option, " "but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, " + ?T("Same as top-level _`cache_life_time`_ option, " "but applied to this module only.")}}]}. %%%=================================================================== diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 46bfd20e5..ccecb6b66 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1517,7 +1517,7 @@ mod_doc() -> {queue_type, #{value => "ram | file", desc => - ?T("Same as top-level 'queue_type' option, but applied to this module only.")}}, + ?T("Same as top-level _`queue_type`_ option, but applied to this module only.")}}, {regexp_room_id, #{value => "string()", desc => @@ -1634,7 +1634,7 @@ mod_doc() -> {logging, #{value => "true | false", desc => - ?T("The public messages are logged using 'mod_muc_log'. " + ?T("The public messages are logged using _`mod_muc_log`_. " "The default value is 'false'.")}}, {members_by_default, #{value => "true | false", diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 360d414b1..2abeee45c 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -1413,4 +1413,4 @@ mod_doc() -> [?T("This module provides commands to administer local MUC " "services and their MUC rooms. It also provides simple " "WebAdmin pages to view the existing rooms."), "", - ?T("This module depends on 'mod_muc'.")]}. + ?T("This module depends on _`mod_muc`_.")]}. diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl index 53223a8eb..8bcbc8bc0 100644 --- a/src/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -1021,7 +1021,7 @@ mod_doc() -> ?T("- URLs on messages and subjects are converted to hyperlinks."), "", ?T("- Timezone used on timestamps is shown on the log files."), "", ?T("- A custom link can be added on top of each page."), "", - ?T("The module depends on 'mod_muc'.")], + ?T("The module depends on _`mod_muc`_.")], opts => [{access_log, #{value => ?T("AccessName"), diff --git a/src/mod_offline.erl b/src/mod_offline.erl index ff95767b6..1d367eb72 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -1325,19 +1325,19 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}], + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}], example => [{?T("This example allows power users to have as much as 5000 " "offline messages, administrators up to 2000, and all the " diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 483f2e834..eee55825e 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -317,8 +317,8 @@ mod_doc() -> "server ping request in less than period defined " "in 'ping_ack_timeout' option: " "'kill' means destroying the underlying connection, " - "'none' means to do nothing. NOTE: when 'mod_stream_mgmt' " - "module is loaded and stream management is enabled by " + "'none' means to do nothing. NOTE: when _`mod_stream_mgmt`_ " + "is loaded and stream management is enabled by " "a client, killing the client connection doesn't mean " "killing the client session - the session will be kept " "alive in order to give the client a chance to resume it. " diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 4f15b80c4..5ac26c2f5 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -887,25 +887,25 @@ mod_doc() -> "https://xmpp.org/extensions/xep-0191.html" "[XEP-0191: Blocking Command] which is implemented by " "'mod_blocking' module. However, you still need " - "'mod_privacy' loaded in order for 'mod_blocking' to work.")], + "'mod_privacy' loaded in order for _`mod_blocking`_ to work.")], opts => [{db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. diff --git a/src/mod_private.erl b/src/mod_private.erl index 36f1e8d2c..436aae222 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -128,23 +128,23 @@ mod_doc() -> [{db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. -spec get_sm_features({error, stanza_error()} | empty | {result, [binary()]}, jid(), jid(), binary(), binary()) -> diff --git a/src/mod_privilege.erl b/src/mod_privilege.erl index a6d4ba446..353a8da27 100644 --- a/src/mod_privilege.erl +++ b/src/mod_privilege.erl @@ -106,7 +106,7 @@ mod_doc() -> ?T("WARNING: Security issue: Privileged access gives components " "access to sensitive data, so permission should be granted " "carefully, only if you trust a component."), "", - ?T("NOTE: This module is complementary to 'mod_delegation', " + ?T("NOTE: This module is complementary to _`mod_delegation`_, " "but can also be used separately.")], opts => [{roster, diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 8792b2ab9..2e40d8f0e 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -4269,7 +4269,7 @@ mod_doc() -> "(https://xmpp.org/extensions/xep-0163.html" "[XEP-0163: Personal Eventing via Pubsub]) " "is enabled in the default ejabberd configuration file, " - "and it requires 'mod_caps'.")], + "and it requires _`mod_caps`_.")], opts => [{access_createnode, #{value => "AccessName", @@ -4282,7 +4282,7 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to " + ?T("Same as top-level _`default_db`_ option, but applied to " "this module only.")}}, {default_node_config, #{value => "List of Key:Value", diff --git a/src/mod_push.erl b/src/mod_push.erl index ea1c3e649..5477c5792 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -191,23 +191,23 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. %%-------------------------------------------------------------------- %% ejabberd command callback. diff --git a/src/mod_push_keepalive.erl b/src/mod_push_keepalive.erl index aba4fbfae..e0e83f1e1 100644 --- a/src/mod_push_keepalive.erl +++ b/src/mod_push_keepalive.erl @@ -94,13 +94,13 @@ mod_options(_Host) -> mod_doc() -> #{desc => [?T("This module tries to keep the stream management " - "session (see 'mod_stream_mgmt') of a disconnected " + "session (see _`mod_stream_mgmt`_) of a disconnected " "mobile client alive if the client enabled push " "notifications for that session. However, the normal " "session resumption timeout is restored once a push " "notification is issued, so the session will be closed " "if the client doesn't respond to push notifications."), "", - ?T("The module depends on 'mod_push'.")], + ?T("The module depends on _`mod_push`_.")], opts => [{resume_timeout, #{value => "timeout()", @@ -109,8 +109,8 @@ mod_doc() -> "the session of a disconnected push client times out. " "This timeout is only in effect as long as no push " "notification is issued. Once that happened, the " - "resumption timeout configured for the 'mod_stream_mgmt' " - "module is restored. " + "resumption timeout configured for _`mod_stream_mgmt`_ " + "is restored. " "The default value is '72' hours.")}}, {wake_on_start, #{value => "true | false", diff --git a/src/mod_roster.erl b/src/mod_roster.erl index f204c9211..94cae4950 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -1345,29 +1345,29 @@ mod_doc() -> "This option does not affect the client in any way. " "This option is only useful if option 'versioning' is " "set to 'true'. The default value is 'false'. " - "IMPORTANT: if you use 'mod_shared_roster' or " - "'mod_shared_roster_ldap', you must set the value " + "IMPORTANT: if you use _`mod_shared_roster`_ or " + " _`mod_shared_roster_ldap`_, you must set the value " "of the option to 'false'.")}}, {db_type, #{value => "mnesia | sql", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}], + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}], example => ["modules:", " ...", diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 16cc96a75..13ff90466 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -1266,7 +1266,7 @@ mod_doc() -> ?T("- Displayed: A list of groups that will be in the " "rosters of this group's members. A group of other vhost can " "be identified with 'groupid@vhost'."), "", - ?T("This module depends on 'mod_roster'. " + ?T("This module depends on _`mod_roster`_. " "If not enabled, roster queries will return 503 errors.")], opts => [{db_type, @@ -1274,25 +1274,25 @@ mod_doc() -> desc => ?T("Define the type of storage where the module will create " "the tables and store user information. The default is " - "the storage defined by the global option 'default_db', " + "the storage defined by the top-level _`default_db`_ option, " "or 'mnesia' if omitted. If 'sql' value is defined, " "make sure you have defined the database.")}}, - {use_cache, + {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}], + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}], example => [{?T("Take the case of a computer club that wants all its members " "seeing each other in their rosters. To achieve this, they " diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 93c08e0c3..08fbe8793 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -796,7 +796,7 @@ mod_doc() -> "disable the check. Default value is 'true'.")}}] ++ [{Opt, #{desc => - {?T("Same as top-level '~s' option, but " + {?T("Same as top-level _`~s`_ option, but " "applied to this module only."), [Opt]}}} || Opt <- [ldap_backups, ldap_base, ldap_uids, ldap_deref_aliases, ldap_encrypt, ldap_password, ldap_port, ldap_rootdn, diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index b9443e5d2..5d2998500 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -962,12 +962,12 @@ mod_doc() -> {queue_type, #{value => "ram | file", desc => - ?T("Same as top-level 'queue_type' option, but applied to this module only.")}}, + ?T("Same as top-level _`queue_type`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index e7cfff819..8e0d32a4a 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -640,23 +640,23 @@ mod_doc() -> {db_type, #{value => "mnesia | sql | ldap", desc => - ?T("Same as top-level 'default_db' option, but applied to this module only.")}}, + ?T("Same as top-level _`default_db`_ option, but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}, {vcard, #{value => ?T("vCard"), desc => diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index c81c058f5..bc6e7ebca 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -571,7 +571,7 @@ mod_doc() -> }]}}] ++ [{Opt, #{desc => - {?T("Same as top-level '~s' option, but " + {?T("Same as top-level _`~s`_ option, but " "applied to this module only."), [Opt]}}} || Opt <- [ldap_base, ldap_servers, ldap_uids, ldap_deref_aliases, ldap_encrypt, ldap_password, diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl index ab8df2c60..59ebc7f71 100644 --- a/src/mod_vcard_xupdate.erl +++ b/src/mod_vcard_xupdate.erl @@ -228,26 +228,26 @@ mod_doc() -> "frequently their presence. However, the overhead is significantly " "reduced by the use of caching, so you probably don't want " "to set 'use_cache' to 'false'."), "", - ?T("The module depends on 'mod_vcard'."), "", + ?T("The module depends on _`mod_vcard`_."), "", ?T("NOTE: Nowadays https://xmpp.org/extensions/xep-0153.html" "[XEP-0153] is used mostly as \"read-only\", i.e. modern " "clients don't publish their avatars inside vCards. Thus " "in the majority of cases the module is only used along " - "with 'mod_avatar' module for providing backward compatibility.")], + "with _`mod_avatar`_ for providing backward compatibility.")], opts => [{use_cache, #{value => "true | false", desc => - ?T("Same as top-level 'use_cache' option, but applied to this module only.")}}, + ?T("Same as top-level _`use_cache`_ option, but applied to this module only.")}}, {cache_size, #{value => "pos_integer() | infinity", desc => - ?T("Same as top-level 'cache_size' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_size`_ option, but applied to this module only.")}}, {cache_missed, #{value => "true | false", desc => - ?T("Same as top-level 'cache_missed' option, but applied to this module only.")}}, + ?T("Same as top-level _`cache_missed`_ option, but applied to this module only.")}}, {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level 'cache_life_time' option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. From ac4f2402610e9c494421a443c7f765dc2fe074c1 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 13:53:54 +0200 Subject: [PATCH 028/440] Produce module names with specific syntax, docs Makefile will convert to links --- src/ejabberd_commands_doc.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index f63326182..b2be8a6a6 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -396,7 +396,7 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc, end, ModuleText = case IsDefinerMod of true -> - [?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW(atom_to_list(Definer)))]; + [?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW("*`"++atom_to_list(Definer)++"`*"))]; false -> [] end, From 655dcbcb7467db3cb0f89cf99d34cc2244e6c84f Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 21 Aug 2021 20:50:02 +0200 Subject: [PATCH 029/440] New command to produce markdown with tags and their associated commands --- src/ejabberd_commands.erl | 10 ++++++++++ src/ejabberd_commands_doc.erl | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index 8d875e82f..c00b1469a 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -91,6 +91,16 @@ get_commands_spec() -> "that will have example invocation include in markdown document"], result_desc = "0 if command failed, 1 when succeeded", args_example = ["/home/me/docs/api.html", "mod_admin", "java,json"], + result_example = ok}, + #ejabberd_commands{name = gen_markdown_doc_for_tags, tags = [documentation], + desc = "Generates markdown documentation for ejabberd_commands", + module = ejabberd_commands_doc, function = generate_tags_md, + args = [{file, binary}], + result = {res, rescode}, + args_desc = ["Path to file where generated " + "documentation should be stored"], + result_desc = "0 if command failed, 1 when succeeded", + args_example = ["/home/me/docs/tags.md"], result_example = ok}]. start_link() -> diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index b2be8a6a6..05948fa6c 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -28,6 +28,7 @@ -export([generate_html_output/3]). -export([generate_md_output/3]). +-export([generate_tags_md/1]). -include("ejabberd_commands.hrl"). @@ -360,6 +361,13 @@ gen_param(Name, Type, Desc, HTMLOutput) -> [?TAG(dt, [?TAG_R(strong, atom_to_list(Name)), <<" :: ">>, ?RAW(format_type(Type))]), ?TAG(dd, ?RAW(Desc))]. +make_tags(HTMLOutput) -> + TagsList = ejabberd_commands:get_tags_commands(1000000), + lists:map(fun(T) -> gen_tags(T, HTMLOutput) end, TagsList). + +gen_tags({TagName, Commands}, HTMLOutput) -> + [?TAG(h1, TagName) | [?TAG(p, ?RAW("* *`"++C++"`*")) || C <- Commands]]. + gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc, args=Args, args_desc=ArgsDesc, note=Note, definer=Definer, result=Result, result_desc=ResultDesc}=Cmd, HTMLOutput, Langs) -> @@ -389,7 +397,7 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc, [?TAG(dl, [gen_param(RName, Type, ResultDesc, HTMLOutput)])] end end, - TagsText = [?RAW(atom_to_list(Tag) ++ " ") || Tag <- Tags], + TagsText = [?RAW("*`"++atom_to_list(Tag)++"`* ") || Tag <- Tags], IsDefinerMod = case Definer of unknown -> true; _ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes))) @@ -482,13 +490,23 @@ generate_md_output(File, RegExp, Languages) -> Langs = binary:split(Languages, <<",">>, [global]), Header = <<"---\ntitle: Administration API reference\ntoc: true\nmenu: API Reference\norder: 1\n" "// Autogenerated with 'ejabberdctl gen_markdown_doc_for_commands'\n---\n\n" - "This section describes API of ejabberd.">>, + "This section describes API of ejabberd.\n">>, Out = lists:map(fun(C) -> gen_doc(C, false, Langs) end, Cmds4), {ok, Fh} = file:open(File, [write]), io:format(Fh, "~ts~ts", [Header, Out]), file:close(Fh), ok. +generate_tags_md(File) -> + Header = <<"---\ntitle: API Tags\ntoc: true\nmenu: API Tags\norder: 2\n" + "// Autogenerated with 'ejabberdctl gen_markdown_doc_for_tags'\n---\n\n" + "This section enumerates the tags and their associated API.\n">>, + Tags = make_tags(false), + {ok, Fh} = file:open(File, [write]), + io:format(Fh, "~ts~ts", [Header, Tags]), + file:close(Fh), + ok. + html_pre() -> " From 8b6c90c2d9ce6029b793f9715e1f3c57554eb2cb Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 15:39:01 +0200 Subject: [PATCH 030/440] Tell dialyzer that gen_tags only cares about markdown output, not html --- src/ejabberd_commands_doc.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index 05948fa6c..eec334d04 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -365,6 +365,7 @@ make_tags(HTMLOutput) -> TagsList = ejabberd_commands:get_tags_commands(1000000), lists:map(fun(T) -> gen_tags(T, HTMLOutput) end, TagsList). +-dialyzer({no_match, gen_tags/2}). gen_tags({TagName, Commands}, HTMLOutput) -> [?TAG(h1, TagName) | [?TAG(p, ?RAW("* *`"++C++"`*")) || C <- Commands]]. From 4d0503b6b36c7bc704f3eb12b10b2db30b7add01 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 Aug 2021 15:49:52 +0200 Subject: [PATCH 031/440] Fix syntax in mod_disco example configuration --- src/mod_disco.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_disco.erl b/src/mod_disco.erl index cf888bc4e..deb9d15a2 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -464,11 +464,11 @@ mod_doc() -> " -", " modules: all", " name: abuse-addresses", - " urls: [mailto:abuse@shakespeare.lit]", + " urls: [\"mailto:abuse@shakespeare.lit\"]", " -", " modules: [mod_muc]", " name: \"Web chatroom logs\"", - " urls: [http://www.example.org/muc-logs]", + " urls: [\"http://www.example.org/muc-logs\"]", " -", " modules: [mod_disco]", " name: feedback-addresses", From c952cc420b345a0e43fc4e6d819b3edb3ac12cb1 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 23 Aug 2021 21:28:15 +0200 Subject: [PATCH 032/440] node_flat_sql: Avoid catch-all clauses for RSM Explicitly catch invalid and timestamps specified by clients in RSM queries, but crash on other errors, rather than silently ignoring those. --- src/node_flat_sql.erl | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 724958eb1..240dc3760 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -1064,15 +1064,14 @@ rsm_page(Count, Index, Offset, Items) -> last = Last}. encode_stamp(Stamp) -> - case catch xmpp_util:decode_timestamp(Stamp) of - {MS,S,US} -> encode_now({MS,S,US}); - _ -> Stamp + try xmpp_util:decode_timestamp(Stamp) of + Now -> + encode_now(Now) + catch _:{bad_timestamp, _} -> + Stamp % We should return a proper error to the client instead. end. decode_stamp(Stamp) -> - case catch xmpp_util:encode_timestamp(decode_now(Stamp)) of - TimeStamp when is_binary(TimeStamp) -> TimeStamp; - _ -> Stamp - end. + xmpp_util:encode_timestamp(decode_now(Stamp)). encode_now({T1, T2, T3}) -> <<(misc:i2l(T1, 6))/binary, ":", From ebf03a3745ac4ba2089adc1ef872adfcfc081d56 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 23 Aug 2021 22:04:03 +0200 Subject: [PATCH 033/440] node_flat: Avoid catch-all clauses for RSM Apply the change made in the previous commit to Mnesia storage as well. --- src/node_flat.erl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/node_flat.erl b/src/node_flat.erl index 97f149f9c..c597b9ce9 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -957,15 +957,12 @@ rsm_page(Count, Index, Offset, Items) -> last = Last}. encode_stamp(Stamp) -> - case catch xmpp_util:decode_timestamp(Stamp) of - {MS,S,US} -> {MS,S,US}; - _ -> Stamp + try xmpp_util:decode_timestamp(Stamp) + catch _:{bad_timestamp, _} -> + Stamp % We should return a proper error to the client instead. end. decode_stamp(Stamp) -> - case catch xmpp_util:encode_timestamp(Stamp) of - TimeStamp when is_binary(TimeStamp) -> TimeStamp; - _ -> Stamp - end. + xmpp_util:encode_timestamp(Stamp). transform({pubsub_state, {Id, Nidx}, Is, A, Ss}) -> {pubsub_state, {Id, Nidx}, Nidx, Is, A, Ss}; From 9643e18be7c46ca8ee1bd6a1cb8ee995c455136b Mon Sep 17 00:00:00 2001 From: loong0 Date: Thu, 26 Aug 2021 20:33:37 +0800 Subject: [PATCH 034/440] minor fix --- Makefile.in | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile.in b/Makefile.in index c39195ac7..6549665f7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -99,12 +99,12 @@ ifneq ($(INSTALLGROUP),) endif ifeq "$(MIX)" "mix" -IS_REBAR:=6 +REBAR_VER:=6 else -IS_REBAR:=$(shell expr `$(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}'`) +REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}') endif -ifeq "$(IS_REBAR)" "6" +ifeq "$(REBAR_VER)" "6" REBAR=$(MIX) SKIPDEPS= LISTDEPS=deps.tree @@ -118,7 +118,7 @@ ifeq "$(IS_REBAR)" "6" REBARREL=MIX_ENV=prod $(REBAR) release --overwrite REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite else -ifeq "$(IS_REBAR)" "3" +ifeq "$(REBAR_VER)" "3" SKIPDEPS= LISTDEPS=tree UPDATEDEPS=upgrade @@ -398,7 +398,7 @@ TAGS: Makefile: Makefile.in -ifeq "$(IS_REBAR)" "3" +ifeq "$(REBAR_VER)" "3" dialyzer: $(REBAR) dialyzer else From b0da69f050399b376c93f8fc2a6898c6a974a83c Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 Aug 2021 10:25:39 +0200 Subject: [PATCH 035/440] Send ping from server, not bare user JID (#3658) --- src/mod_ping.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_ping.erl b/src/mod_ping.erl index eee55825e..f51b929f1 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -154,7 +154,7 @@ handle_info({iq_reply, timeout, JID}, State) -> {noreply, State#state{timers = Timers}}; handle_info({timeout, _TRef, {ping, JID}}, State) -> Host = State#state.host, - From = jid:remove_resource(JID), + From = jid:make(Host), IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]}, ejabberd_router:route_iq(IQ, JID, gen_mod:get_module_proc(Host, ?MODULE), From f77686481a041812e99f46cbb1ee3d6d2770e9de Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 26 Aug 2021 17:21:23 +0200 Subject: [PATCH 036/440] Add internal links in WebAdmin Vhosts page --- src/ejabberd_web_admin.erl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 7dc11b571..e699ffc78 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -602,12 +602,14 @@ list_vhosts2(Lang, Hosts) -> [?AC(<<"../server/", Host/binary, "/">>, Host)]), - ?XAC(<<"td">>, + ?XAE(<<"td">>, [{<<"class">>, <<"alignright">>}], - (pretty_string_int(RegisteredUsers))), - ?XAC(<<"td">>, + [?AC(<<"../server/", Host/binary, "/users/">>, + pretty_string_int(RegisteredUsers))]), + ?XAE(<<"td">>, [{<<"class">>, <<"alignright">>}], - (pretty_string_int(OnlineUsers)))]) + [?AC(<<"../server/", Host/binary, "/users/">>, + pretty_string_int(RegisteredUsers))]), end, SHosts)))])]. From 91350ad472a13cac23af62212e0ad93c656ba2b0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 27 Aug 2021 13:39:06 +0200 Subject: [PATCH 037/440] Fix WebAdmin recent change --- src/ejabberd_web_admin.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index e699ffc78..ee50a0031 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -608,8 +608,8 @@ list_vhosts2(Lang, Hosts) -> pretty_string_int(RegisteredUsers))]), ?XAE(<<"td">>, [{<<"class">>, <<"alignright">>}], - [?AC(<<"../server/", Host/binary, "/users/">>, - pretty_string_int(RegisteredUsers))]), + [?AC(<<"../server/", Host/binary, "/online-users/">>, + pretty_string_int(OnlineUsers))])]) end, SHosts)))])]. From caf07692dbdabcd2e083530b18ee7a4eda90ea9b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 5 Sep 2021 13:24:51 +0200 Subject: [PATCH 038/440] mod_register_web: Handle unknown host gracefully MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return a proper error message on registration attempts against unknown hosts, rather than crashing. Thanks to Ingo Jürgensmann for reporting the bug. --- src/mod_register_web.erl | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index 28bac0558..0e216c81c 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -507,14 +507,18 @@ form_del_get(Host, Lang) -> %% {error, not_allowed} | %% {error, invalid_jid} register_account(Username, Host, Password) -> - Access = mod_register_opt:access(Host), - case jid:make(Username, Host) of - error -> {error, invalid_jid}; - JID -> - case acl:match_rule(Host, Access, JID) of - deny -> {error, not_allowed}; - allow -> register_account2(Username, Host, Password) - end + try mod_register_opt:access(Host) of + Access -> + case jid:make(Username, Host) of + error -> {error, invalid_jid}; + JID -> + case acl:match_rule(Host, Access, JID) of + deny -> {error, not_allowed}; + allow -> register_account2(Username, Host, Password) + end + end + catch _:{module_not_loaded, mod_register, _Host} -> + {error, host_unknown} end. register_account2(Username, Host, Password) -> @@ -577,6 +581,8 @@ get_error_text({error, password_incorrect}) -> ?T("Incorrect password"); get_error_text({error, invalid_jid}) -> ?T("The username is not valid"); +get_error_text({error, host_unknown}) -> + ?T("Host unknown"); get_error_text({error, not_allowed}) -> ?T("Not allowed"); get_error_text({error, account_doesnt_exist}) -> From 868387a405093fad5df3d1ac09b3a4ec01e91800 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 5 Sep 2021 20:00:05 +0200 Subject: [PATCH 039/440] mod_http_upload_quota: Avoid 'max_days' race Try to spread clean-up runs for multiple hosts, rather than scheduling them in parallel. This should reduce I/O spikes, and avoid race conditions where multiple processes detect and then try to delete the same old files (if multiple hosts have the same 'docroot'). Fixes #3497. --- src/mod_http_upload_quota.erl | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/mod_http_upload_quota.erl b/src/mod_http_upload_quota.erl index 48b7b1958..5ed7fcefb 100644 --- a/src/mod_http_upload_quota.erl +++ b/src/mod_http_upload_quota.erl @@ -27,7 +27,6 @@ -author('holger@zedat.fu-berlin.de'). -define(TIMEOUT, timer:hours(24)). --define(INITIAL_TIMEOUT, timer:minutes(10)). -define(FORMAT(Error), file:format_error(Error)). -behaviour(gen_server). @@ -64,7 +63,7 @@ max_days :: pos_integer() | infinity, docroot :: binary(), disk_usage = #{} :: disk_usage(), - timers :: [timer:tref()]}). + timer :: reference() | undefined}). -type disk_usage() :: #{{binary(), binary()} => non_neg_integer()}. -type state() :: #state{}. @@ -166,12 +165,11 @@ init([ServerHost|_]) -> DocRoot1 = mod_http_upload_opt:docroot(ServerHost), DocRoot2 = mod_http_upload:expand_home(str:strip(DocRoot1, right, $/)), DocRoot3 = mod_http_upload:expand_host(DocRoot2, ServerHost), - Timers = if MaxDays == infinity -> []; - true -> - {ok, T1} = timer:send_after(?INITIAL_TIMEOUT, sweep), - {ok, T2} = timer:send_interval(?TIMEOUT, sweep), - [T1, T2] - end, + Timer = if MaxDays == infinity -> undefined; + true -> + Timeout = p1_rand:uniform(?TIMEOUT div 2), + erlang:send_after(Timeout, self(), sweep) + end, ejabberd_hooks:add(http_upload_slot_request, ServerHost, ?MODULE, handle_slot_request, 50), {ok, #state{server_host = ServerHost, @@ -179,7 +177,7 @@ init([ServerHost|_]) -> access_hard_quota = AccessHardQuota, max_days = MaxDays, docroot = DocRoot3, - timers = Timers}}. + timer = Timer}}. -spec handle_call(_, {pid(), _}, state()) -> {noreply, state()}. handle_call(Request, From, State) -> @@ -249,6 +247,7 @@ handle_info(sweep, #state{server_host = ServerHost, max_days = MaxDays} = State) when is_integer(MaxDays), MaxDays > 0 -> ?DEBUG("Got 'sweep' message for ~ts", [ServerHost]), + Timer = erlang:send_after(?TIMEOUT, self(), sweep), case file:list_dir(DocRoot) of {ok, Entries} -> BackThen = secs_since_epoch() - (MaxDays * 86400), @@ -264,17 +263,17 @@ handle_info(sweep, #state{server_host = ServerHost, ?ERROR_MSG("Cannot open document root ~ts: ~ts", [DocRoot, ?FORMAT(Error)]) end, - {noreply, State}; + {noreply, State#state{timer = Timer}}; handle_info(Info, State) -> ?ERROR_MSG("Unexpected info: ~p", [Info]), {noreply, State}. -spec terminate(normal | shutdown | {shutdown, _} | _, state()) -> ok. -terminate(Reason, #state{server_host = ServerHost, timers = Timers}) -> +terminate(Reason, #state{server_host = ServerHost, timer = Timer}) -> ?DEBUG("Stopping upload quota process for ~ts: ~p", [ServerHost, Reason]), ejabberd_hooks:delete(http_upload_slot_request, ServerHost, ?MODULE, handle_slot_request, 50), - lists:foreach(fun timer:cancel/1, Timers). + misc:cancel_timer(Timer). -spec code_change({down, _} | _, state(), _) -> {ok, state()}. code_change(_OldVsn, #state{server_host = ServerHost} = State, _Extra) -> From 3114ce4ed28e039803af732c1d29f6d0982fba29 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 8 Sep 2021 18:34:20 +0200 Subject: [PATCH 040/440] ejabberd_admin: Fix ejabberd_piefxis commands These days, the ejabberd_piefxis commands expect their arguments to be handed over as binary strings. --- src/ejabberd_admin.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 9cebd0bb5..0174cd7ff 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -254,19 +254,19 @@ get_commands_spec() -> module = ejabberd_piefxis, function = import_file, args_desc = ["Full path to the PIEFXIS file"], args_example = ["/var/lib/ejabberd/example.com.xml"], - args = [{file, string}], result = {res, rescode}}, + args = [{file, binary}], result = {res, rescode}}, #ejabberd_commands{name = export_piefxis, tags = [mnesia], desc = "Export data of all users in the server to PIEFXIS files (XEP-0227)", module = ejabberd_piefxis, function = export_server, args_desc = ["Full path to a directory"], args_example = ["/var/lib/ejabberd/"], - args = [{dir, string}], result = {res, rescode}}, + args = [{dir, binary}], result = {res, rescode}}, #ejabberd_commands{name = export_piefxis_host, tags = [mnesia], desc = "Export data of users in a host to PIEFXIS files (XEP-0227)", module = ejabberd_piefxis, function = export_host, args_desc = ["Full path to a directory", "Vhost to export"], args_example = ["/var/lib/ejabberd/", "example.com"], - args = [{dir, string}, {host, string}], result = {res, rescode}}, + args = [{dir, binary}, {host, binary}], result = {res, rescode}}, #ejabberd_commands{name = delete_mnesia, tags = [mnesia], desc = "Delete elements in Mnesia database for a given vhost", From 5abc03ff8fdd8bd68626637814ec65ee24d1adf7 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 13 Sep 2021 08:15:11 +0300 Subject: [PATCH 041/440] Optimize MucSub processing --- include/mod_muc_room.hrl | 15 +- src/mod_muc.erl | 12 +- src/mod_muc_room.erl | 336 ++++++++++++++++++++++++++------------- src/mod_muc_sql.erl | 24 ++- 4 files changed, 267 insertions(+), 120 deletions(-) diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index f981f9e7c..bbe656575 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -87,6 +87,16 @@ nick = <<>> :: binary(), nodes = [] :: [binary()]}). +-record(muc_subscribers, + {subscribers = #{} :: subscribers(), + subscriber_nicks = #{} :: subscriber_nicks(), + subscriber_nodes = #{} :: subscriber_nodes() + }). + +-type subscribers() :: #{ljid() => #subscriber{}}. +-type subscriber_nicks() :: #{binary() => [ljid()]}. +-type subscriber_nodes() :: #{binary() => subscribers()}. + -record(activity, { message_time = 0 :: integer(), @@ -106,8 +116,7 @@ jid = #jid{} :: jid(), config = #config{} :: config(), users = #{} :: users(), - subscribers = #{} :: subscribers(), - subscriber_nicks = #{} :: subscriber_nicks(), + muc_subscribers = #muc_subscribers{} :: #muc_subscribers{}, last_voice_request_time = treap:empty() :: treap:treap(), robots = #{} :: robots(), nicks = #{} :: nicks(), @@ -126,5 +135,3 @@ -type robots() :: #{jid() => {binary(), stanza()}}. -type nicks() :: #{binary() => [ljid()]}. -type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}. --type subscribers() :: #{ljid() => #subscriber{}}. --type subscriber_nicks() :: #{binary() => [ljid()]}. diff --git a/src/mod_muc.erl b/src/mod_muc.erl index ccecb6b66..c8c1d4126 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -40,6 +40,7 @@ room_destroyed/4, store_room/4, store_room/5, + store_changes/4, restore_room/3, forget_room/3, create_room/3, @@ -91,6 +92,7 @@ -callback init(binary(), gen_mod:opts()) -> any(). -callback import(binary(), binary(), [binary()]) -> ok. -callback store_room(binary(), binary(), binary(), list(), list()|undefined) -> {atomic, any()}. +-callback store_changes(binary(), binary(), binary(), list()) -> {atomic, any()}. -callback restore_room(binary(), binary(), binary()) -> muc_room_opts() | error. -callback forget_room(binary(), binary(), binary()) -> {atomic, any()}. -callback can_use_nick(binary(), binary(), jid(), binary()) -> boolean(). @@ -111,7 +113,8 @@ -callback get_subscribed_rooms(binary(), binary(), jid()) -> {ok, [{jid(), binary(), [binary()]}]} | {error, db_failure}. --optional_callbacks([get_subscribed_rooms/3]). +-optional_callbacks([get_subscribed_rooms/3, + store_changes/4]). %%==================================================================== %% API @@ -313,6 +316,11 @@ store_room(ServerHost, Host, Name, Opts, ChangesHints) -> Mod = gen_mod:db_mod(LServer, ?MODULE), Mod:store_room(LServer, Host, Name, Opts, ChangesHints). +store_changes(ServerHost, Host, Name, ChangesHints) -> + LServer = jid:nameprep(ServerHost), + Mod = gen_mod:db_mod(LServer, ?MODULE), + Mod:store_changes(LServer, Host, Name, ChangesHints). + restore_room(ServerHost, Host, Name) -> LServer = jid:nameprep(ServerHost), Mod = gen_mod:db_mod(LServer, ?MODULE), @@ -570,7 +578,7 @@ unhibernate_room(ServerHost, Host, Room) -> case RMod:find_online_room(ServerHost, Room, Host) of error -> Proc = procname(ServerHost, {Room, Host}), - case ?GEN_SERVER:call(Proc, {unhibernate, Room, Host}) of + case ?GEN_SERVER:call(Proc, {unhibernate, Room, Host}, 20000) of {ok, _} = R -> R; _ -> error end; diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index fc03e50ef..035e851fd 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -641,7 +641,7 @@ handle_event({service_message, Msg}, _StateName, MessagePkt = #message{type = groupchat, body = xmpp:mk_text(Msg)}, send_wrapped_multiple( StateData#state.jid, - get_users_and_subscribers(StateData), + get_users_and_subscribers_with_node(?NS_MUCSUB_NODES_MESSAGES, StateData), MessagePkt, ?NS_MUCSUB_NODES_MESSAGES, StateData), @@ -705,7 +705,7 @@ handle_sync_event({change_state, NewStateData}, _From, true -> ok; _ -> - erlang:put(muc_subscribers, NewStateData#state.subscribers) + erlang:put(muc_subscribers, NewStateData#state.muc_subscribers#muc_subscribers.subscribers) end, {reply, {ok, NewStateData}, StateName, NewStateData}; handle_sync_event({process_item_change, Item, UJID}, _From, StateName, StateData) -> @@ -717,8 +717,10 @@ handle_sync_event({process_item_change, Item, UJID}, _From, StateName, StateData {reply, {ok, NSD}, StateName, NSD} end; handle_sync_event(get_subscribers, _From, StateName, StateData) -> - JIDs = lists:map(fun jid:make/1, - maps:keys(StateData#state.subscribers)), + JIDs = muc_subscribers_fold( + fun(_LBareJID, #subscriber{jid = JID}, Acc) -> + [JID | Acc] + end, [], StateData#state.muc_subscribers), {reply, {ok, JIDs}, StateName, StateData}; handle_sync_event({muc_subscribe, From, Nick, Nodes}, _From, StateName, StateData) -> @@ -762,7 +764,8 @@ handle_sync_event({muc_unsubscribe, From}, _From, StateName, {reply, {error, get_error_text(Err)}, StateName, StateData} end; handle_sync_event({is_subscribed, From}, _From, StateName, StateData) -> - IsSubs = try maps:get(jid:split(From), StateData#state.subscribers) of + IsSubs = try muc_subscribers_get( + jid:split(From), StateData#state.muc_subscribers) of #subscriber{nick = Nick, nodes = Nodes} -> {true, Nick, Nodes} catch _:{badkey, _} -> false end, @@ -899,7 +902,8 @@ terminate(Reason, _StateName, _ -> ok end, tab_remove_online_user(JID, StateData) - end, [], get_users_and_subscribers(StateData)), + end, [], get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_PARTICIPANTS, StateData)), disable_hibernate_timer(StateData), case StateData#state.hibernate_timer of @@ -991,7 +995,7 @@ process_groupchat_message(#message{from = From, lang = Lang} = Packet, StateData end, send_wrapped_multiple( jid:replace_resource(StateData#state.jid, FromNick), - get_users_and_subscribers(StateData), + get_users_and_subscribers_with_node(Node, StateData), NewPacket, Node, NewStateData1), NewStateData2 = case has_body_or_subject(NewPacket) of true -> @@ -1197,8 +1201,8 @@ get_participant_data(From, StateData) -> #user{nick = FromNick, role = Role} -> {FromNick, Role} catch _:{badkey, _} -> - try maps:get(jid:tolower(jid:remove_resource(From)), - StateData#state.subscribers) of + try muc_subscribers_get(jid:tolower(jid:remove_resource(From)), + StateData#state.muc_subscribers) of #subscriber{nick = FromNick} -> {FromNick, none} catch _:{badkey, _} -> @@ -1329,7 +1333,7 @@ maybe_strip_status_from_presence(From, Packet, StateData) -> close_room_if_temporary_and_empty(StateData1) -> case not (StateData1#state.config)#config.persistent andalso maps:size(StateData1#state.users) == 0 - andalso maps:size(StateData1#state.subscribers) == 0 of + andalso muc_subscribers_size(StateData1#state.muc_subscribers) == 0 of true -> ?INFO_MSG("Destroyed MUC room ~ts because it's temporary " "and empty", @@ -1342,6 +1346,17 @@ close_room_if_temporary_and_empty(StateData1) -> -spec get_users_and_subscribers(state()) -> users(). get_users_and_subscribers(StateData) -> + get_users_and_subscribers_aux( + StateData#state.muc_subscribers#muc_subscribers.subscribers, + StateData). + +-spec get_users_and_subscribers_with_node(binary(), state()) -> users(). +get_users_and_subscribers_with_node(Node, StateData) -> + get_users_and_subscribers_aux( + muc_subscribers_get_by_node(Node, StateData#state.muc_subscribers), + StateData). + +get_users_and_subscribers_aux(Subscribers, StateData) -> OnlineSubscribers = maps:fold( fun(LJID, _, Acc) -> LBareJID = jid:remove_resource(LJID), @@ -1365,7 +1380,7 @@ get_users_and_subscribers(StateData) -> true -> Acc end - end, StateData#state.users, StateData#state.subscribers). + end, StateData#state.users, Subscribers). -spec is_user_online(jid(), state()) -> boolean(). is_user_online(JID, StateData) -> @@ -1375,7 +1390,7 @@ is_user_online(JID, StateData) -> -spec is_subscriber(jid(), state()) -> boolean(). is_subscriber(JID, StateData) -> LJID = jid:tolower(jid:remove_resource(JID)), - maps:is_key(LJID, StateData#state.subscribers). + muc_subscribers_is_key(LJID, StateData#state.muc_subscribers). %% Check if the user is occupant of the room, or at least is an admin or owner. -spec is_occupant_or_admin(jid(), state()) -> boolean(). @@ -1869,16 +1884,15 @@ set_subscriber(JID, Nick, Nodes, #state{room = Room, host = Host, server_host = ServerHost} = StateData) -> BareJID = jid:remove_resource(JID), LBareJID = jid:tolower(BareJID), - Subscribers = maps:put(LBareJID, - #subscriber{jid = BareJID, - nick = Nick, - nodes = Nodes}, - StateData#state.subscribers), - Nicks = maps:put(Nick, [LBareJID], StateData#state.subscriber_nicks), - NewStateData = StateData#state{subscribers = Subscribers, - subscriber_nicks = Nicks}, + MUCSubscribers = + muc_subscribers_put( + #subscriber{jid = BareJID, + nick = Nick, + nodes = Nodes}, + StateData#state.muc_subscribers), + NewStateData = StateData#state{muc_subscribers = MUCSubscribers}, store_room(NewStateData, [{add_subscription, BareJID, Nick, Nodes}]), - case not maps:is_key(LBareJID, StateData#state.subscribers) of + case not muc_subscribers_is_key(LBareJID, StateData#state.muc_subscribers) of true -> send_subscriptions_change_notifications(BareJID, Nick, subscribe, NewStateData), ejabberd_hooks:run(muc_subscribed, ServerHost, [ServerHost, Room, Host, BareJID]); @@ -1956,7 +1970,8 @@ add_user_presence_un(JID, Presence, StateData) -> -spec find_jids_by_nick(binary(), state()) -> [jid()]. find_jids_by_nick(Nick, StateData) -> Users = case maps:get(Nick, StateData#state.nicks, []) of - [] -> maps:get(Nick, StateData#state.subscriber_nicks, []); + [] -> muc_subscribers_get_by_nick( + Nick, StateData#state.muc_subscribers); Us -> Us end, [jid:make(LJID) || LJID <- Users]. @@ -2020,10 +2035,10 @@ is_nick_change(JID, Nick, StateData) -> nick_collision(User, Nick, StateData) -> UserOfNick = case find_jid_by_nick(Nick, StateData) of false -> - try maps:get(Nick, StateData#state.subscriber_nicks) of - [J] -> J - catch _:{badkey, _} -> false - end; + case muc_subscribers_get_by_nick(Nick, StateData#state.muc_subscribers) of + [J] -> J; + [] -> false + end; J -> J end, (UserOfNick /= false andalso @@ -2433,6 +2448,11 @@ send_new_presence(NJID, Reason, IsInitialPresence, StateData, OldStateData) -> false -> {none, #presence{type = unavailable}} end, Affiliation = get_affiliation(LJID, StateData), + Node1 = case is_ra_changed(NJID, IsInitialPresence, StateData, OldStateData) of + true -> ?NS_MUCSUB_NODES_AFFILIATIONS; + false -> ?NS_MUCSUB_NODES_PRESENCE + end, + Node2 = ?NS_MUCSUB_NODES_PARTICIPANTS, UserMap = case is_room_overcrowded(StateData) orelse (not (presence_broadcast_allowed(NJID, StateData) orelse @@ -2440,7 +2460,10 @@ send_new_presence(NJID, Reason, IsInitialPresence, StateData, OldStateData) -> true -> #{LNJID => UserInfo}; false -> - get_users_and_subscribers(StateData) + %% TODO: optimize further + UM1 = get_users_and_subscribers_with_node(Node1, StateData), + UM2 = get_users_and_subscribers_with_node(Node2, StateData), + maps:merge(UM1, UM2) end, maps:fold( fun(LUJID, Info, _) -> @@ -2465,10 +2488,6 @@ send_new_presence(NJID, Reason, IsInitialPresence, StateData, OldStateData) -> Packet = xmpp:set_subtag( Pres, #muc_user{items = [Item], status_codes = StatusCodes}), - Node1 = case is_ra_changed(NJID, IsInitialPresence, StateData, OldStateData) of - true -> ?NS_MUCSUB_NODES_AFFILIATIONS; - false -> ?NS_MUCSUB_NODES_PRESENCE - end, send_wrapped(jid:replace_resource(StateData#state.jid, Nick), Info#user.jid, Packet, Node1, StateData), Type = xmpp:get_type(Packet), @@ -2476,7 +2495,6 @@ send_new_presence(NJID, Reason, IsInitialPresence, StateData, OldStateData) -> IsOccupant = Info#user.last_presence /= undefined, if (IsSubscriber and not IsOccupant) and (IsInitialPresence or (Type == unavailable)) -> - Node2 = ?NS_MUCSUB_NODES_PARTICIPANTS, send_wrapped(jid:replace_resource(StateData#state.jid, Nick), Info#user.jid, Packet, Node2, StateData); true -> @@ -2607,11 +2625,13 @@ send_nick_changing(JID, OldNick, StateData, end; (_, _, _) -> ok - end, ok, get_users_and_subscribers(StateData)). + end, ok, get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_PRESENCE, StateData)). -spec maybe_send_affiliation(jid(), affiliation(), state()) -> ok. maybe_send_affiliation(JID, Affiliation, StateData) -> LJID = jid:tolower(JID), + %% TODO: there should be a better way to check IsOccupant Users = get_users_and_subscribers(StateData), IsOccupant = case LJID of {LUser, LServer, <<"">>} -> @@ -2637,7 +2657,8 @@ send_affiliation(JID, Affiliation, StateData) -> role = none}, Message = #message{id = p1_rand:get_string(), sub_els = [#muc_user{items = [Item]}]}, - Users = get_users_and_subscribers(StateData), + Users = get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_AFFILIATIONS, StateData), Recipients = case (StateData#state.config)#config.anonymous of true -> maps:filter(fun(_, #user{role = moderator}) -> @@ -3271,6 +3292,13 @@ send_kickban_presence1(MJID, UJID, Reason, Code, Affiliation, StateData) -> #user{jid = RealJID, nick = Nick} = maps:get(jid:tolower(UJID), StateData#state.users), ActorNick = get_actor_nick(MJID, StateData), + %% TODO: optimize further + UserMap = + maps:merge( + get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_AFFILIATIONS, StateData), + get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_PARTICIPANTS, StateData)), maps:fold( fun(LJID, Info, _) -> IsSelfPresence = jid:tolower(UJID) == LJID, @@ -3304,7 +3332,7 @@ send_kickban_presence1(MJID, UJID, Reason, Code, Affiliation, true -> ok end - end, ok, get_users_and_subscribers(StateData)). + end, ok, UserMap). -spec get_actor_nick(undefined | jid(), state()) -> binary(). get_actor_nick(undefined, _StateData) -> @@ -3720,7 +3748,8 @@ send_config_change_info(New, #state{config = Old} = StateData) -> id = p1_rand:get_string(), sub_els = [#muc_user{status_codes = Codes}]}, send_wrapped_multiple(StateData#state.jid, - get_users_and_subscribers(StateData), + get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_CONFIG, StateData), Message, ?NS_MUCSUB_NODES_CONFIG, StateData); @@ -3872,26 +3901,23 @@ set_opts([{Opt, Val} | Opts], StateData) -> StateData#state{config = (StateData#state.config)#config{lang = Val}}; subscribers -> - {Subscribers, Nicks} = - lists:foldl( - fun({JID, Nick, Nodes}, {SubAcc, NickAcc}) -> - BareJID = case JID of - #jid{} -> jid:remove_resource(JID); - _ -> - ?ERROR_MSG("Invalid subscriber JID in set_opts ~p", [JID]), - jid:remove_resource(jid:make(JID)) - end, - LBareJID = jid:tolower(BareJID), - {maps:put( - LBareJID, - #subscriber{jid = BareJID, - nick = Nick, - nodes = Nodes}, - SubAcc), - maps:put(Nick, [LBareJID], NickAcc)} - end, {#{}, #{}}, Val), - StateData#state{subscribers = Subscribers, - subscriber_nicks = Nicks}; + MUCSubscribers = + lists:foldl( + fun({JID, Nick, Nodes}, MUCSubs) -> + BareJID = + case JID of + #jid{} -> jid:remove_resource(JID); + _ -> + ?ERROR_MSG("Invalid subscriber JID in set_opts ~p", [JID]), + jid:remove_resource(jid:make(JID)) + end, + muc_subscribers_put( + #subscriber{jid = BareJID, + nick = Nick, + nodes = Nodes}, + MUCSubs) + end, muc_subscribers_new(), Val), + StateData#state{muc_subscribers = MUCSubscribers}; affiliations -> StateData#state{affiliations = maps:from_list(Val)}; subject -> @@ -3926,12 +3952,12 @@ set_vcard_xupdate(State) -> -spec make_opts(state()) -> [{atom(), any()}]. make_opts(StateData) -> Config = StateData#state.config, - Subscribers = maps:fold( + Subscribers = muc_subscribers_fold( fun(_LJID, Sub, Acc) -> [{Sub#subscriber.jid, Sub#subscriber.nick, Sub#subscriber.nodes}|Acc] - end, [], StateData#state.subscribers), + end, [], StateData#state.muc_subscribers), [?MAKE_CONFIG_OPT(#config.title), ?MAKE_CONFIG_OPT(#config.description), ?MAKE_CONFIG_OPT(#config.allow_change_subj), ?MAKE_CONFIG_OPT(#config.allow_query_users), @@ -4013,7 +4039,8 @@ destroy_room(DEl, StateData) -> send_wrapped(jid:replace_resource(StateData#state.jid, Nick), Info#user.jid, Packet, ?NS_MUCSUB_NODES_CONFIG, StateData) - end, ok, get_users_and_subscribers(StateData)), + end, ok, get_users_and_subscribers_with_node( + ?NS_MUCSUB_NODES_CONFIG, StateData)), forget_room(StateData), {result, undefined, stop}. @@ -4248,30 +4275,35 @@ process_iq_mucsub(From, sub_els = [#muc_subscribe{nick = Nick}]} = Packet, StateData) -> LBareJID = jid:tolower(jid:remove_resource(From)), - try maps:get(LBareJID, StateData#state.subscribers) of + try muc_subscribers_get(LBareJID, StateData#state.muc_subscribers) of #subscriber{nick = Nick1} when Nick1 /= Nick -> Nodes = get_subscription_nodes(Packet), - case {nick_collision(From, Nick, StateData), - mod_muc:can_use_nick(StateData#state.server_host, - StateData#state.host, - From, Nick)} of - {true, _} -> + case nick_collision(From, Nick, StateData) of + true -> ErrText = ?T("That nickname is already in use by another occupant"), {error, xmpp:err_conflict(ErrText, Lang)}; - {_, false} -> - Err = case Nick of - <<>> -> - xmpp:err_jid_malformed(?T("Nickname can't be empty"), - Lang); - _ -> - xmpp:err_conflict(?T("That nickname is registered" - " by another person"), Lang) - end, - {error, Err}; - _ -> - NewStateData = set_subscriber(From, Nick, Nodes, StateData), - {result, subscribe_result(Packet), NewStateData} - end; + false -> + case mod_muc:can_use_nick(StateData#state.server_host, + StateData#state.host, + From, Nick) of + false -> + Err = case Nick of + <<>> -> + xmpp:err_jid_malformed( + ?T("Nickname can't be empty"), + Lang); + _ -> + xmpp:err_conflict( + ?T("That nickname is registered" + " by another person"), Lang) + end, + {error, Err}; + true -> + NewStateData = + set_subscriber(From, Nick, Nodes, StateData), + {result, subscribe_result(Packet), NewStateData} + end + end; #subscriber{} -> Nodes = get_subscription_nodes(Packet), NewStateData = set_subscriber(From, Nick, Nodes, StateData), @@ -4298,12 +4330,9 @@ process_iq_mucsub(From, #iq{type = set, sub_els = [#muc_unsubscribe{}]}, #state{room = Room, host = Host, server_host = ServerHost} = StateData) -> BareJID = jid:remove_resource(From), LBareJID = jid:tolower(BareJID), - try maps:get(LBareJID, StateData#state.subscribers) of - #subscriber{nick = Nick} -> - Nicks = maps:remove(Nick, StateData#state.subscriber_nicks), - Subscribers = maps:remove(LBareJID, StateData#state.subscribers), - NewStateData = StateData#state{subscribers = Subscribers, - subscriber_nicks = Nicks}, + try muc_subscribers_remove_exn(LBareJID, StateData#state.muc_subscribers) of + {MUCSubscribers, #subscriber{nick = Nick}} -> + NewStateData = StateData#state{muc_subscribers = MUCSubscribers}, store_room(NewStateData, [{del_subscription, LBareJID}]), send_subscriptions_change_notifications(BareJID, Nick, unsubscribe, StateData), ejabberd_hooks:run(muc_unsubscribed, ServerHost, [ServerHost, Room, Host, BareJID]), @@ -4326,7 +4355,7 @@ process_iq_mucsub(From, #iq{type = get, lang = Lang, true -> ShowJid = IsModerator orelse (StateData#state.config)#config.anonymous == false, - Subs = maps:fold( + Subs = muc_subscribers_fold( fun(_, #subscriber{jid = J, nick = N, nodes = Nodes}, Acc) -> case ShowJid of true -> @@ -4334,7 +4363,7 @@ process_iq_mucsub(From, #iq{type = get, lang = Lang, _ -> [#muc_subscription{nick = N, events = Nodes}|Acc] end - end, [], StateData#state.subscribers), + end, [], StateData#state.muc_subscribers), {result, #muc_subscriptions{list = Subs}, StateData}; _ -> Txt = ?T("Moderator privileges required"), @@ -4347,8 +4376,7 @@ process_iq_mucsub(_From, #iq{type = get, lang = Lang}, _StateData) -> -spec remove_subscriptions(state()) -> state(). remove_subscriptions(StateData) -> if not (StateData#state.config)#config.allow_subscription -> - StateData#state{subscribers = #{}, - subscriber_nicks = #{}}; + StateData#state{muc_subscribers = muc_subscribers_new()}; true -> StateData end. @@ -4597,7 +4625,7 @@ store_room(StateData, ChangesHints) -> true -> ok; _ -> - erlang:put(muc_subscribers, StateData#state.subscribers) + erlang:put(muc_subscribers, StateData#state.muc_subscribers#muc_subscribers.subscribers) end, ShouldStore = case (StateData#state.config)#config.persistent of true -> @@ -4611,7 +4639,15 @@ store_room(StateData, ChangesHints) -> end end, if ShouldStore -> - store_room_no_checks(StateData, ChangesHints); + case erlang:function_exported(Mod, store_changes, 4) of + true when ChangesHints /= [] -> + mod_muc:store_changes( + StateData#state.server_host, + StateData#state.host, StateData#state.room, + ChangesHints); + _ -> + store_room_no_checks(StateData, ChangesHints) + end; true -> ok end. @@ -4625,22 +4661,19 @@ store_room_no_checks(StateData, ChangesHints) -> -spec send_subscriptions_change_notifications(jid(), binary(), subscribe|unsubscribe, state()) -> ok. send_subscriptions_change_notifications(From, Nick, Type, State) -> {WJ, WN} = - maps:fold( - fun(_, #subscriber{nodes = Nodes, jid = JID}, {WithJid, WithNick} = Res) -> - case lists:member(?NS_MUCSUB_NODES_SUBSCRIBERS, Nodes) of - true -> - case (State#state.config)#config.anonymous == false orelse - get_role(JID, State) == moderator orelse - get_default_role(get_affiliation(JID, State), State) == moderator of - true -> - {[JID | WithJid], WithNick}; - _ -> - {WithJid, [JID | WithNick]} - end; - false -> - Res - end - end, {[], []}, State#state.subscribers), + maps:fold( + fun(_, #subscriber{jid = JID}, {WithJid, WithNick}) -> + case (State#state.config)#config.anonymous == false orelse + get_role(JID, State) == moderator orelse + get_default_role(get_affiliation(JID, State), State) == moderator of + true -> + {[JID | WithJid], WithNick}; + _ -> + {WithJid, [JID | WithNick]} + end + end, {[], []}, + muc_subscribers_get_by_node(?NS_MUCSUB_NODES_SUBSCRIBERS, + State#state.muc_subscribers)), if WJ /= [] -> Payload1 = case Type of subscribe -> #muc_subscribe{jid = From, nick = Nick}; @@ -4684,7 +4717,7 @@ send_wrapped(From, To, Packet, Node, State) -> _ -> false end, if IsOffline -> - try maps:get(LBareTo, State#state.subscribers) of + try muc_subscribers_get(LBareTo, State#state.muc_subscribers) of #subscriber{nodes = Nodes, jid = JID} -> case lists:member(Node, Nodes) of true -> @@ -4751,12 +4784,13 @@ send_wrapped_multiple(From, Users, Packet, Node, State) -> IsOffline = LP == undefined, if IsOffline -> LBareTo = jid:tolower(jid:remove_resource(To)), - case maps:find(LBareTo, State#state.subscribers) of + case muc_subscribers_find(LBareTo, State#state.muc_subscribers) of {ok, #subscriber{nodes = Nodes}} -> case lists:member(Node, Nodes) of true -> {Direct, [To | Wrapped]}; _ -> + %% TODO: check that this branch is never called Res end; _ -> @@ -4810,6 +4844,90 @@ send_wrapped_multiple(From, Users, Packet, Node, State) -> Wra, NewPacket2, true) end. +%%%---------------------------------------------------------------------- +%%% #muc_subscribers API +%%%---------------------------------------------------------------------- + +-spec muc_subscribers_new() -> #muc_subscribers{}. +muc_subscribers_new() -> + #muc_subscribers{}. + +-spec muc_subscribers_get(ljid(), #muc_subscribers{}) -> #subscriber{}. +muc_subscribers_get({_, _, _} = LJID, MUCSubscribers) -> + maps:get(LJID, MUCSubscribers#muc_subscribers.subscribers). + +-spec muc_subscribers_find(ljid(), #muc_subscribers{}) -> + {ok, #subscriber{}} | error. +muc_subscribers_find({_, _, _} = LJID, MUCSubscribers) -> + maps:find(LJID, MUCSubscribers#muc_subscribers.subscribers). + +-spec muc_subscribers_is_key(ljid(), #muc_subscribers{}) -> boolean(). +muc_subscribers_is_key({_, _, _} = LJID, MUCSubscribers) -> + maps:is_key(LJID, MUCSubscribers#muc_subscribers.subscribers). + +-spec muc_subscribers_size(#muc_subscribers{}) -> integer(). +muc_subscribers_size(MUCSubscribers) -> + maps:size(MUCSubscribers#muc_subscribers.subscribers). + +-spec muc_subscribers_fold(Fun, Acc, #muc_subscribers{}) -> Acc when + Fun :: fun((ljid(), #subscriber{}, Acc) -> Acc). +muc_subscribers_fold(Fun, Init, MUCSubscribers) -> + maps:fold(Fun, Init, MUCSubscribers#muc_subscribers.subscribers). + +-spec muc_subscribers_get_by_nick(binary(), #muc_subscribers{}) -> [#subscriber{}]. +muc_subscribers_get_by_nick(Nick, MUCSubscribers) -> + maps:get(Nick, MUCSubscribers#muc_subscribers.subscriber_nicks, []). + +-spec muc_subscribers_get_by_node(binary(), #muc_subscribers{}) -> subscribers(). +muc_subscribers_get_by_node(Node, MUCSubscribers) -> + maps:get(Node, MUCSubscribers#muc_subscribers.subscriber_nodes, #{}). + +-spec muc_subscribers_remove_exn(ljid(), #muc_subscribers{}) -> + {#muc_subscribers{}, #subscriber{}}. +muc_subscribers_remove_exn({_, _, _} = LJID, MUCSubscribers) -> + #muc_subscribers{subscribers = Subs, + subscriber_nicks = SubNicks, + subscriber_nodes = SubNodes} = MUCSubscribers, + Subscriber = maps:get(LJID, Subs), + #subscriber{nick = Nick, nodes = Nodes} = Subscriber, + NewSubNicks = maps:remove(Nick, SubNicks), + NewSubs = maps:remove(LJID, Subs), + NewSubNodes = + lists:foldl( + fun(Node, Acc) -> + NodeSubs = maps:get(Node, Acc, #{}), + NodeSubs2 = maps:remove(LJID, NodeSubs), + maps:put(Node, NodeSubs2, Acc) + end, SubNodes, Nodes), + {#muc_subscribers{subscribers = NewSubs, + subscriber_nicks = NewSubNicks, + subscriber_nodes = NewSubNodes}, Subscriber}. + +-spec muc_subscribers_put(#subscriber{}, #muc_subscribers{}) -> + #muc_subscribers{}. +muc_subscribers_put(Subscriber, MUCSubscribers) -> + #subscriber{jid = JID, + nick = Nick, + nodes = Nodes} = Subscriber, + #muc_subscribers{subscribers = Subs, + subscriber_nicks = SubNicks, + subscriber_nodes = SubNodes} = MUCSubscribers, + LJID = jid:tolower(JID), + NewSubs = maps:put(LJID, Subscriber, Subs), + NewSubNicks = maps:put(Nick, [LJID], SubNicks), + NewSubNodes = + lists:foldl( + fun(Node, Acc) -> + NodeSubs = maps:get(Node, Acc, #{}), + NodeSubs2 = maps:put(LJID, Subscriber, NodeSubs), + maps:put(Node, NodeSubs2, Acc) + end, SubNodes, Nodes), + #muc_subscribers{subscribers = NewSubs, + subscriber_nicks = NewSubNicks, + subscriber_nodes = NewSubNodes}. + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Detect messange stanzas that don't have meaningful content -spec has_body_or_subject(message()) -> boolean(). diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index 569cfac49..1310cde7b 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -29,7 +29,8 @@ -behaviour(mod_muc_room). %% API --export([init/2, store_room/5, restore_room/3, forget_room/3, +-export([init/2, store_room/5, store_changes/4, + restore_room/3, forget_room/3, can_use_nick/4, get_rooms/2, get_nick/3, set_nick/4, import/3, export/1]). -export([register_online_room/4, unregister_online_room/4, find_online_room/3, @@ -83,6 +84,12 @@ store_room(LServer, Host, Name, Opts, ChangesHints) -> end, ejabberd_sql:sql_transaction(LServer, F). +store_changes(LServer, Host, Name, Changes) -> + F = fun () -> + [change_room(Host, Name, Change) || Change <- Changes] + end, + ejabberd_sql:sql_transaction(LServer, F). + change_room(Host, Room, {add_subscription, JID, Nick, Nodes}) -> SJID = jid:encode(JID), SNodes = misc:term_to_expr(Nodes), @@ -185,13 +192,20 @@ get_rooms(LServer, Host) -> {selected, Subs} -> SubsD = lists:foldl( fun({Room, Jid, Nick, Nodes}, Dict) -> - dict:append(Room, {jid:decode(Jid), - Nick, ejabberd_sql:decode_term(Nodes)}, Dict) - end, dict:new(), Subs), + Sub = {jid:decode(Jid), + Nick, ejabberd_sql:decode_term(Nodes)}, + maps:update_with( + Room, + fun(SubAcc) -> + [Sub | SubAcc] + end, + [Sub], + Dict) + end, maps:new(), Subs), lists:map( fun({Room, Opts}) -> OptsD = ejabberd_sql:decode_term(Opts), - OptsD2 = case {dict:find(Room, SubsD), lists:keymember(subscribers, 1, OptsD)} of + OptsD2 = case {maps:find(Room, SubsD), lists:keymember(subscribers, 1, OptsD)} of {_, true} -> store_room(LServer, Host, Room, mod_muc:opts_to_binary(OptsD), undefined), OptsD; From f8167fc5d091bd4eb6352b51843652e38c9b7fe9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 14 Sep 2021 11:24:49 +0200 Subject: [PATCH 042/440] Update documentation to match the implemented options values (#3675) --- src/ejabberd_options_doc.erl | 14 ++++++++------ src/mod_admin_extra.erl | 11 +---------- src/mod_http_upload.erl | 5 +++-- src/mod_muc.erl | 9 +++++---- src/mod_ping.erl | 2 +- src/mod_register.erl | 2 +- src/mod_stream_mgmt.erl | 4 +++- src/mod_stun_disco.erl | 2 +- 8 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 28a6f6333..a725f4572 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -61,7 +61,7 @@ doc() -> desc => ?T("The time of a cached item to keep in cache. " "Once it's expired, the corresponding item is " - "erased from cache. The default value is 'one hour'. " + "erased from cache. The default value is '1 hour'. " "Several modules have a similar option; and some core " "ejabberd parts support similar options too, see " "_`auth_cache_life_time`_, _`oauth_cache_life_time`_, " @@ -382,14 +382,15 @@ doc() -> "from the stored information; for this reason, when this " "value is configured it cannot be changed to plain anymore. " "This format allows clients to authenticate using: " - "SASL PLAIN and SASL SCRAM-SHA-1.")]}}, + "SASL PLAIN and SASL SCRAM-SHA-1."), + ?T("The default value is 'plain'.")]}}, {auth_scram_hash, #{value => "sha | sha256 | sha512", desc => ?T("Hash algorith that should be used to store password in SCRAM format. " "You shouldn't change this if you already have passwords generated with " "a different algorithm - users that have such passwords will not be able " - "to authenticate.")}}, + "to authenticate. The default value is 'sha'.")}}, {auth_use_cache, #{value => "true | false", desc => @@ -678,7 +679,8 @@ doc() -> desc => ?T("The option defines the default language of server strings " "that can be seen by XMPP clients. If an XMPP client does not " - "possess 'xml:lang' attribute, the specified language is used.")}}, + "possess 'xml:lang' attribute, the specified language is used. " + "The default value is '\"en\"'.")}}, {ldap_servers, #{value => "[Host, ...]", desc => @@ -840,7 +842,7 @@ doc() -> "must have identical value on all nodes, or it will lead to subtle " "bugs. Usually leaving default value of this is option is best, " "tweak it only if you know what you are doing. " - "The default value is '1' minute.")}}, + "The default value is '1 minute'.")}}, {new_sql_schema, #{value => "true | false", desc => @@ -1154,7 +1156,7 @@ doc() -> #{value => "timeout()", desc => ?T("A time to wait before closing an idle s2s connection. " - "The default value is '10' minutes.")}}, + "The default value is '10 minutes'.")}}, {s2s_use_starttls, #{value => "true | false | optional | required", desc => diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index fe0dd2757..9834acf01 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -1652,14 +1652,6 @@ mod_doc() -> ?T("If you want to put a group Name with blankspaces, use the " "characters \"\' and \'\" to define when the Name starts and " "ends. See an example below.")], - opts => - [{module_resource, - #{value => ?T("Resource"), - desc => - ?T("Indicate the resource that the XMPP stanzas must use " - "in the FROM or TO JIDs. This is only useful in the " - "'get_vcard*' and 'set_vcard*' commands. The default " - "value is 'mod_admin_extra'.")}}], example => [{?T("With this configuration, vCards can only be modified with " "mod_admin_extra commands:"), @@ -1670,8 +1662,7 @@ mod_doc() -> " vcard_set:", " - allow: adminextraresource", "modules:", - " mod_admin_extra:", - " module_resource: \"modadminextraf8x,31ad\"", + " mod_admin_extra: {}", " mod_vcard:", " access_set: vcard_set"]}, {?T("Content of roster file for 'pushroster' command:"), diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 3303f17c0..1ff94eb4a 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -321,12 +321,13 @@ mod_doc() -> "used for file uploads. The keyword @HOST@ is replaced " "with the virtual host name. NOTE: different virtual " "hosts cannot use the same PUT URL. " - "The default value is \"https://@HOST@:5443\".")}}, + "The default value is \"https://@HOST@:5443/upload\".")}}, {get_url, #{value => ?T("URL"), desc => ?T("This option specifies the initial part of the GET URLs " - "used for downloading the files. By default, it is set " + "used for downloading the files. The default value is 'undefined'. " + "When this option is 'undefined', this option is set " "to the same value as 'put_url'. The keyword @HOST@ is " "replaced with the virtual host name. NOTE: if GET requests " "are handled by 'mod_http_upload', the 'get_url' must match the " diff --git a/src/mod_muc.erl b/src/mod_muc.erl index c8c1d4126..05b76f2fc 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1366,19 +1366,19 @@ mod_doc() -> desc => ?T("To configure who is allowed to create new rooms at the " "Multi-User Chat service, this option can be used. " - "By default any account in the local ejabberd server is " + "The default value is 'all', which means everyone is " "allowed to create rooms.")}}, {access_persistent, #{value => ?T("AccessName"), desc => ?T("To configure who is allowed to modify the 'persistent' room option. " - "By default any account in the local ejabberd server is allowed to " + "The default value is 'all', which means everyone is allowed to" "modify that option.")}}, {access_mam, #{value => ?T("AccessName"), desc => ?T("To configure who is allowed to modify the 'mam' room option. " - "By default any account in the local ejabberd server is allowed to " + "The default value is 'all', which means everyone is allowed to" "modify that option.")}}, {access_register, #{value => ?T("AccessName"), @@ -1494,7 +1494,8 @@ mod_doc() -> ?T("This option defines after how many users in the room, " "it is considered overcrowded. When a MUC room is considered " "overcrowed, presence broadcasts are limited to reduce load, " - "traffic and excessive presence \"storm\" received by participants.")}}, + "traffic and excessive presence \"storm\" received by participants. " + "The default value is '1000'.")}}, {min_message_interval, #{value => ?T("Number"), desc => diff --git a/src/mod_ping.erl b/src/mod_ping.erl index f51b929f1..f233b2ae8 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -300,7 +300,7 @@ mod_doc() -> desc => ?T("How long to wait before deeming that a client " "has not answered a given server ping request. " - "The default value is '32' seconds.")}}, + "The default value is 'undefined'.")}}, {send_pings, #{value => "true | false", desc => diff --git a/src/mod_register.erl b/src/mod_register.erl index 919440b23..379318da6 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -679,7 +679,7 @@ mod_doc() -> "https://en.wikipedia.org/wiki/Entropy_(information_theory)" "[Shannon entropy] for passwords. The value 'Entropy' is a " "number of bits of entropy. The recommended minimum is 32 bits. " - "The default is 0, i.e. no checks are performed.")}}, + "The default is '0', i.e. no checks are performed.")}}, {registration_watchers, #{value => "[JID, ...]", desc => diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index 5d2998500..f60f6722b 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -970,4 +970,6 @@ mod_doc() -> {cache_life_time, #{value => "timeout()", desc => - ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}]}. + ?T("Same as top-level _`cache_life_time`_ option, " + "but applied to this module only. " + "The default value is '48 hours'.")}}]}. diff --git a/src/mod_stun_disco.erl b/src/mod_stun_disco.erl index bb701b96b..6e7592453 100644 --- a/src/mod_stun_disco.erl +++ b/src/mod_stun_disco.erl @@ -176,7 +176,7 @@ mod_doc() -> "clients. If ejabberd's built-in TURN service is used, " "TURN relays allocated using temporary credentials will " "be terminated shortly after the credentials expired. The " - "default value is '12' hours. Note that restarting the " + "default value is '12 hours'. Note that restarting the " "ejabberd node invalidates any temporary credentials " "offered before the restart unless a 'secret' is " "specified (see below).")}}, From 2f5b15129a326e9c9729779cc609bcecf05be0ee Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 14 Sep 2021 15:13:37 +0200 Subject: [PATCH 043/440] Fix previous commit: add forgotten endline blankspaces --- src/mod_muc.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 05b76f2fc..b2ebc5c61 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1372,13 +1372,13 @@ mod_doc() -> #{value => ?T("AccessName"), desc => ?T("To configure who is allowed to modify the 'persistent' room option. " - "The default value is 'all', which means everyone is allowed to" + "The default value is 'all', which means everyone is allowed to " "modify that option.")}}, {access_mam, #{value => ?T("AccessName"), desc => ?T("To configure who is allowed to modify the 'mam' room option. " - "The default value is 'all', which means everyone is allowed to" + "The default value is 'all', which means everyone is allowed to " "modify that option.")}}, {access_register, #{value => ?T("AccessName"), From 0c403c0f0eddc429d1929bb4117fed4f12a92695 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Sun, 19 Sep 2021 06:02:06 +0300 Subject: [PATCH 044/440] Fix SQL_UPSERT in mod_push_sql:store_session --- src/mod_push_sql.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_push_sql.erl b/src/mod_push_sql.erl index f89b904c2..c024a12d1 100644 --- a/src/mod_push_sql.erl +++ b/src/mod_push_sql.erl @@ -52,7 +52,7 @@ store_session(LUser, LServer, NowTS, PushJID, Node, XData) -> case ?SQL_UPSERT(LServer, "push_session", ["!username=%(LUser)s", "!server_host=%(LServer)s", - "!timestamp=%(TS)d", + "timestamp=%(TS)d", "!service=%(Service)s", "!node=%(Node)s", "xml=%(XML)s"]) of From 32cf44827d5bd47c1918250c86104f6331a4f15e Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Sun, 19 Sep 2021 05:59:12 +0300 Subject: [PATCH 045/440] Use INSERT ... ON CONFLICT in SQL_UPSERT for PostgreSQL >= 9.5 --- src/ejabberd_sql_pt.erl | 77 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index 130228fe1..d131570f7 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -564,15 +564,23 @@ make_sql_upsert(Table, ParseRes, Pos) -> [] end, erl_syntax:fun_expr( - [erl_syntax:clause( - [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], - [erl_syntax:infix_expr( - erl_syntax:variable("__Version"), - erl_syntax:operator('>='), - erl_syntax:integer(90100))], - [make_sql_upsert_pgsql901(Table, ParseRes), - erl_syntax:atom(ok)])] ++ - MySqlReplace ++ + [erl_syntax:clause( + [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], + [erl_syntax:infix_expr( + erl_syntax:variable("__Version"), + erl_syntax:operator('>='), + erl_syntax:integer(90500))], + [make_sql_upsert_pgsql905(Table, ParseRes), + erl_syntax:atom(ok)]), + erl_syntax:clause( + [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], + [erl_syntax:infix_expr( + erl_syntax:variable("__Version"), + erl_syntax:operator('>='), + erl_syntax:integer(90100))], + [make_sql_upsert_pgsql901(Table, ParseRes), + erl_syntax:atom(ok)])] ++ + MySqlReplace ++ [erl_syntax:clause( [erl_syntax:underscore(), erl_syntax:underscore()], none, @@ -713,6 +721,57 @@ make_sql_upsert_pgsql901(Table, ParseRes0) -> erl_syntax:atom(sql_query_t), [Upsert]). +make_sql_upsert_pgsql905(Table, ParseRes0) -> + ParseRes = lists:map( + fun({"family", A2, A3}) -> {"\"family\"", A2, A3}; + (Other) -> Other + end, ParseRes0), + Vals = + lists:map( + fun({_Field, _, ST}) -> + ST + end, ParseRes), + Fields = + lists:map( + fun({Field, _, _ST}) -> + #state{'query' = [{str, Field}]} + end, ParseRes), + SPairs = + lists:flatmap( + fun({_Field, key, _ST}) -> + []; + ({_Field, {false}, _ST}) -> + []; + ({Field, {true}, ST}) -> + [ST#state{ + 'query' = [{str, Field}, {str, "="}] ++ ST#state.'query' + }] + end, ParseRes), + Set = join_states(SPairs, ", "), + KeyFields = + lists:flatmap( + fun({Field, key, _ST}) -> + [#state{'query' = [{str, Field}]}]; + ({_Field, _, _ST}) -> + [] + end, ParseRes), + State = + concat_states( + [#state{'query' = [{str, "INSERT INTO "}, {str, Table}, {str, "("}]}, + join_states(Fields, ", "), + #state{'query' = [{str, ") VALUES ("}]}, + join_states(Vals, ", "), + #state{'query' = [{str, ") ON CONFLICT ("}]}, + join_states(KeyFields, ", "), + #state{'query' = [{str, ") DO UPDATE SET "}]}, + Set + ]), + Upsert = make_sql_query(State), + erl_syntax:application( + erl_syntax:atom(ejabberd_sql), + erl_syntax:atom(sql_query_t), + [Upsert]). + check_upsert(ParseRes, Pos) -> Set = From bf068f56591bc84f360a8d600c157520e821425f Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Tue, 21 Sep 2021 12:10:00 +0300 Subject: [PATCH 046/440] Small optimization in mod_roster_sql:get_roster --- src/mod_roster_sql.erl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/mod_roster_sql.erl b/src/mod_roster_sql.erl index 76ddb29dd..ebfcde463 100644 --- a/src/mod_roster_sql.erl +++ b/src/mod_roster_sql.erl @@ -80,9 +80,10 @@ get_roster(LUser, LServer) -> [] end, GroupsDict = lists:foldl(fun({J, G}, Acc) -> - dict:append(J, G, Acc) + Gs = maps:get(J, Acc, []), + maps:put(J, [G | Gs], Acc) end, - dict:new(), JIDGroups), + maps:new(), JIDGroups), {ok, lists:flatmap( fun(I) -> case raw_to_record(LServer, I) of @@ -90,10 +91,7 @@ get_roster(LUser, LServer) -> error -> []; R -> SJID = jid:encode(R#roster.jid), - Groups = case dict:find(SJID, GroupsDict) of - {ok, Gs} -> Gs; - error -> [] - end, + Groups = maps:get(SJID, GroupsDict, []), [R#roster{groups = Groups}] end end, Items)}; From c9c5839da49d93007d7764aeb131d85df9a90472 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Tue, 21 Sep 2021 13:30:52 +0300 Subject: [PATCH 047/440] Fix roster_tests:get_items --- test/roster_tests.erl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/roster_tests.erl b/test/roster_tests.erl index a3b6009c9..3092b8cd8 100644 --- a/test/roster_tests.erl +++ b/test/roster_tests.erl @@ -224,13 +224,21 @@ get_items(Config, Version) -> sub_els = [#roster_query{ver = Version}]}) of #iq{type = result, sub_els = [#roster_query{ver = NewVersion, items = Items}]} -> - {NewVersion, Items}; + {NewVersion, normalize_items(Items)}; #iq{type = result, sub_els = []} -> {empty, []}; #iq{type = error} = Err -> xmpp:get_error(Err) end. +normalize_items(Items) -> + Items2 = + lists:map( + fun(I) -> + I#roster_item{groups = lists:sort(I#roster_item.groups)} + end, Items), + lists:sort(Items2). + get_item(Config, JID) -> case get_items(Config) of {_Ver, Items} when is_list(Items) -> From cfc393a12e3507c9ecb541b8f784c14ff3a9786e Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 21 Sep 2021 12:16:30 +0200 Subject: [PATCH 048/440] When exporting mod_mam, MUC entries are assigned to the MUC service (#3680) --- src/ejd2sql.erl | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ejd2sql.erl b/src/ejd2sql.erl index ad0cc5e88..427e13087 100644 --- a/src/ejd2sql.erl +++ b/src/ejd2sql.erl @@ -73,11 +73,16 @@ export(Server, Output) -> end, Modules), close_output(Output, IO). -export(Server, Output, Module1) -> - Module = case Module1 of - mod_pubsub -> pubsub_db; - _ -> Module1 - end, +export(Server, Output, mod_mam = M1) -> + MucServices = gen_mod:get_module_opt_hosts(Server, mod_muc), + [export2(MucService, Output, M1, M1) || MucService <- MucServices], + export2(Server, Output, M1, M1); +export(Server, Output, mod_pubsub = M1) -> + export2(Server, Output, M1, pubsub_db); +export(Server, Output, M1) -> + export2(Server, Output, M1, M1). + +export2(Server, Output, Module1, Module) -> SQLMod = gen_mod:db_mod(sql, Module), LServer = jid:nameprep(iolist_to_binary(Server)), IO = prepare_output(Output), From ceeba3eea12e4057b517efa0658d6805dad702ba Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Sep 2021 12:11:25 +0200 Subject: [PATCH 049/440] Don't crash when exporting a module that is not enabled --- src/ejabberd_piefxis.erl | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index 8dff06837..8d5c9101c 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -214,26 +214,30 @@ parse_scram_password(PassData) -> get_vcard(User, Server) -> LUser = jid:nodeprep(User), LServer = jid:nameprep(Server), - case mod_vcard:get_vcard(LUser, LServer) of + try mod_vcard:get_vcard(LUser, LServer) of error -> []; Els -> Els + catch + error:{module_not_loaded, _, _} -> [] end. -spec get_offline(binary(), binary()) -> [xmlel()]. get_offline(User, Server) -> LUser = jid:nodeprep(User), LServer = jid:nameprep(Server), - case mod_offline:get_offline_els(LUser, LServer) of + try mod_offline:get_offline_els(LUser, LServer) of [] -> []; Els -> NewEls = lists:map(fun xmpp:encode/1, Els), [#xmlel{name = <<"offline-messages">>, children = NewEls}] + catch + error:{module_not_loaded, _, _} -> [] end. -spec get_privacy(binary(), binary()) -> [xmlel()]. get_privacy(User, Server) -> - case mod_privacy:get_user_lists(User, Server) of + try mod_privacy:get_user_lists(User, Server) of {ok, #privacy{default = Default, lists = [_|_] = Lists}} -> XLists = lists:map( @@ -246,12 +250,14 @@ get_privacy(User, Server) -> [xmpp:encode(#privacy_query{default = Default, lists = XLists})]; _ -> [] + catch + error:{module_not_loaded, _, _} -> [] end. -spec get_roster(binary(), binary()) -> [xmlel()]. get_roster(User, Server) -> JID = jid:make(User, Server), - case mod_roster:get_roster(User, Server) of + try mod_roster:get_roster(User, Server) of [_|_] = Items -> Subs = lists:flatmap( @@ -278,15 +284,19 @@ get_roster(User, Server) -> [xmpp:encode(#roster_query{items = Rs}) | Subs]; _ -> [] + catch + error:{module_not_loaded, _, _} -> [] end. -spec get_private(binary(), binary()) -> [xmlel()]. get_private(User, Server) -> - case mod_private:get_data(User, Server) of + try mod_private:get_data(User, Server) of [_|_] = Els -> [xmpp:encode(#private{sub_els = Els})]; _ -> [] + catch + error:{module_not_loaded, _, _} -> [] end. process(#state{xml_stream_state = XMLStreamState, fd = Fd} = State) -> From af4b49f720211b241c57ee1365449a13dee74076 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Sep 2021 12:53:18 +0200 Subject: [PATCH 050/440] Update export/import of scram password to XEP-0227 1.1 (#3676) --- src/ejabberd_piefxis.erl | 106 ++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 35 deletions(-) diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index 8d5c9101c..d62efb300 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -24,17 +24,15 @@ %%%---------------------------------------------------------------------- %%% Not implemented: +%%% - PEP nodes export/import +%%% - message archives export/import %%% - write mod_piefxis with ejabberdctl commands -%%% - Export from mod_offline_sql.erl -%%% - Export from mod_private_sql.erl -%%% - XEP-227: 6. Security Considerations %%% - Other schemas of XInclude are not tested, and may not be imported correctly. %%% - If a host has many users, split that host in XML files with 50 users each. -%%%% Headers -module(ejabberd_piefxis). --protocol({xep, 227, '1.0'}). +-protocol({xep, 227, '1.1'}). -export([import_file/1, export_server/1, export_host/2]). @@ -166,33 +164,66 @@ export_users([], _Server, _Fd) -> export_user(User, Server, Fd) -> Password = ejabberd_auth:get_password_s(User, Server), LServer = jid:nameprep(Server), - Pass = case ejabberd_auth:password_format(LServer) of - scram -> format_scram_password(Password); - _ -> Password + {PassPlain, PassScram} = case ejabberd_auth:password_format(LServer) of + scram -> {[], [format_scram_password(Password)]}; + _ -> {[{<<"password">>, Password}], []} end, - Els = get_offline(User, Server) ++ + Els = + PassScram ++ + get_offline(User, Server) ++ get_vcard(User, Server) ++ get_privacy(User, Server) ++ get_roster(User, Server) ++ get_private(User, Server), print(Fd, fxml:element_to_binary( #xmlel{name = <<"user">>, - attrs = [{<<"name">>, User}, - {<<"password">>, Pass}], + attrs = [{<<"name">>, User} | PassPlain], children = Els})). format_scram_password(#scram{hash = Hash, storedkey = StoredKey, serverkey = ServerKey, salt = Salt, iterationcount = IterationCount}) -> - StoredKeyB64 = base64:encode(StoredKey), - ServerKeyB64 = base64:encode(ServerKey), - SaltB64 = base64:encode(Salt), - IterationCountBin = (integer_to_binary(IterationCount)), - Hash2 = case Hash of - sha -> <<>>; - sha256 -> <<"sha256,">>; - sha512 -> <<"sha512,">> - end, - <<"scram:", Hash2/binary, StoredKeyB64/binary, ",", ServerKeyB64/binary, ",", SaltB64/binary, ",", IterationCountBin/binary>>. + StoredKeyB64 = base64:encode(StoredKey), + ServerKeyB64 = base64:encode(ServerKey), + SaltB64 = base64:encode(Salt), + IterationCountBin = (integer_to_binary(IterationCount)), + MechanismB = case Hash of + sha -> <<"SCRAM-SHA-1">>; + sha256 -> <<"SCRAM-SHA-256">>; + sha512 -> <<"SCRAM-SHA-512">> + end, + Children = + [ + #xmlel{name = <<"iter-count">>, + children = [{xmlcdata, IterationCountBin}]}, + #xmlel{name = <<"salt">>, + children = [{xmlcdata, SaltB64}]}, + #xmlel{name = <<"server-key">>, + children = [{xmlcdata, ServerKeyB64}]}, + #xmlel{name = <<"stored-key">>, + children = [{xmlcdata, StoredKeyB64}]} + ], + #xmlel{name = <<"scram-credentials">>, + attrs = [{<<"xmlns">>, <>}, + {<<"mechanism">>, MechanismB}], + children = Children}. + +parse_scram_password(#xmlel{attrs = Attrs} = El) -> + Hash = case fxml:get_attr_s(<<"mechanism">>, Attrs) of + <<"SCRAM-SHA-1">> -> sha; + <<"SCRAM-SHA-256">> -> sha256; + <<"SCRAM-SHA-512">> -> sha512 + end, + StoredKeyB64 = fxml:get_path_s(El, [{elem, <<"stored-key">>}, cdata]), + ServerKeyB64 = fxml:get_path_s(El, [{elem, <<"server-key">>}, cdata]), + IterationCountBin = fxml:get_path_s(El, [{elem, <<"iter-count">>}, cdata]), + SaltB64 = fxml:get_path_s(El, [{elem, <<"salt">>}, cdata]), + #scram{ + storedkey = base64:decode(StoredKeyB64), + serverkey = base64:decode(ServerKeyB64), + salt = base64:decode(SaltB64), + hash = Hash, + iterationcount = (binary_to_integer(IterationCountBin)) + }; parse_scram_password(PassData) -> Split = binary:split(PassData, <<",">>, [global]), @@ -408,21 +439,10 @@ process_users([_|Els], State) -> process_users([], State) -> {ok, State}. -process_user(#xmlel{name = <<"user">>, attrs = Attrs, children = Els}, +process_user(#xmlel{name = <<"user">>, attrs = Attrs, children = Els} = El, #state{server = LServer} = State) -> Name = fxml:get_attr_s(<<"name">>, Attrs), - Password = fxml:get_attr_s(<<"password">>, Attrs), - PasswordFormat = ejabberd_auth:password_format(LServer), - Pass = case PasswordFormat of - scram -> - case Password of - <<"scram:", PassData/binary>> -> - parse_scram_password(PassData); - P -> P - end; - _ -> Password - end, - + Pass = process_password(El, LServer), case jid:nodeprep(Name) of error -> stop("Invalid 'user': ~ts", [Name]); @@ -430,13 +450,29 @@ process_user(#xmlel{name = <<"user">>, attrs = Attrs, children = Els}, case ejabberd_auth:try_register(LUser, LServer, Pass) of ok -> process_user_els(Els, State#state{user = LUser}); - {error, invalid_password} when (Password == <<>>) -> + {error, invalid_password} when (Pass == <<>>) -> process_user_els(Els, State#state{user = LUser}); {error, Err} -> stop("Failed to create user '~ts': ~p", [Name, Err]) end end. +process_password(#xmlel{name = <<"user">>, attrs = Attrs} = El, LServer) -> + {PassPlain, PassOldScram} = case fxml:get_attr_s(<<"password">>, Attrs) of + <<"scram:", PassData/binary>> -> {<<"">>, PassData}; + P -> {P, false} + end, + ScramCred = fxml:get_subtag(El, <<"scram-credentials">>), + PasswordFormat = ejabberd_auth:password_format(LServer), + case {PassPlain, PassOldScram, ScramCred, PasswordFormat} of + {PassPlain, false, false, plain} -> PassPlain; + {<<"">>, false, ScramCred, plain} -> parse_scram_password(ScramCred); + {<<"">>, PassOldScram, false, plain} -> parse_scram_password(PassOldScram); + {PassPlain, false, false, scram} -> PassPlain; + {<<"">>, false, ScramCred, scram} -> parse_scram_password(ScramCred); + {<<"">>, PassOldScram, false, scram} -> parse_scram_password(PassOldScram) + end. + process_user_els([#xmlel{} = El|Els], State) -> case process_user_el(El, State) of {ok, NewState} -> From f74a715713e90d34d07a4070f839a3d828430b36 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 27 Sep 2021 12:05:49 +0200 Subject: [PATCH 051/440] Add indexes from 95fa43aa to the old-to-new schema update function --- src/mod_admin_update_sql.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index 4e932fe83..02beb4bf8 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -140,6 +140,7 @@ update_tables(State) -> add_sh_column(State, "sr_group"), add_pkey(State, "sr_group", ["server_host", "name"]), + create_unique_index(State, "sr_group", "i_sr_group_sh_name", ["server_host", "name"]), drop_sh_default(State, "sr_group"), add_sh_column(State, "sr_user"), @@ -147,6 +148,7 @@ update_tables(State) -> drop_index(State, "i_sr_user_jid"), drop_index(State, "i_sr_user_grp"), add_pkey(State, "sr_user", ["server_host", "jid", "grp"]), + create_unique_index(State, "sr_user", "i_sr_user_sh_jid_grp", ["server_host", "jid", "grp"]), create_index(State, "sr_user", "i_sr_user_sh_jid", ["server_host", "jid"]), create_index(State, "sr_user", "i_sr_user_sh_grp", ["server_host", "grp"]), drop_sh_default(State, "sr_user"), From dd359a7328be09f5244341afcbf408d895977016 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 27 Sep 2021 15:49:44 +0200 Subject: [PATCH 052/440] Add indexes from 95fa43aa to the old-to-new MySQL schema update script --- sql/mysql.old-to-new.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/mysql.old-to-new.sql b/sql/mysql.old-to-new.sql index 59c9befe2..9614d55a8 100644 --- a/sql/mysql.old-to-new.sql +++ b/sql/mysql.old-to-new.sql @@ -77,6 +77,7 @@ BEGIN ALTER TABLE `last` ADD PRIMARY KEY (`server_host`, `username`); ALTER TABLE `sr_group` ADD COLUMN `server_host` VARCHAR (191) COLLATE `utf8mb4_unicode_ci` NOT NULL DEFAULT @DEFAULT_HOST AFTER `name`; ALTER TABLE `sr_group` ALTER COLUMN `server_host` DROP DEFAULT; + ALTER TABLE `sr_group` ADD UNIQUE INDEX `i_sr_group_sh_name` (`server_host`, `name`); ALTER TABLE `sr_group` ADD PRIMARY KEY (`server_host`, `name`); ALTER TABLE `muc_registered` ADD COLUMN `server_host` VARCHAR (191) COLLATE `utf8mb4_unicode_ci` NOT NULL DEFAULT @DEFAULT_HOST AFTER `host`; ALTER TABLE `muc_registered` ALTER COLUMN `server_host` DROP DEFAULT; @@ -99,6 +100,7 @@ BEGIN ALTER TABLE `sr_user` DROP INDEX `i_sr_user_jid_group`; ALTER TABLE `sr_user` ADD COLUMN `server_host` VARCHAR (191) COLLATE `utf8mb4_unicode_ci` NOT NULL DEFAULT @DEFAULT_HOST AFTER `jid`; ALTER TABLE `sr_user` ALTER COLUMN `server_host` DROP DEFAULT; + ALTER TABLE `sr_user` ADD UNIQUE INDEX `i_sr_user_sh_jid_group` (`server_host`, `jid`, `grp`); ALTER TABLE `sr_user` ADD INDEX `i_sr_user_sh_jid` (`server_host`, `jid`); ALTER TABLE `sr_user` ADD INDEX `i_sr_user_sh_grp` (`server_host`, `grp`); ALTER TABLE `sr_user` ADD PRIMARY KEY (`server_host`, `jid`, `grp`); From d205e6ff1ff32c075afea8b3189edc5f3c0c1ab0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 27 Sep 2021 17:05:42 +0200 Subject: [PATCH 053/440] Support old scram records before xmpp's 651050f9 and ejabberd's e5cad9be6 (#3680) --- src/ejabberd_auth_sql.erl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl index 1f7106c59..e51bf276c 100644 --- a/src/ejabberd_auth_sql.erl +++ b/src/ejabberd_auth_sql.erl @@ -299,6 +299,20 @@ export(_Server) -> ["username=%(LUser)s", "server_host=%(LServer)s", "password=%(Password)s"])]; + (Host, #passwd{us = {LUser, LServer}, + password = {scram, StoredKey1, ServerKey, Salt, IterationCount}}) + when LServer == Host -> + Hash = sha, + StoredKey = scram_hash_encode(Hash, StoredKey1), + [?SQL("delete from users where username=%(LUser)s and %(LServer)H;"), + ?SQL_INSERT( + "users", + ["username=%(LUser)s", + "server_host=%(LServer)s", + "password=%(StoredKey)s", + "serverkey=%(ServerKey)s", + "salt=%(Salt)s", + "iterationcount=%(IterationCount)d"])]; (Host, #passwd{us = {LUser, LServer}, password = #scram{} = Scram}) when LServer == Host -> StoredKey = scram_hash_encode(Scram#scram.hash, Scram#scram.storedkey), From 85408662ffb26bc92a65ae027e773618cf24e313 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 4 Oct 2021 11:14:56 +0200 Subject: [PATCH 054/440] Use mod_register to format some common error messages --- src/mod_register_web.erl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index 0e216c81c..afb8f9f24 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -579,12 +579,8 @@ get_error_text({error, exists}) -> ?T("The account already exists"); get_error_text({error, password_incorrect}) -> ?T("Incorrect password"); -get_error_text({error, invalid_jid}) -> - ?T("The username is not valid"); get_error_text({error, host_unknown}) -> ?T("Host unknown"); -get_error_text({error, not_allowed}) -> - ?T("Not allowed"); get_error_text({error, account_doesnt_exist}) -> ?T("Account doesn't exist"); get_error_text({error, account_exists}) -> @@ -594,7 +590,9 @@ get_error_text({error, password_not_changed}) -> get_error_text({error, passwords_not_identical}) -> ?T("The passwords are different"); get_error_text({error, wrong_parameters}) -> - ?T("Wrong parameters in the web formulary"). + ?T("Wrong parameters in the web formulary"); +get_error_text({error, Why}) -> + mod_register:format_error(Why). mod_options(_) -> []. From 595b01601939074d28c1bb36383a7427cc459a7e Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 4 Oct 2021 11:24:24 +0200 Subject: [PATCH 055/440] Use mod_register in web register form, so its restrictions are used (#3688) --- src/mod_register_web.erl | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index afb8f9f24..1ac3b58dc 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -85,7 +85,7 @@ process([Section], process([<<"new">>], #request{method = 'POST', q = Q, ip = {Ip, _Port}, lang = Lang, host = _HTTPHost}) -> - case form_new_post(Q) of + case form_new_post(Q, Ip) of {success, ok, {Username, Host, _Password}} -> Jid = jid:make(Username, Host), mod_register:send_registration_notifications(?MODULE, Jid, Ip), @@ -290,10 +290,10 @@ form_new_get2(Host, Lang, CaptchaEls) -> %%% Formulary new POST %%%---------------------------------------------------------------------- -form_new_post(Q) -> +form_new_post(Q, Ip) -> case catch get_register_parameters(Q) of [Username, Host, Password, Password, Id, Key] -> - form_new_post(Username, Host, Password, {Id, Key}); + form_new_post(Username, Host, Password, {Id, Key}, Ip); [_Username, _Host, _Password, _Password2, false, false] -> {error, passwords_not_identical}; [_Username, _Host, _Password, _Password2, Id, Key] -> @@ -312,13 +312,12 @@ get_register_parameters(Q) -> [<<"username">>, <<"host">>, <<"password">>, <<"password2">>, <<"id">>, <<"key">>]). -form_new_post(Username, Host, Password, - {false, false}) -> - register_account(Username, Host, Password); -form_new_post(Username, Host, Password, {Id, Key}) -> +form_new_post(Username, Host, Password, {false, false}, Ip) -> + register_account(Username, Host, Password, Ip); +form_new_post(Username, Host, Password, {Id, Key}, Ip) -> case ejabberd_captcha:check_captcha(Id, Key) of captcha_valid -> - register_account(Username, Host, Password); + register_account(Username, Host, Password, Ip); captcha_non_valid -> {error, captcha_non_valid}; captcha_not_found -> {error, captcha_non_valid} end. @@ -502,11 +501,11 @@ form_del_get(Host, Lang) -> {<<"Content-Type">>, <<"text/html">>}], ejabberd_web:make_xhtml(HeadEls, Els)}. -%% @spec(Username, Host, Password) -> {success, ok, {Username, Host, Password} | +%% @spec(Username, Host, Password, Ip) -> {success, ok, {Username, Host, Password} | %% {success, exists, {Username, Host, Password}} | %% {error, not_allowed} | %% {error, invalid_jid} -register_account(Username, Host, Password) -> +register_account(Username, Host, Password, Ip) -> try mod_register_opt:access(Host) of Access -> case jid:make(Username, Host) of @@ -514,16 +513,15 @@ register_account(Username, Host, Password) -> JID -> case acl:match_rule(Host, Access, JID) of deny -> {error, not_allowed}; - allow -> register_account2(Username, Host, Password) + allow -> register_account2(Username, Host, Password, Ip) end end catch _:{module_not_loaded, mod_register, _Host} -> {error, host_unknown} end. -register_account2(Username, Host, Password) -> - case ejabberd_auth:try_register(Username, Host, - Password) +register_account2(Username, Host, Password, Ip) -> + case mod_register:try_register(Username, Host, Password, Ip) of ok -> {success, ok, {Username, Host, Password}}; From 1377dcf6d2bf7e51856b9f221fb7279d6c4689ef Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 6 Oct 2021 01:13:11 +0200 Subject: [PATCH 056/440] mod_mam: Declare XEP-0441 support --- src/mod_mam.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index abb2333cc..9bf154f58 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -28,6 +28,7 @@ -protocol({xep, 313, '0.6.1'}). -protocol({xep, 334, '0.2'}). -protocol({xep, 359, '0.5.0'}). +-protocol({xep, 441, '0.2.0'}). -behaviour(gen_mod). From 964cb3aacab94fcf88f4a445fcf9bc6b414b35fc Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 7 Oct 2021 16:23:11 +0200 Subject: [PATCH 057/440] Github Actions: use MD5 pass encryption to support PostgreSQL 14 (#3691) --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d498760be..7cafdfe67 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,6 +52,8 @@ jobs: - name: Prepare databases run: | + sudo sed -i 's|#password_encryption.*|password_encryption = md5|g' /etc/postgresql/14/main/postgresql.conf + sudo sed -i 's|scram-sha-256|md5|g' /etc/postgresql/14/main/pg_hba.conf sudo systemctl start mysql.service sudo systemctl start postgresql.service mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost' From 6b0fa44386709151bb48ad9284a060888b7c5c54 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 9 Oct 2021 10:56:30 +0200 Subject: [PATCH 058/440] Update 'xmpp' dependency Fixes #3529. --- mix.exs | 2 +- rebar.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 0b5d40b09..021de5e2b 100644 --- a/mix.exs +++ b/mix.exs @@ -124,7 +124,7 @@ defmodule Ejabberd.MixProject do {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, {:stun, "~> 1.0"}, - {:xmpp, git: "https://github.com/processone/xmpp", ref: "e943c0285aa85e3cbd4bfb9259f6b7de32b00395", override: true}, + {:xmpp, git: "https://github.com/processone/xmpp", ref: "3f18c9e6b239c3a8a4d82dc478b26565037b7247", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/rebar.config b/rebar.config index a70ccfba3..1f1710bf9 100644 --- a/rebar.config +++ b/rebar.config @@ -59,7 +59,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.44"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "e943c0285aa85e3cbd4bfb9259f6b7de32b00395"}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "3f18c9e6b239c3a8a4d82dc478b26565037b7247"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. From db920b7d7b958a0c57fcde23102954a831981760 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 13 Oct 2021 19:38:31 +0200 Subject: [PATCH 059/440] Only install some files when option enabled in configure (#3633) --- Makefile.in | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 6549665f7..45e223ca2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -249,7 +249,15 @@ $(call TO_DEST,priv/bin/captcha.sh): tools/captcha.sh $(call TO_DEST,priv/bin) $(call TO_DEST,priv/lua/redis_sm.lua): priv/lua/redis_sm.lua $(call TO_DEST,priv/lua) $(INSTALL) -m 644 $< $@ -copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh priv/sql/lite.sql priv/sql/lite.new.sql priv/lua/redis_sm.lua) +ifeq (@sqlite@,true) +SQLITE_FILES = priv/sql/lite.sql priv/sql/lite.new.sql +endif + +ifeq (@redis@,true) +REDIS_FILES = priv/lua/redis_sm.lua +endif + +copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh $(SQLITE_FILES) $(REDIS_FILES)) .PHONY: $(call TO_DEST,$(DEPS_FILES) $(MAIN_DIRS) $(DEPS_DIRS)) From d3aa329769c09bb0614948358db2d5f98066c32a Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 14 Oct 2021 13:31:46 +0200 Subject: [PATCH 060/440] Fix vcard_search definition in pgsql new schema (thanks to Stu Tomlinson)(#3695) How to update an existing database: ALTER TABLE vcard_search DROP CONSTRAINT vcard_search_pkey; ALTER TABLE vcard_search ADD PRIMARY KEY (server_host, lusername); --- sql/pg.new.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/pg.new.sql b/sql/pg.new.sql index b3473a1a0..6a0743f23 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -311,7 +311,7 @@ CREATE TABLE vcard_search ( lorgname text NOT NULL, orgunit text NOT NULL, lorgunit text NOT NULL, - PRIMARY KEY (server_host, username) + PRIMARY KEY (server_host, lusername) ); CREATE INDEX i_vcard_search_sh_lfn ON vcard_search(server_host, lfn); From c2db0034311286035ce8ad6ee5f32101a02dae5a Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Oct 2021 14:49:30 +0200 Subject: [PATCH 061/440] When tests fail, show also error.log as it may have meaningful content --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7cafdfe67..634bd2a10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -160,6 +160,10 @@ jobs: if: failure() run: find logs/ -name ejabberd.log -exec cat '{}' ';' + - name: View error.log + if: failure() + run: find logs/ -name error.log -exec cat '{}' ';' + - name: View exunit.log if: failure() run: find logs/ -name exunit.log -exec cat '{}' ';' From 4d384b6bf58f8bf68531cee35c3cb394d63e73a3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Oct 2021 14:50:51 +0200 Subject: [PATCH 062/440] If tests succeed, test also new SQL schema --- .github/workflows/ci.yml | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 634bd2a10..7baa5790f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -181,6 +181,53 @@ jobs: "payload":{"build_num":$GITHUB_RUN_ID, "status":"done"}}' + - name: Prepare new schema + run: | + [[ -d logs ]] && rm -rf logs + [[ -d _build/test/logs ]] && rm -rf _build/test/logs + mysql -u root -proot -e "DROP DATABASE ejabberd_test;" + sudo -u postgres psql -c "DROP DATABASE ejabberd_test;" + mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" + mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* + TO 'ejabberd_test'@'localhost';" + mysql -u root -proot ejabberd_test < sql/mysql.new.sql + sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" + sudo -u postgres psql ejabberd_test -f sql/pg.new.sql + sudo -u postgres psql -c "GRANT ALL PRIVILEGES + ON DATABASE ejabberd_test TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + TABLES IN SCHEMA public + TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + SEQUENCES IN SCHEMA public + TO ejabberd_test;" + sudo sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl + - run: CT_BACKENDS=mysql,pgsql make test + - name: Check results + if: always() + run: | + [[ -d _build ]] && ln -s _build/test/logs/ logs \ + || ln dialyzer/error.log logs/dialyzer.log + ln `find logs/ -name suite.log` logs/suite.log + grep 'TEST COMPLETE' logs/suite.log + grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log + test $(find logs/ -empty -name error.log) + - name: View full suite.log + run: cat logs/suite.log + - name: View suite.log failures + if: failure() + run: cat logs/suite.log | awk + 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' + - name: View full ejabberd.log + if: failure() + run: find logs/ -name ejabberd.log -exec cat '{}' ';' + - name: View error.log + if: failure() + run: find logs/ -name error.log -exec cat '{}' ';' + - name: View exunit.log + if: failure() + run: find logs/ -name exunit.log -exec cat '{}' ';' + binaries: name: Binaries needs: [tests] From 54c23a65db7491a9cc51eac3f89734c161603481 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 21 Oct 2021 12:44:51 +0200 Subject: [PATCH 063/440] Fix create_room_with_opts when using SQL storage (#3700) --- src/mod_muc_admin.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 2abeee45c..ce4665d7e 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -710,7 +710,7 @@ create_room_with_opts(Name1, Host1, ServerHost1, CustomRoomOpts) -> maybe_store_room(ServerHost, Host, Name, RoomOpts) -> case proplists:get_bool(persistent, RoomOpts) of true -> - {atomic, ok} = mod_muc:store_room(ServerHost, Host, Name, RoomOpts), + {atomic, _} = mod_muc:store_room(ServerHost, Host, Name, RoomOpts), ok; false -> ok From 5f3c8dcca429893e85d92b47d9f84054e2b12fed Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 6 Oct 2021 12:18:08 +0200 Subject: [PATCH 064/440] Use the configured user in systemd's ejabberd.service --- Makefile.in | 3 ++- ejabberd.service.template | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 45e223ca2..ecee982e3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -306,7 +306,8 @@ install: copy-files chmod 755 ejabberd.init # # Service script - $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" ejabberd.service.template \ + $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ + -e "s*@installuser@*$(INIT_USER)*g" ejabberd.service.template \ > ejabberd.service chmod 644 ejabberd.service # diff --git a/ejabberd.service.template b/ejabberd.service.template index c779ea031..685a104d0 100644 --- a/ejabberd.service.template +++ b/ejabberd.service.template @@ -4,8 +4,8 @@ After=network.target [Service] Type=notify -User=ejabberd -Group=ejabberd +User=@installuser@ +Group=@installuser@ LimitNOFILE=65536 Restart=on-failure RestartSec=5 From 5462a26a0a337217f4875b5471985e2587b3e7f3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 6 Oct 2021 12:28:10 +0200 Subject: [PATCH 065/440] Remove obsolete cookie preparation in spool dir, it's now stored in HOME --- Makefile.in | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index ecee982e3..fc9718006 100644 --- a/Makefile.in +++ b/Makefile.in @@ -71,9 +71,6 @@ SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd # /var/lock/ejabberdctl CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl -# /var/lib/ejabberd/.erlang.cookie -COOKIEFILE = $(SPOOLDIR)/.erlang.cookie - # /var/log/ejabberd/ LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd @@ -315,7 +312,6 @@ install: copy-files $(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR) $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT) chmod -R 750 $(SPOOLDIR) - [ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; } # # ejabberdctl lock directory $(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR) From 5d0e599f1784d7529dcd365ad8c3dd46c1ac85ad Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Fri, 29 Oct 2021 05:12:26 +0300 Subject: [PATCH 066/440] Support MUC hats (XEP-0317, conversejs/prosody compatible) --- include/mod_muc_room.hrl | 2 + src/mod_muc_room.erl | 420 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 416 insertions(+), 6 deletions(-) diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index bbe656575..a98833662 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -65,6 +65,7 @@ captcha_whitelist = (?SETS):empty() :: gb_sets:set(), mam = false :: boolean(), pubsub = <<"">> :: binary(), + enable_hats = false :: boolean(), lang = ejabberd_option:language() :: binary() }). @@ -124,6 +125,7 @@ history = #lqueue{} :: lqueue(), subject = [] :: [text()], subject_author = <<"">> :: binary(), + hats_users = #{} :: #{ljid() => #{binary() => binary()}}, just_created = erlang:system_time(microsecond) :: true | integer(), activity = treap:empty() :: treap:treap(), room_shaper = none :: ejabberd_shaper:shaper(), diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 035e851fd..3f2c655df 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -76,6 +76,12 @@ -define(DEFAULT_MAX_USERS_PRESENCE,1000). +-define(MUC_HAT_ADD_CMD, <<"http://prosody.im/protocol/hats#add">>). +-define(MUC_HAT_REMOVE_CMD, <<"http://prosody.im/protocol/hats#remove">>). +-define(MUC_HAT_LIST_CMD, <<"p1:hats#list">>). +-define(MAX_HATS_USERS, 100). +-define(MAX_HATS_PER_USER, 10). + %-define(DBGFSM, true). -ifdef(DBGFSM). @@ -446,6 +452,8 @@ normal_state({route, <<"">>, process_iq_mucsub(From, IQ, StateData); #xcaptcha{} -> process_iq_captcha(From, IQ, StateData); + #adhoc_command{} -> + process_iq_adhoc(From, IQ, StateData); _ -> Txt = ?T("The feature requested is not " "supported by the conference"), @@ -1405,6 +1413,12 @@ is_occupant_or_admin(JID, StateData) -> _ -> false end. +%% Check if the user is an admin or owner. +-spec is_admin(jid(), state()) -> boolean(). +is_admin(JID, StateData) -> + FAffiliation = get_affiliation(JID, StateData), + FAffiliation == admin orelse FAffiliation == owner. + %% Decide the fate of the message and its sender %% Returns: continue_delivery | forget_message | {expulse_sender, Reason} -spec decide_fate_message(message(), jid(), state()) -> @@ -1935,7 +1949,7 @@ filter_presence(Presence) -> XMLNS = xmpp:get_ns(El), case catch binary:part(XMLNS, 0, size(?NS_MUC)) of ?NS_MUC -> false; - _ -> true + _ -> XMLNS /= ?NS_HATS end end, xmpp:get_els(Presence)), xmpp:set_els(Presence, Els). @@ -2485,9 +2499,10 @@ send_new_presence(NJID, Reason, IsInitialPresence, StateData, OldStateData) -> Pres = if Presence == undefined -> #presence{}; true -> Presence end, - Packet = xmpp:set_subtag( - Pres, #muc_user{items = [Item], - status_codes = StatusCodes}), + Packet = xmpp:set_subtag( + add_presence_hats(NJID, Pres, StateData), + #muc_user{items = [Item], + status_codes = StatusCodes}), send_wrapped(jid:replace_resource(StateData#state.jid, Nick), Info#user.jid, Packet, Node1, StateData), Type = xmpp:get_type(Packet), @@ -2536,7 +2551,9 @@ send_existing_presences1(ToJID, StateData) -> false -> Item0 end, Packet = xmpp:set_subtag( - Presence, #muc_user{items = [Item]}), + add_presence_hats( + FromJID, Presence, StateData), + #muc_user{items = [Item]}), send_wrapped(jid:replace_resource(StateData#state.jid, FromNick), RealToJID, Packet, ?NS_MUCSUB_NODES_PRESENCE, StateData) end @@ -3579,7 +3596,8 @@ get_config(Lang, StateData, From) -> {allow_voice_requests, Config#config.allow_voice_requests}, {allow_subscription, Config#config.allow_subscription}, {voice_request_min_interval, Config#config.voice_request_min_interval}, - {pubsub, Config#config.pubsub}] + {pubsub, Config#config.pubsub}, + {enable_hats, Config#config.enable_hats}] ++ case ejabberd_captcha:is_feature_available() of true -> @@ -3667,6 +3685,7 @@ set_config(Opts, Config, ServerHost, Lang) -> ({maxusers, V}, C) -> C#config{max_users = V}; ({enablelogging, V}, C) -> C#config{logging = V}; ({pubsub, V}, C) -> C#config{pubsub = V}; + ({enable_hats, V}, C) -> C#config{enable_hats = V}; ({lang, L}, C) -> C#config{lang = L}; ({captcha_whitelist, Js}, C) -> LJIDs = [jid:tolower(J) || J <- Js], @@ -3897,6 +3916,9 @@ set_opts([{Opt, Val} | Opts], StateData) -> allow_subscription -> StateData#state{config = (StateData#state.config)#config{allow_subscription = Val}}; + enable_hats -> + StateData#state{config = + (StateData#state.config)#config{enable_hats = Val}}; lang -> StateData#state{config = (StateData#state.config)#config{lang = Val}}; @@ -3927,6 +3949,11 @@ set_opts([{Opt, Val} | Opts], StateData) -> end, StateData#state{subject = Subj}; subject_author -> StateData#state{subject_author = Val}; + hats_users -> + Hats = maps:from_list( + lists:map(fun({U, H}) -> {U, maps:from_list(H)} end, + Val)), + StateData#state{hats_users = Hats}; _ -> StateData end, set_opts(Opts, NSD). @@ -3983,6 +4010,7 @@ make_opts(StateData) -> ?MAKE_CONFIG_OPT(#config.vcard), ?MAKE_CONFIG_OPT(#config.vcard_xupdate), ?MAKE_CONFIG_OPT(#config.pubsub), + ?MAKE_CONFIG_OPT(#config.enable_hats), ?MAKE_CONFIG_OPT(#config.lang), {captcha_whitelist, (?SETS):to_list((StateData#state.config)#config.captcha_whitelist)}, @@ -3990,6 +4018,9 @@ make_opts(StateData) -> maps:to_list(StateData#state.affiliations)}, {subject, StateData#state.subject}, {subject_author, StateData#state.subject_author}, + {hats_users, + lists:map(fun({U, H}) -> {U, maps:to_list(H)} end, + maps:to_list(StateData#state.hats_users))}, {hibernation_time, erlang:system_time(microsecond)}, {subscribers, Subscribers}]. @@ -4080,6 +4111,7 @@ maybe_forget_room(StateData) -> make_disco_info(_From, StateData) -> Config = StateData#state.config, Feats = [?NS_VCARD, ?NS_MUC, ?NS_DISCO_INFO, ?NS_DISCO_ITEMS, + ?NS_COMMANDS, ?CONFIG_OPT_TO_FEATURE((Config#config.public), <<"muc_public">>, <<"muc_hidden">>), ?CONFIG_OPT_TO_FEATURE((Config#config.persistent), @@ -4119,6 +4151,77 @@ process_iq_disco_info(From, #iq{type = get, lang = Lang, DiscoInfo = make_disco_info(From, StateData), Extras = iq_disco_info_extras(Lang, StateData, false), {result, DiscoInfo#disco_info{xdata = [Extras]}}; +process_iq_disco_info(From, #iq{type = get, lang = Lang, + sub_els = [#disco_info{node = ?NS_COMMANDS}]}, + StateData) -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, + #disco_info{ + identities = [#identity{category = <<"automation">>, + type = <<"command-list">>, + name = translate:translate( + Lang, ?T("Commands"))}]}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; +process_iq_disco_info(From, #iq{type = get, lang = Lang, + sub_els = [#disco_info{node = ?MUC_HAT_ADD_CMD}]}, + StateData) -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, + #disco_info{ + identities = [#identity{category = <<"automation">>, + type = <<"command-node">>, + name = translate:translate( + Lang, ?T("Add a hat to a user"))}], + features = [?NS_COMMANDS]}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; +process_iq_disco_info(From, #iq{type = get, lang = Lang, + sub_els = [#disco_info{node = ?MUC_HAT_REMOVE_CMD}]}, + StateData) -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, + #disco_info{ + identities = [#identity{category = <<"automation">>, + type = <<"command-node">>, + name = translate:translate( + Lang, ?T("Remove a hat from a user"))}], + features = [?NS_COMMANDS]}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; +process_iq_disco_info(From, #iq{type = get, lang = Lang, + sub_els = [#disco_info{node = ?MUC_HAT_LIST_CMD}]}, + StateData) -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, + #disco_info{ + identities = [#identity{category = <<"automation">>, + type = <<"command-node">>, + name = translate:translate( + Lang, ?T("List users with hats"))}], + features = [?NS_COMMANDS]}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; process_iq_disco_info(From, #iq{type = get, lang = Lang, sub_els = [#disco_info{node = Node}]}, StateData) -> @@ -4199,6 +4302,46 @@ process_iq_disco_items(From, #iq{type = get, sub_els = [#disco_items{node = <<>> {result, #disco_items{}} end end; +process_iq_disco_items(From, #iq{type = get, lang = Lang, + sub_els = [#disco_items{node = ?NS_COMMANDS}]}, + StateData) -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, + #disco_items{ + items = [#disco_item{jid = StateData#state.jid, + node = ?MUC_HAT_ADD_CMD, + name = translate:translate( + Lang, ?T("Add a hat to a user"))}, + #disco_item{jid = StateData#state.jid, + node = ?MUC_HAT_REMOVE_CMD, + name = translate:translate( + Lang, ?T("Remove a hat from a user"))}, + #disco_item{jid = StateData#state.jid, + node = ?MUC_HAT_LIST_CMD, + name = translate:translate( + Lang, ?T("List users with hats"))}]}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; +process_iq_disco_items(From, #iq{type = get, lang = Lang, + sub_els = [#disco_items{node = Node}]}, + StateData) + when Node == ?MUC_HAT_ADD_CMD; + Node == ?MUC_HAT_REMOVE_CMD; + Node == ?MUC_HAT_LIST_CMD -> + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + {result, #disco_items{}}; + false -> + Txt = ?T("Node not found"), + {error, xmpp:err_item_not_found(Txt, Lang)} + end; process_iq_disco_items(_From, #iq{lang = Lang}, _StateData) -> Txt = ?T("Node not found"), {error, xmpp:err_item_not_found(Txt, Lang)}. @@ -4441,6 +4584,271 @@ get_mucroom_disco_items(StateData) -> end, [], StateData#state.nicks), #disco_items{items = Items}. +-spec process_iq_adhoc(jid(), iq(), state()) -> + {result, adhoc_command()} | + {result, adhoc_command(), state()} | + {error, stanza_error()}. +process_iq_adhoc(_From, #iq{type = get}, _StateData) -> + {error, xmpp:err_bad_request()}; +process_iq_adhoc(From, #iq{type = set, lang = Lang1, + sub_els = [#adhoc_command{} = Request]}, + StateData) -> + % Ad-Hoc Commands are used only for Hats here + case (StateData#state.config)#config.enable_hats andalso + is_admin(From, StateData) + of + true -> + #adhoc_command{lang = Lang2, node = Node, + action = Action, xdata = XData} = Request, + Lang = case Lang2 of + <<"">> -> Lang1; + _ -> Lang2 + end, + case {Node, Action} of + {_, cancel} -> + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{status = canceled, lang = Lang, + node = Node})}; + {?MUC_HAT_ADD_CMD, execute} -> + Form = + #xdata{ + title = translate:translate( + Lang, ?T("Add a hat to a user")), + type = form, + fields = + [#xdata_field{ + type = 'jid-single', + label = translate:translate(Lang, ?T("Jabber ID")), + required = true, + var = <<"jid">>}, + #xdata_field{ + type = 'text-single', + label = translate:translate(Lang, ?T("Hat title")), + var = <<"hat_title">>}, + #xdata_field{ + type = 'text-single', + label = translate:translate(Lang, ?T("Hat URI")), + required = true, + var = <<"hat_uri">>} + ]}, + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{ + status = executing, + xdata = Form})}; + {?MUC_HAT_ADD_CMD, complete} when XData /= undefined -> + JID = try + jid:decode(hd(xmpp_util:get_xdata_values( + <<"jid">>, XData))) + catch _:_ -> error + end, + URI = try + hd(xmpp_util:get_xdata_values( + <<"hat_uri">>, XData)) + catch _:_ -> error + end, + Title = case xmpp_util:get_xdata_values( + <<"hat_title">>, XData) of + [] -> <<"">>; + [T] -> T + end, + if + (JID /= error) and (URI /= error) -> + case add_hat(JID, URI, Title, StateData) of + {ok, NewStateData} -> + store_room(NewStateData), + send_update_presence( + JID, NewStateData, StateData), + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{status = completed}), + NewStateData}; + {error, size_limit} -> + Txt = ?T("Hats limit exceeded"), + {error, xmpp:err_not_allowed(Txt, Lang)} + end; + true -> + {error, xmpp:err_bad_request()} + end; + {?MUC_HAT_ADD_CMD, complete} -> + {error, xmpp:err_bad_request()}; + {?MUC_HAT_ADD_CMD, _} -> + Txt = ?T("Incorrect value of 'action' attribute"), + {error, xmpp:err_bad_request(Txt, Lang)}; + {?MUC_HAT_REMOVE_CMD, execute} -> + Form = + #xdata{ + title = translate:translate( + Lang, ?T("Remove a hat from a user")), + type = form, + fields = + [#xdata_field{ + type = 'jid-single', + label = translate:translate(Lang, ?T("Jabber ID")), + required = true, + var = <<"jid">>}, + #xdata_field{ + type = 'text-single', + label = translate:translate(Lang, ?T("Hat URI")), + required = true, + var = <<"hat_uri">>} + ]}, + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{ + status = executing, + xdata = Form})}; + {?MUC_HAT_REMOVE_CMD, complete} when XData /= undefined -> + JID = try + jid:decode(hd(xmpp_util:get_xdata_values( + <<"jid">>, XData))) + catch _:_ -> error + end, + URI = try + hd(xmpp_util:get_xdata_values( + <<"hat_uri">>, XData)) + catch _:_ -> error + end, + if + (JID /= error) and (URI /= error) -> + NewStateData = del_hat(JID, URI, StateData), + store_room(NewStateData), + send_update_presence( + JID, NewStateData, StateData), + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{status = completed}), + NewStateData}; + true -> + {error, xmpp:err_bad_request()} + end; + {?MUC_HAT_REMOVE_CMD, complete} -> + {error, xmpp:err_bad_request()}; + {?MUC_HAT_REMOVE_CMD, _} -> + Txt = ?T("Incorrect value of 'action' attribute"), + {error, xmpp:err_bad_request(Txt, Lang)}; + {?MUC_HAT_LIST_CMD, execute} -> + Hats = get_all_hats(StateData), + Items = + lists:map( + fun({JID, URI, Title}) -> + [#xdata_field{ + var = <<"jid">>, + values = [jid:encode(JID)]}, + #xdata_field{ + var = <<"hat_title">>, + values = [URI]}, + #xdata_field{ + var = <<"hat_uri">>, + values = [Title]}] + end, Hats), + Form = + #xdata{ + title = translate:translate( + Lang, ?T("List of users with hats")), + type = result, + reported = + [#xdata_field{ + label = translate:translate(Lang, ?T("Jabber ID")), + var = <<"jid">>}, + #xdata_field{ + label = translate:translate(Lang, ?T("Hat title")), + var = <<"hat_title">>}, + #xdata_field{ + label = translate:translate(Lang, ?T("Hat URI")), + var = <<"hat_uri">>}], + items = Items}, + {result, + xmpp_util:make_adhoc_response( + Request, + #adhoc_command{ + status = completed, + xdata = Form})}; + {?MUC_HAT_LIST_CMD, _} -> + Txt = ?T("Incorrect value of 'action' attribute"), + {error, xmpp:err_bad_request(Txt, Lang)}; + _ -> + {error, xmpp:err_item_not_found()} + end; + _ -> + {error, xmpp:err_forbidden()} + end. + +-spec add_hat(jid(), binary(), binary(), state()) -> + {ok, state()} | {error, size_limit}. +add_hat(JID, URI, Title, StateData) -> + Hats = StateData#state.hats_users, + LJID = jid:remove_resource(jid:tolower(JID)), + UserHats = maps:get(LJID, Hats, #{}), + UserHats2 = maps:put(URI, Title, UserHats), + USize = maps:size(UserHats2), + if + USize =< ?MAX_HATS_PER_USER -> + Hats2 = maps:put(LJID, UserHats2, Hats), + Size = maps:size(Hats2), + if + Size =< ?MAX_HATS_USERS -> + {ok, StateData#state{hats_users = Hats2}}; + true -> + {error, size_limit} + end; + true -> + {error, size_limit} + end. + +-spec del_hat(jid(), binary(), state()) -> state(). +del_hat(JID, URI, StateData) -> + Hats = StateData#state.hats_users, + LJID = jid:remove_resource(jid:tolower(JID)), + UserHats = maps:get(LJID, Hats, #{}), + UserHats2 = maps:remove(URI, UserHats), + Hats2 = + case maps:size(UserHats2) of + 0 -> + maps:remove(LJID, Hats); + _ -> + maps:put(LJID, UserHats2, Hats) + end, + StateData#state{hats_users = Hats2}. + +-spec get_all_hats(state()) -> list({jid(), binary(), binary()}). +get_all_hats(StateData) -> + lists:flatmap( + fun({LJID, H}) -> + JID = jid:make(LJID), + lists:map(fun({URI, Title}) -> {JID, URI, Title} end, + maps:to_list(H)) + end, + maps:to_list(StateData#state.hats_users)). + +-spec add_presence_hats(jid(), #presence{}, state()) -> #presence{}. +add_presence_hats(JID, Pres, StateData) -> + case (StateData#state.config)#config.enable_hats of + true -> + Hats = StateData#state.hats_users, + LJID = jid:remove_resource(jid:tolower(JID)), + UserHats = maps:get(LJID, Hats, #{}), + case maps:size(UserHats) of + 0 -> Pres; + _ -> + Items = + lists:map(fun({URI, Title}) -> + #muc_hat{uri = URI, title = Title} + end, + maps:to_list(UserHats)), + xmpp:set_subtag(Pres, + #muc_hats{hats = Items}) + end; + false -> + Pres + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Voice request support From 5d48329a3ff46d2e29f9f09921d99ac10f655589 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Fri, 29 Oct 2021 05:48:03 +0300 Subject: [PATCH 067/440] Update 'xmpp' dependency --- mix.exs | 2 +- rebar.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 021de5e2b..8debcd6a1 100644 --- a/mix.exs +++ b/mix.exs @@ -124,7 +124,7 @@ defmodule Ejabberd.MixProject do {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, {:stun, "~> 1.0"}, - {:xmpp, git: "https://github.com/processone/xmpp", ref: "3f18c9e6b239c3a8a4d82dc478b26565037b7247", override: true}, + {:xmpp, git: "https://github.com/processone/xmpp", ref: "a85dc699ff02471ecad08d85e3bed87c57c48aba", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/rebar.config b/rebar.config index 1f1710bf9..77d017c99 100644 --- a/rebar.config +++ b/rebar.config @@ -59,7 +59,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.44"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "3f18c9e6b239c3a8a4d82dc478b26565037b7247"}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "a85dc699ff02471ecad08d85e3bed87c57c48aba"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. From 29dcc9b94ccfd514cf388979e7210d01cb97d5f4 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 30 Oct 2021 13:19:30 +0200 Subject: [PATCH 068/440] PubSub: Add delete_expired_pubsub_items command Support XEP-0060's pubsub#item_expire feature by adding a command for deleting expired PubSub items. Thanks to Ammonit Measurement GmbH for sponsoring this work. --- src/gen_pubsub_node.erl | 4 +++ src/mod_pubsub.erl | 67 ++++++++++++++++++++++++++++++++++++++++- src/node_flat.erl | 18 ++++++++++- src/node_flat_sql.erl | 19 +++++++++++- src/node_pep.erl | 5 ++- src/node_pep_sql.erl | 5 ++- 6 files changed, 113 insertions(+), 5 deletions(-) diff --git a/src/gen_pubsub_node.erl b/src/gen_pubsub_node.erl index 625e490fc..3f83fe48f 100644 --- a/src/gen_pubsub_node.erl +++ b/src/gen_pubsub_node.erl @@ -133,6 +133,10 @@ {result, {[itemId()], [itemId()]} }. +-callback remove_expired_items(NodeIdx :: nodeIdx(), + Seconds :: infinity | non_neg_integer()) -> + {result, [itemId()]}. + -callback get_node_affiliations(NodeIdx :: nodeIdx()) -> {result, [{ljid(), affiliation()}]}. diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 2e40d8f0e..a36c6e645 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -95,7 +95,7 @@ terminate/2, code_change/3, depends/2, mod_opt_type/1, mod_options/1]). %% ejabberd commands --export([get_commands_spec/0, delete_old_items/1]). +-export([get_commands_spec/0, delete_old_items/1, delete_expired_items/0]). -export([route/1]). @@ -3431,6 +3431,14 @@ max_items(Host, Options) -> end end. +-spec item_expire(host(), [{atom(), any()}]) -> non_neg_integer() | infinity. +item_expire(Host, Options) -> + case get_option(Options, item_expire) of + I when is_integer(I), I < 0 -> 0; + I when is_integer(I) -> I; + _ -> get_max_item_expire_node(Host) + end. + -spec get_configure_xfields(_, pubsub_node_config:result(), binary(), [binary()]) -> [xdata_field()]. get_configure_xfields(_Type, Options, Lang, Groups) -> @@ -3575,6 +3583,10 @@ check_opt_range(Opt, Opts, Max) -> get_max_items_node(Host) -> config(Host, max_items_node, undefined). +-spec get_max_item_expire_node(host()) -> infinity | non_neg_integer(). +get_max_item_expire_node(Host) -> + config(Host, max_item_expire_node, infinity). + -spec get_max_subscriptions_node(host()) -> undefined | non_neg_integer(). get_max_subscriptions_node(Host) -> config(Host, max_subscriptions_node, undefined). @@ -4181,6 +4193,44 @@ delete_old_items(N) -> ok end. +-spec delete_expired_items() -> ok | error. +delete_expired_items() -> + Results = lists:flatmap( + fun(Host) -> + case tree_action(Host, get_all_nodes, [Host]) of + Nodes when is_list(Nodes) -> + lists:map( + fun(#pubsub_node{id = Nidx, type = Type, + options = Options}) -> + case item_expire(Host, Options) of + infinity -> + ok; + Seconds -> + case node_action( + Host, Type, + remove_expired_items, + [Nidx, Seconds]) of + {result, []} -> + ok; + {result, [_|_]} -> + unset_cached_item( + Host, Nidx); + {error, _} -> + error + end + end + end, Nodes); + _ -> + error + end + end, ejabberd_option:hosts()), + case lists:member(error, Results) of + true -> + error; + false -> + ok + end. + -spec get_commands_spec() -> [ejabberd_commands()]. get_commands_spec() -> [#ejabberd_commands{name = delete_old_pubsub_items, tags = [purge], @@ -4191,6 +4241,13 @@ get_commands_spec() -> result = {res, rescode}, result_desc = "0 if command failed, 1 when succeeded", args_example = [1000], + result_example = ok}, + #ejabberd_commands{name = delete_expired_pubsub_items, tags = [purge], + desc = "Delete expired PubSub items", + module = ?MODULE, function = delete_expired_items, + args = [], + result = {res, rescode}, + result_desc = "0 if command failed, 1 when succeeded", result_example = ok}]. -spec mod_opt_type(atom()) -> econf:validator(). @@ -4204,6 +4261,8 @@ mod_opt_type(last_item_cache) -> econf:bool(); mod_opt_type(max_items_node) -> econf:non_neg_int(unlimited); +mod_opt_type(max_item_expire_node) -> + econf:timeout(second, infinity); mod_opt_type(max_nodes_discoitems) -> econf:non_neg_int(infinity); mod_opt_type(max_subscriptions_node) -> @@ -4251,6 +4310,7 @@ mod_options(Host) -> {ignore_pep_from_offline, true}, {last_item_cache, false}, {max_items_node, ?MAXITEMS}, + {max_item_expire_node, infinity}, {max_nodes_discoitems, 100}, {nodetree, ?STDTREE}, {pep_mapping, []}, @@ -4329,6 +4389,11 @@ mod_doc() -> " so many nodes, caching last items speeds up pubsub " "and allows to raise user connection rate. The cost " "is memory usage, as every item is stored in memory.")}}, + {max_item_expire_node, + #{value => "timeout() | infinity", + desc => + ?T("Specify the maximum item epiry time. Default value " + "is: 'infinity'.")}}, {max_items_node, #{value => "non_neg_integer() | infinity", desc => diff --git a/src/node_flat.erl b/src/node_flat.erl index c597b9ce9..55dea0d8d 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -40,7 +40,7 @@ create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/7, delete_item/4, - remove_extra_items/2, remove_extra_items/3, + remove_extra_items/2, remove_extra_items/3, remove_expired_items/2, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -432,6 +432,22 @@ remove_extra_items(Nidx, MaxItems, ItemIds) -> del_items(Nidx, OldItems), {result, {NewItems, OldItems}}. +remove_expired_items(_Nidx, infinity) -> + {result, []}; +remove_expired_items(Nidx, Seconds) -> + Items = mnesia:index_read(pubsub_item, Nidx, #pubsub_item.nodeidx), + ExpT = misc:usec_to_now( + erlang:system_time(microsecond) - (Seconds * 1000000)), + ExpItems = lists:filtermap( + fun(#pubsub_item{itemid = {ItemId, _}, + modification = {ModT, _}}) when ModT < ExpT -> + {true, ItemId}; + (#pubsub_item{}) -> + false + end, Items), + del_items(Nidx, ExpItems), + {result, ExpItems}. + %% @doc

Triggers item deletion.

%%

Default plugin: The user performing the deletion must be the node owner %% or a publisher, or PublishModel being open.

diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 240dc3760..f9c8a209d 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -43,7 +43,7 @@ create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/7, delete_item/4, - remove_extra_items/2, remove_extra_items/3, + remove_extra_items/2, remove_extra_items/3, remove_expired_items/2, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -285,6 +285,23 @@ remove_extra_items(Nidx, MaxItems, ItemIds) -> del_items(Nidx, OldItems), {result, {NewItems, OldItems}}. +remove_expired_items(_Nidx, infinity) -> + {result, []}; +remove_expired_items(Nidx, Seconds) -> + ExpT = encode_now( + misc:usec_to_now( + erlang:system_time(microsecond) - (Seconds * 1000000))), + case ejabberd_sql:sql_query_t( + ?SQL("select @(itemid)s from pubsub_item where nodeid=%(Nidx)d " + "and creation < %(ExpT)s")) of + {selected, RItems} -> + ItemIds = [ItemId || {ItemId} <- RItems], + del_items(Nidx, ItemIds), + {result, ItemIds}; + _ -> + {result, []} + end. + delete_item(Nidx, Publisher, PublishModel, ItemId) -> SubKey = jid:tolower(Publisher), GenKey = jid:remove_resource(SubKey), diff --git a/src/node_pep.erl b/src/node_pep.erl index 44388ca31..a7132a691 100644 --- a/src/node_pep.erl +++ b/src/node_pep.erl @@ -36,7 +36,7 @@ create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/7, delete_item/4, - remove_extra_items/2, remove_extra_items/3, + remove_extra_items/2, remove_extra_items/3, remove_expired_items/2, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -142,6 +142,9 @@ remove_extra_items(Nidx, MaxItems) -> remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat:remove_extra_items(Nidx, MaxItems, ItemIds). +remove_expired_items(Nidx, ItemIds) -> + node_flat:remove_expired_items(Nidx, ItemIds). + delete_item(Nidx, Publisher, PublishModel, ItemId) -> node_flat:delete_item(Nidx, Publisher, PublishModel, ItemId). diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index c0cf2b166..7a9d92bcc 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -38,7 +38,7 @@ create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/7, delete_item/4, - remove_extra_items/2, remove_extra_items/3, + remove_extra_items/2, remove_extra_items/3, remove_expired_items/2, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, @@ -99,6 +99,9 @@ remove_extra_items(Nidx, MaxItems) -> remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat_sql:remove_extra_items(Nidx, MaxItems, ItemIds). +remove_expired_items(Nidx, ItemIds) -> + node_flat_sql:remove_expired_items(Nidx, ItemIds). + delete_item(Nidx, Publisher, PublishModel, ItemId) -> node_flat_sql:delete_item(Nidx, Publisher, PublishModel, ItemId). From 2f1611f9185d3d4ce55fee3cef91b6ded5573976 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 30 Oct 2021 13:45:10 +0200 Subject: [PATCH 069/440] mod_pubsub: Fix get_max_items_node/1 specification Make it explicit that the get_max_items_node/1 function returns ?MAXITEMS if the 'max_items_node' option isn't specified. The function didn't actually fall back to 'undefined' (but to the 'max_items_node' default; i.e., ?MAXITEMS) anyway. This change just clarifies the behavior and adjusts the function specification accordingly. --- src/mod_pubsub.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index a36c6e645..34a95da85 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3579,9 +3579,9 @@ check_opt_range(Opt, Opts, Max) -> Val -> Val =< Max end. --spec get_max_items_node(host()) -> undefined | unlimited | non_neg_integer(). +-spec get_max_items_node(host()) -> unlimited | non_neg_integer(). get_max_items_node(Host) -> - config(Host, max_items_node, undefined). + config(Host, max_items_node, ?MAXITEMS). -spec get_max_item_expire_node(host()) -> infinity | non_neg_integer(). get_max_item_expire_node(Host) -> From 65a900668cc7da973081c718fb9170eeb7f22a06 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 31 Oct 2021 21:32:45 +0100 Subject: [PATCH 070/440] node_pep: Fix remove_expired_items/2 argument name --- src/node_pep.erl | 4 ++-- src/node_pep_sql.erl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/node_pep.erl b/src/node_pep.erl index a7132a691..a30f8cb91 100644 --- a/src/node_pep.erl +++ b/src/node_pep.erl @@ -142,8 +142,8 @@ remove_extra_items(Nidx, MaxItems) -> remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat:remove_extra_items(Nidx, MaxItems, ItemIds). -remove_expired_items(Nidx, ItemIds) -> - node_flat:remove_expired_items(Nidx, ItemIds). +remove_expired_items(Nidx, Seconds) -> + node_flat:remove_expired_items(Nidx, Seconds). delete_item(Nidx, Publisher, PublishModel, ItemId) -> node_flat:delete_item(Nidx, Publisher, PublishModel, ItemId). diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index 7a9d92bcc..3bb66bc4c 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -99,8 +99,8 @@ remove_extra_items(Nidx, MaxItems) -> remove_extra_items(Nidx, MaxItems, ItemIds) -> node_flat_sql:remove_extra_items(Nidx, MaxItems, ItemIds). -remove_expired_items(Nidx, ItemIds) -> - node_flat_sql:remove_expired_items(Nidx, ItemIds). +remove_expired_items(Nidx, Seconds) -> + node_flat_sql:remove_expired_items(Nidx, Seconds). delete_item(Nidx, Publisher, PublishModel, ItemId) -> node_flat_sql:delete_item(Nidx, Publisher, PublishModel, ItemId). From 13cbd7c35daaefd33c5e5efb47a015df6d20f945 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 31 Oct 2021 21:38:49 +0100 Subject: [PATCH 071/440] mod_pubsub: Remove unused check_opt_range/3 clause --- src/mod_pubsub.erl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 34a95da85..13b44b3ec 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3568,9 +3568,7 @@ decode_get_pending(#xdata{fields = Fs}, Lang) -> end. -spec check_opt_range(atom(), [proplists:property()], - non_neg_integer() | unlimited | undefined) -> boolean(). -check_opt_range(_Opt, _Opts, undefined) -> - true; + non_neg_integer() | unlimited) -> boolean(). check_opt_range(_Opt, _Opts, unlimited) -> true; check_opt_range(Opt, Opts, Max) -> From c4f6c9dfe765e017c5f2d83c8ab6311c97304250 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 31 Oct 2021 21:59:00 +0100 Subject: [PATCH 072/440] mod_muc_room.hrl: Work around old Dialyzer bug On Erlang/OTP versions older than 21, Dialyzer stumbles over non-empty map type specifications for record fields (OTP-15098). --- include/mod_muc_room.hrl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index a98833662..cc00f73c8 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -125,7 +125,7 @@ history = #lqueue{} :: lqueue(), subject = [] :: [text()], subject_author = <<"">> :: binary(), - hats_users = #{} :: #{ljid() => #{binary() => binary()}}, + hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}}, just_created = erlang:system_time(microsecond) :: true | integer(), activity = treap:empty() :: treap:treap(), room_shaper = none :: ejabberd_shaper:shaper(), From 6e3df8e80bffda97a24c76f75377f2ed5eea648e Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 2 Nov 2021 12:34:19 +0100 Subject: [PATCH 073/440] Update 'stun' dependency The new 'stun' release should improve UDP performance quite a bit. --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 77d017c99..f0d916e81 100644 --- a/rebar.config +++ b/rebar.config @@ -58,7 +58,7 @@ {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, - {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.44"}}}}, + {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.45"}}}}, {xmpp, ".*", {git, "https://github.com/processone/xmpp", "a85dc699ff02471ecad08d85e3bed87c57c48aba"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. From 684ef60ec3e7bf590c67a15b8c9d8fd7833c4fc9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 5 Nov 2021 11:11:29 +0100 Subject: [PATCH 074/440] Annotate support for XEP-0317: Hats, since commit 5d0e599f1 --- src/mod_muc_room.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 3f2c655df..a94b7be07 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -27,6 +27,8 @@ -author('alexey@process-one.net'). +-protocol({xep, 317, '0.1'}). + -behaviour(p1_fsm). %% External exports From b6a2eeebebdfb7b91e98d6062f96b87b5d6cce9a Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 5 Nov 2021 13:45:20 +0100 Subject: [PATCH 075/440] Mention "help" as an available ejabberdctl command --- src/ejabberd_ctl.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 04e383d53..354e5ba2f 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -525,6 +525,7 @@ print_usage(Version) -> print_usage(HelpMode, MaxC, ShCode, Version) -> AllCommands = [ + {"help", ["[arguments]"], "Get help"}, {"status", [], "Get ejabberd status"}, {"stop", [], "Stop ejabberd"}, {"restart", [], "Restart ejabberd"}, From 4e014d23bd174707a5a89e244cef9a9f4c9bac91 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 5 Nov 2021 13:24:36 +0100 Subject: [PATCH 076/440] Improve documentation of some commands --- src/ejabberd_admin.erl | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 0174cd7ff..14305e84b 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -120,7 +120,10 @@ get_commands_spec() -> module = init, function = restart, args = [], result = {res, rescode}}, #ejabberd_commands{name = reopen_log, tags = [logs], - desc = "Reopen the log files", + desc = "Reopen the log files after being renamed", + longdesc = "This can be useful when an external tool is " + "used for log rotation. See " + "https://docs.ejabberd.im/admin/guide/troubleshooting/#log-files", policy = admin, module = ?MODULE, function = reopen_log, args = [], result = {res, rescode}}, @@ -345,31 +348,41 @@ get_commands_spec() -> {oldbackup, string}, {newbackup, string}], result = {res, restuple}}, #ejabberd_commands{name = backup, tags = [mnesia], - desc = "Store the database to backup file", + desc = "Backup the Mnesia database to a binary file", module = ?MODULE, function = backup_mnesia, args_desc = ["Full path for the destination backup file"], args_example = ["/var/lib/ejabberd/database.backup"], args = [{file, string}], result = {res, restuple}}, #ejabberd_commands{name = restore, tags = [mnesia], - desc = "Restore the database from backup file", + desc = "Restore the Mnesia database from a binary backup file", + longdesc = "This restores immediately from a " + "binary backup file the internal Mnesia " + "database. This will consume a lot of memory if " + "you have a large database, you may prefer " + "'install_fallback'.", module = ?MODULE, function = restore_mnesia, args_desc = ["Full path to the backup file"], args_example = ["/var/lib/ejabberd/database.backup"], args = [{file, string}], result = {res, restuple}}, #ejabberd_commands{name = dump, tags = [mnesia], - desc = "Dump the database to a text file", + desc = "Dump the Mnesia database to a text file", module = ?MODULE, function = dump_mnesia, args_desc = ["Full path for the text file"], args_example = ["/var/lib/ejabberd/database.txt"], args = [{file, string}], result = {res, restuple}}, #ejabberd_commands{name = dump_table, tags = [mnesia], - desc = "Dump a table to a text file", + desc = "Dump a Mnesia table to a text file", module = ?MODULE, function = dump_table, args_desc = ["Full path for the text file", "Table name"], args_example = ["/var/lib/ejabberd/table-muc-registered.txt", "muc_registered"], args = [{file, string}, {table, string}], result = {res, restuple}}, #ejabberd_commands{name = load, tags = [mnesia], - desc = "Restore the database from a text file", + desc = "Restore Mnesia database from a text dump file", + longdesc = "Restore immediately. This is not " + "recommended for big databases, as it will " + "consume much time, memory and processor. In " + "that case it's preferable to use 'backup' and " + "'install_fallback'.", module = ?MODULE, function = load_mnesia, args_desc = ["Full path to the text file"], args_example = ["/var/lib/ejabberd/database.txt"], @@ -385,7 +398,14 @@ get_commands_spec() -> args_example = ["roster"], args = [{table, string}], result = {res, string}}, #ejabberd_commands{name = install_fallback, tags = [mnesia], - desc = "Install the database from a fallback file", + desc = "Install Mnesia database from a binary backup file", + longdesc = "The binary backup file is " + "installed as fallback: it will be used to " + "restore the database at the next ejabberd " + "start. This means that, after running this " + "command, you have to restart ejabberd. This " + "command requires less memory than + 'restore'.", module = ?MODULE, function = install_fallback_mnesia, args_desc = ["Full path to the fallback file"], args_example = ["/var/lib/ejabberd/database.fallback"], From 2cdda4cf496a893aca03d1e0b55f63b2a396ddb8 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 6 Nov 2021 23:48:49 +0100 Subject: [PATCH 077/440] mod_caps: Don't forget caps on XEP-0198 resumption Many thanks to Thilo Molitor for spotting the issue and testing the fix. --- src/mod_caps.erl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/mod_caps.erl b/src/mod_caps.erl index c8f548169..bc48dac6f 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -49,7 +49,8 @@ handle_cast/2, terminate/2, code_change/3]). -export([user_send_packet/1, user_receive_packet/1, - c2s_presence_in/2, mod_opt_type/1, mod_options/1, mod_doc/0]). + c2s_presence_in/2, c2s_copy_session/2, + mod_opt_type/1, mod_options/1, mod_doc/0]). -include("logger.hrl"). @@ -274,6 +275,13 @@ c2s_presence_in(C2SState, C2SState#{caps_resources => NewRs} end. +-spec c2s_copy_session(ejabberd_c2s:state(), ejabberd_c2s:state()) + -> ejabberd_c2s:state(). +c2s_copy_session(C2SState, #{caps_resources := Rs}) -> + C2SState#{caps_resources => Rs}; +c2s_copy_session(C2SState, _) -> + C2SState. + -spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}]. depends(_Host, _Opts) -> []. @@ -304,6 +312,8 @@ init([Host|_]) -> caps_stream_features, 75), ejabberd_hooks:add(s2s_in_post_auth_features, Host, ?MODULE, caps_stream_features, 75), + ejabberd_hooks:add(c2s_copy_session, Host, ?MODULE, + c2s_copy_session, 75), ejabberd_hooks:add(disco_local_features, Host, ?MODULE, disco_features, 75), ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, @@ -341,6 +351,8 @@ terminate(_Reason, State) -> ?MODULE, caps_stream_features, 75), ejabberd_hooks:delete(s2s_in_post_auth_features, Host, ?MODULE, caps_stream_features, 75), + ejabberd_hooks:delete(c2s_copy_session, Host, ?MODULE, + c2s_copy_session, 75), ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, disco_features, 75), ejabberd_hooks:delete(disco_local_identity, Host, From 132ebb8f2dbe222db0c4d025c131bb3e525939e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 10 Nov 2021 17:00:42 +0100 Subject: [PATCH 078/440] Fix exception in mucsub {un}subscription events multicast handler While those event are wrapped in mucsub envelope they doesn't contain regular messages that require updating 'to' attribute, so don't process in that same way as events with wrapped message in them. --- src/mod_muc_room.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index a94b7be07..e8b0d1bce 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -5097,7 +5097,7 @@ send_subscriptions_change_notifications(From, Nick, Type, State) -> id = p1_rand:get_string(), sub_els = [Payload1]}]}}]}, ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WJ, Packet1, true); + WJ, Packet1, false); true -> ok end, if WN /= [] -> @@ -5113,7 +5113,7 @@ send_subscriptions_change_notifications(From, Nick, Type, State) -> id = p1_rand:get_string(), sub_els = [Payload2]}]}}]}, ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WN, Packet2, true); + WN, Packet2, false); true -> ok end. From 03817de8273592466af7a71ac351dd1f162cc330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 16 Nov 2021 10:25:03 +0100 Subject: [PATCH 079/440] Make s2s connection table cleanup more robust Using monitors instead of doint that from terminate() makes us immune to s2s handler processes being forcefully killed. --- src/ejabberd_s2s.erl | 77 +++++++++++++++++----------------------- src/ejabberd_s2s_out.erl | 22 ++++-------- 2 files changed, 38 insertions(+), 61 deletions(-) diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 8057c9a35..f3259b75c 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -33,8 +33,8 @@ %% API -export([start_link/0, stop/0, route/1, have_connection/1, - get_connections_pids/1, try_register/1, - remove_connection/2, start_connection/2, start_connection/3, + get_connections_pids/1, + start_connection/2, start_connection/3, dirty_get_connections/0, allow_host/2, incoming_s2s_number/0, outgoing_s2s_number/0, stop_s2s_connections/0, @@ -112,24 +112,6 @@ is_temporarly_blocked(Host) -> end end. --spec remove_connection({binary(), binary()}, pid()) -> ok. -remove_connection({From, To} = FromTo, Pid) -> - case mnesia:dirty_match_object(s2s, #s2s{fromto = FromTo, pid = Pid}) of - [#s2s{pid = Pid}] -> - F = fun() -> - mnesia:delete_object(#s2s{fromto = FromTo, pid = Pid}) - end, - case mnesia:transaction(F) of - {atomic, _} -> ok; - {aborted, Reason} -> - ?ERROR_MSG("Failed to unregister s2s connection ~ts -> ~ts: " - "Mnesia failure: ~p", - [From, To, Reason]) - end; - _ -> - ok - end. - -spec have_connection({binary(), binary()}) -> boolean(). have_connection(FromTo) -> case catch mnesia:dirty_read(s2s, FromTo) of @@ -148,31 +130,6 @@ get_connections_pids(FromTo) -> [] end. --spec try_register({binary(), binary()}) -> boolean(). -try_register({From, To} = FromTo) -> - MaxS2SConnectionsNumber = max_s2s_connections_number(FromTo), - MaxS2SConnectionsNumberPerNode = - max_s2s_connections_number_per_node(FromTo), - F = fun () -> - L = mnesia:read({s2s, FromTo}), - NeededConnections = needed_connections_number(L, - MaxS2SConnectionsNumber, - MaxS2SConnectionsNumberPerNode), - if NeededConnections > 0 -> - mnesia:write(#s2s{fromto = FromTo, pid = self()}), - true; - true -> false - end - end, - case mnesia:transaction(F) of - {atomic, Res} -> Res; - {aborted, Reason} -> - ?ERROR_MSG("Failed to register s2s connection ~ts -> ~ts: " - "Mnesia failure: ~p", - [From, To, Reason]), - false - end. - -spec dirty_get_connections() -> [{binary(), binary()}]. dirty_get_connections() -> mnesia:dirty_all_keys(s2s). @@ -269,6 +226,8 @@ init([]) -> {stop, Reason} end. +handle_call({new_connection, Args}, _From, State) -> + {reply, erlang:apply(fun new_connection_int/7, Args), State}; handle_call(Request, From, State) -> ?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]), {noreply, State}. @@ -289,6 +248,21 @@ handle_info({route, Packet}, State) -> misc:format_exception(2, Class, Reason, StackTrace)]) end, {noreply, State}; +handle_info({'DOWN', _Ref, process, Pid, _Reason}, State) -> + case mnesia:dirty_match_object(s2s, #s2s{pid = Pid, fromto = '_'}) of + [#s2s{pid = Pid, fromto = {From, To}} = Obj] -> + F = fun() -> mnesia:delete_object(Obj) end, + case mnesia:transaction(F) of + {atomic, _} -> ok; + {aborted, Reason} -> + ?ERROR_MSG("Failed to unregister s2s connection for pid ~p (~ts -> ~ts):" + "Mnesia failure: ~p", + [Pid, From, To, Reason]) + end, + {noreply, State}; + _ -> + {noreply, State} + end; handle_info(Info, State) -> ?WARNING_MSG("Unexpected info: ~p", [Info]), {noreply, State}. @@ -458,6 +432,18 @@ open_several_connections(N, MyServer, Server, From, integer(), integer(), [proplists:property()]) -> [pid()]. new_connection(MyServer, Server, From, FromTo, MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode, Opts) -> + case whereis(ejabberd_s2s) == self() of + true -> + new_connection_int(MyServer, Server, From, FromTo, + MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode, Opts); + false -> + gen_server:call(ejabberd_s2s, {new_connection, [MyServer, Server, From, FromTo, + MaxS2SConnectionsNumber, + MaxS2SConnectionsNumberPerNode, Opts]}) + end. + +new_connection_int(MyServer, Server, From, FromTo, + MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode, Opts) -> {ok, Pid} = ejabberd_s2s_out:start(MyServer, Server, Opts), F = fun() -> L = mnesia:read({s2s, FromTo}), @@ -474,6 +460,7 @@ new_connection(MyServer, Server, From, FromTo, case TRes of {atomic, Pid1} -> if Pid1 == Pid -> + erlang:monitor(process, Pid), ejabberd_s2s_out:connect(Pid); true -> ejabberd_s2s_out:stop_async(Pid) diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index d58396533..f057705ed 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -318,7 +318,6 @@ handle_info(Info, #{server_host := ServerHost} = State) -> terminate(Reason, #{server := LServer, remote_server := RServer} = State) -> - ejabberd_s2s:remove_connection({LServer, RServer}, self()), State1 = case Reason of normal -> State; _ -> State#{stop_reason => internal_failure} @@ -351,21 +350,12 @@ bounce_queue(State) -> end, State). -spec bounce_message_queue({binary(), binary()}, state()) -> state(). -bounce_message_queue({LServer, RServer} = FromTo, State) -> - Pids = ejabberd_s2s:get_connections_pids(FromTo), - case lists:member(self(), Pids) of - true -> - ?WARNING_MSG("Outgoing s2s connection ~ts -> ~ts is supposed " - "to be unregistered, but pid ~p still presents " - "in 's2s' table", [LServer, RServer, self()]), - State; - false -> - receive {route, Pkt} -> - State1 = bounce_packet(Pkt, State), - bounce_message_queue(FromTo, State1) - after 0 -> - State - end +bounce_message_queue(FromTo, State) -> + receive {route, Pkt} -> + State1 = bounce_packet(Pkt, State), + bounce_message_queue(FromTo, State1) + after 0 -> + State end. -spec bounce_packet(xmpp_element(), state()) -> state(). From bdd4e52699507cdf80a0ff5959439d256f9f9d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 16 Nov 2021 10:57:15 +0100 Subject: [PATCH 080/440] Make dialyzer happy --- src/ejabberd_s2s.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index f3259b75c..71b3c8e17 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -249,7 +249,7 @@ handle_info({route, Packet}, State) -> end, {noreply, State}; handle_info({'DOWN', _Ref, process, Pid, _Reason}, State) -> - case mnesia:dirty_match_object(s2s, #s2s{pid = Pid, fromto = '_'}) of + case mnesia:dirty_match_object(s2s, {s2s, '_', Pid}) of [#s2s{pid = Pid, fromto = {From, To}} = Obj] -> F = fun() -> mnesia:delete_object(Obj) end, case mnesia:transaction(F) of From 97b8373fd28d821b04eacb8da17586fffabee2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 16 Nov 2021 10:59:53 +0100 Subject: [PATCH 081/440] Better version of dialyzer fix --- src/ejabberd_s2s.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 71b3c8e17..04490071c 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -64,7 +64,7 @@ %% once a server is temporary blocked, it stay blocked for 60 seconds --record(s2s, {fromto :: {binary(), binary()}, +-record(s2s, {fromto :: {binary(), binary()} | '_', pid :: pid()}). -record(state, {}). @@ -249,7 +249,7 @@ handle_info({route, Packet}, State) -> end, {noreply, State}; handle_info({'DOWN', _Ref, process, Pid, _Reason}, State) -> - case mnesia:dirty_match_object(s2s, {s2s, '_', Pid}) of + case mnesia:dirty_match_object(s2s, #s2s{fromto = '_', pid = Pid}) of [#s2s{pid = Pid, fromto = {From, To}} = Obj] -> F = fun() -> mnesia:delete_object(Obj) end, case mnesia:transaction(F) of From 405a5172d5bda5fd40b6a580b87f3fab1ecdd47c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 16 Nov 2021 19:39:59 +0100 Subject: [PATCH 082/440] Improve mod_multicast --- src/mod_multicast.erl | 422 ++++++++++++++---------------------------- 1 file changed, 134 insertions(+), 288 deletions(-) diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl index 161d3a4c4..fa076da70 100644 --- a/src/mod_multicast.erl +++ b/src/mod_multicast.erl @@ -35,7 +35,7 @@ %% API -export([start/2, stop/1, reload/3, - user_send_packet/1]). + user_send_packet/1]). %% gen_server callbacks -export([init/1, handle_info/2, handle_call/3, @@ -51,11 +51,6 @@ response, ts :: integer()}). --record(dest, {jid_string :: binary() | none, - jid_jid :: jid() | undefined, - type :: bcc | cc | noreply | ofrom | replyroom | replyto | to, - address :: address()}). - -type limit_value() :: {default | custom, integer()}. -record(limits, {message :: limit_value(), presence :: limit_value()}). @@ -63,14 +58,6 @@ -record(service_limits, {local :: #limits{}, remote :: #limits{}}). --type routing() :: route_single | {route_multicast, binary(), #service_limits{}}. - --record(group, {server :: binary(), - dests :: [#dest{}], - multicast :: routing() | undefined, - others :: [address()], - addresses :: [address()]}). - -record(state, {lserver :: binary(), lservice :: binary(), access :: atom(), @@ -117,7 +104,7 @@ reload(LServerS, NewOpts, OldOpts) -> user_send_packet({#presence{} = Packet, C2SState} = Acc) -> case xmpp:get_subtag(Packet, #addresses{}) of #addresses{list = Addresses} -> - {ToDeliver, _Delivereds} = split_addresses_todeliver(Addresses), + {CC, BCC, _Invalid, _Delivered} = partition_addresses(Addresses), NewState = lists:foldl( fun(Address, St) -> @@ -138,7 +125,7 @@ user_send_packet({#presence{} = Packet, C2SState} = Acc) -> undefined -> St end - end, C2SState, ToDeliver), + end, C2SState, CC ++ BCC), {Packet, NewState}; false -> Acc @@ -308,19 +295,10 @@ iq_vcard(Lang, State) -> %%%------------------------- -spec route_trusted(binary(), binary(), jid(), [jid()], stanza()) -> 'ok'. -route_trusted(LServiceS, LServerS, FromJID, - Destinations, Packet) -> - Packet_stripped = Packet, - Delivereds = [], - Dests2 = lists:map( - fun(D) -> - #dest{jid_string = jid:encode(D), - jid_jid = D, type = bcc, - address = #address{type = bcc, jid = D}} - end, Destinations), - Groups = group_dests(Dests2), - route_common(LServerS, LServiceS, FromJID, Groups, - Delivereds, Packet_stripped). +route_trusted(LServiceS, LServerS, FromJID, Destinations, Packet) -> + Addresses = [#address{type = bcc, jid = D} || D <- Destinations], + Groups = group_by_destinations(Addresses, #{}), + route_grouped(LServerS, LServiceS, FromJID, Groups, [], Packet). -spec route_untrusted(binary(), binary(), atom(), #service_limits{}, stanza()) -> 'ok'. route_untrusted(LServiceS, LServerS, Access, SLimits, Packet) -> @@ -356,50 +334,88 @@ route_untrusted(LServiceS, LServerS, Access, SLimits, Packet) -> route_untrusted2(LServiceS, LServerS, Access, SLimits, Packet) -> FromJID = xmpp:get_from(Packet), ok = check_access(LServerS, Access, FromJID), - {ok, Packet_stripped, Addresses} = strip_addresses_element(Packet), - {To_deliver, Delivereds} = split_addresses_todeliver(Addresses), - Dests = convert_dest_record(To_deliver), - {Dests2, Not_jids} = split_dests_jid(Dests), - report_not_jid(FromJID, Packet, Not_jids), - ok = check_limit_dests(SLimits, FromJID, Packet, Dests2), - Groups = group_dests(Dests2), + {ok, PacketStripped, Addresses} = strip_addresses_element(Packet), + {CC, BCC, NotJids, Rest} = partition_addresses(Addresses), + report_not_jid(FromJID, Packet, NotJids), + ok = check_limit_dests(SLimits, FromJID, Packet, length(CC) + length(BCC)), + Groups0 = group_by_destinations(CC, #{}), + Groups = group_by_destinations(BCC, Groups0), ok = check_relay(FromJID#jid.server, LServerS, Groups), - route_common(LServerS, LServiceS, FromJID, Groups, - Delivereds, Packet_stripped). + route_grouped(LServerS, LServiceS, FromJID, Groups, Rest, PacketStripped). --spec route_common(binary(), binary(), jid(), [#group{}], - [address()], stanza()) -> 'ok'. -route_common(LServerS, LServiceS, FromJID, Groups, - Delivereds, Packet_stripped) -> - Groups2 = look_cached_servers(LServerS, LServiceS, Groups), - Groups3 = build_others_xml(Groups2), - Groups4 = add_addresses(Delivereds, Groups3), - AGroups = decide_action_groups(Groups4), - act_groups(FromJID, Packet_stripped, LServiceS, - AGroups). +-spec mark_as_delivered([address()]) -> [address()]. +mark_as_delivered(Addresses) -> + [A#address{delivered = true} || A <- Addresses]. --spec act_groups(jid(), stanza(), binary(), [{routing(), #group{}}]) -> 'ok'. -act_groups(FromJID, Packet_stripped, LServiceS, AGroups) -> +-spec route_individual(jid(), [address()], [address()], [address()], stanza()) -> ok. +route_individual(From, CC, BCC, Other, Packet) -> + CCDelivered = mark_as_delivered(CC), + Addresses = CCDelivered ++ Other, + PacketWithAddresses = xmpp:append_subtags(Packet, [#addresses{list = Addresses}]), lists:foreach( - fun(AGroup) -> - perform(FromJID, Packet_stripped, LServiceS, - AGroup) - end, AGroups). - --spec perform(jid(), stanza(), binary(), - {routing(), #group{}}) -> 'ok'. -perform(From, Packet, _, - {route_single, Group}) -> + fun(#address{jid = To}) -> + ejabberd_router:route(xmpp:set_from_to(PacketWithAddresses, From, To)) + end, CC), lists:foreach( - fun(ToUser) -> - Group_others = strip_other_bcc(ToUser, Group#group.others), - route_packet(From, ToUser, Packet, - Group_others, Group#group.addresses) - end, Group#group.dests); -perform(From, Packet, _, - {{route_multicast, JID, RLimits}, Group}) -> - route_packet_multicast(From, JID, Packet, - Group#group.dests, Group#group.addresses, RLimits). + fun(#address{jid = To} = Address) -> + Packet2 = case Addresses of + [] -> + Packet; + _ -> + xmpp:append_subtags(Packet, [#addresses{list = [Address | Addresses]}]) + end, + ejabberd_router:route(xmpp:set_from_to(Packet2, From, To)) + end, BCC). + +-spec route_chunk(jid(), jid(), stanza(), [address()]) -> ok. +route_chunk(From, To, Packet, Addresses) -> + PacketWithAddresses = xmpp:append_subtags(Packet, [#addresses{list = Addresses}]), + ejabberd_router:route(xmpp:set_from_to(PacketWithAddresses, From, To)). + +-spec route_in_chunks(jid(), jid(), stanza(), integer(), [address()], [address()], [address()]) -> ok. +route_in_chunks(_From, _To, _Packet, _Limit, [], [], _) -> + ok; +route_in_chunks(From, To, Packet, Limit, CC, BCC, RestOfAddresses) when length(CC) > Limit -> + {Chunk, Rest} = lists:split(Limit, CC), + route_chunk(From, To, Packet, Chunk ++ RestOfAddresses), + route_in_chunks(From, To, Packet, Limit, Rest, BCC, RestOfAddresses); +route_in_chunks(From, To, Packet, Limit, [], BCC, RestOfAddresses) when length(BCC) > Limit -> + {Chunk, Rest} = lists:split(Limit, BCC), + route_chunk(From, To, Packet, Chunk ++ RestOfAddresses), + route_in_chunks(From, To, Packet, Limit, [], Rest, RestOfAddresses); +route_in_chunks(From, To, Packet, Limit, CC, BCC, RestOfAddresses) when length(BCC) + length(CC) > Limit -> + {Chunk, Rest} = lists:split(Limit - length(CC), BCC), + route_chunk(From, To, Packet, CC ++ Chunk ++ RestOfAddresses), + route_in_chunks(From, To, Packet, Limit, [], Rest, RestOfAddresses); +route_in_chunks(From, To, Packet, _Limit, CC, BCC, RestOfAddresses) -> + route_chunk(From, To, Packet, CC ++ BCC ++ RestOfAddresses). + +-spec route_multicast(jid(), jid(), [address()], [address()], [address()], stanza(), #limits{}) -> ok. +route_multicast(From, To, CC, BCC, RestOfAddresses, Packet, Limits) -> + {_Type, Limit} = get_limit_number(element(1, Packet), + Limits), + route_in_chunks(From, To, Packet, Limit, CC, BCC, RestOfAddresses). + +-spec route_grouped(binary(), binary(), jid(), #{}, [address()], stanza()) -> ok. +route_grouped(LServer, LService, From, Groups, RestOfAddresses, Packet) -> + maps:fold( + fun(Server, {CC, BCC}, _) -> + OtherCC = maps:fold( + fun(Server2, _, Res) when Server2 == Server -> + Res; + (_, {CC2, _}, Res) -> + mark_as_delivered(CC2) ++ Res + end, [], Groups), + case search_server_on_cache(Server, + LServer, LService, + {?MAXTIME_CACHE_POSITIVE, + ?MAXTIME_CACHE_NEGATIVE}) of + route_single -> + route_individual(From, CC, BCC, OtherCC ++ RestOfAddresses, Packet); + {route_multicast, Service, Limits} -> + route_multicast(From, Service, CC, BCC, OtherCC ++ RestOfAddresses, Packet, Limits) + end + end, ok, Groups). %%%------------------------- %%% Check access permission @@ -425,245 +441,89 @@ strip_addresses_element(Packet) -> throw(eadsele) end. -%%%------------------------- -%%% Strip third-party bcc 'addresses' -%%%------------------------- - -strip_other_bcc(#dest{jid_jid = ToUserJid}, Group_others) -> - lists:filter( - fun(#address{jid = JID, type = Type}) -> - case {JID, Type} of - {ToUserJid, bcc} -> true; - {_, bcc} -> false; - _ -> true - end - end, - Group_others). - %%%------------------------- %%% Split Addresses %%%------------------------- --spec split_addresses_todeliver([address()]) -> {[address()], [address()]}. -split_addresses_todeliver(Addresses) -> - lists:partition( - fun(#address{delivered = true}) -> - false; - (#address{type = Type}) -> - case Type of - to -> true; - cc -> true; - bcc -> true; - _ -> false - end - end, Addresses). +partition_addresses(Addresses) -> + lists:foldl( + fun(#address{delivered = true} = A, {C, B, I, D}) -> + {C, B, I, [A | D]}; + (#address{type = T, jid = undefined} = A, {C, B, I, D}) + when T == to; T == cc; T == bcc -> + {C, B, [A | I], D}; + (#address{type = T} = A, {C, B, I, D}) + when T == to; T == cc -> + {[A | C], B, I, D}; + (#address{type = bcc} = A, {C, B, I, D}) -> + {C, [A | B], I, D}; + (A, {C, B, I, D}) -> + {C, B, I, [A | D]} + end, {[], [], [], []}, Addresses). %%%------------------------- %%% Check does not exceed limit of destinations %%%------------------------- --spec check_limit_dests(#service_limits{}, jid(), stanza(), [address()]) -> ok. -check_limit_dests(SLimits, FromJID, Packet, - Addresses) -> +-spec check_limit_dests(#service_limits{}, jid(), stanza(), integer()) -> ok. +check_limit_dests(SLimits, FromJID, Packet, NumOfAddresses) -> SenderT = sender_type(FromJID), Limits = get_slimit_group(SenderT, SLimits), - Type_of_stanza = type_of_stanza(Packet), - {_Type, Limit_number} = get_limit_number(Type_of_stanza, - Limits), - case length(Addresses) > Limit_number of + StanzaType = type_of_stanza(Packet), + {_Type, Limit} = get_limit_number(StanzaType, + Limits), + case NumOfAddresses > Limit of false -> ok; true -> throw(etoorec) end. -%%%------------------------- -%%% Convert Destination XML to record -%%%------------------------- --spec convert_dest_record([address()]) -> [#dest{}]. -convert_dest_record(Addrs) -> - lists:map( - fun(#address{jid = undefined, type = Type} = Addr) -> - #dest{jid_string = none, - type = Type, address = Addr}; - (#address{jid = JID, type = Type} = Addr) -> - #dest{jid_string = jid:encode(JID), jid_jid = JID, - type = Type, address = Addr} - end, Addrs). - -%%%------------------------- -%%% Split destinations by existence of JID -%%% and send error messages for other dests -%%%------------------------- - --spec split_dests_jid([#dest{}]) -> {[#dest{}], [#dest{}]}. -split_dests_jid(Dests) -> - lists:partition(fun (Dest) -> - case Dest#dest.jid_string of - none -> false; - _ -> true - end - end, - Dests). - --spec report_not_jid(jid(), stanza(), [#dest{}]) -> any(). -report_not_jid(From, Packet, Dests) -> - Dests2 = [fxml:element_to_binary(xmpp:encode(Dest#dest.address)) - || Dest <- Dests], - [route_error( - xmpp:set_from_to(Packet, From, From), jid_malformed, - str:format(?T("This service can not process the address: ~s"), [D])) - || D <- Dests2]. +-spec report_not_jid(jid(), stanza(), [address()]) -> any(). +report_not_jid(From, Packet, Addresses) -> + lists:foreach( + fun(Address) -> + route_error( + xmpp:set_from_to(Packet, From, From), jid_malformed, + str:format(?T("This service can not process the address: ~s"), + [fxml:element_to_binary(xmpp:encode(Address))])) + end, Addresses). %%%------------------------- %%% Group destinations by their servers %%%------------------------- --spec group_dests([#dest{}]) -> [#group{}]. -group_dests(Dests) -> - D = lists:foldl(fun (Dest, Dict) -> - ServerS = (Dest#dest.jid_jid)#jid.server, - dict:append(ServerS, Dest, Dict) - end, - dict:new(), Dests), - Keys = dict:fetch_keys(D), - [#group{server = Key, dests = dict:fetch(Key, D), - addresses = [], others = []} - || Key <- Keys]. - -%%%------------------------- -%%% Look for cached responses -%%%------------------------- - -look_cached_servers(LServerS, LServiceS, Groups) -> - [look_cached(LServerS, LServiceS, Group) || Group <- Groups]. - -look_cached(LServerS, LServiceS, G) -> - Maxtime_positive = (?MAXTIME_CACHE_POSITIVE), - Maxtime_negative = (?MAXTIME_CACHE_NEGATIVE), - Cached_response = search_server_on_cache(G#group.server, - LServerS, LServiceS, - {Maxtime_positive, - Maxtime_negative}), - G#group{multicast = Cached_response}. - -%%%------------------------- -%%% Build delivered XML element -%%%------------------------- - -build_others_xml(Groups) -> - [Group#group{others = - build_other_xml(Group#group.dests)} - || Group <- Groups]. - -build_other_xml(Dests) -> - lists:foldl(fun (Dest, R) -> - XML = Dest#dest.address, - case Dest#dest.type of - to -> [add_delivered(XML) | R]; - cc -> [add_delivered(XML) | R]; - _ -> [XML | R] - end - end, - [], Dests). - --spec add_delivered(address()) -> address(). -add_delivered(Addr) -> - Addr#address{delivered = true}. - -%%%------------------------- -%%% Add preliminary packets -%%%------------------------- - -add_addresses(Delivereds, Groups) -> - Ps = [Group#group.others || Group <- Groups], - add_addresses2(Delivereds, Groups, [], [], Ps). - -add_addresses2(_, [], Res, _, []) -> Res; -add_addresses2(Delivereds, [Group | Groups], Res, Pa, - [Pi | Pz]) -> - Addresses = lists:append([Delivereds] ++ Pa ++ Pz), - Group2 = Group#group{addresses = Addresses}, - add_addresses2(Delivereds, Groups, [Group2 | Res], - [Pi | Pa], Pz). - -%%%------------------------- -%%% Decide action groups -%%%------------------------- - --spec decide_action_groups([#group{}]) -> [{routing(), #group{}}]. -decide_action_groups(Groups) -> - [{Group#group.multicast, Group} - || Group <- Groups]. +group_by_destinations(Addrs, Map) -> + lists:foldl( + fun + (#address{type = Type, jid = #jid{lserver = Server}} = Addr, Map2) when Type == to; Type == cc -> + maps:update_with(Server, + fun({CC, BCC}) -> + {[Addr | CC], BCC} + end, {[Addr], []}, Map2); + (#address{type = bcc, jid = #jid{lserver = Server}} = Addr, Map2) -> + maps:update_with(Server, + fun({CC, BCC}) -> + {CC, [Addr | BCC]} + end, {[], [Addr]}, Map2) + end, Map, Addrs). %%%------------------------- %%% Route packet %%%------------------------- --spec route_packet(jid(), #dest{}, stanza(), [addresses()], [addresses()]) -> 'ok'. -route_packet(From, ToDest, Packet, Others, Addresses) -> - Dests = case ToDest#dest.type of - bcc -> []; - _ -> [ToDest] - end, - route_packet2(From, ToDest#dest.jid_string, Dests, - Packet, {Others, Addresses}). - --spec route_packet_multicast(jid(), binary(), stanza(), [#dest{}], [address()], #limits{}) -> 'ok'. -route_packet_multicast(From, ToS, Packet, Dests, - Addresses, Limits) -> - Type_of_stanza = type_of_stanza(Packet), - {_Type, Limit_number} = get_limit_number(Type_of_stanza, - Limits), - Fragmented_dests = fragment_dests(Dests, Limit_number), - lists:foreach(fun(DFragment) -> - route_packet2(From, ToS, DFragment, Packet, - Addresses) - end, Fragmented_dests). - --spec route_packet2(jid(), binary(), [#dest{}], stanza(), {[address()], [address()]} | [address()]) -> 'ok'. -route_packet2(From, ToS, Dests, Packet, Addresses) -> - Els = case append_dests(Dests, Addresses) of - [] -> - xmpp:get_els(Packet); - ACs -> - [#addresses{list = ACs}|xmpp:get_els(Packet)] - end, - Packet2 = xmpp:set_els(Packet, Els), - ToJID = stj(ToS), - ejabberd_router:route(xmpp:set_from_to(Packet2, From, ToJID)). - --spec append_dests([#dest{}], {[address()], [address()]} | [address()]) -> [address()]. -append_dests(_Dests, {Others, Addresses}) -> - Addresses ++ Others; -append_dests([], Addresses) -> Addresses; -append_dests([Dest | Dests], Addresses) -> - append_dests(Dests, [Dest#dest.address | Addresses]). - %%%------------------------- %%% Check relay %%%------------------------- --spec check_relay(binary(), binary(), [#group{}]) -> ok. +-spec check_relay(binary(), binary(), #{}) -> ok. check_relay(RS, LS, Gs) -> - case check_relay_required(RS, LS, Gs) of - false -> ok; - true -> throw(edrelay) + case lists:suffix(str:tokens(LS, <<".">>), + str:tokens(RS, <<".">>)) orelse + (maps:is_key(LS, Gs) andalso maps:size(Gs) == 1) of + true -> ok; + _ -> throw(edrelay) end. --spec check_relay_required(binary(), binary(), [#group{}]) -> boolean(). -check_relay_required(RServer, LServerS, Groups) -> - case lists:suffix(str:tokens(LServerS, <<".">>), - str:tokens(RServer, <<".">>)) of - true -> false; - false -> check_relay_required(LServerS, Groups) - end. - --spec check_relay_required(binary(), [#group{}]) -> boolean(). -check_relay_required(LServerS, Groups) -> - lists:any(fun (Group) -> Group#group.server /= LServerS - end, - Groups). - %%%------------------------- %%% Check protocol support: Send request %%%------------------------- @@ -1060,20 +920,6 @@ get_slimit_group(local, SLimits) -> get_slimit_group(remote, SLimits) -> SLimits#service_limits.remote. -fragment_dests(Dests, Limit_number) -> - {R, _} = lists:foldl(fun (Dest, {Res, Count}) -> - case Count of - Limit_number -> - Head2 = [Dest], {[Head2 | Res], 0}; - _ -> - [Head | Tail] = Res, - Head2 = [Dest | Head], - {[Head2 | Tail], Count + 1} - end - end, - {[[]], 0}, Dests), - R. - %%%------------------------- %%% Limits: XEP-0128 Service Discovery Extensions %%%------------------------- From a590e81922c2d9bd10e9bc3ceb0bab0f32cbb82c Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 17 Nov 2021 12:39:09 +0100 Subject: [PATCH 083/440] Add DIAGNOSTIC to rebar3 coveralls, this fails since some days ago --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7baa5790f..ac384e375 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -173,7 +173,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - rebar3 as test coveralls send + DIAGNOSTIC=1 rebar3 as test coveralls send curl -v -k https://coveralls.io/webhook \ --header "Content-Type: application/json" \ --data '{"repo_name":"$GITHUB_REPOSITORY", From 689749a5630c417fd52345394a7e8cd3c7ed1168 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 17 Nov 2021 13:22:34 +0100 Subject: [PATCH 084/440] Update Jose to 1.11.1 (the last in hex.pm correctly versioned) --- mix.exs | 2 +- rebar.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 8debcd6a1..0f991a499 100644 --- a/mix.exs +++ b/mix.exs @@ -113,7 +113,7 @@ defmodule Ejabberd.MixProject do {:fast_yaml, "~> 1.0"}, {:idna, "~> 6.0"}, {:jiffy, "~> 1.0.5"}, - {:jose, "~> 1.8"}, + {:jose, "~> 1.11.1"}, {:lager, "~> 3.9.1"}, {:mqtree, "~> 1.0"}, {:p1_acme, "~> 1.0"}, diff --git a/rebar.config b/rebar.config index f0d916e81..5597b6c1e 100644 --- a/rebar.config +++ b/rebar.config @@ -38,7 +38,7 @@ {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.32"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.0.5"}}}, - {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.9.0"}}}, + {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}, {if_var_true, lua, {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "v0.3"}}}}, From 15d3ebb8425cc545810e882e0fe8cbf8cc276fc3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 17 Nov 2021 16:50:14 +0100 Subject: [PATCH 085/440] Fix Dialyzer warning, old passwd tuple don't match current tuple definition --- src/ejabberd_auth_sql.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl index e51bf276c..50cc1902e 100644 --- a/src/ejabberd_auth_sql.erl +++ b/src/ejabberd_auth_sql.erl @@ -299,8 +299,8 @@ export(_Server) -> ["username=%(LUser)s", "server_host=%(LServer)s", "password=%(Password)s"])]; - (Host, #passwd{us = {LUser, LServer}, - password = {scram, StoredKey1, ServerKey, Salt, IterationCount}}) + (Host, {passwd, {LUser, LServer}, + {scram, StoredKey1, ServerKey, Salt, IterationCount}}) when LServer == Host -> Hash = sha, StoredKey = scram_hash_encode(Hash, StoredKey1), From 89ad8a55027bfbe5482f4b580cb5e8d74cca8b2f Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Tue, 23 Nov 2021 08:43:54 +0300 Subject: [PATCH 086/440] Add mod_conversejs --- src/mod_conversejs.erl | 148 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/mod_conversejs.erl diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl new file mode 100644 index 000000000..e8aede2c7 --- /dev/null +++ b/src/mod_conversejs.erl @@ -0,0 +1,148 @@ +%%%---------------------------------------------------------------------- +%%% File : mod_conversejs.erl +%%% Author : Alexey Shchepin +%%% Purpose : Implements REST API for ejabberd using JSON data +%%% Created : 8 Nov 2021 by Alexey Shchepin +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%---------------------------------------------------------------------- + +-module(mod_conversejs). + +-author('alexey@process-one.net'). + +-behaviour(gen_mod). + +-export([start/2, stop/1, reload/3, process/2, depends/2, + mod_opt_type/1, mod_options/1, mod_doc/0]). + +-include_lib("xmpp/include/xmpp.hrl"). +-include("logger.hrl"). +-include("ejabberd_http.hrl"). +-include("translate.hrl"). +-include("ejabberd_web_admin.hrl"). + +start(_Host, _Opts) -> + ok. + +stop(_Host) -> + ok. + +reload(_Host, _NewOpts, _OldOpts) -> + ok. + +depends(_Host, _Opts) -> + []. + +process([], #request{method = 'GET'}) -> + Host = ejabberd_config:get_myname(), + Domain = gen_mod:get_module_opt(Host, ?MODULE, default_domain), + Script = gen_mod:get_module_opt(Host, ?MODULE, conversejs_script), + CSS = gen_mod:get_module_opt(Host, ?MODULE, conversejs_css), + Init = [{<<"discover_connection_methods">>, false}, + {<<"jid">>, Domain}, + {<<"default_domain">>, Domain}, + {<<"domain_placeholder">>, Domain}, + {<<"view_mode">>, <<"fullscreen">>}], + Init2 = + case gen_mod:get_module_opt(Host, ?MODULE, websocket_url) of + undefined -> Init; + WSURL -> [{<<"websocket_url">>, WSURL} | Init] + end, + Init3 = + case gen_mod:get_module_opt(Host, ?MODULE, bosh_service_url) of + undefined -> Init2; + BoshURL -> [{<<"bosh_service_url">>, BoshURL} | Init2] + end, + {200, [html], + [<<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>, + <<"">>]}; +process(_, _) -> + ejabberd_web:error(not_found). + +mod_opt_type(bosh_service_url) -> + econf:either(undefined, econf:binary()); +mod_opt_type(websocket_url) -> + econf:either(undefined, econf:binary()); +mod_opt_type(conversejs_script) -> + econf:binary(); +mod_opt_type(conversejs_css) -> + econf:binary(); +mod_opt_type(default_domain) -> + econf:binary(). + +mod_options(_) -> + [{bosh_service_url, undefined}, + {websocket_url, undefined}, + {default_domain, ejabberd_config:get_myname()}, + {conversejs_script, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.js">>}, + {conversejs_css, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.css">>}]. + +mod_doc() -> + #{desc => + [?T("This module serves a simple Converse.js page."), "", + ?T("To use this module, in addition to adding it to the 'modules' " + "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " + "http://../listen-options/#request-handlers[request_handlers].")], + example => + ["listen:", + " -", + " port: 5280", + " module: ejabberd_http", + " request_handlers:", + " \"/websocket\": ejabberd_http_ws" + " \"/conversejs\": mod_conversejs", + "", + "modules:", + " mod_conversejs:", + " websocket_url: \"ws://example.org:5280/websocket\""], + opts => + [{websocket_url, + #{value => ?T("WebsocketURL"), + desc => + ?T("A websocket URL to which Converse.js can connect to.")}}, + {bosh_service_url, + #{value => ?T("BoshURL"), + desc => + ?T("BOSH service URL to which Converse.js can connect to.")}}, + {default_domain, + #{value => ?T("Domain"), + desc => + ?T("Specify a domain to act as the default for user JIDs.")}}, + {conversejs_script, + #{value => ?T("URL"), + desc => + ?T("Converse.js main script URL.")}}, + {conversejs_css, + #{value => ?T("URL"), + desc => + ?T("Converse.js CSS URL.")}}] + }. From 75b133d968be3e4914a86bd0db514fe2a62aea21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 29 Nov 2021 15:20:10 +0100 Subject: [PATCH 087/440] Update deps --- rebar.config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rebar.config b/rebar.config index 5597b6c1e..3490d976c 100644 --- a/rebar.config +++ b/rebar.config @@ -30,11 +30,11 @@ {if_var_true, redis, {eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}}, {if_var_true, sip, - {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.43"}}}}, + {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.44"}}}}, {if_var_true, zlib, {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.10"}}}}, {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.13"}}}, - {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.47"}}}, + {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.48"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.32"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.0.5"}}}, @@ -43,12 +43,12 @@ {if_var_true, lua, {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "v0.3"}}}}, {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.14"}}}, - {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.13"}}}, + {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.16"}}}, {if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.10"}}}, {if_var_true, pgsql, - {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.12"}}}}, + {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.16"}}}}, {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.23"}}}, {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.8"}}}, {if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix @@ -59,7 +59,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.45"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "a85dc699ff02471ecad08d85e3bed87c57c48aba"}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.6"}}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. From ad3c91b86ef24da4a2a033065268198bfea6ff56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 29 Nov 2021 15:36:57 +0100 Subject: [PATCH 088/440] Update mix deps --- mix.exs | 4 ++-- mix.lock | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mix.exs b/mix.exs index 0f991a499..fbed459a4 100644 --- a/mix.exs +++ b/mix.exs @@ -102,7 +102,7 @@ defmodule Ejabberd.MixProject do end defp deps do - [{:base64url, "~> 0.0.1"}, + [{:base64url, "~> 1.0"}, {:cache_tab, "~> 1.0"}, {:distillery, "~> 2.0"}, {:eimp, "~> 1.0"}, @@ -124,7 +124,7 @@ defmodule Ejabberd.MixProject do {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, {:stun, "~> 1.0"}, - {:xmpp, git: "https://github.com/processone/xmpp", ref: "a85dc699ff02471ecad08d85e3bed87c57c48aba", override: true}, + {:xmpp, ">= 1.5.5"}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/mix.lock b/mix.lock index a5b158e0f..773cc2bbf 100644 --- a/mix.lock +++ b/mix.lock @@ -1,36 +1,36 @@ %{ "artificery": {:hex, :artificery, "0.4.3", "0bc4260f988dcb9dda4b23f9fc3c6c8b99a6220a331534fdf5bf2fd0d4333b02", [:mix], [], "hexpm", "12e95333a30e20884e937abdbefa3e7f5e05609c2ba8cf37b33f000b9ffc0504"}, - "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm", "fab09b20e3f5db886725544cbcf875b8e73ec93363954eb8a1a9ed834aa8c1f9"}, + "base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"}, "cache_tab": {:hex, :cache_tab, "1.0.29", "6c161988620b788d8df28c8f6af557571609c8e4b671dbadab295a4722cd501b", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a02a638021cce91ed1a8628dcbb4795bf5c01c9d11db8c613065923142824ce9"}, "distillery": {:hex, :distillery, "2.1.1", "f9332afc2eec8a1a2b86f22429e068ef35f84a93ea1718265e740d90dd367814", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm", "bbc7008b0161a6f130d8d903b5b3232351fccc9c31a991f8fcbf2a12ace22995"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.13", "0c98163e7d04a15feb62000e1a891489feb29f3d10cb57d4f845c405852bbef8", [:mix], [], "hexpm", "d602c26af3a0af43d2f2645613f65841657ad6efc9f0e361c3b6c06b578214ba"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.17", "6f3c7e94170377ba45241d394389e800fb15adc5de51d0a3cd52ae766aafd63f", [:mix], [], "hexpm", "f93ac89c9feca61c165b264b5837bf82344d13bebc634cd575cb711e2e342023"}, "eimp": {:hex, :eimp, "1.0.21", "2e918a5dc9a1959ef8713a2360499e3baeee64cfd7881bd9d1f361ca9ddf07e8", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "998f58538f58aa0cff103414994d7ce56dc253e6576cd6fb40c1ead64aa73a28"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, - "esip": {:hex, :esip, "1.0.43", "1cbdc073073f80b9b50e2759f66ca13a353eb4f874bcf92501bd4cd767e34d46", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.44", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "b2c758ae52c4588e0399c0b4ce550bfa56551a5a2f828a28389f2614797e4f4b"}, - "ex_doc": {:hex, :ex_doc, "0.25.0", "4070a254664ee5495c2f7cce87c2f43064a8752f7976f2de4937b65871b05223", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2d90883bd4f3d826af0bde7fea733a4c20adba1c79158e2330f7465821c8949b"}, + "esip": {:hex, :esip, "1.0.44", "dcf3a92e581210ab161d8a8201245df5a56058460b08d89cf3193d944adff71e", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.45", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "ea2086a1de95fe48f40b78251f74a6828799e318c55da346934e7d4fea675f04"}, + "ex_doc": {:hex, :ex_doc, "0.26.0", "1922164bac0b18b02f84d6f69cab1b93bc3e870e2ad18d5dacb50a9e06b542a3", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2775d66e494a9a48355db7867478ffd997864c61c65a47d31c4949459281c78d"}, "ezlib": {:hex, :ezlib, "1.0.10", "c1c24eb18944cfde55f0574e9922d5b0392fa864282f769f82b2ea15e54f6003", [:rebar3], [], "hexpm", "1d317f1d85373686199eb3b4164d3477e95033ac68e45a95ba18e7b7a8c23241"}, "fast_tls": {:hex, :fast_tls, "1.1.13", "828cdc75e1e8fce8158846d2b971d8b4fe2b2ddcc75b759e88d751079bf78afd", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d1f422af40c7777fe534496f508ee86515cb929ad10f7d1d56aa94ce899b44a0"}, - "fast_xml": {:hex, :fast_xml, "1.1.47", "bd1d6c081b69c7bce0d2f22b013c1b864ed2588d48f34e2156d9428f8f772c66", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "dd014c45247498effb9a28cf98cb716db79be635ad1e98c951240763119f24c7"}, + "fast_xml": {:hex, :fast_xml, "1.1.48", "d41d14015227999a2367264cc97ac1e6770285aab1dc69545ac4f822be01a2d2", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "afcf9b808c77599395d4bd22ed4560b3d82aa1a24ff5b65f3930fe72a423b3cf"}, "fast_yaml": {:hex, :fast_yaml, "1.0.32", "43f53a2c8572f2e4d66cd4e787fc6761b1c65b9132e42c511d8b9540b0989d65", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7258e322739ff0824237ebe44cd158e0bf52cd27a15fe731cf92f4b4c70b913e"}, "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "jiffy": {:hex, :jiffy, "1.0.5", "a69b58faf7123534c20e1b0b7ae97ac52079ca02ed4b6989b4b380179cd63a54", [:rebar3], [], "hexpm", "b617a53f46ae84f20d0c38951367dc947a2cf8cff922aa5c6ac6b64b8b052289"}, - "jose": {:hex, :jose, "1.9.0", "4167c5f6d06ffaebffd15cdb8da61a108445ef5e85ab8f5a7ad926fdf3ada154", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm", "6429c4fee52b2dda7861ee19a4f09c8c1ffa213bee3a1ec187828fde95d447ed"}, + "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "lager": {:hex, :lager, "3.9.2", "4cab289120eb24964e3886bd22323cb5fefe4510c076992a23ad18cf85413d8c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "7f904d9e87a8cb7e66156ed31768d1c8e26eba1d54f4bc85b1aa4ac1f6340c28"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "mqtree": {:hex, :mqtree, "1.0.14", "d201a79b51a9232b80e764b4b77a866f7c30a90c7ac6205d71f391eb3ea7eb31", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8626dac5e862b575eaf4836f0fc1be5a7c8435c378c5a309e34ee012d48b6f6e"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "p1_acme": {:hex, :p1_acme, "1.0.13", "fec71df416004ce49e295f4846fe5ba3478b41fbe4f73a06b4a8fbc967d6e659", [:rebar3], [{:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.0.5", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.9.0", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "a2ce9d4904304df020c8e92e8577e0fc88f32623540656317c7e25440b4ac8d2"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.2.0", "b44d75e2a6542dcb6acf5d71c32c74ca88960421b6874777f79153bbbbd7dccc", [:mix], [], "hexpm", "52b2871a7515a5ac49b00f214e4165a40724cf99798d8e4a65e4fd64ebd002c1"}, + "p1_acme": {:hex, :p1_acme, "1.0.16", "88b84cc24c9b6eb87204ea53969ccd9b524dcd4142de632441fdd2859ccab778", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.0.5", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "ec0ef380a7345c38b57899733f6fece97c337a3d44fd02cc8898f6a2491a38a8"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.10", "09ba1fbd447b1f480b223903e36d0415f21be592a1b00db964eea01285749028", [:rebar3], [], "hexpm", "c79cb61ababee4a8c85409b7f4932035797c093aeef1f9f53985e512b26f2a64"}, "p1_pgsql": {:hex, :p1_pgsql, "1.1.12", "10ae79eeb35ea98c0424a8b6420542fef9e4469eb12ccf41475d10840c291e68", [:rebar3], [], "hexpm", "32203f779e01cf0353270df24833a1d831ad7cb3e3e8e35a7556dfa1f40948d5"}, "p1_utils": {:hex, :p1_utils, "1.0.23", "7f94466ada69bd982ea7bb80fbca18e7053e7d0b82c9d9e37621fa508587069b", [:rebar3], [], "hexpm", "47f21618694eeee5006af1c88731ad86b757161e7823c29b6f73921b571c8502"}, "pkix": {:hex, :pkix, "1.0.8", "98ea05243847fd4504f7c7a0cd82cecd1010ac327a082e1c674c5384006eae75", [:rebar3], [], "hexpm", "399508819501fab9d2e586dfa601b5ee3ef22b5612d3db58204dd2d089ef45d7"}, "stringprep": {:hex, :stringprep, "1.0.27", "02808c7024bc6285ca6a8a67e7addfc16f35dda55551a582c5181d8ea960e890", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a5967b1144ca8002a58a03d16dd109fbd0bcdb82616cead2f983944314af6a00"}, - "stun": {:hex, :stun, "1.0.44", "30b6b774864b24b05ba901291abe583bff19081e7c4efb3361df50b781ec9d3b", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e45bba816cbefff01d820e49e66814f450df25a7a468a70d68d1e64218d46520"}, + "stun": {:hex, :stun, "1.0.45", "3363fd4911f408c712c48baa3811548768dcd49a6c30d8f3c54c119bbbacd3ea", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "89774eb5500d5360dc0c1d0504b34afa891f91c807637309c449841ae91f7818"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, - "xmpp": {:hex, :xmpp, "1.5.4", "6cd8144b3fe04745dc2cb3e746d6f2a963bb283db48a61f159b49cbe3fab8623", [:rebar3], [{:ezlib, "1.0.10", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.47", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.27", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "3bc2b5cb24e52964fb11641422ce2b7ba7c261dd50080689a1cbe3d952a9db35"}, + "xmpp": {:hex, :xmpp, "1.5.6", "09259177a39c880d682817932f4da0537c471160fd43aa891ea9cb71cf827b52", [:rebar3], [{:ezlib, "1.0.10", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.48", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.27", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "59b7317c4077d3384f9a891e0517a591cdbd44a323260b835eafbede4f4eb12e"}, "yconf": {:hex, :yconf, "1.0.12", "78c119d39bb805207fcb7671cb884805d75ee89c9ec98632b678f90a597dee2c", [:rebar3], [{:fast_yaml, "1.0.32", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "12faa51c281e95bcb6abf185fd034a242209621a7bb04b6cc411c867b192e207"}, } From 0372878ba5e0c2a2fdfe445a2aae0973c5424fe6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 1 Dec 2021 10:22:41 +0100 Subject: [PATCH 089/440] Minor improvements in conversejs documentation --- src/mod_conversejs.erl | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index e8aede2c7..0b5d57a15 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -1,7 +1,7 @@ %%%---------------------------------------------------------------------- %%% File : mod_conversejs.erl %%% Author : Alexey Shchepin -%%% Purpose : Implements REST API for ejabberd using JSON data +%%% Purpose : Serve simple page for Converse.js XMPP web browser client %%% Created : 8 Nov 2021 by Alexey Shchepin %%% %%% @@ -103,23 +103,29 @@ mod_options(_) -> [{bosh_service_url, undefined}, {websocket_url, undefined}, {default_domain, ejabberd_config:get_myname()}, - {conversejs_script, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.js">>}, - {conversejs_css, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.css">>}]. + {conversejs_script, <<"https://cdn.conversejs.org/dist/converse.min.js">>}, + {conversejs_css, <<"https://cdn.conversejs.org/dist/converse.min.css">>}]. mod_doc() -> #{desc => - [?T("This module serves a simple Converse.js page."), "", + [?T("This module serves a simple page for the " + "https://conversejs.org/[Converse] XMPP web browser client."), "", ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " - "http://../listen-options/#request-handlers[request_handlers].")], + "http://../listen-options/#request-handlers[request_handlers]."), "", + ?T("You must also setup either the option 'websocket_url' or 'bosh_service_url'."), "", + ?T("By default, the options 'conversejs_css' and 'conversejs_script'" + " point to the public Converse.js client. Alternatively, you can" + " host the client locally using _`mod_http_fileserver`_.") + ], example => ["listen:", " -", " port: 5280", " module: ejabberd_http", " request_handlers:", - " \"/websocket\": ejabberd_http_ws" - " \"/conversejs\": mod_conversejs", + " /websocket: ejabberd_http_ws", + " /conversejs: mod_conversejs", "", "modules:", " mod_conversejs:", @@ -136,7 +142,9 @@ mod_doc() -> {default_domain, #{value => ?T("Domain"), desc => - ?T("Specify a domain to act as the default for user JIDs.")}}, + ?T("Specify a domain to act as the default for user JIDs. " + "The default value is the first domain defined in the " + "ejabberd configuration file.")}}, {conversejs_script, #{value => ?T("URL"), desc => From dab4c0cc107d8e829f2e68fa37605fa07b26f831 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 3 Dec 2021 12:16:20 +0100 Subject: [PATCH 090/440] New allow_modules option to restrict registration modules --- src/mod_register.erl | 26 ++++++++++++++++++++++---- src/mod_register_web.erl | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/mod_register.erl b/src/mod_register.erl index 379318da6..0bb0978ef 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -32,11 +32,13 @@ -behaviour(gen_mod). -export([start/2, stop/1, reload/3, stream_feature_register/2, - c2s_unauthenticated_packet/2, try_register/4, + c2s_unauthenticated_packet/2, try_register/4, try_register/5, process_iq/1, send_registration_notifications/3, mod_opt_type/1, mod_options/1, depends/2, format_error/1, mod_doc/0]). +-deprecated({try_register, 4}). + -include("logger.hrl"). -include_lib("xmpp/include/xmpp.hrl"). -include("translate.hrl"). @@ -283,7 +285,7 @@ try_register_or_set_password(User, Server, Password, _ when CaptchaSucceed -> case check_from(From, Server) of allow -> - case try_register(User, Server, Password, Source, Lang) of + case try_register(User, Server, Password, Source, ?MODULE, Lang) of ok -> xmpp:make_iq_result(IQ); {error, Error} -> @@ -328,6 +330,13 @@ try_set_password(User, Server, Password, #iq{lang = Lang, meta = M} = IQ) -> xmpp:make_error(IQ, xmpp:err_internal_server_error(format_error(Why), Lang)) end. +try_register(User, Server, Password, SourceRaw, Module) -> + Modules = mod_register_opt:allow_modules(Server), + case (Modules == all) orelse lists:member(Module, Modules) of + true -> try_register(User, Server, Password, SourceRaw); + false -> {error, eaccess} + end. + try_register(User, Server, Password, SourceRaw) -> case jid:is_nodename(User) of false -> @@ -363,8 +372,8 @@ try_register(User, Server, Password, SourceRaw) -> end end. -try_register(User, Server, Password, SourceRaw, Lang) -> - case try_register(User, Server, Password, SourceRaw) of +try_register(User, Server, Password, SourceRaw, Module, Lang) -> + case try_register(User, Server, Password, SourceRaw, Module) of ok -> JID = jid:make(User, Server), Source = may_remove_resource(SourceRaw), @@ -597,6 +606,8 @@ mod_opt_type(access_from) -> econf:acl(); mod_opt_type(access_remove) -> econf:acl(); +mod_opt_type(allow_modules) -> + econf:either(all, econf:list(econf:atom())); mod_opt_type(captcha_protected) -> econf:bool(); mod_opt_type(ip_access) -> @@ -623,6 +634,7 @@ mod_options(_Host) -> [{access, all}, {access_from, none}, {access_remove, all}, + {allow_modules, all}, {captcha_protected, false}, {ip_access, all}, {password_strength, 0}, @@ -661,6 +673,12 @@ mod_doc() -> desc => ?T("Specify rules to restrict access for user unregistration. " "By default any user is able to unregister their account.")}}, + {allow_modules, + #{value => "all | [Module, ...]", + desc => + ?T("List of modules that can register accounts, or 'all'. " + "The default value is 'all', which is equivalent to " + "something like '[mod_register, mod_register_web]'.")}}, {captcha_protected, #{value => "true | false", desc => diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index 1ac3b58dc..0cf4bcff8 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -521,7 +521,7 @@ register_account(Username, Host, Password, Ip) -> end. register_account2(Username, Host, Password, Ip) -> - case mod_register:try_register(Username, Host, Password, Ip) + case mod_register:try_register(Username, Host, Password, Ip, ?MODULE) of ok -> {success, ok, {Username, Host, Password}}; From 7fd0eefa3091e531639b9f13b853ce728e0f40a1 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 3 Dec 2021 12:53:58 +0100 Subject: [PATCH 091/440] Run make options --- src/mod_conversejs_opt.erl | 41 ++++++++++++++++++++++++++++++++++++++ src/mod_pubsub_opt.erl | 9 ++++++++- src/mod_register_opt.erl | 7 +++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/mod_conversejs_opt.erl diff --git a/src/mod_conversejs_opt.erl b/src/mod_conversejs_opt.erl new file mode 100644 index 000000000..9e53978ea --- /dev/null +++ b/src/mod_conversejs_opt.erl @@ -0,0 +1,41 @@ +%% Generated automatically +%% DO NOT EDIT: run `make options` instead + +-module(mod_conversejs_opt). + +-export([bosh_service_url/1]). +-export([conversejs_css/1]). +-export([conversejs_script/1]). +-export([default_domain/1]). +-export([websocket_url/1]). + +-spec bosh_service_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +bosh_service_url(Opts) when is_map(Opts) -> + gen_mod:get_opt(bosh_service_url, Opts); +bosh_service_url(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, bosh_service_url). + +-spec conversejs_css(gen_mod:opts() | global | binary()) -> binary(). +conversejs_css(Opts) when is_map(Opts) -> + gen_mod:get_opt(conversejs_css, Opts); +conversejs_css(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, conversejs_css). + +-spec conversejs_script(gen_mod:opts() | global | binary()) -> binary(). +conversejs_script(Opts) when is_map(Opts) -> + gen_mod:get_opt(conversejs_script, Opts); +conversejs_script(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, conversejs_script). + +-spec default_domain(gen_mod:opts() | global | binary()) -> binary(). +default_domain(Opts) when is_map(Opts) -> + gen_mod:get_opt(default_domain, Opts); +default_domain(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, default_domain). + +-spec websocket_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +websocket_url(Opts) when is_map(Opts) -> + gen_mod:get_opt(websocket_url, Opts); +websocket_url(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, websocket_url). + diff --git a/src/mod_pubsub_opt.erl b/src/mod_pubsub_opt.erl index 8db5532f6..cb3c014b9 100644 --- a/src/mod_pubsub_opt.erl +++ b/src/mod_pubsub_opt.erl @@ -11,6 +11,7 @@ -export([hosts/1]). -export([ignore_pep_from_offline/1]). -export([last_item_cache/1]). +-export([max_item_expire_node/1]). -export([max_items_node/1]). -export([max_nodes_discoitems/1]). -export([max_subscriptions_node/1]). @@ -68,7 +69,13 @@ last_item_cache(Opts) when is_map(Opts) -> last_item_cache(Host) -> gen_mod:get_module_opt(Host, mod_pubsub, last_item_cache). --spec max_items_node(gen_mod:opts() | global | binary()) -> non_neg_integer(). +-spec max_item_expire_node(gen_mod:opts() | global | binary()) -> 'infinity' | pos_integer(). +max_item_expire_node(Opts) when is_map(Opts) -> + gen_mod:get_opt(max_item_expire_node, Opts); +max_item_expire_node(Host) -> + gen_mod:get_module_opt(Host, mod_pubsub, max_item_expire_node). + +-spec max_items_node(gen_mod:opts() | global | binary()) -> 'unlimited' | non_neg_integer(). max_items_node(Opts) when is_map(Opts) -> gen_mod:get_opt(max_items_node, Opts); max_items_node(Host) -> diff --git a/src/mod_register_opt.erl b/src/mod_register_opt.erl index 53c6ca6ea..e7236424c 100644 --- a/src/mod_register_opt.erl +++ b/src/mod_register_opt.erl @@ -6,6 +6,7 @@ -export([access/1]). -export([access_from/1]). -export([access_remove/1]). +-export([allow_modules/1]). -export([captcha_protected/1]). -export([ip_access/1]). -export([password_strength/1]). @@ -31,6 +32,12 @@ access_remove(Opts) when is_map(Opts) -> access_remove(Host) -> gen_mod:get_module_opt(Host, mod_register, access_remove). +-spec allow_modules(gen_mod:opts() | global | binary()) -> 'all' | [atom()]. +allow_modules(Opts) when is_map(Opts) -> + gen_mod:get_opt(allow_modules, Opts); +allow_modules(Host) -> + gen_mod:get_module_opt(Host, mod_register, allow_modules). + -spec captcha_protected(gen_mod:opts() | global | binary()) -> boolean(). captcha_protected(Opts) when is_map(Opts) -> gen_mod:get_opt(captcha_protected, Opts); From 7897c3d0e170495615d40152df9dbddb8df5d2df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 6 Dec 2021 15:07:59 +0100 Subject: [PATCH 092/440] Add workaround for bug in older erlang version in rest module --- src/rest.erl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/rest.erl b/src/rest.erl index d724352f2..038ec1fb1 100644 --- a/src/rest.erl +++ b/src/rest.erl @@ -197,7 +197,18 @@ url(Url, Params) -> L = [<<"&", (iolist_to_binary(Key))/binary, "=", (misc:url_encode(Value))/binary>> || {Key, Value} <- Params], - <<$&, Encoded/binary>> = iolist_to_binary(L), + <<$&, Encoded0/binary>> = iolist_to_binary(L), + Encoded = + case erlang:function_exported(uri_string, normalize, 1) of + true -> + case uri_string:normalize("%25") of + "%" -> % This hack around bug in httpc >21 <23.2 + binary:replace(Encoded0, <<"%25">>, <<"%2525">>, [global]); + _ -> Encoded0 + end; + _ -> + Encoded0 + end, <>. url(Server, Path, Params) -> case binary:split(base_url(Server, Path), <<"?">>) of From 8d8a3177e15aac8e693aa20e8e51d6463e81163d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 6 Dec 2021 15:46:52 +0100 Subject: [PATCH 093/440] Eliminate xref warning from last commit --- mix.exs | 1 + rebar.config | 1 + src/rest.erl | 24 +++++++++++++----------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mix.exs b/mix.exs index fbed459a4..9da7885b5 100644 --- a/mix.exs +++ b/mix.exs @@ -87,6 +87,7 @@ defmodule Ejabberd.MixProject do if_version_below('23', [{:d, :USE_OLD_PG2}]) ++ if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++ if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++ + if_function_exported(:uri_string, :normalize, 1, [{:d, :HAVE_URI_STRING}]) if_function_exported(:erl_error, :format_exception, 6, [{:d, :HAVE_ERL_ERROR}]) defines = for {:d, value} <- result, do: {:d, value} result ++ [{:d, :ALL_DEFS, defines}] diff --git a/rebar.config b/rebar.config index 3490d976c..4be211e25 100644 --- a/rebar.config +++ b/rebar.config @@ -110,6 +110,7 @@ {if_var_true, sip, {d, 'SIP'}}, {if_var_true, stun, {d, 'STUN'}}, {if_have_fun, {erl_error, format_exception, 6}, {d, 'HAVE_ERL_ERROR'}}, + {if_have_fun, {uri_string, normalize, 1}, {d, 'HAVE_URI_STRING'}}, {src_dirs, [src, {if_rebar3, sql}, {if_var_true, tools, tools}, diff --git a/src/rest.erl b/src/rest.erl index 038ec1fb1..1bb5c5ef7 100644 --- a/src/rest.erl +++ b/src/rest.erl @@ -191,6 +191,18 @@ base_url(Server, Path) -> _ -> Url end. +-ifdef(HAVE_URI_STRING). +uri_hack(Str) -> + case uri_string:normalize("%25") of + "%" -> % This hack around bug in httpc >21 <23.2 + binary:replace(Str, <<"%25">>, <<"%2525">>, [global]); + _ -> Str + end. +-else. +uri_hack(Str) -> + Str. +-endif. + url(Url, []) -> Url; url(Url, Params) -> @@ -198,17 +210,7 @@ url(Url, Params) -> (misc:url_encode(Value))/binary>> || {Key, Value} <- Params], <<$&, Encoded0/binary>> = iolist_to_binary(L), - Encoded = - case erlang:function_exported(uri_string, normalize, 1) of - true -> - case uri_string:normalize("%25") of - "%" -> % This hack around bug in httpc >21 <23.2 - binary:replace(Encoded0, <<"%25">>, <<"%2525">>, [global]); - _ -> Encoded0 - end; - _ -> - Encoded0 - end, + Encoded = uri_hack(Encoded0), <>. url(Server, Path, Params) -> case binary:split(base_url(Server, Path), <<"?">>) of From 3f4423e996f19b5e395f59b17184cc021d6752a3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 6 Dec 2021 23:17:11 +0100 Subject: [PATCH 094/440] Use P1's coveralls-erl fork to handle unicode in git commit author --- rebar.config.script | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rebar.config.script b/rebar.config.script index efd51d6ba..c83390fb5 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -387,8 +387,8 @@ Rules = [ ]}]), []}, {[plugins], IsRebar3 and (os:getenv("GITHUB_ACTIONS") == "true"), AppendList([{coveralls, {git, - "https://github.com/RoadRunnr/coveralls-erl.git", - {branch, "feature/git-info"}}} ]), []}, + "https://github.com/processone/coveralls-erl.git", + {branch, "addjsonfile"}}} ]), []}, {[overrides], [post_hook_configure], SystemDeps == false, AppendList2(GenDepsConfigure), [], []}, {[ct_extra_params], [eunit_compile_opts], true, From 6b1f78e87aeb029b63cbc9669c9de0bd3e7169af Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 7 Dec 2021 10:12:14 +0100 Subject: [PATCH 095/440] Remove CTLLOCKDIR (/var/lock/ejabberdctl) from Makefile.in Flock'ing /var/lock/ejabberdctl by ejabberdctl was removed with f7d4aae64db8 ("Use UUID for ctl node name (#1021)"), however the according recipies in the Makefile where never removed. This commit does that. --- Makefile.in | 9 --------- rebar.config | 1 - rel/reltool.config.script | 1 - 3 files changed, 11 deletions(-) diff --git a/Makefile.in b/Makefile.in index fc9718006..ab0e9d967 100644 --- a/Makefile.in +++ b/Makefile.in @@ -68,9 +68,6 @@ LUADIR = $(PRIVDIR)/lua # /var/lib/ejabberd/ SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd -# /var/lock/ejabberdctl -CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl - # /var/log/ejabberd/ LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd @@ -313,11 +310,6 @@ install: copy-files $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT) chmod -R 750 $(SPOOLDIR) # - # ejabberdctl lock directory - $(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(CTLLOCKDIR) - # # Log directory $(INSTALL) -d -m 750 $(O_USER) $(LOGDIR) $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT) @@ -366,7 +358,6 @@ uninstall-all: uninstall-binary rm -rf $(ETCDIR) rm -rf $(EJABBERDDIR) rm -rf $(SPOOLDIR) - rm -rf $(CTLLOCKDIR) rm -rf $(LOGDIR) clean: diff --git a/rebar.config b/rebar.config index 4be211e25..774c3af67 100644 --- a/rebar.config +++ b/rebar.config @@ -180,7 +180,6 @@ {overlay_vars, "vars.config"}, {extended_start_script, true}, {overlay, [{mkdir, "var/log/ejabberd"}, - {mkdir, "var/lock"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, {copy, "rel/files/erl", "\{\{erts_vsn\}\}/bin/erl"}, % in rebar2 this prepends erts- diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 459077964..951d55d28 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -89,7 +89,6 @@ Sys = [{lib_dirs, []}, Overlay = [ {mkdir, "var/log/ejabberd"}, - {mkdir, "var/lock"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, {mkdir, "doc"}, From 68ea5834c8adb23052bcd7283b842c656b6db428 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 8 Dec 2021 16:21:42 +0100 Subject: [PATCH 096/440] Relax strictness in mix dependency versions --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 9da7885b5..924812666 100644 --- a/mix.exs +++ b/mix.exs @@ -125,7 +125,7 @@ defmodule Ejabberd.MixProject do {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, {:stun, "~> 1.0"}, - {:xmpp, ">= 1.5.5"}, + {:xmpp, "~> 1.5"}, {:yconf, "~> 1.0"}] ++ cond_deps() end From 0f9a0156c67b3ad3ccdaafaeee266778fa89073a Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 8 Dec 2021 16:22:24 +0100 Subject: [PATCH 097/440] Handle mix version when running docker-ejabberd/ecs/build.sh latest --- mix.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/mix.exs b/mix.exs index 924812666..7669c519c 100644 --- a/mix.exs +++ b/mix.exs @@ -24,6 +24,7 @@ defmodule Ejabberd.MixProject do case config(:vsn) do :false -> "0.0.0" # ./configure wasn't run: vars.config not created '0.0' -> "0.0.0" # the full git repository wasn't downloaded + 'latest.0' -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest' [_, _, ?., _, _] = x -> head = String.replace(:erlang.list_to_binary(x), ~r/0+([0-9])/, "\\1") <> From e10f2a9e47bb864b4011df9d2a38821ac4807a2f Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 8 Dec 2021 17:31:05 +0100 Subject: [PATCH 098/440] OTP 24 means whatever version provided by Actions... nowadays it's 24.1 --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac384e375..45a88eda9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,12 +25,12 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '24.0'] + otp: ['19.3', '24'] include: - otp: '19.3' rebar: 2 os: ubuntu-18.04 - - otp: '24.0' + - otp: '24' rebar: 3 os: ubuntu-20.04 runs-on: ${{ matrix.os }} @@ -46,7 +46,7 @@ jobs: - name: Get previous Erlang/OTP uses: ErlGang/setup-erlang@master - if: matrix.otp != 24.0 + if: matrix.otp != 24 with: otp-version: ${{ matrix.otp }} @@ -169,7 +169,7 @@ jobs: run: find logs/ -name exunit.log -exec cat '{}' ';' - name: Send to coveralls - if: matrix.otp == 24.0 + if: matrix.otp == 24 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | From ca143c187301db7b44e7e946f3be5f9b297d2468 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 8 Dec 2021 18:14:43 +0100 Subject: [PATCH 099/440] Update man page --- man/ejabberd.yml.5 | 341 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 266 insertions(+), 75 deletions(-) diff --git a/man/ejabberd.yml.5 b/man/ejabberd.yml.5 index f25f57250..8fb59c381 100644 --- a/man/ejabberd.yml.5 +++ b/man/ejabberd.yml.5 @@ -2,12 +2,12 @@ .\" Title: ejabberd.yml .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.79.1 -.\" Date: 07/21/2021 +.\" Date: 12/08/2021 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "EJABBERD\&.YML" "5" "07/21/2021" "\ \&" "\ \&" +.TH "EJABBERD\&.YML" "5" "12/08/2021" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -82,7 +82,7 @@ All options can be changed in runtime by running \fIejabberdctl reload\-config\f .sp Some options can be specified for particular virtual host(s) only using \fIhost_config\fR or \fIappend_host_config\fR options\&. Such options are called \fIlocal\fR\&. Examples are \fImodules\fR, \fIauth_method\fR and \fIdefault_db\fR\&. The options that cannot be defined per virtual host are called \fIglobal\fR\&. Examples are \fIloglevel\fR, \fIcertfiles\fR and \fIlisten\fR\&. It is a configuration mistake to put \fIglobal\fR options under \fIhost_config\fR or \fIappend_host_config\fR section \- ejabberd will refuse to load such configuration\&. .sp -It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/21\&.07/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. +It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/21\&.12/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. .sp Note that this document is intended to provide comprehensive description of all configuration options that can be consulted to understand the meaning of a particular option, its format and possible values\&. It will be quite hard to understand how to configure ejabberd by reading this document only \- for this purpose the reader is recommended to read online Configuration Guide available at https://docs\&.ejabberd\&.im/admin/configuration\&. .SH "TOP LEVEL OPTIONS" @@ -316,14 +316,46 @@ means that the same username can be taken multiple times in anonymous login mode .PP \fBanonymous_protocol\fR: \fIlogin_anon | sasl_anon | both\fR .RS 4 +Define what anonymous protocol will be used: +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} \fIlogin_anon\fR means that the anonymous login method will be used\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} \fIsasl_anon\fR means that the SASL Anonymous method will be used\&. -\fIboth\fR -means that SASL Anonymous and login anonymous are both enabled\&. The default value is -\fIsasl_anon\fR\&. .RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +\fIboth\fR +means that SASL Anonymous and login anonymous are both enabled\&. +.RE +.RE +.sp +The default value is \fIsasl_anon\fR\&. .PP \fBapi_permissions\fR: \fI[Permission, \&.\&.\&.]\fR .RS 4 @@ -375,7 +407,7 @@ A list of authentication methods to use\&. If several methods are defined, authe This is used by the contributed module \fIejabberd_auth_http\fR that can be installed from the -\fIejabberd\-contrib\fR +ejabberd\-contrib Git repository\&. Please refer to that module\(cqs README file for details\&. .RE .sp @@ -383,14 +415,36 @@ Git repository\&. Please refer to that module\(cqs README file for details\&. .PP \fBauth_password_format\fR: \fIplain | scram\fR .RS 4 -The option defines in what format the users passwords are stored\&. +The option defines in what format the users passwords are stored: +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} \fIplain\fR: The password is stored as plain text in the database\&. This is risky because the passwords can be read if your database gets compromised\&. This is the default value\&. This format allows clients to authenticate using: the old Jabber Non\-SASL (XEP\-0078), SASL PLAIN, SASL DIGEST\-MD5, and SASL SCRAM\-SHA\-1\&. -\fIscram\fR: The password is not stored, only some information that allows to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +\fIscram\fR: The password is not stored, only some information that allows to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1\&. The default value is +\fIplain\fR\&. +.RE .RE .PP \fBauth_scram_hash\fR: \fIsha | sha256 | sha512\fR .RS 4 -Hash algorith that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. +Hash algorith that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is +\fIsha\fR\&. .RE .PP \fBauth_use_cache\fR: \fItrue | false\fR @@ -476,7 +530,7 @@ For server conections, this \fIca_file\fR option is overriden by the s2s_cafile \fBcache_life_time\fR: \fItimeout()\fR .RS 4 The time of a cached item to keep in cache\&. Once it\(cqs expired, the corresponding item is erased from cache\&. The default value is -\fIone hour\fR\&. Several modules have a similar option; and some core ejabberd parts support similar options too, see +\fI1 hour\fR\&. Several modules have a similar option; and some core ejabberd parts support similar options too, see \fIauth_cache_life_time\fR, \fIoauth_cache_life_time\fR, \fIrouter_cache_life_time\fR, and @@ -507,7 +561,9 @@ A maximum number of items (not memory!) in cache\&. The rule of thumb, for all t .PP \fBcaptcha_cmd\fR: \fIPath\fR .RS 4 -Full path to a script that generates CAPTCHA images\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&. +Full path to a script that generates +CAPTCHA +images\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&. .RE .PP \fBcaptcha_host\fR: \fIString\fR @@ -519,13 +575,17 @@ instead\&. .PP \fBcaptcha_limit\fR: \fIpos_integer() | infinity\fR .RS 4 -Maximum number of CAPTCHA generated images per minute for any given JID\&. The option is intended to protect the server from CAPTCHA DoS\&. The default value is +Maximum number of +CAPTCHA +generated images per minute for any given JID\&. The option is intended to protect the server from CAPTCHA DoS\&. The default value is \fIinfinity\fR\&. .RE .PP \fBcaptcha_url\fR: \fIURL\fR .RS 4 -An URL where CAPTCHA requests should be sent\&. NOTE: you need to configure +An URL where +CAPTCHA +requests should be sent\&. NOTE: you need to configure \fIrequest_handlers\fR for \fIejabberd_http\fR @@ -815,7 +875,8 @@ Path to the file that contains the JWK Key\&. The default value is .RS 4 The option defines the default language of server strings that can be seen by XMPP clients\&. If an XMPP client does not possess \fIxml:lang\fR -attribute, the specified language is used\&. +attribute, the specified language is used\&. The default value is +\fI"en"\fR\&. .RE .PP \fBldap_backups\fR: \fI[Host, \&.\&.\&.]\fR @@ -948,7 +1009,11 @@ section for details\&. \fBlog_rotate_count\fR: \fINumber\fR .RS 4 The number of rotated log files to keep\&. The default value is -\fI1\fR\&. +\fI1\fR, which means that only keeps +ejabberd\&.log\&.0, +error\&.log\&.0 +and +crash\&.log\&.0\&. .RE .PP \fBlog_rotate_size\fR: \fIpos_integer() | infinity\fR @@ -989,8 +1054,7 @@ seconds\&. .RS 4 This option can be used to tune tick time parameter of \fInet_kernel\fR\&. It tells Erlang VM how often nodes should check if intra\-node communication was not interrupted\&. This option must have identical value on all nodes, or it will lead to subtle bugs\&. Usually leaving default value of this is option is best, tweak it only if you know what you are doing\&. The default value is -\fI1\fR -minute\&. +\fI1 minute\fR\&. .RE .PP \fBnew_sql_schema\fR: \fItrue | false\fR @@ -998,7 +1062,7 @@ minute\&. Whether to use \fInew\fR SQL schema\&. All schemas are located at -https://github\&.com/processone/ejabberd/tree/21\&.07/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The +https://github\&.com/processone/ejabberd/tree/21\&.12/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The \fInew\fR schema allows to handle several XMPP domains in a single ejabberd database\&. Using this \fInew\fR @@ -1392,8 +1456,7 @@ if the latter is not set\&. \fBs2s_timeout\fR: \fItimeout()\fR .RS 4 A time to wait before closing an idle s2s connection\&. The default value is -\fI10\fR -minutes\&. +\fI10 minutes\fR\&. .RE .PP \fBs2s_tls_compression\fR: \fItrue | false\fR @@ -1795,24 +1858,7 @@ Details for some commands: \fIsrg\-create\fR: If you want to put a group Name with blankspaces, use the characters "\*(Aq and \*(Aq" to define when the Name starts and ends\&. See an example below\&. .RE .sp -.it 1 an-trap -.nr an-no-space-flag 1 -.nr an-break-flag 1 -.br -.ps +1 -\fBAvailable options:\fR -.RS 4 -.PP -\fBmodule_resource\fR: \fIResource\fR -.RS 4 -Indicate the resource that the XMPP stanzas must use in the FROM or TO JIDs\&. This is only useful in the -\fIget_vcard*\fR -and -\fIset_vcard*\fR -commands\&. The default value is -\fImod_admin_extra\fR\&. -.RE -.RE +The module has no options\&. .sp .it 1 an-trap .nr an-no-space-flag 1 @@ -1835,8 +1881,7 @@ access_rules: vcard_set: \- allow: adminextraresource modules: - mod_admin_extra: - module_resource: "modadminextraf8x,31ad" + mod_admin_extra: {} mod_vcard: access_set: vcard_set .fi @@ -1884,7 +1929,7 @@ ejabberdctl srg\-create g1 example\&.org "\*(AqGroup number 1\*(Aq" this_is_g1 g .RE .SS "mod_admin_update_sql" .sp -This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only PostgreSQL is supported\&. When the module is loaded use \fIupdate_sql\fR ejabberdctl command\&. +This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only PostgreSQL is supported\&. When the module is loaded use \fIupdate_sql\fR API\&. .sp The module has no options\&. .SS "mod_announce" @@ -2321,6 +2366,78 @@ While a client is inactive, queue presence stanzas that indicate (un)availabilit The module provides server configuration functionality via XEP\-0050: Ad\-Hoc Commands\&. This module requires \fImod_adhoc\fR to be loaded\&. .sp The module has no options\&. +.SS "mod_conversejs" +.sp +This module serves a simple page for the Converse XMPP web browser client\&. +.sp +To use this module, in addition to adding it to the \fImodules\fR section, you must also enable it in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. +.sp +You must also setup either the option \fIwebsocket_url\fR or \fIbosh_service_url\fR\&. +.sp +By default, the options \fIconversejs_css\fR and \fIconversejs_script\fR point to the public Converse\&.js client\&. Alternatively, you can host the client locally using \fImod_http_fileserver\fR\&. +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBAvailable options:\fR +.RS 4 +.PP +\fBbosh_service_url\fR: \fIBoshURL\fR +.RS 4 +BOSH service URL to which Converse\&.js can connect to\&. +.RE +.PP +\fBconversejs_css\fR: \fIURL\fR +.RS 4 +Converse\&.js CSS URL\&. +.RE +.PP +\fBconversejs_script\fR: \fIURL\fR +.RS 4 +Converse\&.js main script URL\&. +.RE +.PP +\fBdefault_domain\fR: \fIDomain\fR +.RS 4 +Specify a domain to act as the default for user JIDs\&. The default value is the first domain defined in the ejabberd configuration file\&. +.RE +.PP +\fBwebsocket_url\fR: \fIWebsocketURL\fR +.RS 4 +A websocket URL to which Converse\&.js can connect to\&. +.RE +.RE +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBExample:\fR +.RS 4 +.sp +.if n \{\ +.RS 4 +.\} +.nf +listen: + \- + port: 5280 + module: ejabberd_http + request_handlers: + /websocket: ejabberd_http_ws + /conversejs: mod_conversejs + +modules: + mod_conversejs: + websocket_url: "ws://example\&.org:5280/websocket" +.fi +.if n \{\ +.RE +.\} +.RE .SS "mod_delegation" .sp This module is an implementation of XEP\-0355: Namespace Delegation\&. Only admin mode has been implemented by now\&. Namespace delegation allows external services to handle IQ using specific namespace\&. This may be applied for external PEP service\&. @@ -2479,11 +2596,11 @@ server_info: \- modules: all name: abuse\-addresses - urls: [mailto:abuse@shakespeare\&.lit] + urls: ["mailto:abuse@shakespeare\&.lit"] \- modules: [mod_muc] name: "Web chatroom logs" - urls: [http://www\&.example\&.org/muc\-logs] + urls: ["http://www\&.example\&.org/muc\-logs"] \- modules: [mod_disco] name: feedback\-addresses @@ -2563,13 +2680,40 @@ The number of C2S authentication failures to trigger the IP ban\&. The default v .sp This module provides a ReST API to call ejabberd commands using JSON data\&. .sp -To use this module, in addition to adding it to the \fImodules\fR section, you must also add it to \fIrequest_handlers\fR of some listener\&. +To use this module, in addition to adding it to the \fImodules\fR section, you must also enable it in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. .sp To use a specific API version N, when defining the URL path in the request_handlers, add a \fIvN\fR\&. For example: \fI/api/v2: mod_http_api\fR .sp To run a command, send a POST request to the corresponding URL: \fIhttp://localhost:5280/api/\fR .sp The module has no options\&. +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBExample:\fR +.RS 4 +.sp +.if n \{\ +.RS 4 +.\} +.nf +listen: + \- + port: 5280 + module: ejabberd_http + request_handlers: + /api: mod_http_api + +modules: + mod_http_api: {} +.fi +.if n \{\ +.RE +.\} +.RE .SS "mod_http_fileserver" .sp This simple module serves files from the local disk over HTTP\&. @@ -2697,7 +2841,7 @@ modules: .sp This module allows for requesting permissions to upload a file via HTTP as described in XEP\-0363: HTTP File Upload\&. If the request is accepted, the client receives a URL for uploading the file and another URL from which that file can later be downloaded\&. .sp -In order to use this module, it must be configured as a \fIrequest_handler\fR for \fIejabberd_http\fR listener\&. +In order to use this module, it must be enabled in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. .sp .it 1 an-trap .nr an-no-space-flag 1 @@ -2746,7 +2890,9 @@ This option defines the permission bits of uploaded files\&. The bits are specif .PP \fBget_url\fR: \fIURL\fR .RS 4 -This option specifies the initial part of the GET URLs used for downloading the files\&. By default, it is set to the same value as +This option specifies the initial part of the GET URLs used for downloading the files\&. The default value is +\fIundefined\fR\&. When this option is +\fIundefined\fR, this option is set to the same value as \fIput_url\fR\&. The keyword @HOST@ is replaced with the virtual host name\&. NOTE: if GET requests are handled by \fImod_http_upload\fR, the \fIget_url\fR @@ -2795,7 +2941,7 @@ A name of the service in the Service Discovery\&. This will only be displayed by .PP \fBput_url\fR: \fIURL\fR .RS 4 -This option specifies the initial part of the PUT URLs used for file uploads\&. The keyword @HOST@ is replaced with the virtual host name\&. NOTE: different virtual hosts cannot use the same PUT URL\&. The default value is "https://@HOST@:5443"\&. +This option specifies the initial part of the PUT URLs used for file uploads\&. The keyword @HOST@ is replaced with the virtual host name\&. NOTE: different virtual hosts cannot use the same PUT URL\&. The default value is "https://@HOST@:5443/upload"\&. .RE .PP \fBrm_on_unregister\fR: \fItrue | false\fR @@ -3530,21 +3676,24 @@ This option specifies who is allowed to administrate the Multi\-User Chat servic .PP \fBaccess_create\fR: \fIAccessName\fR .RS 4 -To configure who is allowed to create new rooms at the Multi\-User Chat service, this option can be used\&. By default any account in the local ejabberd server is allowed to create rooms\&. +To configure who is allowed to create new rooms at the Multi\-User Chat service, this option can be used\&. The default value is +\fIall\fR, which means everyone is allowed to create rooms\&. .RE .PP \fBaccess_mam\fR: \fIAccessName\fR .RS 4 To configure who is allowed to modify the \fImam\fR -room option\&. By default any account in the local ejabberd server is allowed to modify that option\&. +room option\&. The default value is +\fIall\fR, which means everyone is allowed to modify that option\&. .RE .PP \fBaccess_persistent\fR: \fIAccessName\fR .RS 4 To configure who is allowed to modify the \fIpersistent\fR -room option\&. By default any account in the local ejabberd server is allowed to modify that option\&. +room option\&. The default value is +\fIall\fR, which means everyone is allowed to modify that option\&. .RE .PP \fBaccess_register\fR: \fIAccessName\fR @@ -3825,7 +3974,8 @@ This option defines the number of service admins or room owners allowed to enter .PP \fBmax_users_presence\fR: \fINumber\fR .RS 4 -This option defines after how many users in the room, it is considered overcrowded\&. When a MUC room is considered overcrowed, presence broadcasts are limited to reduce load, traffic and excessive presence "storm" received by participants\&. +This option defines after how many users in the room, it is considered overcrowded\&. When a MUC room is considered overcrowed, presence broadcasts are limited to reduce load, traffic and excessive presence "storm" received by participants\&. The default value is +\fI1000\fR\&. .RE .PP \fBmin_message_interval\fR: \fINumber\fR @@ -4498,8 +4648,7 @@ This module implements support for XEP\-0199: XMPP Ping and periodic keepalives\ \fBping_ack_timeout\fR: \fItimeout()\fR .RS 4 How long to wait before deeming that a client has not answered a given server ping request\&. The default value is -\fI32\fR -seconds\&. +\fIundefined\fR\&. .RE .PP \fBping_interval\fR: \fItimeout()\fR @@ -4531,7 +4680,7 @@ means destroying the underlying connection, \fInone\fR means to do nothing\&. NOTE: when \fImod_stream_mgmt\fR -module is loaded and stream management is enabled by a client, killing the client connection doesn\(cqt mean killing the client session \- the session will be kept alive in order to give the client a chance to resume it\&. The default value is +is loaded and stream management is enabled by a client, killing the client connection doesn\(cqt mean killing the client session \- the session will be kept alive in order to give the client a chance to resume it\&. The default value is \fInone\fR\&. .RE .RE @@ -5136,10 +5285,16 @@ or \fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows to raise user connection rate\&. The cost is memory usage, as every item is stored in memory\&. .RE .PP -\fBmax_items_node\fR: \fIMaxItems\fR +\fBmax_item_expire_node\fR: \fItimeout() | infinity\fR +.RS 4 +Specify the maximum item epiry time\&. Default value is: +\fIinfinity\fR\&. +.RE +.PP +\fBmax_items_node\fR: \fInon_neg_integer() | infinity\fR .RS 4 Define the maximum number of items that can be stored in a node\&. Default value is: -\fI10\fR\&. +\fI1000\fR\&. .RE .PP \fBmax_nodes_discoitems\fR: \fIpos_integer() | infinity\fR @@ -5437,9 +5592,9 @@ The module depends on \fImod_push\fR\&. .PP \fBresume_timeout\fR: \fItimeout()\fR .RS 4 -This option specifies the period of time until the session of a disconnected push client times out\&. This timeout is only in effect as long as no push notification is issued\&. Once that happened, the resumption timeout configured for the +This option specifies the period of time until the session of a disconnected push client times out\&. This timeout is only in effect as long as no push notification is issued\&. Once that happened, the resumption timeout configured for \fImod_stream_mgmt\fR -module is restored\&. The default value is +is restored\&. The default value is \fI72\fR hours\&. .RE @@ -5499,7 +5654,7 @@ Change the password from an existing account on the server\&. Delete an existing account on the server\&. .RE .sp -This module reads also another option defined globally for the server: \fIregistration_timeout\fR\&. Please check that option documentation in the section with top\-level options\&. +This module reads also the top\-level \fIregistration_timeout\fR option defined globally for the server, so please check that option documentation too\&. .sp .it 1 an-trap .nr an-no-space-flag 1 @@ -5528,11 +5683,18 @@ doesn\(cqt allow to register new accounts from s2s or existing c2s sessions\&. Y Specify rules to restrict access for user unregistration\&. By default any user is able to unregister their account\&. .RE .PP +\fBallow_modules\fR: \fIall | [Module, \&.\&.\&.]\fR +.RS 4 +List of modules that can register accounts, or +\fIall\fR\&. The default value is +\fIall\fR, which is equivalent to something like +\fI[mod_register, mod_register_web]\fR\&. +.RE +.PP \fBcaptcha_protected\fR: \fItrue | false\fR .RS 4 -Protect registrations with CAPTCHA (see section -CAPTCHA -of the Configuration Guide)\&. The default is +Protect registrations with +CAPTCHA\&. The default is \fIfalse\fR\&. .RE .PP @@ -5551,7 +5713,8 @@ This option sets the minimum Shannon entropy for passwords\&. The value \fIEntropy\fR -is a number of bits of entropy\&. The recommended minimum is 32 bits\&. The default is 0, i\&.e\&. no checks are performed\&. +is a number of bits of entropy\&. The recommended minimum is 32 bits\&. The default is +\fI0\fR, i\&.e\&. no checks are performed\&. .RE .PP \fBredirect_url\fR: \fIURL\fR @@ -5610,13 +5773,40 @@ Change the password from an existing account on the server\&. Unregister an existing account on the server\&. .RE .sp -This module supports CAPTCHA image to register a new account\&. To enable this feature, configure the options \fIcaptcha_cmd\fR and \fIcaptcha_url\fR, which are documented in the section with top\-level options\&. +This module supports CAPTCHA to register a new account\&. To enable this feature, configure the top\-level \fIcaptcha_cmd\fR and top\-level \fIcaptcha_url\fR options\&. .sp -As an example usage, the users of the host \fIexample\&.org\fR can visit the page: \fIhttps://example\&.org:5281/register/\fR It is important to include the last / character in the URL, otherwise the subpages URL will be incorrect\&. +As an example usage, the users of the host \fIlocalhost\fR can visit the page: \fIhttps://localhost:5280/register/\fR It is important to include the last / character in the URL, otherwise the subpages URL will be incorrect\&. .sp -The module depends on \fImod_register\fR where all the configuration is performed\&. +This module is enabled in \fIlisten\fR → \fIejabberd_http\fR → request_handlers, no need to enable in \fImodules\fR\&. The module depends on \fImod_register\fR where all the configuration is performed\&. .sp The module has no options\&. +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBExample:\fR +.RS 4 +.sp +.if n \{\ +.RS 4 +.\} +.nf +listen: + \- + port: 5280 + module: ejabberd_http + request_handlers: + /register: mod_register_web + +modules: + mod_register: {} +.fi +.if n \{\ +.RE +.\} +.RE .SS "mod_roster" .sp This module implements roster management as defined in RFC6121 Section 2\&. The module also adds support for XEP\-0237: Roster Versioning\&. @@ -5910,8 +6100,9 @@ option, but applied to this module only\&. .PP \fBdb_type\fR: \fImnesia | sql\fR .RS 4 -Define the type of storage where the module will create the tables and store user information\&. The default is the storage defined by the global option -\fIdefault_db\fR, or +Define the type of storage where the module will create the tables and store user information\&. The default is the storage defined by the top\-level +\fIdefault_db\fR +option, or \fImnesia\fR if omitted\&. If \fIsql\fR @@ -6521,7 +6712,8 @@ minute\&. .RS 4 Same as top\-level \fIcache_life_time\fR -option, but applied to this module only\&. +option, but applied to this module only\&. The default value is +\fI48 hours\fR\&. .RE .PP \fBcache_size\fR: \fIpos_integer() | infinity\fR @@ -6594,8 +6786,7 @@ This option defines which access rule will be used to control who is allowed to \fBcredentials_lifetime\fR: \fItimeout()\fR .RS 4 The lifetime of temporary credentials offered to clients\&. If ejabberd\(cqs built\-in TURN service is used, TURN relays allocated using temporary credentials will be terminated shortly after the credentials expired\&. The default value is -\fI12\fR -hours\&. Note that restarting the ejabberd node invalidates any temporary credentials offered before the restart unless a +\fI12 hours\fR\&. Note that restarting the ejabberd node invalidates any temporary credentials offered before the restart unless a \fIsecret\fR is specified (see below)\&. .RE @@ -7121,7 +7312,7 @@ The module depends on \fImod_vcard\fR\&. .ps -1 .br .sp -Nowadays XEP\-0153 is used mostly as "read\-only", i\&.e\&. modern clients don\(cqt publish their avatars inside vCards\&. Thus in the majority of cases the module is only used along with \fImod_avatar\fR module for providing backward compatibility\&. +Nowadays XEP\-0153 is used mostly as "read\-only", i\&.e\&. modern clients don\(cqt publish their avatars inside vCards\&. Thus in the majority of cases the module is only used along with \fImod_avatar\fR for providing backward compatibility\&. .sp .5v .RE .sp @@ -7189,13 +7380,13 @@ TODO ProcessOne\&. .SH "VERSION" .sp -This document describes the configuration file of ejabberd 21\&.04\&.131\&. Configuration options of other ejabberd versions may differ significantly\&. +This document describes the configuration file of ejabberd 21\&.12\&. Configuration options of other ejabberd versions may differ significantly\&. .SH "REPORTING BUGS" .sp Report bugs to https://github\&.com/processone/ejabberd/issues .SH "SEE ALSO" .sp -Default configuration file: https://github\&.com/processone/ejabberd/blob/21\&.07/ejabberd\&.yml\&.example +Default configuration file: https://github\&.com/processone/ejabberd/blob/21\&.12/ejabberd\&.yml\&.example .sp Main site: https://ejabberd\&.im .sp From d1bfd6c90d7e7d1bc033358e5b7e0570f03df084 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 2 Dec 2021 16:43:17 +0100 Subject: [PATCH 100/440] Annotate modules, options and command major changes in 21.12 --- src/ejabberd_commands.erl | 1 + src/mod_conversejs.erl | 1 + src/mod_pubsub.erl | 3 +++ src/mod_register.erl | 1 + 4 files changed, 6 insertions(+) diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index c00b1469a..ddf0d3c59 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -94,6 +94,7 @@ get_commands_spec() -> result_example = ok}, #ejabberd_commands{name = gen_markdown_doc_for_tags, tags = [documentation], desc = "Generates markdown documentation for ejabberd_commands", + note = "added in 21.12", module = ejabberd_commands_doc, function = generate_tags_md, args = [{file, binary}], result = {res, rescode}, diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 0b5d57a15..8683d60ab 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -110,6 +110,7 @@ mod_doc() -> #{desc => [?T("This module serves a simple page for the " "https://conversejs.org/[Converse] XMPP web browser client."), "", + ?T("This module is available since ejabberd 21.12."), "", ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 43344986e..76092f1c6 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -4233,6 +4233,7 @@ delete_expired_items() -> get_commands_spec() -> [#ejabberd_commands{name = delete_old_pubsub_items, tags = [purge], desc = "Keep only NUMBER of PubSub items per node", + note = "added in 21.12", module = ?MODULE, function = delete_old_items, args_desc = ["Number of items to keep per node"], args = [{number, integer}], @@ -4242,6 +4243,7 @@ get_commands_spec() -> result_example = ok}, #ejabberd_commands{name = delete_expired_pubsub_items, tags = [purge], desc = "Delete expired PubSub items", + note = "added in 21.12", module = ?MODULE, function = delete_expired_items, args = [], result = {res, rescode}, @@ -4389,6 +4391,7 @@ mod_doc() -> "is memory usage, as every item is stored in memory.")}}, {max_item_expire_node, #{value => "timeout() | infinity", + note => "added in 21.12", desc => ?T("Specify the maximum item epiry time. Default value " "is: 'infinity'.")}}, diff --git a/src/mod_register.erl b/src/mod_register.erl index 0bb0978ef..b85efd57c 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -675,6 +675,7 @@ mod_doc() -> "By default any user is able to unregister their account.")}}, {allow_modules, #{value => "all | [Module, ...]", + note => "added in 21.12", desc => ?T("List of modules that can register accounts, or 'all'. " "The default value is 'all', which is equivalent to " From 333eaef6dcbc210ca833f3f3a06e3f65134566a6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 9 Dec 2021 10:43:56 +0100 Subject: [PATCH 101/440] =?UTF-8?q?Update=20French=20translation=20(thanks?= =?UTF-8?q?=20to=20=C3=89frit=20and=20ButterflyOfFire)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- priv/msgs/fr.msg | 50 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/priv/msgs/fr.msg b/priv/msgs/fr.msg index f33d6115d..d35a2fbd5 100644 --- a/priv/msgs/fr.msg +++ b/priv/msgs/fr.msg @@ -5,11 +5,20 @@ {" (Add * to the end of field to match substring)"," (Ajouter * à la fin du champ pour correspondre à la sous-chaîne)"}. {" has set the subject to: "," a défini le sujet sur : "}. +{"# participants","# participants"}. {"A description of the node","Une description du nœud"}. {"A friendly name for the node","Un nom convivial pour le nœud"}. {"A password is required to enter this room","Un mot de passe est nécessaire pour accéder à ce salon"}. +{"A Web Page","Une page Web"}. {"Accept","Accepter"}. {"Access denied by service policy","L'accès au service est refusé"}. +{"Access model of authorize","Modèle d’accès de « autoriser »"}. +{"Access model of open","Modèle d’accès de « ouvrir »"}. +{"Access model of presence","Modèle d’accès de « présence »"}. +{"Access model of roster","Modèle d’accès de « liste »"}. +{"Access model of whitelist","Modèle d’accès de « liste blanche »"}. +{"Access model","Modèle d’accès"}. +{"Account doesn't exist","Le compte n’existe pas"}. {"Action on user","Action sur l'utilisateur"}. {"Add Jabber ID","Ajouter un Jabber ID"}. {"Add New","Ajouter"}. @@ -19,7 +28,9 @@ {"Administrator privileges required","Les droits d'administrateur sont nécessaires"}. {"All activity","Toute activité"}. {"All Users","Tous les utilisateurs"}. +{"Allow subscription","Autoriser l’abonnement"}. {"Allow this Jabber ID to subscribe to this pubsub node?","Autoriser ce Jabber ID à s'abonner à ce nœud PubSub ?"}. +{"Allow this person to register with the room?","Autoriser cette personne à enregistrer ce salon ?"}. {"Allow users to change the subject","Autoriser les utilisateurs à changer le sujet"}. {"Allow users to query other users","Autoriser les utilisateurs à envoyer des requêtes aux autres utilisateurs"}. {"Allow users to send invites","Autoriser les utilisateurs à envoyer des invitations"}. @@ -28,8 +39,25 @@ {"Allow visitors to send private messages to","Autoriser les visiteurs à envoyer des messages privés"}. {"Allow visitors to send status text in presence updates","Autoriser les visiteurs à envoyer un message d'état avec leur présence"}. {"Allow visitors to send voice requests","Permettre aux visiteurs d'envoyer des demandes de 'voice'"}. +{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","Un groupe LDAP associé qui définit l’adhésion à un salon ; cela devrait être un nom distingué LDAP selon la définition spécifique à l’implémentation ou au déploiement d’un groupe."}. {"Announcements","Annonces"}. +{"Answer associated with a picture","Réponse associée à une image"}. +{"Answer associated with a video","Réponse associée à une vidéo"}. +{"Answer associated with speech","Réponse associée à un discours"}. +{"Answer to a question","Réponse à une question"}. +{"Anyone in the specified roster group(s) may subscribe and retrieve items","N’importe qui dans le groupe de la liste spécifiée peut s’abonner et récupérer les items"}. +{"Anyone may associate leaf nodes with the collection","N’importe qui peut associer les feuilles avec la collection"}. +{"Anyone may publish","N’importe qui peut publier"}. +{"Anyone may subscribe and retrieve items","N’importe qui peut s’abonner et récupérer les items"}. +{"Anyone with a presence subscription of both or from may subscribe and retrieve items","N’importe qui avec un abonnement de présence peut s’abonner et récupérer les items"}. +{"Anyone with Voice","N’importe qui avec Voice"}. +{"Anyone","N’importe qui"}. {"April","Avril"}. +{"Attribute 'channel' is required for this request","L’attribut « channel » est requis pour la requête"}. +{"Attribute 'id' is mandatory for MIX messages","L’attribut « id » est obligatoire pour les messages MIX"}. +{"Attribute 'jid' is not allowed here","L’attribut « jid » n’est pas autorisé ici"}. +{"Attribute 'node' is not allowed here","L’attribut « node » n’est pas autorisé ici"}. +{"Attribute 'to' of stanza that triggered challenge","L’attribut « to » de la strophe qui a déclenché le défi"}. {"August","Août"}. {"Automatic node creation is not enabled","La creation implicite de nœud n'est pas disponible"}. {"Backup Management","Gestion des sauvegardes"}. @@ -43,10 +71,14 @@ {"Cannot remove active list","La liste active ne peut être supprimée"}. {"Cannot remove default list","La liste par défaut ne peut être supprimée"}. {"CAPTCHA web page","Page web de CAPTCHA"}. +{"Challenge ID","Identifiant du défi"}. {"Change Password","Modifier le mot de passe"}. {"Change User Password","Changer le mot de passe de l'utilisateur"}. {"Changing password is not allowed","La modification du mot de passe n'est pas autorisée"}. {"Changing role/affiliation is not allowed","La modification role/affiliation n'est pas autorisée"}. +{"Channel already exists","Ce canal existe déjà"}. +{"Channel does not exist","Le canal n’existe pas"}. +{"Channels","Canaux"}. {"Characters not allowed:","Caractères non autorisés :"}. {"Chatroom configuration modified","Configuration du salon modifiée"}. {"Chatroom is created","Le salon de discussion est créé"}. @@ -58,30 +90,39 @@ {"Choose storage type of tables","Choisissez un type de stockage pour les tables"}. {"Choose whether to approve this entity's subscription.","Choisissez d'approuver ou non l'abonnement de cette entité."}. {"City","Ville"}. +{"Client acknowledged more stanzas than sent by server","Le client accuse réception de plus de strophes que ce qui est envoyé par le serveur"}. {"Commands","Commandes"}. {"Conference room does not exist","Le salon de discussion n'existe pas"}. {"Configuration of room ~s","Configuration pour le salon ~s"}. {"Configuration","Configuration"}. {"Connected Resources:","Ressources connectées :"}. +{"Contact Addresses (normally, room owner or owners)","Adresses de contact (normalement les administrateurs du salon)"}. {"Country","Pays"}. {"CPU Time:","Temps CPU :"}. +{"Current Discussion Topic","Sujet de discussion courant"}. {"Database failure","Échec sur la base de données"}. {"Database Tables at ~p","Tables de base de données sur ~p"}. {"Database Tables Configuration at ","Configuration des tables de base de données sur "}. {"Database","Base de données"}. {"December","Décembre"}. {"Default users as participants","Les utilisateurs sont participant par défaut"}. +{"Delete content","Supprimer le contenu"}. {"Delete message of the day on all hosts","Supprimer le message du jour sur tous les domaines"}. {"Delete message of the day","Supprimer le message du jour"}. {"Delete Selected","Suppression des éléments sélectionnés"}. +{"Delete table","Supprimer la table"}. {"Delete User","Supprimer l'utilisateur"}. {"Deliver event notifications","Envoyer les notifications d'événement"}. {"Deliver payloads with event notifications","Inclure le contenu du message avec la notification"}. {"Description:","Description :"}. {"Disc only copy","Copie sur disque uniquement"}. +{"'Displayed groups' not added (they do not exist!): ","« Groupes affichés » non ajoutés (ils n’existent pas !) : "}. {"Displayed:","Affichés :"}. +{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Ne révélez votre mot de passe à personne, pas même aux administrateurs du serveur XMPP."}. {"Dump Backup to Text File at ","Enregistrer la sauvegarde dans un fichier texte sur "}. {"Dump to Text File","Sauvegarder dans un fichier texte"}. +{"Duplicated groups are not allowed by RFC6121","Les groupes dupliqués ne sont pas autorisés par la RFC6121"}. +{"Dynamically specify a replyto of the item publisher","Spécifie dynamiquement un « réponse à » de l’item de l’éditeur"}. {"Edit Properties","Modifier les propriétés"}. {"Either approve or decline the voice request.","Accepter ou refuser la demande de voix."}. {"ejabberd MUC module","Module MUC ejabberd"}. @@ -116,6 +157,7 @@ {"Failed to parse HTTP response","Échec de lecture de la réponse HTTP"}. {"Failed to process option '~s'","Échec de traitement de l'option '~s'"}. {"Family Name","Nom de famille"}. +{"FAQ Entry","Entrée FAQ"}. {"February","Février"}. {"File larger than ~w bytes","Taille de fichier suppérieur à ~w octets"}. {"Fill in the form to search for any matching XMPP User","Complétez le formulaire pour rechercher un utilisateur XMPP correspondant"}. @@ -176,6 +218,7 @@ {"July","Juillet"}. {"June","Juin"}. {"Just created","Vient d'être créé"}. +{"Label:","Étiquette :"}. {"Last Activity","Dernière activité"}. {"Last login","Dernière connexion"}. {"Last month","Dernier mois"}. @@ -192,7 +235,6 @@ {"Make room public searchable","Rendre le salon public"}. {"Malformed username","Nom d'utilisateur invalide"}. {"March","Mars"}. -{"Max # of items to persist","Nombre maximum d'éléments à stocker"}. {"Max payload size in bytes","Taille maximum pour le contenu du message en octet"}. {"Maximum file size","Taille maximale du fichier"}. {"Maximum Number of History Messages Returned by Room","Nombre maximal de messages d'historique renvoyés par salle"}. @@ -274,6 +316,7 @@ {"Online Users:","Utilisateurs connectés :"}. {"Online Users","Utilisateurs en ligne"}. {"Online","En ligne"}. +{"Only admins can see this","Seuls les administrateurs peuvent voir cela"}. {"Only deliver notifications to available users","Envoyer les notifications uniquement aux utilisateurs disponibles"}. {"Only or tags are allowed","Seul le tag ou est autorisé"}. {"Only element is allowed in this query","Seul l'élément est autorisé dans cette requête"}. @@ -283,6 +326,7 @@ {"Only moderators can approve voice requests","Seuls les modérateurs peuvent accépter les requêtes voix"}. {"Only occupants are allowed to send messages to the conference","Seuls les occupants peuvent envoyer des messages à la conférence"}. {"Only occupants are allowed to send queries to the conference","Seuls les occupants sont autorisés à envoyer des requêtes à la conférence"}. +{"Only publishers may publish","Seuls les éditeurs peuvent publier"}. {"Only service administrators are allowed to send service messages","Seuls les administrateurs du service sont autoriser à envoyer des messages de service"}. {"Organization Name","Nom de l'organisation"}. {"Organization Unit","Unité de l'organisation"}. @@ -290,6 +334,7 @@ {"Outgoing s2s Connections:","Connexions s2s sortantes :"}. {"Owner privileges required","Les droits de propriétaire sont nécessaires"}. {"Packet","Paquet"}. +{"Participant","Participant"}. {"Password Verification","Vérification du mot de passe"}. {"Password Verification:","Vérification du mot de passe :"}. {"Password","Mot de passe"}. @@ -323,6 +368,9 @@ {"Remove User","Supprimer l'utilisateur"}. {"Remove","Supprimer"}. {"Replaced by new connection","Remplacé par une nouvelle connexion"}. +{"Request has timed out","La demande a expiré"}. +{"Request is ignored","La demande est ignorée"}. +{"Requested role","Rôle demandé"}. {"Resources","Ressources"}. {"Restart Service","Redémarrer le service"}. {"Restart","Redémarrer"}. From 1915f29d4b76b189ff9259582d25df8a93303416 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 9 Dec 2021 10:44:57 +0100 Subject: [PATCH 102/440] Update Chinese translation (thanks to Eric and 52871299hzy) --- priv/msgs/zh.msg | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/priv/msgs/zh.msg b/priv/msgs/zh.msg index 8f099b608..a3a400afb 100644 --- a/priv/msgs/zh.msg +++ b/priv/msgs/zh.msg @@ -4,7 +4,7 @@ %% https://docs.ejabberd.im/developer/extending-ejabberd/localization/ {" (Add * to the end of field to match substring)"," (在字段末添加*来匹配子串)"}. -{" has set the subject to: ","已将标题设置为: "}. +{" has set the subject to: "," 已将标题设置为: "}. {"# participants","# 个参与人"}. {"A description of the node","该节点的描述"}. {"A friendly name for the node","该节点的友好名称"}. @@ -23,7 +23,7 @@ {"Add Jabber ID","添加Jabber ID"}. {"Add New","添加新用户"}. {"Add User","添加用户"}. -{"Administration of ","管理"}. +{"Administration of ","管理 "}. {"Administration","管理"}. {"Administrator privileges required","需要管理员权限"}. {"All activity","所有活动"}. @@ -62,7 +62,7 @@ {"Automatic node creation is not enabled","未启用自动节点创建"}. {"Backup Management","备份管理"}. {"Backup of ~p","~p的备份"}. -{"Backup to File at ","备份文件位于"}. +{"Backup to File at ","备份文件位于 "}. {"Backup","备份"}. {"Bad format","格式错误"}. {"Birthday","出生日期"}. @@ -102,7 +102,7 @@ {"Current Discussion Topic","当前讨论话题"}. {"Database failure","数据库失败"}. {"Database Tables at ~p","位于~p的数据库表"}. -{"Database Tables Configuration at ","数据库表格配置位于"}. +{"Database Tables Configuration at ","数据库表格配置位于 "}. {"Database","数据库"}. {"December","十二月"}. {"Default users as participants","用户默认被视为参与人"}. @@ -119,12 +119,12 @@ {"'Displayed groups' not added (they do not exist!): ","'显示的群组' 未被添加 (它们不存在!): "}. {"Displayed:","已显示:"}. {"Don't tell your password to anybody, not even the administrators of the XMPP server.","不要将密码告诉任何人, 就算是XMPP服务器的管理员也不可以."}. -{"Dump Backup to Text File at ","转储备份到文本文件于"}. +{"Dump Backup to Text File at ","将备份转储到位于以下位置的文本文件 "}. {"Dump to Text File","转储到文本文件"}. {"Duplicated groups are not allowed by RFC6121","按照RFC6121的规则,不允许有重复的群组"}. {"Dynamically specify a replyto of the item publisher","为项目发布者动态指定一个 replyto"}. {"Edit Properties","编辑属性"}. -{"Either approve or decline the voice request.","接受或拒绝声音请求"}. +{"Either approve or decline the voice request.","接受或拒绝声音请求."}. {"ejabberd HTTP Upload service","ejabberd HTTP 上传服务"}. {"ejabberd MUC module","ejabberd MUC 模块"}. {"ejabberd Multicast service","ejabberd多重映射服务"}. @@ -194,10 +194,10 @@ {"Import Directory","导入目录"}. {"Import File","导入文件"}. {"Import user data from jabberd14 spool file:","从 jabberd14 Spool 文件导入用户数据:"}. -{"Import User from File at ","导入用户的文件位于"}. +{"Import User from File at ","从以下位置的文件导入用户 "}. {"Import users data from a PIEFXIS file (XEP-0227):","从 PIEFXIS 文件 (XEP-0227) 导入用户数据:"}. {"Import users data from jabberd14 spool directory:","从jabberd14 Spool目录导入用户数据:"}. -{"Import Users from Dir at ","导入用户的目录位于"}. +{"Import Users from Dir at ","从以下位置目录导入用户 "}. {"Import Users From jabberd14 Spool Files","从 jabberd14 Spool 文件导入用户"}. {"Improper domain part of 'from' attribute","不恰当的'from'属性域名部分"}. {"Improper message type","不恰当的消息类型"}. @@ -249,7 +249,6 @@ {"Malformed username","用户名无效"}. {"MAM preference modification denied by service policy","MAM偏好被服务策略拒绝"}. {"March","三月"}. -{"Max # of items to persist","允许持久化的最大内容条目数"}. {"Max payload size in bytes","最大有效负载字节数"}. {"Maximum file size","最大文件大小"}. {"Maximum Number of History Messages Returned by Room","房间返回的历史消息最大值"}. @@ -288,7 +287,7 @@ {"Never","从未"}. {"New Password:","新密码:"}. {"Nickname can't be empty","昵称不能为空"}. -{"Nickname Registration at ","昵称注册于"}. +{"Nickname Registration at ","昵称注册于 "}. {"Nickname ~s does not exist in the room","昵称~s不在该房间"}. {"Nickname","昵称"}. {"No address elements found","没有找到地址的各元素"}. @@ -326,6 +325,7 @@ {"Node ~p","节点~p"}. {"Nodeprep has failed","Nodeprep 已失效"}. {"Nodes","节点"}. +{"Node","节点"}. {"None","无"}. {"Not allowed","不允许"}. {"Not Found","没有找到"}. @@ -339,7 +339,6 @@ {"Number of Offline Messages","离线消息数量"}. {"Number of online users","在线用户数"}. {"Number of registered users","注册用户数"}. -{"Number of seconds after which to automatically purge items","自动清除项目要等待的秒数"}. {"Occupants are allowed to invite others","允许成员邀请其他人"}. {"Occupants May Change the Subject","成员可以修改主题"}. {"October","十月"}. @@ -428,7 +427,7 @@ {"Resources","资源"}. {"Restart Service","重启服务"}. {"Restart","重启"}. -{"Restore Backup from File at ","要恢复的备份文件位于"}. +{"Restore Backup from File at ","从以下位置的文件恢复备份 "}. {"Restore binary backup after next ejabberd restart (requires less memory):","在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"}. {"Restore binary backup immediately:","立即恢复二进制备份:"}. {"Restore plain text backup immediately:","立即恢复普通文本备份:"}. @@ -455,7 +454,7 @@ {"Search Results for ","搜索结果属于关键词 "}. {"Search the text","搜索文本"}. {"Search until the date","搜索截至日期"}. -{"Search users in ","搜索用户于"}. +{"Search users in ","在以下位置搜索用户 "}. {"Select All","全选"}. {"Send announcement to all online users on all hosts","发送通知给所有主机的在线用户"}. {"Send announcement to all online users","发送通知给所有在线用户"}. @@ -519,7 +518,6 @@ {"The JIDs of those with an affiliation of owner","隶属所有人的JID"}. {"The JIDs of those with an affiliation of publisher","隶属发布人的JID"}. {"The list of JIDs that may associate leaf nodes with a collection","可以将叶节点与集合关联的JID列表"}. -{"The maximum number of child nodes that can be associated with a collection","可以与集合关联的最大子节点数"}. {"The minimum number of milliseconds between sending any two notification digests","发送任何两个通知摘要之间的最小毫秒数"}. {"The name of the node","该节点的名称"}. {"The node is a collection node","该节点是集合节点"}. @@ -544,13 +542,12 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","节点数据的类型, 如果有, 通常由有效负载的名称空间指定"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","XSL转换的URL,可以将其应用于有效负载以生成适当的消息正文元素。"}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","XSL转换的URL, 可以将其应用于有效负载格式, 以生成有效的数据表单结果, 客户端可以使用通用数据表单呈现引擎来显示该结果"}. -{"The username is not valid","用户名无效"}. {"There was an error changing the password: ","修改密码出错: "}. {"There was an error creating the account: ","帐户创建出错: "}. {"There was an error deleting the account: ","帐户删除失败: "}. {"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","此处不区分大小写: macbeth 与 MacBeth 和 Macbeth 是一样的."}. {"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","本页面允许在此服务器上注册XMPP帐户. 你的JID (Jabber ID) 的形式如下: 用户名@服务器. 请仔细阅读说明并正确填写相应字段."}. -{"This page allows to unregister an XMPP account in this XMPP server.","此页面允许在此XMPP服务器上注销XMPP帐户"}. +{"This page allows to unregister an XMPP account in this XMPP server.","此页面允许在此 XMPP 服务器上注销 XMPP 帐户。"}. {"This room is not anonymous","此房间不是匿名房间"}. {"This service can not process the address: ~s","此服务无法处理地址: ~s"}. {"Thursday","星期四"}. @@ -565,7 +562,7 @@ {"Too many child elements","太多子元素"}. {"Too many elements","太多 元素"}. {"Too many elements","太多 元素"}. -{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","来自IP地址(~p)的(~s)失败认证太多. 该地址将在UTC时间~s被禁用."}. +{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","来自IP地址(~p)的(~s)失败认证太多。将在UTC时间 ~s 解除对该地址的封锁"}. {"Too many receiver fields were specified","指定的接收者字段太多"}. {"Too many unacked stanzas","未被确认的节太多"}. {"Too many users in this conference","该会议的用户太多"}. @@ -656,7 +653,7 @@ {"You need a client that supports x:data to register the nickname","您需要一个支持 x:data 的客户端来注册昵称"}. {"You need an x:data capable client to search","您需要一个兼容 x:data 的客户端来搜索"}. {"Your active privacy list has denied the routing of this stanza.","你的活跃私聊列表拒绝了在此房间进行路由分发."}. -{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满. 消息已被丢弃"}. +{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满。消息已被丢弃。"}. {"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","您发送给~s的消息已被阻止. 要解除阻止, 请访问 ~s"}. {"Your XMPP account was successfully registered.","你的XMPP帐户注册成功."}. {"Your XMPP account was successfully unregistered.","你的XMPP帐户注销成功."}. From ed5ba1f645fcac53b236b90238ecd81be32d6d8b Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 9 Dec 2021 11:07:43 +0100 Subject: [PATCH 103/440] Update CHANGELOG.md to 21.12 --- CHANGELOG.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13385b864..288931b5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,50 @@ +# Version 21.12 + +Commands +- `create_room_with_opts`: Fixed when using SQL storage +- `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options` +- piefxis: Fixed arguments of all commands + +Modules +- mod_caps: Don't forget caps on XEP-0198 resumption +- mod_conversejs: New module to serve a simple page for Converse.js +- mod_http_upload_quota: Avoid `max_days` race +- mod_muc: Support MUC hats (XEP-0317, conversejs/prosody compatible) +- mod_muc: Optimize MucSub processing +- mod_muc: Fix exception in mucsub {un}subscription events multicast handler +- mod_multicast: Improve and optimize multicast routing code +- mod_offline: Allow storing non-composing x:events in offline +- mod_ping: Send ping from server, not bare user JID +- mod_push: Fix handling of MUC/Sub messages +- mod_register: New allow_modules option to restrict registration modules +- mod_register_web: Handle unknown host gracefully +- mod_register_web: Use mod_register configured restrictions + +PubSub +- Add `delete_expired_pubsub_items` command +- Add `delete_old_pubsub_items` command +- Optimize publishing on large nodes (SQL) +- Support unlimited number of items +- Support `max_items=max` node configuration +- Bump default value for `max_items` limit from 10 to 1000 +- Use configured `max_items` by default +- node_flat: Avoid catch-all clauses for RSM +- node_flat_sql: Avoid catch-all clauses for RSM + +SQL +- Use `INSERT ... ON CONFLICT` in SQL_UPSERT for PostgreSQL >= 9.5 +- mod_mam export: assign MUC entries to the MUC service +- MySQL: Fix typo when creating index +- PgSQL: Add SASL auth support, PostgreSQL 14 +- PgSQL: Add missing SQL migration for table `push_session` +- PgSQL: Fix `vcard_search` definition in pgsql new schema + +Other +- `captcha-ng.sh`: "sort -R" command not POSIX, added "shuf" and "cat" as fallback +- Make s2s connection table cleanup more robust +- Update export/import of scram password to XEP-0227 1.1 +- Update Jose to 1.11.1 (the last in hex.pm correctly versioned) + # Version 21.07 Compilation From a94209a0e0de882e112400bf24c0a5721b8ae520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 9 Dec 2021 12:13:42 +0100 Subject: [PATCH 104/440] Update stun and esip dependencies --- mix.lock | 4 ++-- rebar.config | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mix.lock b/mix.lock index 773cc2bbf..d0edb619d 100644 --- a/mix.lock +++ b/mix.lock @@ -6,7 +6,7 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.17", "6f3c7e94170377ba45241d394389e800fb15adc5de51d0a3cd52ae766aafd63f", [:mix], [], "hexpm", "f93ac89c9feca61c165b264b5837bf82344d13bebc634cd575cb711e2e342023"}, "eimp": {:hex, :eimp, "1.0.21", "2e918a5dc9a1959ef8713a2360499e3baeee64cfd7881bd9d1f361ca9ddf07e8", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "998f58538f58aa0cff103414994d7ce56dc253e6576cd6fb40c1ead64aa73a28"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, - "esip": {:hex, :esip, "1.0.44", "dcf3a92e581210ab161d8a8201245df5a56058460b08d89cf3193d944adff71e", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.45", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "ea2086a1de95fe48f40b78251f74a6828799e318c55da346934e7d4fea675f04"}, + "esip": {:hex, :esip, "1.0.45", "2f21fb9750f7a505e6bbd43f6d48b0e879b808aba6c2224686c83f2bcd7a34bf", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.47", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "1f1eae69f2bd8d75f42c048409eabb4e3dc71ab6412fc5d998edbdade6ad5f75"}, "ex_doc": {:hex, :ex_doc, "0.26.0", "1922164bac0b18b02f84d6f69cab1b93bc3e870e2ad18d5dacb50a9e06b542a3", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2775d66e494a9a48355db7867478ffd997864c61c65a47d31c4949459281c78d"}, "ezlib": {:hex, :ezlib, "1.0.10", "c1c24eb18944cfde55f0574e9922d5b0392fa864282f769f82b2ea15e54f6003", [:rebar3], [], "hexpm", "1d317f1d85373686199eb3b4164d3477e95033ac68e45a95ba18e7b7a8c23241"}, "fast_tls": {:hex, :fast_tls, "1.1.13", "828cdc75e1e8fce8158846d2b971d8b4fe2b2ddcc75b759e88d751079bf78afd", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d1f422af40c7777fe534496f508ee86515cb929ad10f7d1d56aa94ce899b44a0"}, @@ -29,7 +29,7 @@ "p1_utils": {:hex, :p1_utils, "1.0.23", "7f94466ada69bd982ea7bb80fbca18e7053e7d0b82c9d9e37621fa508587069b", [:rebar3], [], "hexpm", "47f21618694eeee5006af1c88731ad86b757161e7823c29b6f73921b571c8502"}, "pkix": {:hex, :pkix, "1.0.8", "98ea05243847fd4504f7c7a0cd82cecd1010ac327a082e1c674c5384006eae75", [:rebar3], [], "hexpm", "399508819501fab9d2e586dfa601b5ee3ef22b5612d3db58204dd2d089ef45d7"}, "stringprep": {:hex, :stringprep, "1.0.27", "02808c7024bc6285ca6a8a67e7addfc16f35dda55551a582c5181d8ea960e890", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a5967b1144ca8002a58a03d16dd109fbd0bcdb82616cead2f983944314af6a00"}, - "stun": {:hex, :stun, "1.0.45", "3363fd4911f408c712c48baa3811548768dcd49a6c30d8f3c54c119bbbacd3ea", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "89774eb5500d5360dc0c1d0504b34afa891f91c807637309c449841ae91f7818"}, + "stun": {:hex, :stun, "1.0.47", "fae94c0dc7415263297e8f07f286f3355d327d8bf78b1b0743c9a5a492381f71", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "377d8487f4add85f6bc6ecdebdb4dcbcbe890e9462f27d6d31f3db1cf9b2cc9b"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, "xmpp": {:hex, :xmpp, "1.5.6", "09259177a39c880d682817932f4da0537c471160fd43aa891ea9cb71cf827b52", [:rebar3], [{:ezlib, "1.0.10", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.48", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.27", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "59b7317c4077d3384f9a891e0517a591cdbd44a323260b835eafbede4f4eb12e"}, "yconf": {:hex, :yconf, "1.0.12", "78c119d39bb805207fcb7671cb884805d75ee89c9ec98632b678f90a597dee2c", [:rebar3], [{:fast_yaml, "1.0.32", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "12faa51c281e95bcb6abf185fd034a242209621a7bb04b6cc411c867b192e207"}, diff --git a/rebar.config b/rebar.config index 774c3af67..179052d1c 100644 --- a/rebar.config +++ b/rebar.config @@ -30,7 +30,7 @@ {if_var_true, redis, {eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}}, {if_var_true, sip, - {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.44"}}}}, + {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.45"}}}}, {if_var_true, zlib, {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.10"}}}}, {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.13"}}}, @@ -58,7 +58,7 @@ {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, {if_var_true, stun, - {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.45"}}}}, + {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.47"}}}}, {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.6"}}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. From 8b7da70b57096d5c88c4128877e8802a12057bd4 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Tue, 14 Dec 2021 09:54:00 +0300 Subject: [PATCH 105/440] Handle user removal in mod_muc --- sql/lite.new.sql | 1 + sql/lite.sql | 1 + sql/mssql.sql | 1 + sql/mysql.new.sql | 1 + sql/mysql.sql | 1 + sql/pg.new.sql | 1 + sql/pg.sql | 1 + src/mod_muc.erl | 39 +++++++++++++++++++++++++++++++++++++++ src/mod_muc_opt.erl | 7 +++++++ src/mod_muc_room.erl | 20 +++++++++++++++++++- src/mod_muc_sql.erl | 9 ++++++++- 11 files changed, 80 insertions(+), 2 deletions(-) diff --git a/sql/lite.new.sql b/sql/lite.new.sql index 96c880358..cb8add8a1 100644 --- a/sql/lite.new.sql +++ b/sql/lite.new.sql @@ -330,6 +330,7 @@ CREATE TABLE muc_room_subscribers ( ); CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid); +CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers(jid); CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid); CREATE TABLE motd ( diff --git a/sql/lite.sql b/sql/lite.sql index 087035d7f..56e8c9151 100644 --- a/sql/lite.sql +++ b/sql/lite.sql @@ -302,6 +302,7 @@ CREATE TABLE muc_room_subscribers ( ); CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid); +CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers(jid); CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid); CREATE TABLE motd ( diff --git a/sql/mssql.sql b/sql/mssql.sql index bb7861527..f8b65edc4 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -150,6 +150,7 @@ CREATE TABLE [dbo].[muc_room_subscribers] ( CREATE UNIQUE CLUSTERED INDEX [muc_room_subscribers_host_room_jid] ON [muc_room_subscribers] (host, room, jid); CREATE INDEX [muc_room_subscribers_host_jid] ON [muc_room_subscribers] (host, jid); +CREATE INDEX [muc_room_subscribers_jid] ON [muc_room_subscribers] (jid); CREATE TABLE [dbo].[privacy_default_list] ( [username] [varchar] (250) NOT NULL, diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql index 01aeffbc5..c4e021abf 100644 --- a/sql/mysql.new.sql +++ b/sql/mysql.new.sql @@ -347,6 +347,7 @@ CREATE TABLE muc_room_subscribers ( ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid); +CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid); CREATE TABLE motd ( username varchar(191) NOT NULL, diff --git a/sql/mysql.sql b/sql/mysql.sql index 7feaf5d0a..751552e19 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -319,6 +319,7 @@ CREATE TABLE muc_room_subscribers ( ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid); +CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid); CREATE TABLE motd ( username varchar(191) PRIMARY KEY, diff --git a/sql/pg.new.sql b/sql/pg.new.sql index 6a0743f23..5ffbedde3 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -495,6 +495,7 @@ CREATE TABLE muc_room_subscribers ( ); CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid); +CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers USING btree (jid); CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid); CREATE TABLE motd ( diff --git a/sql/pg.sql b/sql/pg.sql index 0e3d4c8b8..733856ede 100644 --- a/sql/pg.sql +++ b/sql/pg.sql @@ -320,6 +320,7 @@ CREATE TABLE muc_room_subscribers ( ); CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid); +CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers USING btree (jid); CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid); CREATE TABLE motd ( diff --git a/src/mod_muc.erl b/src/mod_muc.erl index b2ebc5c61..2853632cc 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -69,6 +69,7 @@ get_online_rooms_by_user/3, can_use_nick/4, get_subscribed_rooms/2, + remove_user/2, procname/2, route/1, unhibernate_room/3]). @@ -122,6 +123,8 @@ start(Host, Opts) -> case mod_muc_sup:start(Host) of {ok, _} -> + ejabberd_hooks:add(remove_user, Host, ?MODULE, + remove_user, 50), MyHosts = gen_mod:get_opt_hosts(Opts), Mod = gen_mod:db_mod(Opts, ?MODULE), RMod = gen_mod:ram_db_mod(Opts, ?MODULE), @@ -133,6 +136,8 @@ start(Host, Opts) -> end. stop(Host) -> + ejabberd_hooks:delete(remove_user, Host, ?MODULE, + remove_user, 50), Proc = mod_muc_sup:procname(Host), supervisor:terminate_child(ejabberd_gen_mod_sup, Proc), supervisor:delete_child(ejabberd_gen_mod_sup, Proc). @@ -1122,6 +1127,32 @@ count_online_rooms(ServerHost, Host) -> RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE), RMod:count_online_rooms(ServerHost, Host). +-spec remove_user(binary(), binary()) -> ok. +remove_user(User, Server) -> + LUser = jid:nodeprep(User), + LServer = jid:nameprep(Server), + Mod = gen_mod:db_mod(LServer, ?MODULE), + case erlang:function_exported(Mod, remove_user, 2) of + true -> + Mod:remove_user(LUser, LServer); + false -> + ok + end, + JID = jid:make(User, Server), + lists:foreach( + fun(Host) -> + lists:foreach( + fun({_, _, Pid}) -> + mod_muc_room:change_item( + Pid, JID, affiliation, none, <<"User removed">>), + mod_muc_room:change_item( + Pid, JID, role, none, <<"User removed">>) + end, + get_online_rooms(LServer, Host)) + end, + gen_mod:get_module_opt_hosts(LServer, mod_muc)), + ok. + opts_to_binary(Opts) -> lists:map( fun({title, Title}) -> @@ -1225,6 +1256,8 @@ mod_opt_type(user_message_shaper) -> econf:atom(); mod_opt_type(user_presence_shaper) -> econf:atom(); +mod_opt_type(cleanup_affiliations_on_start) -> + econf:bool(); mod_opt_type(default_room_options) -> econf:options( #{allow_change_subj => econf:bool(), @@ -1302,6 +1335,7 @@ mod_options(Host) -> {preload_rooms, true}, {hibernation_timeout, infinity}, {vcard, undefined}, + {cleanup_affiliations_on_start, false}, {default_room_options, [{allow_change_subj,true}, {allow_private_messages,true}, @@ -1580,6 +1614,11 @@ mod_doc() -> " -", " work: true", " street: Elm Street"]}]}}, + {cleanup_affiliations_on_start, + #{value => "true | false", + desc => + ?T("Remove affiliations for non-existing local users on startup. " + "The default value is 'false'.")}}, {default_room_options, #{value => ?T("Options"), desc => diff --git a/src/mod_muc_opt.erl b/src/mod_muc_opt.erl index 760a5d7c8..4b9e8b806 100644 --- a/src/mod_muc_opt.erl +++ b/src/mod_muc_opt.erl @@ -9,6 +9,7 @@ -export([access_mam/1]). -export([access_persistent/1]). -export([access_register/1]). +-export([cleanup_affiliations_on_start/1]). -export([db_type/1]). -export([default_room_options/1]). -export([hibernation_timeout/1]). @@ -73,6 +74,12 @@ access_register(Opts) when is_map(Opts) -> access_register(Host) -> gen_mod:get_module_opt(Host, mod_muc, access_register). +-spec cleanup_affiliations_on_start(gen_mod:opts() | global | binary()) -> boolean(). +cleanup_affiliations_on_start(Opts) when is_map(Opts) -> + gen_mod:get_opt(cleanup_affiliations_on_start, Opts); +cleanup_affiliations_on_start(Host) -> + gen_mod:get_module_opt(Host, mod_muc, cleanup_affiliations_on_start). + -spec db_type(gen_mod:opts() | global | binary()) -> atom(). db_type(Opts) when is_map(Opts) -> gen_mod:get_opt(db_type, Opts); diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index e8b0d1bce..ec1c551e4 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -306,7 +306,8 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts, QueueType]) room_shaper = Shaper}), add_to_log(room_existence, started, State), ejabberd_hooks:run(start_room, ServerHost, [ServerHost, Room, Host]), - {ok, normal_state, reset_hibernate_timer(State)}. + State1 = cleanup_affiliations(State), + {ok, normal_state, reset_hibernate_timer(State1)}. normal_state({route, <<"">>, #message{from = From, type = Type, lang = Lang} = Packet}, @@ -5337,6 +5338,23 @@ muc_subscribers_put(Subscriber, MUCSubscribers) -> subscriber_nodes = NewSubNodes}. +cleanup_affiliations(State) -> + case mod_muc_opt:cleanup_affiliations_on_start(State#state.server_host) of + true -> + Affiliations = + maps:filter( + fun({LUser, LServer, _}, _) -> + case ejabberd_router:is_my_host(LServer) of + true -> + ejabberd_auth:user_exists(LUser, LServer); + false -> + true + end + end, State#state.affiliations), + State#state{affiliations = Affiliations}; + false -> + State + end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Detect messange stanzas that don't have meaningful content diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index 1310cde7b..8aa7ad62b 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -38,7 +38,7 @@ register_online_user/4, unregister_online_user/4, count_online_rooms_by_user/3, get_online_rooms_by_user/3, get_subscribed_rooms/3, get_rooms_without_subscribers/2, - find_online_room_by_pid/2]). + find_online_room_by_pid/2, remove_user/2]). -export([set_affiliation/6, set_affiliations/4, get_affiliation/5, get_affiliations/3, search_affiliation/4]). @@ -465,6 +465,13 @@ get_subscribed_rooms(LServer, Host, Jid) -> {error, db_failure} end. +remove_user(LUser, LServer) -> + SJID = jid:encode(jid:make(LUser, LServer)), + ejabberd_sql:sql_query( + LServer, + ?SQL("delete from muc_room_subscribers where jid=%(SJID)s")), + ok. + %%%=================================================================== %%% Internal functions %%%=================================================================== From 7e07cba406c46b2a682031a8a530425e8ecb5a1a Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 13 Dec 2021 18:22:59 +0100 Subject: [PATCH 106/440] Let get_all_rooms handle "global" argument, fixes rooms_unsued_... (#3726) --- src/mod_muc_admin.erl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index ce4665d7e..9952abd27 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -860,7 +860,14 @@ get_online_rooms(ServiceArg) -> || {RoomName, RoomHost, Pid} <- mod_muc:get_online_rooms(Host)] end, Hosts). -get_all_rooms(Host) -> +get_all_rooms(ServiceArg) -> + Hosts = find_services(ServiceArg), + lists:flatmap( + fun(Host) -> + get_all_rooms2(Host) + end, Hosts). + +get_all_rooms2(Host) -> ServerHost = ejabberd_router:host_of_route(Host), OnlineRooms = get_online_rooms(Host), OnlineMap = lists:foldl( From 24742031e943cd589c3a8e0d47901288678e7145 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 13 Dec 2021 13:48:26 +0100 Subject: [PATCH 107/440] Revert "Github Actions: use MD5 pass encryption to support PostgreSQL 14 (#3691)" This workaround is not needed anymore, thanks to p1_pgsql 3bf645b, included in p1_pgsql 1.1.13, and used in ejabberd 21.12. This reverts commit 964cb3aacab94fcf88f4a445fcf9bc6b414b35fc. --- .github/workflows/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45a88eda9..08a6e4380 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,8 +52,6 @@ jobs: - name: Prepare databases run: | - sudo sed -i 's|#password_encryption.*|password_encryption = md5|g' /etc/postgresql/14/main/postgresql.conf - sudo sed -i 's|scram-sha-256|md5|g' /etc/postgresql/14/main/pg_hba.conf sudo systemctl start mysql.service sudo systemctl start postgresql.service mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost' From 42bdb501caf7039f71f3a26ae447db3bffaecb0a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 18 Dec 2021 17:50:26 +0100 Subject: [PATCH 108/440] mod_stun_disco: Fix parsing of IPv6 listeners Don't crash if `mod_stun_disco` is used with `offer_local_services` and an IPv6 listener has an explicit `ip:` address configured. Thanks to Daniel Kenzelmann for reporting the issue. --- src/mod_stun_disco.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_stun_disco.erl b/src/mod_stun_disco.erl index 6e7592453..cbb671639 100644 --- a/src/mod_stun_disco.erl +++ b/src/mod_stun_disco.erl @@ -646,7 +646,7 @@ get_listener_ips(#{ip := {0, 0, 0, 0, 0, 0, 0, 1}} = Opts) -> {undefined, get_turn_ipv6_addr(Opts)}; get_listener_ips(#{ip := {_, _, _, _} = IP}) -> {IP, undefined}; -get_listener_ips(#{ip := {_, _, _, _, _,_, _, _, _} = IP}) -> +get_listener_ips(#{ip := {_, _, _, _, _, _, _, _} = IP}) -> {undefined, IP}. -spec get_turn_ipv4_addr(map()) -> inet:ip4_address() | undefined. From 7196f46730b233dcdc4d8eabfcdf2fd4104b2041 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 19 Dec 2021 21:06:33 +0100 Subject: [PATCH 109/440] node_pep: Add config-node and multi-items features Fixes #3714. --- src/node_pep.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/node_pep.erl b/src/node_pep.erl index a30f8cb91..66431b948 100644 --- a/src/node_pep.erl +++ b/src/node_pep.erl @@ -81,10 +81,12 @@ features() -> [<<"create-nodes">>, <<"auto-create">>, <<"auto-subscribe">>, + <<"config-node">>, <<"delete-nodes">>, <<"delete-items">>, <<"filtered-notifications">>, <<"modify-affiliations">>, + <<"multi-items">>, <<"outcast-affiliation">>, <<"persistent-items">>, <<"publish">>, From 536beedeb66e6a54ea3631e09a441395f4b11527 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 20 Dec 2021 09:29:42 +0300 Subject: [PATCH 110/440] Accept more types of ejabberdctl commands arguments as JSON-encoded --- src/ejabberd_ctl.erl | 6 +++++- src/mod_http_api.erl | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 354e5ba2f..77595cd54 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -378,7 +378,11 @@ format_arg("", string) -> format_arg(Arg, string) -> NumChars = integer_to_list(length(Arg)), Parse = "~" ++ NumChars ++ "c", - format_arg2(Arg, Parse). + format_arg2(Arg, Parse); +format_arg(Arg, Format) -> + S = unicode:characters_to_binary(Arg, utf8), + JSON = jiffy:decode(S), + mod_http_api:format_arg(JSON, Format). format_arg2(Arg, Parse)-> {ok, [Arg2], _RemainingArguments} = io_lib:fread(Parse, Arg), diff --git a/src/mod_http_api.erl b/src/mod_http_api.erl index 427833584..023df39ca 100644 --- a/src/mod_http_api.erl +++ b/src/mod_http_api.erl @@ -30,6 +30,7 @@ -behaviour(gen_mod). -export([start/2, stop/1, reload/3, process/2, depends/2, + format_arg/2, mod_options/1, mod_doc/0]). -include_lib("xmpp/include/xmpp.hrl"). From a26c9d2475beaa9398d8815f861ed0b1025edc58 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 20 Dec 2021 09:31:01 +0300 Subject: [PATCH 111/440] Optimize user removal handling in mod_muc --- src/mod_muc.erl | 4 ++-- src/mod_muc_room.erl | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 2853632cc..72f386b00 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1143,9 +1143,9 @@ remove_user(User, Server) -> fun(Host) -> lists:foreach( fun({_, _, Pid}) -> - mod_muc_room:change_item( + mod_muc_room:change_item_async( Pid, JID, affiliation, none, <<"User removed">>), - mod_muc_room:change_item( + mod_muc_room:change_item_async( Pid, JID, role, none, <<"User removed">>) end, get_online_rooms(LServer, Host)) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index ec1c551e4..25bc7d8b6 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -50,6 +50,7 @@ set_config/2, get_state/1, change_item/5, + change_item_async/5, config_reloaded/1, subscribe/4, unsubscribe/2, @@ -202,6 +203,11 @@ change_item(Pid, JID, Type, AffiliationOrRole, Reason) -> {error, notfound} end. +-spec change_item_async(pid(), jid(), affiliation | role, affiliation() | role(), binary()) -> ok. +change_item_async(Pid, JID, Type, AffiliationOrRole, Reason) -> + p1_fsm:send_all_state_event( + Pid, {process_item_change, {JID, Type, AffiliationOrRole, Reason}, undefined}). + -spec get_state(pid()) -> {ok, state()} | {error, notfound | timeout}. get_state(Pid) -> try p1_fsm:sync_send_all_state_event(Pid, get_state) @@ -675,6 +681,16 @@ handle_event({set_affiliations, Affiliations}, StateName, StateData) -> NewStateData = set_affiliations(Affiliations, StateData), {next_state, StateName, NewStateData}; +handle_event({process_item_change, Item, UJID}, StateName, StateData) -> + case process_item_change(Item, StateData, UJID) of + {error, _} -> + {next_state, StateName, StateData}; + StateData -> + {next_state, StateName, StateData}; + NSD -> + store_room(NSD), + {next_state, StateName, NSD} + end; handle_event(_Event, StateName, StateData) -> {next_state, StateName, StateData}. @@ -723,6 +739,8 @@ handle_sync_event({process_item_change, Item, UJID}, _From, StateName, StateData case process_item_change(Item, StateData, UJID) of {error, _} = Err -> {reply, Err, StateName, StateData}; + StateData -> + {reply, {ok, StateData}, StateName, StateData}; NSD -> store_room(NSD), {reply, {ok, NSD}, StateName, NSD} From fc34661b6f9fe8d506fcd51269c5cefe05c74350 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 20 Dec 2021 09:37:47 +0300 Subject: [PATCH 112/440] Add subscribe_room_many command --- src/mod_muc_admin.erl | 44 ++++++++++++++++++++++++++++++++++++--- src/mod_muc_admin_opt.erl | 13 ++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/mod_muc_admin_opt.erl diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 9952abd27..21611c585 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -40,8 +40,11 @@ change_room_option/4, get_room_options/2, set_room_affiliation/4, get_room_affiliations/2, get_room_affiliation/3, web_menu_main/2, web_page_main/2, web_menu_host/3, - subscribe_room/4, unsubscribe_room/2, get_subscribers/2, - web_page_host/3, mod_options/1, get_commands_spec/0, find_hosts/1]). + subscribe_room/4, subscribe_room_many/3, + unsubscribe_room/2, get_subscribers/2, + web_page_host/3, + mod_opt_type/1, mod_options/1, + get_commands_spec/0, find_hosts/1]). -include("logger.hrl"). -include_lib("xmpp/include/xmpp.hrl"). @@ -331,6 +334,25 @@ get_commands_spec() -> args = [{user, binary}, {nick, binary}, {room, binary}, {nodes, binary}], result = {nodes, {list, {node, string}}}}, + #ejabberd_commands{name = subscribe_room_many, tags = [muc_room], + desc = "Subscribe several users to a MUC conference", + module = ?MODULE, function = subscribe_room_many, + args_desc = ["Users JIDs and nicks", + "the room to subscribe", + "nodes separated by commas: ,"], + args_example = [[{"tom@localhost", "Tom"}, + {"jerry@localhost", "Jerry"}], + "room1@conference.localhost", + "urn:xmpp:mucsub:nodes:messages,urn:xmpp:mucsub:nodes:affiliations"], + args = [{users, {list, + {user, {tuple, + [{jid, binary}, + {nick, binary} + ]}} + }}, + {room, binary}, + {nodes, binary}], + result = {res, rescode}}, #ejabberd_commands{name = unsubscribe_room, tags = [muc_room], desc = "Unsubscribe from a MUC conference", module = ?MODULE, function = unsubscribe_room, @@ -1331,6 +1353,18 @@ subscribe_room(User, Nick, Room, Nodes) -> throw({error, "Malformed room JID"}) end. +subscribe_room_many(Users, Room, Nodes) -> + MaxUsers = mod_muc_admin_opt:subscribe_room_many_max_users(global), + if + length(Users) > MaxUsers -> + throw({error, "Too many users in subscribe_room_many command"}); + true -> + lists:foreach( + fun({User, Nick}) -> + subscribe_room(User, Nick, Room, Nodes) + end, Users) + end. + unsubscribe_room(User, Room) -> try jid:decode(Room) of #jid{luser = Name, lserver = Host} when Name /= <<"">> -> @@ -1413,7 +1447,11 @@ find_hosts(ServerHost) -> [] end. -mod_options(_) -> []. +mod_opt_type(subscribe_room_many_max_users) -> + econf:int(). + +mod_options(_) -> + [{subscribe_room_many_max_users, 50}]. mod_doc() -> #{desc => diff --git a/src/mod_muc_admin_opt.erl b/src/mod_muc_admin_opt.erl new file mode 100644 index 000000000..18ca64af7 --- /dev/null +++ b/src/mod_muc_admin_opt.erl @@ -0,0 +1,13 @@ +%% Generated automatically +%% DO NOT EDIT: run `make options` instead + +-module(mod_muc_admin_opt). + +-export([subscribe_room_many_max_users/1]). + +-spec subscribe_room_many_max_users(gen_mod:opts() | global | binary()) -> integer(). +subscribe_room_many_max_users(Opts) when is_map(Opts) -> + gen_mod:get_opt(subscribe_room_many_max_users, Opts); +subscribe_room_many_max_users(Host) -> + gen_mod:get_module_opt(Host, mod_muc_admin, subscribe_room_many_max_users). + From 0881c5941a638c065a92a2c72acbcbdb9891e01c Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 21 Dec 2021 00:01:17 +0100 Subject: [PATCH 113/440] rebar.config: Don't create extended start script We currently don't use the start script(s) generated by Relx. --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 179052d1c..dc89dc14e 100644 --- a/rebar.config +++ b/rebar.config @@ -178,7 +178,7 @@ {sys_config, "./rel/sys.config"}, {vm_args, "./rel/vm.args"}, {overlay_vars, "vars.config"}, - {extended_start_script, true}, + {extended_start_script, false}, {overlay, [{mkdir, "var/log/ejabberd"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, From aaa053829f6018a3a29ce2d340da7439f55dcdbf Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 23 Dec 2021 07:12:02 +0100 Subject: [PATCH 114/440] Revert "rebar.config: Don't create extended start script" This reverts commit 0881c5941a638c065a92a2c72acbcbdb9891e01c. The extended start had been enabled intentionally, as some commands (such as 'ping', 'status', or 'pid') actually do work. --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index dc89dc14e..179052d1c 100644 --- a/rebar.config +++ b/rebar.config @@ -178,7 +178,7 @@ {sys_config, "./rel/sys.config"}, {vm_args, "./rel/vm.args"}, {overlay_vars, "vars.config"}, - {extended_start_script, false}, + {extended_start_script, true}, {overlay, [{mkdir, "var/log/ejabberd"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, From 66bb4cbfa9277a01f8963b7f267062a2f7e4a550 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 23 Dec 2021 13:30:44 +0100 Subject: [PATCH 115/440] Only provide Relx start script in dev profile That script serves a similar purpose to ejabberdctl to start ejabberd, but we can't guarantee it is completely equivalent to ejabberdctl. The prod profile must provide only the well-known script. The test profile provides the Relx script so we can experiment with it. --- rebar.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 179052d1c..02993d899 100644 --- a/rebar.config +++ b/rebar.config @@ -178,7 +178,6 @@ {sys_config, "./rel/sys.config"}, {vm_args, "./rel/vm.args"}, {overlay_vars, "vars.config"}, - {extended_start_script, true}, {overlay, [{mkdir, "var/log/ejabberd"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, @@ -193,6 +192,7 @@ {dev_mode, false}, {include_erts, true}, {include_src, true}, + {generate_start_script, false}, {overlay, [{copy, "sql/*", "lib/ejabberd-\{\{release_version\}\}/priv/sql/"}, {copy, "ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg"}, {copy, "ejabberd.yml.example", "etc/ejabberd/ejabberd.yml"}]}]}]}, @@ -201,6 +201,8 @@ {dev_mode, true}, {include_erts, true}, {include_src, false}, + {generate_start_script, true}, + {extended_start_script, true}, {overlay, [{copy, "ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg.example"}, {copy, "ejabberd.yml.example", "etc/ejabberd/ejabberd.yml.example"}, {copy, "test/ejabberd_SUITE_data/ca.pem", "etc/ejabberd/"}, From 200a842cb07e06e8dea30cc6d2db0fe588bd2b72 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 21 Dec 2021 18:33:54 +0100 Subject: [PATCH 116/440] Configure shellcheck to test with sh POSIX script --- .shellcheckrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .shellcheckrc diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 000000000..96e22629d --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1 @@ +shell=sh From f88aa49913866ae75e33ee5926b28483ee1cda35 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Dec 2021 16:46:23 +0100 Subject: [PATCH 117/440] Give hint about what ejabberd.cfg.example sourcing --- .shellcheckrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.shellcheckrc b/.shellcheckrc index 96e22629d..f9feb7e4b 100644 --- a/.shellcheckrc +++ b/.shellcheckrc @@ -1 +1,3 @@ +external-sources=true +source=ejabberdctl.cfg.example shell=sh From 1b22368f6b579ce1502fb24a36a556b0633fa445 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 21 Dec 2021 18:03:45 +0100 Subject: [PATCH 118/440] In POSIX sh, OSTYPE is undefined. ejabberd doesn't work natively in win anyway --- ejabberdctl.template | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index 4cab19977..730bfcae9 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -128,14 +128,6 @@ exec_iex() # usage debugwarning() { - if [ "$OSTYPE" != "cygwin" ] && [ "$OSTYPE" != "win32" ] ; then - if [ "a$TERM" = "a" ] || [ "$TERM" = "dumb" ] ; then - echo "Terminal type not supported." - echo "You may have to set the TERM environment variable to fix this." - exit 8 - fi - fi - if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then echo "--------------------------------------------------------------------" echo "" From b5d8b224867699c59b45b79fa4ab8a130aa5ca1f Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 21 Dec 2021 18:09:18 +0100 Subject: [PATCH 119/440] In POSIX sh, RANDOM is undefined, use alternative --- ejabberdctl.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index 730bfcae9..7b7f25c51 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -198,8 +198,9 @@ help() uid() { uuid=$(uuidgen 2>/dev/null) + random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null) [ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid) - [ -z "$uuid" ] && uuid=$(printf "%X" "${RANDOM:-$$}$(date +%M%S)") + [ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)") uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/') [ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}" [ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}" From 46324385f25d6810e8781fedd7c68aca90d7df98 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 21 Dec 2021 18:23:55 +0100 Subject: [PATCH 120/440] SCRIPT_DIR is used by relx releases --- ejabberdctl.template | 1 + 1 file changed, 1 insertion(+) diff --git a/ejabberdctl.template b/ejabberdctl.template index 7b7f25c51..adbaffa62 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -105,6 +105,7 @@ export ERL_MAX_ETS_TABLES export CONTRIB_MODULES_PATH export CONTRIB_MODULES_CONF_DIR export ERL_LIBS +export SCRIPT_DIR # run command either directly or via su $INSTALLUSER exec_cmd() From 4deff0513c519c5dcbde196a8752f05062cea25a Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Dec 2021 13:17:31 +0100 Subject: [PATCH 121/440] Harmless warning, but let's prevent it anyway --- ejabberdctl.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index adbaffa62..c80d33da5 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -81,7 +81,7 @@ if [ -n "$INET_DIST_INTERFACE" ] ; then fi # if vm.args file exists in config directory, pass it to Erlang VM [ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" -ERL_LIBS={{libdir}} +ERL_LIBS='{{libdir}}' ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump ERL_INETRC="$ETC_DIR"/inetrc From fdc664a318e2b8e24ed197b70ba7c4471f9ec4f4 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Dec 2021 13:52:13 +0100 Subject: [PATCH 122/440] The read value is useless, so use throwaway variable name --- ejabberdctl.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index c80d33da5..cd2cc3c3e 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -146,7 +146,7 @@ debugwarning() echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:" echo " EJABBERD_BYPASS_WARNINGS=true" echo "Press return to continue" - read -r input + read -r _ echo "" fi } @@ -169,7 +169,7 @@ livewarning() echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:" echo " EJABBERD_BYPASS_WARNINGS=true" echo "Press return to continue" - read -r input + read -r _ echo "" fi } From cde089ce9c25a0029d52a970d587b979080fa7e2 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Dec 2021 16:46:41 +0100 Subject: [PATCH 123/440] Disable some shellcheck warnings --- .shellcheckrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.shellcheckrc b/.shellcheckrc index f9feb7e4b..0b7131a2e 100644 --- a/.shellcheckrc +++ b/.shellcheckrc @@ -1,3 +1,4 @@ +disable=SC2016,SC2086,SC2089,SC2090 external-sources=true source=ejabberdctl.cfg.example shell=sh From d8be168cff8c5d447027ffbde36075c6c7a864f5 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 23 Dec 2021 11:16:06 +0100 Subject: [PATCH 124/440] Use dollar notation instead of legacy backticked --- tools/captcha.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/captcha.sh b/tools/captcha.sh index 9fa4a52c4..59df7fcc6 100755 --- a/tools/captcha.sh +++ b/tools/captcha.sh @@ -21,7 +21,7 @@ if test -n ${BASH_VERSION:-''} ; then R=$RANDOM } else - for n in `od -A n -t u2 -N 48 /dev/urandom`; do RL="$RL$n "; done + for n in $(od -A n -t u2 -N 48 /dev/urandom); do RL="$RL$n "; done get_random () { R=${RL%% *} From f4e2d278ba2225bbb2db6c3f42fce8369d856f65 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 23 Dec 2021 11:18:09 +0100 Subject: [PATCH 125/440] Dollar is unnecessary on arithmetic variables --- tools/captcha.sh | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tools/captcha.sh b/tools/captcha.sh index 59df7fcc6..a619626cf 100755 --- a/tools/captcha.sh +++ b/tools/captcha.sh @@ -30,54 +30,54 @@ else fi get_random -WAVE1_AMPLITUDE=$((2 + $R % 5)) +WAVE1_AMPLITUDE=$((2 + R % 5)) get_random -WAVE1_LENGTH=$((50 + $R % 25)) +WAVE1_LENGTH=$((50 + R % 25)) get_random -WAVE2_AMPLITUDE=$((2 + $R % 5)) +WAVE2_AMPLITUDE=$((2 + R % 5)) get_random -WAVE2_LENGTH=$((50 + $R % 25)) +WAVE2_LENGTH=$((50 + R % 25)) get_random -WAVE3_AMPLITUDE=$((2 + $R % 5)) +WAVE3_AMPLITUDE=$((2 + R % 5)) get_random -WAVE3_LENGTH=$((50 + $R % 25)) +WAVE3_LENGTH=$((50 + R % 25)) get_random -W1_LINE_START_Y=$((10 + $R % 40)) +W1_LINE_START_Y=$((10 + R % 40)) get_random -W1_LINE_STOP_Y=$((10 + $R % 40)) +W1_LINE_STOP_Y=$((10 + R % 40)) get_random -W2_LINE_START_Y=$((10 + $R % 40)) +W2_LINE_START_Y=$((10 + R % 40)) get_random -W2_LINE_STOP_Y=$((10 + $R % 40)) +W2_LINE_STOP_Y=$((10 + R % 40)) get_random -W3_LINE_START_Y=$((10 + $R % 40)) +W3_LINE_START_Y=$((10 + R % 40)) get_random -W3_LINE_STOP_Y=$((10 + $R % 40)) +W3_LINE_STOP_Y=$((10 + R % 40)) get_random -B1_LINE_START_Y=$(($R % 40)) +B1_LINE_START_Y=$((R % 40)) get_random -B1_LINE_STOP_Y=$(($R % 40)) +B1_LINE_STOP_Y=$((R % 40)) get_random -B2_LINE_START_Y=$(($R % 40)) +B2_LINE_START_Y=$((R % 40)) get_random -B2_LINE_STOP_Y=$(($R % 40)) -#B3_LINE_START_Y=$(($R % 40)) -#B3_LINE_STOP_Y=$(($R % 40)) +B2_LINE_STOP_Y=$((R % 40)) +#B3_LINE_START_Y=$((R % 40)) +#B3_LINE_STOP_Y=$((R % 40)) get_random -B1_LINE_START_X=$(($R % 20)) +B1_LINE_START_X=$((R % 20)) get_random -B1_LINE_STOP_X=$((100 + $R % 40)) +B1_LINE_STOP_X=$((100 + R % 40)) get_random -B2_LINE_START_X=$(($R % 20)) +B2_LINE_START_X=$((R % 20)) get_random -B2_LINE_STOP_X=$((100 + $R % 40)) -#B3_LINE_START_X=$(($R % 20)) -#B3_LINE_STOP_X=$((100 + $R % 40)) +B2_LINE_STOP_X=$((100 + R % 40)) +#B3_LINE_START_X=$((R % 20)) +#B3_LINE_STOP_X=$((100 + R % 40)) get_random -ROLL_X=$(($R % 40)) +ROLL_X=$((R % 40)) convert -size 180x60 xc:none -pointsize 40 \ \( -clone 0 -fill white \ From 84d23e60d1268edc155cf9b1f2a4515e8ab47efb Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 23 Dec 2021 11:33:17 +0100 Subject: [PATCH 126/440] In POSIX sh, RANDOM is undefined: use always the other method --- tools/captcha.sh | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/tools/captcha.sh b/tools/captcha.sh index a619626cf..7885858a2 100755 --- a/tools/captcha.sh +++ b/tools/captcha.sh @@ -15,19 +15,12 @@ INPUT=$1 -if test -n ${BASH_VERSION:-''} ; then - get_random () - { - R=$RANDOM - } -else - for n in $(od -A n -t u2 -N 48 /dev/urandom); do RL="$RL$n "; done - get_random () - { - R=${RL%% *} - RL=${RL#* } - } -fi +for n in $(od -A n -t u2 -N 48 /dev/urandom); do RL="$RL$n "; done +get_random () +{ + R=${RL%% *} + RL=${RL#* } +} get_random WAVE1_AMPLITUDE=$((2 + R % 5)) From 694d80b7fa044abf3ddc47829130fcec0bb23fac Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 22 Dec 2021 17:52:54 +0100 Subject: [PATCH 127/440] Test shell scripts in CI (#3738) --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08a6e4380..2cfc7a20b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,14 @@ jobs: - uses: actions/checkout@v2 + - name: Test shell scripts + if: matrix.otp == 24 + run: | + shellcheck test/ejabberd_SUITE_data/gencerts.sh + shellcheck tools/captcha.sh + shellcheck ejabberd.init.template + shellcheck ejabberdctl.template + - name: Get previous Erlang/OTP uses: ErlGang/setup-erlang@master if: matrix.otp != 24 From e2b7717dd9897bbcda29b270195cd7a36eb295cf Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 23 Dec 2021 12:11:30 +0100 Subject: [PATCH 128/440] Workaround to support ShellCheck older than 0.8.0 --- .github/workflows/ci.yml | 2 +- ejabberdctl.template | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2cfc7a20b..8b5a9c69c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: shellcheck test/ejabberd_SUITE_data/gencerts.sh shellcheck tools/captcha.sh shellcheck ejabberd.init.template - shellcheck ejabberdctl.template + shellcheck -x ejabberdctl.template - name: Get previous Erlang/OTP uses: ErlGang/setup-erlang@master diff --git a/ejabberdctl.template b/ejabberdctl.template index cd2cc3c3e..9bd76749c 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -62,6 +62,7 @@ done : "${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR/ejabberdctl.cfg"}" # Allows passing extra Erlang command-line arguments in vm.args file : "${VMARGS:="$ETC_DIR/vm.args"}" +# shellcheck source=ejabberdctl.cfg.example [ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH" [ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG" [ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s" From 94a733c6669afb7b41fdafcb9bf0a4ac24a483f2 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 23 Dec 2021 14:24:27 +0100 Subject: [PATCH 129/440] Fix ERTS path in ejabberdctl with `rebar3 release` Rebar 2 expands {{erts-vsn}} to "erts-$vsn", Rebar 3 expands it to just "$vsn". Make sure `make rel` doesn't end up with a "$vsn" directory next to "erts-$vsn" (which happened when using Rebar 3), and make sure that ejabberdctl expects both "erl" and "epmd" to be installed below "erts-$vsn" (which it didn't when using Rebar 3). --- ejabberdctl.template | 1 + rebar.config | 2 +- vars.config.in | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index 9bd76749c..679db7a73 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -12,6 +12,7 @@ ERLANG_NODE=ejabberd@localhost # define default environment variables [ -z "$SCRIPT" ] && SCRIPT=$0 SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)" +ERTS_VSN="{{erts_vsn}}" ERL="{{erl}}" IEX="{{bindir}}/iex" EPMD="{{epmd}}" diff --git a/rebar.config b/rebar.config index 02993d899..80683b442 100644 --- a/rebar.config +++ b/rebar.config @@ -181,7 +181,7 @@ {overlay, [{mkdir, "var/log/ejabberd"}, {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, - {copy, "rel/files/erl", "\{\{erts_vsn\}\}/bin/erl"}, % in rebar2 this prepends erts- + {copy, "rel/files/erl", "erts-\{\{erts_vsn\}\}/bin/erl"}, {template, "ejabberdctl.template", "bin/ejabberdctl"}, {copy, "inetrc", "etc/ejabberd/inetrc"}, {copy, "tools/captcha*.sh", "lib/ejabberd-\{\{release_version\}\}/priv/bin/"}, diff --git a/vars.config.in b/vars.config.in index 9b3ac7585..04024fd73 100644 --- a/vars.config.in +++ b/vars.config.in @@ -51,9 +51,10 @@ {release, true}. {release_dir, "${SCRIPT_DIR%/*}"}. {sysconfdir, "{{release_dir}}/etc"}. +{erts_dir, "{{release_dir}}/erts-${ERTS_VSN#erts-}"}. {installuser, "@INSTALLUSER@"}. -{erl, "{{release_dir}}/{{erts_vsn}}/bin/erl"}. -{epmd, "{{release_dir}}/{{erts_vsn}}/bin/epmd"}. +{erl, "{{erts_dir}}/bin/erl"}. +{epmd, "{{erts_dir}}/bin/epmd"}. {localstatedir, "{{release_dir}}/var"}. {libdir, "{{release_dir}}/lib"}. {docdir, "{{release_dir}}/doc"}. From 5ff45e0f00b6cbda6e47926c56cd7d2f69fbdba6 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 23 Dec 2021 14:46:53 +0100 Subject: [PATCH 130/440] ejabberdctl: Let shellcheck ignore unused ERTS_VSN The ERTS_VSN variable is only used for releases built with Rebar 3. --- ejabberdctl.template | 1 + 1 file changed, 1 insertion(+) diff --git a/ejabberdctl.template b/ejabberdctl.template index 679db7a73..408a4fe6d 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -12,6 +12,7 @@ ERLANG_NODE=ejabberd@localhost # define default environment variables [ -z "$SCRIPT" ] && SCRIPT=$0 SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)" +# shellcheck disable=SC2034 ERTS_VSN="{{erts_vsn}}" ERL="{{erl}}" IEX="{{bindir}}/iex" From 38410974289f4ce046cb3865abe1bdcc0a3a95fd Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 13 Dec 2021 15:30:20 +0100 Subject: [PATCH 131/440] Clean actions steps, remove redundant ones --- .github/workflows/ci.yml | 59 ++++++++++------------------------------ 1 file changed, 15 insertions(+), 44 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b5a9c69c..c05c6f5c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,7 +89,6 @@ jobs: libsqlite3-dev libwebp-dev libyaml-dev - name: Prepare rebar - id: rebar run: | echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2} ]}.' >>rebar.config @@ -101,23 +100,18 @@ jobs: mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix, sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config + echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config - - name: Cache rebar2 - if: matrix.rebar == 2 + - name: Cache rebar uses: actions/cache@v2 with: path: | deps/ dialyzer/ ebin/ + ~/.cache/rebar3/ key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} - - name: Cache rebar3 - if: matrix.rebar == 3 - uses: actions/cache@v2 - with: - path: ~/.cache/rebar3/ - key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} - name: Compile run: | @@ -151,28 +145,13 @@ jobs: grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log test $(find logs/ -empty -name error.log) - - name: View dialyzer report - run: cat logs/dialyzer.log - - - name: View full suite.log - run: cat logs/suite.log - - - name: View suite.log failures + - name: View logs failures if: failure() - run: cat logs/suite.log | awk - 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' - - - name: View full ejabberd.log - if: failure() - run: find logs/ -name ejabberd.log -exec cat '{}' ';' - - - name: View error.log - if: failure() - run: find logs/ -name error.log -exec cat '{}' ';' - - - name: View exunit.log - if: failure() - run: find logs/ -name exunit.log -exec cat '{}' ';' + run: | + cat logs/suite.log | awk \ + 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' + find logs/ -name error.log -exec cat '{}' ';' + find logs/ -name exunit.log -exec cat '{}' ';' - name: Send to coveralls if: matrix.otp == 24 @@ -218,21 +197,13 @@ jobs: grep 'TEST COMPLETE' logs/suite.log grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log test $(find logs/ -empty -name error.log) - - name: View full suite.log - run: cat logs/suite.log - - name: View suite.log failures + - name: View logs failures if: failure() - run: cat logs/suite.log | awk - 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' - - name: View full ejabberd.log - if: failure() - run: find logs/ -name ejabberd.log -exec cat '{}' ';' - - name: View error.log - if: failure() - run: find logs/ -name error.log -exec cat '{}' ';' - - name: View exunit.log - if: failure() - run: find logs/ -name exunit.log -exec cat '{}' ';' + run: | + cat logs/suite.log | awk \ + 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' + find logs/ -name error.log -exec cat '{}' ';' + find logs/ -name exunit.log -exec cat '{}' ';' binaries: name: Binaries From aa580b3f6efab3ae7c99b3d3f28d8b1cc0a6c15d Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 14 Dec 2021 13:52:16 +0100 Subject: [PATCH 132/440] Only care about new-schema results when new-schema tests were ran --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c05c6f5c2..6d6ef5984 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -188,8 +188,9 @@ jobs: TO ejabberd_test;" sudo sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl - run: CT_BACKENDS=mysql,pgsql make test + id: ctnewschema - name: Check results - if: always() + if: always() && steps.ctnewschema.outcome != 'skipped' run: | [[ -d _build ]] && ln -s _build/test/logs/ logs \ || ln dialyzer/error.log logs/dialyzer.log @@ -198,7 +199,7 @@ jobs: grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log test $(find logs/ -empty -name error.log) - name: View logs failures - if: failure() + if: failure() && steps.ctnewschema.outcome != 'skipped' run: | cat logs/suite.log | awk \ 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' From 8a5d90797ae6d263838ead0ca70391885102d05e Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 14 Dec 2021 20:00:10 +0100 Subject: [PATCH 133/440] Check dialyzer results in its step when using rebar 2 --- .github/workflows/ci.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6d6ef5984..b98ba24ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,16 +130,16 @@ jobs: - run: make hooks - run: make options - run: make xref - - run: make dialyzer + - run: | + make dialyzer + [ ${{ matrix.rebar }} = 3 ] && true \ + || { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; } - run: make test - name: Check results if: always() run: | - [[ -d _build ]] && ln -s _build/test/logs/ logs \ - && ln `find _build/ -name "*dialyzer_warnings"` \ - logs/dialyzer.log \ - || ln dialyzer/error.log logs/dialyzer.log + [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true ln `find logs/ -name suite.log` logs/suite.log grep 'TEST COMPLETE' logs/suite.log grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log @@ -169,7 +169,7 @@ jobs: - name: Prepare new schema run: | [[ -d logs ]] && rm -rf logs - [[ -d _build/test/logs ]] && rm -rf _build/test/logs + [[ -d _build/test/logs ]] && rm -rf _build/test/logs || true mysql -u root -proot -e "DROP DATABASE ejabberd_test;" sudo -u postgres psql -c "DROP DATABASE ejabberd_test;" mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" @@ -192,8 +192,7 @@ jobs: - name: Check results if: always() && steps.ctnewschema.outcome != 'skipped' run: | - [[ -d _build ]] && ln -s _build/test/logs/ logs \ - || ln dialyzer/error.log logs/dialyzer.log + [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true ln `find logs/ -name suite.log` logs/suite.log grep 'TEST COMPLETE' logs/suite.log grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log From 8ccad7fadadc7ccedc4a4c9004838503d0f1c76d Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 13 Dec 2021 15:32:26 +0100 Subject: [PATCH 134/440] Publish CT logs and Cover on failure to an external GH Pages repo --- .github/workflows/ci.yml | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b98ba24ed..8cd9a38c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -112,6 +112,14 @@ jobs: ~/.cache/rebar3/ key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} + - name: Download test logs + if: matrix.otp == 24 && github.repository == 'processone/ejabberd' + continue-on-error: true + run: | + mkdir -p _build/test + curl -sSL https://github.com/processone/ecil/tarball/gh-pages | + tar -C _build/test --strip-components=1 --wildcards -xzf - + rm -rf _build/test/logs/last/ - name: Compile run: | @@ -134,7 +142,22 @@ jobs: make dialyzer [ ${{ matrix.rebar }} = 3 ] && true \ || { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; } - - run: make test + + - name: Run tests + if: matrix.otp != 24 + run: make test + - name: Run tests (OTP 24) + if: matrix.otp == 24 + id: ct + run: | + (cd priv && ln -sf ../sql) + COMMIT=`echo $GITHUB_SHA | cut -c 1-7` + DATE=`date +%s` + REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"` + NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT + LABEL=`git show -s --format=%s | cut -c 1-30` + rebar3 ct --name $NODENAME --label "$LABEL" + rebar3 cover - name: Check results if: always() @@ -166,6 +189,22 @@ jobs: "payload":{"build_num":$GITHUB_RUN_ID, "status":"done"}}' + - name: Upload test logs + if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' + uses: peaceiris/actions-gh-pages@v3 + with: + publish_dir: _build/test + exclude_assets: '.github,lib,plugins' + external_repository: processone/ecil + deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} + keep_files: true + + - name: View ECIL address + if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' + run: | + CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'` + echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/" + - name: Prepare new schema run: | [[ -d logs ]] && rm -rf logs From 59c9500944a8ba363bc75047a3c35192883149a6 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 30 Dec 2021 21:17:11 +0100 Subject: [PATCH 135/440] mod_muc_room: Fix function name typo --- src/mod_muc_room.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 25bc7d8b6..aaf3e8895 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1637,7 +1637,7 @@ do_get_affiliation_fallback(JID, StateData) -> -spec get_affiliations(state()) -> affiliations(). get_affiliations(#state{config = #config{persistent = false}} = StateData) -> - get_affiliations_callback(StateData); + get_affiliations_fallback(StateData); get_affiliations(StateData) -> Room = StateData#state.room, Host = StateData#state.host, @@ -1645,13 +1645,13 @@ get_affiliations(StateData) -> Mod = gen_mod:db_mod(ServerHost, mod_muc), case Mod:get_affiliations(ServerHost, Room, Host) of {error, _} -> - get_affiliations_callback(StateData); + get_affiliations_fallback(StateData); {ok, Affiliations} -> Affiliations end. --spec get_affiliations_callback(state()) -> affiliations(). -get_affiliations_callback(StateData) -> +-spec get_affiliations_fallback(state()) -> affiliations(). +get_affiliations_fallback(StateData) -> StateData#state.affiliations. -spec get_service_affiliation(jid(), state()) -> owner | none. From dc8196693837650c973834ed5f634e1f6e8fa1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 3 Jan 2022 13:51:49 +0100 Subject: [PATCH 136/440] Fix 'make update' when used with rebar 3.18 --- Makefile.in | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile.in b/Makefile.in index ab0e9d967..3066488f0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -94,8 +94,10 @@ endif ifeq "$(MIX)" "mix" REBAR_VER:=6 +REBAR_VER_318:=0 else REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}') +REBAR_VER_318:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}') endif ifeq "$(REBAR_VER)" "6" @@ -115,7 +117,11 @@ else ifeq "$(REBAR_VER)" "3" SKIPDEPS= LISTDEPS=tree +ifeq "$(REBAR_VER_318)" "1" + UPDATEDEPS=upgrade --all +else UPDATEDEPS=upgrade +endif DEPSPATTERN="s/ (.*//; /^ / s/.* \([a-z0-9_]*\).*/\1/p;" DEPSBASE=_build DEPSDIR=$(DEPSBASE)/default/lib From 7c9b47fb78aa964885136c00c649e474b7ff6453 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 4 Jan 2022 15:55:24 +0100 Subject: [PATCH 137/440] Fix "make rel" when using mix, broken after 94a733c66 --- mix.exs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 7669c519c..b4b71aa8f 100644 --- a/mix.exs +++ b/mix.exs @@ -215,6 +215,7 @@ defmodule Ejabberd.MixProject do epmd: config(:epmd), bindir: Path.join([config(:release_dir), "releases", version()]), release_dir: config(:release_dir), + erts_dir: config(:erts_dir), erts_vsn: "erts-#{release.erts_version}" ] ro = "rel/overlays" @@ -240,7 +241,9 @@ defmodule Ejabberd.MixProject do execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.template > ejabberdctl.example1") Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns) - execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2 > ejabberdctl.example3") + execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a") + Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns) + execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3") execute.("sed -e 's|ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4") execute.("sed -e 's|INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example4 > ejabberdctl.example5") Mix.Generator.copy_template("ejabberdctl.example5", "#{ro}/bin/ejabberdctl", assigns) @@ -248,6 +251,8 @@ defmodule Ejabberd.MixProject do File.rm("ejabberdctl.example1") File.rm("ejabberdctl.example2") + File.rm("ejabberdctl.example2a") + File.rm("ejabberdctl.example2b") File.rm("ejabberdctl.example3") File.rm("ejabberdctl.example4") File.rm("ejabberdctl.example5") From 61dc89a06826ae922db6433f1a354923c3737d2d Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 4 Jan 2022 21:22:11 +0100 Subject: [PATCH 138/440] Update Luerl to 1.0.0, now available in Hex.pm (rvirding/luerl#142) --- mix.exs | 2 +- rebar.config | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index b4b71aa8f..64f94345c 100644 --- a/mix.exs +++ b/mix.exs @@ -147,7 +147,7 @@ defmodule Ejabberd.MixProject do for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}}, {config(:redis), {:eredis, "~> 1.2.0"}}, {config(:zlib), {:ezlib, "~> 1.0"}}, - {config(:lua), {:luerl, "~> 0.3.1"}}, + {config(:lua), {:luerl, "~> 1.0"}}, {config(:sqlite), {:sqlite3, "~> 1.1"}}], do: dep end diff --git a/rebar.config b/rebar.config index 80683b442..e1b1b6903 100644 --- a/rebar.config +++ b/rebar.config @@ -41,7 +41,7 @@ {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}, {if_var_true, lua, - {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "v0.3"}}}}, + {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}}, {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.14"}}}, {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.16"}}}, {if_var_true, mysql, @@ -63,7 +63,7 @@ {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} ]}. -{gitonly_deps, [elixir, luerl]}. +{gitonly_deps, [elixir]}. {if_var_true, latest_deps, {floating_deps, [cache_tab, From 79ddde3040555b7fa656e38d221fdee11b90df54 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 4 Jan 2022 21:46:40 +0100 Subject: [PATCH 139/440] Workaround to support rebar2 git tag "1.0" and rebar3 hex version "1.0.0" --- rebar.config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index e1b1b6903..0c18d9e7d 100644 --- a/rebar.config +++ b/rebar.config @@ -41,7 +41,13 @@ {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}, {if_var_true, lua, - {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}}, + {if_not_rebar3, + {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}} + }}, + {if_var_true, lua, + {if_rebar3, + {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}} + }}, {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.14"}}}, {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.16"}}}, {if_var_true, mysql, From cc7ebb86b4c8582231753b2bef3d440c84d17878 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 4 Jan 2022 23:05:42 +0100 Subject: [PATCH 140/440] Fix Dialyzer, related to Luerl API update from 0.3 to 1.0 --- src/prosody2ejabberd.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prosody2ejabberd.erl b/src/prosody2ejabberd.erl index 3992a4034..8f5c35f84 100644 --- a/src/prosody2ejabberd.erl +++ b/src/prosody2ejabberd.erl @@ -118,7 +118,7 @@ eval_file(Path) -> case luerl:eval(NewData, State1) of {ok, _} = Res -> Res; - {error, Why} = Err -> + {error, Why, _} = Err -> ?ERROR_MSG("Failed to eval ~ts: ~p", [Path, Why]), Err end; From 9ba20d26cb67a0c6adcfb7d5fbbb3ba23c6cc9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 5 Jan 2022 16:43:55 +0100 Subject: [PATCH 141/440] Add better descripion of subscribe_room_many command --- src/mod_muc_admin.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 21611c585..6e533a3df 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -336,6 +336,7 @@ get_commands_spec() -> result = {nodes, {list, {node, string}}}}, #ejabberd_commands{name = subscribe_room_many, tags = [muc_room], desc = "Subscribe several users to a MUC conference", + longdesc = "This command accept up to 50 users at once (this is configurable with `subscribe_room_many_max_users` option)", module = ?MODULE, function = subscribe_room_many, args_desc = ["Users JIDs and nicks", "the room to subscribe", From 03a11c63bd9450a857b5c2d60c0c7337280918e3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 11 Jan 2022 17:19:12 +0100 Subject: [PATCH 142/440] Fix login when generating client id, keep connection record (#3593) --- src/mod_mqtt_session.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_mqtt_session.erl b/src/mod_mqtt_session.erl index ca025e3d2..e7737804e 100644 --- a/src/mod_mqtt_session.erl +++ b/src/mod_mqtt_session.erl @@ -1134,8 +1134,8 @@ is_expired(#publish{meta = Meta, properties = Props} = Pkt) -> %%% Authentication %%%=================================================================== -spec parse_credentials(connect()) -> {ok, jid:jid()} | {error, reason_code()}. -parse_credentials(#connect{client_id = <<>>}) -> - parse_credentials(#connect{client_id = p1_rand:get_string()}); +parse_credentials(#connect{client_id = <<>>} = C) -> + parse_credentials(C#connect{client_id = p1_rand:get_string()}); parse_credentials(#connect{username = <<>>, client_id = ClientID}) -> Host = ejabberd_config:get_myname(), JID = case jid:make(ClientID, Host) of From ce14c28faf2ca47e14a3dcdaf9e336940ca89ca0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 10 Jan 2022 16:45:35 +0100 Subject: [PATCH 143/440] Fix version when this command was really updated --- src/mod_muc_admin.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 6e533a3df..d18ba5f07 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -284,7 +284,7 @@ get_commands_spec() -> #ejabberd_commands{name = send_direct_invitation, tags = [muc_room], desc = "Send a direct invitation to several destinations", - longdesc = "Since ejabberd 20.10, this command is " + longdesc = "Since ejabberd 20.12, this command is " "asynchronous: the API call may return before the " "server has send all the invitations.\n\n" "Password and Message can also be: none. " From 1ce3bd256bdb79aa4e7943d58d7c2e92529613b7 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 13 Jan 2022 19:27:01 +0100 Subject: [PATCH 144/440] Update section URLs in ldap documentation --- src/mod_shared_roster_ldap.erl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 08fbe8793..e842ab261 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -689,9 +689,9 @@ mod_doc() -> ?T("- Connection parameters: The module also accepts the " "connection parameters, all of which default to the top-level " "parameter of the same name, if unspecified. " - "See http://../database-ldap/#ldap-connection[LDAP Connection] " + "See http://../ldap/#ldap-connection[LDAP Connection] " "section for more information about them."), "", - ?T("Check also the http://../database-ldap/#configuration-examples" + ?T("Check also the http://../ldap/#ldap-examples" "[Configuration examples] section to get details about " "retrieving the roster, " "and configuration examples including Flat DIT and Deep DIT.")], @@ -721,13 +721,13 @@ mod_doc() -> "name of roster entries (usually full names of people in " "the roster). See also the parameters 'ldap_userdesc' and " "'ldap_useruid'. For more information check the LDAP " - "http://../database-ldap/#filters[Filters] section.")}}, + "http://../ldap/#filters[Filters] section.")}}, {ldap_filter, #{desc => ?T("Additional filter which is AND-ed together " "with \"User Filter\" and \"Group Filter\". " "For more information check the LDAP " - "http://../database-ldap/#filters[Filters] section.")}}, + "http://../ldap/#filters[Filters] section.")}}, %% Attributes: {ldap_groupattr, #{desc => @@ -785,7 +785,7 @@ mod_doc() -> #{desc => ?T("A regex for extracting user ID from the value of the " "attribute named by 'ldap_memberattr'. Check the LDAP " - "http://../database-ldap/#control-parameters" + "http://../ldap/#control-parameters" "[Control Parameters] section.")}}, {ldap_auth_check, #{value => "true | false", From 1fb908b70f8651f7074d8f1beefc5d4d2baf470b Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 13 Jan 2022 19:27:53 +0100 Subject: [PATCH 145/440] Document option subscrube_room_many_max_users introduced in fc34661b6 --- src/mod_muc_admin.erl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index d18ba5f07..ac2d887fe 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -1459,4 +1459,11 @@ mod_doc() -> [?T("This module provides commands to administer local MUC " "services and their MUC rooms. It also provides simple " "WebAdmin pages to view the existing rooms."), "", - ?T("This module depends on _`mod_muc`_.")]}. + ?T("This module depends on _`mod_muc`_.")], + opts => + [{subscribe_room_many_max_users, + #{value => ?T("Number"), + desc => + ?T("How many users can be subscribed to a room at once using " + "the 'subscribe_room_many' command. " + "The default value is '50'.")}}]}. From a9ac10e876da1bfde0b7c3bbc4039745e4e79368 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 13 Jan 2022 19:28:50 +0100 Subject: [PATCH 146/440] Document that 'unregister' command deletes data associated with the account --- src/ejabberd_admin.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 14305e84b..9e72c7b36 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -181,6 +181,8 @@ get_commands_spec() -> result = {res, restuple}}, #ejabberd_commands{name = unregister, tags = [accounts], desc = "Unregister a user", + longdesc = "This deletes the authentication and all the " + "data associated to the account (roster, vcard...).", policy = admin, module = ?MODULE, function = unregister, args_desc = ["Username", "Local vhost served by ejabberd"], From 8e88fa3884a7a396a33b69fa2ea3d805e1d49501 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 15 Jan 2022 18:18:24 +0100 Subject: [PATCH 147/440] mod_shared_roster: Normalize JID on unset_presence Don't forget to normalize the JID handed over from ejabberd_sm on presence-unavailable. Without normalization, mod_shared_roster might fail to look up the storage backend for the given host name, for example. Fixes #3752. --- src/mod_shared_roster.erl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 13ff90466..358a8df32 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -870,12 +870,15 @@ c2s_self_presence(Acc) -> Acc. -spec unset_presence(binary(), binary(), binary(), binary()) -> ok. -unset_presence(LUser, LServer, Resource, Status) -> +unset_presence(User, Server, Resource, Status) -> + LUser = jid:nodeprep(User), + LServer = jid:nameprep(Server), + LResource = jid:resourceprep(Resource), Resources = ejabberd_sm:get_user_resources(LUser, LServer), ?DEBUG("Unset_presence for ~p @ ~p / ~p -> ~p " "(~p resources)", - [LUser, LServer, Resource, Status, length(Resources)]), + [LUser, LServer, LResource, Status, length(Resources)]), case length(Resources) of 0 -> lists:foreach( From 0f2d36dc533b03dca55b9dfda78956f7d4a2de37 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 17 Jan 2022 19:08:36 +0100 Subject: [PATCH 148/440] mod_pubsub: Allow for limiting item_expire value If mod_pubsub's 'max_item_expire_node' option is specified, reject node configurations with an 'item_expire' value that exceeds the specified limit. --- src/mod_pubsub.erl | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 76092f1c6..d161ec10c 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3512,17 +3512,24 @@ decode_node_config(undefined, _, _) -> decode_node_config(#xdata{fields = Fs}, Host, Lang) -> try Config = pubsub_node_config:decode(Fs), - Max = get_max_items_node(Host), - case {check_opt_range(max_items, Config, Max), + MaxItems = get_max_items_node(Host), + MaxExpiry = get_max_item_expire_node(Host), + case {check_opt_range(max_items, Config, MaxItems), + check_opt_range(item_expire, Config, MaxExpiry), check_opt_range(max_payload_size, Config, ?MAX_PAYLOAD_SIZE)} of - {true, true} -> + {true, true, true} -> Config; - {true, false} -> + {true, true, false} -> erlang:error( {pubsub_node_config, {bad_var_value, <<"pubsub#max_payload_size">>, ?NS_PUBSUB_NODE_CONFIG}}); - {false, _} -> + {true, false, _} -> + erlang:error( + {pubsub_node_config, + {bad_var_value, <<"pubsub#item_expire">>, + ?NS_PUBSUB_NODE_CONFIG}}); + {false, _, _} -> erlang:error( {pubsub_node_config, {bad_var_value, <<"pubsub#max_items">>, @@ -3568,9 +3575,11 @@ decode_get_pending(#xdata{fields = Fs}, Lang) -> end. -spec check_opt_range(atom(), [proplists:property()], - non_neg_integer() | unlimited) -> boolean(). + non_neg_integer() | unlimited | infinity) -> boolean(). check_opt_range(_Opt, _Opts, unlimited) -> true; +check_opt_range(_Opt, _Opts, infinity) -> + true; check_opt_range(Opt, Opts, Max) -> case proplists:get_value(Opt, Opts, Max) of max -> true; From 20326e8908b935f25428a3eb1efff628b9c3a09c Mon Sep 17 00:00:00 2001 From: Pouriya Jahanbakhsh Date: Fri, 21 Jan 2022 03:18:55 +0330 Subject: [PATCH 149/440] feat: process hook tracing --- src/ejabberd_hooks.erl | 408 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 406 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl index 605b7e226..36edf29c8 100644 --- a/src/ejabberd_hooks.erl +++ b/src/ejabberd_hooks.erl @@ -46,12 +46,23 @@ handle_info/2, terminate/2]). + +-export( + [ + get_tracing_options/3, + trace_off/3, + trace_on/5 + ] +). + -include("logger.hrl"). -include("ejabberd_stacktrace.hrl"). -record(state, {}). -type hook() :: {Seq :: integer(), Module :: atom(), Function :: atom() | fun()}. +-define(TRACE_HOOK_KEY, '$trace_hook'). +-define(TIMING_KEY, '$trace_hook_timer'). %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -104,7 +115,18 @@ run(Hook, Args) -> run(Hook, Host, Args) -> try ets:lookup(hooks, {Hook, Host}) of [{_, Ls}] -> - run1(Ls, Hook, Args); + case erlang:get(?TRACE_HOOK_KEY) of + undefined -> + run1(Ls, Hook, Args); + TracingHooksOpts -> + case do_get_tracing_options(Hook, Host, TracingHooksOpts) of + undefined -> + run1(Ls, Hook, Args); + TracingOpts -> + foreach_start_hook_tracing(TracingOpts, Hook, Host, Args), + run2(Ls, Hook, Args, Host, TracingOpts) + end + end; [] -> ok catch _:badarg -> @@ -124,13 +146,75 @@ run_fold(Hook, Val, Args) -> run_fold(Hook, Host, Val, Args) -> try ets:lookup(hooks, {Hook, Host}) of [{_, Ls}] -> - run_fold1(Ls, Hook, Val, Args); + case erlang:get(?TRACE_HOOK_KEY) of + undefined -> + run_fold1(Ls, Hook, Val, Args); + TracingHooksOpts -> + case do_get_tracing_options(Hook, Host, TracingHooksOpts) of + undefined -> + run_fold1(Ls, Hook, Val, Args); + TracingOpts -> + fold_start_hook_tracing(TracingOpts, Hook, Host, [Val | Args]), + run_fold2(Ls, Hook, Val, Args, Host, TracingOpts) + end + end; [] -> Val catch _:badarg -> Val end. +get_tracing_options(Hook, Host, Pid) when Pid == erlang:self() -> + do_get_tracing_options(Hook, Host, erlang:get(?TRACE_HOOK_KEY)); +get_tracing_options(Hook, Host, Pid) when erlang:is_pid(Pid) -> + case erlang:process_info(Pid, dictionary) of + {_, DictPropList} -> + case lists:keyfind(?TRACE_HOOK_KEY, 1, DictPropList) of + {_, TracingHooksOpts} -> + do_get_tracing_options(Hook, Host, TracingHooksOpts); + _ -> + undefined + end; + _ -> + undefined + end. + +trace_on(Hook, Host, Pid, #{}=Opts, Timeout) when Pid == erlang:self() -> + do_trace_on(Hook, Host, Opts, Timeout); +trace_on(Hook, Host, Proc, #{}=Opts, Timeout) -> + try sys:replace_state( + Proc, + fun(State) -> + do_trace_on(Hook, Host, Opts, Timeout), + State + end, + 15000 + ) of + _ -> % process state + ok + catch + _:Reason -> + {error, Reason} + end. + +trace_off(Hook, Host, Pid) when Pid == erlang:self() -> + do_trace_off(Hook, Host); +trace_off(Hook, Host, Proc) -> + try sys:replace_state( + Proc, + fun(State) -> + do_trace_off(Hook, Host), + State + end, + 15000 + ) of + _ -> % process state + ok + catch + _:Reason -> + {error, Reason} + end. + %%%---------------------------------------------------------------------- %%% Callback functions from gen_server %%%---------------------------------------------------------------------- @@ -247,3 +331,323 @@ safe_apply(Hook, Module, Function, Args) -> misc:format_exception(2, E, R, Stack)|Args]), 'EXIT' end. + +%%%---------------------------------------------------------------------- +%%% Internal tracing functions +%%%---------------------------------------------------------------------- + +do_trace_on(Hook, Host, Opts, undefined) -> + case erlang:get(?TRACE_HOOK_KEY) of + _ when Hook == '_' andalso Host == <<"*">> -> + % Trace everything: + erlang:put(?TRACE_HOOK_KEY, #{'_' => #{<<"*">> => Opts}}); + #{'_' := #{<<"*">> := _}} -> % Already tracing everything + % Update Opts: + erlang:put(?TRACE_HOOK_KEY, #{'_' => #{<<"*">> => Opts}}); + #{'_' := HostOpts} when Hook == '_' -> % Already Tracing everything for some hosts + % Add/Update Host and Opts: + erlang:put(?TRACE_HOOK_KEY, #{'_' => HostOpts#{Host => Opts}}); + #{'_' := _} -> % Already tracing everything and Hook is not '_' + ok; + #{} when Hook == '_' -> + % Remove other hooks by just adding '_': + erlang:put(?TRACE_HOOK_KEY, #{'_' => #{Host => Opts}}); + #{}=TraceHooksOpts when Host == <<"*">> -> % Want to trace a hook for all hosts + erlang:put(?TRACE_HOOK_KEY, TraceHooksOpts#{Hook => #{Host => Opts}}); + #{}=TraceHooksOpts -> + case maps:get(Hook, TraceHooksOpts, #{}) of + #{<<"*">> := _} -> % Already tracing this hook for all hosts + ok; + HostOpts -> + erlang:put(?TRACE_HOOK_KEY, TraceHooksOpts#{Hook => HostOpts#{Host => Opts}}) + end; + undefined -> + erlang:put(?TRACE_HOOK_KEY, #{Hook => #{Host => Opts}}) + end, + ok; +do_trace_on(Hook, Host, Opts, Timeout) -> % Trace myself `Timeout` time + ParentPid = erlang:self(), + try erlang:spawn( + fun() -> + MonitorRef = erlang:monitor(process, ParentPid), + receive + {_, MonitorRef, _, _, _} -> + ok + after Timeout -> + trace_off(Hook, Host, ParentPid) + end, + erlang:exit(normal) + end + ) of + _ -> + do_trace_on(Hook, Host, Opts, undefined) % ok + catch + _:Reason -> % system_limit + {error, Reason} + end. + +do_trace_off(Hook, Host) -> + case erlang:get(?TRACE_HOOK_KEY) of + _ when Hook == '_' andalso Host == <<"*">> -> + % Remove all tracing: + erlang:erase(?TRACE_HOOK_KEY); + #{'_' := HostOpts} when Hook == '_' -> % Already tracing all hooks + % Remove Host: + HostOpts2 = maps:remove(Host, HostOpts), + if + HostOpts2 == #{} -> + % Remove all tracing: + erlang:erase(?TRACE_HOOK_KEY); + true -> + erlang:put(?TRACE_HOOK_KEY, #{'_' => HostOpts2}) + end; + #{}=TraceHooksOpts when Host == <<"*">> -> + % Remove tracing of this hook for all hosts: + TraceHooksOpts2 = maps:remove(Hook, TraceHooksOpts), + if + TraceHooksOpts2 == #{} -> + % Remove all tracing: + erlang:erase(?TRACE_HOOK_KEY); + true -> + erlang:put(?TRACE_HOOK_KEY, TraceHooksOpts2) + end; + #{}=TraceHooksOpts -> + case maps:get(Hook, TraceHooksOpts, undefined) of + #{}=HostOpts -> + NewHostOpts = maps:remove(Host, HostOpts), + if + NewHostOpts == #{} -> + % Remove hook: + erlang:put(?TRACE_HOOK_KEY, maps:remove(Hook, TraceHooksOpts)); + true -> + erlang:put(?TRACE_HOOK_KEY, TraceHooksOpts#{Hook => NewHostOpts}) + end; + _ -> + ok + end; + undefined -> + ok + end, + ok. + +do_get_tracing_options(Hook, Host, MaybeMap) -> + case MaybeMap of + undefined -> + undefined; + #{'_' := #{<<"*">> := Opts}} -> % Tracing everything + Opts; + #{'_' := HostOpts} -> % Tracing all hooks for some hosts + maps:get(Host, HostOpts, undefined); + #{}=TraceHooksOpts -> + HostOpts = maps:get(Hook, TraceHooksOpts, #{}), + case maps:get(Host, HostOpts, undefined) of + undefined -> + maps:get(<<"*">>, HostOpts, undefined); + Opts -> + Opts + end + end. + +run2([], Hook, Args, Host, Opts) -> + foreach_stop_hook_tracing(Opts, Hook, Host, Args, undefined), + ok; +run2([{Seq, Module, Function} | Ls], Hook, Args, Host, TracingOpts) -> + foreach_start_callback_tracing(TracingOpts, Hook, Host, Module, Function, Args, Seq), + Res = safe_apply(Hook, Module, Function, Args), + foreach_stop_callback_tracing(TracingOpts, Hook, Host, Module, Function, Args, Seq, Res), + case Res of + 'EXIT' -> + run2(Ls, Hook, Args, Host, TracingOpts); + stop -> + foreach_stop_hook_tracing(TracingOpts, Hook, Host, Args, {Module, Function, Seq, Ls}), + ok; + _ -> + run2(Ls, Hook, Args, Host, TracingOpts) + end. + +run_fold2([], Hook, Val, Args, Host, Opts) -> + fold_stop_hook_tracing(Opts, Hook, Host, [Val | Args], undefined), + Val; +run_fold2([{Seq, Module, Function} | Ls], Hook, Val, Args, Host, TracingOpts) -> + fold_start_callback_tracing(TracingOpts, Hook, Host, Module, Function, [Val | Args], Seq), + Res = safe_apply(Hook, Module, Function, [Val | Args]), + fold_stop_callback_tracing(TracingOpts, Hook, Host, Module, Function, [Val | Args], Seq, Res), + case Res of + 'EXIT' -> + run_fold2(Ls, Hook, Val, Args, Host, TracingOpts); + stop -> + fold_stop_hook_tracing(TracingOpts, Hook, Host, [Val | Args], {Module, Function, Seq, {old, Val}, Ls}), + Val; + {stop, NewVal} -> + fold_stop_hook_tracing(TracingOpts, Hook, Host, [Val | Args], {Module, Function, Seq, {new, NewVal}, Ls}), + NewVal; + NewVal -> + run_fold2(Ls, Hook, NewVal, Args, Host, TracingOpts) + end. + +foreach_start_hook_tracing(TracingOpts, Hook, Host, Args) -> + run_event_handler(TracingOpts, Hook, Host, start_hook, [Args], foreach). + +foreach_stop_hook_tracing(TracingOpts, Hook, Host, Args, BreakCallback) -> + run_event_handler(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], foreach). + +foreach_start_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq) -> + run_event_handler(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], foreach). + +foreach_stop_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq, Res) -> + run_event_handler(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], foreach). + +fold_start_hook_tracing(TracingOpts, Hook, Host, Args) -> + run_event_handler(TracingOpts, Hook, Host, start_hook, [Args], fold). + +fold_stop_hook_tracing(TracingOpts, Hook, Host, Args, BreakCallback) -> + run_event_handler(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], fold). + +fold_start_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq) -> + run_event_handler(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], fold). + +fold_stop_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq, Res) -> + run_event_handler(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], fold). + +run_event_handler(TracingOpts, Hook, Host, Event, EventArgs, RunType) -> + EventHandler = maps:get(event_handler, TracingOpts, fun default_tracing_event_handler/6), + EventHandlerOpts = maps:get(event_handler_options, TracingOpts, #{}), + try + if + erlang:is_function(EventHandler) -> + erlang:apply(EventHandler, [Event, EventArgs, RunType, Hook, Host, EventHandlerOpts]); + true -> + EventHandler:handle_hook_tracing_event(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts) + end + of + _ -> + ok + catch + ?EX_RULE(E, R, St) -> + ?ERROR_MSG("Tracing event handler exception(~0p): ~0p: ~0p", [E, R, St]), + ok + end. + +default_tracing_event_handler(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts) -> + % For now: + case maps:get(timing, EventHandlerOpts, true) of + true -> + tracing_timing_event_handler(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts); + _ -> + ok + end. + +tracing_timing_event_handler(start_hook, _, _, Hook, Host, EventHandlerOpts) -> + HookStart = erlang:system_time(nanosecond), + tracing_output(EventHandlerOpts, "(~0p|~ts) Timing started\n", [Hook, Host]), + case erlang:get(?TIMING_KEY) of + #{}=TimingMap -> + erlang:put(?TIMING_KEY, TimingMap#{{Hook, Host} => {HookStart, []}}); + _ -> + erlang:put(?TIMING_KEY, #{{Hook, Host} => {HookStart, []}}) + end, + ok; +tracing_timing_event_handler(stop_hook, _, _, Hook, Host, EventHandlerOpts) -> + HookStop = erlang:system_time(nanosecond), + TimingMap = #{} = erlang:get(?TIMING_KEY), + {HookStart, CallbackList} = maps:get({Hook, Host}, TimingMap), + if + erlang:length(CallbackList) < 2 -> % We don't need sorted timing result + ok; + true -> + {CallbackListText, CallbackListTotal} = + lists:foldl( + fun({Mod, Func, Arity, Diff}, {CallbackText, Total}) -> + { + CallbackText + ++ "\n\t" + ++ mfa_string({Mod, Func, Arity}) + ++ " -> " + ++ erlang:integer_to_list(Diff) + ++ "ns", + Total + Diff + } + end, + {"", 0}, + lists:keysort(4, CallbackList) + ), + tracing_output( + EventHandlerOpts, + "(~0p|~ts) All callbacks got ~0pns to run. Sorted running time:" + ++ CallbackListText + ++ "\n", + [Hook, Host, CallbackListTotal] + ), + tracing_output( + EventHandlerOpts, + "(~0p|~ts) Time calculations for all callbacks got ~0pns\n", + [Hook, Host, (HookStop - HookStart) - CallbackListTotal] + ) + end, + tracing_output(EventHandlerOpts, "(~0p|~ts) Timing stopped\n", [Hook, Host]), + NewTimingMap = maps:remove({Hook, Host}, TimingMap), + if + NewTimingMap == #{} -> + erlang:erase(?TIMING_KEY); + true -> + erlang:put(?TIMING_KEY, NewTimingMap) + end, + ok; +tracing_timing_event_handler(start_callback, [Mod, Func, Args | _], _, Hook, Host, _) -> + CallbackStart = erlang:system_time(nanosecond), + TimingMap = #{} = erlang:get(?TIMING_KEY), + {HookStart, Callbacks} = maps:get({Hook, Host}, TimingMap), + erlang:put( + ?TIMING_KEY, + TimingMap#{ + {Hook, Host} => {HookStart, [{Mod, Func, erlang:length(Args), CallbackStart} | Callbacks]} + } + ), + ok; +tracing_timing_event_handler(stop_callback, _, _, Hook, Host, EventHandlerOpts) -> + CallbackStop = erlang:system_time(nanosecond), + TimingMap = #{} = erlang:get(?TIMING_KEY), + {HookStart, [{Mod, Func, Arity, CallbackStart} | Callbacks]} = maps:get({Hook, Host}, TimingMap), + tracing_output( + EventHandlerOpts, + "(~0p|~ts) " ++ + mfa_string({Mod, Func, Arity}) ++ + " got " ++ + erlang:integer_to_list(CallbackStop - CallbackStart) ++ + "ns\n", + [Hook, Host] + ), + erlang:put( + ?TIMING_KEY, + TimingMap#{ + {Hook, Host} => {HookStart, [{Mod, Func, Arity, CallbackStop - CallbackStart} | Callbacks]} + } + ), + ok. + +tracing_output(#{output_function := OutputF}, Text, Args) -> + try + OutputF(Text, Args) + of + _ -> + ok + catch + ?EX_RULE(E, R, St) -> + ?ERROR_MSG("Tracing output function exception(~0p): ~0p: ~0p", [E, R, St]), + ok + end; +tracing_output(#{output_log_level := Output}, Text, Args) -> + if + Output == debug -> + ?DEBUG(Text, Args); + true -> % info + ?INFO_MSG(Text, Args) + end, + ok; +tracing_output(Opts, Text, Args) -> + tracing_output(Opts#{output_log_level => info}, Text, Args). + +mfa_string({_, Fun, _}) when erlang:is_function(Fun) -> + io_lib:format("~0p", [Fun]); +mfa_string({Mod, Func, Arity}) -> + erlang:atom_to_list(Mod) ++ ":" ++ erlang:atom_to_list(Func) ++ "/" ++ erlang:integer_to_list(Arity). From 259876cb7453948270ccc12cecbfd6503285f035 Mon Sep 17 00:00:00 2001 From: Pouriya Jahanbakhsh Date: Sat, 22 Jan 2022 18:17:11 +0330 Subject: [PATCH 150/440] feat: event handling run multiple event handlers generate new events in timing event handlers print human-readable times output each callback time info is optional and by default is disabled --- src/ejabberd_hooks.erl | 272 ++++++++++++++++++++++++++++------------- 1 file changed, 186 insertions(+), 86 deletions(-) diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl index 36edf29c8..11cd20f9a 100644 --- a/src/ejabberd_hooks.erl +++ b/src/ejabberd_hooks.erl @@ -51,7 +51,7 @@ [ get_tracing_options/3, trace_off/3, - trace_on/5 + trace_on/5,human_readable_time_string/1 ] ). @@ -336,22 +336,24 @@ safe_apply(Hook, Module, Function, Args) -> %%% Internal tracing functions %%%---------------------------------------------------------------------- +do_trace_on(Hook, Host, Opts, Timeout) when erlang:is_list(Host) -> + do_trace_on(Hook, erlang:list_to_binary(Host), Opts, Timeout); do_trace_on(Hook, Host, Opts, undefined) -> case erlang:get(?TRACE_HOOK_KEY) of - _ when Hook == '_' andalso Host == <<"*">> -> + _ when Hook == all andalso Host == <<"*">> -> % Trace everything: - erlang:put(?TRACE_HOOK_KEY, #{'_' => #{<<"*">> => Opts}}); - #{'_' := #{<<"*">> := _}} -> % Already tracing everything + erlang:put(?TRACE_HOOK_KEY, #{all => #{<<"*">> => Opts}}); + #{all := #{<<"*">> := _}} -> % Already tracing everything % Update Opts: - erlang:put(?TRACE_HOOK_KEY, #{'_' => #{<<"*">> => Opts}}); - #{'_' := HostOpts} when Hook == '_' -> % Already Tracing everything for some hosts + erlang:put(?TRACE_HOOK_KEY, #{all => #{<<"*">> => Opts}}); + #{all := HostOpts} when Hook == all -> % Already Tracing everything for some hosts % Add/Update Host and Opts: - erlang:put(?TRACE_HOOK_KEY, #{'_' => HostOpts#{Host => Opts}}); - #{'_' := _} -> % Already tracing everything and Hook is not '_' + erlang:put(?TRACE_HOOK_KEY, #{all => HostOpts#{Host => Opts}}); + #{all := _} -> % Already tracing everything and Hook is not all ok; - #{} when Hook == '_' -> - % Remove other hooks by just adding '_': - erlang:put(?TRACE_HOOK_KEY, #{'_' => #{Host => Opts}}); + #{} when Hook == all -> + % Remove other hooks by just adding all: + erlang:put(?TRACE_HOOK_KEY, #{all => #{Host => Opts}}); #{}=TraceHooksOpts when Host == <<"*">> -> % Want to trace a hook for all hosts erlang:put(?TRACE_HOOK_KEY, TraceHooksOpts#{Hook => #{Host => Opts}}); #{}=TraceHooksOpts -> @@ -365,7 +367,8 @@ do_trace_on(Hook, Host, Opts, undefined) -> erlang:put(?TRACE_HOOK_KEY, #{Hook => #{Host => Opts}}) end, ok; -do_trace_on(Hook, Host, Opts, Timeout) -> % Trace myself `Timeout` time +do_trace_on(Hook, Host, Opts, TimeoutSeconds) -> % Trace myself `Timeout` time + Timeout = timer:seconds(TimeoutSeconds), ParentPid = erlang:self(), try erlang:spawn( fun() -> @@ -386,12 +389,14 @@ do_trace_on(Hook, Host, Opts, Timeout) -> % Trace myself `Timeout` time {error, Reason} end. +do_trace_off(Hook, Host) when erlang:is_list(Host) -> + do_trace_off(Hook, erlang:list_to_binary(Host)); do_trace_off(Hook, Host) -> case erlang:get(?TRACE_HOOK_KEY) of - _ when Hook == '_' andalso Host == <<"*">> -> + _ when Hook == all andalso Host == <<"*">> -> % Remove all tracing: erlang:erase(?TRACE_HOOK_KEY); - #{'_' := HostOpts} when Hook == '_' -> % Already tracing all hooks + #{all := HostOpts} when Hook == all -> % Already tracing all hooks % Remove Host: HostOpts2 = maps:remove(Host, HostOpts), if @@ -399,7 +404,7 @@ do_trace_off(Hook, Host) -> % Remove all tracing: erlang:erase(?TRACE_HOOK_KEY); true -> - erlang:put(?TRACE_HOOK_KEY, #{'_' => HostOpts2}) + erlang:put(?TRACE_HOOK_KEY, #{all => HostOpts2}) end; #{}=TraceHooksOpts when Host == <<"*">> -> % Remove tracing of this hook for all hosts: @@ -434,9 +439,9 @@ do_get_tracing_options(Hook, Host, MaybeMap) -> case MaybeMap of undefined -> undefined; - #{'_' := #{<<"*">> := Opts}} -> % Tracing everything + #{all := #{<<"*">> := Opts}} -> % Tracing everything Opts; - #{'_' := HostOpts} -> % Tracing all hooks for some hosts + #{all := HostOpts} -> % Tracing all hooks for some hosts maps:get(Host, HostOpts, undefined); #{}=TraceHooksOpts -> HostOpts = maps:get(Hook, TraceHooksOpts, #{}), @@ -486,60 +491,119 @@ run_fold2([{Seq, Module, Function} | Ls], Hook, Val, Args, Host, TracingOpts) -> end. foreach_start_hook_tracing(TracingOpts, Hook, Host, Args) -> - run_event_handler(TracingOpts, Hook, Host, start_hook, [Args], foreach). + run_event_handlers(TracingOpts, Hook, Host, start_hook, [Args], foreach). foreach_stop_hook_tracing(TracingOpts, Hook, Host, Args, BreakCallback) -> - run_event_handler(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], foreach). + run_event_handlers(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], foreach). foreach_start_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq) -> - run_event_handler(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], foreach). + run_event_handlers(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], foreach). foreach_stop_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq, Res) -> - run_event_handler(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], foreach). + run_event_handlers(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], foreach). fold_start_hook_tracing(TracingOpts, Hook, Host, Args) -> - run_event_handler(TracingOpts, Hook, Host, start_hook, [Args], fold). + run_event_handlers(TracingOpts, Hook, Host, start_hook, [Args], fold). fold_stop_hook_tracing(TracingOpts, Hook, Host, Args, BreakCallback) -> - run_event_handler(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], fold). + run_event_handlers(TracingOpts, Hook, Host, stop_hook, [Args, BreakCallback], fold). fold_start_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq) -> - run_event_handler(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], fold). + run_event_handlers(TracingOpts, Hook, Host, start_callback, [Mod, Func, Args, Seq], fold). fold_stop_callback_tracing(TracingOpts, Hook, Host, Mod, Func, Args, Seq, Res) -> - run_event_handler(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], fold). + run_event_handlers(TracingOpts, Hook, Host, stop_callback, [Mod, Func, Args, Seq, Res], fold). -run_event_handler(TracingOpts, Hook, Host, Event, EventArgs, RunType) -> - EventHandler = maps:get(event_handler, TracingOpts, fun default_tracing_event_handler/6), +run_event_handlers(TracingOpts, Hook, Host, Event, EventArgs, RunType) -> + EventHandlerList = maps:get(event_handler_list, TracingOpts, default_tracing_event_handler_list()), EventHandlerOpts = maps:get(event_handler_options, TracingOpts, #{}), - try - if - erlang:is_function(EventHandler) -> - erlang:apply(EventHandler, [Event, EventArgs, RunType, Hook, Host, EventHandlerOpts]); - true -> - EventHandler:handle_hook_tracing_event(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts) - end - of - _ -> - ok - catch - ?EX_RULE(E, R, St) -> - ?ERROR_MSG("Tracing event handler exception(~0p): ~0p: ~0p", [E, R, St]), - ok - end. - -default_tracing_event_handler(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts) -> - % For now: - case maps:get(timing, EventHandlerOpts, true) of + if + erlang:is_list(EventHandlerList) -> + lists:foreach( + fun(EventHandler) -> + try + if + erlang:is_function(EventHandler) -> + erlang:apply( + EventHandler, + [Event, EventArgs, RunType, Hook, Host, EventHandlerOpts, TracingOpts] + ); + true -> + EventHandler:handle_hook_tracing_event( + Event, + EventArgs, + RunType, + Hook, + Host, + EventHandlerOpts, + TracingOpts + ) + end + of + _ -> + ok + catch + ?EX_RULE(E, R, St) -> + ?ERROR_MSG( + "(~0p|~ts|~0p) Tracing event '~0p' handler exception(~0p): ~0p: ~0p", + [Hook, Host, erlang:self(), EventHandler, E, R, St] + ), + ok + end + end, + EventHandlerList + ); % ok true -> - tracing_timing_event_handler(Event, EventArgs, RunType, Hook, Host, EventHandlerOpts); - _ -> + ?ERROR_MSG("(~0p|~ts|~0p) Bad event handler list: ~0p", [Hook, Host, erlang:self(), EventHandlerList]), ok end. -tracing_timing_event_handler(start_hook, _, _, Hook, Host, EventHandlerOpts) -> +default_tracing_event_handler_list() -> + [fun tracing_timing_event_handler/7]. + +tracing_timing_event_handler(start_hook, EventArgs, RunType, Hook, Host, _, TracingOpts) -> HookStart = erlang:system_time(nanosecond), - tracing_output(EventHandlerOpts, "(~0p|~ts) Timing started\n", [Hook, Host]), + % Generate new event: + run_event_handlers(TracingOpts, Hook, Host, start_hook_timing, EventArgs ++ [HookStart], RunType); +tracing_timing_event_handler(stop_hook, EventArgs, RunType, Hook, Host, _, TracingOpts) -> + HookStop = erlang:system_time(nanosecond), + TimingMap = #{} = erlang:get(?TIMING_KEY), + {HookStart, CallbackList} = maps:get({Hook, Host}, TimingMap), + {CallbackListTiming, CallbackListTotal} = lists:foldl( + fun({_, _, _, CallbackStart, CallbackStop}=CallbackTimingInfo, {CallbackListTimingX, Total}) -> + {CallbackListTimingX ++ [CallbackTimingInfo], Total + (CallbackStop - CallbackStart)} + end, + {[], 0}, + CallbackList + ), + % Generate new event: + run_event_handlers( + TracingOpts, + Hook, + Host, + stop_hook_timing, + EventArgs ++ [HookStart, HookStop, CallbackListTiming, CallbackListTotal], + RunType + ); +tracing_timing_event_handler(start_callback, EventArgs, RunType, Hook, Host, _, TracingOpts) -> + CallbackStart = erlang:system_time(nanosecond), + % Generate new event: + run_event_handlers(TracingOpts, Hook, Host, start_callback_timing, EventArgs ++ [CallbackStart], RunType); +tracing_timing_event_handler(stop_callback, EventArgs, RunType, Hook, Host, _, TracingOpts) -> + CallbackStop = erlang:system_time(nanosecond), + TimingMap = #{} = erlang:get(?TIMING_KEY), + {_, [{_, _, _, CallbackStart} | _]} = maps:get({Hook, Host}, TimingMap), + run_event_handlers( + TracingOpts, + Hook, + Host, + stop_callback_timing, + EventArgs ++ [CallbackStart, CallbackStop], + RunType + ), + ok; +tracing_timing_event_handler(start_hook_timing, [_, HookStart], RunType, Hook, Host, EventHandlerOpts, _) -> + tracing_output(EventHandlerOpts, "(~0p|~ts|~0p|~0p) Timing started\n", [Hook, Host, erlang:self(), RunType]), case erlang:get(?TIMING_KEY) of #{}=TimingMap -> erlang:put(?TIMING_KEY, TimingMap#{{Hook, Host} => {HookStart, []}}); @@ -547,44 +611,58 @@ tracing_timing_event_handler(start_hook, _, _, Hook, Host, EventHandlerOpts) -> erlang:put(?TIMING_KEY, #{{Hook, Host} => {HookStart, []}}) end, ok; -tracing_timing_event_handler(stop_hook, _, _, Hook, Host, EventHandlerOpts) -> - HookStop = erlang:system_time(nanosecond), - TimingMap = #{} = erlang:get(?TIMING_KEY), - {HookStart, CallbackList} = maps:get({Hook, Host}, TimingMap), +tracing_timing_event_handler( + stop_hook_timing, + [_, _, HookStart, HookStop, CallbackListTiming, CallbackListTotal], + RunType, + Hook, + Host, + EventHandlerOpts, + _ +) -> if - erlang:length(CallbackList) < 2 -> % We don't need sorted timing result + erlang:length(CallbackListTiming) < 2 -> % We don't need sorted timing result ok; true -> - {CallbackListText, CallbackListTotal} = + CallbackListTimingText = lists:foldl( - fun({Mod, Func, Arity, Diff}, {CallbackText, Total}) -> - { - CallbackText - ++ "\n\t" - ++ mfa_string({Mod, Func, Arity}) - ++ " -> " - ++ erlang:integer_to_list(Diff) - ++ "ns", - Total + Diff - } + fun({Mod, Func, Arity, Diff}, CallbackListTimingText) -> + CallbackListTimingText + ++ "\n\t" + ++ mfa_string({Mod, Func, Arity}) + ++ " -> " + ++ human_readable_time_string(Diff) end, - {"", 0}, - lists:keysort(4, CallbackList) + "", + lists:keysort( + 4, + [ + {Mod, Func, Arity, CallbackStop - CallbackStart} || + {Mod, Func, Arity, CallbackStart, CallbackStop} <- CallbackListTiming + ] + ) ), tracing_output( EventHandlerOpts, - "(~0p|~ts) All callbacks got ~0pns to run. Sorted running time:" - ++ CallbackListText + "(~0p|~ts|~0p|~0p) All callbacks took ~ts to run. Sorted running time:" + ++ CallbackListTimingText ++ "\n", - [Hook, Host, CallbackListTotal] + [Hook, Host, erlang:self(), RunType, human_readable_time_string(CallbackListTotal)] ), tracing_output( EventHandlerOpts, - "(~0p|~ts) Time calculations for all callbacks got ~0pns\n", - [Hook, Host, (HookStop - HookStart) - CallbackListTotal] + "(~0p|~ts|~0p|~0p) Time calculations for all callbacks took ~ts\n", + [ + Hook, + Host, + erlang:self(), + RunType, + human_readable_time_string((HookStop - HookStart) - CallbackListTotal) + ] ) end, - tracing_output(EventHandlerOpts, "(~0p|~ts) Timing stopped\n", [Hook, Host]), + tracing_output(EventHandlerOpts, "(~0p|~ts|~0p|~0p) Timing stopped\n", [Hook, Host, erlang:self(), RunType]), + TimingMap = #{} = erlang:get(?TIMING_KEY), NewTimingMap = maps:remove({Hook, Host}, TimingMap), if NewTimingMap == #{} -> @@ -593,8 +671,7 @@ tracing_timing_event_handler(stop_hook, _, _, Hook, Host, EventHandlerOpts) -> erlang:put(?TIMING_KEY, NewTimingMap) end, ok; -tracing_timing_event_handler(start_callback, [Mod, Func, Args | _], _, Hook, Host, _) -> - CallbackStart = erlang:system_time(nanosecond), +tracing_timing_event_handler(start_callback_timing, [Mod, Func, Args, _, CallbackStart], _, Hook, Host, _, _) -> TimingMap = #{} = erlang:get(?TIMING_KEY), {HookStart, Callbacks} = maps:get({Hook, Host}, TimingMap), erlang:put( @@ -604,25 +681,34 @@ tracing_timing_event_handler(start_callback, [Mod, Func, Args | _], _, Hook, Hos } ), ok; -tracing_timing_event_handler(stop_callback, _, _, Hook, Host, EventHandlerOpts) -> - CallbackStop = erlang:system_time(nanosecond), +tracing_timing_event_handler( + stop_callback_timing, + [Mod, Func, _, _, _, CallbackStart, CallbackStop], + RunType, + Hook, + Host, + EventHandlerOpts, + _ +) -> TimingMap = #{} = erlang:get(?TIMING_KEY), {HookStart, [{Mod, Func, Arity, CallbackStart} | Callbacks]} = maps:get({Hook, Host}, TimingMap), - tracing_output( + maps:get(output_for_each_callback, maps:get(timing, EventHandlerOpts, #{}), false) andalso tracing_output( EventHandlerOpts, - "(~0p|~ts) " ++ - mfa_string({Mod, Func, Arity}) ++ - " got " ++ - erlang:integer_to_list(CallbackStop - CallbackStart) ++ - "ns\n", - [Hook, Host] + "(~0p|~ts|~0p|~0p) " + ++ mfa_string({Mod, Func, Arity}) + ++ " took " + ++ human_readable_time_string(CallbackStop - CallbackStart) + ++ "\n", + [Hook, Host, erlang:self(), RunType] ), erlang:put( ?TIMING_KEY, TimingMap#{ - {Hook, Host} => {HookStart, [{Mod, Func, Arity, CallbackStop - CallbackStart} | Callbacks]} + {Hook, Host} => {HookStart, [{Mod, Func, Arity, CallbackStart, CallbackStop} | Callbacks]} } ), + ok; +tracing_timing_event_handler(_, _, _, _, _, _, _) -> ok. tracing_output(#{output_function := OutputF}, Text, Args) -> @@ -651,3 +737,17 @@ mfa_string({_, Fun, _}) when erlang:is_function(Fun) -> io_lib:format("~0p", [Fun]); mfa_string({Mod, Func, Arity}) -> erlang:atom_to_list(Mod) ++ ":" ++ erlang:atom_to_list(Func) ++ "/" ++ erlang:integer_to_list(Arity). + +human_readable_time_string(TimeNS) -> + {Time, Unit, Decimals} = + if + TimeNS >= 1000000000 -> + {TimeNS / 1000000000, "", 10}; + TimeNS >= 1000000 -> + {TimeNS / 1000000, "m", 7}; + TimeNS >= 1000 -> + {TimeNS / 1000, "μ", 4}; + true -> + {TimeNS / 1, "n", 0} + end, + erlang:float_to_list(Time, [{decimals, Decimals}, compact]) ++ Unit ++ "s". From adf0f87e99310ea06925a4e88edeaf685d8d0cd5 Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Mon, 24 Jan 2022 08:01:39 +0800 Subject: [PATCH 151/440] Fix typos --- CHANGELOG.md | 10 +++++----- _checkouts/configure_deps/src/configure_deps_prv.erl | 2 +- man/ejabberd.yml.5 | 12 ++++++------ src/ejabberd_doc.erl | 4 ++-- src/ejabberd_options_doc.erl | 4 ++-- src/ejabberd_s2s.erl | 2 +- src/ejabberd_web_admin.erl | 4 ++-- src/mod_admin_extra.erl | 2 +- src/mod_avatar.erl | 4 ++-- src/mod_pubsub.erl | 2 +- src/mod_stream_mgmt.erl | 2 +- test/ejabberd_SUITE.erl | 2 +- test/ejabberd_SUITE_data/openssl.cnf | 6 +++--- test/elixir-config/config_test.exs | 2 +- test/mam_tests.erl | 2 +- test/muc_tests.erl | 6 +++--- test/proxy65_tests.erl | 2 +- test/pubsub_tests.erl | 2 +- test/upload_tests.erl | 2 +- test/vcard_tests.erl | 2 +- tools/update-deps-releases.pl | 2 +- 21 files changed, 38 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 288931b5c..2f804a359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -213,7 +213,7 @@ Translations: - Fix problem with leaving old data when updating shared rosters - Fix edge case that caused failure of resuming old sessions with stream management. -- Fix crash when room that was started with loging enabled was later +- Fix crash when room that was started with logging enabled was later changed to logging disabled - Increase default shaper limits (this should help with delays for clients that are using jingle) @@ -278,7 +278,7 @@ Translations: for all backends not only SQL - Add infrastructure for having module documentation directly in individual module source code -- Generate man page automaticaly +- Generate man page automatically - Implement copy feature in mod_carboncopy * Fixes @@ -286,7 +286,7 @@ Translations: - Fix handling of result in xmlrpc module - Make webadmin work even when accessed through not declared domain - Better error reporting in xmlrpc -- Limit ammount of results returned by disco queries to pubsub nodes +- Limit amount of results returned by disco queries to pubsub nodes - Improve validation of configured JWT keys - Fix race condition in Redis/SQL startup - Fix loading order of third party modules @@ -387,7 +387,7 @@ Translations: - Improve handling of unexpected iq in mod_muc_room - Attach mod_muc_room processes to a supervisor - Restore room when receiving message or generic iq for not started room -- Distribute routing of MUC messages accross all CPU cores +- Distribute routing of MUC messages across all CPU cores * PubSub - Fix pending nodes retrieval for SQL backend @@ -421,7 +421,7 @@ Translations: - Make static hooks analyzer working again * MUC -- Service admins are allowed to recreate room even if archiv is nonempty +- Service admins are allowed to recreate room even if archive is nonempty - New option user_mucsub_from_muc_archive - Avoid late arrival of get_disco_item response - Handle get_subscribed_rooms call from mod_muc_room pid diff --git a/_checkouts/configure_deps/src/configure_deps_prv.erl b/_checkouts/configure_deps/src/configure_deps_prv.erl index f4333e4f0..91f2a3adc 100644 --- a/_checkouts/configure_deps/src/configure_deps_prv.erl +++ b/_checkouts/configure_deps/src/configure_deps_prv.erl @@ -19,7 +19,7 @@ init(State) -> {example, "rebar3 configure-deps"}, % How to use the plugin {opts, []}, % list of options understood by the plugin {short_desc, "Explicitly run ./configure for dependencies"}, - {desc, "A rebar plugin to allow explicitly running ./configure on depdendencies. Useful if dependencies might change prior to compilation when configure is run."} + {desc, "A rebar plugin to allow explicitly running ./configure on dependencies. Useful if dependencies might change prior to compilation when configure is run."} ]), {ok, rebar_state:add_provider(State, Provider)}. diff --git a/man/ejabberd.yml.5 b/man/ejabberd.yml.5 index 8fb59c381..8c5e6bebd 100644 --- a/man/ejabberd.yml.5 +++ b/man/ejabberd.yml.5 @@ -52,7 +52,7 @@ YAML is indentation sensitive, so make sure you respect indentation, or otherwis .sp .5v .RE .sp -Logically, configuration options are splitted into 3 main categories: \fIModules\fR, \fIListeners\fR and everything else called \fITop Level\fR options\&. Thus this document is splitted into 3 main chapters describing each category separately\&. So, the contents of ejabberd\&.yml will typically look like this: +Logically, configuration options are split into 3 main categories: \fIModules\fR, \fIListeners\fR and everything else called \fITop Level\fR options\&. Thus this document is split into 3 main chapters describing each category separately\&. So, the contents of ejabberd\&.yml will typically look like this: .sp .if n \{\ .RS 4 @@ -443,7 +443,7 @@ The option defines in what format the users passwords are stored: .PP \fBauth_scram_hash\fR: \fIsha | sha256 | sha512\fR .RS 4 -Hash algorith that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is +Hash algorithm that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is \fIsha\fR\&. .RE .PP @@ -525,7 +525,7 @@ Whether to enable or disable TLS compression for c2s connections\&. The default Path to a file of CA root certificates\&. The default is to use system defined file if possible\&. .RE .sp -For server conections, this \fIca_file\fR option is overriden by the s2s_cafile option\&. +For server connections, this \fIca_file\fR option is overridden by the s2s_cafile option\&. .PP \fBcache_life_time\fR: \fItimeout()\fR .RS 4 @@ -2066,7 +2066,7 @@ The module depends on \fImod_vcard\fR, \fImod_vcard_xupdate\fR and \fImod_pubsub .PP \fBconvert\fR: \fI{From: To}\fR .RS 4 -Defines image convertion rules: the format in +Defines image conversion rules: the format in \fIFrom\fR will be converted to format in \fITo\fR\&. The value of @@ -2091,7 +2091,7 @@ convert: .PP \fBrate_limit\fR: \fINumber\fR .RS 4 -Limit any given JID by the number of avatars it is able to convert per minute\&. This is to protect the server from image convertion DoS\&. The default value is +Limit any given JID by the number of avatars it is able to convert per minute\&. This is to protect the server from image conversion DoS\&. The default value is \fI10\fR\&. .RE .RE @@ -5414,7 +5414,7 @@ plugin handles the default behaviour and follows standard XEP\-0060 implementati .IP \(bu 2.3 .\} \fIpep\fR -plugin adds extention to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. Adding pep allows to handle PEP automatically\&. +plugin adds extension to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. Adding pep allows to handle PEP automatically\&. .RE .RE .PP diff --git a/src/ejabberd_doc.erl b/src/ejabberd_doc.erl index 77f9fab48..b6369d968 100644 --- a/src/ejabberd_doc.erl +++ b/src/ejabberd_doc.erl @@ -231,9 +231,9 @@ man_header(Lang) -> "indentation, or otherwise you will get pretty cryptic " "configuration errors.")), io_lib:nl(), - tr(Lang, ?T("Logically, configuration options are splitted into 3 main categories: " + tr(Lang, ?T("Logically, configuration options are split into 3 main categories: " "'Modules', 'Listeners' and everything else called 'Top Level' options. " - "Thus this document is splitted into 3 main chapters describing each " + "Thus this document is split into 3 main chapters describing each " "category separately. So, the contents of ejabberd.yml will typically " "look like this:")), io_lib:nl(), diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index a725f4572..ffb4caf32 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -387,7 +387,7 @@ doc() -> {auth_scram_hash, #{value => "sha | sha256 | sha512", desc => - ?T("Hash algorith that should be used to store password in SCRAM format. " + ?T("Hash algorithm that should be used to store password in SCRAM format. " "You shouldn't change this if you already have passwords generated with " "a different algorithm - users that have such passwords will not be able " "to authenticate. The default value is 'sha'.")}}, @@ -449,7 +449,7 @@ doc() -> desc => [?T("Path to a file of CA root certificates. " "The default is to use system defined file if possible."), "", - ?T("For server conections, this 'ca_file' option is overriden by the http://../toplevel/#s2s-cafile[s2s_cafile] option."), "" + ?T("For server connections, this 'ca_file' option is overridden by the http://../toplevel/#s2s-cafile[s2s_cafile] option."), "" ]}}, {captcha_cmd, #{value => ?T("Path"), diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 04490071c..a5cf23d1e 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -387,7 +387,7 @@ start_connection(From, To, Opts) -> MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode, Opts); true -> - %% We choose a connexion from the pool of opened ones. + %% We choose a connection from the pool of opened ones. {ok, choose_connection(From, L)} end end. diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index ee50a0031..85a639687 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -1857,11 +1857,11 @@ build_elements_pages_list(Size, PageNumber, PageSize) -> ?C(<<" [", (integer_to_binary(PageNumber))/binary, "] ">>)). calculate_pages_number(Size, PageSize) -> - Remainer = case Size rem PageSize of + Remainder = case Size rem PageSize of 0 -> 0; _ -> 1 end, - case (Size div PageSize) + Remainer of + case (Size div PageSize) + Remainder of 1 -> 0; Res -> Res end. diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index 9834acf01..ea73c55d9 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -695,7 +695,7 @@ get_commands_spec() -> args_example = [<<"group3">>, <<"myserver.com">>], args_desc = ["Group identifier", "Group server name"], result_example = [{<<"name">>, "Group 3"}, {<<"displayed_groups">>, "group1"}], - result_desc = "List of group informations, as key and value", + result_desc = "List of group information, as key and value", result = {informations, {list, {information, {tuple, [{key, string}, {value, string}]}}}}}, #ejabberd_commands{name = srg_get_members, tags = [shared_roster_group], desc = "Get members of a Shared Roster Group", diff --git a/src/mod_avatar.erl b/src/mod_avatar.erl index 09329853d..19c82a6bf 100644 --- a/src/mod_avatar.erl +++ b/src/mod_avatar.erl @@ -475,7 +475,7 @@ mod_doc() -> [{convert, #{value => "{From: To}", desc => - ?T("Defines image convertion rules: the format in 'From' " + ?T("Defines image conversion rules: the format in 'From' " "will be converted to format in 'To'. The value of 'From' " "can also be 'default', which is match-all rule. NOTE: " "the list of supported formats is detected at compile time " @@ -489,4 +489,4 @@ mod_doc() -> desc => ?T("Limit any given JID by the number of avatars it is able " "to convert per minute. This is to protect the server from " - "image convertion DoS. The default value is '10'.")}}]}. + "image conversion DoS. The default value is '10'.")}}]}. diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index d161ec10c..58aad47cb 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -4474,7 +4474,7 @@ mod_doc() -> "to the 'create' stanza element."), ?T("- 'flat' plugin handles the default behaviour and " "follows standard XEP-0060 implementation."), - ?T("- 'pep' plugin adds extention to handle Personal " + ?T("- 'pep' plugin adds extension to handle Personal " "Eventing Protocol (XEP-0163) to the PubSub engine. " "Adding pep allows to handle PEP automatically.")]}}, {vcard, diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index f60f6722b..6d4c768c8 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -268,7 +268,7 @@ c2s_handle_info(State, {timeout, _, Timeout}) when Timeout == ack_timeout; Timeout == pending_timeout -> %% Late arrival of an already cancelled timer: we just ignore it. %% This might happen because misc:cancel_timer/1 doesn't guarantee - %% timer cancelation in the case when p1_server is used. + %% timer cancellation in the case when p1_server is used. {stop, State}; c2s_handle_info(State, _) -> State. diff --git a/test/ejabberd_SUITE.erl b/test/ejabberd_SUITE.erl index bf837d269..237ac3f56 100644 --- a/test/ejabberd_SUITE.erl +++ b/test/ejabberd_SUITE.erl @@ -76,7 +76,7 @@ init_per_group(Group, Config) -> %% All backends enabled do_init_per_group(Group, Config); Backends -> - %% Skipped backends that were not explicitely enabled + %% Skipped backends that were not explicitly enabled case lists:member(Group, Backends) of true -> do_init_per_group(Group, Config); diff --git a/test/ejabberd_SUITE_data/openssl.cnf b/test/ejabberd_SUITE_data/openssl.cnf index 594653b79..7003c68fc 100644 --- a/test/ejabberd_SUITE_data/openssl.cnf +++ b/test/ejabberd_SUITE_data/openssl.cnf @@ -39,7 +39,7 @@ certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of - # several ctificates with same subject. + # several certificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate @@ -50,7 +50,7 @@ crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file -x509_extensions = usr_cert # The extentions to add to the cert +x509_extensions = usr_cert # The extensions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. @@ -102,7 +102,7 @@ default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes -x509_extensions = v3_ca # The extentions to add to the self signed cert +x509_extensions = v3_ca # The extensions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret diff --git a/test/elixir-config/config_test.exs b/test/elixir-config/config_test.exs index c359c49c3..8970e02e6 100644 --- a/test/elixir-config/config_test.exs +++ b/test/elixir-config/config_test.exs @@ -47,7 +47,7 @@ defmodule Ejabberd.ConfigTest do assert is_function(register_hook.fun) end - # TODO: When enalbed, this test causes the evaluation of a different config file, so + # TODO: When enabled, this test causes the evaluation of a different config file, so # the other tests, that uses the store, are compromised because the data is different. # So, until a good way is found, this test should remain disabed. # diff --git a/test/mam_tests.erl b/test/mam_tests.erl index 0de380351..e8fb59cee 100644 --- a/test/mam_tests.erl +++ b/test/mam_tests.erl @@ -454,7 +454,7 @@ recv_archived_messages(Config, From, To, QID, Range) -> MyJID = my_jid(Config), lists:foreach( fun(N) -> - ct:comment("Retreiving ~pth message in range ~p", + ct:comment("Retrieving ~pth message in range ~p", [N, Range]), Body = xmpp:mk_text(integer_to_binary(N)), #message{to = MyJID, diff --git a/test/muc_tests.erl b/test/muc_tests.erl index ea3fd1c74..95d9c3b69 100644 --- a/test/muc_tests.erl +++ b/test/muc_tests.erl @@ -191,7 +191,7 @@ service_disco_items(Config) -> service_vcard(Config) -> MUC = muc_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(MUC)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(MUC)]), VCard = mod_muc_opt:vcard(?config(server, Config)), #iq{type = result, sub_els = [VCard]} = send_recv(Config, #iq{type = get, to = MUC, sub_els = [#vcard_temp{}]}), @@ -1474,7 +1474,7 @@ config_voice_request_interval_slave(Config) -> denied = get_event(Config), ct:comment("Requesting voice again"), send(Config, #message{to = Room, sub_els = [X]}), - ct:comment("Receving voice request error because we're sending to fast"), + ct:comment("Receiving voice request error because we're sending to fast"), #message{from = Room, type = error} = Err = recv_message(Config), #stanza_error{reason = 'resource-constraint'} = xmpp:get_error(Err), ct:comment("Waiting for 5 seconds"), @@ -1872,7 +1872,7 @@ set_vcard(Config, VCard) -> get_vcard(Config) -> Room = muc_room_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(Room)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(Room)]), case send_recv(Config, #iq{type = get, to = Room, sub_els = [#vcard_temp{}]}) of #iq{type = result, sub_els = [VCard]} -> diff --git a/test/proxy65_tests.erl b/test/proxy65_tests.erl index 618252eb0..bf6faf1e5 100644 --- a/test/proxy65_tests.erl +++ b/test/proxy65_tests.erl @@ -48,7 +48,7 @@ feature_enabled(Config) -> service_vcard(Config) -> JID = proxy_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(JID)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(JID)]), VCard = mod_proxy65_opt:vcard(?config(server, Config)), #iq{type = result, sub_els = [VCard]} = send_recv(Config, #iq{type = get, to = JID, sub_els = [#vcard_temp{}]}), diff --git a/test/pubsub_tests.erl b/test/pubsub_tests.erl index 2bca35173..475e4fbd1 100644 --- a/test/pubsub_tests.erl +++ b/test/pubsub_tests.erl @@ -87,7 +87,7 @@ test_features(Config) -> test_vcard(Config) -> JID = pubsub_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(JID)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(JID)]), VCard = mod_pubsub_opt:vcard(?config(server, Config)), #iq{type = result, sub_els = [VCard]} = send_recv(Config, #iq{type = get, to = JID, sub_els = [#vcard_temp{}]}), diff --git a/test/upload_tests.erl b/test/upload_tests.erl index 434d7be11..edbc6dcce 100644 --- a/test/upload_tests.erl +++ b/test/upload_tests.erl @@ -55,7 +55,7 @@ feature_enabled(Config) -> service_vcard(Config) -> Upload = upload_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(Upload)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(Upload)]), VCard = mod_http_upload_opt:vcard(?config(server, Config)), #iq{type = result, sub_els = [VCard]} = send_recv(Config, #iq{type = get, to = Upload, sub_els = [#vcard_temp{}]}), diff --git a/test/vcard_tests.erl b/test/vcard_tests.erl index 8e16f7ac0..846b32ee9 100644 --- a/test/vcard_tests.erl +++ b/test/vcard_tests.erl @@ -90,7 +90,7 @@ get_set(Config) -> service_vcard(Config) -> JID = server_jid(Config), - ct:comment("Retreiving vCard from ~s", [jid:encode(JID)]), + ct:comment("Retrieving vCard from ~s", [jid:encode(JID)]), VCard = mod_vcard_opt:vcard(?config(server, Config)), #iq{type = result, sub_els = [VCard]} = send_recv(Config, #iq{type = get, to = JID, sub_els = [#vcard_temp{}]}), diff --git a/tools/update-deps-releases.pl b/tools/update-deps-releases.pl index 4f7e55972..b450bd69b 100755 --- a/tools/update-deps-releases.pl +++ b/tools/update-deps-releases.pl @@ -413,7 +413,7 @@ while (1) { my $cmd = show_commands($old_deps ? (U => "Update dependency") : (), $changed_deps ? (T => "Tag new release") : (), @operations ? (A => "Apply changes") : (), - R => "Refresh repositiories", + R => "Refresh repositories", H => "What release to Hex", E => "Exit"); last if $cmd eq "E"; From 585afcbc772f316ab52bf9b02389d7e110258229 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 11 Jan 2022 15:58:17 +0100 Subject: [PATCH 152/440] Pass property name as expected in mqtt_codec (fixes login using MQTT 5) --- src/mod_mqtt_mnesia.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_mqtt_mnesia.erl b/src/mod_mqtt_mnesia.erl index 92c43d2ee..20c533ede 100644 --- a/src/mod_mqtt_mnesia.erl +++ b/src/mod_mqtt_mnesia.erl @@ -103,7 +103,7 @@ lookup_published({_, S, _}, Topic) -> correlation_data = CorrelationData, content_type = ContentType, user_properties = UserProps}] -> - Props = #{payload_format => PayloadFormat, + Props = #{payload_format_indicator => PayloadFormat, response_topic => ResponseTopic, correlation_data => CorrelationData, content_type => ContentType, From 1b192987d20cc5f572c7324966a0dde033e606d4 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 11 Jan 2022 13:53:32 +0100 Subject: [PATCH 153/440] Support MQTT subscriptions spread over the cluster (#3750) --- src/mod_mqtt_mnesia.erl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mod_mqtt_mnesia.erl b/src/mod_mqtt_mnesia.erl index 20c533ede..6c230a8f6 100644 --- a/src/mod_mqtt_mnesia.erl +++ b/src/mod_mqtt_mnesia.erl @@ -22,7 +22,7 @@ -export([init/2, publish/6, delete_published/2, lookup_published/2]). -export([list_topics/1, use_cache/1]). -export([init/0]). --export([subscribe/4, unsubscribe/2, find_subscriber/2]). +-export([subscribe/4, unsubscribe/2, find_subscriber/2, mqtree_match/1]). -export([open_session/1, close_session/1, lookup_session/1, get_sessions/2]). -include("logger.hrl"). @@ -249,9 +249,16 @@ unsubscribe({U, S, R} = USR, Topic) -> Reason, [jid:encode(USR), Topic]) end. -find_subscriber(S, Topic) when is_binary(Topic) -> +mqtree_match(Topic) -> Tree = mqtree:whereis(mqtt_sub_index), - case mqtree:match(Tree, Topic) of + mqtree:match(Tree, Topic). + +mqtree_multi_match(Topic) -> + {Res, []} = ejabberd_cluster:multicall(?MODULE, mqtree_match, [Topic]), + lists:umerge(Res). + +find_subscriber(S, Topic) when is_binary(Topic) -> + case mqtree_multi_match(Topic) of [Filter|Filters] -> find_subscriber(S, {Filters, {Filter, S, '_', '_'}}); [] -> From 7714046511a7fbfd7c37fdbcf76831ae53ea5d86 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 18 Jan 2022 16:40:04 +0100 Subject: [PATCH 154/440] Run autoupdate to replace obsolete AC_HELP_STRING with AS_HELP_STRING This change is required to work with autoconf 2.71 or higher, and it works with autoconf 2.59 or higher. --- configure.ac | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/configure.ac b/configure.ac index 1b0500e0d..b086a7b6e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_PREREQ(2.53) +AC_PREREQ(2.59) AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 0.0` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd]) REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)" REQUIRE_ERLANG_MAX="100.0.0 (No Max)" @@ -19,8 +19,7 @@ fi # Checks Erlang runtime and compiler AC_ARG_WITH(erlang, - AC_HELP_STRING([--with-erlang=dir], - [search for erlang in dir]), + AS_HELP_STRING([--with-erlang=dir],[search for erlang in dir]), [if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_erlang" = "X"; then extra_erl_path="" else @@ -29,8 +28,7 @@ fi ]) AC_ARG_WITH(rebar, - AC_HELP_STRING([--with-rebar=bin], - [use the rebar/rebar3/mix binary specified]), + AS_HELP_STRING([--with-rebar=bin],[use the rebar/rebar3/mix binary specified]), [if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then rebar="rebar" else @@ -70,7 +68,7 @@ AC_CONFIG_FILES([Makefile vars.config]) AC_ARG_ENABLE(all, -[AC_HELP_STRING([--enable-all], [same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])], +[AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])], [case "${enableval}" in yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;; no) odbc=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;; @@ -78,7 +76,7 @@ AC_ARG_ENABLE(all, esac],[]) AC_ARG_ENABLE(debug, -[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])], +[AS_HELP_STRING([--enable-debug],[enable debug information (default: yes)])], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; @@ -86,7 +84,7 @@ AC_ARG_ENABLE(debug, esac],[if test "x$debug" = "x"; then debug=true; fi]) AC_ARG_ENABLE(elixir, -[AC_HELP_STRING([--enable-elixir], [enable Elixir support (default: no)])], +[AS_HELP_STRING([--enable-elixir],[enable Elixir support (default: no)])], [case "${enableval}" in yes) elixir=true ;; no) elixir=false ;; @@ -94,8 +92,7 @@ AC_ARG_ENABLE(elixir, esac],[if test "x$elixir" = "x"; then elixir=false; fi]) AC_ARG_ENABLE(erlang-version-check, -[AC_HELP_STRING([--enable-erlang-version-check], - [Check Erlang/OTP version (default: yes)])]) +[AS_HELP_STRING([--enable-erlang-version-check],[Check Erlang/OTP version (default: yes)])]) case "$enable_erlang_version_check" in yes|'') ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX]) @@ -106,7 +103,7 @@ case "$enable_erlang_version_check" in esac AC_ARG_ENABLE(full_xml, -[AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])], +[AS_HELP_STRING([--enable-full-xml],[use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])], [case "${enableval}" in yes) full_xml=true ;; no) full_xml=false ;; @@ -128,7 +125,7 @@ if test "$ENABLEGROUP" != ""; then fi AC_ARG_ENABLE(latest_deps, -[AC_HELP_STRING([--enable-latest-deps], [makes rebar use latest commits for dependencies instead of tagged versions (default: no)])], +[AS_HELP_STRING([--enable-latest-deps],[makes rebar use latest commits for dependencies instead of tagged versions (default: no)])], [case "${enableval}" in yes) latest_deps=true ;; no) latest_deps=false ;; @@ -136,7 +133,7 @@ AC_ARG_ENABLE(latest_deps, esac],[if test "x$latest_deps" = "x"; then latest_deps=false; fi]) AC_ARG_ENABLE(lua, -[AC_HELP_STRING([--enable-lua], [enable Lua support, to import from Prosody (default: no)])], +[AS_HELP_STRING([--enable-lua],[enable Lua support, to import from Prosody (default: no)])], [case "${enableval}" in yes) lua=true ;; no) lua=false ;; @@ -144,7 +141,7 @@ AC_ARG_ENABLE(lua, esac],[if test "x$lua" = "x"; then lua=false; fi]) AC_ARG_ENABLE(mssql, -[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])], +[AS_HELP_STRING([--enable-mssql],[use Microsoft SQL Server database (default: no, requires --enable-odbc)])], [case "${enableval}" in yes) db_type=mssql; mssql=true ;; no) db_type=generic; mssql=false ;; @@ -152,7 +149,7 @@ AC_ARG_ENABLE(mssql, esac],[db_type=generic]) AC_ARG_ENABLE(mysql, -[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])], +[AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])], [case "${enableval}" in yes) mysql=true ;; no) mysql=false ;; @@ -160,7 +157,7 @@ AC_ARG_ENABLE(mysql, esac],[if test "x$mysql" = "x"; then mysql=false; fi]) AC_ARG_ENABLE(new_sql_schema, -[AC_HELP_STRING([--enable-new-sql-schema], [use new SQL schema (default: no)])], +[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema (default: no)])], [case "${enableval}" in yes) new_sql_schema=true ;; no) new_sql_schema=false ;; @@ -168,7 +165,7 @@ AC_ARG_ENABLE(new_sql_schema, esac],[new_sql_schema=false]) AC_ARG_ENABLE(odbc, -[AC_HELP_STRING([--enable-odbc], [enable pure ODBC support (default: no)])], +[AS_HELP_STRING([--enable-odbc],[enable pure ODBC support (default: no)])], [case "${enableval}" in yes) odbc=true ;; no) odbc=false ;; @@ -176,7 +173,7 @@ AC_ARG_ENABLE(odbc, esac],[if test "x$odbc" = "x"; then odbc=false; fi]) AC_ARG_ENABLE(pam, -[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])], +[AS_HELP_STRING([--enable-pam],[enable PAM support (default: no)])], [case "${enableval}" in yes) pam=true ;; no) pam=false ;; @@ -184,7 +181,7 @@ AC_ARG_ENABLE(pam, esac],[if test "x$pam" = "x"; then pam=false; fi]) AC_ARG_ENABLE(pgsql, -[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])], +[AS_HELP_STRING([--enable-pgsql],[enable PostgreSQL support (default: no)])], [case "${enableval}" in yes) pgsql=true ;; no) pgsql=false ;; @@ -192,7 +189,7 @@ AC_ARG_ENABLE(pgsql, esac],[if test "x$pgsql" = "x"; then pgsql=false; fi]) AC_ARG_ENABLE(redis, -[AC_HELP_STRING([--enable-redis], [enable Redis support (default: no)])], +[AS_HELP_STRING([--enable-redis],[enable Redis support (default: no)])], [case "${enableval}" in yes) redis=true ;; no) redis=false ;; @@ -200,7 +197,7 @@ AC_ARG_ENABLE(redis, esac],[if test "x$redis" = "x"; then redis=false; fi]) AC_ARG_ENABLE(roster_gateway_workaround, -[AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])], +[AS_HELP_STRING([--enable-roster-gateway-workaround],[turn on workaround for processing gateway subscriptions (default: no)])], [case "${enableval}" in yes) roster_gateway_workaround=true ;; no) roster_gateway_workaround=false ;; @@ -208,7 +205,7 @@ AC_ARG_ENABLE(roster_gateway_workaround, esac],[roster_gateway_workaround=false]) AC_ARG_ENABLE(sip, -[AC_HELP_STRING([--enable-sip], [enable SIP support (default: no)])], +[AS_HELP_STRING([--enable-sip],[enable SIP support (default: no)])], [case "${enableval}" in yes) sip=true ;; no) sip=false ;; @@ -216,7 +213,7 @@ AC_ARG_ENABLE(sip, esac],[if test "x$sip" = "x"; then sip=false; fi]) AC_ARG_ENABLE(sqlite, -[AC_HELP_STRING([--enable-sqlite], [enable SQLite support (default: no)])], +[AS_HELP_STRING([--enable-sqlite],[enable SQLite support (default: no)])], [case "${enableval}" in yes) sqlite=true ;; no) sqlite=false ;; @@ -224,7 +221,7 @@ AC_ARG_ENABLE(sqlite, esac],[if test "x$sqlite" = "x"; then sqlite=false; fi]) AC_ARG_ENABLE(stun, -[AC_HELP_STRING([--enable-stun], [enable STUN/TURN support (default: yes)])], +[AS_HELP_STRING([--enable-stun],[enable STUN/TURN support (default: yes)])], [case "${enableval}" in yes) stun=true ;; no) stun=false ;; @@ -232,7 +229,7 @@ AC_ARG_ENABLE(stun, esac],[if test "x$stun" = "x"; then stun=true; fi]) AC_ARG_ENABLE(system_deps, -[AC_HELP_STRING([--enable-system-deps], [makes rebar use locally installed dependencies instead of downloading them (default: no)])], +[AS_HELP_STRING([--enable-system-deps],[makes rebar use locally installed dependencies instead of downloading them (default: no)])], [case "${enableval}" in yes) system_deps=true ;; no) system_deps=false ;; @@ -240,7 +237,7 @@ AC_ARG_ENABLE(system_deps, esac],[if test "x$system_deps" = "x"; then system_deps=false; fi]) AC_ARG_ENABLE(tools, -[AC_HELP_STRING([--enable-tools], [build development tools (default: no)])], +[AS_HELP_STRING([--enable-tools],[build development tools (default: no)])], [case "${enableval}" in yes) tools=true ;; no) tools=false ;; @@ -262,7 +259,7 @@ if test "$ENABLEUSER" != ""; then fi AC_ARG_ENABLE(zlib, -[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])], +[AS_HELP_STRING([--enable-zlib],[enable Stream Compression (XEP-0138) using zlib (default: yes)])], [case "${enableval}" in yes) zlib=true ;; no) zlib=false ;; From 4579fd6ac7893ef0fd9618cc3db042bceea33ac1 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 25 Jan 2022 13:17:33 +0100 Subject: [PATCH 155/440] Remove reference to the obsolete Vagrant environment --- README.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/README.md b/README.md index 163ead480..f62486150 100644 --- a/README.md +++ b/README.md @@ -177,19 +177,6 @@ Check the full list of targets: make help -Development ------------ - -In order to assist in the development of ejabberd, and particularly the -execution of the test suite, a Vagrant environment is available at -https://github.com/processone/ejabberd-vagrant-dev. - -To start ejabberd in development mode from the repository directory, you can -type a command like: - - EJABBERD_CONFIG_PATH=ejabberd.yml erl -pa ebin -pa deps/*/ebin -pa test -pa deps/elixir/lib/*/ebin/ -s ejabberd - - Translation ----------- From 52ac9410346b833262b876e8a120c7532955ab47 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 25 Jan 2022 16:57:27 +0100 Subject: [PATCH 156/440] mod_shared_roster: Adjust special group cache size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let the size of the cache used for 'special' groups (such as @all@ or @online@) depend on the number of virtual hosts, as the cache will contain seperate entries per domain. Thanks to Ingo Jürgensmann for reporting the issue. --- src/mod_shared_roster.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 358a8df32..f92e16496 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -150,7 +150,8 @@ depends(_Host, _Opts) -> -spec init_cache(module(), binary(), gen_mod:opts()) -> ok. init_cache(Mod, Host, Opts) -> - ets_cache:new(?SPECIAL_GROUPS_CACHE, [{max_size, 4}]), + NumHosts = length(ejabberd_option:hosts()), + ets_cache:new(?SPECIAL_GROUPS_CACHE, [{max_size, NumHosts * 4}]), case use_cache(Mod, Host) of true -> CacheOpts = cache_opts(Opts), From cae4fbb40ba9f61690224ba8a55de7dbae8e7f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 1 Feb 2022 15:18:50 +0100 Subject: [PATCH 157/440] Store all mucsub notifications not only message notifications Previously we stored only message/subject change notifications, but if user request also change notificaitons for affiliation/config/subscribers then i don't see reason why we shouldn't store it as well. --- src/mod_mam.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 9bf154f58..5bf42a759 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -740,7 +740,7 @@ should_archive(#message{body = Body, subject = Subject, #message{} = Msg -> should_archive(Msg, LServer); _ -> - false + misc:is_mucsub_message(Pkt) end end end From 8824a912ef95c8e4afb42f2d682c9a737f277016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 2 Feb 2022 16:19:13 +0100 Subject: [PATCH 158/440] Don't expect that socket will be available in c2s_terminated hook For detached connection we free socket, so let's make code account for this (and we really need it for printing debug informations). This makes sure we call ejabberd_sm:close_session --- src/ejabberd_c2s.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 3218cce51..e378953af 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -285,12 +285,12 @@ process_closed(State, Reason) -> stop_async(self()), State#{stop_reason => Reason}. -process_terminated(#{sid := SID, socket := Socket, - jid := JID, user := U, server := S, resource := R} = State, +process_terminated(#{sid := SID, jid := JID, user := U, server := S, resource := R} = State, Reason) -> Status = format_reason(State, Reason), ?INFO_MSG("(~ts) Closing c2s session for ~ts: ~ts", - [xmpp_socket:pp(Socket), jid:encode(JID), Status]), + [case State of #{socket := Socket} -> xmpp_socket:pp(Socket); _ -> <<"unknown">> end, + jid:encode(JID), Status]), Pres = #presence{type = unavailable, from = JID, to = jid:remove_resource(JID)}, From 9542cca0dba929089e1ee8783f9717d11afdb9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 2 Feb 2022 16:26:39 +0100 Subject: [PATCH 159/440] One more place where we need to handle socket field not being available --- src/ejabberd_c2s.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index e378953af..3033501cf 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -305,10 +305,10 @@ process_terminated(#{sid := SID, jid := JID, user := U, server := S, resource := end, bounce_message_queue(SID, JID), State1; -process_terminated(#{socket := Socket, - stop_reason := {tls, _}} = State, Reason) -> +process_terminated(#{stop_reason := {tls, _}} = State, Reason) -> ?WARNING_MSG("(~ts) Failed to secure c2s connection: ~ts", - [xmpp_socket:pp(Socket), format_reason(State, Reason)]), + [case State of #{socket := Socket} -> xmpp_socket:pp(Socket); _ -> <<"unknown">> end, +format_reason(State, Reason)]), State; process_terminated(State, _Reason) -> State. From 11c725018bdd156a5a31129656448782aef3e81a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 2 Feb 2022 18:33:45 +0100 Subject: [PATCH 160/440] Make dialyzer happy --- src/ejabberd_c2s.erl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 3033501cf..a62cac79a 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -289,8 +289,10 @@ process_terminated(#{sid := SID, jid := JID, user := U, server := S, resource := Reason) -> Status = format_reason(State, Reason), ?INFO_MSG("(~ts) Closing c2s session for ~ts: ~ts", - [case State of #{socket := Socket} -> xmpp_socket:pp(Socket); _ -> <<"unknown">> end, - jid:encode(JID), Status]), + [case maps:find(socket, State) of + {ok, Socket} -> xmpp_socket:pp(Socket); + _ -> <<"unknown">> + end, jid:encode(JID), Status]), Pres = #presence{type = unavailable, from = JID, to = jid:remove_resource(JID)}, @@ -307,8 +309,10 @@ process_terminated(#{sid := SID, jid := JID, user := U, server := S, resource := State1; process_terminated(#{stop_reason := {tls, _}} = State, Reason) -> ?WARNING_MSG("(~ts) Failed to secure c2s connection: ~ts", - [case State of #{socket := Socket} -> xmpp_socket:pp(Socket); _ -> <<"unknown">> end, -format_reason(State, Reason)]), + [case maps:find(socket, State) of + {ok, Socket} -> xmpp_socket:pp(Socket); + _ -> <<"unknown">> + end, format_reason(State, Reason)]), State; process_terminated(State, _Reason) -> State. From 67b5de05c73924f393d663991df2b03bf7e24d8f Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 2 Feb 2022 22:35:28 +0100 Subject: [PATCH 161/440] mod_pubsub: Unsubscribe JID on whitelist removal If a JID is removed from the affiliation lists of a node with access model 'whitelist', remove it from the list of subscribers as well. --- src/mod_pubsub.erl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 58aad47cb..c86d5fdbf 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -2262,10 +2262,11 @@ get_affiliations(Host, Node, JID) -> set_affiliations(Host, Node, From, Affs) -> Owner = jid:tolower(jid:remove_resource(From)), Action = - fun(#pubsub_node{type = Type, id = Nidx, owners = O} = N) -> + fun(#pubsub_node{type = Type, id = Nidx, owners = O, options = Options} = N) -> Owners = node_owners_call(Host, Type, Nidx, O), case lists:member(Owner, Owners) of true -> + AccessModel = get_option(Options, access_model), OwnerJID = jid:make(Owner), FilteredAffs = case Owners of @@ -2298,6 +2299,17 @@ set_affiliations(Host, Node, From, Affs) -> end; _ -> ok + end, + case AccessModel of + whitelist when Affiliation /= owner, + Affiliation /= publisher, + Affiliation /= member -> + node_action(Host, Type, + unsubscribe_node, + [Nidx, OwnerJID, JID, + all]); + _ -> + ok end end, FilteredAffs), {result, undefined}; From adbccbe852e3d9980e531ff206bebd6b2c983fba Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 17 Jan 2022 11:49:16 +0100 Subject: [PATCH 162/440] New "make relive" similar to "ejabberdctl live" without installing Prepare with: ./autogen.sh && ./configure --with-rebar=./rebar3 && make Or use this if you installed Elixir: ./autogen.sh && ./configure --with-rebar=mix && make Start without installing (it recompiles when necessary): make relive It stores config, database and logs in _build/relive/ There's available the well-known script: _build/relive/ejabberdctl Please note this fails immediately: r3:do(compile). This crashes a few seconds later: rebar3:run(["compile"]). Workaround that works correctly: ejabberd_admin:update(). --- Makefile.in | 41 ++++++++++++++++++++++++++++++++++------- config/runtime.exs | 26 ++++++++++++++++---------- rebar.config | 6 ++++++ rel/relive.config | 3 +++ rel/relive.escript | 26 ++++++++++++++++++++++++++ rel/setup-relive.sh | 30 ++++++++++++++++++++++++++++++ src/ejabberd_admin.erl | 11 ++++++++++- 7 files changed, 125 insertions(+), 18 deletions(-) create mode 100644 rel/relive.config create mode 100644 rel/relive.escript create mode 100755 rel/setup-relive.sh diff --git a/Makefile.in b/Makefile.in index 3066488f0..fa7fcd0a1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -113,6 +113,7 @@ ifeq "$(REBAR_VER)" "6" EBINDIR=$(DEPSDIR)/ejabberd/ebin REBARREL=MIX_ENV=prod $(REBAR) release --overwrite REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite + RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run else ifeq "$(REBAR_VER)" "3" SKIPDEPS= @@ -130,6 +131,7 @@ endif EBINDIR=$(DEPSDIR)/ejabberd/ebin REBARREL=$(REBAR) as prod tar REBARDEV=REBAR_PROFILE=dev $(REBAR) release + RELIVECMD=$(REBAR) relive else SKIPDEPS=skip_deps=true LISTDEPS=-q list-deps @@ -142,6 +144,8 @@ else EBINDIR=ebin REBARREL=$(REBAR) generate REBARDEV= + RELIVECMD=@echo "Rebar2 detected... relive not supported.\ + \nTry: ./configure --with-rebar=./rebar3 ; make relive" endif endif @@ -268,13 +272,27 @@ copy-files: copy-files-sub: copy-files-sub2 -install: copy-files - # - # Configuration files - $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) - [ -f $(ETCDIR)/ejabberd.yml ] \ - && $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \ - || $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml +relive: + $(RELIVECMD) + +relivedir=$(shell pwd)/_build/relive +iexpath=$(shell which iex) + +ejabberdctl.relive: + $(SED) -e "s*{{rootdir}}*@prefix@*g" \ + -e "s*{{installuser}}*@INSTALLUSER@*g" \ + -e "s*{{bindir}}/iex*$(iexpath)*g" \ + -e "s*{{bindir}}*@bindir@*g" \ + -e "s*{{libdir}}*@libdir@*g" \ + -e "s*{{sysconfdir}}/ejabberd*$(relivedir)/conf*g" \ + -e "s*{{localstatedir}}/log/ejabberd*$(relivedir)/logs*g" \ + -e "s*{{localstatedir}}/lib/ejabberd*$(relivedir)/database*g" \ + -e "s*{{docdir}}*@docdir@*g" \ + -e "s*{{erl}}*@ERL@*g" \ + -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ + > ejabberdctl.relive + +ejabberdctl.example: $(SED) -e "s*{{rootdir}}*@prefix@*g" \ -e "s*{{installuser}}*@INSTALLUSER@*g" \ -e "s*{{bindir}}*@bindir@*g" \ @@ -285,6 +303,14 @@ install: copy-files -e "s*{{erl}}*@ERL@*g" \ -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ > ejabberdctl.example + +install: copy-files ejabberdctl.example + # + # Configuration files + $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) + [ -f $(ETCDIR)/ejabberd.yml ] \ + && $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \ + || $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml [ -f $(ETCDIR)/ejabberdctl.cfg ] \ && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \ || $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg @@ -470,6 +496,7 @@ help: @echo "" @echo " rel Build a production release" @echo " dev Build a development release" + @echo " relive Start a live ejabberd in _build/relive/" @echo "" @echo " edoc Generate edoc documentation (unused)" @echo " options Generate ejabberd_option.erl" diff --git a/config/runtime.exs b/config/runtime.exs index 050eae8b0..ad8c6bdc9 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -1,12 +1,18 @@ import Config -rootpath = System.get_env("RELEASE_ROOT", "") - -# This is standard path in the context of ejabberd release -config :ejabberd, - file: Path.join(rootpath, "etc/ejabberd/ejabberd.yml"), - log_path: Path.join(rootpath, 'var/log/ejabberd/ejabberd.log') - -# Customize Mnesia directory: -config :mnesia, - dir: Path.join(rootpath, 'var/lib/ejabberd/') +case System.get_env("RELIVE", "false") do + "true" -> + rootpath = System.get_env("RELEASE_ROOT", "_build/relive") + config :ejabberd, + file: Path.join(rootpath, "conf/ejabberd.yml"), + log_path: Path.join(rootpath, 'logs/ejabberd.log') + config :mnesia, + dir: Path.join(rootpath, 'database/') + "false" -> + rootpath = System.get_env("RELEASE_ROOT", "") + config :ejabberd, + file: Path.join(rootpath, "etc/ejabberd/ejabberd.yml"), + log_path: Path.join(rootpath, 'var/log/ejabberd/ejabberd.log') + config :mnesia, + dir: Path.join(rootpath, 'var/lib/ejabberd/') +end diff --git a/rebar.config b/rebar.config index 0c18d9e7d..c21c5a792 100644 --- a/rebar.config +++ b/rebar.config @@ -215,6 +215,12 @@ {copy, "test/ejabberd_SUITE_data/cert.pem", "etc/ejabberd/"}]}]}]}, {test, [{erl_opts, [nowarn_export_all]}]}]}. +{alias, [{relive, [{shell, "--apps ejabberd \ + --config rel/relive.config \ + --script rel/relive.escript \ + --name ejabberd@localhost"}]} +]}. + %% Local Variables: %% mode: erlang %% End: diff --git a/rel/relive.config b/rel/relive.config new file mode 100644 index 000000000..7e3901fd4 --- /dev/null +++ b/rel/relive.config @@ -0,0 +1,3 @@ +[{mnesia, [{dir, "_build/relive/database"}]}, + {ejabberd, [{config, "_build/relive/conf/ejabberd.yml"}, + {log_path, "_build/relive/logs/ejabberd.log"}]}]. diff --git a/rel/relive.escript b/rel/relive.escript new file mode 100644 index 000000000..3ee2de0f3 --- /dev/null +++ b/rel/relive.escript @@ -0,0 +1,26 @@ +#!/usr/bin/env escript + +main(_) -> + Base = "_build/relive", + prepare(Base, "", none), + prepare(Base, "conf", {os, cmd, "rel/setup-relive.sh"}), + prepare(Base, "database", none), + prepare(Base, "logs", none), + c:erlangrc([os:cmd("echo -n $HOME")]), + ok. + +prepare(BaseDir, SuffixDir, MFA) -> + Dir = filename:join(BaseDir, SuffixDir), + case file:make_dir(Dir) of + ok -> + io:format("Preparing relive dir ~s...~n", [Dir]), + case MFA of + none -> ok; + {M, F, A} -> M:F(A) + end; + {error, eexist} -> + ok; + {error, LogsError} -> + io:format("Error creating dir ~s: ~p~n", [Dir, LogsError]), + halt(1) + end. diff --git a/rel/setup-relive.sh b/rel/setup-relive.sh new file mode 100755 index 000000000..4e726be88 --- /dev/null +++ b/rel/setup-relive.sh @@ -0,0 +1,30 @@ +PWD_DIR=`pwd` +REL_DIR=$PWD_DIR/_build/relive/ +CON_DIR=$REL_DIR/conf/ + +[ -z "$REL_DIR_TEMP" ] && REL_DIR_TEMP=$REL_DIR +CON_DIR_TEMP=$REL_DIR_TEMP/conf/ + +make ejabberdctl.relive +chmod +x ejabberdctl.relive +mv ejabberdctl.relive $REL_DIR/ejabberdctl + +cp inetrc $CON_DIR/ +cp ejabberdctl.cfg.example $CON_DIR/ejabberdctl.cfg.example +cp ejabberd.yml.example $CON_DIR/ejabberd.yml.example +cp test/ejabberd_SUITE_data/ca.pem $CON_DIR +cp test/ejabberd_SUITE_data/cert.pem $CON_DIR + +cd $CON_DIR_TEMP + +sed -i "s|# certfiles:|certfiles:\n - $CON_DIR/cert.pem|g" ejabberd.yml.example +sed -i "s|certfiles:|ca_file: $CON_DIR/ca.pem\ncertfiles:|g" ejabberd.yml.example +sed -i 's|^acl:$|acl:\n admin: [user: admin]|g' ejabberd.yml.example +[ ! -f "$CON_DIR/ejabberd.yml" ] \ + && echo -n "ejabberd.yml " \ + && mv ejabberd.yml.example ejabberd.yml + +sed -i "s|#' POLL|EJABBERD_BYPASS_WARNINGS=true\n\n#' POLL|g" ejabberdctl.cfg.example +[ ! -f "$CON_DIR/ejabberdctl.cfg" ] \ + && echo -n "ejabberdctl.cfg " \ + && mv ejabberdctl.cfg.example ejabberdctl.cfg diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 9e72c7b36..cbf372654 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -40,7 +40,7 @@ %% Cluster join_cluster/1, leave_cluster/1, list_cluster/0, %% Erlang - update_list/0, update/1, + update_list/0, update/1, update/0, %% Accounts register/3, unregister/2, registered_users/1, @@ -540,6 +540,15 @@ update_module(ModuleNameString) -> {error, Reason} -> {error, Reason} end. +update() -> + io:format("Compiling ejabberd...~n", []), + os:cmd("make"), + Mods = ejabberd_admin:update_list(), + io:format("Updating modules: ~p~n", [Mods]), + ejabberd_admin:update("all"), + io:format("Updated modules: ", []), + Mods -- ejabberd_admin:update_list(). + %%% %%% Account management %%% From 3b30d5b0ed9613634b39fae23ddd3001b875b8fe Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 26 Jan 2022 16:58:01 +0100 Subject: [PATCH 163/440] Fix support for MSSQL testing --- configure.ac | 3 ++- sql/mssql.sql | 2 +- vars.config.in | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b086a7b6e..ae85c0d4e 100644 --- a/configure.ac +++ b/configure.ac @@ -146,7 +146,7 @@ AC_ARG_ENABLE(mssql, yes) db_type=mssql; mssql=true ;; no) db_type=generic; mssql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; -esac],[db_type=generic]) +esac],[if test "x$mssql" = "x"; then db_type=generic; mysql=false; fi]) AC_ARG_ENABLE(mysql, [AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])], @@ -285,6 +285,7 @@ AC_SUBST(new_sql_schema) AC_SUBST(full_xml) AC_SUBST(db_type) AC_SUBST(odbc) +AC_SUBST(mssql) AC_SUBST(mysql) AC_SUBST(pgsql) AC_SUBST(sqlite) diff --git a/sql/mssql.sql b/sql/mssql.sql index f8b65edc4..dfd9da2f1 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -546,7 +546,7 @@ WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW CREATE UNIQUE INDEX [i_push_ut] ON [push_session] (username, timestamp) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -CREATE TABLE [dbo].[mqtt_pub]( +CREATE TABLE [dbo].[mqtt_pub] ( [username] [varchar](191) NOT NULL, [server_host] [varchar](191) NOT NULL, [resource] [varchar](191) NOT NULL, diff --git a/vars.config.in b/vars.config.in index 04024fd73..a243d2c8e 100644 --- a/vars.config.in +++ b/vars.config.in @@ -30,6 +30,7 @@ %% Dependencies {odbc, @odbc@}. +{mssql, @mssql@}. {mysql, @mysql@}. {pgsql, @pgsql@}. {sqlite, @sqlite@}. From c92478f7c23e174580d02d4a4550255e1687a7a9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 26 Jan 2022 23:13:32 +0100 Subject: [PATCH 164/440] Use the same wording in all the identical options db_type and ram_db_type --- src/mod_bosh.erl | 3 ++- src/mod_muc.erl | 9 ++++----- src/mod_proxy65.erl | 4 ++-- src/mod_shared_roster.erl | 7 ++----- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 37a7fa809..059058a3b 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -244,7 +244,8 @@ mod_doc() -> {ram_db_type, #{value => "mnesia | sql | redis", desc => - ?T("Same as _`default_ram_db`_ but applied to this module only.")}}, + ?T("Same as top-level _`default_ram_db`_ option, " + "but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 72f386b00..fd0f12294 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1424,14 +1424,13 @@ mod_doc() -> {db_type, #{value => "mnesia | sql", desc => - ?T("Define the type of persistent storage where the module will " - "store room information. The default is the storage defined " - "by the global option 'default_db', or 'mnesia' if omitted.")}}, + ?T("Same as top-level _`default_db`_ option, " + "but applied to this module only.")}}, {ram_db_type, #{value => "mnesia | sql", desc => - ?T("Define the type of volatile (in-memory) storage where the module " - "will store room information ('muc_online_room' and 'muc_online_users').")}}, + ?T("Same as top-level _`default_ram_db`_ option, " + "but applied to this module only.")}}, {hibernation_timeout, #{value => "infinity | Seconds", desc => diff --git a/src/mod_proxy65.erl b/src/mod_proxy65.erl index ce1c67a36..4b4f02c03 100644 --- a/src/mod_proxy65.erl +++ b/src/mod_proxy65.erl @@ -173,8 +173,8 @@ mod_doc() -> {ram_db_type, #{value => "mnesia | redis | sql", desc => - ?T("Define the type of volatile (in-memory) storage where the module " - "will store room information.")}}, + ?T("Same as top-level _`default_ram_db`_ option, " + "but applied to this module only.")}}, {ip, #{value => ?T("IPAddress"), desc => diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index f92e16496..b590578df 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -1276,11 +1276,8 @@ mod_doc() -> [{db_type, #{value => "mnesia | sql", desc => - ?T("Define the type of storage where the module will create " - "the tables and store user information. The default is " - "the storage defined by the top-level _`default_db`_ option, " - "or 'mnesia' if omitted. If 'sql' value is defined, " - "make sure you have defined the database.")}}, + ?T("Same as top-level _`default_db`_ option, " + "but applied to this module only.")}}, {use_cache, #{value => "true | false", desc => From 25e0326f87875f81377ea45bbf29b32e85635894 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 2 Feb 2022 18:24:36 +0100 Subject: [PATCH 165/440] Improve explanation of s2s_access option. Add link to access_rules option --- src/ejabberd_options_doc.erl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index ffb4caf32..47a89469d 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -220,7 +220,9 @@ doc() -> {access_rules, #{value => "{AccessName: {allow|deny: ACLRules|ACLName}}", desc => - ?T("The option specifies access rules. Each access rule is " + ?T("This option defines " + "http://../basic/#access-rules[Access Rules]. " + "Each access rule is " "assigned a name that can be referenced from other parts " "of the configuration file (mostly from 'access' options of " "ejabberd modules). Each rule definition may contain " @@ -1083,9 +1085,10 @@ doc() -> {s2s_access, #{value => ?T("Access"), desc => - ?T("The access rule to restrict server-to-server connections. " - "The default value is 'all' which means no restrictions " - "are applied.")}}, + ?T("This http://../basic/#access-rules[Access Rule] defines to " + "what remote servers can s2s connections be established. " + "The default value is 'all'; no restrictions are applied, it is" + " allowed to connect s2s to/from all remote servers.")}}, {s2s_cafile, #{value => ?T("Path"), desc => From 6279cac9328b2a1c7ef88ea577188dbdc8ee8558 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 3 Feb 2022 16:55:02 +0100 Subject: [PATCH 166/440] Reorganize and complete documentation of node start/debug commands --- ejabberdctl.template | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index 408a4fe6d..4c660fb40 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -181,12 +181,18 @@ help() { echo "" echo "Commands to start an ejabberd node:" - echo " start Start an ejabberd node in server mode" - echo " debug Attach an interactive Erlang shell to a running ejabberd node" - echo " iexdebug Attach an interactive Elixir shell to a running ejabberd node" - echo " live Start an ejabberd node in live (interactive) mode" - echo " iexlive Start an ejabberd node in live (interactive) mode, within an Elixir shell" - echo " foreground Start an ejabberd node in server mode (attached)" + echo " start Start in server mode" + echo " foreground Start in server mode (attached)" + echo " foreground-quiet Start in server mode (attached), show only critical messages" + echo " live Start in interactive mode, with Erlang shell" + echo " iexlive Start in interactive mode, with Elixir shell" + echo "" + echo "Commands to interact with a running ejabberd node:" + echo " debug Attach an interactive Erlang shell to a running node" + echo " iexdebug Attach an interactive Elixir shell to a running node" + echo " etop Attach to a running node and start Erlang Top" + echo " ping Send ping to the node, returns pong or pang" + echo " started|stopped Wait for the node to fully start|stop" echo "" echo "Optional parameters when starting an ejabberd node:" echo " --config-dir dir Config ejabberd: $ETC_DIR" From a7912f5344e122872d152c3283ecb72e5c4fefc9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 3 Feb 2022 18:42:33 +0100 Subject: [PATCH 167/440] Fix configure when mssql option not set, and add it to --enable-all --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index ae85c0d4e..646c8cf9c 100644 --- a/configure.ac +++ b/configure.ac @@ -68,10 +68,10 @@ AC_CONFIG_FILES([Makefile vars.config]) AC_ARG_ENABLE(all, -[AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])], +[AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mssql --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])], [case "${enableval}" in - yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;; - no) odbc=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;; + yes) odbc=true mssql=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;; + no) odbc=false mssql=false ysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;; esac],[]) @@ -146,7 +146,7 @@ AC_ARG_ENABLE(mssql, yes) db_type=mssql; mssql=true ;; no) db_type=generic; mssql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; -esac],[if test "x$mssql" = "x"; then db_type=generic; mysql=false; fi]) +esac],[if test "x$mssql" = "x"; then db_type=generic; mssql=false; fi]) AC_ARG_ENABLE(mysql, [AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])], From 965196a2e8481ccbfeca2ab1b18ae2aa4aafd51e Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 3 Feb 2022 19:11:39 +0100 Subject: [PATCH 168/440] Ensure db_type default value is set when no mssql was defined. Fix typo --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 646c8cf9c..7a6ceb86e 100644 --- a/configure.ac +++ b/configure.ac @@ -71,7 +71,7 @@ AC_ARG_ENABLE(all, [AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mssql --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])], [case "${enableval}" in yes) odbc=true mssql=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;; - no) odbc=false mssql=false ysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;; + no) odbc=false mssql=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;; esac],[]) @@ -146,7 +146,7 @@ AC_ARG_ENABLE(mssql, yes) db_type=mssql; mssql=true ;; no) db_type=generic; mssql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; -esac],[if test "x$mssql" = "x"; then db_type=generic; mssql=false; fi]) +esac],[db_type=generic; if test "x$mssql" = "x"; then mssql=false; fi]) AC_ARG_ENABLE(mysql, [AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])], From bdd1a129c0cf7db2cd59206cf7f0b98ea97da8da Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 3 Feb 2022 19:32:03 +0100 Subject: [PATCH 169/440] Disable mssql in Actions: it's known mssql doesn't pass the tests --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8cd9a38c8..d2be8e18c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,6 +129,7 @@ jobs: --prefix=/tmp/ejabberd \ --enable-all \ --disable-elixir \ + --disable-mssql \ --disable-odbc make update make From 9661d06334d8b84f3420817a3fb346601ae859a5 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 4 Feb 2022 16:44:56 +0100 Subject: [PATCH 170/440] Remove obsolete db_type defined environment db_type as a compilation define was first introduced in 2006 in d0e2ac9, but was removed in 2015 in 25791cf. Nowadays: ./configure --enable-mssql will set {mssql, true} in vars.config; That is read by ejabberd.app.src.script to set enabled_backends; which is consulted by test/suite.erl to test only available backends. --- configure.ac | 7 +++---- rebar.config | 1 - vars.config.in | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 7a6ceb86e..e203eab6a 100644 --- a/configure.ac +++ b/configure.ac @@ -143,10 +143,10 @@ esac],[if test "x$lua" = "x"; then lua=false; fi]) AC_ARG_ENABLE(mssql, [AS_HELP_STRING([--enable-mssql],[use Microsoft SQL Server database (default: no, requires --enable-odbc)])], [case "${enableval}" in - yes) db_type=mssql; mssql=true ;; - no) db_type=generic; mssql=false ;; + yes) mssql=true ;; + no) mssql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; -esac],[db_type=generic; if test "x$mssql" = "x"; then mssql=false; fi]) +esac],[if test "x$mssql" = "x"; then mssql=false; fi]) AC_ARG_ENABLE(mysql, [AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])], @@ -283,7 +283,6 @@ esac AC_SUBST(roster_gateway_workaround) AC_SUBST(new_sql_schema) AC_SUBST(full_xml) -AC_SUBST(db_type) AC_SUBST(odbc) AC_SUBST(mssql) AC_SUBST(mysql) diff --git a/rebar.config b/rebar.config index c21c5a792..08a73dd24 100644 --- a/rebar.config +++ b/rebar.config @@ -107,7 +107,6 @@ {if_version_below, "23", {d, 'USE_OLD_PG2'}}, {if_version_below, "24", {d, 'COMPILER_REPORTS_ONLY_LINES'}}, {if_version_below, "24", {d, 'SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL'}}, - {if_var_match, db_type, mssql, {d, 'mssql'}}, {if_var_false, debug, no_debug_info}, {if_var_true, debug, debug_info}, {if_var_true, elixir, {d, 'ELIXIR_ENABLED'}}, diff --git a/vars.config.in b/vars.config.in index a243d2c8e..b273cf901 100644 --- a/vars.config.in +++ b/vars.config.in @@ -21,7 +21,6 @@ %% Macros {roster_gateway_workaround, @roster_gateway_workaround@}. {full_xml, @full_xml@}. -{db_type, @db_type@}. {debug, @debug@}. {new_sql_schema, @new_sql_schema@}. From dda60fcf0daf4f7c61298b2eb3b303eeed69cb07 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 7 Feb 2022 19:37:09 +0100 Subject: [PATCH 171/440] Implement Get List of Registered/Online Users from XEP-0133 --- src/mod_configure.erl | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 32c7ebb31..54b54e9e1 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -171,9 +171,14 @@ get_local_identity(Acc, _From, _To, Node, Lang) -> ?INFO_COMMAND(?T("Get User Last Login Time"), Lang); ?NS_ADMINL(<<"user-stats">>) -> ?INFO_COMMAND(?T("Get User Statistics"), Lang); + ?NS_ADMINL(<<"get-registered-users-list">>) -> + ?INFO_COMMAND(?T("Get List of Registered Users"), + Lang); ?NS_ADMINL(<<"get-registered-users-num">>) -> ?INFO_COMMAND(?T("Get Number of Registered Users"), Lang); + ?NS_ADMINL(<<"get-online-users-list">>) -> + ?INFO_COMMAND(?T("Get List of Online Users"), Lang); ?NS_ADMINL(<<"get-online-users-num">>) -> ?INFO_COMMAND(?T("Get Number of Online Users"), Lang); _ -> Acc @@ -252,8 +257,12 @@ get_local_features(Acc, From, ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); ?NS_ADMINL(<<"user-stats">>) -> ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); + ?NS_ADMINL(<<"get-registered-users-list">>) -> + ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); ?NS_ADMINL(<<"get-registered-users-num">>) -> ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); + ?NS_ADMINL(<<"get-online-users-list">>) -> + ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); ?NS_ADMINL(<<"get-online-users-num">>) -> ?INFO_RESULT(Allow, [?NS_COMMANDS], Lang); _ -> Acc @@ -476,8 +485,12 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To, ?ITEMS_RESULT(Allow, LNode, {error, Err}); ?NS_ADMINL(<<"user-stats">>) -> ?ITEMS_RESULT(Allow, LNode, {error, Err}); + ?NS_ADMINL(<<"get-registered-users-list">>) -> + ?ITEMS_RESULT(Allow, LNode, {error, Err}); ?NS_ADMINL(<<"get-registered-users-num">>) -> ?ITEMS_RESULT(Allow, LNode, {error, Err}); + ?NS_ADMINL(<<"get-online-users-list">>) -> + ?ITEMS_RESULT(Allow, LNode, {error, Err}); ?NS_ADMINL(<<"get-online-users-num">>) -> ?ITEMS_RESULT(Allow, LNode, {error, Err}); _ -> Acc @@ -515,8 +528,12 @@ get_local_items(_Host, [<<"user">>], Server, Lang) -> (?NS_ADMINX(<<"get-user-lastlogin">>))), ?NODE(?T("Get User Statistics"), (?NS_ADMINX(<<"user-stats">>))), + ?NODE(?T("Get List of Registered Users"), + (?NS_ADMINX(<<"get-registered-users-list">>))), ?NODE(?T("Get Number of Registered Users"), (?NS_ADMINX(<<"get-registered-users-num">>))), + ?NODE(?T("Get List of Online Users"), + (?NS_ADMINX(<<"get-online-users-list">>))), ?NODE(?T("Get Number of Online Users"), (?NS_ADMINX(<<"get-online-users-num">>)))]}; get_local_items(_Host, [<<"http:">> | _], _Server, @@ -1065,6 +1082,16 @@ get_form(_Host, ?NS_ADMINL(<<"user-stats">>), Lang) -> label = tr(Lang, ?T("Jabber ID")), var = <<"accountjid">>, required = true}]}}; +get_form(Host, ?NS_ADMINL(<<"get-registered-users-list">>), Lang) -> + Values = [jid:encode(jid:make(U, Host)) + || {U, _} <- ejabberd_auth:get_users(Host)], + {result, completed, + #xdata{type = form, + fields = [?HFIELD(), + #xdata_field{type = 'jid-multi', + label = tr(Lang, ?T("The list of all users")), + var = <<"registereduserjids">>, + values = Values}]}}; get_form(Host, ?NS_ADMINL(<<"get-registered-users-num">>), Lang) -> Num = integer_to_binary(ejabberd_auth:count_users(Host)), @@ -1075,6 +1102,17 @@ get_form(Host, label = tr(Lang, ?T("Number of registered users")), var = <<"registeredusersnum">>, values = [Num]}]}}; +get_form(Host, ?NS_ADMINL(<<"get-online-users-list">>), Lang) -> + Accounts = [jid:encode(jid:make(U, Host)) + || {U, _, _} <- ejabberd_sm:get_vh_session_list(Host)], + Values = lists:usort(Accounts), + {result, completed, + #xdata{type = form, + fields = [?HFIELD(), + #xdata_field{type = 'jid-multi', + label = tr(Lang, ?T("The list of all online users")), + var = <<"onlineuserjids">>, + values = Values}]}}; get_form(Host, ?NS_ADMINL(<<"get-online-users-num">>), Lang) -> Num = integer_to_binary(ejabberd_sm:get_vh_session_number(Host)), From 37d2bdd90d26e4958deef534a609823ec76a3572 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 14:00:57 +0100 Subject: [PATCH 172/440] Some dependencies are optional, check them in mix.exs --- mix.exs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mix.exs b/mix.exs index 64f94345c..728dbb2a9 100644 --- a/mix.exs +++ b/mix.exs @@ -43,7 +43,7 @@ defmodule Ejabberd.MixProject do extra_applications: [:mix], applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose, - :p1_utils, :stringprep, :stun, :yconf], + :p1_utils, :stringprep, :yconf], included_applications: [:lager, :mnesia, :os_mon, :cache_tab, :eimp, :esip, :mqtree, :p1_acme, :p1_oauth2, :pkix, :xmpp] @@ -108,7 +108,6 @@ defmodule Ejabberd.MixProject do {:cache_tab, "~> 1.0"}, {:distillery, "~> 2.0"}, {:eimp, "~> 1.0"}, - {:esip, "~> 1.0"}, {:ex_doc, ">= 0.0.0", only: :dev}, {:fast_tls, "~> 1.1"}, {:fast_xml, "~> 1.1"}, @@ -119,13 +118,10 @@ defmodule Ejabberd.MixProject do {:lager, "~> 3.9.1"}, {:mqtree, "~> 1.0"}, {:p1_acme, "~> 1.0"}, - {:p1_mysql, "~> 1.0"}, {:p1_oauth2, "~> 0.6"}, - {:p1_pgsql, "~> 1.1"}, {:p1_utils, "~> 1.0"}, {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, - {:stun, "~> 1.0"}, {:xmpp, "~> 1.5"}, {:yconf, "~> 1.0"}] ++ cond_deps() @@ -146,9 +142,13 @@ defmodule Ejabberd.MixProject do defp cond_deps do for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}}, {config(:redis), {:eredis, "~> 1.2.0"}}, + {config(:sip), {:esip, "~> 1.0"}}, {config(:zlib), {:ezlib, "~> 1.0"}}, {config(:lua), {:luerl, "~> 1.0"}}, - {config(:sqlite), {:sqlite3, "~> 1.1"}}], do: + {config(:mysql), {:p1_mysql, "~> 1.0"}}, + {config(:pgsql), {:p1_pgsql, "~> 1.1"}}, + {config(:sqlite), {:sqlite3, "~> 1.1"}}, + {config(:stun), {:stun, "~> 1.0"}}], do: dep end From e63e8a6d3894f910495710da10348afc2dfebf6b Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 14:14:00 +0100 Subject: [PATCH 173/440] Fix typo introduced in 99fdba0, present since 16.01 --- mix.exs | 2 +- rebar.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 728dbb2a9..dc075c0c7 100644 --- a/mix.exs +++ b/mix.exs @@ -97,7 +97,7 @@ defmodule Ejabberd.MixProject do defp cond_options do for {:true, option} <- [{config(:sip), {:d, :SIP}}, {config(:stun), {:d, :STUN}}, - {config(:roster_gateway_workaround), {:d, :ROSTER_GATWAY_WORKAROUND}}, + {config(:roster_gateway_workaround), {:d, :ROSTER_GATEWAY_WORKAROUND}}, {config(:new_sql_schema), {:d, :NEW_SQL_SCHEMA}} ], do: option diff --git a/rebar.config b/rebar.config index 08a73dd24..26f4d9e6b 100644 --- a/rebar.config +++ b/rebar.config @@ -111,7 +111,7 @@ {if_var_true, debug, debug_info}, {if_var_true, elixir, {d, 'ELIXIR_ENABLED'}}, {if_var_true, new_sql_schema, {d, 'NEW_SQL_SCHEMA'}}, - {if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATWAY_WORKAROUND'}}, + {if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATEWAY_WORKAROUND'}}, {if_var_true, sip, {d, 'SIP'}}, {if_var_true, stun, {d, 'STUN'}}, {if_have_fun, {erl_error, format_exception, 6}, {d, 'HAVE_ERL_ERROR'}}, From 4d093ac03ec26975c2f611d5bdfcb74bd8afccd2 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 15:30:42 +0100 Subject: [PATCH 174/440] ejabberd_sql_pt got USE_NEW_SCHEMA in 78dfb83 and removed in e15595d --- src/ejabberd_sql_pt.erl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index d131570f7..9249bad93 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -50,12 +50,6 @@ -define(MOD, sql__module_). --ifdef(NEW_SQL_SCHEMA). --define(USE_NEW_SCHEMA, true). --else. --define(USE_NEW_SCHEMA, false). --endif. - %%==================================================================== %% API %%==================================================================== From ba0d5e4dcfdc93b92fc084f96d4e8528100194d7 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 15:33:00 +0100 Subject: [PATCH 175/440] Nowadays NEW_SQL_SCHEMA is only used to determine the default sql schema --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index e203eab6a..864a042f1 100644 --- a/configure.ac +++ b/configure.ac @@ -157,7 +157,7 @@ AC_ARG_ENABLE(mysql, esac],[if test "x$mysql" = "x"; then mysql=false; fi]) AC_ARG_ENABLE(new_sql_schema, -[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema (default: no)])], +[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema by default (default: no)])], [case "${enableval}" in yes) new_sql_schema=true ;; no) new_sql_schema=false ;; From 0b9263bc15118f8c00403d82e592b038a0e30228 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 15:37:45 +0100 Subject: [PATCH 176/440] Add forgotten option NO_CUSTOMIZE_HOSTNAME_CHECK to mix.exs --- mix.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/mix.exs b/mix.exs index dc075c0c7..a968477bf 100644 --- a/mix.exs +++ b/mix.exs @@ -84,6 +84,7 @@ defmodule Ejabberd.MixProject do if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++ if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++ if_version_below('22', [{:d, :LAGER}]) ++ + if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++ if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++ if_version_below('23', [{:d, :USE_OLD_PG2}]) ++ if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++ From f7c7d784c47179fcdfc77fde3dea8b3d4e4f9308 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 15:38:04 +0100 Subject: [PATCH 177/440] Detect debug option, and maybe disable debug_info As explained in https://hexdocs.pm/mix/1.13.2/Mix.Tasks.Compile.Erlang.html > The option :debug_info is always added to the end of it. You can disable that using: > erlc_options: [debug_info: false] --- mix.exs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index a968477bf..ebf8699ba 100644 --- a/mix.exs +++ b/mix.exs @@ -78,7 +78,7 @@ defmodule Ejabberd.MixProject do defp erlc_options do # Use our own includes + includes from all dependencies includes = ["include"] ++ deps_include(["fast_xml", "xmpp", "p1_utils"]) - result = [:debug_info, {:d, :ELIXIR_ENABLED}] ++ + result = [{:d, :ELIXIR_ENABLED}] ++ cond_options() ++ Enum.map(includes, fn (path) -> {:i, path} end) ++ if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++ @@ -98,6 +98,8 @@ defmodule Ejabberd.MixProject do defp cond_options do for {:true, option} <- [{config(:sip), {:d, :SIP}}, {config(:stun), {:d, :STUN}}, + {config(:debug), :debug_info}, + {not config(:debug), {:debug_info, false}}, {config(:roster_gateway_workaround), {:d, :ROSTER_GATEWAY_WORKAROUND}}, {config(:new_sql_schema), {:d, :NEW_SQL_SCHEMA}} ], do: From b3211b1f716c13903b327bb7394dd319f637eeee Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Feb 2022 17:21:43 +0100 Subject: [PATCH 178/440] Update copyright year to 2022 --- include/adhoc.hrl | 2 +- include/bosh.hrl | 2 +- include/ejabberd_auth.hrl | 2 +- include/ejabberd_commands.hrl | 2 +- include/ejabberd_config.hrl | 2 +- include/ejabberd_ctl.hrl | 2 +- include/ejabberd_http.hrl | 2 +- include/ejabberd_oauth.hrl | 2 +- include/ejabberd_sm.hrl | 2 +- include/ejabberd_sql.hrl | 2 +- include/ejabberd_sql_pt.hrl | 2 +- include/ejabberd_stacktrace.hrl | 2 +- include/ejabberd_web_admin.hrl | 2 +- include/eldap.hrl | 2 +- include/http_bind.hrl | 2 +- include/logger.hrl | 2 +- include/mod_announce.hrl | 2 +- include/mod_caps.hrl | 2 +- include/mod_last.hrl | 2 +- include/mod_mam.hrl | 2 +- include/mod_muc.hrl | 2 +- include/mod_muc_room.hrl | 2 +- include/mod_offline.hrl | 2 +- include/mod_privacy.hrl | 2 +- include/mod_private.hrl | 2 +- include/mod_proxy65.hrl | 2 +- include/mod_push.hrl | 2 +- include/mod_roster.hrl | 2 +- include/mod_shared_roster.hrl | 2 +- include/mod_vcard.hrl | 2 +- include/mod_vcard_xupdate.hrl | 2 +- include/mqtt.hrl | 2 +- include/pubsub.hrl | 2 +- man/ejabberd.yml.5 | 2 +- rebar.config | 2 +- rebar.config.script | 2 +- rel/reltool.config.script | 2 +- sql/lite.new.sql | 2 +- sql/lite.sql | 2 +- sql/mssql.sql | 2 +- sql/mysql.new.sql | 2 +- sql/mysql.sql | 2 +- sql/pg.new.sql | 2 +- sql/pg.sql | 2 +- src/acl.erl | 2 +- src/econf.erl | 2 +- src/ejabberd.erl | 2 +- src/ejabberd_access_permissions.erl | 2 +- src/ejabberd_acme.erl | 2 +- src/ejabberd_admin.erl | 2 +- src/ejabberd_app.erl | 2 +- src/ejabberd_auth.erl | 2 +- src/ejabberd_auth_anonymous.erl | 2 +- src/ejabberd_auth_external.erl | 2 +- src/ejabberd_auth_jwt.erl | 2 +- src/ejabberd_auth_ldap.erl | 2 +- src/ejabberd_auth_mnesia.erl | 2 +- src/ejabberd_auth_pam.erl | 2 +- src/ejabberd_auth_sql.erl | 2 +- src/ejabberd_backend_sup.erl | 2 +- src/ejabberd_bosh.erl | 2 +- src/ejabberd_c2s.erl | 2 +- src/ejabberd_c2s_config.erl | 2 +- src/ejabberd_captcha.erl | 2 +- src/ejabberd_cluster.erl | 2 +- src/ejabberd_cluster_mnesia.erl | 2 +- src/ejabberd_commands.erl | 2 +- src/ejabberd_commands_doc.erl | 2 +- src/ejabberd_config.erl | 2 +- src/ejabberd_config_transformer.erl | 2 +- src/ejabberd_ctl.erl | 2 +- src/ejabberd_db_sup.erl | 2 +- src/ejabberd_doc.erl | 2 +- src/ejabberd_hooks.erl | 2 +- src/ejabberd_http.erl | 2 +- src/ejabberd_http_ws.erl | 2 +- src/ejabberd_iq.erl | 2 +- src/ejabberd_listener.erl | 2 +- src/ejabberd_local.erl | 2 +- src/ejabberd_logger.erl | 2 +- src/ejabberd_mnesia.erl | 2 +- src/ejabberd_oauth.erl | 2 +- src/ejabberd_oauth_mnesia.erl | 2 +- src/ejabberd_oauth_rest.erl | 2 +- src/ejabberd_oauth_sql.erl | 2 +- src/ejabberd_old_config.erl | 2 +- src/ejabberd_options.erl | 2 +- src/ejabberd_options_doc.erl | 2 +- src/ejabberd_piefxis.erl | 2 +- src/ejabberd_pkix.erl | 2 +- src/ejabberd_redis.erl | 2 +- src/ejabberd_redis_sup.erl | 2 +- src/ejabberd_regexp.erl | 2 +- src/ejabberd_router.erl | 2 +- src/ejabberd_router_mnesia.erl | 2 +- src/ejabberd_router_multicast.erl | 2 +- src/ejabberd_router_redis.erl | 2 +- src/ejabberd_router_sql.erl | 2 +- src/ejabberd_s2s.erl | 2 +- src/ejabberd_s2s_in.erl | 2 +- src/ejabberd_s2s_out.erl | 2 +- src/ejabberd_service.erl | 2 +- src/ejabberd_shaper.erl | 2 +- src/ejabberd_sip.erl | 2 +- src/ejabberd_sm.erl | 2 +- src/ejabberd_sm_mnesia.erl | 2 +- src/ejabberd_sm_redis.erl | 2 +- src/ejabberd_sm_sql.erl | 2 +- src/ejabberd_sql.erl | 2 +- src/ejabberd_sql_pt.erl | 2 +- src/ejabberd_sql_sup.erl | 2 +- src/ejabberd_stun.erl | 2 +- src/ejabberd_sup.erl | 2 +- src/ejabberd_system_monitor.erl | 2 +- src/ejabberd_tmp_sup.erl | 2 +- src/ejabberd_update.erl | 2 +- src/ejabberd_web.erl | 2 +- src/ejabberd_web_admin.erl | 4 ++-- src/ejabberd_websocket.erl | 2 +- src/ejabberd_xmlrpc.erl | 2 +- src/ejd2sql.erl | 2 +- src/eldap_filter.erl | 2 +- src/eldap_pool.erl | 2 +- src/eldap_utils.erl | 2 +- src/elixir_logger_backend.erl | 2 +- src/ext_mod.erl | 2 +- src/extauth.erl | 2 +- src/extauth_sup.erl | 2 +- src/gen_iq_handler.erl | 2 +- src/gen_mod.erl | 2 +- src/gen_pubsub_node.erl | 2 +- src/gen_pubsub_nodetree.erl | 2 +- src/jd2ejd.erl | 2 +- src/misc.erl | 2 +- src/mod_adhoc.erl | 2 +- src/mod_admin_extra.erl | 2 +- src/mod_admin_update_sql.erl | 2 +- src/mod_announce.erl | 2 +- src/mod_announce_mnesia.erl | 2 +- src/mod_announce_sql.erl | 2 +- src/mod_avatar.erl | 2 +- src/mod_block_strangers.erl | 2 +- src/mod_blocking.erl | 2 +- src/mod_bosh.erl | 2 +- src/mod_bosh_mnesia.erl | 2 +- src/mod_bosh_redis.erl | 2 +- src/mod_bosh_sql.erl | 2 +- src/mod_caps.erl | 2 +- src/mod_caps_mnesia.erl | 2 +- src/mod_caps_sql.erl | 2 +- src/mod_carboncopy.erl | 2 +- src/mod_client_state.erl | 2 +- src/mod_configure.erl | 2 +- src/mod_conversejs.erl | 2 +- src/mod_delegation.erl | 2 +- src/mod_disco.erl | 2 +- src/mod_fail2ban.erl | 2 +- src/mod_http_api.erl | 2 +- src/mod_http_fileserver.erl | 2 +- src/mod_http_upload.erl | 2 +- src/mod_http_upload_quota.erl | 2 +- src/mod_jidprep.erl | 2 +- src/mod_last.erl | 2 +- src/mod_last_mnesia.erl | 2 +- src/mod_last_sql.erl | 2 +- src/mod_legacy_auth.erl | 2 +- src/mod_mam.erl | 2 +- src/mod_mam_mnesia.erl | 2 +- src/mod_mam_sql.erl | 2 +- src/mod_metrics.erl | 2 +- src/mod_mqtt.erl | 2 +- src/mod_mqtt_mnesia.erl | 2 +- src/mod_mqtt_session.erl | 2 +- src/mod_mqtt_sql.erl | 2 +- src/mod_mqtt_ws.erl | 2 +- src/mod_muc.erl | 2 +- src/mod_muc_admin.erl | 2 +- src/mod_muc_log.erl | 2 +- src/mod_muc_mnesia.erl | 2 +- src/mod_muc_room.erl | 2 +- src/mod_muc_sql.erl | 2 +- src/mod_muc_sup.erl | 2 +- src/mod_multicast.erl | 2 +- src/mod_offline.erl | 2 +- src/mod_offline_mnesia.erl | 2 +- src/mod_offline_sql.erl | 2 +- src/mod_ping.erl | 2 +- src/mod_pres_counter.erl | 2 +- src/mod_privacy.erl | 2 +- src/mod_privacy_mnesia.erl | 2 +- src/mod_privacy_sql.erl | 2 +- src/mod_private.erl | 2 +- src/mod_private_mnesia.erl | 2 +- src/mod_private_sql.erl | 2 +- src/mod_privilege.erl | 2 +- src/mod_proxy65.erl | 2 +- src/mod_proxy65_lib.erl | 2 +- src/mod_proxy65_mnesia.erl | 2 +- src/mod_proxy65_redis.erl | 2 +- src/mod_proxy65_service.erl | 2 +- src/mod_proxy65_sql.erl | 2 +- src/mod_proxy65_stream.erl | 2 +- src/mod_pubsub.erl | 2 +- src/mod_pubsub_mnesia.erl | 2 +- src/mod_pubsub_sql.erl | 2 +- src/mod_push.erl | 2 +- src/mod_push_keepalive.erl | 2 +- src/mod_push_mnesia.erl | 2 +- src/mod_push_sql.erl | 2 +- src/mod_register.erl | 2 +- src/mod_register_web.erl | 2 +- src/mod_roster.erl | 2 +- src/mod_roster_mnesia.erl | 2 +- src/mod_roster_sql.erl | 2 +- src/mod_s2s_dialback.erl | 2 +- src/mod_service_log.erl | 2 +- src/mod_shared_roster.erl | 2 +- src/mod_shared_roster_ldap.erl | 2 +- src/mod_shared_roster_mnesia.erl | 2 +- src/mod_shared_roster_sql.erl | 2 +- src/mod_sic.erl | 2 +- src/mod_sip.erl | 2 +- src/mod_sip_proxy.erl | 2 +- src/mod_sip_registrar.erl | 2 +- src/mod_stats.erl | 2 +- src/mod_stream_mgmt.erl | 2 +- src/mod_stun_disco.erl | 2 +- src/mod_time.erl | 2 +- src/mod_vcard.erl | 2 +- src/mod_vcard_ldap.erl | 2 +- src/mod_vcard_mnesia.erl | 2 +- src/mod_vcard_sql.erl | 2 +- src/mod_vcard_xupdate.erl | 2 +- src/mod_version.erl | 2 +- src/mqtt_codec.erl | 2 +- src/node_flat.erl | 2 +- src/node_flat_sql.erl | 2 +- src/node_pep.erl | 2 +- src/node_pep_sql.erl | 2 +- src/nodetree_tree.erl | 2 +- src/nodetree_tree_sql.erl | 2 +- src/nodetree_virtual.erl | 2 +- src/prosody2ejabberd.erl | 2 +- src/proxy_protocol.erl | 2 +- src/pubsub_db_sql.erl | 2 +- src/pubsub_index.erl | 2 +- src/pubsub_migrate.erl | 2 +- src/pubsub_subscription.erl | 2 +- src/pubsub_subscription_sql.erl | 2 +- src/rest.erl | 2 +- src/str.erl | 2 +- src/translate.erl | 2 +- src/win32_dns.erl | 2 +- test/announce_tests.erl | 2 +- test/carbons_tests.erl | 2 +- test/csi_tests.erl | 2 +- test/ejabberd_SUITE.erl | 2 +- test/example_tests.erl | 2 +- test/jidprep_tests.erl | 2 +- test/ldap_srv.erl | 2 +- test/mam_tests.erl | 2 +- test/muc_tests.erl | 2 +- test/offline_tests.erl | 2 +- test/privacy_tests.erl | 2 +- test/private_tests.erl | 2 +- test/proxy65_tests.erl | 2 +- test/pubsub_tests.erl | 2 +- test/push_tests.erl | 2 +- test/replaced_tests.erl | 2 +- test/roster_tests.erl | 2 +- test/sm_tests.erl | 2 +- test/stundisco_tests.erl | 2 +- test/suite.erl | 2 +- test/upload_tests.erl | 2 +- test/vcard_tests.erl | 2 +- test/webadmin_tests.erl | 2 +- tools/xml_compress_gen.erl | 2 +- vars.config.in | 2 +- 278 files changed, 279 insertions(+), 279 deletions(-) diff --git a/include/adhoc.hrl b/include/adhoc.hrl index 2047db874..aa784d9b0 100644 --- a/include/adhoc.hrl +++ b/include/adhoc.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/bosh.hrl b/include/bosh.hrl index ca43a569b..e02675ed0 100644 --- a/include/bosh.hrl +++ b/include/bosh.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_auth.hrl b/include/ejabberd_auth.hrl index 00f31cfd3..a29b2cc29 100644 --- a/include/ejabberd_auth.hrl +++ b/include/ejabberd_auth.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_commands.hrl b/include/ejabberd_commands.hrl index d0f5ba70a..9009f7bb2 100644 --- a/include/ejabberd_commands.hrl +++ b/include/ejabberd_commands.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_config.hrl b/include/ejabberd_config.hrl index 555d998b7..c9805a3da 100644 --- a/include/ejabberd_config.hrl +++ b/include/ejabberd_config.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_ctl.hrl b/include/ejabberd_ctl.hrl index e962e85be..37935ebe2 100644 --- a/include/ejabberd_ctl.hrl +++ b/include/ejabberd_ctl.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_http.hrl b/include/ejabberd_http.hrl index 62e19a8f0..92dfd870e 100644 --- a/include/ejabberd_http.hrl +++ b/include/ejabberd_http.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_oauth.hrl b/include/ejabberd_oauth.hrl index d9a5a09de..7e7509454 100644 --- a/include/ejabberd_oauth.hrl +++ b/include/ejabberd_oauth.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_sm.hrl b/include/ejabberd_sm.hrl index 92e85ae03..d5286d793 100644 --- a/include/ejabberd_sm.hrl +++ b/include/ejabberd_sm.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_sql.hrl b/include/ejabberd_sql.hrl index 2d9ac03ec..cfa238b48 100644 --- a/include/ejabberd_sql.hrl +++ b/include/ejabberd_sql.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_sql_pt.hrl b/include/ejabberd_sql_pt.hrl index 07479d440..fd61bdd03 100644 --- a/include/ejabberd_sql_pt.hrl +++ b/include/ejabberd_sql_pt.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_stacktrace.hrl b/include/ejabberd_stacktrace.hrl index cc07c6eab..2d8fc6e43 100644 --- a/include/ejabberd_stacktrace.hrl +++ b/include/ejabberd_stacktrace.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/ejabberd_web_admin.hrl b/include/ejabberd_web_admin.hrl index 25df7f0c0..99f27f8de 100644 --- a/include/ejabberd_web_admin.hrl +++ b/include/ejabberd_web_admin.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/eldap.hrl b/include/eldap.hrl index db4f5428a..0787d1f98 100644 --- a/include/eldap.hrl +++ b/include/eldap.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/http_bind.hrl b/include/http_bind.hrl index a94379ee0..8a5ceb8ab 100644 --- a/include/http_bind.hrl +++ b/include/http_bind.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/logger.hrl b/include/logger.hrl index d69ff0d07..ed62f3607 100644 --- a/include/logger.hrl +++ b/include/logger.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_announce.hrl b/include/mod_announce.hrl index 9c7647272..498dce8d0 100644 --- a/include/mod_announce.hrl +++ b/include/mod_announce.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_caps.hrl b/include/mod_caps.hrl index aa5287069..4bf404837 100644 --- a/include/mod_caps.hrl +++ b/include/mod_caps.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_last.hrl b/include/mod_last.hrl index 6b2ae7d78..aed9bdc6f 100644 --- a/include/mod_last.hrl +++ b/include/mod_last.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_mam.hrl b/include/mod_mam.hrl index 494c4bd5a..27c892abe 100644 --- a/include/mod_mam.hrl +++ b/include/mod_mam.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_muc.hrl b/include/mod_muc.hrl index e31e01be0..ea096c9fe 100644 --- a/include/mod_muc.hrl +++ b/include/mod_muc.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index cc00f73c8..56eddeaa4 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_offline.hrl b/include/mod_offline.hrl index 8b78f2e16..ba04f9b87 100644 --- a/include/mod_offline.hrl +++ b/include/mod_offline.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_privacy.hrl b/include/mod_privacy.hrl index 1f481eec8..99cd2310d 100644 --- a/include/mod_privacy.hrl +++ b/include/mod_privacy.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_private.hrl b/include/mod_private.hrl index 1c551a212..14e3bc8e3 100644 --- a/include/mod_private.hrl +++ b/include/mod_private.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_proxy65.hrl b/include/mod_proxy65.hrl index be2797bca..13f4d8c6a 100644 --- a/include/mod_proxy65.hrl +++ b/include/mod_proxy65.hrl @@ -2,7 +2,7 @@ %%% RFC 1928 constants. %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_push.hrl b/include/mod_push.hrl index 9ad1e0405..161b68bdf 100644 --- a/include/mod_push.hrl +++ b/include/mod_push.hrl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_roster.hrl b/include/mod_roster.hrl index 27d2aab28..6ec05b3da 100644 --- a/include/mod_roster.hrl +++ b/include/mod_roster.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_shared_roster.hrl b/include/mod_shared_roster.hrl index 515243862..a18d37414 100644 --- a/include/mod_shared_roster.hrl +++ b/include/mod_shared_roster.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_vcard.hrl b/include/mod_vcard.hrl index 24b219ec5..14f8380b8 100644 --- a/include/mod_vcard.hrl +++ b/include/mod_vcard.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mod_vcard_xupdate.hrl b/include/mod_vcard_xupdate.hrl index 9b5bfac30..16e1d7bfc 100644 --- a/include/mod_vcard_xupdate.hrl +++ b/include/mod_vcard_xupdate.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/include/mqtt.hrl b/include/mqtt.hrl index 4d3ff5672..6458a1234 100644 --- a/include/mqtt.hrl +++ b/include/mqtt.hrl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/include/pubsub.hrl b/include/pubsub.hrl index da919e9e2..1811aa926 100644 --- a/include/pubsub.hrl +++ b/include/pubsub.hrl @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/man/ejabberd.yml.5 b/man/ejabberd.yml.5 index 8c5e6bebd..48c4509f4 100644 --- a/man/ejabberd.yml.5 +++ b/man/ejabberd.yml.5 @@ -7397,4 +7397,4 @@ Configuration Guide: https://docs\&.ejabberd\&.im/admin/configuration Source code: https://github\&.com/processone/ejabberd .SH "COPYING" .sp -Copyright (c) 2002\-2021 ProcessOne\&. +Copyright (c) 2002\-2022 ProcessOne\&. diff --git a/rebar.config b/rebar.config index 26f4d9e6b..d3968be57 100644 --- a/rebar.config +++ b/rebar.config @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/rebar.config.script b/rebar.config.script index c83390fb5..33aeb8130 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 951d55d28..523cf9c76 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeniy Khramtsov -%%% @copyright (C) 2013-2021, Evgeniy Khramtsov +%%% @copyright (C) 2013-2022, Evgeniy Khramtsov %%% @doc %%% %%% @end diff --git a/sql/lite.new.sql b/sql/lite.new.sql index cb8add8a1..febef6247 100644 --- a/sql/lite.new.sql +++ b/sql/lite.new.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/lite.sql b/sql/lite.sql index 56e8c9151..18ee5915a 100644 --- a/sql/lite.sql +++ b/sql/lite.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/mssql.sql b/sql/mssql.sql index dfd9da2f1..782e492ce 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql index c4e021abf..a5d03c8c7 100644 --- a/sql/mysql.new.sql +++ b/sql/mysql.new.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/mysql.sql b/sql/mysql.sql index 751552e19..c4ae52de7 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/pg.new.sql b/sql/pg.new.sql index 5ffbedde3..c7d22c66a 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/sql/pg.sql b/sql/pg.sql index 733856ede..44bea2e03 100644 --- a/sql/pg.sql +++ b/sql/pg.sql @@ -1,5 +1,5 @@ -- --- ejabberd, Copyright (C) 2002-2021 ProcessOne +-- ejabberd, Copyright (C) 2002-2022 ProcessOne -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as diff --git a/src/acl.erl b/src/acl.erl index 5db79eba9..7e03298ba 100644 --- a/src/acl.erl +++ b/src/acl.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/econf.erl b/src/econf.erl index cb8cb8506..1a8711b48 100644 --- a/src/econf.erl +++ b/src/econf.erl @@ -3,7 +3,7 @@ %%% Purpose : Validator for ejabberd configuration options %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 112654741..d39af1400 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -5,7 +5,7 @@ %%% Created : 16 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_access_permissions.erl b/src/ejabberd_access_permissions.erl index 916475df9..6c4cc2ca7 100644 --- a/src/ejabberd_access_permissions.erl +++ b/src/ejabberd_access_permissions.erl @@ -5,7 +5,7 @@ %%% Created : 7 Sep 2016 by Paweł Chmielowski %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_acme.erl b/src/ejabberd_acme.erl index 93ce3c815..c67b7a0d7 100644 --- a/src/ejabberd_acme.erl +++ b/src/ejabberd_acme.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index cbf372654..63fac8221 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -5,7 +5,7 @@ %%% Created : 7 May 2006 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 161f1dab1..45e92d064 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -5,7 +5,7 @@ %%% Created : 31 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 35e4921b7..c64c508d9 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -5,7 +5,7 @@ %%% Created : 23 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl index dd7ff28eb..bfe4e0cac 100644 --- a/src/ejabberd_auth_anonymous.erl +++ b/src/ejabberd_auth_anonymous.erl @@ -5,7 +5,7 @@ %%% Created : 17 Feb 2006 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_external.erl b/src/ejabberd_auth_external.erl index a513c24ba..a5320b7bc 100644 --- a/src/ejabberd_auth_external.erl +++ b/src/ejabberd_auth_external.erl @@ -5,7 +5,7 @@ %%% Created : 12 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_jwt.erl b/src/ejabberd_auth_jwt.erl index 6df742305..caa2ddbf2 100644 --- a/src/ejabberd_auth_jwt.erl +++ b/src/ejabberd_auth_jwt.erl @@ -5,7 +5,7 @@ %%% Created : 16 Mar 2019 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index 7f5bd87c8..1c3143241 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -5,7 +5,7 @@ %%% Created : 12 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_mnesia.erl b/src/ejabberd_auth_mnesia.erl index 168ee76f5..bb1aa92bf 100644 --- a/src/ejabberd_auth_mnesia.erl +++ b/src/ejabberd_auth_mnesia.erl @@ -5,7 +5,7 @@ %%% Created : 12 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl index e3b0eba6e..aa48a1931 100644 --- a/src/ejabberd_auth_pam.erl +++ b/src/ejabberd_auth_pam.erl @@ -5,7 +5,7 @@ %%% Created : 5 Jul 2007 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl index 50cc1902e..ca7fd0889 100644 --- a/src/ejabberd_auth_sql.erl +++ b/src/ejabberd_auth_sql.erl @@ -5,7 +5,7 @@ %%% Created : 12 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_backend_sup.erl b/src/ejabberd_backend_sup.erl index c80dd8685..575e66e40 100644 --- a/src/ejabberd_backend_sup.erl +++ b/src/ejabberd_backend_sup.erl @@ -2,7 +2,7 @@ %%% Created : 24 Feb 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_bosh.erl b/src/ejabberd_bosh.erl index e9d2f0c0a..3bcf4f6f6 100644 --- a/src/ejabberd_bosh.erl +++ b/src/ejabberd_bosh.erl @@ -5,7 +5,7 @@ %%% Created : 20 Jul 2011 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index a62cac79a..6f1038947 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -2,7 +2,7 @@ %%% Created : 8 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_c2s_config.erl b/src/ejabberd_c2s_config.erl index b6c57ef98..4100ae23c 100644 --- a/src/ejabberd_c2s_config.erl +++ b/src/ejabberd_c2s_config.erl @@ -6,7 +6,7 @@ %%% Created : 2 Nov 2007 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 343a8e54e..69b14915f 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -5,7 +5,7 @@ %%% Created : 26 Apr 2008 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_cluster.erl b/src/ejabberd_cluster.erl index f9f233da8..0a5364beb 100644 --- a/src/ejabberd_cluster.erl +++ b/src/ejabberd_cluster.erl @@ -3,7 +3,7 @@ %%% Created : 5 Jul 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_cluster_mnesia.erl b/src/ejabberd_cluster_mnesia.erl index 313cf9257..81bf010d7 100644 --- a/src/ejabberd_cluster_mnesia.erl +++ b/src/ejabberd_cluster_mnesia.erl @@ -5,7 +5,7 @@ %%% Created : 7 Oct 2015 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index ddf0d3c59..5371f4da4 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -5,7 +5,7 @@ %%% Created : 20 May 2008 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_commands_doc.erl b/src/ejabberd_commands_doc.erl index eec334d04..0fe5f6402 100644 --- a/src/ejabberd_commands_doc.erl +++ b/src/ejabberd_commands_doc.erl @@ -5,7 +5,7 @@ %%% Created : 20 May 2008 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index ec3d2cf8c..c5d8c4494 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -5,7 +5,7 @@ %%% Created : 14 Dec 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_config_transformer.erl b/src/ejabberd_config_transformer.erl index 053a59c21..c41220ab3 100644 --- a/src/ejabberd_config_transformer.erl +++ b/src/ejabberd_config_transformer.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 77595cd54..047c1697e 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -5,7 +5,7 @@ %%% Created : 11 Jan 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_db_sup.erl b/src/ejabberd_db_sup.erl index 248325cf1..1701779ec 100644 --- a/src/ejabberd_db_sup.erl +++ b/src/ejabberd_db_sup.erl @@ -2,7 +2,7 @@ %%% Created : 13 June 2019 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_doc.erl b/src/ejabberd_doc.erl index b6369d968..c603a5f9a 100644 --- a/src/ejabberd_doc.erl +++ b/src/ejabberd_doc.erl @@ -2,7 +2,7 @@ %%% File : ejabberd_doc.erl %%% Purpose : Options documentation generator %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl index 605b7e226..1144b7d4f 100644 --- a/src/ejabberd_hooks.erl +++ b/src/ejabberd_hooks.erl @@ -5,7 +5,7 @@ %%% Created : 8 Aug 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_http.erl b/src/ejabberd_http.erl index d577a10d5..56de7e255 100644 --- a/src/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -5,7 +5,7 @@ %%% Created : 27 Feb 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl index eb2100a42..fec53c210 100644 --- a/src/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -5,7 +5,7 @@ %%% Created : 09-10-2010 by Eric Cestari %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_iq.erl b/src/ejabberd_iq.erl index 249c53294..be25dcb9d 100644 --- a/src/ejabberd_iq.erl +++ b/src/ejabberd_iq.erl @@ -5,7 +5,7 @@ %%% Created : 10 Nov 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 93fd2e0fd..9c962be6e 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -5,7 +5,7 @@ %%% Created : 16 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index 6dfef9d01..4a12b18f9 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -5,7 +5,7 @@ %%% Created : 30 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl index 05e197b3e..217b232fa 100644 --- a/src/ejabberd_logger.erl +++ b/src/ejabberd_logger.erl @@ -5,7 +5,7 @@ %%% Created : 12 May 2013 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2013-2021 ProcessOne +%%% ejabberd, Copyright (C) 2013-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_mnesia.erl b/src/ejabberd_mnesia.erl index 3818a1515..70dfe3e6e 100644 --- a/src/ejabberd_mnesia.erl +++ b/src/ejabberd_mnesia.erl @@ -5,7 +5,7 @@ %%% Created : 17 Nov 2016 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_oauth.erl b/src/ejabberd_oauth.erl index 9b2c517de..1d26798b0 100644 --- a/src/ejabberd_oauth.erl +++ b/src/ejabberd_oauth.erl @@ -5,7 +5,7 @@ %%% Created : 20 Mar 2015 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_oauth_mnesia.erl b/src/ejabberd_oauth_mnesia.erl index de22f94a6..8bb2efba7 100644 --- a/src/ejabberd_oauth_mnesia.erl +++ b/src/ejabberd_oauth_mnesia.erl @@ -5,7 +5,7 @@ %%% Created : 20 Jul 2016 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_oauth_rest.erl b/src/ejabberd_oauth_rest.erl index b968c9263..9182ec256 100644 --- a/src/ejabberd_oauth_rest.erl +++ b/src/ejabberd_oauth_rest.erl @@ -5,7 +5,7 @@ %%% Created : 26 Jul 2016 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_oauth_sql.erl b/src/ejabberd_oauth_sql.erl index 25be737f0..89dcc590c 100644 --- a/src/ejabberd_oauth_sql.erl +++ b/src/ejabberd_oauth_sql.erl @@ -5,7 +5,7 @@ %%% Created : 27 Jul 2016 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_old_config.erl b/src/ejabberd_old_config.erl index 991677133..47812d894 100644 --- a/src/ejabberd_old_config.erl +++ b/src/ejabberd_old_config.erl @@ -1,7 +1,7 @@ %%%---------------------------------------------------------------------- %%% Purpose: Transform old-style Erlang config to YAML config %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_options.erl b/src/ejabberd_options.erl index 77b76799f..4b29bfffd 100644 --- a/src/ejabberd_options.erl +++ b/src/ejabberd_options.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 47a89469d..3bfaa3078 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index d62efb300..c748e9b2f 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -5,7 +5,7 @@ %%% Created : 17 Jul 2008 by Pablo Polvorin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_pkix.erl b/src/ejabberd_pkix.erl index 7ccb92cce..c5a945588 100644 --- a/src/ejabberd_pkix.erl +++ b/src/ejabberd_pkix.erl @@ -3,7 +3,7 @@ %%% Created : 4 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_redis.erl b/src/ejabberd_redis.erl index 640a75be1..597c57cfb 100644 --- a/src/ejabberd_redis.erl +++ b/src/ejabberd_redis.erl @@ -4,7 +4,7 @@ %%% Created : 8 May 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_redis_sup.erl b/src/ejabberd_redis_sup.erl index cfc400a7a..6906ef937 100644 --- a/src/ejabberd_redis_sup.erl +++ b/src/ejabberd_redis_sup.erl @@ -3,7 +3,7 @@ %%% Created : 6 Apr 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_regexp.erl b/src/ejabberd_regexp.erl index ef967893e..5841dd4da 100644 --- a/src/ejabberd_regexp.erl +++ b/src/ejabberd_regexp.erl @@ -5,7 +5,7 @@ %%% Created : 8 Dec 2011 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 492beb6d3..7be9475ec 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -5,7 +5,7 @@ %%% Created : 27 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_router_mnesia.erl b/src/ejabberd_router_mnesia.erl index b4144a97d..53adca533 100644 --- a/src/ejabberd_router_mnesia.erl +++ b/src/ejabberd_router_mnesia.erl @@ -2,7 +2,7 @@ %%% Created : 11 Jan 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_router_multicast.erl b/src/ejabberd_router_multicast.erl index e97ccb837..f3aba8407 100644 --- a/src/ejabberd_router_multicast.erl +++ b/src/ejabberd_router_multicast.erl @@ -5,7 +5,7 @@ %%% Created : 11 Aug 2007 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_router_redis.erl b/src/ejabberd_router_redis.erl index 8d75081b3..450aa4b6b 100644 --- a/src/ejabberd_router_redis.erl +++ b/src/ejabberd_router_redis.erl @@ -3,7 +3,7 @@ %%% Created : 28 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_router_sql.erl b/src/ejabberd_router_sql.erl index 54f7bdfed..07a3c27f8 100644 --- a/src/ejabberd_router_sql.erl +++ b/src/ejabberd_router_sql.erl @@ -3,7 +3,7 @@ %%% Created : 28 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index a5cf23d1e..9b40ad717 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -5,7 +5,7 @@ %%% Created : 7 Dec 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index 8177a7333..b3ff0c2b4 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -2,7 +2,7 @@ %%% Created : 12 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index f057705ed..f7998240c 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -2,7 +2,7 @@ %%% Created : 16 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index b854bcb2b..5e386ed7d 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -2,7 +2,7 @@ %%% Created : 11 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_shaper.erl b/src/ejabberd_shaper.erl index d4a883baf..4bd5229fa 100644 --- a/src/ejabberd_shaper.erl +++ b/src/ejabberd_shaper.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sip.erl b/src/ejabberd_sip.erl index 62b9c0333..a85b139e0 100644 --- a/src/ejabberd_sip.erl +++ b/src/ejabberd_sip.erl @@ -5,7 +5,7 @@ %%% Created : 30 Apr 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2013-2021 ProcessOne +%%% ejabberd, Copyright (C) 2013-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index afb95c10b..231e4351e 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -5,7 +5,7 @@ %%% Created : 24 Nov 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sm_mnesia.erl b/src/ejabberd_sm_mnesia.erl index 396e1c6d6..ec321271b 100644 --- a/src/ejabberd_sm_mnesia.erl +++ b/src/ejabberd_sm_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 9 Mar 2015 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sm_redis.erl b/src/ejabberd_sm_redis.erl index a436aa923..5f612b926 100644 --- a/src/ejabberd_sm_redis.erl +++ b/src/ejabberd_sm_redis.erl @@ -4,7 +4,7 @@ %%% Created : 11 Mar 2015 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sm_sql.erl b/src/ejabberd_sm_sql.erl index 9c90b75c4..b58b66f0d 100644 --- a/src/ejabberd_sm_sql.erl +++ b/src/ejabberd_sm_sql.erl @@ -4,7 +4,7 @@ %%% Created : 9 Mar 2015 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index afca5b183..d68d1a8e1 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -5,7 +5,7 @@ %%% Created : 8 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index 9249bad93..ad33c1ea3 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -5,7 +5,7 @@ %%% Created : 20 Jan 2016 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sql_sup.erl b/src/ejabberd_sql_sup.erl index d4af0244b..659189c33 100644 --- a/src/ejabberd_sql_sup.erl +++ b/src/ejabberd_sql_sup.erl @@ -5,7 +5,7 @@ %%% Created : 22 Dec 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_stun.erl b/src/ejabberd_stun.erl index 118af6eac..b41baca12 100644 --- a/src/ejabberd_stun.erl +++ b/src/ejabberd_stun.erl @@ -5,7 +5,7 @@ %%% Created : 8 May 2014 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2013-2021 ProcessOne +%%% ejabberd, Copyright (C) 2013-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl index 364c8a058..a97c7784b 100644 --- a/src/ejabberd_sup.erl +++ b/src/ejabberd_sup.erl @@ -5,7 +5,7 @@ %%% Created : 31 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_system_monitor.erl b/src/ejabberd_system_monitor.erl index 208909366..d03e3bbd8 100644 --- a/src/ejabberd_system_monitor.erl +++ b/src/ejabberd_system_monitor.erl @@ -5,7 +5,7 @@ %%% Created : 21 Mar 2007 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_tmp_sup.erl b/src/ejabberd_tmp_sup.erl index 64316d4c9..f23b51289 100644 --- a/src/ejabberd_tmp_sup.erl +++ b/src/ejabberd_tmp_sup.erl @@ -5,7 +5,7 @@ %%% Created : 18 Jul 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_update.erl b/src/ejabberd_update.erl index ff6c2712d..0ec129944 100644 --- a/src/ejabberd_update.erl +++ b/src/ejabberd_update.erl @@ -5,7 +5,7 @@ %%% Created : 27 Jan 2006 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_web.erl b/src/ejabberd_web.erl index 5cfbb93aa..431ae8ef3 100644 --- a/src/ejabberd_web.erl +++ b/src/ejabberd_web.erl @@ -6,7 +6,7 @@ %%% Created : 28 Feb 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 85a639687..7691dd794 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -5,7 +5,7 @@ %%% Created : 9 Apr 2004 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as @@ -333,7 +333,7 @@ make_xhtml(Els, Host, Node, Lang, JID, Level) -> [?XE(<<"p">>, [?AC(<<"https://www.ejabberd.im/">>, <<"ejabberd">>), ?C(<<" ">>), ?C(ejabberd_option:version()), - ?C(<<" (c) 2002-2021 ">>), + ?C(<<" (c) 2002-2022 ">>), ?AC(<<"https://www.process-one.net/">>, <<"ProcessOne, leader in messaging and push solutions">>)] )])])])]}}. diff --git a/src/ejabberd_websocket.erl b/src/ejabberd_websocket.erl index 5f9d284a6..966242331 100644 --- a/src/ejabberd_websocket.erl +++ b/src/ejabberd_websocket.erl @@ -33,7 +33,7 @@ %%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE %%% POSSIBILITY OF SUCH DAMAGE. %%% ========================================================================================================== -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%%---------------------------------------------------------------------- -module(ejabberd_websocket). diff --git a/src/ejabberd_xmlrpc.erl b/src/ejabberd_xmlrpc.erl index 1a1ec63f4..9e587add8 100644 --- a/src/ejabberd_xmlrpc.erl +++ b/src/ejabberd_xmlrpc.erl @@ -5,7 +5,7 @@ %%% Created : 21 Aug 2007 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ejd2sql.erl b/src/ejd2sql.erl index 427e13087..6afad112c 100644 --- a/src/ejd2sql.erl +++ b/src/ejd2sql.erl @@ -5,7 +5,7 @@ %%% Created : 22 Aug 2005 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/eldap_filter.erl b/src/eldap_filter.erl index ab5b8eb6f..4e554572d 100644 --- a/src/eldap_filter.erl +++ b/src/eldap_filter.erl @@ -6,7 +6,7 @@ %%% Author: Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/eldap_pool.erl b/src/eldap_pool.erl index dd3b9e665..148095783 100644 --- a/src/eldap_pool.erl +++ b/src/eldap_pool.erl @@ -5,7 +5,7 @@ %%% Created : 12 Nov 2006 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/eldap_utils.erl b/src/eldap_utils.erl index dae9b563b..efbd78550 100644 --- a/src/eldap_utils.erl +++ b/src/eldap_utils.erl @@ -5,7 +5,7 @@ %%% Created : 12 Oct 2006 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/elixir_logger_backend.erl b/src/elixir_logger_backend.erl index d466652e1..0db3ee517 100644 --- a/src/elixir_logger_backend.erl +++ b/src/elixir_logger_backend.erl @@ -5,7 +5,7 @@ %%% Created : 9 March 2016 by Mickael Remond %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/ext_mod.erl b/src/ext_mod.erl index b3e88a9cb..02666e9eb 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -5,7 +5,7 @@ %%% Created : 19 Feb 2015 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2006-2021 ProcessOne +%%% ejabberd, Copyright (C) 2006-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/extauth.erl b/src/extauth.erl index 6462df1cb..16a5e3f7c 100644 --- a/src/extauth.erl +++ b/src/extauth.erl @@ -2,7 +2,7 @@ %%% Created : 7 May 2018 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/extauth_sup.erl b/src/extauth_sup.erl index 7537e8aef..c10bbf3bf 100644 --- a/src/extauth_sup.erl +++ b/src/extauth_sup.erl @@ -2,7 +2,7 @@ %%% Created : 7 May 2018 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl index 29057435d..313061ae0 100644 --- a/src/gen_iq_handler.erl +++ b/src/gen_iq_handler.erl @@ -5,7 +5,7 @@ %%% Created : 22 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 212afb4ff..1d9d26b40 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -5,7 +5,7 @@ %%% Created : 24 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/gen_pubsub_node.erl b/src/gen_pubsub_node.erl index 3f83fe48f..df6c61944 100644 --- a/src/gen_pubsub_node.erl +++ b/src/gen_pubsub_node.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/gen_pubsub_nodetree.erl b/src/gen_pubsub_nodetree.erl index b6b73b8cb..190051fd7 100644 --- a/src/gen_pubsub_nodetree.erl +++ b/src/gen_pubsub_nodetree.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/jd2ejd.erl b/src/jd2ejd.erl index 279dd6e0d..b7fd5f66c 100644 --- a/src/jd2ejd.erl +++ b/src/jd2ejd.erl @@ -5,7 +5,7 @@ %%% Created : 2 Feb 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/misc.erl b/src/misc.erl index 474fad615..1cfcc2182 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -8,7 +8,7 @@ %%% Created : 30 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl index 73c7d82af..1a2d63038 100644 --- a/src/mod_adhoc.erl +++ b/src/mod_adhoc.erl @@ -5,7 +5,7 @@ %%% Created : 15 Nov 2005 by Magnus Henoch %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index ea73c55d9..0b95c9ceb 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -5,7 +5,7 @@ %%% Created : 10 Aug 2008 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index 02beb4bf8..f12618ede 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -5,7 +5,7 @@ %%% Created : 9 Aug 2017 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_announce.erl b/src/mod_announce.erl index 21213615c..8698a8a3b 100644 --- a/src/mod_announce.erl +++ b/src/mod_announce.erl @@ -5,7 +5,7 @@ %%% Created : 11 Aug 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_announce_mnesia.erl b/src/mod_announce_mnesia.erl index 068406e01..d56d036ad 100644 --- a/src/mod_announce_mnesia.erl +++ b/src/mod_announce_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_announce_sql.erl b/src/mod_announce_sql.erl index bc79fc77a..5ef3a7900 100644 --- a/src/mod_announce_sql.erl +++ b/src/mod_announce_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_avatar.erl b/src/mod_avatar.erl index 19c82a6bf..0db65c253 100644 --- a/src/mod_avatar.erl +++ b/src/mod_avatar.erl @@ -3,7 +3,7 @@ %%% Created : 13 Sep 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_block_strangers.erl b/src/mod_block_strangers.erl index 92f52236d..437df2307 100644 --- a/src/mod_block_strangers.erl +++ b/src/mod_block_strangers.erl @@ -5,7 +5,7 @@ %%% Created : 25 Dec 2016 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl index 7d4b1bff5..06aa4b195 100644 --- a/src/mod_blocking.erl +++ b/src/mod_blocking.erl @@ -5,7 +5,7 @@ %%% Created : 24 Aug 2008 by Stephan Maka %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 059058a3b..7bb331b2e 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -7,7 +7,7 @@ %%% Created : 20 Jul 2011 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_bosh_mnesia.erl b/src/mod_bosh_mnesia.erl index 3f9f32345..01a64d67e 100644 --- a/src/mod_bosh_mnesia.erl +++ b/src/mod_bosh_mnesia.erl @@ -2,7 +2,7 @@ %%% Created : 12 Jan 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_bosh_redis.erl b/src/mod_bosh_redis.erl index c288f6c06..12c0a925d 100644 --- a/src/mod_bosh_redis.erl +++ b/src/mod_bosh_redis.erl @@ -5,7 +5,7 @@ %%% Created : 28 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_bosh_sql.erl b/src/mod_bosh_sql.erl index 7dba8fc4b..80369facc 100644 --- a/src/mod_bosh_sql.erl +++ b/src/mod_bosh_sql.erl @@ -5,7 +5,7 @@ %%% Created : 28 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_caps.erl b/src/mod_caps.erl index bc48dac6f..3c8b16b0b 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -5,7 +5,7 @@ %%% Created : 7 Oct 2006 by Magnus Henoch %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_caps_mnesia.erl b/src/mod_caps_mnesia.erl index 965c3dbfd..db3ac8351 100644 --- a/src/mod_caps_mnesia.erl +++ b/src/mod_caps_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_caps_sql.erl b/src/mod_caps_sql.erl index 7fb3cf8fa..7ab39b489 100644 --- a/src/mod_caps_sql.erl +++ b/src/mod_caps_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl index a4e3a7999..3013ab749 100644 --- a/src/mod_carboncopy.erl +++ b/src/mod_carboncopy.erl @@ -7,7 +7,7 @@ %%% {mod_carboncopy, []} %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_client_state.erl b/src/mod_client_state.erl index 3585ec3a4..14a49fdba 100644 --- a/src/mod_client_state.erl +++ b/src/mod_client_state.erl @@ -5,7 +5,7 @@ %%% Created : 11 Sep 2014 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2014-2021 ProcessOne +%%% ejabberd, Copyright (C) 2014-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 54b54e9e1..385c6d657 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -5,7 +5,7 @@ %%% Created : 19 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 8683d60ab..c1e3df9bd 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -5,7 +5,7 @@ %%% Created : 8 Nov 2021 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_delegation.erl b/src/mod_delegation.erl index 3ae3b8a51..19a1adcc6 100644 --- a/src/mod_delegation.erl +++ b/src/mod_delegation.erl @@ -4,7 +4,7 @@ %%% Purpose : XEP-0355: Namespace Delegation %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_disco.erl b/src/mod_disco.erl index deb9d15a2..8a74d85df 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -5,7 +5,7 @@ %%% Created : 1 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_fail2ban.erl b/src/mod_fail2ban.erl index 8751653d8..d7b2963f4 100644 --- a/src/mod_fail2ban.erl +++ b/src/mod_fail2ban.erl @@ -5,7 +5,7 @@ %%% Created : 15 Aug 2014 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2014-2021 ProcessOne +%%% ejabberd, Copyright (C) 2014-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_http_api.erl b/src/mod_http_api.erl index 023df39ca..2680ef9a8 100644 --- a/src/mod_http_api.erl +++ b/src/mod_http_api.erl @@ -5,7 +5,7 @@ %%% Created : 15 Sep 2014 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_http_fileserver.erl b/src/mod_http_fileserver.erl index a5c6ebbfd..d20d626bd 100644 --- a/src/mod_http_fileserver.erl +++ b/src/mod_http_fileserver.erl @@ -5,7 +5,7 @@ %%% Created : %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 1ff94eb4a..88be57718 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -5,7 +5,7 @@ %%% Created : 20 Aug 2015 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2015-2021 ProcessOne +%%% ejabberd, Copyright (C) 2015-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_http_upload_quota.erl b/src/mod_http_upload_quota.erl index 5ed7fcefb..2d8a0b0de 100644 --- a/src/mod_http_upload_quota.erl +++ b/src/mod_http_upload_quota.erl @@ -5,7 +5,7 @@ %%% Created : 15 Oct 2015 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2015-2021 ProcessOne +%%% ejabberd, Copyright (C) 2015-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_jidprep.erl b/src/mod_jidprep.erl index c666f8544..605ca53b1 100644 --- a/src/mod_jidprep.erl +++ b/src/mod_jidprep.erl @@ -5,7 +5,7 @@ %%% Created : 11 Sep 2019 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2019-2021 ProcessOne +%%% ejabberd, Copyright (C) 2019-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_last.erl b/src/mod_last.erl index a7d36c791..c13e4d22f 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -5,7 +5,7 @@ %%% Created : 24 Oct 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_last_mnesia.erl b/src/mod_last_mnesia.erl index a2549dfcf..c081ba039 100644 --- a/src/mod_last_mnesia.erl +++ b/src/mod_last_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_last_sql.erl b/src/mod_last_sql.erl index 07b9a62b3..121c96045 100644 --- a/src/mod_last_sql.erl +++ b/src/mod_last_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_legacy_auth.erl b/src/mod_legacy_auth.erl index 2b29b4cd2..0053d88a6 100644 --- a/src/mod_legacy_auth.erl +++ b/src/mod_legacy_auth.erl @@ -2,7 +2,7 @@ %%% Created : 11 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 5bf42a759..59940ec81 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -5,7 +5,7 @@ %%% Created : 4 Jul 2013 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2013-2021 ProcessOne +%%% ejabberd, Copyright (C) 2013-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_mam_mnesia.erl b/src/mod_mam_mnesia.erl index d21d0e6ce..dc5898fca 100644 --- a/src/mod_mam_mnesia.erl +++ b/src/mod_mam_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 15 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 269b4c963..8e803587e 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -4,7 +4,7 @@ %%% Created : 15 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_metrics.erl b/src/mod_metrics.erl index d42f79112..d1f24c700 100644 --- a/src/mod_metrics.erl +++ b/src/mod_metrics.erl @@ -5,7 +5,7 @@ %%% Created : 22 Oct 2015 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_mqtt.erl b/src/mod_mqtt.erl index 5d00408df..01950d64a 100644 --- a/src/mod_mqtt.erl +++ b/src/mod_mqtt.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/mod_mqtt_mnesia.erl b/src/mod_mqtt_mnesia.erl index 6c230a8f6..1d8e7aa5b 100644 --- a/src/mod_mqtt_mnesia.erl +++ b/src/mod_mqtt_mnesia.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/mod_mqtt_session.erl b/src/mod_mqtt_session.erl index e7737804e..8ce040669 100644 --- a/src/mod_mqtt_session.erl +++ b/src/mod_mqtt_session.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/mod_mqtt_sql.erl b/src/mod_mqtt_sql.erl index fefd000cd..dd40771f5 100644 --- a/src/mod_mqtt_sql.erl +++ b/src/mod_mqtt_sql.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/mod_mqtt_ws.erl b/src/mod_mqtt_ws.erl index 01f182d30..1c9c8de7a 100644 --- a/src/mod_mqtt_ws.erl +++ b/src/mod_mqtt_ws.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/mod_muc.erl b/src/mod_muc.erl index fd0f12294..6e69987dc 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -5,7 +5,7 @@ %%% Created : 19 Mar 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index ac2d887fe..2db1d95f1 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -5,7 +5,7 @@ %%% Created : 8 Sep 2007 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl index 8bcbc8bc0..0ee493b94 100644 --- a/src/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -5,7 +5,7 @@ %%% Created : 12 Mar 2006 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_mnesia.erl b/src/mod_muc_mnesia.erl index c822acc68..18b1e74ef 100644 --- a/src/mod_muc_mnesia.erl +++ b/src/mod_muc_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index aaf3e8895..6e65574ce 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -5,7 +5,7 @@ %%% Created : 19 Mar 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index 8aa7ad62b..03022e924 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_muc_sup.erl b/src/mod_muc_sup.erl index 62240c857..11a147bb5 100644 --- a/src/mod_muc_sup.erl +++ b/src/mod_muc_sup.erl @@ -2,7 +2,7 @@ %%% Created : 4 Jul 2019 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl index fa076da70..92de4c7ad 100644 --- a/src/mod_multicast.erl +++ b/src/mod_multicast.erl @@ -5,7 +5,7 @@ %%% Created : 29 May 2007 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 1d367eb72..70e7403ed 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -5,7 +5,7 @@ %%% Created : 5 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_offline_mnesia.erl b/src/mod_offline_mnesia.erl index a3c902fb3..34893cd97 100644 --- a/src/mod_offline_mnesia.erl +++ b/src/mod_offline_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 15 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_offline_sql.erl b/src/mod_offline_sql.erl index 4e8441b7f..65465dffd 100644 --- a/src/mod_offline_sql.erl +++ b/src/mod_offline_sql.erl @@ -4,7 +4,7 @@ %%% Created : 15 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_ping.erl b/src/mod_ping.erl index f233b2ae8..28f7a57b0 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -5,7 +5,7 @@ %%% Created : 11 Jul 2009 by Brian Cully %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_pres_counter.erl b/src/mod_pres_counter.erl index 77f42961f..80b8fb85f 100644 --- a/src/mod_pres_counter.erl +++ b/src/mod_pres_counter.erl @@ -5,7 +5,7 @@ %%% Created : 23 Sep 2010 by Ahmed Omar %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 5ac26c2f5..4a4ebd5c5 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -5,7 +5,7 @@ %%% Created : 21 Jul 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_privacy_mnesia.erl b/src/mod_privacy_mnesia.erl index 2f9cb0027..f2c6879f1 100644 --- a/src/mod_privacy_mnesia.erl +++ b/src/mod_privacy_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 14 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_privacy_sql.erl b/src/mod_privacy_sql.erl index b27442724..07c97ca7f 100644 --- a/src/mod_privacy_sql.erl +++ b/src/mod_privacy_sql.erl @@ -4,7 +4,7 @@ %%% Created : 14 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_private.erl b/src/mod_private.erl index 436aae222..f6cebbcda 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -5,7 +5,7 @@ %%% Created : 16 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_private_mnesia.erl b/src/mod_private_mnesia.erl index b5617d96e..5c789f0a7 100644 --- a/src/mod_private_mnesia.erl +++ b/src/mod_private_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_private_sql.erl b/src/mod_private_sql.erl index 08a13e8a4..d2efbe98d 100644 --- a/src/mod_private_sql.erl +++ b/src/mod_private_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_privilege.erl b/src/mod_privilege.erl index 353a8da27..9c8c9462e 100644 --- a/src/mod_privilege.erl +++ b/src/mod_privilege.erl @@ -4,7 +4,7 @@ %%% Purpose : XEP-0356: Privileged Entity %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65.erl b/src/mod_proxy65.erl index 4b4f02c03..1ccb31978 100644 --- a/src/mod_proxy65.erl +++ b/src/mod_proxy65.erl @@ -5,7 +5,7 @@ %%% Created : 12 Oct 2006 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_lib.erl b/src/mod_proxy65_lib.erl index f0fb40830..6298d7bf0 100644 --- a/src/mod_proxy65_lib.erl +++ b/src/mod_proxy65_lib.erl @@ -5,7 +5,7 @@ %%% Created : 12 Oct 2006 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_mnesia.erl b/src/mod_proxy65_mnesia.erl index cd1790f96..73f248d4c 100644 --- a/src/mod_proxy65_mnesia.erl +++ b/src/mod_proxy65_mnesia.erl @@ -2,7 +2,7 @@ %%% Created : 16 Jan 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_redis.erl b/src/mod_proxy65_redis.erl index ab1f3cf85..e93dce36a 100644 --- a/src/mod_proxy65_redis.erl +++ b/src/mod_proxy65_redis.erl @@ -3,7 +3,7 @@ %%% Created : 31 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_service.erl b/src/mod_proxy65_service.erl index 78a8d85d2..c6995482d 100644 --- a/src/mod_proxy65_service.erl +++ b/src/mod_proxy65_service.erl @@ -5,7 +5,7 @@ %%% Created : 12 Oct 2006 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_sql.erl b/src/mod_proxy65_sql.erl index ece71c9c5..6e69e5a0f 100644 --- a/src/mod_proxy65_sql.erl +++ b/src/mod_proxy65_sql.erl @@ -3,7 +3,7 @@ %%% Created : 30 Mar 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_proxy65_stream.erl b/src/mod_proxy65_stream.erl index 505daf446..4e1eaf3fe 100644 --- a/src/mod_proxy65_stream.erl +++ b/src/mod_proxy65_stream.erl @@ -4,7 +4,7 @@ %%% Purpose : Bytestream process. %%% Created : 12 Oct 2006 by Evgeniy Khramtsov %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index c86d5fdbf..0aa4d1afc 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_pubsub_mnesia.erl b/src/mod_pubsub_mnesia.erl index b7730ce55..3d2d1e46b 100644 --- a/src/mod_pubsub_mnesia.erl +++ b/src/mod_pubsub_mnesia.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_pubsub_sql.erl b/src/mod_pubsub_sql.erl index 0e670e1d5..41b7eed70 100644 --- a/src/mod_pubsub_sql.erl +++ b/src/mod_pubsub_sql.erl @@ -1,5 +1,5 @@ %%%---------------------------------------------------------------------- -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_push.erl b/src/mod_push.erl index 5477c5792..f3e0479f3 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -5,7 +5,7 @@ %%% Created : 15 Jul 2017 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_push_keepalive.erl b/src/mod_push_keepalive.erl index e0e83f1e1..1ced2690f 100644 --- a/src/mod_push_keepalive.erl +++ b/src/mod_push_keepalive.erl @@ -5,7 +5,7 @@ %%% Created : 15 Jul 2017 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_push_mnesia.erl b/src/mod_push_mnesia.erl index 665ab48f2..e265678e7 100644 --- a/src/mod_push_mnesia.erl +++ b/src/mod_push_mnesia.erl @@ -5,7 +5,7 @@ %%% Created : 15 Jul 2017 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_push_sql.erl b/src/mod_push_sql.erl index c024a12d1..ae6774a51 100644 --- a/src/mod_push_sql.erl +++ b/src/mod_push_sql.erl @@ -5,7 +5,7 @@ %%% Created : 26 Oct 2017 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2017-2021 ProcessOne +%%% ejabberd, Copyright (C) 2017-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_register.erl b/src/mod_register.erl index b85efd57c..5f3d7de56 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -5,7 +5,7 @@ %%% Created : 8 Dec 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_register_web.erl b/src/mod_register_web.erl index 0cf4bcff8..59bc855bc 100644 --- a/src/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -5,7 +5,7 @@ %%% Created : 4 May 2008 by Badlop %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 94cae4950..e2b176502 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -5,7 +5,7 @@ %%% Created : 11 Dec 2002 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_roster_mnesia.erl b/src/mod_roster_mnesia.erl index fa1d52f7c..e42367b1f 100644 --- a/src/mod_roster_mnesia.erl +++ b/src/mod_roster_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_roster_sql.erl b/src/mod_roster_sql.erl index ebfcde463..1a8d812b6 100644 --- a/src/mod_roster_sql.erl +++ b/src/mod_roster_sql.erl @@ -4,7 +4,7 @@ %%% Created : 14 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_s2s_dialback.erl b/src/mod_s2s_dialback.erl index 05747e3bc..5e966967d 100644 --- a/src/mod_s2s_dialback.erl +++ b/src/mod_s2s_dialback.erl @@ -2,7 +2,7 @@ %%% Created : 16 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl index f5f23eeb0..2f962a13f 100644 --- a/src/mod_service_log.erl +++ b/src/mod_service_log.erl @@ -5,7 +5,7 @@ %%% Created : 24 Aug 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index b590578df..1960835a1 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -5,7 +5,7 @@ %%% Created : 5 Mar 2005 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index e842ab261..216dd4ce1 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -7,7 +7,7 @@ %%% Created : 5 Mar 2005 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_shared_roster_mnesia.erl b/src/mod_shared_roster_mnesia.erl index 484df0cd5..0504184ba 100644 --- a/src/mod_shared_roster_mnesia.erl +++ b/src/mod_shared_roster_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 14 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_shared_roster_sql.erl b/src/mod_shared_roster_sql.erl index 0d44dce69..ca25314fd 100644 --- a/src/mod_shared_roster_sql.erl +++ b/src/mod_shared_roster_sql.erl @@ -4,7 +4,7 @@ %%% Created : 14 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_sic.erl b/src/mod_sic.erl index 4eeb8fd08..c21482d7f 100644 --- a/src/mod_sic.erl +++ b/src/mod_sic.erl @@ -5,7 +5,7 @@ %%% Created : 6 Mar 2010 by Karim Gemayel %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_sip.erl b/src/mod_sip.erl index 6ea2a408f..5c1e09467 100644 --- a/src/mod_sip.erl +++ b/src/mod_sip.erl @@ -5,7 +5,7 @@ %%% Created : 21 Apr 2014 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2014-2021 ProcessOne +%%% ejabberd, Copyright (C) 2014-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_sip_proxy.erl b/src/mod_sip_proxy.erl index ddfefb1ad..8534766c4 100644 --- a/src/mod_sip_proxy.erl +++ b/src/mod_sip_proxy.erl @@ -5,7 +5,7 @@ %%% Created : 21 Apr 2014 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2014-2021 ProcessOne +%%% ejabberd, Copyright (C) 2014-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_sip_registrar.erl b/src/mod_sip_registrar.erl index 5079aebf0..7c6ffef9e 100644 --- a/src/mod_sip_registrar.erl +++ b/src/mod_sip_registrar.erl @@ -5,7 +5,7 @@ %%% Created : 23 Apr 2014 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2014-2021 ProcessOne +%%% ejabberd, Copyright (C) 2014-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_stats.erl b/src/mod_stats.erl index c61fe6175..52798ce49 100644 --- a/src/mod_stats.erl +++ b/src/mod_stats.erl @@ -5,7 +5,7 @@ %%% Created : 11 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index 6d4c768c8..67ab815d1 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -3,7 +3,7 @@ %%% Created : 25 Dec 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_stun_disco.erl b/src/mod_stun_disco.erl index cbb671639..26a2646cc 100644 --- a/src/mod_stun_disco.erl +++ b/src/mod_stun_disco.erl @@ -5,7 +5,7 @@ %%% Created : 18 Apr 2020 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2020-2021 ProcessOne +%%% ejabberd, Copyright (C) 2020-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_time.erl b/src/mod_time.erl index 4ec3cd64e..9530967ec 100644 --- a/src/mod_time.erl +++ b/src/mod_time.erl @@ -6,7 +6,7 @@ %%% Created : 18 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 8e0d32a4a..3ac97b30e 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -5,7 +5,7 @@ %%% Created : 2 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index bc6e7ebca..f8e9a1d93 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -4,7 +4,7 @@ %%% Created : 29 Jul 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_vcard_mnesia.erl b/src/mod_vcard_mnesia.erl index ad4be701c..694333d65 100644 --- a/src/mod_vcard_mnesia.erl +++ b/src/mod_vcard_mnesia.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_vcard_sql.erl b/src/mod_vcard_sql.erl index 620c1b4b5..842d68c80 100644 --- a/src/mod_vcard_sql.erl +++ b/src/mod_vcard_sql.erl @@ -4,7 +4,7 @@ %%% Created : 13 Apr 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl index 59ebc7f71..61d582437 100644 --- a/src/mod_vcard_xupdate.erl +++ b/src/mod_vcard_xupdate.erl @@ -5,7 +5,7 @@ %%% Created : 9 Mar 2007 by Igor Goryachev %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mod_version.erl b/src/mod_version.erl index 9aa93829d..b842dcfd0 100644 --- a/src/mod_version.erl +++ b/src/mod_version.erl @@ -5,7 +5,7 @@ %%% Created : 18 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/mqtt_codec.erl b/src/mqtt_codec.erl index 74fed4eac..e09391ddf 100644 --- a/src/mqtt_codec.erl +++ b/src/mqtt_codec.erl @@ -1,6 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Evgeny Khramtsov -%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved. +%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved. %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. diff --git a/src/node_flat.erl b/src/node_flat.erl index 55dea0d8d..b829395cc 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index f9c8a209d..a4142cb10 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/node_pep.erl b/src/node_pep.erl index 66431b948..c52db1b3e 100644 --- a/src/node_pep.erl +++ b/src/node_pep.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index 3bb66bc4c..1d1a632f2 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/nodetree_tree.erl b/src/nodetree_tree.erl index 853c1fb93..df6e9cb60 100644 --- a/src/nodetree_tree.erl +++ b/src/nodetree_tree.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/nodetree_tree_sql.erl b/src/nodetree_tree_sql.erl index 402c50901..6c3419948 100644 --- a/src/nodetree_tree_sql.erl +++ b/src/nodetree_tree_sql.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/nodetree_virtual.erl b/src/nodetree_virtual.erl index c0274a795..988c0334c 100644 --- a/src/nodetree_virtual.erl +++ b/src/nodetree_virtual.erl @@ -5,7 +5,7 @@ %%% Created : 1 Dec 2007 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/prosody2ejabberd.erl b/src/prosody2ejabberd.erl index 8f5c35f84..07b6427e7 100644 --- a/src/prosody2ejabberd.erl +++ b/src/prosody2ejabberd.erl @@ -4,7 +4,7 @@ %%% Created : 20 Jan 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/proxy_protocol.erl b/src/proxy_protocol.erl index 146135a69..5716fe2e6 100644 --- a/src/proxy_protocol.erl +++ b/src/proxy_protocol.erl @@ -5,7 +5,7 @@ %%% Created : 27 Nov 2018 by Paweł Chmielowski %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/pubsub_db_sql.erl b/src/pubsub_db_sql.erl index 6c1e3b162..99c758d43 100644 --- a/src/pubsub_db_sql.erl +++ b/src/pubsub_db_sql.erl @@ -5,7 +5,7 @@ %%% Created : 7 Aug 2009 by Pablo Polvorin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/pubsub_index.erl b/src/pubsub_index.erl index 5b8d17e95..370fa1967 100644 --- a/src/pubsub_index.erl +++ b/src/pubsub_index.erl @@ -5,7 +5,7 @@ %%% Created : 30 Apr 2009 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/pubsub_migrate.erl b/src/pubsub_migrate.erl index 35fa87b90..9436ca133 100644 --- a/src/pubsub_migrate.erl +++ b/src/pubsub_migrate.erl @@ -5,7 +5,7 @@ %%% Created : 26 Jul 2014 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/pubsub_subscription.erl b/src/pubsub_subscription.erl index 92d6d314d..0b212d21c 100644 --- a/src/pubsub_subscription.erl +++ b/src/pubsub_subscription.erl @@ -5,7 +5,7 @@ %%% Created : 29 May 2009 by Brian Cully %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/pubsub_subscription_sql.erl b/src/pubsub_subscription_sql.erl index c36934f50..1b5257891 100644 --- a/src/pubsub_subscription_sql.erl +++ b/src/pubsub_subscription_sql.erl @@ -6,7 +6,7 @@ %%% Created : 7 Aug 2009 by Pablo Polvorin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/rest.erl b/src/rest.erl index 1bb5c5ef7..58e424700 100644 --- a/src/rest.erl +++ b/src/rest.erl @@ -5,7 +5,7 @@ %%% Created : 16 Oct 2014 by Christophe Romain %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/str.erl b/src/str.erl index a12d2640e..cc7957f97 100644 --- a/src/str.erl +++ b/src/str.erl @@ -5,7 +5,7 @@ %%% Created : 23 Feb 2012 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/translate.erl b/src/translate.erl index f2ca7c759..b0034588a 100644 --- a/src/translate.erl +++ b/src/translate.erl @@ -5,7 +5,7 @@ %%% Created : 6 Jan 2003 by Alexey Shchepin %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/src/win32_dns.erl b/src/win32_dns.erl index 76b347e45..bd65cdc36 100644 --- a/src/win32_dns.erl +++ b/src/win32_dns.erl @@ -5,7 +5,7 @@ %%% Created : 5 Mar 2009 by Geoff Cant %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/announce_tests.erl b/test/announce_tests.erl index 4b685cb3c..e1258629b 100644 --- a/test/announce_tests.erl +++ b/test/announce_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/carbons_tests.erl b/test/carbons_tests.erl index a6cde55c1..e1717be90 100644 --- a/test/carbons_tests.erl +++ b/test/carbons_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/csi_tests.erl b/test/csi_tests.erl index a2fb413fb..f1f39b49d 100644 --- a/test/csi_tests.erl +++ b/test/csi_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/ejabberd_SUITE.erl b/test/ejabberd_SUITE.erl index 237ac3f56..10b6aff69 100644 --- a/test/ejabberd_SUITE.erl +++ b/test/ejabberd_SUITE.erl @@ -3,7 +3,7 @@ %%% Created : 2 Jun 2013 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/example_tests.erl b/test/example_tests.erl index a8fe50ad0..dab5836d7 100644 --- a/test/example_tests.erl +++ b/test/example_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/jidprep_tests.erl b/test/jidprep_tests.erl index 72bf312ae..efe7f711c 100644 --- a/test/jidprep_tests.erl +++ b/test/jidprep_tests.erl @@ -3,7 +3,7 @@ %%% Created : 11 Sep 2019 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2019-2021 ProcessOne +%%% ejabberd, Copyright (C) 2019-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/ldap_srv.erl b/test/ldap_srv.erl index 966c08a1d..63d91f6c7 100644 --- a/test/ldap_srv.erl +++ b/test/ldap_srv.erl @@ -3,7 +3,7 @@ %%% Created : 21 Jun 2013 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/mam_tests.erl b/test/mam_tests.erl index e8fb59cee..ed7bbe97d 100644 --- a/test/mam_tests.erl +++ b/test/mam_tests.erl @@ -3,7 +3,7 @@ %%% Created : 14 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/muc_tests.erl b/test/muc_tests.erl index 95d9c3b69..f050e72ca 100644 --- a/test/muc_tests.erl +++ b/test/muc_tests.erl @@ -3,7 +3,7 @@ %%% Created : 15 Oct 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/offline_tests.erl b/test/offline_tests.erl index b5a90e7ee..5ffe50def 100644 --- a/test/offline_tests.erl +++ b/test/offline_tests.erl @@ -3,7 +3,7 @@ %%% Created : 7 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/privacy_tests.erl b/test/privacy_tests.erl index f24893b16..39526e5b1 100644 --- a/test/privacy_tests.erl +++ b/test/privacy_tests.erl @@ -3,7 +3,7 @@ %%% Created : 18 Oct 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/private_tests.erl b/test/private_tests.erl index e17932946..fd961b8b8 100644 --- a/test/private_tests.erl +++ b/test/private_tests.erl @@ -3,7 +3,7 @@ %%% Created : 23 Nov 2018 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/proxy65_tests.erl b/test/proxy65_tests.erl index bf6faf1e5..0a75f820e 100644 --- a/test/proxy65_tests.erl +++ b/test/proxy65_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/pubsub_tests.erl b/test/pubsub_tests.erl index 475e4fbd1..043545422 100644 --- a/test/pubsub_tests.erl +++ b/test/pubsub_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/push_tests.erl b/test/push_tests.erl index 2b367cba8..553f90968 100644 --- a/test/push_tests.erl +++ b/test/push_tests.erl @@ -3,7 +3,7 @@ %%% Created : 15 Jul 2017 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/replaced_tests.erl b/test/replaced_tests.erl index 9a172107e..5f3224aea 100644 --- a/test/replaced_tests.erl +++ b/test/replaced_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/roster_tests.erl b/test/roster_tests.erl index 3092b8cd8..f8d1999e6 100644 --- a/test/roster_tests.erl +++ b/test/roster_tests.erl @@ -3,7 +3,7 @@ %%% Created : 22 Oct 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/sm_tests.erl b/test/sm_tests.erl index 81fe39ed0..8e87c642a 100644 --- a/test/sm_tests.erl +++ b/test/sm_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/stundisco_tests.erl b/test/stundisco_tests.erl index f80652df4..65569ead8 100644 --- a/test/stundisco_tests.erl +++ b/test/stundisco_tests.erl @@ -3,7 +3,7 @@ %%% Created : 22 Apr 2020 by Holger Weiss %%% %%% -%%% ejabberd, Copyright (C) 2020-2021 ProcessOne +%%% ejabberd, Copyright (C) 2020-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/suite.erl b/test/suite.erl index de7d64873..7669e4fe4 100644 --- a/test/suite.erl +++ b/test/suite.erl @@ -3,7 +3,7 @@ %%% Created : 27 Jun 2013 by Evgeniy Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/upload_tests.erl b/test/upload_tests.erl index edbc6dcce..3a5885111 100644 --- a/test/upload_tests.erl +++ b/test/upload_tests.erl @@ -3,7 +3,7 @@ %%% Created : 17 May 2018 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/vcard_tests.erl b/test/vcard_tests.erl index 846b32ee9..791a2265c 100644 --- a/test/vcard_tests.erl +++ b/test/vcard_tests.erl @@ -3,7 +3,7 @@ %%% Created : 16 Nov 2016 by Evgeny Khramtsov %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/test/webadmin_tests.erl b/test/webadmin_tests.erl index 53a670d4e..34e2c1b86 100644 --- a/test/webadmin_tests.erl +++ b/test/webadmin_tests.erl @@ -3,7 +3,7 @@ %%% Created : 23 Mar 2020 by Pawel Chmielowski %%% %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as diff --git a/tools/xml_compress_gen.erl b/tools/xml_compress_gen.erl index 5b43c5925..157e6cc8a 100644 --- a/tools/xml_compress_gen.erl +++ b/tools/xml_compress_gen.erl @@ -4,7 +4,7 @@ %% Created : 14 Sep 2018 Pawel Chmielowski %% %% -%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%% ejabberd, Copyright (C) 2002-2022 ProcessOne %% %% This program is free software; you can redistribute it and/or %% modify it under the terms of the GNU General Public License as diff --git a/vars.config.in b/vars.config.in index b273cf901..ddfc5ddb5 100644 --- a/vars.config.in +++ b/vars.config.in @@ -1,6 +1,6 @@ %%%---------------------------------------------------------------------- %%% -%%% ejabberd, Copyright (C) 2002-2021 ProcessOne +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as From 0ef2624b577d81ee6f6bc4d6ee6277be9f15d517 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Feb 2022 21:40:38 +0100 Subject: [PATCH 179/440] Provide proper path to the compiled libraries in relive's ejabberdctl --- Makefile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index fa7fcd0a1..982e6df52 100644 --- a/Makefile.in +++ b/Makefile.in @@ -275,6 +275,7 @@ copy-files-sub: copy-files-sub2 relive: $(RELIVECMD) +relivelibdir=$(shell pwd)/$(DEPSDIR) relivedir=$(shell pwd)/_build/relive iexpath=$(shell which iex) @@ -283,7 +284,7 @@ ejabberdctl.relive: -e "s*{{installuser}}*@INSTALLUSER@*g" \ -e "s*{{bindir}}/iex*$(iexpath)*g" \ -e "s*{{bindir}}*@bindir@*g" \ - -e "s*{{libdir}}*@libdir@*g" \ + -e "s*{{libdir}}*${relivelibdir}*g" \ -e "s*{{sysconfdir}}/ejabberd*$(relivedir)/conf*g" \ -e "s*{{localstatedir}}/log/ejabberd*$(relivedir)/logs*g" \ -e "s*{{localstatedir}}/lib/ejabberd*$(relivedir)/database*g" \ From f20e9e9b66aacdd1522b235c1a7a84f80b431c1e Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Feb 2022 16:53:30 +0100 Subject: [PATCH 180/440] Check producing and starting releases --- .github/workflows/ci.yml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2be8e18c..c332d03a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,7 +134,6 @@ jobs: make update make - - run: make rel - run: make install -s - run: make hooks - run: make options @@ -144,6 +143,30 @@ jobs: [ ${{ matrix.rebar }} = 3 ] && true \ || { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; } + - name: Check Production Release + if: matrix.rebar == 3 + run: | + make rel + RE=_build/prod/rel/ejabberd + $RE/bin/ejabberdctl start + $RE/bin/ejabberdctl started + $RE/bin/ejabberdctl stop + $RE/bin/ejabberdctl stopped + cat $RE/var/log/ejabberd/ejabberd.log + grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log + + - name: Check Development Release + if: matrix.rebar == 3 + run: | + make dev + RE=_build/dev/rel/ejabberd + $RE/bin/ejabberdctl start + $RE/bin/ejabberdctl started + $RE/bin/ejabberdctl stop + $RE/bin/ejabberdctl stopped + cat $RE/var/log/ejabberd/ejabberd.log + grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log + - name: Run tests if: matrix.otp != 24 run: make test From f86055378d6337c0e0b1555067f76e62f9265c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 18 Feb 2022 14:01:22 +0100 Subject: [PATCH 181/440] Optimize room_unused_* commands Previously to check if hibernated room was old enough we had to fetch info about all rooms from database. Now we repurpose created_at field in sql to store that info, that allow us to have more efficient query just for it. --- sql/lite.new.sql | 1 + sql/lite.sql | 1 + sql/mssql.sql | 34 ++++++++++++++++++---------------- sql/mysql.new.sql | 1 + sql/mysql.sql | 1 + sql/pg.new.sql | 1 + sql/pg.sql | 1 + src/mod_muc.erl | 32 ++++++++++++++++++++++---------- src/mod_muc_admin.erl | 17 +++++++++++------ src/mod_muc_room.erl | 18 +++++++++--------- src/mod_muc_sql.erl | 34 +++++++++++++++++++++++++++++++++- 11 files changed, 99 insertions(+), 42 deletions(-) diff --git a/sql/lite.new.sql b/sql/lite.new.sql index febef6247..f4b73dcb2 100644 --- a/sql/lite.new.sql +++ b/sql/lite.new.sql @@ -285,6 +285,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); +CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/lite.sql b/sql/lite.sql index 18ee5915a..b62295120 100644 --- a/sql/lite.sql +++ b/sql/lite.sql @@ -260,6 +260,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); +CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/mssql.sql b/sql/mssql.sql index 782e492ce..e05a7b51d 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -32,7 +32,7 @@ CREATE TABLE [dbo].[archive] ( [kind] [varchar] (10) NULL, [nick] [varchar] (250) NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [archive_PK] PRIMARY KEY CLUSTERED + CONSTRAINT [archive_PK] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -56,7 +56,7 @@ CREATE TABLE [dbo].[archive_prefs] ( [always] [text] NOT NULL, [never] [text] NOT NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [archive_prefs_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [archive_prefs_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -76,7 +76,7 @@ CREATE TABLE [dbo].[last] ( [username] [varchar] (250) NOT NULL, [seconds] [text] NOT NULL, [state] [text] NOT NULL, - CONSTRAINT [last_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [last_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -86,7 +86,7 @@ CREATE TABLE [dbo].[motd] ( [username] [varchar] (250) NOT NULL, [xml] [text] NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [motd_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [motd_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -114,6 +114,8 @@ CREATE TABLE [dbo].[muc_room] ( CREATE UNIQUE CLUSTERED INDEX [muc_room_name_host] ON [muc_room] (name, host) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); +CREATE INDEX [muc_room_host_created_at] ON [muc_registered] (host, nick) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); CREATE TABLE [dbo].[muc_online_room] ( [name] [varchar] (250) NOT NULL, @@ -155,7 +157,7 @@ CREATE INDEX [muc_room_subscribers_jid] ON [muc_room_subscribers] (jid); CREATE TABLE [dbo].[privacy_default_list] ( [username] [varchar] (250) NOT NULL, [name] [varchar] (250) NOT NULL, - CONSTRAINT [privacy_default_list_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [privacy_default_list_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -166,7 +168,7 @@ CREATE TABLE [dbo].[privacy_list] ( [name] [varchar] (250) NOT NULL, [id] [bigint] IDENTITY(1,1) NOT NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [privacy_list_PK] PRIMARY KEY CLUSTERED + CONSTRAINT [privacy_list_PK] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -245,7 +247,7 @@ CREATE TABLE [dbo].[pubsub_state] ( [affiliation] [char] (1) NOT NULL, [subscriptions] [text] NOT NULL DEFAULT '', [stateid] [bigint] IDENTITY(1,1) NOT NULL, - CONSTRAINT [pubsub_state_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [pubsub_state_PRIMARY] PRIMARY KEY CLUSTERED ( [stateid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -272,7 +274,7 @@ CREATE TABLE [dbo].[pubsub_node] ( [parent] [varchar] (255) NOT NULL DEFAULT '', [plugin] [text] NOT NULL, [nodeid] [bigint] IDENTITY(1,1) NOT NULL, - CONSTRAINT [pubsub_node_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [pubsub_node_PRIMARY] PRIMARY KEY CLUSTERED ( [nodeid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -287,7 +289,7 @@ WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW CREATE TABLE [dbo].[roster_version] ( [username] [varchar] (250) NOT NULL, [version] [text] NOT NULL, - CONSTRAINT [roster_version_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [roster_version_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -348,7 +350,7 @@ CREATE TABLE [dbo].[spool] ( [xml] [text] NOT NULL, [seq] [bigint] IDENTITY(1,1) NOT NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [spool_PK] PRIMARY KEY CLUSTERED + CONSTRAINT [spool_PK] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -365,7 +367,7 @@ CREATE TABLE [dbo].[sr_group] ( [name] [varchar] (250) NOT NULL, [opts] [text] NOT NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [sr_group_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [sr_group_PRIMARY] PRIMARY KEY CLUSTERED ( [name] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -393,7 +395,7 @@ CREATE TABLE [dbo].[users] ( [salt] [text] NOT NULL DEFAULT '', [iterationcount] [smallint] NOT NULL DEFAULT 0, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -403,7 +405,7 @@ CREATE TABLE [dbo].[vcard] ( [username] [varchar] (250) NOT NULL, [vcard] [text] NOT NULL, [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [vcard_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [vcard_PRIMARY] PRIMARY KEY CLUSTERED ( [username] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -434,7 +436,7 @@ CREATE TABLE [dbo].[vcard_search] ( [lorgname] [varchar] (250) NOT NULL, [orgunit] [text] NOT NULL, [lorgunit] [varchar] (250) NOT NULL, - CONSTRAINT [vcard_search_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [vcard_search_PRIMARY] PRIMARY KEY CLUSTERED ( [lusername] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -502,7 +504,7 @@ CREATE TABLE [dbo].[oauth_token] ( [jid] [text] NOT NULL, [scope] [text] NOT NULL, [expire] [bigint] NOT NULL, - CONSTRAINT [oauth_token_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [oauth_token_PRIMARY] PRIMARY KEY CLUSTERED ( [token] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -526,7 +528,7 @@ CREATE TABLE [dbo].[bosh] ( [sid] [varchar] (255) NOT NULL, [node] [varchar] (255) NOT NULL, [pid] [varchar](100) NOT NULL - CONSTRAINT [bosh_PRIMARY] PRIMARY KEY CLUSTERED + CONSTRAINT [bosh_PRIMARY] PRIMARY KEY CLUSTERED ( [sid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql index a5d03c8c7..dc514becf 100644 --- a/sql/mysql.new.sql +++ b/sql/mysql.new.sql @@ -301,6 +301,7 @@ CREATE TABLE muc_room ( ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(75)); +CREATE INDEX i_muc_room_host_created_at ON muc_room(host(75), created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/mysql.sql b/sql/mysql.sql index c4ae52de7..ae4a73312 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -276,6 +276,7 @@ CREATE TABLE muc_room ( ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(75)); +CREATE INDEX i_muc_room_host_created_at ON muc_room(host(75), created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/pg.new.sql b/sql/pg.new.sql index c7d22c66a..b69e6ddfa 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -450,6 +450,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room USING btree (name, host); +CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/pg.sql b/sql/pg.sql index 44bea2e03..4cf4f0cbd 100644 --- a/sql/pg.sql +++ b/sql/pg.sql @@ -278,6 +278,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room USING btree (name, host); +CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 6e69987dc..ec55e3c14 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -402,10 +402,10 @@ init([Host, Worker]) -> {stop, normal, ok, state()}. handle_call(stop, _From, State) -> {stop, normal, ok, State}; -handle_call({unhibernate, Room, Host}, _From, +handle_call({unhibernate, Room, Host, ResetHibernationTime}, _From, #{server_host := ServerHost} = State) -> RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE), - {reply, load_room(RMod, Host, ServerHost, Room), State}; + {reply, load_room(RMod, Host, ServerHost, Room, ResetHibernationTime), State}; handle_call({create, Room, Host, Opts}, _From, #{server_host := ServerHost} = State) -> ?DEBUG("MUC: create new room '~ts'~n", [Room]), @@ -579,11 +579,15 @@ extract_password(#iq{} = IQ) -> -spec unhibernate_room(binary(), binary(), binary()) -> {ok, pid()} | error. unhibernate_room(ServerHost, Host, Room) -> + unhibernate_room(ServerHost, Host, Room, true). + +-spec unhibernate_room(binary(), binary(), binary(), boolean()) -> {ok, pid()} | error. +unhibernate_room(ServerHost, Host, Room, ResetHibernationTime) -> RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE), case RMod:find_online_room(ServerHost, Room, Host) of error -> Proc = procname(ServerHost, {Room, Host}), - case ?GEN_SERVER:call(Proc, {unhibernate, Room, Host}, 20000) of + case ?GEN_SERVER:call(Proc, {unhibernate, Room, Host, ResetHibernationTime}, 20000) of {ok, _} = R -> R; _ -> error end; @@ -605,7 +609,7 @@ route_to_room(Packet, ServerHost) -> Err = xmpp:err_item_not_found(ErrText, Lang), ejabberd_router:route_error(Packet, Err); StartType -> - case load_room(RMod, Host, ServerHost, Room) of + case load_room(RMod, Host, ServerHost, Room, true) of {error, notfound} when StartType == start -> case check_create_room(ServerHost, Host, Room, From) of true -> @@ -849,28 +853,36 @@ load_permanent_rooms(Hosts, ServerHost, Opts) -> lists:foreach( fun(R) -> {Room, _} = R#muc_room.name_host, - unhibernate_room(ServerHost, Host, Room) + unhibernate_room(ServerHost, Host, Room, false) end, get_rooms(ServerHost, Host)) end, Hosts); false -> ok end. --spec load_room(module(), binary(), binary(), binary()) -> {ok, pid()} | - {error, notfound | term()}. -load_room(RMod, Host, ServerHost, Room) -> +-spec load_room(module(), binary(), binary(), binary(), boolean()) -> + {ok, pid()} | {error, notfound | term()}. +load_room(RMod, Host, ServerHost, Room, ResetHibernationTime) -> case restore_room(ServerHost, Host, Room) of error -> {error, notfound}; Opts0 -> + Mod = gen_mod:db_mod(ServerHost, mod_muc), case proplists:get_bool(persistent, Opts0) of true -> ?DEBUG("Restore room: ~ts", [Room]), - start_room(RMod, Host, ServerHost, Room, Opts0); + Res2 = start_room(RMod, Host, ServerHost, Room, Opts0), + case {Res2, ResetHibernationTime} of + {{ok, _}, true} -> + NewOpts = lists:keyreplace(hibernation_time, 1, Opts0, {hibernation_time, undefined}), + store_room(ServerHost, Host, Room, NewOpts, []); + _ -> + ok + end, + Res2; _ -> ?DEBUG("Restore hibernated non-persistent room: ~ts", [Room]), Res = start_room(RMod, Host, ServerHost, Room, Opts0), - Mod = gen_mod:db_mod(ServerHost, mod_muc), case erlang:function_exported(Mod, get_subscribed_rooms, 3) of true -> ok; diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 2db1d95f1..434559001 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -858,7 +858,7 @@ rooms_report(Method, Action, Service, Days) -> muc_unused(Method, Action, Service, Last_allowed) -> %% Get all required info about all existing rooms - Rooms_all = get_all_rooms(Service), + Rooms_all = get_all_rooms(Service, erlang:system_time(microsecond) - Last_allowed*24*60*60*1000), %% Decide which ones pass the requirements Rooms_pass = decide_rooms(Method, Rooms_all, Last_allowed), @@ -883,14 +883,14 @@ get_online_rooms(ServiceArg) -> || {RoomName, RoomHost, Pid} <- mod_muc:get_online_rooms(Host)] end, Hosts). -get_all_rooms(ServiceArg) -> +get_all_rooms(ServiceArg, Timestamp) -> Hosts = find_services(ServiceArg), lists:flatmap( fun(Host) -> - get_all_rooms2(Host) + get_all_rooms2(Host, Timestamp) end, Hosts). -get_all_rooms2(Host) -> +get_all_rooms2(Host, Timestamp) -> ServerHost = ejabberd_router:host_of_route(Host), OnlineRooms = get_online_rooms(Host), OnlineMap = lists:foldl( @@ -900,8 +900,11 @@ get_all_rooms2(Host) -> Mod = gen_mod:db_mod(ServerHost, mod_muc), DbRooms = - case erlang:function_exported(Mod, get_rooms_without_subscribers, 2) of - true -> + case {erlang:function_exported(Mod, get_rooms_without_subscribers, 2), + erlang:function_exported(Mod, get_hibernated_rooms_older_than, 3)} of + {_, true} -> + Mod:get_hibernated_rooms_older_than(ServerHost, Host, Timestamp); + {true, _} -> Mod:get_rooms_without_subscribers(ServerHost, Host); _ -> Mod:get_rooms(ServerHost, Host) @@ -956,6 +959,8 @@ decide_room(unused, {_Room_name, _Host, ServerHost, Room_pid}, Last_allowed) -> case lists:keyfind(hibernation_time, 1, Opts) of false -> {NodeStartTime, 0}; + {_, undefined} -> + {NodeStartTime, 0}; {_, T} -> {T, 0} end diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 6e65574ce..3e3c0cfed 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -644,7 +644,7 @@ normal_state({route, ToNick, normal_state(hibernate, StateData) -> case maps:size(StateData#state.users) of 0 -> - store_room_no_checks(StateData, []), + store_room_no_checks(StateData, [], erlang:system_time(microsecond)), ?INFO_MSG("Hibernating room ~ts@~ts", [StateData#state.room, StateData#state.host]), {stop, normal, StateData#state{hibernate_timer = hibernating}}; _ -> @@ -3997,8 +3997,8 @@ set_vcard_xupdate(State) -> -define(MAKE_CONFIG_OPT(Opt), {get_config_opt_name(Opt), element(Opt, Config)}). --spec make_opts(state()) -> [{atom(), any()}]. -make_opts(StateData) -> +-spec make_opts(state(), integer | undefined) -> [{atom(), any()}]. +make_opts(StateData, HibernationTime) -> Config = StateData#state.config, Subscribers = muc_subscribers_fold( fun(_LJID, Sub, Acc) -> @@ -4042,7 +4042,7 @@ make_opts(StateData) -> {hats_users, lists:map(fun({U, H}) -> {U, maps:to_list(H)} end, maps:to_list(StateData#state.hats_users))}, - {hibernation_time, erlang:system_time(microsecond)}, + {hibernation_time, HibernationTime}, {subscribers, Subscribers}]. expand_opts(CompactOpts) -> @@ -5004,13 +5004,13 @@ add_to_log(Type, Data, StateData) when Type == roomconfig_change_disabledlogging -> mod_muc_log:add_to_log(StateData#state.server_host, roomconfig_change, Data, StateData#state.jid, - make_opts(StateData)); + make_opts(StateData, undefined)); add_to_log(Type, Data, StateData) -> case (StateData#state.config)#config.logging of true -> mod_muc_log:add_to_log(StateData#state.server_host, Type, Data, StateData#state.jid, - make_opts(StateData)); + make_opts(StateData, undefined)); false -> ok end. @@ -5075,16 +5075,16 @@ store_room(StateData, ChangesHints) -> StateData#state.host, StateData#state.room, ChangesHints); _ -> - store_room_no_checks(StateData, ChangesHints) + store_room_no_checks(StateData, ChangesHints, undefined) end; true -> ok end. -store_room_no_checks(StateData, ChangesHints) -> +store_room_no_checks(StateData, ChangesHints, HibernationTime) -> mod_muc:store_room(StateData#state.server_host, StateData#state.host, StateData#state.room, - make_opts(StateData), + make_opts(StateData, HibernationTime), ChangesHints). -spec send_subscriptions_change_notifications(jid(), binary(), subscribe|unsubscribe, state()) -> ok. diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index 03022e924..db829f6aa 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -38,6 +38,7 @@ register_online_user/4, unregister_online_user/4, count_online_rooms_by_user/3, get_online_rooms_by_user/3, get_subscribed_rooms/3, get_rooms_without_subscribers/2, + get_hibernated_rooms_older_than/3, find_online_room_by_pid/2, remove_user/2]). -export([set_affiliation/6, set_affiliations/4, get_affiliation/5, get_affiliations/3, search_affiliation/4]). @@ -64,13 +65,19 @@ store_room(LServer, Host, Name, Opts, ChangesHints) -> _ -> {[], Opts} end, SOpts = misc:term_to_expr(Opts2), + Timestamp = case lists:keyfind(hibernation_time, 1, Opts) of + false -> <<"1900-01-01 00:00:00">>; + {_, undefined} -> <<"1900-01-01 00:00:00">>; + {_, Time} -> usec_to_sql_timestamp(Time) + end, F = fun () -> ?SQL_UPSERT_T( "muc_room", ["!name=%(Name)s", "!host=%(Host)s", "server_host=%(LServer)s", - "opts=%(SOpts)s"]), + "opts=%(SOpts)s", + "created_at=%(Timestamp)s"]), case ChangesHints of Changes when is_list(Changes) -> [change_room(Host, Name, Change) || Change <- Changes]; @@ -179,6 +186,23 @@ get_rooms_without_subscribers(LServer, Host) -> [] end. +get_hibernated_rooms_older_than(LServer, Host, Timestamp) -> + TimestampS = usec_to_sql_timestamp(Timestamp), + case catch ejabberd_sql:sql_query( + LServer, + ?SQL("select @(name)s, @(opts)s from muc_room" + " where host=%(Host)s and created_at < %(TimestampS)s and created_at > '1900-01-01 00:00:00'")) of + {selected, RoomOpts} -> + lists:map( + fun({Room, Opts}) -> + OptsD = ejabberd_sql:decode_term(Opts), + #muc_room{name_host = {Room, Host}, + opts = mod_muc:opts_to_binary(OptsD)} + end, RoomOpts); + _Err -> + [] + end. + get_rooms(LServer, Host) -> case catch ejabberd_sql:sql_query( LServer, @@ -497,3 +521,11 @@ clean_tables(ServerHost) -> ?ERROR_MSG("Failed to clean 'muc_online_users' table: ~p", [Err2]), Err2 end. + +usec_to_sql_timestamp(Timestamp) -> + case calendar:system_time_to_universal_time(Timestamp, microsecond) of + {{Year, Month, Day}, {Hour, Minute, Second}} -> + list_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B " + "~2..0B:~2..0B:~2..0B", + [Year, Month, Day, Hour, Minute, Second])) + end. From b88fda9494e89a3d821dfcee09d5918d5a960577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 18 Feb 2022 16:24:34 +0100 Subject: [PATCH 182/440] Fix sqlite schema --- sql/lite.new.sql | 2 +- sql/lite.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/lite.new.sql b/sql/lite.new.sql index f4b73dcb2..9eb34c974 100644 --- a/sql/lite.new.sql +++ b/sql/lite.new.sql @@ -285,7 +285,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); -CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); +CREATE INDEX i_muc_room_host_created_at ON muc_room (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, diff --git a/sql/lite.sql b/sql/lite.sql index b62295120..0580fcbaa 100644 --- a/sql/lite.sql +++ b/sql/lite.sql @@ -260,7 +260,7 @@ CREATE TABLE muc_room ( ); CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); -CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at); +CREATE INDEX i_muc_room_host_created_at ON muc_room (host, created_at); CREATE TABLE muc_registered ( jid text NOT NULL, From 4247501dc64ca0ebf1fa75504958137338bd7706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 18 Feb 2022 17:21:22 +0100 Subject: [PATCH 183/440] Fix compilation on OTP < 21 and remove dialyzer warning --- src/mod_muc_room.erl | 20 +++++++++++--------- src/mod_muc_sql.erl | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 3e3c0cfed..7984c12c5 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -644,7 +644,7 @@ normal_state({route, ToNick, normal_state(hibernate, StateData) -> case maps:size(StateData#state.users) of 0 -> - store_room_no_checks(StateData, [], erlang:system_time(microsecond)), + store_room_no_checks(StateData, [], true), ?INFO_MSG("Hibernating room ~ts@~ts", [StateData#state.room, StateData#state.host]), {stop, normal, StateData#state{hibernate_timer = hibernating}}; _ -> @@ -3997,8 +3997,8 @@ set_vcard_xupdate(State) -> -define(MAKE_CONFIG_OPT(Opt), {get_config_opt_name(Opt), element(Opt, Config)}). --spec make_opts(state(), integer | undefined) -> [{atom(), any()}]. -make_opts(StateData, HibernationTime) -> +-spec make_opts(state(), boolean()) -> [{atom(), any()}]. +make_opts(StateData, Hibernation) -> Config = StateData#state.config, Subscribers = muc_subscribers_fold( fun(_LJID, Sub, Acc) -> @@ -4042,7 +4042,7 @@ make_opts(StateData, HibernationTime) -> {hats_users, lists:map(fun({U, H}) -> {U, maps:to_list(H)} end, maps:to_list(StateData#state.hats_users))}, - {hibernation_time, HibernationTime}, + {hibernation_time, if Hibernation -> erlang:system_time(microsecond); true -> undefined end}, {subscribers, Subscribers}]. expand_opts(CompactOpts) -> @@ -5004,13 +5004,13 @@ add_to_log(Type, Data, StateData) when Type == roomconfig_change_disabledlogging -> mod_muc_log:add_to_log(StateData#state.server_host, roomconfig_change, Data, StateData#state.jid, - make_opts(StateData, undefined)); + make_opts(StateData, false)); add_to_log(Type, Data, StateData) -> case (StateData#state.config)#config.logging of true -> mod_muc_log:add_to_log(StateData#state.server_host, Type, Data, StateData#state.jid, - make_opts(StateData, undefined)); + make_opts(StateData, false)); false -> ok end. @@ -5075,16 +5075,18 @@ store_room(StateData, ChangesHints) -> StateData#state.host, StateData#state.room, ChangesHints); _ -> - store_room_no_checks(StateData, ChangesHints, undefined) + store_room_no_checks(StateData, ChangesHints, false), + ok end; true -> ok end. -store_room_no_checks(StateData, ChangesHints, HibernationTime) -> +-spec store_room_no_checks(state(), list(), boolean()) -> {atomic, any()}. +store_room_no_checks(StateData, ChangesHints, Hibernation) -> mod_muc:store_room(StateData#state.server_host, StateData#state.host, StateData#state.room, - make_opts(StateData, HibernationTime), + make_opts(StateData, Hibernation), ChangesHints). -spec send_subscriptions_change_notifications(jid(), binary(), subscribe|unsubscribe, state()) -> ok. diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index db829f6aa..e76788275 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -523,7 +523,8 @@ clean_tables(ServerHost) -> end. usec_to_sql_timestamp(Timestamp) -> - case calendar:system_time_to_universal_time(Timestamp, microsecond) of + TS = misc:usec_to_now(Timestamp), + case calendar:now_to_universal_time(TS) of {{Year, Month, Day}, {Hour, Minute, Second}} -> list_to_binary(io_lib:format("~4..0B-~2..0B-~2..0B " "~2..0B:~2..0B:~2..0B", From d4bf29e3ff041e4e34abfa5bcafefd8fa1f16d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 18 Feb 2022 20:43:56 +0100 Subject: [PATCH 184/440] Improve compatibility with various db engine versions --- src/ejabberd_sql_pt.erl | 69 ++++++++++++++++++++++++++++------------- src/mod_muc_sql.erl | 6 ++-- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index ad33c1ea3..6c0a2a55f 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -41,6 +41,7 @@ server_host_used = false, used_vars = [], use_new_schema, + need_timestamp_pass = false, need_array_pass = false}). -define(QUERY_RECORD, "sql_query"). @@ -169,17 +170,24 @@ transform_sql(Arg) -> Pos, no_server_host), [] end, - case ParseRes#state.need_array_pass of - true -> + case {ParseRes#state.need_array_pass, ParseRes#state.need_timestamp_pass} of + {true, _} -> {PR1, PR2} = perform_array_pass(ParseRes), {PRO1, PRO2} = perform_array_pass(ParseResOld), set_pos(make_schema_check( - erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(PR2)]), + erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(PR2, pgsql)]), erl_syntax:tuple([erl_syntax:atom(any), make_sql_query(PR1)])]), - erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(PRO2)]), + erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(PRO2, pgsql)]), erl_syntax:tuple([erl_syntax:atom(any), make_sql_query(PRO1)])])), Pos); - false -> + {_, true} -> + set_pos(make_schema_check( + erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(ParseRes, pgsql)]), + erl_syntax:tuple([erl_syntax:atom(any), make_sql_query(ParseRes)])]), + erl_syntax:list([erl_syntax:tuple([erl_syntax:atom(pgsql), make_sql_query(ParseResOld, pgsql)]), + erl_syntax:tuple([erl_syntax:atom(any), make_sql_query(ParseResOld)])])), + Pos); + _ -> set_pos( make_schema_check( make_sql_query(ParseRes), @@ -265,6 +273,8 @@ parse1([$@, $( | S], Acc, State) -> [EVar]); string -> EVar; + timestamp -> + EVar; boolean -> erl_syntax:application( erl_syntax:atom(ejabberd_sql), @@ -295,7 +305,7 @@ parse1([$%, $( | S], Acc, State) -> erl_syntax:atom(?ESCAPE_RECORD), erl_syntax:atom(string)), [erl_syntax:variable(Name)]), - State3#state{'query' = [{var, Var}, + State3#state{'query' = [{var, Var, Type}, {str, "server_host="} | State3#state.'query'], args = [Convert | State3#state.args], @@ -327,21 +337,26 @@ parse1([$%, $( | S], Acc, State) -> erl_syntax:atom(?ESCAPE_RECORD), erl_syntax:atom(IT2)), erl_syntax:variable(Name)]), - State2#state{'query' = [[{var, Var}] | State2#state.'query'], + State2#state{'query' = [[{var, Var, Type}] | State2#state.'query'], need_array_pass = true, args = [[Convert, ConvertArr] | State2#state.args], params = [Var | State2#state.params], param_pos = State2#state.param_pos + 1, used_vars = [Name | State2#state.used_vars]}; _ -> + {TS, Type2} = case Type of + timestamp -> {true, string}; + Other -> {State2#state.need_timestamp_pass, Other} + end, Convert = erl_syntax:application( erl_syntax:record_access( erl_syntax:variable(?ESCAPE_VAR), erl_syntax:atom(?ESCAPE_RECORD), - erl_syntax:atom(Type)), + erl_syntax:atom(Type2)), [erl_syntax:variable(Name)]), - State2#state{'query' = [{var, Var} | State2#state.'query'], + State2#state{'query' = [{var, Var, Type} | State2#state.'query'], + need_timestamp_pass = TS, args = [Convert | State2#state.args], params = [Var | State2#state.params], param_pos = State2#state.param_pos + 1, @@ -359,7 +374,7 @@ parse1("%ESCAPE" ++ S, Acc, State) -> []), Var = State1#state.param_pos, State2 = - State1#state{'query' = [{var, Var} | State1#state.'query'], + State1#state{'query' = [{var, Var, string} | State1#state.'query'], args = [Convert | State1#state.args], params = [Var | State1#state.params], param_pos = State1#state.param_pos + 1}, @@ -397,6 +412,7 @@ parse_name([$), T | S], Acc, 0, IsArg, State) -> $d -> integer; $s -> string; $b -> boolean; + $t -> timestamp; $H when IsArg -> host; _ -> throw({error, State#state.loc, @@ -420,10 +436,10 @@ make_var(V) -> perform_array_pass(State) -> {NQ, PQ, Rest} = lists:foldl( - fun([{var, _} = Var], {N, P, {str, Str} = Prev}) -> + fun([{var, _, _} = Var], {N, P, {str, Str} = Prev}) -> Str2 = re:replace(Str, "(^|\s+)in\s*$", " = any(", [{return, list}]), {[Var, Prev | N], [{str, ")"}, Var, {str, Str2} | P], none}; - ([{var, _}], _) -> + ([{var, _, _}], _) -> throw({error, State#state.loc, ["List variable not following 'in' operator"]}); (Other, {N, P, none}) -> {N, P, Other}; @@ -445,16 +461,27 @@ perform_array_pass(State) -> State#state{query = lists:reverse(PQ2), args = lists:reverse(PA), need_array_pass = false}}. make_sql_query(State) -> + make_sql_query(State, unknown). + +make_sql_query(State, Type) -> Hash = erlang:phash2(State#state{loc = undefined, use_new_schema = true}), SHash = <<"Q", (integer_to_binary(Hash))/binary>>, Query = pack_query(State#state.'query'), EQuery = - lists:map( + lists:flatmap( fun({str, S}) -> - erl_syntax:binary( + [erl_syntax:binary( [erl_syntax:binary_field( - erl_syntax:string(S))]); - ({var, V}) -> make_var(V) + erl_syntax:string(S))])]; + ({var, V, timestamp}) when Type == pgsql -> + [erl_syntax:binary( + [erl_syntax:binary_field( + erl_syntax:string("to_timestamp("))]), + make_var(V), + erl_syntax:binary( + [erl_syntax:binary_field( + erl_syntax:string(", 'YYYY-MM-DD HH24:MI:SS')"))])]; + ({var, V, _}) -> [make_var(V)] end, Query), erl_syntax:record_expr( erl_syntax:atom(?QUERY_RECORD), @@ -709,7 +736,7 @@ make_sql_upsert_pgsql901(Table, ParseRes0) -> #state{'query' = [{str, " RETURNING *) "}]}, Insert ]), - Upsert = make_sql_query(State), + Upsert = make_sql_query(State, pgsql), erl_syntax:application( erl_syntax:atom(ejabberd_sql), erl_syntax:atom(sql_query_t), @@ -760,7 +787,7 @@ make_sql_upsert_pgsql905(Table, ParseRes0) -> #state{'query' = [{str, ") DO UPDATE SET "}]}, Set ]), - Upsert = make_sql_query(State), + Upsert = make_sql_query(State, pgsql), erl_syntax:application( erl_syntax:atom(ejabberd_sql), erl_syntax:atom(sql_query_t), @@ -884,12 +911,12 @@ resolve_vars(ST1, ST2) -> end, ST1#state.params), NewQuery = lists:map( - fun({var, Var}) -> + fun({var, Var, Type}) -> case dict:find(Var, Map) of {ok, New} -> - {var, New}; + {var, New, Type}; error -> - {var, Var} + {var, Var, Type} end; (S) -> S end, ST1#state.'query'), diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index e76788275..a6a5c0908 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -67,7 +67,7 @@ store_room(LServer, Host, Name, Opts, ChangesHints) -> SOpts = misc:term_to_expr(Opts2), Timestamp = case lists:keyfind(hibernation_time, 1, Opts) of false -> <<"1900-01-01 00:00:00">>; - {_, undefined} -> <<"1900-01-01 00:00:00">>; + {_, undefined} -> <<"1970-01-02 00:00:00">>; {_, Time} -> usec_to_sql_timestamp(Time) end, F = fun () -> @@ -77,7 +77,7 @@ store_room(LServer, Host, Name, Opts, ChangesHints) -> "!host=%(Host)s", "server_host=%(LServer)s", "opts=%(SOpts)s", - "created_at=%(Timestamp)s"]), + "created_at=%(Timestamp)t"]), case ChangesHints of Changes when is_list(Changes) -> [change_room(Host, Name, Change) || Change <- Changes]; @@ -191,7 +191,7 @@ get_hibernated_rooms_older_than(LServer, Host, Timestamp) -> case catch ejabberd_sql:sql_query( LServer, ?SQL("select @(name)s, @(opts)s from muc_room" - " where host=%(Host)s and created_at < %(TimestampS)s and created_at > '1900-01-01 00:00:00'")) of + " where host=%(Host)s and created_at < %(TimestampS)t and created_at > '1970-01-02 00:00:00'")) of {selected, RoomOpts} -> lists:map( fun({Room, Opts}) -> From 2dc153751dc2991576cd4f545c1a8d8c1476d42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 18 Feb 2022 21:48:26 +0100 Subject: [PATCH 185/440] Put esip in mix included_applications only when it's enabled --- mix.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index ebf8699ba..fb0c2bcf0 100644 --- a/mix.exs +++ b/mix.exs @@ -45,7 +45,7 @@ defmodule Ejabberd.MixProject do :base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose, :p1_utils, :stringprep, :yconf], included_applications: [:lager, :mnesia, :os_mon, - :cache_tab, :eimp, :esip, :mqtree, :p1_acme, + :cache_tab, :eimp, :mqtree, :p1_acme, :p1_oauth2, :pkix, :xmpp] ++ cond_apps()] end @@ -158,6 +158,7 @@ defmodule Ejabberd.MixProject do defp cond_apps do for {:true, app} <- [{config(:redis), :eredis}, {config(:mysql), :p1_mysql}, + {config(:sip), :esip}, {config(:odbc), :odbc}, {config(:pgsql), :p1_pgsql}, {config(:sqlite), :sqlite3}], do: From 7d7d08f980d8e8c1bbaf2aff471eb00f4e15f69b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 19 Feb 2022 23:53:16 +0100 Subject: [PATCH 186/440] mix.lock: Add missing dependencies --- mix.lock | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mix.lock b/mix.lock index d0edb619d..c6bb9239a 100644 --- a/mix.lock +++ b/mix.lock @@ -6,6 +6,7 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.17", "6f3c7e94170377ba45241d394389e800fb15adc5de51d0a3cd52ae766aafd63f", [:mix], [], "hexpm", "f93ac89c9feca61c165b264b5837bf82344d13bebc634cd575cb711e2e342023"}, "eimp": {:hex, :eimp, "1.0.21", "2e918a5dc9a1959ef8713a2360499e3baeee64cfd7881bd9d1f361ca9ddf07e8", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "998f58538f58aa0cff103414994d7ce56dc253e6576cd6fb40c1ead64aa73a28"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, + "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, "esip": {:hex, :esip, "1.0.45", "2f21fb9750f7a505e6bbd43f6d48b0e879b808aba6c2224686c83f2bcd7a34bf", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.47", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "1f1eae69f2bd8d75f42c048409eabb4e3dc71ab6412fc5d998edbdade6ad5f75"}, "ex_doc": {:hex, :ex_doc, "0.26.0", "1922164bac0b18b02f84d6f69cab1b93bc3e870e2ad18d5dacb50a9e06b542a3", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2775d66e494a9a48355db7867478ffd997864c61c65a47d31c4949459281c78d"}, "ezlib": {:hex, :ezlib, "1.0.10", "c1c24eb18944cfde55f0574e9922d5b0392fa864282f769f82b2ea15e54f6003", [:rebar3], [], "hexpm", "1d317f1d85373686199eb3b4164d3477e95033ac68e45a95ba18e7b7a8c23241"}, @@ -17,6 +18,7 @@ "jiffy": {:hex, :jiffy, "1.0.5", "a69b58faf7123534c20e1b0b7ae97ac52079ca02ed4b6989b4b380179cd63a54", [:rebar3], [], "hexpm", "b617a53f46ae84f20d0c38951367dc947a2cf8cff922aa5c6ac6b64b8b052289"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "lager": {:hex, :lager, "3.9.2", "4cab289120eb24964e3886bd22323cb5fefe4510c076992a23ad18cf85413d8c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "7f904d9e87a8cb7e66156ed31768d1c8e26eba1d54f4bc85b1aa4ac1f6340c28"}, + "luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, @@ -28,6 +30,7 @@ "p1_pgsql": {:hex, :p1_pgsql, "1.1.12", "10ae79eeb35ea98c0424a8b6420542fef9e4469eb12ccf41475d10840c291e68", [:rebar3], [], "hexpm", "32203f779e01cf0353270df24833a1d831ad7cb3e3e8e35a7556dfa1f40948d5"}, "p1_utils": {:hex, :p1_utils, "1.0.23", "7f94466ada69bd982ea7bb80fbca18e7053e7d0b82c9d9e37621fa508587069b", [:rebar3], [], "hexpm", "47f21618694eeee5006af1c88731ad86b757161e7823c29b6f73921b571c8502"}, "pkix": {:hex, :pkix, "1.0.8", "98ea05243847fd4504f7c7a0cd82cecd1010ac327a082e1c674c5384006eae75", [:rebar3], [], "hexpm", "399508819501fab9d2e586dfa601b5ee3ef22b5612d3db58204dd2d089ef45d7"}, + "sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"}, "stringprep": {:hex, :stringprep, "1.0.27", "02808c7024bc6285ca6a8a67e7addfc16f35dda55551a582c5181d8ea960e890", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a5967b1144ca8002a58a03d16dd109fbd0bcdb82616cead2f983944314af6a00"}, "stun": {:hex, :stun, "1.0.47", "fae94c0dc7415263297e8f07f286f3355d327d8bf78b1b0743c9a5a492381f71", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "377d8487f4add85f6bc6ecdebdb4dcbcbe890e9462f27d6d31f3db1cf9b2cc9b"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, From a6f0feb23b9e7d5e9aa502e765282a30ceb6de17 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 19 Feb 2022 23:58:36 +0100 Subject: [PATCH 187/440] ejabberdctl: Remove unused environment variable The EJABBERD_DOC_PATH variable is no longer used (cf. commit 949e71efb644f6b79030e26ed880bb2e74b93da0). --- ejabberdctl.template | 2 -- 1 file changed, 2 deletions(-) diff --git a/ejabberdctl.template b/ejabberdctl.template index 4c660fb40..7f0e0c96d 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -68,7 +68,6 @@ done [ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH" [ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG" [ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s" -: "${EJABBERD_DOC_PATH:="{{docdir}}"}" : "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}" # define erl parameters @@ -98,7 +97,6 @@ EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejab # export global variables export EJABBERD_CONFIG_PATH export EJABBERD_LOG_PATH -export EJABBERD_DOC_PATH export EJABBERD_PID_PATH export ERL_CRASH_DUMP export ERL_EPMD_ADDRESS From da516d64d4df5dee9ed068afd7bf4fa8b6017f7a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 21 Feb 2022 00:02:31 +0100 Subject: [PATCH 188/440] mix.exs: Be more careful while editing the version Make sure only leading zeroes are removed while turning the ejabberd version into SemVer format for Mix. For example, remove the zero in "21.04", but keep the zero in "21.12.102". --- mix.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index fb0c2bcf0..92b0d3a84 100644 --- a/mix.exs +++ b/mix.exs @@ -26,9 +26,9 @@ defmodule Ejabberd.MixProject do '0.0' -> "0.0.0" # the full git repository wasn't downloaded 'latest.0' -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest' [_, _, ?., _, _] = x -> - head = String.replace(:erlang.list_to_binary(x), ~r/0+([0-9])/, "\\1") + head = String.replace(:erlang.list_to_binary(x), ~r/\.0+([0-9])/, ".\\1") <> - vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/0+([0-9])/, "\\1") + vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/\.0+([0-9])/, ".\\1") end end From aad04bba91b8d2fcc3b787c88dd8a8d3c4af7f3e Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 21 Feb 2022 00:34:02 +0100 Subject: [PATCH 189/440] mix.exs: Don't forget to include epam/luerl If --enable-lua and/or --enable-pam was specified, include the corresponding applications with Mix releases. --- mix.exs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 92b0d3a84..ee5aeb50c 100644 --- a/mix.exs +++ b/mix.exs @@ -156,7 +156,9 @@ defmodule Ejabberd.MixProject do end defp cond_apps do - for {:true, app} <- [{config(:redis), :eredis}, + for {:true, app} <- [{config(:pam), :epam}, + {config(:lua), :luerl}, + {config(:redis), :eredis}, {config(:mysql), :p1_mysql}, {config(:sip), :esip}, {config(:odbc), :odbc}, From 22b469f55d3586f2a853463a6374bad342b4ac71 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Feb 2022 12:12:49 +0100 Subject: [PATCH 190/440] The lager dependency is used only with old Erlang versions --- mix.exs | 5 +++-- rebar.config | 4 +++- src/ejabberd.app.src.script | 3 +-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mix.exs b/mix.exs index ee5aeb50c..49fe03f74 100644 --- a/mix.exs +++ b/mix.exs @@ -44,7 +44,7 @@ defmodule Ejabberd.MixProject do applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose, :p1_utils, :stringprep, :yconf], - included_applications: [:lager, :mnesia, :os_mon, + included_applications: [:mnesia, :os_mon, :cache_tab, :eimp, :mqtree, :p1_acme, :p1_oauth2, :pkix, :xmpp] ++ cond_apps()] @@ -118,7 +118,6 @@ defmodule Ejabberd.MixProject do {:idna, "~> 6.0"}, {:jiffy, "~> 1.0.5"}, {:jose, "~> 1.11.1"}, - {:lager, "~> 3.9.1"}, {:mqtree, "~> 1.0"}, {:p1_acme, "~> 1.0"}, {:p1_oauth2, "~> 0.6"}, @@ -147,6 +146,7 @@ defmodule Ejabberd.MixProject do {config(:redis), {:eredis, "~> 1.2.0"}}, {config(:sip), {:esip, "~> 1.0"}}, {config(:zlib), {:ezlib, "~> 1.0"}}, + {if_version_below('22', true), {:lager, "~> 3.9.1"}}, {config(:lua), {:luerl, "~> 1.0"}}, {config(:mysql), {:p1_mysql, "~> 1.0"}}, {config(:pgsql), {:p1_pgsql, "~> 1.1"}}, @@ -159,6 +159,7 @@ defmodule Ejabberd.MixProject do for {:true, app} <- [{config(:pam), :epam}, {config(:lua), :luerl}, {config(:redis), :eredis}, + {if_version_below('22', true), :lager}, {config(:mysql), :p1_mysql}, {config(:sip), :esip}, {config(:odbc), :odbc}, diff --git a/rebar.config b/rebar.config index d3968be57..7520a57c7 100644 --- a/rebar.config +++ b/rebar.config @@ -39,7 +39,9 @@ {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.0.5"}}}, {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, - {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}, + {if_version_below, "22", + {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}} + }, {if_var_true, lua, {if_not_rebar3, {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}} diff --git a/src/ejabberd.app.src.script b/src/ejabberd.app.src.script index 67a7a470d..a657b640b 100644 --- a/src/ejabberd.app.src.script +++ b/src/ejabberd.app.src.script @@ -16,13 +16,12 @@ Vars = case file:consult(filename:join([filename:dirname(SCRIPT), "..", "vars.co {registered, []}, {applications, [kernel, sasl, ssl, stdlib]}, {included_applications, - [inets, mnesia, os_mon, + [compiler, inets, mnesia, os_mon, cache_tab, eimp, fast_tls, fast_xml, fast_yaml, - lager, p1_acme, p1_utils, pkix, From be0175fb70d25626a721f1d9a017b381fe3fc15f Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Feb 2022 23:52:32 +0100 Subject: [PATCH 191/440] Only care about CT results when CT are ran, and check fails --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c332d03a5..facd36764 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -184,7 +184,8 @@ jobs: rebar3 cover - name: Check results - if: always() + if: always() && steps.ct.outcome != 'skipped' + id: ctresults run: | [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true ln `find logs/ -name suite.log` logs/suite.log @@ -193,7 +194,7 @@ jobs: test $(find logs/ -empty -name error.log) - name: View logs failures - if: failure() + if: failure() && steps.ctresults.outcome == 'failure' run: | cat logs/suite.log | awk \ 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' From c407b73803844dfad5287656b55c2a0b2f3b2d1c Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 11 Feb 2022 15:22:14 +0100 Subject: [PATCH 192/440] Fix WebSocket uppercase --- src/ejabberd_options_doc.erl | 4 ++-- src/mod_bosh.erl | 2 +- src/mod_conversejs.erl | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 3bfaa3078..9d4cea829 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -1376,14 +1376,14 @@ doc() -> "protect against connections from other domains than given " "in the configuration file. In this way, the lower layer load " "balancer can be chosen for a specific ejabberd implementation " - "while still providing a secure Websocket connection. " + "while still providing a secure WebSocket connection. " "The default value is 'ignore'. An example value of the 'URL' is " "\"https://test.example.org:8081\".")}}, {websocket_ping_interval, #{value => "timeout()", desc => ?T("Defines time between pings sent by the server to a client " - "(Websocket level protocol pings are used for this) to keep " + "(WebSocket level protocol pings are used for this) to keep " "a connection active. If the client doesn't respond to two " "consecutive pings, the connection will be assumed as closed. " "The value of '0' can be used to disable the feature. This option " diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 7bb331b2e..8f2690d60 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -207,7 +207,7 @@ mod_doc() -> "It makes it possible to simulate long lived connections " "required by XMPP over the HTTP protocol. In practice, " "this module makes it possible to use XMPP in a browser without " - "Websocket support and more generally to have a way to use " + "WebSocket support and more generally to have a way to use " "XMPP while having to get through an HTTP proxy."), opts => [{json, diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index c1e3df9bd..3b9efef67 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -133,9 +133,9 @@ mod_doc() -> " websocket_url: \"ws://example.org:5280/websocket\""], opts => [{websocket_url, - #{value => ?T("WebsocketURL"), + #{value => ?T("WebSocketURL"), desc => - ?T("A websocket URL to which Converse.js can connect to.")}}, + ?T("A WebSocket URL to which Converse.js can connect to.")}}, {bosh_service_url, #{value => ?T("BoshURL"), desc => From d4f288d3c612d44c1ab9e0e2a9a542d46e006395 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 14 Feb 2022 21:38:36 +0100 Subject: [PATCH 193/440] Add link in mod_http_api documentation to the docs API section --- src/mod_http_api.erl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mod_http_api.erl b/src/mod_http_api.erl index 2680ef9a8..8bd9522ce 100644 --- a/src/mod_http_api.erl +++ b/src/mod_http_api.erl @@ -525,8 +525,9 @@ mod_options(_) -> mod_doc() -> #{desc => - [?T("This module provides a ReST API to call ejabberd commands " - "using JSON data."), "", + [?T("This module provides a ReST interface to call " + "https://docs.ejabberd.im/developer/ejabberd-api[ejabberd API] " + "commands using JSON data."), "", ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", From 231dfd776f4ce1777e63aa319d89d573449224b8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 22 Feb 2022 17:00:17 +0100 Subject: [PATCH 194/440] Support Erlang 25 in "make options": returns attribute with simpler syntax This was introduced in Erlang/OTP 25.0-rc1 https://erlang.org/download/otp_src_25.0-rc1.readme https://github.com/erlang/otp/pull/5509 OTP-17894 Application(s): syntax_tools Related Id(s): PR-5509 The erl_syntax_lib:analyze_attribute/1 function would return {Name, {Name, Value}} instead of {Name, Value} (which is the documented return value). --- tools/opt_types.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/opt_types.sh b/tools/opt_types.sh index 8de6d8945..92cd943d8 100755 --- a/tools/opt_types.sh +++ b/tools/opt_types.sh @@ -524,6 +524,8 @@ fold_opt(File, Fun, Acc, AbsCode) -> Fun(File, {#state.defaults, Form}, Acc1); {attribute, {spec, {spec, {{options, 0}, Spec}}}} -> Fun(File, {#state.specs, hd(Spec)}, Acc1); + {attribute, {spec, {{options, 0}, Spec}}} -> + Fun(File, {#state.specs, hd(Spec)}, Acc1); _ -> Acc1 end @@ -539,6 +541,8 @@ fold_mod_opt(File, Fun, Acc, AbsCode) -> Fun(File, {#state.mod_defaults, Form}, Acc1); {attribute, {spec, {spec, {{mod_options, 1}, Spec}}}} -> Fun(File, {#state.mod_specs, hd(Spec)}, Acc1); + {attribute, {spec, {{mod_options, 1}, Spec}}} -> + Fun(File, {#state.mod_specs, hd(Spec)}, Acc1); _ -> Acc1 end @@ -572,6 +576,8 @@ is_behaviour(AbsCode, Mod) -> {attribute, {Attr, {_, Mod}}} when Attr == behaviour orelse Attr == behavior -> true; + {attribute, {behaviour, Mod}} -> + true; _ -> false end From 265e0610a3aafcda9954388282deb227887f1618 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 23 Feb 2022 10:07:03 +0100 Subject: [PATCH 195/440] Update to jiffy 1.1.1 and p1_acme 1.0.18 to support Erlang/OTP 25.0-rc1 --- mix.exs | 2 +- rebar.config | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 49fe03f74..2e7e0c790 100644 --- a/mix.exs +++ b/mix.exs @@ -116,7 +116,7 @@ defmodule Ejabberd.MixProject do {:fast_xml, "~> 1.1"}, {:fast_yaml, "~> 1.0"}, {:idna, "~> 6.0"}, - {:jiffy, "~> 1.0.5"}, + {:jiffy, "~> 1.1.1"}, {:jose, "~> 1.11.1"}, {:mqtree, "~> 1.0"}, {:p1_acme, "~> 1.0"}, diff --git a/rebar.config b/rebar.config index 7520a57c7..b0bc0412c 100644 --- a/rebar.config +++ b/rebar.config @@ -37,7 +37,7 @@ {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.48"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.32"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, - {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.0.5"}}}, + {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}}, {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {if_version_below, "22", {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}} @@ -51,7 +51,7 @@ {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}} }}, {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.14"}}}, - {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.16"}}}, + {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.18"}}}, {if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.10"}}}, From de8abc15a89224bdabeb4b817759d2d6c94de9ea Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 23 Feb 2022 21:52:09 +0100 Subject: [PATCH 196/440] Use jiffy 1.1.0 when erlang < 20 because it doesn't have string:split/2 --- rebar.config | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index b0bc0412c..eb51d1295 100644 --- a/rebar.config +++ b/rebar.config @@ -37,7 +37,12 @@ {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.48"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.32"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, - {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}}, + {if_version_below, "20", + {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} + }, + {if_version_above, "19", + {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}} + }, {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {if_version_below, "22", {lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}} From 35b8a042b863ea5f621f9e2f4abd3db63c105779 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 23 Feb 2022 21:19:57 +0100 Subject: [PATCH 197/440] Update jiffy and p1_acme in mix.lock --- mix.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.lock b/mix.lock index c6bb9239a..e5f39fecd 100644 --- a/mix.lock +++ b/mix.lock @@ -15,7 +15,7 @@ "fast_yaml": {:hex, :fast_yaml, "1.0.32", "43f53a2c8572f2e4d66cd4e787fc6761b1c65b9132e42c511d8b9540b0989d65", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7258e322739ff0824237ebe44cd158e0bf52cd27a15fe731cf92f4b4c70b913e"}, "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, - "jiffy": {:hex, :jiffy, "1.0.5", "a69b58faf7123534c20e1b0b7ae97ac52079ca02ed4b6989b4b380179cd63a54", [:rebar3], [], "hexpm", "b617a53f46ae84f20d0c38951367dc947a2cf8cff922aa5c6ac6b64b8b052289"}, + "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "lager": {:hex, :lager, "3.9.2", "4cab289120eb24964e3886bd22323cb5fefe4510c076992a23ad18cf85413d8c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "7f904d9e87a8cb7e66156ed31768d1c8e26eba1d54f4bc85b1aa4ac1f6340c28"}, "luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"}, @@ -24,7 +24,7 @@ "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "mqtree": {:hex, :mqtree, "1.0.14", "d201a79b51a9232b80e764b4b77a866f7c30a90c7ac6205d71f391eb3ea7eb31", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8626dac5e862b575eaf4836f0fc1be5a7c8435c378c5a309e34ee012d48b6f6e"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.0", "b44d75e2a6542dcb6acf5d71c32c74ca88960421b6874777f79153bbbbd7dccc", [:mix], [], "hexpm", "52b2871a7515a5ac49b00f214e4165a40724cf99798d8e4a65e4fd64ebd002c1"}, - "p1_acme": {:hex, :p1_acme, "1.0.16", "88b84cc24c9b6eb87204ea53969ccd9b524dcd4142de632441fdd2859ccab778", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.0.5", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "ec0ef380a7345c38b57899733f6fece97c337a3d44fd02cc8898f6a2491a38a8"}, + "p1_acme": {:hex, :p1_acme, "1.0.18", "3d987aabe586fd372b93b0a2604ea5b9dcf989bb0b8bf90653fb8e9b4aeea523", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "81d757eaa5d22cdc7ea244e9d17cb8eb95ca388c2f239b8feb8b8bc927740eed"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.10", "09ba1fbd447b1f480b223903e36d0415f21be592a1b00db964eea01285749028", [:rebar3], [], "hexpm", "c79cb61ababee4a8c85409b7f4932035797c093aeef1f9f53985e512b26f2a64"}, "p1_pgsql": {:hex, :p1_pgsql, "1.1.12", "10ae79eeb35ea98c0424a8b6420542fef9e4469eb12ccf41475d10840c291e68", [:rebar3], [], "hexpm", "32203f779e01cf0353270df24833a1d831ad7cb3e3e8e35a7556dfa1f40948d5"}, From 305792f40991041598b8afbc8b656a9ec7e0d1d5 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 22 Feb 2022 12:11:21 +0100 Subject: [PATCH 198/440] Test also with recent Erlang/OTP 25.0-rc1 --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index facd36764..f6b8168e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '24'] + otp: ['19.3', '24', '25.0-rc1'] include: - otp: '19.3' rebar: 2 @@ -33,6 +33,9 @@ jobs: - otp: '24' rebar: 3 os: ubuntu-20.04 + - otp: '25.0-rc1' + rebar: 3 + os: ubuntu-20.04 runs-on: ${{ matrix.os }} services: redis: @@ -52,7 +55,7 @@ jobs: shellcheck ejabberd.init.template shellcheck -x ejabberdctl.template - - name: Get previous Erlang/OTP + - name: Get specific Erlang/OTP uses: ErlGang/setup-erlang@master if: matrix.otp != 24 with: From 7381b9db854e9aab5fa1fe48bcc75933acf5ee17 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 24 Feb 2022 21:33:40 +0100 Subject: [PATCH 199/440] Fix bug introduced in 8d8a3177 (#3782) --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 2e7e0c790..00659b346 100644 --- a/mix.exs +++ b/mix.exs @@ -89,7 +89,7 @@ defmodule Ejabberd.MixProject do if_version_below('23', [{:d, :USE_OLD_PG2}]) ++ if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++ if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++ - if_function_exported(:uri_string, :normalize, 1, [{:d, :HAVE_URI_STRING}]) + if_function_exported(:uri_string, :normalize, 1, [{:d, :HAVE_URI_STRING}]) ++ if_function_exported(:erl_error, :format_exception, 6, [{:d, :HAVE_ERL_ERROR}]) defines = for {:d, value} <- result, do: {:d, value} result ++ [{:d, :ALL_DEFS, defines}] From f721374321e1a6772d10583ea613b20de75edcc6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 24 Feb 2022 21:34:40 +0100 Subject: [PATCH 200/440] Determine compile definitions based on Erlang version This gives a clear definition of what erlang versions require each workaround, instead of depending on the actual workaround details. The lib module was removed in OTP 21.0, and the formatting options were moved to erl_error. The uri_string module was introduced in OTP 21.0. --- mix.exs | 15 +++------------ rebar.config | 4 ++-- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/mix.exs b/mix.exs index 00659b346..4e61b0dcd 100644 --- a/mix.exs +++ b/mix.exs @@ -50,15 +50,6 @@ defmodule Ejabberd.MixProject do ++ cond_apps()] end - defp if_function_exported(mod, fun, arity, okResult) do - :code.ensure_loaded(mod) - if :erlang.function_exported(mod, fun, arity) do - okResult - else - [] - end - end - defp if_version_above(ver, okResult) do if :erlang.system_info(:otp_release) > ver do okResult @@ -82,15 +73,15 @@ defmodule Ejabberd.MixProject do cond_options() ++ Enum.map(includes, fn (path) -> {:i, path} end) ++ if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++ + if_version_above('20', [{:d, :HAVE_URI_STRING}]) ++ + if_version_above('20', [{:d, :HAVE_ERL_ERROR}]) ++ if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++ if_version_below('22', [{:d, :LAGER}]) ++ if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++ if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++ if_version_below('23', [{:d, :USE_OLD_PG2}]) ++ if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++ - if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++ - if_function_exported(:uri_string, :normalize, 1, [{:d, :HAVE_URI_STRING}]) ++ - if_function_exported(:erl_error, :format_exception, 6, [{:d, :HAVE_ERL_ERROR}]) + if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) defines = for {:d, value} <- result, do: {:d, value} result ++ [{:d, :ALL_DEFS, defines}] end diff --git a/rebar.config b/rebar.config index eb51d1295..6343a006c 100644 --- a/rebar.config +++ b/rebar.config @@ -107,6 +107,8 @@ {erl_opts, [nowarn_deprecated_function, {i, "include"}, {if_version_above, "20", {d, 'DEPRECATED_GET_STACKTRACE'}}, + {if_version_above, "20", {d, 'HAVE_ERL_ERROR'}}, + {if_version_above, "20", {d, 'HAVE_URI_STRING'}}, {if_version_below, "21", {d, 'USE_OLD_HTTP_URI'}}, {if_version_below, "22", {d, 'LAGER'}}, {if_version_below, "21", {d, 'NO_CUSTOMIZE_HOSTNAME_CHECK'}}, @@ -121,8 +123,6 @@ {if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATEWAY_WORKAROUND'}}, {if_var_true, sip, {d, 'SIP'}}, {if_var_true, stun, {d, 'STUN'}}, - {if_have_fun, {erl_error, format_exception, 6}, {d, 'HAVE_ERL_ERROR'}}, - {if_have_fun, {uri_string, normalize, 1}, {d, 'HAVE_URI_STRING'}}, {src_dirs, [src, {if_rebar3, sql}, {if_var_true, tools, tools}, From d5841785e1121ccc7cdb6a9e12b9f5f814303000 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 7 Mar 2022 08:42:42 +0300 Subject: [PATCH 201/440] Don't request the whole MUC room state in get_room_occupants_number command (#3684) (#1964) --- src/mod_muc_admin.erl | 4 ++-- src/mod_muc_room.erl | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 434559001..0015eb30a 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -1050,8 +1050,8 @@ get_room_occupants(Pid) -> get_room_occupants_number(Room, Host) -> case get_room_pid(Room, Host) of Pid when is_pid(Pid )-> - S = get_room_state(Pid), - maps:size(S#state.users); + {ok, #{occupants_number := N}} = mod_muc_room:get_info(Pid), + N; _ -> throw({error, room_not_found}) end. diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 7984c12c5..fd2c931a3 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -49,6 +49,7 @@ get_config/1, set_config/2, get_state/1, + get_info/1, change_item/5, change_item_async/5, config_reloaded/1, @@ -217,6 +218,17 @@ get_state(Pid) -> {error, notfound} end. +-spec get_info(pid()) -> {ok, #{occupants_number => integer()}} | + {error, notfound | timeout}. +get_info(Pid) -> + try + {ok, p1_fsm:sync_send_all_state_event(Pid, get_info)} + catch _:{timeout, {p1_fsm, _, _}} -> + {error, timeout}; + _:{_, {p1_fsm, _, _}} -> + {error, notfound} + end. + -spec subscribe(pid(), jid(), binary(), [binary()]) -> {ok, [binary()]} | {error, binary()}. subscribe(Pid, JID, Nick, Nodes) -> try p1_fsm:sync_send_all_state_event(Pid, {muc_subscribe, JID, Nick, Nodes}) @@ -721,6 +733,10 @@ handle_sync_event(get_config, _From, StateName, handle_sync_event(get_state, _From, StateName, StateData) -> {reply, {ok, StateData}, StateName, StateData}; +handle_sync_event(get_info, _From, StateName, + StateData) -> + Result = #{occupants_number => maps:size(StateData#state.users)}, + {reply, Result, StateName, StateData}; handle_sync_event({change_config, Config}, _From, StateName, StateData) -> {result, undefined, NSD} = change_config(Config, StateData), From 3520869e36bb9fd568450a7283155e39c3d54dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 7 Mar 2022 17:38:04 +0100 Subject: [PATCH 202/440] Use correct timestamp when hibernation_time is not set at all --- src/mod_muc_sql.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index a6a5c0908..3fed0bf2b 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -66,7 +66,7 @@ store_room(LServer, Host, Name, Opts, ChangesHints) -> end, SOpts = misc:term_to_expr(Opts2), Timestamp = case lists:keyfind(hibernation_time, 1, Opts) of - false -> <<"1900-01-01 00:00:00">>; + false -> <<"1970-01-02 00:00:00">>; {_, undefined} -> <<"1970-01-02 00:00:00">>; {_, Time} -> usec_to_sql_timestamp(Time) end, From dca49f508f0bb9c8e300993cffc431a998ed5c93 Mon Sep 17 00:00:00 2001 From: Stu Tomlinson Date: Tue, 8 Mar 2022 12:56:27 +0000 Subject: [PATCH 203/440] Sync old-to-new schema script with reality (#3790) Update the update_sql function to match current "new" sql schema --- sql/pg.new.sql | 18 ++++++++++++++++++ src/mod_admin_update_sql.erl | 32 ++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/sql/pg.new.sql b/sql/pg.new.sql index b69e6ddfa..6700a4771 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -161,6 +161,24 @@ -- DROP INDEX i_push_ut; -- ALTER TABLE push_session ADD PRIMARY KEY (server_host, username, timestamp); -- CREATE UNIQUE INDEX i_push_session_susn ON push_session USING btree (server_host, username, service, node); +-- ALTER TABLE push_session ALTER COLUMN server_host DROP DEFAULT; + +-- ALTER TABLE mix_pam ADD COLUMN server_host text NOT NULL DEFAULT ''; +-- DROP INDEX i_mix_pam; +-- DROP INDEX i_mix_pam_us; +-- CREATE UNIQUE INDEX i_mix_pam ON mix_pam (username, server_host, channel, service); +-- CREATE INDEX i_mix_pam_us ON mix_pam (username, server_host); +-- ALTER TABLE mix_pam ALTER COLUMN server_host DROP DEFAULT; + +-- ALTER TABLE route ADD COLUMN server_host text NOT NULL DEFAULT ''; +-- DROP INDEX i_route; +-- CREATE UNIQUE INDEX i_route ON route USING btree (domain, server_host, node, pid); +-- ALTER TABLE i_route ALTER COLUMN server_host DROP DEFAULT; + +-- ALTER TABLE mqtt_pub ADD COLUMN server_host text NOT NULL DEFAULT ''; +-- DROP INDEX i_mqtt_topic; +-- CREATE UNIQUE INDEX i_mqtt_topic_server ON mqtt_pub (topic, server_host); +-- ALTER TABLE mqtt_pub ALTER COLUMN server_host DROP DEFAULT; CREATE TABLE users ( diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl index f12618ede..3f17deefc 100644 --- a/src/mod_admin_update_sql.erl +++ b/src/mod_admin_update_sql.erl @@ -164,10 +164,12 @@ update_tables(State) -> drop_index(State, "i_timestamp"), drop_index(State, "i_peer"), drop_index(State, "i_bare_peer"), + drop_index(State, "i_username_peer"), + drop_index(State, "i_username_bare_peer"), create_index(State, "archive", "i_archive_sh_username_timestamp", ["server_host", "username", "timestamp"]), create_index(State, "archive", "i_archive_sh_timestamp", ["server_host", "timestamp"]), - create_index(State, "archive", "i_archive_sh_peer", ["server_host", "peer"]), - create_index(State, "archive", "i_archive_sh_bare_peer", ["server_host", "bare_peer"]), + create_index(State, "archive", "i_archive_sh_username_peer", ["server_host", "username", "peer"]), + create_index(State, "archive", "i_archive_sh_username_bare_peer", ["server_host", "username", "bare_peer"]), drop_sh_default(State, "archive"), add_sh_column(State, "archive_prefs"), @@ -255,20 +257,30 @@ update_tables(State) -> create_index(State, "sm", "i_sm_sh_username", ["server_host", "username"]), drop_sh_default(State, "sm"), - add_sh_column(State, "carboncopy"), - drop_index(State, "i_carboncopy_ur"), - drop_index(State, "i_carboncopy_user"), - add_pkey(State, "carboncopy", ["server_host", "username", "resource"]), - create_index(State, "carboncopy", "i_carboncopy_sh_user", ["server_host", "username"]), - drop_sh_default(State, "carboncopy"), - add_sh_column(State, "push_session"), drop_index(State, "i_push_usn"), drop_index(State, "i_push_ut"), add_pkey(State, "push_session", ["server_host", "username", "timestamp"]), - create_index(State, "push_session", "i_push_session_susn", ["server_host", "username", "service", "node"]), + create_unique_index(State, "push_session", "i_push_session_susn", ["server_host", "username", "service", "node"]), drop_sh_default(State, "push_session"), + add_sh_column(State, "mix_pam"), + drop_index(State, "i_mix_pam"), + drop_index(State, "i_mix_pam_us"), + create_unique_index(State, "mix_pam", "i_mix_pam", ["username", "server_host", "channel", "service"]), + create_index(State, "mix_pam", "i_mix_pam_us", ["username", "server_host"]), + drop_sh_default(State, "mix_pam"), + + add_sh_column(State, "route"), + drop_index(State, "i_route"), + create_unique_index(State, "route", "i_route", ["domain", "server_host", "node", "pid"]), + drop_sh_default(State, "route"), + + add_sh_column(State, "mqtt_pub"), + drop_index(State, "i_mqtt_topic"), + create_unique_index(State, "mqtt_pub", "i_mqtt_topic_server", ["topic", "server_host"]), + drop_sh_default(State, "mqtt_pub"), + ok. add_sh_column(#state{dbtype = pgsql} = State, Table) -> From a846260d6e15d281a63fff9b0be50a72a9604700 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Mar 2022 11:02:22 +0100 Subject: [PATCH 204/440] Update ejabberd to not use Distillery (#3788) --- mix.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/mix.exs b/mix.exs index 4e61b0dcd..d7e031040 100644 --- a/mix.exs +++ b/mix.exs @@ -100,7 +100,6 @@ defmodule Ejabberd.MixProject do defp deps do [{:base64url, "~> 1.0"}, {:cache_tab, "~> 1.0"}, - {:distillery, "~> 2.0"}, {:eimp, "~> 1.0"}, {:ex_doc, ">= 0.0.0", only: :dev}, {:fast_tls, "~> 1.1"}, From 2f92dc40dfe4a637cc51663a3b441ea62bf335f7 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Mar 2022 12:05:21 +0100 Subject: [PATCH 205/440] Let's assume ex_doc is no longer needed It was added in e6f72333 --- mix.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/mix.exs b/mix.exs index d7e031040..79bfb7a39 100644 --- a/mix.exs +++ b/mix.exs @@ -101,7 +101,6 @@ defmodule Ejabberd.MixProject do [{:base64url, "~> 1.0"}, {:cache_tab, "~> 1.0"}, {:eimp, "~> 1.0"}, - {:ex_doc, ">= 0.0.0", only: :dev}, {:fast_tls, "~> 1.1"}, {:fast_xml, "~> 1.1"}, {:fast_yaml, "~> 1.0"}, From 6afdf88e09d9f2dd30467cb203e991862e5895a5 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 8 Mar 2022 12:07:04 +0100 Subject: [PATCH 206/440] Update mix.lock, there are many unnecesary dependencies there --- mix.lock | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/mix.lock b/mix.lock index e5f39fecd..61743297b 100644 --- a/mix.lock +++ b/mix.lock @@ -1,33 +1,23 @@ %{ - "artificery": {:hex, :artificery, "0.4.3", "0bc4260f988dcb9dda4b23f9fc3c6c8b99a6220a331534fdf5bf2fd0d4333b02", [:mix], [], "hexpm", "12e95333a30e20884e937abdbefa3e7f5e05609c2ba8cf37b33f000b9ffc0504"}, "base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"}, "cache_tab": {:hex, :cache_tab, "1.0.29", "6c161988620b788d8df28c8f6af557571609c8e4b671dbadab295a4722cd501b", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a02a638021cce91ed1a8628dcbb4795bf5c01c9d11db8c613065923142824ce9"}, - "distillery": {:hex, :distillery, "2.1.1", "f9332afc2eec8a1a2b86f22429e068ef35f84a93ea1718265e740d90dd367814", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm", "bbc7008b0161a6f130d8d903b5b3232351fccc9c31a991f8fcbf2a12ace22995"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.17", "6f3c7e94170377ba45241d394389e800fb15adc5de51d0a3cd52ae766aafd63f", [:mix], [], "hexpm", "f93ac89c9feca61c165b264b5837bf82344d13bebc634cd575cb711e2e342023"}, "eimp": {:hex, :eimp, "1.0.21", "2e918a5dc9a1959ef8713a2360499e3baeee64cfd7881bd9d1f361ca9ddf07e8", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "998f58538f58aa0cff103414994d7ce56dc253e6576cd6fb40c1ead64aa73a28"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, "esip": {:hex, :esip, "1.0.45", "2f21fb9750f7a505e6bbd43f6d48b0e879b808aba6c2224686c83f2bcd7a34bf", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.47", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "1f1eae69f2bd8d75f42c048409eabb4e3dc71ab6412fc5d998edbdade6ad5f75"}, - "ex_doc": {:hex, :ex_doc, "0.26.0", "1922164bac0b18b02f84d6f69cab1b93bc3e870e2ad18d5dacb50a9e06b542a3", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2775d66e494a9a48355db7867478ffd997864c61c65a47d31c4949459281c78d"}, "ezlib": {:hex, :ezlib, "1.0.10", "c1c24eb18944cfde55f0574e9922d5b0392fa864282f769f82b2ea15e54f6003", [:rebar3], [], "hexpm", "1d317f1d85373686199eb3b4164d3477e95033ac68e45a95ba18e7b7a8c23241"}, "fast_tls": {:hex, :fast_tls, "1.1.13", "828cdc75e1e8fce8158846d2b971d8b4fe2b2ddcc75b759e88d751079bf78afd", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d1f422af40c7777fe534496f508ee86515cb929ad10f7d1d56aa94ce899b44a0"}, "fast_xml": {:hex, :fast_xml, "1.1.48", "d41d14015227999a2367264cc97ac1e6770285aab1dc69545ac4f822be01a2d2", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "afcf9b808c77599395d4bd22ed4560b3d82aa1a24ff5b65f3930fe72a423b3cf"}, "fast_yaml": {:hex, :fast_yaml, "1.0.32", "43f53a2c8572f2e4d66cd4e787fc6761b1c65b9132e42c511d8b9540b0989d65", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7258e322739ff0824237ebe44cd158e0bf52cd27a15fe731cf92f4b4c70b913e"}, - "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, - "lager": {:hex, :lager, "3.9.2", "4cab289120eb24964e3886bd22323cb5fefe4510c076992a23ad18cf85413d8c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "7f904d9e87a8cb7e66156ed31768d1c8e26eba1d54f4bc85b1aa4ac1f6340c28"}, "luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "mqtree": {:hex, :mqtree, "1.0.14", "d201a79b51a9232b80e764b4b77a866f7c30a90c7ac6205d71f391eb3ea7eb31", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8626dac5e862b575eaf4836f0fc1be5a7c8435c378c5a309e34ee012d48b6f6e"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.2.0", "b44d75e2a6542dcb6acf5d71c32c74ca88960421b6874777f79153bbbbd7dccc", [:mix], [], "hexpm", "52b2871a7515a5ac49b00f214e4165a40724cf99798d8e4a65e4fd64ebd002c1"}, "p1_acme": {:hex, :p1_acme, "1.0.18", "3d987aabe586fd372b93b0a2604ea5b9dcf989bb0b8bf90653fb8e9b4aeea523", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "81d757eaa5d22cdc7ea244e9d17cb8eb95ca388c2f239b8feb8b8bc927740eed"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.10", "09ba1fbd447b1f480b223903e36d0415f21be592a1b00db964eea01285749028", [:rebar3], [], "hexpm", "c79cb61ababee4a8c85409b7f4932035797c093aeef1f9f53985e512b26f2a64"}, - "p1_pgsql": {:hex, :p1_pgsql, "1.1.12", "10ae79eeb35ea98c0424a8b6420542fef9e4469eb12ccf41475d10840c291e68", [:rebar3], [], "hexpm", "32203f779e01cf0353270df24833a1d831ad7cb3e3e8e35a7556dfa1f40948d5"}, + "p1_pgsql": {:hex, :p1_pgsql, "1.1.16", "0338d4c3ab42aa1d3ae312aef38f85279678d90092cfc88da899a130a9c0bf03", [:rebar3], [{:xmpp, "1.5.6", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "3294d8f01115e6d0139c0959b22290d33ac21a596605b203f53a22cb7617b4b3"}, "p1_utils": {:hex, :p1_utils, "1.0.23", "7f94466ada69bd982ea7bb80fbca18e7053e7d0b82c9d9e37621fa508587069b", [:rebar3], [], "hexpm", "47f21618694eeee5006af1c88731ad86b757161e7823c29b6f73921b571c8502"}, "pkix": {:hex, :pkix, "1.0.8", "98ea05243847fd4504f7c7a0cd82cecd1010ac327a082e1c674c5384006eae75", [:rebar3], [], "hexpm", "399508819501fab9d2e586dfa601b5ee3ef22b5612d3db58204dd2d089ef45d7"}, "sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"}, From 1e1b72572fc16c174a8727207a06b9d06eba2648 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 9 Mar 2022 15:21:46 +0100 Subject: [PATCH 207/440] Add -boot and -boot_var in ejabberdctl instead of adding vm.args --- mix.exs | 3 +-- rel/vm.args.mix | 14 -------------- 2 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 rel/vm.args.mix diff --git a/mix.exs b/mix.exs index 79bfb7a39..22364b751 100644 --- a/mix.exs +++ b/mix.exs @@ -241,7 +241,7 @@ defmodule Ejabberd.MixProject do Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns) execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3") execute.("sed -e 's|ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4") - execute.("sed -e 's|INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example4 > ejabberdctl.example5") + execute.("sed -e 's|INSTALLUSER=|ERL_OPTIONS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib -setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example4 > ejabberdctl.example5") Mix.Generator.copy_template("ejabberdctl.example5", "#{ro}/bin/ejabberdctl", assigns) File.chmod("#{ro}/bin/ejabberdctl", 0o755) @@ -264,7 +264,6 @@ defmodule Ejabberd.MixProject do Mix.Generator.copy_file("ejabberd.yml.example", "#{ro}/etc/ejabberd/ejabberd.yml#{suffix}") Mix.Generator.copy_file("ejabberdctl.cfg.example", "#{ro}/etc/ejabberd/ejabberdctl.cfg#{suffix}") Mix.Generator.copy_file("inetrc", "#{ro}/etc/ejabberd/inetrc") - Mix.Generator.copy_template("rel/vm.args.mix", "#{ro}/etc/ejabberd/vm.args", assigns) Enum.each(File.ls!("sql"), fn x -> diff --git a/rel/vm.args.mix b/rel/vm.args.mix deleted file mode 100644 index 711bd3189..000000000 --- a/rel/vm.args.mix +++ /dev/null @@ -1,14 +0,0 @@ -## Customize flags given to the VM: https://erlang.org/doc/man/erl.html -## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here - --boot ../releases/<%= @version %>/start_clean --boot_var RELEASE_LIB ../lib - -## Number of dirty schedulers doing IO work (file, sockets, and others) -##+SDio 5 - -## Increase number of concurrent ports/sockets -##+Q 65536 - -## Tweak GC to run more often -##-env ERL_FULLSWEEP_AFTER 10 From ce8c2ca0fd390dd6f8370e90ff12f3a5a8787640 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Mar 2022 10:57:10 +0100 Subject: [PATCH 208/440] Add fine-grained Elixir version requirement 1.4 is accepted in general 1.10 is required to build OTP releases 1.11 is required to run 'make relive' lower than 1.11.4 requires Erlang lower than 24 to build releases --- mix.exs | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 22364b751..c18ad15c6 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule Ejabberd.MixProject do [app: :ejabberd, version: version(), description: description(), - elixir: "~> 1.4", + elixir: elixir_required_version(), elixirc_paths: ["lib"], compile_path: ".", compilers: [:asn1] ++ Mix.compilers, @@ -184,6 +184,35 @@ defmodule Ejabberd.MixProject do end end + defp elixir_required_version do + case {System.get_env("RELIVE", "false"), + MapSet.member?(MapSet.new(System.argv()), "release")} + do + {"true", _} -> + case Version.match?(System.version(), "~> 1.11") do + false -> + IO.puts("ERROR: To use 'make relive', Elixir 1.11.0 or higher is required.") + _ -> :ok + end + "~> 1.11" + {_, true} -> + case Version.match?(System.version(), "~> 1.10") do + false -> + IO.puts("ERROR: To build releases, Elixir 1.10.0 or higher is required.") + _ -> :ok + end + case Version.match?(System.version(), "< 1.11.4") + and :erlang.system_info(:otp_release) > '23' do + true -> + IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.") + _ -> :ok + end + "~> 1.10" + _ -> + "~> 1.4" + end + end + defp releases do maybe_tar = case Mix.env() do :prod -> [:tar] @@ -228,7 +257,7 @@ defmodule Ejabberd.MixProject do end # Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs - case Version.match?(System.version, ">= 1.11.0") do + case Version.match?(System.version, "~> 1.11") do true -> :ok false -> From 871e26a01ed410601c861ef046c98f9ae9936bf3 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 10 Mar 2022 16:29:32 +0100 Subject: [PATCH 209/440] mix.exs: Don't allow admins to override boot flags Add the -boot and -boot_var options via ERLANG_OPTS rather than ERL_OPTIONS. The difference is that administrators might override the latter in the ejabberdctl.cfg file, which isn't desired as the boot flags must be specified exactly that way in a Mix-generated release (otherwise, ejabberd would fail to start up). --- mix.exs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index c18ad15c6..4d1c451dc 100644 --- a/mix.exs +++ b/mix.exs @@ -269,9 +269,10 @@ defmodule Ejabberd.MixProject do execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a") Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns) execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3") - execute.("sed -e 's|ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4") - execute.("sed -e 's|INSTALLUSER=|ERL_OPTIONS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib -setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example4 > ejabberdctl.example5") - Mix.Generator.copy_template("ejabberdctl.example5", "#{ro}/bin/ejabberdctl", assigns) + execute.("sed -e 's|^ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4") + execute.("sed -e 's|^ERLANG_OPTS=\"|ERLANG_OPTS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib |' ejabberdctl.example4 > ejabberdctl.example5") + execute.("sed -e 's|^INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example5 > ejabberdctl.example6") + Mix.Generator.copy_template("ejabberdctl.example6", "#{ro}/bin/ejabberdctl", assigns) File.chmod("#{ro}/bin/ejabberdctl", 0o755) File.rm("ejabberdctl.example1") @@ -281,6 +282,7 @@ defmodule Ejabberd.MixProject do File.rm("ejabberdctl.example3") File.rm("ejabberdctl.example4") File.rm("ejabberdctl.example5") + File.rm("ejabberdctl.example6") suffix = case Mix.env() do :dev -> From 5506b838c803c33c6fd5b1af00d62482c4a75c60 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 14 Mar 2022 15:37:21 +0300 Subject: [PATCH 210/440] Add TLS certificate authentication for MQTT connections --- src/mod_mqtt_session.erl | 100 ++++++++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 13 deletions(-) diff --git a/src/mod_mqtt_session.erl b/src/mod_mqtt_session.erl index 8ce040669..6a551f00f 100644 --- a/src/mod_mqtt_session.erl +++ b/src/mod_mqtt_session.erl @@ -29,6 +29,7 @@ -include("logger.hrl"). -include("mqtt.hrl"). -include_lib("xmpp/include/xmpp.hrl"). +-include_lib("public_key/include/public_key.hrl"). -record(state, {vsn = ?VSN :: integer(), version :: undefined | mqtt_version(), @@ -47,7 +48,8 @@ in_flight :: undefined | publish() | pubrel(), codec :: mqtt_codec:state(), queue :: undefined | p1_queue:queue(publish()), - tls :: boolean()}). + tls :: boolean(), + tls_verify :: boolean()}). -type acks() :: #{non_neg_integer() => pubrec()}. -type subscriptions() :: #{binary() => {sub_opts(), non_neg_integer()}}. @@ -162,6 +164,7 @@ init([SockMod, Socket, ListenOpts]) -> State1 = #state{socket = {SockMod, Socket}, id = p1_rand:uniform(65535), tls = proplists:get_bool(tls, ListenOpts), + tls_verify = proplists:get_bool(tls_verify, ListenOpts), codec = mqtt_codec:new(MaxSize)}, Timeout = timer:seconds(30), State2 = set_timeout(State1, Timeout), @@ -553,7 +556,7 @@ unregister_session(_, _) -> {error, state(), error_reason()}. handle_connect(#connect{clean_start = CleanStart} = Pkt, #state{jid = undefined, peername = IP} = State) -> - case authenticate(Pkt, IP) of + case authenticate(Pkt, IP, State) of {ok, JID} -> case validate_will(Pkt, JID) of ok -> @@ -939,7 +942,12 @@ check_sock_result({_, Sock}, {error, Why}) -> starttls(#state{socket = {gen_tcp, Socket}, tls = true}) -> case ejabberd_pkix:get_certfile() of {ok, Cert} -> - case fast_tls:tcp_to_tls(Socket, [{certfile, Cert}]) of + CAFileOpt = + case ejabberd_option:c2s_cafile(ejabberd_config:get_myname()) of + undefined -> []; + CAFile -> [{cafile, CAFile}] + end, + case fast_tls:tcp_to_tls(Socket, [{certfile, Cert}] ++ CAFileOpt) of {ok, TLSSock} -> {ok, {fast_tls, TLSSock}}; {error, Why} -> @@ -1172,9 +1180,9 @@ parse_credentials(JID, ClientID) -> end end. --spec authenticate(connect(), peername()) -> {ok, jid:jid()} | {error, reason_code()}. -authenticate(Pkt, IP) -> - case authenticate(Pkt) of +-spec authenticate(connect(), peername(), state()) -> {ok, jid:jid()} | {error, reason_code()}. +authenticate(Pkt, IP, State) -> + case authenticate(Pkt, State) of {ok, JID, AuthModule} -> ?INFO_MSG("Accepted MQTT authentication for ~ts by ~s backend from ~s", [jid:encode(JID), @@ -1185,8 +1193,8 @@ authenticate(Pkt, IP) -> Err end. --spec authenticate(connect()) -> {ok, jid:jid(), module()} | {error, reason_code()}. -authenticate(#connect{password = Pass, properties = Props} = Pkt) -> +-spec authenticate(connect(), state()) -> {ok, jid:jid(), module()} | {error, reason_code()}. +authenticate(#connect{password = Pass, properties = Props} = Pkt, State) -> case parse_credentials(Pkt) of {ok, #jid{luser = LUser, lserver = LServer} = JID} -> case maps:find(authentication_method, Props) of @@ -1200,16 +1208,82 @@ authenticate(#connect{password = Pass, properties = Props} = Pkt) -> {ok, _} -> {error, 'bad-authentication-method'}; error -> - case ejabberd_auth:check_password_with_authmodule( - LUser, <<>>, LServer, Pass) of - {true, AuthModule} -> {ok, JID, AuthModule}; - false -> {error, 'not-authorized'} - end + case Pass of + <<>> -> + case tls_auth(JID, State) of + true -> + {ok, JID, pkix}; + false -> + {error, 'not-authorized'} + end; + _ -> + case ejabberd_auth:check_password_with_authmodule( + LUser, <<>>, LServer, Pass) of + {true, AuthModule} -> {ok, JID, AuthModule}; + false -> {error, 'not-authorized'} + end + end end; {error, _} = Err -> Err end. +-spec tls_auth(jid:jid(), state()) -> boolean(). +tls_auth(_JID, #state{tls_verify = false}) -> + false; +tls_auth(JID, State) -> + case State#state.socket of + {fast_tls, Sock} -> + case fast_tls:get_peer_certificate(Sock, otp) of + {ok, Cert} -> + case fast_tls:get_verify_result(Sock) of + 0 -> + case get_cert_jid(Cert) of + {ok, JID2} -> + jid:remove_resource(jid:tolower(JID)) == + jid:remove_resource(jid:tolower(JID2)); + error -> + false + end; + VerifyRes -> + Reason = fast_tls:get_cert_verify_string(VerifyRes, Cert), + ?WARNING_MSG("TLS verify failed: ~s", [Reason]), + false + end; + error -> + false + end; + _ -> + false + end. + +get_cert_jid(Cert) -> + case Cert#'OTPCertificate'.tbsCertificate#'OTPTBSCertificate'.subject of + {rdnSequence, Attrs1} -> + Attrs = lists:flatten(Attrs1), + case lists:keyfind(?'id-at-commonName', + #'AttributeTypeAndValue'.type, Attrs) of + #'AttributeTypeAndValue'{value = {utf8String, Val}} -> + try jid:decode(Val) of + #jid{luser = <<>>} -> + case jid:make(Val, ejabberd_config:get_myname()) of + error -> + error; + JID -> + {ok, JID} + end; + JID -> + {ok, JID} + catch _:{bad_jid, _} -> + error + end; + _ -> + error + end; + _ -> + error + end. + %%%=================================================================== %%% Validators %%%=================================================================== From 68762146d72636acd5037cfa24babd979c6beba5 Mon Sep 17 00:00:00 2001 From: Simon Paitrault Date: Thu, 24 Mar 2022 17:03:50 +0100 Subject: [PATCH 211/440] Checking users is active in SM for JWT authenticated user (#3795) Signed-off-by: Freyskeyd --- src/ejabberd_auth_jwt.erl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_auth_jwt.erl b/src/ejabberd_auth_jwt.erl index caa2ddbf2..f38600bc7 100644 --- a/src/ejabberd_auth_jwt.erl +++ b/src/ejabberd_auth_jwt.erl @@ -85,7 +85,14 @@ check_password(User, AuthzId, Server, Token) -> end end. -user_exists(_User, _Host) -> {nocache, false}. +user_exists(User, Host) -> + %% Checking that the user has an active session + %% If the session was negociated by the JWT auth method then we define that the user exists + %% Any other cases will return that the user doesn't exist + {nocache, case ejabberd_sm:get_user_info(User, Host) of + [{_, Info}] -> proplists:get_value(auth_module, Info) == ejabberd_auth_jwt; + _ -> false + end}. use_cache(_) -> false. From 91c9b0446cdc78ae00be3977ee358e790e5fa0d6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 8 Nov 2021 13:43:18 +0100 Subject: [PATCH 212/440] Don't export password attribute when it's empty (it's invalid)(#3705) --- src/ejabberd_piefxis.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index c748e9b2f..add52770d 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -166,6 +166,7 @@ export_user(User, Server, Fd) -> LServer = jid:nameprep(Server), {PassPlain, PassScram} = case ejabberd_auth:password_format(LServer) of scram -> {[], [format_scram_password(Password)]}; + _ when Password == <<"">> -> {[], []}; _ -> {[{<<"password">>, Password}], []} end, Els = From 0f73d3f4d1554ed4acd6948526ad187534b7498e Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 25 Mar 2022 12:15:54 +0100 Subject: [PATCH 213/440] Don't define restart and stop in ejabberd_ctl, use the corresponding commands --- src/ejabberd_ctl.erl | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 047c1697e..057cff66c 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -141,15 +141,6 @@ process(["status"], _Version) -> ?STATUS_SUCCESS end; -process(["stop"], _Version) -> - %%ejabberd_cover:stop(), - init:stop(), - ?STATUS_SUCCESS; - -process(["restart"], _Version) -> - init:restart(), - ?STATUS_SUCCESS; - %% TODO: Mnesia operations should not be hardcoded in ejabberd_ctl module. %% For now, I leave them there to avoid breaking those commands for people that %% may be using it (as format of response is going to change). From f19219f5a04b9c9478d9e887f853f9e15f7b18e0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 25 Mar 2022 11:50:05 +0100 Subject: [PATCH 214/440] Terminate ejabberd_sm before everything else to ensure sessions closing (#3641) --- src/ejabberd_admin.erl | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index 63fac8221..c79572f16 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -30,7 +30,8 @@ -export([start_link/0, %% Server - status/0, reopen_log/0, rotate_log/0, + status/0, stop/0, restart/0, + reopen_log/0, rotate_log/0, set_loglevel/1, stop_kindly/2, send_service_message_all_mucs/2, registered_vhosts/0, @@ -113,11 +114,11 @@ get_commands_spec() -> args = [], result = {res, restuple}}, #ejabberd_commands{name = stop, tags = [server], desc = "Stop ejabberd gracefully", - module = init, function = stop, + module = ?MODULE, function = stop, args = [], result = {res, rescode}}, #ejabberd_commands{name = restart, tags = [server], desc = "Restart ejabberd gracefully", - module = init, function = restart, + module = ?MODULE, function = restart, args = [], result = {res, rescode}}, #ejabberd_commands{name = reopen_log, tags = [logs], desc = "Reopen the log files after being renamed", @@ -446,6 +447,16 @@ status() -> end, {Is_running, String1 ++ String2}. +stop() -> + _ = supervisor:terminate_child(ejabberd_sup, ejabberd_sm), + timer:sleep(1000), + init:stop(). + +restart() -> + _ = supervisor:terminate_child(ejabberd_sup, ejabberd_sm), + timer:sleep(1000), + init:restart(). + reopen_log() -> ejabberd_hooks:run(reopen_log_hook, []). From 4c51f6e1fedc9f78707b5e8b56204198349d1b7f Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 25 Mar 2022 16:21:40 +0100 Subject: [PATCH 215/440] Check results when test with any OTP is not skipped --- .github/workflows/ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6b8168e8..abe20503f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -170,11 +170,12 @@ jobs: cat $RE/var/log/ejabberd/ejabberd.log grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log - - name: Run tests - if: matrix.otp != 24 + - name: Run tests (OTP 19.3) + if: matrix.otp == '19.3' + id: ct2 run: make test - - name: Run tests (OTP 24) - if: matrix.otp == 24 + - name: Run tests + if: matrix.otp != '19.3' id: ct run: | (cd priv && ln -sf ../sql) @@ -187,7 +188,7 @@ jobs: rebar3 cover - name: Check results - if: always() && steps.ct.outcome != 'skipped' + if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped') id: ctresults run: | [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true From 8065ec831eb5e7681d749c2e3265da68e10b4d55 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 28 Mar 2022 15:44:50 +0200 Subject: [PATCH 216/440] New mod_host_meta to serve host-meta files, see XEP-0156 --- src/mod_host_meta.erl | 237 ++++++++++++++++++++++++++++++++++++++ src/mod_host_meta_opt.erl | 20 ++++ 2 files changed, 257 insertions(+) create mode 100644 src/mod_host_meta.erl create mode 100644 src/mod_host_meta_opt.erl diff --git a/src/mod_host_meta.erl b/src/mod_host_meta.erl new file mode 100644 index 000000000..f2d8b92ad --- /dev/null +++ b/src/mod_host_meta.erl @@ -0,0 +1,237 @@ +%%%------------------------------------------------------------------- +%%% File : mod_host_meta.erl +%%% Author : Badlop +%%% Purpose : Serve host-meta files as described in XEP-0156 +%%% Created : 25 March 2022 by Badlop +%%% +%%% +%%% ejabberd, Copyright (C) 2022 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%---------------------------------------------------------------------- + +-module(mod_host_meta). + +-author('badlop@process-one.net'). + +-protocol({xep, 156, '1.4.0'}). + +-behaviour(gen_mod). + +-export([start/2, stop/1, reload/3, process/2, + mod_opt_type/1, mod_options/1, depends/2]). +-export([mod_doc/0]). +-export([get_url/4]). + +-include("logger.hrl"). + +-include_lib("xmpp/include/xmpp.hrl"). + +-include("ejabberd_http.hrl"). + +-include("ejabberd_web_admin.hrl"). + +-include("translate.hrl"). + +%%%---------------------------------------------------------------------- +%%% gen_mod callbacks +%%%---------------------------------------------------------------------- + +start(_Host, _Opts) -> + ok. + +stop(_Host) -> + ok. + +reload(_Host, _NewOpts, _OldOpts) -> + ok. + +depends(_Host, _Opts) -> + [{mod_bosh, soft}]. + +%%%---------------------------------------------------------------------- +%%% HTTP handlers +%%%---------------------------------------------------------------------- + +process([], #request{method = 'GET', tp = https, host = Host, path = Path}) -> + case lists:last(Path) of + <<"host-meta">> -> + file_xml(Host); + <<"host-meta.json">> -> + file_json(Host) + end; +process(_Path, _Request) -> + {404, [], "Not Found"}. + +%%%---------------------------------------------------------------------- +%%% Internal +%%%---------------------------------------------------------------------- + +%% When set to 'auto', it only takes the first valid listener options it finds + +file_xml(Host) -> + BoshList = case get_url(?MODULE, bosh, true, Host) of + undefined -> []; + BoshUrl -> + [?XA(<<"Link">>, + [{<<"rel">>, <<"urn:xmpp:alt-connections:xbosh">>}, + {<<"href">>, BoshUrl}] + )] + end, + WsList = case get_url(?MODULE, websocket, true, Host) of + undefined -> []; + WsUrl -> + [?XA(<<"Link">>, + [{<<"rel">>, <<"urn:xmpp:alt-connections:websocket">>}, + {<<"href">>, WsUrl}] + )] + end, + {200, [html, + {<<"Content-Type">>, <<"application/xrd+xml">>}, + {<<"Access-Control-Allow-Origin">>, <<"*">>}], + [<<"\n">>, + fxml:element_to_binary( + ?XAE(<<"XRD">>, + [{<<"xmlns">>,<<"http://docs.oasis-open.org/ns/xri/xrd-1.0">>}], + BoshList ++ WsList) + )]}. + +file_json(Host) -> + BoshList = case get_url(?MODULE, bosh, true, Host) of + undefined -> []; + BoshUrl -> [#{rel => <<"urn:xmpp:alt-connections:xbosh">>, + href => BoshUrl}] + end, + WsList = case get_url(?MODULE, websocket, true, Host) of + undefined -> []; + WsUrl -> [#{rel => <<"urn:xmpp:alt-connections:websocket">>, + href => WsUrl}] + end, + {200, [html, + {<<"Content-Type">>, <<"application/json">>}, + {<<"Access-Control-Allow-Origin">>, <<"*">>}], + [jiffy:encode(#{links => BoshList ++ WsList})]}. + +get_url(M, bosh, Tls, Host) -> + get_url(M, Tls, Host, bosh_service_url, mod_bosh); +get_url(M, websocket, Tls, Host) -> + get_url(M, Tls, Host, websocket_url, ejabberd_http_ws). + +get_url(M, Tls, Host, Option, Module) -> + case get_url_preliminar(M, Tls, Host, Option, Module) of + undefined -> undefined; + Url -> misc:expand_keyword(<<"@HOST@">>, Url, Host) + end. + +get_url_preliminar(M, Tls, Host, Option, Module) -> + case gen_mod:get_module_opt(Host, M, Option) of + undefined -> undefined; + auto -> get_auto_url(Tls, Module); + <<"auto">> -> get_auto_url(Tls, Module); + U when is_binary(U) -> U + end. + +get_auto_url(Tls, Module) -> + case find_handler_port_path(Tls, Module) of + [] -> undefined; + [{ThisTls, Port, Path} | _] -> + Protocol = case {ThisTls, Module} of + {false, mod_bosh} -> <<"http">>; + {true, mod_bosh} -> <<"https">>; + {false, ejabberd_http_ws} -> <<"ws">>; + {true, ejabberd_http_ws} -> <<"wss">> + end, + <>))/binary>> + end. + +find_handler_port_path(Tls, Module) -> + lists:filtermap( + fun({{Port, _, _}, + ejabberd_http, + #{tls := ThisTls, request_handlers := Handlers}}) + when (Tls == any) or (Tls == ThisTls) -> + case lists:keyfind(Module, 2, Handlers) of + false -> false; + {Path, Module} -> {true, {ThisTls, Port, Path}} + end; + (_) -> false + end, ets:tab2list(ejabberd_listener)). + +%%%---------------------------------------------------------------------- +%%% Options and Doc +%%%---------------------------------------------------------------------- + +mod_opt_type(bosh_service_url) -> + econf:either(undefined, econf:binary()); +mod_opt_type(websocket_url) -> + econf:either(undefined, econf:binary()). + +mod_options(_) -> + [{bosh_service_url, <<"auto">>}, + {websocket_url, <<"auto">>}]. + +mod_doc() -> + #{desc => + [?T("This module serves small 'host-meta' files as described in " + "https://xmpp.org/extensions/xep-0156.html[XEP-0156: Discovering " + "Alternative XMPP Connection Methods]."), "", + ?T("This module is available since ejabberd 22.xx."), "", + ?T("To use this module, in addition to adding it to the 'modules' " + "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " + "http://../listen-options/#request-handlers[request_handlers]."), "", + ?T("Notice it only works if ejabberd_http has tls enabled.")], + example => + ["listen:", + " -", + " port: 443", + " module: ejabberd_http", + " tls: true", + " request_handlers:", + " /bosh: mod_bosh", + " /ws: ejabberd_http_ws", + " /.well-known/host-meta: mod_host_meta", + " /.well-known/host-meta.json: mod_host_meta", + "", + "modules:", + " mod_bosh: {}", + " mod_host_meta:", + " bosh_service_url: \"https://@HOST@:5443/bosh\"", + " websocket_url: \"wss://@HOST@:5443/ws\""], + + opts => + [{websocket_url, + #{value => "undefined | auto | WebSocketURL", + desc => + ?T("WebSocket URL to announce. " + "The keyword '@HOST@' is replaced with the real virtual " + "host name. " + "If set to 'auto', it will build the URL of the first " + "configured WebSocket request handler. " + "The default value is 'auto'.")}}, + {bosh_service_url, + #{value => "undefined | auto | BoshURL", + desc => + ?T("BOSH service URL to announce. " + "The keyword '@HOST@' is replaced with the real " + "virtual host name. " + "If set to 'auto', it will build the URL of the first " + "configured BOSH request handler. " + "The default value is 'auto'.")}}] + }. diff --git a/src/mod_host_meta_opt.erl b/src/mod_host_meta_opt.erl new file mode 100644 index 000000000..965e95cf8 --- /dev/null +++ b/src/mod_host_meta_opt.erl @@ -0,0 +1,20 @@ +%% Generated automatically +%% DO NOT EDIT: run `make options` instead + +-module(mod_host_meta_opt). + +-export([bosh_service_url/1]). +-export([websocket_url/1]). + +-spec bosh_service_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +bosh_service_url(Opts) when is_map(Opts) -> + gen_mod:get_opt(bosh_service_url, Opts); +bosh_service_url(Host) -> + gen_mod:get_module_opt(Host, mod_host_meta, bosh_service_url). + +-spec websocket_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +websocket_url(Opts) when is_map(Opts) -> + gen_mod:get_opt(websocket_url, Opts); +websocket_url(Host) -> + gen_mod:get_module_opt(Host, mod_host_meta, websocket_url). + From f461bcb5973bd732b41b82a60ed07b9c8a7ef208 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 28 Mar 2022 15:47:17 +0200 Subject: [PATCH 217/440] Improved mod_conversejs to support @HOST@, auto and conversejs_resources Changes: - The options can use the @HOST@ keyword - default_domain option is @HOST@ by default, not the first defined vhost - New conversejs_resources option to serve converse.js files (no need for web server) - conversejs_* now support 'auto', which uses local or remote Converse files --- src/mod_conversejs.erl | 138 ++++++++++++++++++++++++++++++++----- src/mod_conversejs_opt.erl | 11 ++- 2 files changed, 128 insertions(+), 21 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 3b9efef67..48e0c2556 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -50,15 +50,22 @@ reload(_Host, _NewOpts, _OldOpts) -> depends(_Host, _Opts) -> []. -process([], #request{method = 'GET'}) -> - Host = ejabberd_config:get_myname(), - Domain = gen_mod:get_module_opt(Host, ?MODULE, default_domain), - Script = gen_mod:get_module_opt(Host, ?MODULE, conversejs_script), - CSS = gen_mod:get_module_opt(Host, ?MODULE, conversejs_css), +process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> + DomainRaw = gen_mod:get_module_opt(Host, ?MODULE, default_domain), + Domain = misc:expand_keyword(<<"@HOST@">>, DomainRaw, Host), + Script = get_file_url(Host, conversejs_script, + <>, + <<"https://cdn.conversejs.org/dist/converse.min.js">>), + CSS = get_file_url(Host, conversejs_css, + <>, + <<"https://cdn.conversejs.org/dist/converse.min.css">>), Init = [{<<"discover_connection_methods">>, false}, {<<"jid">>, Domain}, {<<"default_domain">>, Domain}, {<<"domain_placeholder">>, Domain}, + {<<"registration_domain">>, Domain}, + {<<"assets_path">>, RawPath}, + {<<"i18n">>, ejabberd_option:language(Host)}, {<<"view_mode">>, <<"fullscreen">>}], Init2 = case gen_mod:get_module_opt(Host, ?MODULE, websocket_url) of @@ -85,13 +92,96 @@ process([], #request{method = 'GET'}) -> <<"">>, <<"">>, <<"">>]}; -process(_, _) -> - ejabberd_web:error(not_found). +process(LocalPath, #request{host = Host}) -> + case is_served_file(LocalPath) of + true -> serve(Host, LocalPath); + false -> ejabberd_web:error(not_found) + end. + +%%---------------------------------------------------------------------- +%% File server +%%---------------------------------------------------------------------- + +is_served_file([<<"converse.min.js">>]) -> true; +is_served_file([<<"converse.min.css">>]) -> true; +is_served_file([<<"converse.min.js.map">>]) -> true; +is_served_file([<<"converse.min.css.map">>]) -> true; +is_served_file([<<"emojis.js">>]) -> true; +is_served_file([<<"locales">>, _]) -> true; +is_served_file([<<"locales">>, <<"dayjs">>, _]) -> true; +is_served_file([<<"webfonts">>, _]) -> true; +is_served_file(_) -> false. + +serve(Host, LocalPath) -> + case get_conversejs_resources(Host) of + undefined -> ejabberd_web:error(not_found); + MainPath -> serve2(LocalPath, MainPath) + end. + +get_conversejs_resources(Host) -> + Opts = gen_mod:get_module_opts(Host, ?MODULE), + mod_conversejs_opt:conversejs_resources(Opts). + +%% Copied from mod_muc_log_http.erl + +serve2(LocalPathBin, MainPathBin) -> + LocalPath = [binary_to_list(LPB) || LPB <- LocalPathBin], + MainPath = binary_to_list(MainPathBin), + FileName = filename:join(filename:split(MainPath) ++ LocalPath), + case file:read_file(FileName) of + {ok, FileContents} -> + ?DEBUG("Delivering content.", []), + {200, + [{<<"Content-Type">>, content_type(FileName)}], + FileContents}; + {error, eisdir} -> + {403, [], "Forbidden"}; + {error, Error} -> + ?DEBUG("Delivering error: ~p", [Error]), + case Error of + eacces -> {403, [], "Forbidden"}; + enoent -> {404, [], "Not found"}; + _Else -> {404, [], atom_to_list(Error)} + end + end. + +content_type(Filename) -> + case string:to_lower(filename:extension(Filename)) of + ".css" -> "text/css"; + ".js" -> "text/javascript"; + ".map" -> "application/json"; + ".ttf" -> "font/ttf"; + ".woff" -> "font/woff"; + ".woff2" -> "font/woff2" + end. + +%%---------------------------------------------------------------------- +%% Options parsing +%%---------------------------------------------------------------------- + +get_file_url(Host, Option, Filename, Default) -> + FileRaw = case gen_mod:get_module_opt(Host, ?MODULE, Option) of + auto -> get_auto_file_url(Host, Filename, Default); + F -> F + end, + misc:expand_keyword(<<"@HOST@">>, FileRaw, Host). + +get_auto_file_url(Host, Filename, Default) -> + case get_conversejs_resources(Host) of + undefined -> Default; + _ -> Filename + end. + +%%---------------------------------------------------------------------- +%% +%%---------------------------------------------------------------------- mod_opt_type(bosh_service_url) -> econf:either(undefined, econf:binary()); mod_opt_type(websocket_url) -> econf:either(undefined, econf:binary()); +mod_opt_type(conversejs_resources) -> + econf:either(undefined, econf:directory()); mod_opt_type(conversejs_script) -> econf:binary(); mod_opt_type(conversejs_css) -> @@ -102,9 +192,10 @@ mod_opt_type(default_domain) -> mod_options(_) -> [{bosh_service_url, undefined}, {websocket_url, undefined}, - {default_domain, ejabberd_config:get_myname()}, - {conversejs_script, <<"https://cdn.conversejs.org/dist/converse.min.js">>}, - {conversejs_css, <<"https://cdn.conversejs.org/dist/converse.min.css">>}]. + {default_domain, <<"@HOST@">>}, + {conversejs_resources, undefined}, + {conversejs_script, auto}, + {conversejs_css, auto}]. mod_doc() -> #{desc => @@ -115,9 +206,8 @@ mod_doc() -> "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", ?T("You must also setup either the option 'websocket_url' or 'bosh_service_url'."), "", - ?T("By default, the options 'conversejs_css' and 'conversejs_script'" - " point to the public Converse.js client. Alternatively, you can" - " host the client locally using _`mod_http_fileserver`_.") + ?T("When 'conversejs_css' and 'conversejs_script' are 'auto', " + "by default they point to the public Converse client.") ], example => ["listen:", @@ -130,6 +220,7 @@ mod_doc() -> "", "modules:", " mod_conversejs:", + " conversejs_resources: \"/home/ejabberd/conversejs-9.0.0/package/dist\"", " websocket_url: \"ws://example.org:5280/websocket\""], opts => [{websocket_url, @@ -144,14 +235,23 @@ mod_doc() -> #{value => ?T("Domain"), desc => ?T("Specify a domain to act as the default for user JIDs. " - "The default value is the first domain defined in the " - "ejabberd configuration file.")}}, + "The keyword '@HOST@' is replaced with the hostname. " + "The default value is '@HOST@'.")}}, + {conversejs_resources, + #{value => ?T("Path"), + desc => + ?T("Local path to the Converse files. " + "If not set, the public Converse client will be used instead.")}}, {conversejs_script, - #{value => ?T("URL"), + #{value => ?T("auto | URL"), desc => - ?T("Converse.js main script URL.")}}, + ?T("Converse main script URL. " + "The keyword '@HOST@' is replaced with the hostname. " + "The default value is 'auto'.")}}, {conversejs_css, - #{value => ?T("URL"), + #{value => ?T("auto | URL"), desc => - ?T("Converse.js CSS URL.")}}] + ?T("Converse CSS URL. " + "The keyword '@HOST@' is replaced with the hostname. " + "The default value is 'auto'.")}}] }. diff --git a/src/mod_conversejs_opt.erl b/src/mod_conversejs_opt.erl index 9e53978ea..f43b3e830 100644 --- a/src/mod_conversejs_opt.erl +++ b/src/mod_conversejs_opt.erl @@ -5,6 +5,7 @@ -export([bosh_service_url/1]). -export([conversejs_css/1]). +-export([conversejs_resources/1]). -export([conversejs_script/1]). -export([default_domain/1]). -export([websocket_url/1]). @@ -15,13 +16,19 @@ bosh_service_url(Opts) when is_map(Opts) -> bosh_service_url(Host) -> gen_mod:get_module_opt(Host, mod_conversejs, bosh_service_url). --spec conversejs_css(gen_mod:opts() | global | binary()) -> binary(). +-spec conversejs_css(gen_mod:opts() | global | binary()) -> 'auto' | binary(). conversejs_css(Opts) when is_map(Opts) -> gen_mod:get_opt(conversejs_css, Opts); conversejs_css(Host) -> gen_mod:get_module_opt(Host, mod_conversejs, conversejs_css). --spec conversejs_script(gen_mod:opts() | global | binary()) -> binary(). +-spec conversejs_resources(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +conversejs_resources(Opts) when is_map(Opts) -> + gen_mod:get_opt(conversejs_resources, Opts); +conversejs_resources(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, conversejs_resources). + +-spec conversejs_script(gen_mod:opts() | global | binary()) -> 'auto' | binary(). conversejs_script(Opts) when is_map(Opts) -> gen_mod:get_opt(conversejs_script, Opts); conversejs_script(Host) -> From 94186a36d085b146e86d03fe2204be3f7ceaab98 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 31 Mar 2022 21:01:48 +0200 Subject: [PATCH 218/440] The *_url options now support 'auto' --- src/mod_conversejs.erl | 34 +++++++++++++++++++++++----------- src/mod_conversejs_opt.erl | 4 ++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 48e0c2556..1bf9f526b 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -68,12 +68,12 @@ process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> {<<"i18n">>, ejabberd_option:language(Host)}, {<<"view_mode">>, <<"fullscreen">>}], Init2 = - case gen_mod:get_module_opt(Host, ?MODULE, websocket_url) of + case mod_host_meta:get_url(?MODULE, websocket, any, Host) of undefined -> Init; WSURL -> [{<<"websocket_url">>, WSURL} | Init] end, Init3 = - case gen_mod:get_module_opt(Host, ?MODULE, bosh_service_url) of + case mod_host_meta:get_url(?MODULE, bosh, any, Host) of undefined -> Init2; BoshURL -> [{<<"bosh_service_url">>, BoshURL} | Init2] end, @@ -177,9 +177,9 @@ get_auto_file_url(Host, Filename, Default) -> %%---------------------------------------------------------------------- mod_opt_type(bosh_service_url) -> - econf:either(undefined, econf:binary()); + econf:either(auto, econf:binary()); mod_opt_type(websocket_url) -> - econf:either(undefined, econf:binary()); + econf:either(auto, econf:binary()); mod_opt_type(conversejs_resources) -> econf:either(undefined, econf:directory()); mod_opt_type(conversejs_script) -> @@ -190,8 +190,8 @@ mod_opt_type(default_domain) -> econf:binary(). mod_options(_) -> - [{bosh_service_url, undefined}, - {websocket_url, undefined}, + [{bosh_service_url, auto}, + {websocket_url, auto}, {default_domain, <<"@HOST@">>}, {conversejs_resources, undefined}, {conversejs_script, auto}, @@ -205,7 +205,9 @@ mod_doc() -> ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", - ?T("You must also setup either the option 'websocket_url' or 'bosh_service_url'."), "", + ?T("Make sure either 'mod_bosh' or 'ejabberd_http_ws' " + "http://../listen-options/#request-handlers[request_handlers] " + "are enabled."), "", ?T("When 'conversejs_css' and 'conversejs_script' are 'auto', " "by default they point to the public Converse client.") ], @@ -224,13 +226,23 @@ mod_doc() -> " websocket_url: \"ws://example.org:5280/websocket\""], opts => [{websocket_url, - #{value => ?T("WebSocketURL"), + #{value => ?T("auto | WebSocketURL"), desc => - ?T("A WebSocket URL to which Converse.js can connect to.")}}, + ?T("A WebSocket URL to which Converse can connect to. " + "The keyword '@HOST@' is replaced with the real virtual " + "host name. " + "If set to 'auto', it will build the URL of the first " + "configured WebSocket request handler. " + "The default value is 'auto'.")}}, {bosh_service_url, - #{value => ?T("BoshURL"), + #{value => ?T("auto | BoshURL"), desc => - ?T("BOSH service URL to which Converse.js can connect to.")}}, + ?T("BOSH service URL to which Converse can connect to. " + "The keyword '@HOST@' is replaced with the real " + "virtual host name. " + "If set to 'auto', it will build the URL of the first " + "configured BOSH request handler. " + "The default value is 'auto'.")}}, {default_domain, #{value => ?T("Domain"), desc => diff --git a/src/mod_conversejs_opt.erl b/src/mod_conversejs_opt.erl index f43b3e830..42304f746 100644 --- a/src/mod_conversejs_opt.erl +++ b/src/mod_conversejs_opt.erl @@ -10,7 +10,7 @@ -export([default_domain/1]). -export([websocket_url/1]). --spec bosh_service_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +-spec bosh_service_url(gen_mod:opts() | global | binary()) -> 'auto' | binary(). bosh_service_url(Opts) when is_map(Opts) -> gen_mod:get_opt(bosh_service_url, Opts); bosh_service_url(Host) -> @@ -40,7 +40,7 @@ default_domain(Opts) when is_map(Opts) -> default_domain(Host) -> gen_mod:get_module_opt(Host, mod_conversejs, default_domain). --spec websocket_url(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). +-spec websocket_url(gen_mod:opts() | global | binary()) -> 'auto' | binary(). websocket_url(Opts) when is_map(Opts) -> gen_mod:get_opt(websocket_url, Opts); websocket_url(Host) -> From 6cdb517454915a1f722fe0477ab25c9cf96ae10b Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 31 Mar 2022 21:24:04 +0200 Subject: [PATCH 219/440] New conversejs_options to setup additional options for Converse --- src/mod_conversejs.erl | 34 ++++++++++++++++++++++++++++++++-- src/mod_conversejs_opt.erl | 7 +++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 1bf9f526b..67004f637 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -51,6 +51,7 @@ depends(_Host, _Opts) -> []. process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> + ExtraOptions = get_extra_options(Host), DomainRaw = gen_mod:get_module_opt(Host, ?MODULE, default_domain), Domain = misc:expand_keyword(<<"@HOST@">>, DomainRaw, Host), Script = get_file_url(Host, conversejs_script, @@ -66,7 +67,8 @@ process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> {<<"registration_domain">>, Domain}, {<<"assets_path">>, RawPath}, {<<"i18n">>, ejabberd_option:language(Host)}, - {<<"view_mode">>, <<"fullscreen">>}], + {<<"view_mode">>, <<"fullscreen">>} + | ExtraOptions], Init2 = case mod_host_meta:get_url(?MODULE, websocket, any, Host) of undefined -> Init; @@ -159,6 +161,17 @@ content_type(Filename) -> %% Options parsing %%---------------------------------------------------------------------- +get_extra_options(Host) -> + RawOpts = gen_mod:get_module_opt(Host, ?MODULE, conversejs_options), + lists:map(fun({Name, <<"true">>}) -> {Name, true}; + ({Name, <<"false">>}) -> {Name, false}; + ({<<"locked_domain">> = Name, Value}) -> + {Name, misc:expand_keyword(<<"@HOST@">>, Value, Host)}; + ({Name, Value}) -> + {Name, Value} + end, + RawOpts). + get_file_url(Host, Option, Filename, Default) -> FileRaw = case gen_mod:get_module_opt(Host, ?MODULE, Option) of auto -> get_auto_file_url(Host, Filename, Default); @@ -182,6 +195,8 @@ mod_opt_type(websocket_url) -> econf:either(auto, econf:binary()); mod_opt_type(conversejs_resources) -> econf:either(undefined, econf:directory()); +mod_opt_type(conversejs_options) -> + econf:map(econf:binary(), econf:either(econf:binary(), econf:int())); mod_opt_type(conversejs_script) -> econf:binary(); mod_opt_type(conversejs_css) -> @@ -194,6 +209,7 @@ mod_options(_) -> {websocket_url, auto}, {default_domain, <<"@HOST@">>}, {conversejs_resources, undefined}, + {conversejs_options, []}, {conversejs_script, auto}, {conversejs_css, auto}]. @@ -223,7 +239,14 @@ mod_doc() -> "modules:", " mod_conversejs:", " conversejs_resources: \"/home/ejabberd/conversejs-9.0.0/package/dist\"", - " websocket_url: \"ws://example.org:5280/websocket\""], + " websocket_url: \"ws://example.org:5280/websocket\"" + " conversejs_options:" + " auto_away: 30" + " clear_cache_on_logout: true" + " i18n: \"pt\"" + " locked_domain: \"@HOST@\"" + " message_archiving: always" + " theme: concord"], opts => [{websocket_url, #{value => ?T("auto | WebSocketURL"), @@ -254,6 +277,13 @@ mod_doc() -> desc => ?T("Local path to the Converse files. " "If not set, the public Converse client will be used instead.")}}, + {conversejs_options, + #{value => "{Name: Value}", + desc => + ?T("Specify additional options to be passed to Converse. " + "See https://conversejs.org/docs/html/configuration.html[Converse configuration]. " + "Only boolean, integer and string values are supported; " + "lists are not supported.")}}, {conversejs_script, #{value => ?T("auto | URL"), desc => diff --git a/src/mod_conversejs_opt.erl b/src/mod_conversejs_opt.erl index 42304f746..c8132bfab 100644 --- a/src/mod_conversejs_opt.erl +++ b/src/mod_conversejs_opt.erl @@ -5,6 +5,7 @@ -export([bosh_service_url/1]). -export([conversejs_css/1]). +-export([conversejs_options/1]). -export([conversejs_resources/1]). -export([conversejs_script/1]). -export([default_domain/1]). @@ -22,6 +23,12 @@ conversejs_css(Opts) when is_map(Opts) -> conversejs_css(Host) -> gen_mod:get_module_opt(Host, mod_conversejs, conversejs_css). +-spec conversejs_options(gen_mod:opts() | global | binary()) -> [{binary(),binary() | integer()}]. +conversejs_options(Opts) when is_map(Opts) -> + gen_mod:get_opt(conversejs_options, Opts); +conversejs_options(Host) -> + gen_mod:get_module_opt(Host, mod_conversejs, conversejs_options). + -spec conversejs_resources(gen_mod:opts() | global | binary()) -> 'undefined' | binary(). conversejs_resources(Opts) when is_map(Opts) -> gen_mod:get_opt(conversejs_resources, Opts); From 152956c1940caa0f89cab6bf90d412e55d4438f8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 31 Mar 2022 19:14:09 +0200 Subject: [PATCH 220/440] Add more configuration examples --- src/mod_conversejs.erl | 60 ++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 67004f637..ce943b330 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -227,26 +227,46 @@ mod_doc() -> ?T("When 'conversejs_css' and 'conversejs_script' are 'auto', " "by default they point to the public Converse client.") ], - example => - ["listen:", - " -", - " port: 5280", - " module: ejabberd_http", - " request_handlers:", - " /websocket: ejabberd_http_ws", - " /conversejs: mod_conversejs", - "", - "modules:", - " mod_conversejs:", - " conversejs_resources: \"/home/ejabberd/conversejs-9.0.0/package/dist\"", - " websocket_url: \"ws://example.org:5280/websocket\"" - " conversejs_options:" - " auto_away: 30" - " clear_cache_on_logout: true" - " i18n: \"pt\"" - " locked_domain: \"@HOST@\"" - " message_archiving: always" - " theme: concord"], + example => + [{?T("Manually setup WebSocket url, and use the public Converse client:"), + ["listen:", + " -", + " port: 5280", + " module: ejabberd_http", + " request_handlers:", + " /bosh: mod_bosh", + " /websocket: ejabberd_http_ws", + " /conversejs: mod_conversejs", + "", + "modules:", + " mod_bosh: {}", + " mod_conversejs:", + " websocket_url: \"ws://@HOST@:5280/websocket\""]}, + {?T("Host Converse locally and let auto detection of WebSocket and Converse URLs:"), + ["listen:", + " -", + " port: 443", + " module: ejabberd_http", + " tls: true", + " request_handlers:", + " /websocket: ejabberd_http_ws", + " /conversejs: mod_conversejs", + "", + "modules:", + " mod_conversejs:", + " conversejs_resources: \"/home/ejabberd/conversejs-9.0.0/package/dist\""]}, + {?T("Configure some additional options for Converse"), + ["modules:", + " mod_conversejs:", + " websocket_url: auto", + " conversejs_options:", + " auto_away: 30", + " clear_cache_on_logout: true", + " i18n: \"pt\"", + " locked_domain: \"@HOST@\"", + " message_archiving: always", + " theme: concord"]} + ], opts => [{websocket_url, #{value => ?T("auto | WebSocketURL"), From 121fc716b08ed997995d0d7903c6e9c05391d0f0 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 4 Apr 2022 00:14:32 +0200 Subject: [PATCH 221/440] domain_balancing: Allow for specifying 'type' only Allow for specifying the 'type' of 'domain_balancing' without specifying the 'component_number' (as per the example in the documentation). The balancing 'type' is then applied to the dynamic number of component instances. --- src/ejabberd_options.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_options.erl b/src/ejabberd_options.erl index 4b29bfffd..8837ef475 100644 --- a/src/ejabberd_options.erl +++ b/src/ejabberd_options.erl @@ -141,7 +141,7 @@ opt_type(domain_balancing) -> #{component_number => econf:int(2, 1000), type => econf:enum([random, source, destination, bare_source, bare_destination])}, - [{required, [component_number]}, {return, map}, unique]), + [{return, map}, unique]), [{return, map}]); opt_type(ext_api_path_oauth) -> econf:binary(); From b405a3b61ee8a69bf6e76580cfc4bcd4f971c154 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 14 Mar 2022 19:47:13 +0100 Subject: [PATCH 222/440] Fix compilation with Erlang 19 --- src/ejabberd_hooks.erl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl index 1b3c27cf6..3a440e455 100644 --- a/src/ejabberd_hooks.erl +++ b/src/ejabberd_hooks.erl @@ -544,9 +544,10 @@ run_event_handlers(TracingOpts, Hook, Host, Event, EventArgs, RunType) -> ok catch ?EX_RULE(E, R, St) -> + Stack = ?EX_STACK(St), ?ERROR_MSG( "(~0p|~ts|~0p) Tracing event '~0p' handler exception(~0p): ~0p: ~0p", - [Hook, Host, erlang:self(), EventHandler, E, R, St] + [Hook, Host, erlang:self(), EventHandler, E, R, Stack] ), ok end @@ -719,7 +720,8 @@ tracing_output(#{output_function := OutputF}, Text, Args) -> ok catch ?EX_RULE(E, R, St) -> - ?ERROR_MSG("Tracing output function exception(~0p): ~0p: ~0p", [E, R, St]), + Stack = ?EX_STACK(St), + ?ERROR_MSG("Tracing output function exception(~0p): ~0p: ~0p", [E, R, Stack]), ok end; tracing_output(#{output_log_level := Output}, Text, Args) -> From 170ea134d64cd8de887afd417868e5e5a4503778 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 5 Apr 2022 13:28:54 +0200 Subject: [PATCH 223/440] Set Converse auth and register options based on ejabberd configuration --- src/mod_conversejs.erl | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index ce943b330..5be937ad4 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -51,7 +51,9 @@ depends(_Host, _Opts) -> []. process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> - ExtraOptions = get_extra_options(Host), + ExtraOptions = get_auth_options(Host) + ++ get_register_options(Host) + ++ get_extra_options(Host), DomainRaw = gen_mod:get_module_opt(Host, ?MODULE, default_domain), Domain = misc:expand_keyword(<<"@HOST@">>, DomainRaw, Host), Script = get_file_url(Host, conversejs_script, @@ -61,7 +63,6 @@ process([], #request{method = 'GET', host = Host, raw_path = RawPath}) -> <>, <<"https://cdn.conversejs.org/dist/converse.min.css">>), Init = [{<<"discover_connection_methods">>, false}, - {<<"jid">>, Domain}, {<<"default_domain">>, Domain}, {<<"domain_placeholder">>, Domain}, {<<"registration_domain">>, Domain}, @@ -161,6 +162,31 @@ content_type(Filename) -> %% Options parsing %%---------------------------------------------------------------------- +get_auth_options(Domain) -> + case {ejabberd_auth_anonymous:is_login_anonymous_enabled(Domain), + ejabberd_auth_anonymous:is_sasl_anonymous_enabled(Domain)} of + {false, false} -> + [{<<"authentication">>, <<"login">>}]; + {true, false} -> + [{<<"authentication">>, <<"external">>}]; + {_, true} -> + [{<<"authentication">>, <<"anonymous">>}, + {<<"jid">>, Domain}] + end. + +get_register_options(Server) -> + AuthSupportsRegister = + lists:any( + fun(ejabberd_auth_mnesia) -> true; + (ejabberd_auth_external) -> true; + (ejabberd_auth_sql) -> true; + (_) -> false + end, + ejabberd_auth:auth_modules(Server)), + Modules = mod_register_opt:allow_modules(Server), + ModRegisterAllowsMe = (Modules == all) orelse lists:member(?MODULE, Modules), + [{<<"allow_registration">>, AuthSupportsRegister and ModRegisterAllowsMe}]. + get_extra_options(Host) -> RawOpts = gen_mod:get_module_opt(Host, ?MODULE, conversejs_options), lists:map(fun({Name, <<"true">>}) -> {Name, true}; From 6dbd1118a25e00731bc953e2cf5c6425dc1ff4b2 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 6 Apr 2022 11:00:44 +0000 Subject: [PATCH 224/440] mod_conversejs example, use newer dark theme ref: https://github.com/conversejs/converse.js/releases/tag/v9.1.0 --- src/mod_conversejs.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 5be937ad4..08b218c67 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -291,7 +291,7 @@ mod_doc() -> " i18n: \"pt\"", " locked_domain: \"@HOST@\"", " message_archiving: always", - " theme: concord"]} + " theme: dracula"]} ], opts => [{websocket_url, From b86fe14ef098212a1ed33f333f739888a7b9c038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 8 Apr 2022 16:49:24 +0200 Subject: [PATCH 225/440] Add rate limited delete_old_mam_messages command --- src/ejabberd_batch.erl | 205 +++++++++++++++++++++++++++++++++++++++++ src/ejabberd_sup.erl | 3 +- src/mod_mam.erl | 86 ++++++++++++++++- src/mod_mam_sql.erl | 53 ++++++++++- 4 files changed, 344 insertions(+), 3 deletions(-) create mode 100644 src/ejabberd_batch.erl diff --git a/src/ejabberd_batch.erl b/src/ejabberd_batch.erl new file mode 100644 index 000000000..05750164c --- /dev/null +++ b/src/ejabberd_batch.erl @@ -0,0 +1,205 @@ +%%%---------------------------------------------------------------------- +%%% File : ejabberd_batch.erl +%%% Author : Paweł Chmielowski +%%% Purpose : Batch tasks manager +%%% Created : 8 mar 2022 by Paweł Chmielowski +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2022 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%---------------------------------------------------------------------- + +-module(ejabberd_batch). +-author("pawel@process-one.net"). + +-behaviour(gen_server). + +-include("logger.hrl"). + +%% API +-export([start_link/0]). + +%% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, + code_change/3]). +-export([register_task/5, task_status/1, abort_task/1]). + +-define(SERVER, ?MODULE). + +-record(state, {tasks = #{}}). +-record(task, {state = not_started, pid, steps, done_steps}). + +%%%=================================================================== +%%% API +%%%=================================================================== + +%% @doc Spawns the server and registers the local name (unique) +-spec(start_link() -> + {ok, Pid :: pid()} | ignore | {error, Reason :: term()}). +start_link() -> + gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). + +register_task(Type, Steps, Rate, JobState, JobFun) -> + gen_server:call(?MODULE, {register_task, Type, Steps, Rate, JobState, JobFun}). + +task_status(Type) -> + gen_server:call(?MODULE, {task_status, Type}). + +abort_task(Type) -> + gen_server:call(?MODULE, {abort_task, Type}). + +%%%=================================================================== +%%% gen_server callbacks +%%%=================================================================== + +%% @private +%% @doc Initializes the server +-spec(init(Args :: term()) -> + {ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} | + {stop, Reason :: term()} | ignore). +init([]) -> + {ok, #state{}}. + +%% @private +%% @doc Handling call messages +-spec(handle_call(Request :: term(), From :: {pid(), Tag :: term()}, + State :: #state{}) -> + {reply, Reply :: term(), NewState :: #state{}} | + {reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} | + {noreply, NewState :: #state{}} | + {noreply, NewState :: #state{}, timeout() | hibernate} | + {stop, Reason :: term(), Reply :: term(), NewState :: #state{}} | + {stop, Reason :: term(), NewState :: #state{}}). +handle_call({register_task, Type, Steps, Rate, JobState, JobFun}, _From, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, #task{}) of + #task{state = S} when S == completed; S == not_started; S == aborted; S == failed -> + Pid = spawn(fun() -> work_loop(Type, JobState, JobFun, Rate, erlang:monotonic_time(second), 0) end), + Tasks2 = maps:put(Type, #task{state = working, pid = Pid, steps = Steps, done_steps = 0}, Tasks), + {reply, ok, #state{tasks = Tasks2}}; + #task{state = working} -> + {reply, {error, in_progress}, State} + end; +handle_call({task_status, Type}, _From, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, none) of + none -> + {reply, not_started, State}; + #task{state = not_started} -> + {reply, not_started, State}; + #task{state = failed, done_steps = Steps, pid = Error} -> + {reply, {failed, Steps, Error}, State}; + #task{state = aborted, done_steps = Steps} -> + {reply, {aborted, Steps}, State}; + #task{state = working, done_steps = Steps} -> + {reply, {working, Steps}, State}; + #task{state = completed, done_steps = Steps} -> + {reply, {completed, Steps}, State} + end; +handle_call({abort_task, Type}, _From, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, none) of + #task{state = working, pid = Pid} = T -> + Pid ! abort, + Tasks2 = maps:put(Type, T#task{state = aborted, pid = none}, Tasks), + {reply, aborted, State#state{tasks = Tasks2}}; + _ -> + {reply, not_started, State} + end; +handle_call(_Request, _From, State = #state{}) -> + {reply, ok, State}. + +%% @private +%% @doc Handling cast messages +-spec(handle_cast(Request :: term(), State :: #state{}) -> + {noreply, NewState :: #state{}} | + {noreply, NewState :: #state{}, timeout() | hibernate} | + {stop, Reason :: term(), NewState :: #state{}}). +handle_cast({task_finished, Type, Pid}, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, none) of + #task{state = working, pid = Pid2} = T when Pid == Pid2 -> + Tasks2 = maps:put(Type, T#task{state = completed, pid = none}, Tasks), + {noreply, State#state{tasks = Tasks2}}; + _ -> + {noreply, State} + end; +handle_cast({task_progress, Type, Pid, Count}, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, none) of + #task{state = working, pid = Pid2, done_steps = Steps} = T when Pid == Pid2 -> + Tasks2 = maps:put(Type, T#task{done_steps = Steps + Count}, Tasks), + {noreply, State#state{tasks = Tasks2}}; + _ -> + {noreply, State} + end; +handle_cast({task_error, Type, Pid, Error}, #state{tasks = Tasks} = State) -> + case maps:get(Type, Tasks, none) of + #task{state = working, pid = Pid2} = T when Pid == Pid2 -> + Tasks2 = maps:put(Type, T#task{state = failed, pid = Error}, Tasks), + {noreply, State#state{tasks = Tasks2}}; + _ -> + {noreply, State} + end; +handle_cast(_Request, State = #state{}) -> + {noreply, State}. + +%% @private +%% @doc Handling all non call/cast messages +-spec(handle_info(Info :: timeout() | term(), State :: #state{}) -> + {noreply, NewState :: #state{}} | + {noreply, NewState :: #state{}, timeout() | hibernate} | + {stop, Reason :: term(), NewState :: #state{}}). +handle_info(_Info, State = #state{}) -> + {noreply, State}. + +%% @private +%% @doc This function is called by a gen_server when it is about to +%% terminate. It should be the opposite of Module:init/1 and do any +%% necessary cleaning up. When it returns, the gen_server terminates +%% with Reason. The return value is ignored. +-spec(terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()), + State :: #state{}) -> term()). +terminate(_Reason, _State = #state{}) -> + ok. + +%% @private +%% @doc Convert process state when code is changed +-spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{}, + Extra :: term()) -> + {ok, NewState :: #state{}} | {error, Reason :: term()}). +code_change(_OldVsn, State = #state{}, _Extra) -> + {ok, State}. + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== + +work_loop(Task, JobState, JobFun, Rate, StartDate, CurrentProgress) -> + try JobFun(JobState) of + {ok, _NewState, 0} -> + gen_server:cast(?MODULE, {task_finished, Task, self()}); + {ok, NewState, Count} -> + gen_server:cast(?MODULE, {task_progress, Task, self(), Count}), + NewProgress = CurrentProgress + Count, + TimeSpent = erlang:monotonic_time(second) - StartDate, + SleepTime = max(0, NewProgress/Rate*60 - TimeSpent), + receive + abort -> ok + after floor(SleepTime*1000) -> + work_loop(Task, NewState, JobFun, Rate, StartDate, NewProgress) + end; + {error, Error} -> + gen_server:cast(?MODULE, {task_error, Task, self(), Error}) + catch _:_ -> + gen_server:cast(?MODULE, {task_error, Task, self(), internal_error}) + end. diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl index a97c7784b..e15e658c4 100644 --- a/src/ejabberd_sup.erl +++ b/src/ejabberd_sup.erl @@ -66,7 +66,8 @@ init([]) -> supervisor(ejabberd_gen_mod_sup, gen_mod), worker(ejabberd_acme), worker(ejabberd_auth), - worker(ejabberd_oauth)]}}. + worker(ejabberd_oauth), + worker(ejabberd_batch)]}}. -spec stop_child(atom()) -> ok. stop_child(Name) -> diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 59940ec81..ffbd1d4eb 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -43,7 +43,8 @@ get_room_config/4, set_room_option/3, offline_message/1, export/1, mod_options/1, remove_mam_for_user_with_peer/3, remove_mam_for_user/2, is_empty_for_user/2, is_empty_for_room/3, check_create_room/4, - process_iq/3, store_mam_message/7, make_id/0, wrap_as_mucsub/2, select/7]). + process_iq/3, store_mam_message/7, make_id/0, wrap_as_mucsub/2, select/7, + delete_old_messages_batch/5, delete_old_messages_status/1, delete_old_messages_abort/1]). -include_lib("xmpp/include/xmpp.hrl"). -include("logger.hrl"). @@ -568,6 +569,56 @@ message_is_archived(false, #{lserver := LServer}, Pkt) -> false end. +delete_old_messages_batch(Server, Type, Days, BatchSize, Rate) when Type == <<"chat">>; + Type == <<"groupchat">>; + Type == <<"all">> -> + CurrentTime = make_id(), + Diff = Days * 24 * 60 * 60 * 1000000, + TimeStamp = misc:usec_to_now(CurrentTime - Diff), + TypeA = misc:binary_to_atom(Type), + LServer = jid:nameprep(Server), + Mod = gen_mod:db_mod(LServer, ?MODULE), + case ejabberd_batch:register_task({mam, LServer}, 0, Rate, {LServer, TypeA, TimeStamp, BatchSize}, + fun({L, T, St, B} = S) -> + case Mod:delete_old_messages_batch(L, St, T, B) of + {ok, Count} -> + {ok, S, Count}; + {error, _} = E -> + E + end + end) of + ok -> + {ok, ""}; + {error, in_progress} -> + {error, "Operation in progress"} + end. +delete_old_messages_status(Server) -> + LServer = jid:nameprep(Server), + Msg = case ejabberd_batch:task_status({mam, LServer}) of + not_started -> + "Operation not started"; + {failed, Steps, Error} -> + io_lib:format("Operation failed after deleting ~p messages with error ~p", + [Steps, misc:format_val(Error)]); + {aborted, Steps} -> + io_lib:format("Operation was aborted after deleting ~p messages", + [Steps]); + {working, Steps} -> + io_lib:format("Operation in progress, deleted ~p messages", + [Steps]); + {completed, Steps} -> + io_lib:format("Operation was completed after deleting ~p messages", + [Steps]) + end, + lists:flatten(Msg). + +delete_old_messages_abort(Server) -> + LServer = jid:nameprep(Server), + case ejabberd_batch:abort_task({mam, LServer}) of + aborted -> "Operation aborted"; + not_started -> "No task running" + end. + delete_old_messages(TypeBin, Days) when TypeBin == <<"chat">>; TypeBin == <<"groupchat">>; TypeBin == <<"all">> -> @@ -1379,6 +1430,39 @@ get_commands_spec() -> args_example = [<<"all">>, 31], args = [{type, binary}, {days, integer}], result = {res, rescode}}, + #ejabberd_commands{name = delete_old_mam_messages_batch, tags = [purge], + desc = "Delete MAM messages older than DAYS", + longdesc = "Valid message TYPEs: " + "\"chat\", \"groupchat\", \"all\".", + module = ?MODULE, function = delete_old_messages_batch, + args_desc = ["Name of host where messages should be deleted", + "Type of messages to delete (chat, groupchat, all)", + "Days to keep messages", + "Number of messages to delete per batch", + "Desired rate of messages to delete per minute"], + args_example = [<<"localhost">>, <<"all">>, 31, 1000, 10000], + args = [{host, binary}, {type, binary}, {days, integer}, {batch_size, integer}, {rate, integer}], + result = {res, restuple}, + result_desc = "Result tuple", + result_example = {ok, <<"Removal of 5000 messages in progress">>}}, + #ejabberd_commands{name = delete_old_mam_messages_status, tags = [purge], + desc = "Status of delete old MAM messages operation", + module = ?MODULE, function = delete_old_messages_status, + args_desc = ["Name of host where messages should be deleted"], + args_example = [<<"localhost">>], + args = [{host, binary}], + result = {status, string}, + result_desc = "Status test", + result_example = {"Operation in progress, delete 5000 messages"}}, + #ejabberd_commands{name = abort_delete_old_mam_messages, tags = [purge], + desc = "Abort currently running delete old MAM messages operation", + module = ?MODULE, function = delete_old_messages_abort, + args_desc = ["Name of host where operation should be aborted"], + args_example = [<<"localhost">>], + args = [{host, binary}], + result = {status, string}, + result_desc = "Status text", + result_example = {"Operation aborted"}}, #ejabberd_commands{name = remove_mam_for_user, tags = [mam], desc = "Remove mam archive for user", module = ?MODULE, function = remove_mam_for_user, diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 8e803587e..9eb9716fb 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -30,7 +30,8 @@ %% API -export([init/2, remove_user/2, remove_room/3, delete_old_messages/3, extended_fields/0, store/8, write_prefs/4, get_prefs/2, select/7, export/1, remove_from_archive/3, - is_empty_for_user/2, is_empty_for_room/3, select_with_mucsub/6]). + is_empty_for_user/2, is_empty_for_room/3, select_with_mucsub/6, + delete_old_messages_batch/4, count_messages_to_delete/3]). -include_lib("stdlib/include/ms_transform.hrl"). -include_lib("xmpp/include/xmpp.hrl"). @@ -71,6 +72,56 @@ remove_from_archive(LUser, LServer, WithJid) -> _ -> ok end. +count_messages_to_delete(ServerHost, TimeStamp, Type) -> + TS = misc:now_to_usec(TimeStamp), + Res = + case Type of + all -> + ejabberd_sql:sql_query( + ServerHost, + ?SQL("select count(*) from archive" + " where timestamp < %(TS)d and %(ServerHost)H")); + _ -> + SType = misc:atom_to_binary(Type), + ejabberd_sql:sql_query( + ServerHost, + ?SQL("select @(count(*))d from archive" + " where timestamp < %(TS)d" + " and kind=%(SType)s" + " and %(ServerHost)H")) + end, + case Res of + {selected, [Count]} -> + {ok, Count}; + _ -> + error + end. + +delete_old_messages_batch(ServerHost, TimeStamp, Type, Batch) -> + TS = misc:now_to_usec(TimeStamp), + Res = + case Type of + all -> + ejabberd_sql:sql_query( + ServerHost, + ?SQL("delete from archive" + " where timestamp < %(TS)d and %(ServerHost)H limit %(Batch)d")); + _ -> + SType = misc:atom_to_binary(Type), + ejabberd_sql:sql_query( + ServerHost, + ?SQL("delete from archive" + " where timestamp < %(TS)d" + " and kind=%(SType)s" + " and %(ServerHost)H limit %(Batch)d")) + end, + case Res of + {updated, Count} -> + {ok, Count}; + {error, _} = Error -> + Error + end. + delete_old_messages(ServerHost, TimeStamp, Type) -> TS = misc:now_to_usec(TimeStamp), case Type of From 0870f32c5939cb17a7c955244161515989b18402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 8 Apr 2022 17:41:17 +0200 Subject: [PATCH 226/440] Add rate limited delete_old_messages --- src/ejabberd_admin.erl | 79 +++++++++++++++++++++++++++++++++++++++-- src/mod_offline_sql.erl | 27 +++++++++++++- 2 files changed, 103 insertions(+), 3 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index c79572f16..c8dda3241 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -60,8 +60,8 @@ restore/1, % Still used by some modules clear_cache/0, gc/0, - get_commands_spec/0 - ]). + get_commands_spec/0, + delete_old_messages_batch/4, delete_old_messages_status/1, delete_old_messages_abort/1]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -320,6 +320,36 @@ get_commands_spec() -> args_desc = ["Number of days"], args_example = [31], args = [{days, integer}], result = {res, rescode}}, + #ejabberd_commands{name = delete_old_messages_batch, tags = [purge], + desc = "Delete offline messages older than DAYS", + module = ?MODULE, function = delete_old_messages_batch, + args_desc = ["Name of host where messages should be deleted", + "Days to keep messages", + "Number of messages to delete per batch", + "Desired rate of messages to delete per minute"], + args_example = [<<"localhost">>, 31, 1000, 10000], + args = [{host, binary}, {days, integer}, {batch_size, integer}, {rate, integer}], + result = {res, restuple}, + result_desc = "Result tuple", + result_example = {ok, <<"Removal of 5000 messages in progress">>}}, + #ejabberd_commands{name = delete_old_messages_status, tags = [purge], + desc = "Status of delete old offline messages operation", + module = ?MODULE, function = delete_old_messages_status, + args_desc = ["Name of host where messages should be deleted"], + args_example = [<<"localhost">>], + args = [{host, binary}], + result = {status, string}, + result_desc = "Status test", + result_example = {"Operation in progress, delete 5000 messages"}}, + #ejabberd_commands{name = abort_delete_old_messages, tags = [purge], + desc = "Abort currently running delete old offline messages operation", + module = ?MODULE, function = delete_old_messages_abort, + args_desc = ["Name of host where operation should be aborted"], + args_example = [<<"localhost">>], + args = [{host, binary}], + result = {status, string}, + result_desc = "Status text", + result_example = {"Operation aborted"}}, #ejabberd_commands{name = export2sql, tags = [mnesia], desc = "Export virtual host information from Mnesia tables to SQL file", @@ -682,6 +712,51 @@ delete_old_messages(Days) -> {atomic, _} = mod_offline:remove_old_messages(Days, Host) end, ejabberd_option:hosts()). +delete_old_messages_batch(Server, Days, BatchSize, Rate) -> + LServer = jid:nameprep(Server), + Mod = gen_mod:db_mod(LServer, mod_offline), + case ejabberd_batch:register_task({spool, LServer}, 0, Rate, {LServer, Days, BatchSize}, + fun({L, Da, B} = S) -> + case Mod:remove_old_messages_batch(L, Da, B) of + {ok, Count} -> + {ok, S, Count}; + {error, _} = E -> + E + end + end) of + ok -> + {ok, ""}; + {error, in_progress} -> + {error, "Operation in progress"} + end. + +delete_old_messages_status(Server) -> + LServer = jid:nameprep(Server), + Msg = case ejabberd_batch:task_status({spool, LServer}) of + not_started -> + "Operation not started"; + {failed, Steps, Error} -> + io_lib:format("Operation failed after deleting ~p messages with error ~p", + [Steps, misc:format_val(Error)]); + {aborted, Steps} -> + io_lib:format("Operation was aborted after deleting ~p messages", + [Steps]); + {working, Steps} -> + io_lib:format("Operation in progress, deleted ~p messages", + [Steps]); + {completed, Steps} -> + io_lib:format("Operation was completed after deleting ~p messages", + [Steps]) + end, + lists:flatten(Msg). + +delete_old_messages_abort(Server) -> + LServer = jid:nameprep(Server), + case ejabberd_batch:abort_task({spool, LServer}) of + aborted -> "Operation aborted"; + not_started -> "No task running" + end. + %%% %%% Mnesia management %%% diff --git a/src/mod_offline_sql.erl b/src/mod_offline_sql.erl index 65465dffd..07978befd 100644 --- a/src/mod_offline_sql.erl +++ b/src/mod_offline_sql.erl @@ -30,7 +30,7 @@ -export([init/2, store_message/1, pop_messages/2, remove_expired_messages/1, remove_old_messages/2, remove_user/2, read_message_headers/2, read_message/3, remove_message/3, read_all_messages/2, - remove_all_messages/2, count_messages/2, import/1, export/1]). + remove_all_messages/2, count_messages/2, import/1, export/1, remove_old_messages_batch/3]). -include_lib("xmpp/include/xmpp.hrl"). -include("mod_offline.hrl"). @@ -112,6 +112,31 @@ remove_old_messages(Days, LServer) -> end, {atomic, ok}. +remove_old_messages_batch(LServer, Days, Batch) -> + case ejabberd_sql:sql_query( + LServer, + fun(pgsql, _) -> + ejabberd_sql:sql_query_t( + ?SQL("DELETE FROM spool" + " WHERE created_at <" + " NOW() - %(Days)d * INTERVAL '1 DAY' LIMIT %(Batch)d")); + (sqlite, _) -> + ejabberd_sql:sql_query_t( + ?SQL("DELETE FROM spool" + " WHERE created_at <" + " DATETIME('now', '-%(Days)d days') LIMIT %(Batch)d")); + (_, _) -> + ejabberd_sql:sql_query_t( + ?SQL("DELETE FROM spool" + " WHERE created_at < NOW() - INTERVAL %(Days)d DAY LIMIT %(Batch)d")) + end) + of + {updated, N} -> + {ok, N}; + Error -> + {error, Error} + end. + remove_user(LUser, LServer) -> ejabberd_sql:sql_query( LServer, From 5744d44e68a0b5da76cb8b8afe5177d6cbdb4b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 8 Apr 2022 18:26:07 +0200 Subject: [PATCH 227/440] Fix compatibility with older mix versions --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 4d1c451dc..461ae29c9 100644 --- a/mix.exs +++ b/mix.exs @@ -185,7 +185,7 @@ defmodule Ejabberd.MixProject do end defp elixir_required_version do - case {System.get_env("RELIVE", "false"), + case {Map.get(System.get_env(), "RELIVE", "false"), MapSet.member?(MapSet.new(System.argv()), "release")} do {"true", _} -> From feb2ad06647295711c0c2dc0cf08100c9bf25cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 8 Apr 2022 18:27:58 +0200 Subject: [PATCH 228/440] Don't use floor - doesn't exist in R19 --- src/ejabberd_batch.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_batch.erl b/src/ejabberd_batch.erl index 05750164c..406a79e21 100644 --- a/src/ejabberd_batch.erl +++ b/src/ejabberd_batch.erl @@ -195,7 +195,7 @@ work_loop(Task, JobState, JobFun, Rate, StartDate, CurrentProgress) -> SleepTime = max(0, NewProgress/Rate*60 - TimeSpent), receive abort -> ok - after floor(SleepTime*1000) -> + after round(SleepTime*1000) -> work_loop(Task, NewState, JobFun, Rate, StartDate, NewProgress) end; {error, Error} -> From 10481ed895016893ee9dc3fe23cd937fdc46ded6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 11 Apr 2022 15:33:06 +0200 Subject: [PATCH 229/440] mod_cron from ejabberd-contrib is another possible frontend to run commands --- src/ejabberd_access_permissions.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_access_permissions.erl b/src/ejabberd_access_permissions.erl index 6c4cc2ca7..d4c9dd018 100644 --- a/src/ejabberd_access_permissions.erl +++ b/src/ejabberd_access_permissions.erl @@ -344,10 +344,10 @@ validator(from) -> fun(L) when is_list(L) -> lists:map( fun({K, V}) -> {(econf:enum([tag]))(K), (econf:binary())(V)}; - (A) -> (econf:enum([ejabberd_xmlrpc, mod_http_api, ejabberd_ctl]))(A) + (A) -> (econf:enum([ejabberd_xmlrpc, mod_cron, mod_http_api, ejabberd_ctl]))(A) end, lists:flatten(L)); (A) -> - [(econf:enum([ejabberd_xmlrpc, mod_http_api, ejabberd_ctl]))(A)] + [(econf:enum([ejabberd_xmlrpc, mod_cron, mod_http_api, ejabberd_ctl]))(A)] end; validator(what) -> econf:and_then( From 19019bbe32be2074e3b78ac13fdfc30c260fff5e Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 12 Apr 2022 13:23:36 +0200 Subject: [PATCH 230/440] Add support for MUC room vCard in get_vcard commands --- src/mod_admin_extra.erl | 33 ++++++++++++++++++++++++++++++++- src/mod_muc_admin.erl | 1 + 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index 0b95c9ceb..cc1996bbd 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -1149,12 +1149,35 @@ set_vcard(User, Host, Name, SomeContent) -> set_vcard(User, Host, Name, Subname, SomeContent) -> set_vcard_content(User, Host, [Name, Subname], SomeContent). +%% +%% Room vcard + +is_muc_service(Domain) -> + try mod_muc_admin:get_room_serverhost(Domain) of + Domain -> false; + Service when is_binary(Service) -> true + catch _:{unregistered_route, _} -> + throw(error_wrong_hostname) + end. + +get_room_vcard(Name, Service) -> + case mod_muc_admin:get_room_options(Name, Service) of + [] -> + throw(error_no_vcard_found); + Opts -> + case lists:keyfind(<<"vcard">>, 1, Opts) of + false -> + throw(error_no_vcard_found); + {_, VCardRaw} -> + [fxml_stream:parse_element(VCardRaw)] + end + end. %% %% Internal vcard get_vcard_content(User, Server, Data) -> - case mod_vcard:get_vcard(jid:nodeprep(User), jid:nameprep(Server)) of + case get_vcard_element(User, Server) of [El|_] -> case get_vcard(Data, El) of [false] -> throw(error_no_value_found_in_vcard); @@ -1166,6 +1189,14 @@ get_vcard_content(User, Server, Data) -> throw(database_failure) end. +get_vcard_element(User, Server) -> + case is_muc_service(Server) of + true -> + get_room_vcard(User, Server); + false -> + mod_vcard:get_vcard(jid:nodeprep(User), jid:nameprep(Server)) + end. + get_vcard([<<"TEL">>, TelType], {_, _, _, OldEls}) -> {TakenEl, _NewEls} = take_vcard_tel(TelType, OldEls, [], not_found), [TakenEl]; diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 0015eb30a..5e7ae6696 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -42,6 +42,7 @@ web_menu_main/2, web_page_main/2, web_menu_host/3, subscribe_room/4, subscribe_room_many/3, unsubscribe_room/2, get_subscribers/2, + get_room_serverhost/1, web_page_host/3, mod_opt_type/1, mod_options/1, get_commands_spec/0, find_hosts/1]). From d8642fc7c2580e0927e6700ad9c63034813dc4c6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 13 Apr 2022 17:23:29 +0200 Subject: [PATCH 231/440] Fix syntax of some commands' result_example --- src/ejabberd_admin.erl | 4 ++-- src/mod_mam.erl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index c8dda3241..cbad89a9c 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -340,7 +340,7 @@ get_commands_spec() -> args = [{host, binary}], result = {status, string}, result_desc = "Status test", - result_example = {"Operation in progress, delete 5000 messages"}}, + result_example = "Operation in progress, delete 5000 messages"}, #ejabberd_commands{name = abort_delete_old_messages, tags = [purge], desc = "Abort currently running delete old offline messages operation", module = ?MODULE, function = delete_old_messages_abort, @@ -349,7 +349,7 @@ get_commands_spec() -> args = [{host, binary}], result = {status, string}, result_desc = "Status text", - result_example = {"Operation aborted"}}, + result_example = "Operation aborted"}, #ejabberd_commands{name = export2sql, tags = [mnesia], desc = "Export virtual host information from Mnesia tables to SQL file", diff --git a/src/mod_mam.erl b/src/mod_mam.erl index ffbd1d4eb..fd292736b 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -1453,7 +1453,7 @@ get_commands_spec() -> args = [{host, binary}], result = {status, string}, result_desc = "Status test", - result_example = {"Operation in progress, delete 5000 messages"}}, + result_example = "Operation in progress, delete 5000 messages"}, #ejabberd_commands{name = abort_delete_old_mam_messages, tags = [purge], desc = "Abort currently running delete old MAM messages operation", module = ?MODULE, function = delete_old_messages_abort, @@ -1462,7 +1462,7 @@ get_commands_spec() -> args = [{host, binary}], result = {status, string}, result_desc = "Status text", - result_example = {"Operation aborted"}}, + result_example = "Operation aborted"}, #ejabberd_commands{name = remove_mam_for_user, tags = [mam], desc = "Remove mam archive for user", module = ?MODULE, function = remove_mam_for_user, From 87445bc74be490899e3878c758718ba74804e297 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 13 Apr 2022 16:34:57 +0200 Subject: [PATCH 232/440] Clarify mod_offline's use_mam_for_storage option --- src/mod_offline.erl | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 70e7403ed..77610f5a7 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -1294,20 +1294,18 @@ mod_doc() -> {use_mam_for_storage, #{value => "true | false", desc => - ?T("This is an experimental option. Enabling this option " - "will make 'mod_offline' not use the former spool " - "table for storing MucSub offline messages, but will " - "use the archive table instead. This use of the archive " - "table is cleaner and it makes it possible for clients " - "to slowly drop the former offline use case and rely on " - "message archive instead. It also further reduces the " - "storage required when you enabled MucSub. Enabling this " + ?T("This is an experimental option. Enabling this option, " + "'mod_offline' uses the 'mod_mam' archive table instead " + "of its own spool table to retrieve the messages received " + "when the user was offline. This allows client " + "developers to slowly drop XEP-0160 and rely on XEP-0313 " + "instead. It also further reduces the " + "storage required when you enable MucSub. Enabling this " "option has a known drawback for the moment: most of " "flexible message retrieval queries don't work (those that " "allow retrieval/deletion of messages by id), but this " "specification is not widely used. The default value " - "is 'false' to keep former behaviour as default and " - "ensure this option is disabled.")}}, + "is 'false' to keep former behaviour as default.")}}, {bounce_groupchat, #{value => "true | false", desc => From e59043db2cd8775dd4cf4c1c277b2eb1ec7846e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 20 Apr 2022 19:07:46 +0200 Subject: [PATCH 233/440] Make oauth_revoke_token work with all backends --- src/ejabberd_oauth.erl | 20 ++++++++++++++------ src/ejabberd_oauth_mnesia.erl | 19 ++++++++++++------- src/ejabberd_oauth_rest.erl | 6 +++++- src/ejabberd_oauth_sql.erl | 22 ++++++++++++++++------ 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/ejabberd_oauth.erl b/src/ejabberd_oauth.erl index 1d26798b0..2e812d758 100644 --- a/src/ejabberd_oauth.erl +++ b/src/ejabberd_oauth.erl @@ -65,6 +65,7 @@ -callback init() -> any(). -callback store(#oauth_token{}) -> ok | {error, any()}. -callback lookup(binary()) -> {ok, #oauth_token{}} | error. +-callback revoke(binary()) -> ok | {error, binary()}. -callback clean(non_neg_integer()) -> any(). -record(oauth_ctx, { @@ -99,12 +100,12 @@ get_commands_spec() -> result = {tokens, {list, {token, {tuple, [{token, string}, {user, string}, {scope, string}, {expires_in, string}]}}}} }, #ejabberd_commands{name = oauth_revoke_token, tags = [oauth], - desc = "Revoke authorization for a token (only Mnesia)", + desc = "Revoke authorization for a token", module = ?MODULE, function = oauth_revoke_token, - args = [{token, string}], + args = [{token, binary}], policy = restricted, - result = {tokens, {list, {token, {tuple, [{token, string}, {user, string}, {scope, string}, {expires_in, string}]}}}}, - result_desc = "List of remaining tokens" + result = {res, restuple}, + result_desc = "Result code" }, #ejabberd_commands{name = oauth_add_client_password, tags = [oauth], desc = "Add OAUTH client_id with password grant type", @@ -160,8 +161,15 @@ oauth_list_tokens() -> oauth_revoke_token(Token) -> - ok = mnesia:dirty_delete(oauth_token, list_to_binary(Token)), - oauth_list_tokens(). + DBMod = get_db_backend(), + case DBMod:revoke(Token) of + ok -> + ets_cache:delete(oauth_cache, Token, + ejabberd_cluster:get_nodes()), + {ok, ""}; + Other -> + Other + end. oauth_add_client_password(ClientID, ClientName, Secret) -> DBMod = get_db_backend(), diff --git a/src/ejabberd_oauth_mnesia.erl b/src/ejabberd_oauth_mnesia.erl index 8bb2efba7..f4060702e 100644 --- a/src/ejabberd_oauth_mnesia.erl +++ b/src/ejabberd_oauth_mnesia.erl @@ -28,13 +28,13 @@ -behaviour(ejabberd_oauth). -export([init/0, - store/1, - lookup/1, - clean/1, - lookup_client/1, - store_client/1, - remove_client/1, - use_cache/0]). + store/1, + lookup/1, + clean/1, + lookup_client/1, + store_client/1, + remove_client/1, + use_cache/0, revoke/1]). -include("ejabberd_oauth.hrl"). @@ -68,6 +68,11 @@ lookup(Token) -> error end. + +-spec revoke(binary()) -> ok | error. +revoke(Token) -> + mnesia:dirty_delete(oauth_token, Token). + clean(TS) -> F = fun() -> Ts = mnesia:select( diff --git a/src/ejabberd_oauth_rest.erl b/src/ejabberd_oauth_rest.erl index 9182ec256..a170826fb 100644 --- a/src/ejabberd_oauth_rest.erl +++ b/src/ejabberd_oauth_rest.erl @@ -32,7 +32,7 @@ lookup/1, clean/1, lookup_client/1, - store_client/1]). + store_client/1, revoke/1]). -include("ejabberd_oauth.hrl"). -include("logger.hrl"). @@ -87,6 +87,10 @@ lookup(Token) -> end end. +-spec revoke(binary()) -> ok | {error, binary()}. +revoke(_Token) -> + {error, <<"not available">>}. + clean(_TS) -> ok. diff --git a/src/ejabberd_oauth_sql.erl b/src/ejabberd_oauth_sql.erl index 89dcc590c..b73f56b78 100644 --- a/src/ejabberd_oauth_sql.erl +++ b/src/ejabberd_oauth_sql.erl @@ -28,12 +28,12 @@ -behaviour(ejabberd_oauth). -export([init/0, - store/1, - lookup/1, - clean/1, - lookup_client/1, - store_client/1, - remove_client/1]). + store/1, + lookup/1, + clean/1, + lookup_client/1, + store_client/1, + remove_client/1, revoke/1]). -include("ejabberd_oauth.hrl"). -include("ejabberd_sql_pt.hrl"). @@ -78,6 +78,16 @@ lookup(Token) -> error end. +revoke(Token) -> + case ejabberd_sql:sql_query( + ejabberd_config:get_myname(), + ?SQL("delete from oauth_token where token=%(Token)s")) of + {error, _} -> + {error, <<"db error">>}; + _ -> + ok + end. + clean(TS) -> ejabberd_sql:sql_query( ejabberd_config:get_myname(), From 155261f78ae1008cf587720a043412b781fb3606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 20 Apr 2022 19:20:16 +0200 Subject: [PATCH 234/440] Fix dialyzer warning --- src/ejabberd_oauth_mnesia.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_oauth_mnesia.erl b/src/ejabberd_oauth_mnesia.erl index f4060702e..edb6dd52c 100644 --- a/src/ejabberd_oauth_mnesia.erl +++ b/src/ejabberd_oauth_mnesia.erl @@ -69,7 +69,7 @@ lookup(Token) -> end. --spec revoke(binary()) -> ok | error. +-spec revoke(binary()) -> ok | {error, binary()}. revoke(Token) -> mnesia:dirty_delete(oauth_token, Token). From 74e86611abb92e545870c88a25fbee1d960497d7 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 21 Apr 2022 14:37:01 +0300 Subject: [PATCH 235/440] Stop empty MUC rooms 30 seconds after creation --- src/mod_muc_room.erl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index fd2c931a3..84ff8252f 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -85,6 +85,7 @@ -define(MUC_HAT_LIST_CMD, <<"p1:hats#list">>). -define(MAX_HATS_USERS, 100). -define(MAX_HATS_PER_USER, 10). +-define(CLEAN_ROOM_TIMEOUT, 30000). %-define(DBGFSM, true). @@ -309,6 +310,8 @@ init([Host, ServerHost, Access, Room, HistorySize, add_to_log(room_existence, created, State1), add_to_log(room_existence, started, State1), ejabberd_hooks:run(start_room, ServerHost, [ServerHost, Room, Host]), + erlang:send_after(?CLEAN_ROOM_TIMEOUT, self(), + close_room_if_temporary_and_empty), {ok, normal_state, reset_hibernate_timer(State1)}; init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts, QueueType]) -> process_flag(trap_exit, true), @@ -325,6 +328,8 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts, QueueType]) add_to_log(room_existence, started, State), ejabberd_hooks:run(start_room, ServerHost, [ServerHost, Room, Host]), State1 = cleanup_affiliations(State), + erlang:send_after(?CLEAN_ROOM_TIMEOUT, self(), + close_room_if_temporary_and_empty), {ok, normal_state, reset_hibernate_timer(State1)}. normal_state({route, <<"">>, @@ -891,6 +896,8 @@ handle_info({captcha_failed, From}, normal_state, StateData end, {next_state, normal_state, NewState}; +handle_info(close_room_if_temporary_and_empty, _StateName, StateData) -> + close_room_if_temporary_and_empty(StateData); handle_info(shutdown, _StateName, StateData) -> {stop, shutdown, StateData}; handle_info({iq_reply, #iq{type = Type, sub_els = Els}, From f61f5beb5b8e6003f66c7b4daf67793908668da0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 21 Apr 2022 11:40:48 +0200 Subject: [PATCH 236/440] Copy include/ files for ejabberd, deps and otp, as "mix release" lacks that --- mix.exs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mix.exs b/mix.exs index 461ae29c9..7adf2e869 100644 --- a/mix.exs +++ b/mix.exs @@ -301,6 +301,21 @@ defmodule Ejabberd.MixProject do Mix.Generator.copy_file("sql/#{x}", "#{ro}/lib/ejabberd-#{release.version}/priv/sql/#{x}") end) + File.cp_r!("include", "#{ro}/lib/ejabberd-#{release.version}/include") + for {name, details} <- Map.to_list(release.applications) do + {_, is_otp_app} = List.keyfind(details, :otp_app?, 0) + {_, vsn} = List.keyfind(details, :vsn, 0) + {_, path} = List.keyfind(details, :path, 0) + source_dir = case is_otp_app do + :true -> "#{path}/include" + :false -> "deps/#{name}/include" + end + target_dir = "#{ro}/lib/#{name}-#{vsn}/include" + File.exists?(source_dir) + && File.mkdir_p(target_dir) + && File.cp_r!(source_dir, target_dir) + end + Mix.Generator.create_directory("#{ro}/var/lib/ejabberd") case Mix.env() do From f4959c8b281211e622aae118aa30f63262a2a51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Sautret?= Date: Tue, 26 Apr 2022 18:56:38 +0200 Subject: [PATCH 237/440] Don't send ping if resource is gone --- src/mod_ping.erl | 66 +++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 28f7a57b0..da6733617 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -138,29 +138,37 @@ handle_info({iq_reply, timeout, JID}, State) -> ejabberd_hooks:run(user_ping_timeout, State#state.host, [JID]), Timers = case State#state.timeout_action of - kill -> - #jid{user = User, server = Server, - resource = Resource} = - JID, - case ejabberd_sm:get_session_pid(User, Server, Resource) - of - Pid when is_pid(Pid) -> ejabberd_c2s:close(Pid, ping_timeout); - _ -> ok - end, - del_timer(JID, State#state.timers); - _ -> - State#state.timers - end, + kill -> + #jid{user = User, server = Server, + resource = Resource} = + JID, + case ejabberd_sm:get_session_pid(User, Server, Resource) of + Pid when is_pid(Pid) -> + ejabberd_c2s:close(Pid, ping_timeout); + _ -> + ok + end, + del_timer(JID, State#state.timers); + _ -> + State#state.timers + end, {noreply, State#state{timers = Timers}}; handle_info({timeout, _TRef, {ping, JID}}, State) -> - Host = State#state.host, - From = jid:make(Host), - IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]}, - ejabberd_router:route_iq(IQ, JID, - gen_mod:get_module_proc(Host, ?MODULE), - State#state.ping_ack_timeout), - Timers = add_timer(JID, State#state.ping_interval, - State#state.timers), + Timers = case ejabberd_sm:get_session_pid(JID#jid.luser, + JID#jid.lserver, + JID#jid.lresource) of + none -> + del_timer(JID, State#state.timers); + _ -> + Host = State#state.host, + From = jid:make(Host), + IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]}, + ejabberd_router:route_iq(IQ, JID, + gen_mod:get_module_proc(Host, ?MODULE), + State#state.ping_ack_timeout), + add_timer(JID, State#state.ping_interval, + State#state.timers) + end, {noreply, State#state{timers = Timers}}; handle_info(Info, State) -> ?WARNING_MSG("Unexpected info: ~p", [Info]), @@ -243,10 +251,10 @@ unregister_iq_handlers(Host) -> add_timer(JID, Interval, Timers) -> LJID = jid:tolower(JID), NewTimers = case maps:find(LJID, Timers) of - {ok, OldTRef} -> - misc:cancel_timer(OldTRef), - maps:remove(LJID, Timers); - _ -> Timers + {ok, OldTRef} -> + misc:cancel_timer(OldTRef), + maps:remove(LJID, Timers); + _ -> Timers end, TRef = erlang:start_timer(Interval, self(), {ping, JID}), maps:put(LJID, TRef, NewTimers). @@ -255,10 +263,10 @@ add_timer(JID, Interval, Timers) -> del_timer(JID, Timers) -> LJID = jid:tolower(JID), case maps:find(LJID, Timers) of - {ok, TRef} -> - misc:cancel_timer(TRef), - maps:remove(LJID, Timers); - _ -> Timers + {ok, TRef} -> + misc:cancel_timer(TRef), + maps:remove(LJID, Timers); + _ -> Timers end. depends(_Host, _Opts) -> From 6fd4315a0c78dddabd509bfb221f2be459dcfe76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 28 Apr 2022 09:51:40 +0200 Subject: [PATCH 238/440] Guard agains erlang:system_info(logical_processors) not always returning number --- src/extauth.erl | 5 +---- src/misc.erl | 14 +++++++++++--- src/mod_muc.erl | 4 ++-- src/mod_muc_sup.erl | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/extauth.erl b/src/extauth.erl index 16a5e3f7c..64c1b9ebb 100644 --- a/src/extauth.erl +++ b/src/extauth.erl @@ -99,10 +99,7 @@ worker_name(Pool, N) -> -spec pool_size(binary()) -> pos_integer(). pool_size(Host) -> case ejabberd_option:extauth_pool_size(Host) of - undefined -> - try erlang:system_info(logical_processors) - catch _:_ -> 1 - end; + undefined -> misc:logical_processors(); Size -> Size end. diff --git a/src/misc.erl b/src/misc.erl index 1cfcc2182..072b74681 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -42,7 +42,8 @@ is_mucsub_message/1, best_match/2, pmap/2, peach/2, format_exception/4, get_my_ipv4_address/0, get_my_ipv6_address/0, parse_ip_mask/1, crypto_hmac/3, crypto_hmac/4, uri_parse/1, - match_ip_mask/3, format_hosts_list/1, format_cycle/1, delete_dir/1]). + match_ip_mask/3, format_hosts_list/1, format_cycle/1, delete_dir/1, + logical_processors/0]). %% Deprecated functions -export([decode_base64/1, encode_base64/1]). @@ -451,9 +452,16 @@ best_match(Pattern, Opts) -> end, #{}, Opts), element(2, lists:min(Ds)). +-spec logical_processors() -> non_neg_integer(). +logical_processors() -> + case erlang:system_info(logical_processors) of + unknown -> 1; + V -> V + end. + -spec pmap(fun((T1) -> T2), [T1]) -> [T2]. pmap(Fun, [_,_|_] = List) -> - case erlang:system_info(logical_processors) of + case logical_processors() of 1 -> lists:map(Fun, List); _ -> Self = self(), @@ -477,7 +485,7 @@ pmap(Fun, List) -> -spec peach(fun((T) -> any()), [T]) -> ok. peach(Fun, [_,_|_] = List) -> - case erlang:system_info(logical_processors) of + case logical_processors() of 1 -> lists:foreach(Fun, List); _ -> Self = self(), diff --git a/src/mod_muc.erl b/src/mod_muc.erl index ec55e3c14..a6e0c6030 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -166,7 +166,7 @@ reload(ServerHost, NewOpts, OldOpts) -> fun(I) -> ?GEN_SERVER:cast(procname(ServerHost, I), {reload, AddHosts, DelHosts, NewHosts}) - end, lists:seq(1, erlang:system_info(logical_processors))), + end, lists:seq(1, misc:logical_processors())), load_permanent_rooms(AddHosts, ServerHost, NewOpts), shutdown_rooms(ServerHost, DelHosts, OldRMod), lists:foreach( @@ -193,7 +193,7 @@ procname(Host, I) when is_integer(I) -> <<(atom_to_binary(?MODULE, latin1))/binary, "_", Host/binary, "_", (integer_to_binary(I))/binary>>, utf8); procname(Host, RoomHost) -> - Cores = erlang:system_info(logical_processors), + Cores = misc:logical_processors(), I = erlang:phash2(RoomHost, Cores) + 1, procname(Host, I). diff --git a/src/mod_muc_sup.erl b/src/mod_muc_sup.erl index 11a147bb5..2c2d62313 100644 --- a/src/mod_muc_sup.erl +++ b/src/mod_muc_sup.erl @@ -51,7 +51,7 @@ procname(Host) -> %%% Supervisor callbacks %%%=================================================================== init([Host]) -> - Cores = erlang:system_info(logical_processors), + Cores = misc:logical_processors(), Specs = lists:foldl( fun(I, Acc) -> [#{id => mod_muc:procname(Host, I), From b34291762a433833c944f7d8edf83add853f67b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 28 Apr 2022 10:18:29 +0200 Subject: [PATCH 239/440] Remove dialyzer warning --- src/misc.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/misc.erl b/src/misc.erl index 072b74681..b502971a0 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -455,8 +455,8 @@ best_match(Pattern, Opts) -> -spec logical_processors() -> non_neg_integer(). logical_processors() -> case erlang:system_info(logical_processors) of - unknown -> 1; - V -> V + V when is_integer(V), V >= 2 -> V; + _ -> 1 end. -spec pmap(fun((T1) -> T2), [T1]) -> [T2]. From 69a5a22810ffda701507dc88cfa03af119c3b471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Sautret?= Date: Thu, 28 Apr 2022 14:54:41 +0200 Subject: [PATCH 240/440] Delete ping timer if resource is gone after the ping has been sent --- src/mod_ping.erl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mod_ping.erl b/src/mod_ping.erl index da6733617..2ee5133fa 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -132,6 +132,14 @@ handle_cast(Msg, State) -> ?WARNING_MSG("Unexpected cast: ~p", [Msg]), {noreply, State}. +handle_info({iq_reply, #iq{type = error} = IQ, JID}, State) -> + Timers = case xmpp:get_error(IQ) of + #stanza_error{type=cancel, reason='service-unavailable'} -> + del_timer(JID, State#state.timers); + _ -> + State#state.timers + end, + {noreply, State#state{timers = Timers}}; handle_info({iq_reply, #iq{}, _JID}, State) -> {noreply, State}; handle_info({iq_reply, timeout, JID}, State) -> From 881cc421683ef243ab150a966774eff44de95d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 29 Apr 2022 11:58:38 +0200 Subject: [PATCH 241/440] Attach meta field with real jid to mucsub subscription events --- src/mod_muc_room.erl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 84ff8252f..8271f5fd7 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -5140,8 +5140,9 @@ send_subscriptions_change_notifications(From, Nick, Type, State) -> items = [#ps_item{ id = p1_rand:get_string(), sub_els = [Payload1]}]}}]}, + Packet1a = xmpp:put_meta(Packet1, mucsub_subscriber_jid, From), ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WJ, Packet1, false); + WJ, Packet1a, false); true -> ok end, if WN /= [] -> @@ -5156,8 +5157,9 @@ send_subscriptions_change_notifications(From, Nick, Type, State) -> items = [#ps_item{ id = p1_rand:get_string(), sub_els = [Payload2]}]}}]}, + Packet2a = xmpp:put_meta(Packet2, mucsub_subscriber_jid, From), ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WN, Packet2, false); + WN, Packet2a, false); true -> ok end. From d65d04cc9a1bc1b4846c2e5d3a5b30c4a2f1c6d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 29 Apr 2022 12:35:16 +0200 Subject: [PATCH 242/440] Compile elixir_logger_backend only when lager is used --- src/elixir_logger_backend.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/elixir_logger_backend.erl b/src/elixir_logger_backend.erl index 0db3ee517..4db60789d 100644 --- a/src/elixir_logger_backend.erl +++ b/src/elixir_logger_backend.erl @@ -25,6 +25,7 @@ -module(elixir_logger_backend). -ifdef(ELIXIR_ENABLED). +-ifdef(LAGER). -behaviour(gen_event). @@ -123,3 +124,4 @@ severity_to_level(alert) -> error; severity_to_level(emergency) -> error. -endif. +-endif. From 11574f0a43ff5dbdd297815c6c48fc8d976f1631 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 1 May 2022 15:26:21 +0200 Subject: [PATCH 243/440] mod_push: Fix notifications for pending sessions Fix the problem that no push notifications were triggered in the case where all of the following conditions applied: - The XEP-0198 session has been resumed at least once. - The XEP-0198 session is pending (i.e., the client is disconnected). - The message wasn't stored in the user's MAM archive (e.g., because it was of type "groupchat"). The problem was introduced in cd336369a5691da8289574f402fa2311b6dc027c. Many thanks to Friedrich Altheide for reporting the issue and to Thilo Molitor for his help with tracking it down. --- src/mod_push.erl | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/mod_push.erl b/src/mod_push.erl index f3e0479f3..2791e36dc 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -366,7 +366,9 @@ enable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, {ok, _} -> ?INFO_MSG("Enabling push notifications for ~ts", [jid:encode(JID)]), - ejabberd_c2s:cast(PID, push_enable); + ejabberd_c2s:cast(PID, {push_enable, TS}), + ejabberd_sm:set_user_info(LUser, LServer, LResource, + push_id, TS); {error, _} = Err -> ?ERROR_MSG("Cannot enable push for ~ts: database error", [jid:encode(JID)]), @@ -385,6 +387,7 @@ disable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, {_TS, PID} -> ?INFO_MSG("Disabling push notifications for ~ts", [jid:encode(JID)]), + ejabberd_sm:del_user_info(LUser, LServer, LResource, push_id), ejabberd_c2s:cast(PID, push_disable); none -> ?WARNING_MSG("Session not found while disabling push for ~ts", @@ -402,7 +405,7 @@ disable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, -spec c2s_stanza(c2s_state(), xmpp_element() | xmlel(), term()) -> c2s_state(). c2s_stanza(State, #stream_error{}, _SendResult) -> State; -c2s_stanza(#{push_enabled := true, mgmt_state := pending} = State, +c2s_stanza(#{push_session_id := _TS, mgmt_state := pending} = State, Pkt, _SendResult) -> ?DEBUG("Notifying client of stanza", []), notify(State, Pkt, get_direction(Pkt)), @@ -447,7 +450,7 @@ offline_message(Acc) -> Acc. -spec c2s_session_pending(c2s_state()) -> c2s_state(). -c2s_session_pending(#{push_enabled := true, mgmt_queue := Queue} = State) -> +c2s_session_pending(#{push_session_id := _TS, mgmt_queue := Queue} = State) -> case p1_queue:len(Queue) of Len when Len > 0 -> ?DEBUG("Notifying client of unacknowledged stanza(s)", []), @@ -465,16 +468,16 @@ c2s_session_pending(State) -> State. -spec c2s_copy_session(c2s_state(), c2s_state()) -> c2s_state(). -c2s_copy_session(State, #{push_enabled := true}) -> - State#{push_enabled => true}; +c2s_copy_session(State, #{push_session_id := TS}) -> + State#{push_session_id => TS}; c2s_copy_session(State, _) -> State. -spec c2s_handle_cast(c2s_state(), any()) -> c2s_state() | {stop, c2s_state()}. -c2s_handle_cast(State, push_enable) -> - {stop, State#{push_enabled => true}}; +c2s_handle_cast(State, {push_enable, TS}) -> + {stop, State#{push_session_id => TS}}; c2s_handle_cast(State, push_disable) -> - {stop, maps:remove(push_enabled, State)}; + {stop, maps:remove(push_session_id, State)}; c2s_handle_cast(State, _Msg) -> State. @@ -489,10 +492,8 @@ remove_user(LUser, LServer) -> %% Generate push notifications. %%-------------------------------------------------------------------- -spec notify(c2s_state(), xmpp_element() | xmlel() | none, direction()) -> ok. -notify(#{jid := #jid{luser = LUser, lserver = LServer}, - sid := {TS, _}}, - Pkt, Dir) -> - case lookup_session(LUser, LServer, TS) of +notify(#{jid := #jid{luser = LUser, lserver = LServer}} = State, Pkt, Dir) -> + case lookup_session(LUser, LServer, State) of {ok, Client} -> notify(LUser, LServer, [Client], Pkt, Dir); _Err -> @@ -585,9 +586,9 @@ store_session(LUser, LServer, TS, PushJID, Node, XData) -> Mod:store_session(LUser, LServer, TS, PushJID, Node, XData) end. --spec lookup_session(binary(), binary(), timestamp()) +-spec lookup_session(binary(), binary(), c2s_state()) -> {ok, push_session()} | error | {error, err_reason()}. -lookup_session(LUser, LServer, TS) -> +lookup_session(LUser, LServer, #{push_session_id := TS}) -> Mod = gen_mod:db_mod(LServer, ?MODULE), case use_cache(Mod, LServer) of true -> @@ -679,9 +680,17 @@ delete_sessions(LUser, LServer, LookupFun, Mod) -> -spec drop_online_sessions(binary(), binary(), [push_session()]) -> [push_session()]. drop_online_sessions(LUser, LServer, Clients) -> - SessIDs = ejabberd_sm:get_session_sids(LUser, LServer), + OnlineTSs = lists:filtermap( + fun({_, Info}) -> + case proplists:get_value(push_id, Info) of + OnlineID = {_, _, _} -> + {true, OnlineID}; + undefined -> + false + end + end, ejabberd_sm:get_user_info(LUser, LServer)), [Client || {TS, _, _, _} = Client <- Clients, - lists:keyfind(TS, 1, SessIDs) == false]. + not lists:member(TS, OnlineTSs)]. -spec make_summary(binary(), xmpp_element() | xmlel() | none, direction()) -> xdata() | undefined. From a30d5875ed3ab5e56a904aeac5a3ff4a45a0ae8a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 1 May 2022 15:49:22 +0200 Subject: [PATCH 244/440] mod_push: Rename "timestamp" to "push session ID" The fact that mod_push uses a timestamp as a push session ID is just an implementation detail. Rename things accordingly to avoid confusion. However, stick to "timestamp" in the storage modules, as it corresponds to the database column names/types, there. --- src/mod_push.erl | 83 ++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/mod_push.erl b/src/mod_push.erl index 2791e36dc..dc541bd3c 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -57,19 +57,19 @@ -define(PUSH_CACHE, push_cache). -type c2s_state() :: ejabberd_c2s:state(). --type timestamp() :: erlang:timestamp(). --type push_session() :: {timestamp(), ljid(), binary(), xdata()}. +-type push_session_id() :: erlang:timestamp(). +-type push_session() :: {push_session_id(), ljid(), binary(), xdata()}. -type err_reason() :: notfound | db_failure. -type direction() :: send | recv | undefined. -callback init(binary(), gen_mod:opts()) -> any(). --callback store_session(binary(), binary(), timestamp(), jid(), binary(), +-callback store_session(binary(), binary(), push_session_id(), jid(), binary(), xdata()) -> {ok, push_session()} | {error, err_reason()}. -callback lookup_session(binary(), binary(), jid(), binary()) -> {ok, push_session()} | {error, err_reason()}. --callback lookup_session(binary(), binary(), timestamp()) +-callback lookup_session(binary(), binary(), push_session_id()) -> {ok, push_session()} | {error, err_reason()}. -callback lookup_sessions(binary(), binary(), jid()) -> {ok, [push_session()]} | {error, err_reason()}. @@ -77,7 +77,7 @@ -> {ok, [push_session()]} | {error, err_reason()}. -callback lookup_sessions(binary()) -> {ok, [push_session()]} | {error, err_reason()}. --callback delete_session(binary(), binary(), timestamp()) +-callback delete_session(binary(), binary(), push_session_id()) -> ok | {error, err_reason()}. -callback delete_old_sessions(binary() | global, erlang:timestamp()) -> ok | {error, err_reason()}. @@ -361,14 +361,14 @@ process_iq(IQ) -> enable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, PushJID, Node, XData) -> case ejabberd_sm:get_session_sid(LUser, LServer, LResource) of - {TS, PID} -> - case store_session(LUser, LServer, TS, PushJID, Node, XData) of + {ID, PID} -> + case store_session(LUser, LServer, ID, PushJID, Node, XData) of {ok, _} -> ?INFO_MSG("Enabling push notifications for ~ts", [jid:encode(JID)]), - ejabberd_c2s:cast(PID, {push_enable, TS}), + ejabberd_c2s:cast(PID, {push_enable, ID}), ejabberd_sm:set_user_info(LUser, LServer, LResource, - push_id, TS); + push_id, ID); {error, _} = Err -> ?ERROR_MSG("Cannot enable push for ~ts: database error", [jid:encode(JID)]), @@ -383,8 +383,8 @@ enable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, -spec disable(jid(), jid(), binary() | undefined) -> ok | {error, err_reason()}. disable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, PushJID, Node) -> - case ejabberd_sm:get_session_sid(LUser, LServer, LResource) of - {_TS, PID} -> + case ejabberd_sm:get_session_pid(LUser, LServer, LResource) of + PID when is_pid(PID) -> ?INFO_MSG("Disabling push notifications for ~ts", [jid:encode(JID)]), ejabberd_sm:del_user_info(LUser, LServer, LResource, push_id), @@ -405,7 +405,7 @@ disable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, -spec c2s_stanza(c2s_state(), xmpp_element() | xmlel(), term()) -> c2s_state(). c2s_stanza(State, #stream_error{}, _SendResult) -> State; -c2s_stanza(#{push_session_id := _TS, mgmt_state := pending} = State, +c2s_stanza(#{push_session_id := _ID, mgmt_state := pending} = State, Pkt, _SendResult) -> ?DEBUG("Notifying client of stanza", []), notify(State, Pkt, get_direction(Pkt)), @@ -450,7 +450,7 @@ offline_message(Acc) -> Acc. -spec c2s_session_pending(c2s_state()) -> c2s_state(). -c2s_session_pending(#{push_session_id := _TS, mgmt_queue := Queue} = State) -> +c2s_session_pending(#{push_session_id := _ID, mgmt_queue := Queue} = State) -> case p1_queue:len(Queue) of Len when Len > 0 -> ?DEBUG("Notifying client of unacknowledged stanza(s)", []), @@ -468,14 +468,14 @@ c2s_session_pending(State) -> State. -spec c2s_copy_session(c2s_state(), c2s_state()) -> c2s_state(). -c2s_copy_session(State, #{push_session_id := TS}) -> - State#{push_session_id => TS}; +c2s_copy_session(State, #{push_session_id := ID}) -> + State#{push_session_id => ID}; c2s_copy_session(State, _) -> State. -spec c2s_handle_cast(c2s_state(), any()) -> c2s_state() | {stop, c2s_state()}. -c2s_handle_cast(State, {push_enable, TS}) -> - {stop, State#{push_session_id => TS}}; +c2s_handle_cast(State, {push_enable, ID}) -> + {stop, State#{push_session_id => ID}}; c2s_handle_cast(State, push_disable) -> {stop, maps:remove(push_session_id, State)}; c2s_handle_cast(State, _Msg) -> @@ -504,7 +504,7 @@ notify(#{jid := #jid{luser = LUser, lserver = LServer}} = State, Pkt, Dir) -> xmpp_element() | xmlel() | none, direction()) -> ok. notify(LUser, LServer, Clients, Pkt, Dir) -> lists:foreach( - fun({TS, PushLJID, Node, XData}) -> + fun({ID, PushLJID, Node, XData}) -> HandleResponse = fun(#iq{type = result}) -> ?DEBUG("~ts accepted notification for ~ts@~ts (~ts)", @@ -518,7 +518,7 @@ notify(LUser, LServer, Clients, Pkt, Dir) -> LServer, Node, Reason]); {Type, Reason} -> spawn(?MODULE, delete_session, - [LUser, LServer, TS]), + [LUser, LServer, ID]), ?WARNING_MSG("~ts rejected notification for " "~ts@~ts (~ts), disabling push: ~ts " "(~ts)", @@ -566,9 +566,9 @@ is_incoming_chat_msg(_Stanza) -> %%-------------------------------------------------------------------- %% Internal functions. %%-------------------------------------------------------------------- --spec store_session(binary(), binary(), timestamp(), jid(), binary(), xdata()) - -> {ok, push_session()} | {error, err_reason()}. -store_session(LUser, LServer, TS, PushJID, Node, XData) -> +-spec store_session(binary(), binary(), push_session_id(), jid(), binary(), + xdata()) -> {ok, push_session()} | {error, err_reason()}. +store_session(LUser, LServer, ID, PushJID, Node, XData) -> Mod = gen_mod:db_mod(LServer, ?MODULE), delete_session(LUser, LServer, PushJID, Node), case use_cache(Mod, LServer) of @@ -577,26 +577,26 @@ store_session(LUser, LServer, TS, PushJID, Node, XData) -> cache_nodes(Mod, LServer)), ets_cache:update( ?PUSH_CACHE, - {LUser, LServer, TS}, {ok, {TS, PushJID, Node, XData}}, + {LUser, LServer, ID}, {ok, {ID, PushJID, Node, XData}}, fun() -> - Mod:store_session(LUser, LServer, TS, PushJID, Node, + Mod:store_session(LUser, LServer, ID, PushJID, Node, XData) end, cache_nodes(Mod, LServer)); false -> - Mod:store_session(LUser, LServer, TS, PushJID, Node, XData) + Mod:store_session(LUser, LServer, ID, PushJID, Node, XData) end. -spec lookup_session(binary(), binary(), c2s_state()) -> {ok, push_session()} | error | {error, err_reason()}. -lookup_session(LUser, LServer, #{push_session_id := TS}) -> +lookup_session(LUser, LServer, #{push_session_id := ID}) -> Mod = gen_mod:db_mod(LServer, ?MODULE), case use_cache(Mod, LServer) of true -> ets_cache:lookup( - ?PUSH_CACHE, {LUser, LServer, TS}, - fun() -> Mod:lookup_session(LUser, LServer, TS) end); + ?PUSH_CACHE, {LUser, LServer, ID}, + fun() -> Mod:lookup_session(LUser, LServer, ID) end); false -> - Mod:lookup_session(LUser, LServer, TS) + Mod:lookup_session(LUser, LServer, ID) end. -spec lookup_sessions(binary(), binary()) -> {ok, [push_session()]} | {error, err_reason()}. @@ -611,16 +611,17 @@ lookup_sessions(LUser, LServer) -> Mod:lookup_sessions(LUser, LServer) end. --spec delete_session(binary(), binary(), timestamp()) -> ok | {error, db_failure}. -delete_session(LUser, LServer, TS) -> +-spec delete_session(binary(), binary(), push_session_id()) + -> ok | {error, db_failure}. +delete_session(LUser, LServer, ID) -> Mod = gen_mod:db_mod(LServer, ?MODULE), - case Mod:delete_session(LUser, LServer, TS) of + case Mod:delete_session(LUser, LServer, ID) of ok -> case use_cache(Mod, LServer) of true -> ets_cache:delete(?PUSH_CACHE, {LUser, LServer}, cache_nodes(Mod, LServer)), - ets_cache:delete(?PUSH_CACHE, {LUser, LServer, TS}, + ets_cache:delete(?PUSH_CACHE, {LUser, LServer, ID}, cache_nodes(Mod, LServer)); false -> ok @@ -633,8 +634,8 @@ delete_session(LUser, LServer, TS) -> delete_session(LUser, LServer, PushJID, Node) -> Mod = gen_mod:db_mod(LServer, ?MODULE), case Mod:lookup_session(LUser, LServer, PushJID, Node) of - {ok, {TS, _, _, _}} -> - delete_session(LUser, LServer, TS); + {ok, {ID, _, _, _}} -> + delete_session(LUser, LServer, ID); error -> {error, notfound}; {error, _} = Err -> @@ -662,12 +663,12 @@ delete_sessions(LUser, LServer, LookupFun, Mod) -> ok end, lists:foreach( - fun({TS, _, _, _}) -> - ok = Mod:delete_session(LUser, LServer, TS), + fun({ID, _, _, _}) -> + ok = Mod:delete_session(LUser, LServer, ID), case use_cache(Mod, LServer) of true -> ets_cache:delete(?PUSH_CACHE, - {LUser, LServer, TS}, + {LUser, LServer, ID}, cache_nodes(Mod, LServer)); false -> ok @@ -680,7 +681,7 @@ delete_sessions(LUser, LServer, LookupFun, Mod) -> -spec drop_online_sessions(binary(), binary(), [push_session()]) -> [push_session()]. drop_online_sessions(LUser, LServer, Clients) -> - OnlineTSs = lists:filtermap( + OnlineIDs = lists:filtermap( fun({_, Info}) -> case proplists:get_value(push_id, Info) of OnlineID = {_, _, _} -> @@ -689,8 +690,8 @@ drop_online_sessions(LUser, LServer, Clients) -> false end end, ejabberd_sm:get_user_info(LUser, LServer)), - [Client || {TS, _, _, _} = Client <- Clients, - not lists:member(TS, OnlineTSs)]. + [Client || {ID, _, _, _} = Client <- Clients, + not lists:member(ID, OnlineIDs)]. -spec make_summary(binary(), xmpp_element() | xmlel() | none, direction()) -> xdata() | undefined. From c148ab4430688666d45fb3b3b56d29d67426c1cd Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 1 May 2022 17:51:07 +0200 Subject: [PATCH 245/440] Adapt mod_push_keepalive to mod_push changes Adjust mod_push_keepalive to work with the mod_push changes applied by commit 11574f0a43ff5dbdd297815c6c48fc8d976f1631. --- src/mod_push.erl | 17 +++++++++++------ src/mod_push_keepalive.erl | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/mod_push.erl b/src/mod_push.erl index dc541bd3c..a09e8d392 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -405,7 +405,7 @@ disable(#jid{luser = LUser, lserver = LServer, lresource = LResource} = JID, -spec c2s_stanza(c2s_state(), xmpp_element() | xmlel(), term()) -> c2s_state(). c2s_stanza(State, #stream_error{}, _SendResult) -> State; -c2s_stanza(#{push_session_id := _ID, mgmt_state := pending} = State, +c2s_stanza(#{push_enabled := true, mgmt_state := pending} = State, Pkt, _SendResult) -> ?DEBUG("Notifying client of stanza", []), notify(State, Pkt, get_direction(Pkt)), @@ -450,7 +450,7 @@ offline_message(Acc) -> Acc. -spec c2s_session_pending(c2s_state()) -> c2s_state(). -c2s_session_pending(#{push_session_id := _ID, mgmt_queue := Queue} = State) -> +c2s_session_pending(#{push_enabled := true, mgmt_queue := Queue} = State) -> case p1_queue:len(Queue) of Len when Len > 0 -> ?DEBUG("Notifying client of unacknowledged stanza(s)", []), @@ -468,16 +468,21 @@ c2s_session_pending(State) -> State. -spec c2s_copy_session(c2s_state(), c2s_state()) -> c2s_state(). -c2s_copy_session(State, #{push_session_id := ID}) -> - State#{push_session_id => ID}; +c2s_copy_session(State, #{push_enabled := true, + push_session_id := ID}) -> + State#{push_enabled => true, + push_session_id => ID}; c2s_copy_session(State, _) -> State. -spec c2s_handle_cast(c2s_state(), any()) -> c2s_state() | {stop, c2s_state()}. c2s_handle_cast(State, {push_enable, ID}) -> - {stop, State#{push_session_id => ID}}; + {stop, State#{push_enabled => true, + push_session_id => ID}}; c2s_handle_cast(State, push_disable) -> - {stop, maps:remove(push_session_id, State)}; + State1 = maps:remove(push_disable, State), + State2 = maps:remove(push_session_id, State1), + {stop, State2}; c2s_handle_cast(State, _Msg) -> State. diff --git a/src/mod_push_keepalive.erl b/src/mod_push_keepalive.erl index 1ced2690f..8a816aef1 100644 --- a/src/mod_push_keepalive.erl +++ b/src/mod_push_keepalive.erl @@ -213,7 +213,7 @@ c2s_copy_session(State, _) -> State. -spec c2s_handle_cast(c2s_state(), any()) -> c2s_state(). -c2s_handle_cast(#{lserver := LServer} = State, push_enable) -> +c2s_handle_cast(#{lserver := LServer} = State, {push_enable, _ID}) -> ResumeTimeout = mod_push_keepalive_opt:resume_timeout(LServer), WakeOnTimeout = mod_push_keepalive_opt:wake_on_timeout(LServer), State#{push_resume_timeout => ResumeTimeout, From b5a76fb4de3bf5e5901505929e5c7fb1f2f6a42a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 2 May 2022 01:54:42 +0200 Subject: [PATCH 246/440] mod_push: Keep push session ID on session resume Don't forget the push session ID if the client resumes a stream management session. This makes sure no push notifications are generated for a connected client with a resumed stream management session. Thanks to Thilo Molitor for spotting the issue. --- src/mod_push.erl | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/mod_push.erl b/src/mod_push.erl index a09e8d392..5389e3dfb 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -34,8 +34,8 @@ -export([mod_doc/0]). %% ejabberd_hooks callbacks. -export([disco_sm_features/5, c2s_session_pending/1, c2s_copy_session/2, - c2s_handle_cast/2, c2s_stanza/3, mam_message/7, offline_message/1, - remove_user/2]). + c2s_session_resumed/1, c2s_handle_cast/2, c2s_stanza/3, mam_message/7, + offline_message/1, remove_user/2]). %% gen_iq_handler callback. -export([process_iq/1]). @@ -259,6 +259,8 @@ register_hooks(Host) -> c2s_session_pending, 50), ejabberd_hooks:add(c2s_copy_session, Host, ?MODULE, c2s_copy_session, 50), + ejabberd_hooks:add(c2s_session_resumed, Host, ?MODULE, + c2s_session_resumed, 50), ejabberd_hooks:add(c2s_handle_cast, Host, ?MODULE, c2s_handle_cast, 50), ejabberd_hooks:add(c2s_handle_send, Host, ?MODULE, @@ -278,6 +280,8 @@ unregister_hooks(Host) -> c2s_session_pending, 50), ejabberd_hooks:delete(c2s_copy_session, Host, ?MODULE, c2s_copy_session, 50), + ejabberd_hooks:delete(c2s_session_resumed, Host, ?MODULE, + c2s_session_resumed, 50), ejabberd_hooks:delete(c2s_handle_cast, Host, ?MODULE, c2s_handle_cast, 50), ejabberd_hooks:delete(c2s_handle_send, Host, ?MODULE, @@ -475,6 +479,14 @@ c2s_copy_session(State, #{push_enabled := true, c2s_copy_session(State, _) -> State. +-spec c2s_session_resumed(c2s_state()) -> c2s_state(). +c2s_session_resumed(#{push_session_id := ID, + user := U, server := S, resource := R} = State) -> + ejabberd_sm:set_user_info(U, S, R, push_id, ID), + State; +c2s_session_resumed(State) -> + State. + -spec c2s_handle_cast(c2s_state(), any()) -> c2s_state() | {stop, c2s_state()}. c2s_handle_cast(State, {push_enable, ID}) -> {stop, State#{push_enabled => true, From 4f335248421eafcea38632abb12d03913eab7671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 12:49:59 +0200 Subject: [PATCH 247/440] Update deps --- rebar.config | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/rebar.config b/rebar.config index 6343a006c..ee97ae0e5 100644 --- a/rebar.config +++ b/rebar.config @@ -19,8 +19,8 @@ %%%---------------------------------------------------------------------- {deps, [{base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}}, - {cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.29"}}}, - {eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.21"}}}, + {cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.30"}}}, + {eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.22"}}}, {if_var_true, tools, {ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}}, {if_var_true, elixir, @@ -30,12 +30,12 @@ {if_var_true, redis, {eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}}, {if_var_true, sip, - {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.45"}}}}, + {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.46"}}}}, {if_var_true, zlib, - {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.10"}}}}, - {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.13"}}}, - {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.48"}}}, - {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.32"}}}, + {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}}, + {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.14"}}}, + {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}}, + {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.33"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {if_version_below, "20", {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} @@ -55,25 +55,25 @@ {if_rebar3, {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}} }}, - {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.14"}}}, - {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.18"}}}, + {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}}, + {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.19"}}}, {if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}}, - {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.10"}}}, + {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}}, {if_var_true, pgsql, - {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.16"}}}}, - {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.23"}}}, - {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.8"}}}, + {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.17"}}}}, + {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}}, + {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}}, {if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix {if_var_true, elixir, {rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}}, {if_var_true, sqlite, {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}}, - {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.27"}}}, + {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}}, {if_var_true, stun, - {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.47"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.6"}}}, - {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.12"}}} + {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.1"}}}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.7"}}}, + {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}} ]}. {gitonly_deps, [elixir]}. From c8c4827626715cd9965c70cd6c00c72dd5c3ad24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 13:06:40 +0200 Subject: [PATCH 248/440] Update hex deps --- mix.lock | 30 +++++++++++++++--------------- rebar.config | 10 +++++----- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/mix.lock b/mix.lock index 61743297b..87258f746 100644 --- a/mix.lock +++ b/mix.lock @@ -1,29 +1,29 @@ %{ "base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"}, - "cache_tab": {:hex, :cache_tab, "1.0.29", "6c161988620b788d8df28c8f6af557571609c8e4b671dbadab295a4722cd501b", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a02a638021cce91ed1a8628dcbb4795bf5c01c9d11db8c613065923142824ce9"}, - "eimp": {:hex, :eimp, "1.0.21", "2e918a5dc9a1959ef8713a2360499e3baeee64cfd7881bd9d1f361ca9ddf07e8", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "998f58538f58aa0cff103414994d7ce56dc253e6576cd6fb40c1ead64aa73a28"}, + "cache_tab": {:hex, :cache_tab, "1.0.30", "6d35eecfb65fbe5fc85988503a27338d32de01243f3fc8ea3ee7161af08725a4", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6d8a5e00d8f84c42627706a6dbedb02e34d58495f3ed61935c8475ca0531cda0"}, + "eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, "esip": {:hex, :esip, "1.0.45", "2f21fb9750f7a505e6bbd43f6d48b0e879b808aba6c2224686c83f2bcd7a34bf", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.47", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "1f1eae69f2bd8d75f42c048409eabb4e3dc71ab6412fc5d998edbdade6ad5f75"}, - "ezlib": {:hex, :ezlib, "1.0.10", "c1c24eb18944cfde55f0574e9922d5b0392fa864282f769f82b2ea15e54f6003", [:rebar3], [], "hexpm", "1d317f1d85373686199eb3b4164d3477e95033ac68e45a95ba18e7b7a8c23241"}, - "fast_tls": {:hex, :fast_tls, "1.1.13", "828cdc75e1e8fce8158846d2b971d8b4fe2b2ddcc75b759e88d751079bf78afd", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d1f422af40c7777fe534496f508ee86515cb929ad10f7d1d56aa94ce899b44a0"}, - "fast_xml": {:hex, :fast_xml, "1.1.48", "d41d14015227999a2367264cc97ac1e6770285aab1dc69545ac4f822be01a2d2", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "afcf9b808c77599395d4bd22ed4560b3d82aa1a24ff5b65f3930fe72a423b3cf"}, - "fast_yaml": {:hex, :fast_yaml, "1.0.32", "43f53a2c8572f2e4d66cd4e787fc6761b1c65b9132e42c511d8b9540b0989d65", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7258e322739ff0824237ebe44cd158e0bf52cd27a15fe731cf92f4b4c70b913e"}, + "ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"}, + "fast_tls": {:hex, :fast_tls, "1.1.15", "398e7ba1076db139307ebea839428e2836ab682e4dac61d95b4705a26aff06b7", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "ef516aa226de9a4605704c18499284cd4fc115a73bd72490341972ce0c2b4d30"}, + "fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"}, + "fast_yaml": {:hex, :fast_yaml, "1.0.33", "5c735da21a4d23b7ed592603b1cd7aba25f91a735d3c0a8df2816d335a8def6e", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "efa60a2acbcd2c2e72eb5e16f1475726b9d88afca3ad6dbb4bc549266863e7c8"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"}, - "mqtree": {:hex, :mqtree, "1.0.14", "d201a79b51a9232b80e764b4b77a866f7c30a90c7ac6205d71f391eb3ea7eb31", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8626dac5e862b575eaf4836f0fc1be5a7c8435c378c5a309e34ee012d48b6f6e"}, - "p1_acme": {:hex, :p1_acme, "1.0.18", "3d987aabe586fd372b93b0a2604ea5b9dcf989bb0b8bf90653fb8e9b4aeea523", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.12", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "81d757eaa5d22cdc7ea244e9d17cb8eb95ca388c2f239b8feb8b8bc927740eed"}, + "mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"}, + "p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, - "p1_oauth2": {:hex, :p1_oauth2, "0.6.10", "09ba1fbd447b1f480b223903e36d0415f21be592a1b00db964eea01285749028", [:rebar3], [], "hexpm", "c79cb61ababee4a8c85409b7f4932035797c093aeef1f9f53985e512b26f2a64"}, + "p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"}, "p1_pgsql": {:hex, :p1_pgsql, "1.1.16", "0338d4c3ab42aa1d3ae312aef38f85279678d90092cfc88da899a130a9c0bf03", [:rebar3], [{:xmpp, "1.5.6", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "3294d8f01115e6d0139c0959b22290d33ac21a596605b203f53a22cb7617b4b3"}, - "p1_utils": {:hex, :p1_utils, "1.0.23", "7f94466ada69bd982ea7bb80fbca18e7053e7d0b82c9d9e37621fa508587069b", [:rebar3], [], "hexpm", "47f21618694eeee5006af1c88731ad86b757161e7823c29b6f73921b571c8502"}, - "pkix": {:hex, :pkix, "1.0.8", "98ea05243847fd4504f7c7a0cd82cecd1010ac327a082e1c674c5384006eae75", [:rebar3], [], "hexpm", "399508819501fab9d2e586dfa601b5ee3ef22b5612d3db58204dd2d089ef45d7"}, + "p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"}, + "pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"}, "sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"}, - "stringprep": {:hex, :stringprep, "1.0.27", "02808c7024bc6285ca6a8a67e7addfc16f35dda55551a582c5181d8ea960e890", [:rebar3], [{:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a5967b1144ca8002a58a03d16dd109fbd0bcdb82616cead2f983944314af6a00"}, - "stun": {:hex, :stun, "1.0.47", "fae94c0dc7415263297e8f07f286f3355d327d8bf78b1b0743c9a5a492381f71", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "377d8487f4add85f6bc6ecdebdb4dcbcbe890e9462f27d6d31f3db1cf9b2cc9b"}, + "stringprep": {:hex, :stringprep, "1.0.28", "9a9823d8449309e4e8ca0bdb2547e43d5de4e1d943f23826c25015150b8daa66", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "66df7d1181fec899c824bd8d00253f369103514828db5e04ee1ba7a0a61568e0"}, + "stun": {:hex, :stun, "1.2.2", "8c61f71c5094c69739dc6b3e916be734ce80c1a15551e00d547115a66e91e5bc", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4f54c7b86e2aa413faec35a9fb699048471e1c06a721c53e6ac44b405fd2a3b9"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, - "xmpp": {:hex, :xmpp, "1.5.6", "09259177a39c880d682817932f4da0537c471160fd43aa891ea9cb71cf827b52", [:rebar3], [{:ezlib, "1.0.10", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.48", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.27", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "59b7317c4077d3384f9a891e0517a591cdbd44a323260b835eafbede4f4eb12e"}, - "yconf": {:hex, :yconf, "1.0.12", "78c119d39bb805207fcb7671cb884805d75ee89c9ec98632b678f90a597dee2c", [:rebar3], [{:fast_yaml, "1.0.32", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "12faa51c281e95bcb6abf185fd034a242209621a7bb04b6cc411c867b192e207"}, + "xmpp": {:hex, :xmpp, "1.5.8", "96c08537a4d7d9695326a01be8162cb980803be4358671b0fd1369ae9c5e05d8", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.28", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "966a4539dea7331310be809eaccd5d02af5874303a90679d35bee2117f825b4a"}, + "yconf": {:hex, :yconf, "1.0.13", "25557689f71897e20c8630ae8865ce083437d325e7d5a6f8ee950c7e0e7be4e1", [:rebar3], [{:fast_yaml, "1.0.33", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "3fd478212b3da121229684288f5154c3610ac6b6c3dbbbdd7886737cab82d851"}, } diff --git a/rebar.config b/rebar.config index ee97ae0e5..967ca4807 100644 --- a/rebar.config +++ b/rebar.config @@ -30,10 +30,10 @@ {if_var_true, redis, {eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}}, {if_var_true, sip, - {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.46"}}}}, + {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.47"}}}}, {if_var_true, zlib, {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}}, - {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.14"}}}, + {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.15"}}}, {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.33"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, @@ -61,7 +61,7 @@ {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}}, {if_var_true, pgsql, - {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.17"}}}}, + {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}}, {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}}, {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}}, {if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix @@ -71,8 +71,8 @@ {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}}, {if_var_true, stun, - {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.1"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.7"}}}, + {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.2"}}}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.8"}}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}} ]}. From a852c31c6c9d4a9d9fe730d701dffcc0fadf08cd Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 7 Apr 2022 16:58:07 +0200 Subject: [PATCH 249/440] Set default ejabberd version number when not using git This is useful when the source code was downloaded from https://github.com/processone/ejabberd/tags --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 864a042f1..bbd9e9d5a 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 0.0` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd]) +AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 21.12` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd]) REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)" REQUIRE_ERLANG_MAX="100.0.0 (No Max)" From 45c7fbb5ae3760073691dd25745ba415283d920c Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 12:46:48 +0200 Subject: [PATCH 250/440] Switch "make rel" and "make dev" to paths: conf, database, logs --- Makefile.in | 26 +++++++++++++------------- config/runtime.exs | 25 ++++++++++--------------- ejabberdctl.template | 18 +++++++++--------- mix.exs | 16 ++++++++-------- rebar.config | 20 ++++++++++---------- rel/reltool.config.script | 12 ++++++------ rel/setup-dev.sh | 4 ++-- rel/sys.config | 4 ++-- rel/vm.args | 2 +- vars.config.in | 5 +++++ 10 files changed, 66 insertions(+), 66 deletions(-) diff --git a/Makefile.in b/Makefile.in index 982e6df52..13f7b556d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -278,29 +278,29 @@ relive: relivelibdir=$(shell pwd)/$(DEPSDIR) relivedir=$(shell pwd)/_build/relive iexpath=$(shell which iex) +CONFIG_DIR = ${relivedir}/conf +SPOOL_DIR = ${relivedir}/database +LOGS_DIR = ${relivedir}/logs ejabberdctl.relive: - $(SED) -e "s*{{rootdir}}*@prefix@*g" \ - -e "s*{{installuser}}*@INSTALLUSER@*g" \ + $(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \ + -e "s*{{config_dir}}*${CONFIG_DIR}*g" \ + -e "s*{{logs_dir}}*${LOGS_DIR}*g" \ + -e "s*{{spool_dir}}*${SPOOL_DIR}*g" \ -e "s*{{bindir}}/iex*$(iexpath)*g" \ -e "s*{{bindir}}*@bindir@*g" \ -e "s*{{libdir}}*${relivelibdir}*g" \ - -e "s*{{sysconfdir}}/ejabberd*$(relivedir)/conf*g" \ - -e "s*{{localstatedir}}/log/ejabberd*$(relivedir)/logs*g" \ - -e "s*{{localstatedir}}/lib/ejabberd*$(relivedir)/database*g" \ - -e "s*{{docdir}}*@docdir@*g" \ -e "s*{{erl}}*@ERL@*g" \ -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ > ejabberdctl.relive -ejabberdctl.example: - $(SED) -e "s*{{rootdir}}*@prefix@*g" \ - -e "s*{{installuser}}*@INSTALLUSER@*g" \ +ejabberdctl.example: vars.config + $(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \ + -e "s*{{config_dir}}*${ETCDIR}*g" \ + -e "s*{{logs_dir}}*${LOGDIR}*g" \ + -e "s*{{spool_dir}}*${SPOOLDIR}*g" \ -e "s*{{bindir}}*@bindir@*g" \ -e "s*{{libdir}}*@libdir@*g" \ - -e "s*{{sysconfdir}}*@sysconfdir@*g" \ - -e "s*{{localstatedir}}*@localstatedir@*g" \ - -e "s*{{docdir}}*@docdir@*g" \ -e "s*{{erl}}*@ERL@*g" \ -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ > ejabberdctl.example @@ -417,7 +417,7 @@ distclean: clean clean-rel rel: $(REBARREL) -DEV_CONFIG = _build/dev/rel/ejabberd/etc/ejabberd/ejabberd.yml +DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml dev $(DEV_CONFIG): $(REBARDEV) diff --git a/config/runtime.exs b/config/runtime.exs index ad8c6bdc9..b4e6dc5f1 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -1,18 +1,13 @@ import Config -case System.get_env("RELIVE", "false") do - "true" -> - rootpath = System.get_env("RELEASE_ROOT", "_build/relive") - config :ejabberd, - file: Path.join(rootpath, "conf/ejabberd.yml"), - log_path: Path.join(rootpath, 'logs/ejabberd.log') - config :mnesia, - dir: Path.join(rootpath, 'database/') - "false" -> - rootpath = System.get_env("RELEASE_ROOT", "") - config :ejabberd, - file: Path.join(rootpath, "etc/ejabberd/ejabberd.yml"), - log_path: Path.join(rootpath, 'var/log/ejabberd/ejabberd.log') - config :mnesia, - dir: Path.join(rootpath, 'var/lib/ejabberd/') +rootdefault = case System.get_env("RELIVE", "false") do + "true" -> "_build/relive" + "false" -> "" end + +rootpath = System.get_env("RELEASE_ROOT", rootdefault) +config :ejabberd, + file: Path.join(rootpath, "conf/ejabberd.yml"), + log_path: Path.join(rootpath, 'logs/ejabberd.log') +config :mnesia, + dir: Path.join(rootpath, 'database/') diff --git a/ejabberdctl.template b/ejabberdctl.template index 7f0e0c96d..5b9ef36cb 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -50,20 +50,20 @@ while [ $# -gt 0 ]; do -l|--logs) LOGS_DIR=$2; shift 2;; -f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;; -c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;; - -d|--config-dir) ETC_DIR=$2; shift 2;; + -d|--config-dir) CONFIG_DIR=$2; shift 2;; -t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;; *) break;; esac done # define ejabberd variables if not already defined from the command line -: "${ETC_DIR:="{{sysconfdir}}/ejabberd"}" -: "${LOGS_DIR:="{{localstatedir}}/log/ejabberd"}" -: "${SPOOL_DIR:="{{localstatedir}}/lib/ejabberd"}" -: "${EJABBERD_CONFIG_PATH:="$ETC_DIR/ejabberd.yml"}" -: "${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR/ejabberdctl.cfg"}" +: "${CONFIG_DIR:="{{config_dir}}"}" +: "${LOGS_DIR:="{{logs_dir}}"}" +: "${SPOOL_DIR:="{{spool_dir}}"}" +: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}" +: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}" # Allows passing extra Erlang command-line arguments in vm.args file -: "${VMARGS:="$ETC_DIR/vm.args"}" +: "${VMARGS:="$CONFIG_DIR/vm.args"}" # shellcheck source=ejabberdctl.cfg.example [ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH" [ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG" @@ -85,7 +85,7 @@ fi [ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" ERL_LIBS='{{libdir}}' ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump -ERL_INETRC="$ETC_DIR"/inetrc +ERL_INETRC="$CONFIG_DIR"/inetrc # define ejabberd parameters EJABBERD_OPTS="$EJABBERD_OPTS\ @@ -193,7 +193,7 @@ help() echo " started|stopped Wait for the node to fully start|stop" echo "" echo "Optional parameters when starting an ejabberd node:" - echo " --config-dir dir Config ejabberd: $ETC_DIR" + echo " --config-dir dir Config ejabberd: $CONFIG_DIR" echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH" echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH" echo " --logs dir Directory for logs: $LOGS_DIR" diff --git a/mix.exs b/mix.exs index 7adf2e869..d73489797 100644 --- a/mix.exs +++ b/mix.exs @@ -235,7 +235,9 @@ defmodule Ejabberd.MixProject do libdir: config(:libdir), sysconfdir: config(:sysconfdir), localstatedir: config(:localstatedir), - docdir: config(:docdir), + config_dir: config(:config_dir), + logs_dir: config(:logs_dir), + spool_dir: config(:spool_dir), erl: config(:erl), epmd: config(:epmd), bindir: Path.join([config(:release_dir), "releases", version()]), @@ -286,15 +288,15 @@ defmodule Ejabberd.MixProject do suffix = case Mix.env() do :dev -> - Mix.Generator.copy_file("test/ejabberd_SUITE_data/ca.pem", "#{ro}/etc/ejabberd/ca.pem") - Mix.Generator.copy_file("test/ejabberd_SUITE_data/cert.pem", "#{ro}/etc/ejabberd/cert.pem") + Mix.Generator.copy_file("test/ejabberd_SUITE_data/ca.pem", "#{ro}/conf/ca.pem") + Mix.Generator.copy_file("test/ejabberd_SUITE_data/cert.pem", "#{ro}/conf/cert.pem") ".example" _ -> "" end - Mix.Generator.copy_file("ejabberd.yml.example", "#{ro}/etc/ejabberd/ejabberd.yml#{suffix}") - Mix.Generator.copy_file("ejabberdctl.cfg.example", "#{ro}/etc/ejabberd/ejabberdctl.cfg#{suffix}") - Mix.Generator.copy_file("inetrc", "#{ro}/etc/ejabberd/inetrc") + Mix.Generator.copy_file("ejabberd.yml.example", "#{ro}/conf/ejabberd.yml#{suffix}") + Mix.Generator.copy_file("ejabberdctl.cfg.example", "#{ro}/conf/ejabberdctl.cfg#{suffix}") + Mix.Generator.copy_file("inetrc", "#{ro}/conf/inetrc") Enum.each(File.ls!("sql"), fn x -> @@ -316,8 +318,6 @@ defmodule Ejabberd.MixProject do && File.cp_r!(source_dir, target_dir) end - Mix.Generator.create_directory("#{ro}/var/lib/ejabberd") - case Mix.env() do :dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh") _ -> :ok diff --git a/rebar.config b/rebar.config index 967ca4807..e3186a857 100644 --- a/rebar.config +++ b/rebar.config @@ -190,12 +190,12 @@ {sys_config, "./rel/sys.config"}, {vm_args, "./rel/vm.args"}, {overlay_vars, "vars.config"}, - {overlay, [{mkdir, "var/log/ejabberd"}, - {mkdir, "var/lib/ejabberd"}, - {mkdir, "etc/ejabberd"}, + {overlay, [{mkdir, "logs"}, + {mkdir, "database"}, + {mkdir, "conf"}, {copy, "rel/files/erl", "erts-\{\{erts_vsn\}\}/bin/erl"}, {template, "ejabberdctl.template", "bin/ejabberdctl"}, - {copy, "inetrc", "etc/ejabberd/inetrc"}, + {copy, "inetrc", "conf/inetrc"}, {copy, "tools/captcha*.sh", "lib/ejabberd-\{\{release_version\}\}/priv/bin/"}, {copy, "rel/files/install_upgrade.escript", "bin/install_upgrade.escript"}]} ]}. @@ -206,8 +206,8 @@ {include_src, true}, {generate_start_script, false}, {overlay, [{copy, "sql/*", "lib/ejabberd-\{\{release_version\}\}/priv/sql/"}, - {copy, "ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg"}, - {copy, "ejabberd.yml.example", "etc/ejabberd/ejabberd.yml"}]}]}]}, + {copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg"}, + {copy, "ejabberd.yml.example", "conf/ejabberd.yml"}]}]}]}, {dev, [{post_hooks, [{release, "rel/setup-dev.sh"}]}, {relx, [{debug_info, keep}, {dev_mode, true}, @@ -215,10 +215,10 @@ {include_src, false}, {generate_start_script, true}, {extended_start_script, true}, - {overlay, [{copy, "ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg.example"}, - {copy, "ejabberd.yml.example", "etc/ejabberd/ejabberd.yml.example"}, - {copy, "test/ejabberd_SUITE_data/ca.pem", "etc/ejabberd/"}, - {copy, "test/ejabberd_SUITE_data/cert.pem", "etc/ejabberd/"}]}]}]}, + {overlay, [{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg.example"}, + {copy, "ejabberd.yml.example", "conf/ejabberd.yml.example"}, + {copy, "test/ejabberd_SUITE_data/ca.pem", "conf/"}, + {copy, "test/ejabberd_SUITE_data/cert.pem", "conf/"}]}]}]}, {test, [{erl_opts, [nowarn_export_all]}]}]}. {alias, [{relive, [{shell, "--apps ejabberd \ diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 523cf9c76..ac3f5c7cb 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -88,15 +88,15 @@ Sys = [{lib_dirs, []}, end, OTPApps). Overlay = [ - {mkdir, "var/log/ejabberd"}, - {mkdir, "var/lib/ejabberd"}, - {mkdir, "etc/ejabberd"}, + {mkdir, "logs"}, + {mkdir, "database"}, + {mkdir, "conf"}, {mkdir, "doc"}, {template, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, {template, "../ejabberdctl.template", "bin/ejabberdctl"}, - {copy, "../ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg"}, - {copy, "../ejabberd.yml.example", "etc/ejabberd/ejabberd.yml"}, - {copy, "../inetrc", "etc/ejabberd/inetrc"}, + {copy, "../ejabberdctl.cfg.example", "conf/ejabberdctl.cfg"}, + {copy, "../ejabberd.yml.example", "conf/ejabberd.yml"}, + {copy, "../inetrc", "conf/inetrc"}, {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"} ], diff --git a/rel/setup-dev.sh b/rel/setup-dev.sh index 8040f3dd0..79171ffe0 100755 --- a/rel/setup-dev.sh +++ b/rel/setup-dev.sh @@ -2,10 +2,10 @@ echo -n "===> Preparing dev configuration files: " PWD_DIR=`pwd` REL_DIR=$PWD_DIR/_build/dev/rel/ejabberd/ -CON_DIR=$REL_DIR/etc/ejabberd/ +CON_DIR=$REL_DIR/conf/ [ -z "$REL_DIR_TEMP" ] && REL_DIR_TEMP=$REL_DIR -CON_DIR_TEMP=$REL_DIR_TEMP/etc/ejabberd/ +CON_DIR_TEMP=$REL_DIR_TEMP/conf/ BIN_DIR_TEMP=$REL_DIR_TEMP/bin/ cd $CON_DIR_TEMP diff --git a/rel/sys.config b/rel/sys.config index ff6f0f368..26b0d0c61 100644 --- a/rel/sys.config +++ b/rel/sys.config @@ -1,2 +1,2 @@ -[{ejabberd, [{config, "etc/ejabberd/ejabberd.yml"}, - {log_path, "var/log/ejabberd/ejabberd.log"}]}]. +[{ejabberd, [{config, "conf/ejabberd.yml"}, + {log_path, "logs/ejabberd.log"}]}]. diff --git a/rel/vm.args b/rel/vm.args index 29858b0dc..6301f464d 100644 --- a/rel/vm.args +++ b/rel/vm.args @@ -4,7 +4,7 @@ ## Cookie for distributed erlang #-setcookie ejabberd --mnesia dir \"var/lib/ejabberd\" +-mnesia dir \"database\" ## Heartbeat management; auto-restarts VM if it dies or becomes unresponsive ## (Disabled by default..use with caution!) diff --git a/vars.config.in b/vars.config.in index ddfc5ddb5..e80e49782 100644 --- a/vars.config.in +++ b/vars.config.in @@ -59,6 +59,11 @@ {libdir, "{{release_dir}}/lib"}. {docdir, "{{release_dir}}/doc"}. +%% OTP release +{config_dir, "{{release_dir}}/conf"}. +{logs_dir, "{{release_dir}}/logs"}. +{spool_dir, "{{release_dir}}/database"}. + {latest_deps, @latest_deps@}. {system_deps, @system_deps@}. From 7a1e0d472072e9d96c4c6af2b09c0accc45cd70a Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 30 Apr 2022 20:41:46 +0200 Subject: [PATCH 251/440] Fix 'make xref' when using Mix; notice it only checks Elixir files --- Makefile.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 13f7b556d..16e713ebe 100644 --- a/Makefile.in +++ b/Makefile.in @@ -111,6 +111,7 @@ ifeq "$(REBAR_VER)" "6" GET_DEPS= deps.get CONFIGURE_DEPS= EBINDIR=$(DEPSDIR)/ejabberd/ebin + XREFOPTIONS=graph REBARREL=MIX_ENV=prod $(REBAR) release --overwrite REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run @@ -129,6 +130,7 @@ endif GET_DEPS= get-deps CONFIGURE_DEPS=$(REBAR) configure-deps EBINDIR=$(DEPSDIR)/ejabberd/ebin + XREFOPTIONS= REBARREL=$(REBAR) as prod tar REBARDEV=REBAR_PROFILE=dev $(REBAR) release RELIVECMD=$(REBAR) relive @@ -142,6 +144,7 @@ else GET_DEPS= get-deps CONFIGURE_DEPS=$(REBAR) configure-deps EBINDIR=ebin + XREFOPTIONS= REBARREL=$(REBAR) generate REBARDEV= RELIVECMD=@echo "Rebar2 detected... relive not supported.\ @@ -172,7 +175,7 @@ update: $(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got xref: all - $(REBAR) $(SKIPDEPS) xref + $(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS) hooks: all tools/hook_deps.sh $(EBINDIR) From 12331768bca9496529803d39bab2c6e55af957db Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 26 Apr 2022 22:26:56 +0200 Subject: [PATCH 252/440] Update rebar2 binary, works from Erlang/OTP 22 to 25 The old version was: rebar 2.6.4 17 20170823_084242 git 2.6.4-27-g8076675-dirty and it couldn't work with Erlang/OTP 25 This new version is rebar 2.6.4 22 20220426_202500 git 2.6.4-39-gb6d3094 compiled from master branch from https://github.com/rebar/rebar using erlang:22-slim docker image To compile ejabberd using rebar and ancient Erlang 19.3-21.3, you need a rebar binary compiled with an old Erlang. If your operating system doesn't provide one, you can download the old one included in ejabberd 21.12, available at: https://github.com/processone/ejabberd/raw/21.12/rebar --- rebar | Bin 208040 -> 204169 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rebar b/rebar index 24cf4a68c82bf7daf5d0af0459685f5f81c9a217..b6f0118468fa9f280bd0c572be5738cb441c5269 100755 GIT binary patch delta 183036 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

qUALoTMGqDzbCx$Dik+&ZuaU99Qc8uBxQWq# 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

pYK0!wkV6gt%t@e^Wp)jaR2tbt!HT8d`iI^um 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%0Dp^(a&^AymQ~0th6k*(H-can>u$BO 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 From 5e2aca813821b627593aed6e0979af7048e48764 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 26 Apr 2022 22:07:20 +0200 Subject: [PATCH 253/440] Update rebar3 binary, works from Erlang/OTP 22 to 25 The old version was: rebar 3.15.2 and it couldn't work with Erlang/OTP 25 This new version is rebar 3.18.0 compiled from tag 3.18.0 from https://github.com/erlang/rebar3 using erlang:22-slim docker image To compile ejabberd using rebar3 and ancient Erlang 19.3-21.3, you need a rebar3 binary compiled with an old Erlang. If your operating system doesn't provide one, you can download the old one included in ejabberd 21.12, available at: https://github.com/processone/ejabberd/raw/21.12/rebar3 --- rebar3 | Bin 952373 -> 945778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rebar3 b/rebar3 index c052f9ac6c44dbe10f6941875c7b0f39cefe106e..bf1935ce699486b3e078c821b052309aa36745ac 100755 GIT binary patch delta 917356 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≀ul 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

}YktQ9ZDmy9zC8{?gKmbrE z#(AzD4?`QJjq%Y~5|yXDYzN00w`x1fxOS}ud3`Hegi8~PKwRA2ju7)WnvHg;0A+*o zD1?9Fw@s#Xy&8lAeTV+B&<>*hRNoIIvs>+O$9~1SEXS90f4V0jFt(sOB!n?RhZT`0 zfya^(Z8{5KEQlI8!|FqB_v-`x?2R~q31EMVh(^wHVwRo<&ebeZNYUcHVEe}xkzTEB z@rLKehY}{uX+a(I)qG!eN3Pf!Q#Z#vC%1pzq`2Kop2Md&L~nkQr^WIZyBt!(y88ri zbt_*ekp#AM{jDZcHb+`7_%x8@#`kr5;LQ{bC6$_ui^1C&avgoRg<-MFaQvuX28?Sv zf%H3#T@XCucT8Jhzz(rIWlm)NZa2@F1j%8w0~%QB0r)g_!r);fOT0+xSC z1Z|Wy&~1i4i0K0|@Khsu0PYYkUO_z7Z%ANZFdKjsK=P*y014nTvA4J8prd>CAJ^5_ zcceA6qcbu!H`Fz-Ftw!Px79Z>b+odh)BkCOGI$bfbxmEK_ob)Rx3vf0|9&>$0F>X( zW~Fau{quCcG=9eeYc^I`$zzqSl=pwVw^#@yF7RVIH07&;~B6yk%pS}g2zHOhj znF1L-P5MvU^q=PEK$cJ2Xg&17ZSV0RjNgKYf^= zmV|&PfoQ*PmjzOInj3yUkIB;+?18L-IDqJ$K2G01wBJk82XcH`G6b>%0Dk|EfYC|* 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≈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 z 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 R;F^M7}#ZR)JaO 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%0AAq~bZ{wbP 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%0A2@1*3YC4T&WLdDF16hfRhpd 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

)l}#d8zoy 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 z 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%0AEBfIh&cd!VI* z1KfzyfsX6Bt`5XxLeU6*?^9Xn)_p`NeS9IdNPe6Z8L=iUjpbL!Br}1Ea>b9IPZyAa zwcsX8E{fc?2PM`xFifU(;P%@L?#NFWQuAtZ+B_#MzNEP5M65PSe}Jx6UoRRxgRRv< z+L<;3<2$nBq2@( zwiN^f1tbL?1jfL39R9m-oWYemLjDwv5b(6`Y-rrH2|ENBK&YyX?fOsVZOgrLGCetV zwP*8HODZt2)FM$>Lb{BB=-Heljj_NC9)&wIN2HxC1$=RYl}_nhnW0Yelyzwezi6}E z47?o*HLk6!8cj7yW(X@ZFe((hsv0P}_H9MmveU}WaNR?W&qvPm@s^M8wB6;3I$}WA z^J?l)b?nw4G7UXv5sj$NTvV>Lk0Vx9 zm5bpnsDcZnqW3hYgL2vR#D_E2LIy-ve!tU}1Jx&~A@k5xT~STTErNLh(*upmL;c7F zI}p9N=mKd0j-t4eO330mUnqG3*0D>2kW$f?oNxmP;2y(FxzQTeZ;2?z6f&8gqj-3y zf+|YZ6>CZ4SXc~?G^02&GZK3$#2yL_;IN)kgU z^N>?r>Rg(S%jfrzZp+hvwkPGsyuiHH=dhmjhZ6*Ai_6)t@k$GydmaaVbc34C+x6)F z1c1F?Q@b&luQMS}uJ3AFkHbe-Y;rVW_uYm?C8|nKT-?)y=kPSE1MsDDVWa9laXpP) zK>o#Ke#K?Km*4>#beACt_z*@#r|k3%vERd4|HY%uwkr`ZHm19im(o;uNepDoTs!+e zdnU5cie3y=A}biA*IJb+BRxGiBPwWC|RMNbaeQM-jEaW9Zax)hrVT8ET zk=XoD0*AqhIz_>mnUqvE*EMLxqU6Kh$lyFP4qZ-2SB*u65ey$63lz($x4qtW7Dqpqxk&~f@pt-lr^hr70c*KF z2AR^;de$#*b~aD$K(P>>$d-n zDgM3Ot#q$pZgn!Dc>(_VJoW#?k1q7Jv&8%U-f%vvk5ce|jr22VxgSo+5ReDsNp(T? z+7YYbyCGDmF z0xONt5&?j!&;0{X&DMJ%ujIV)*a=Fcn zh;lSa2`&N#|93G?BIbc&l?DcH6wfF$%^UC{bK@IM-R;L@q2gOkw>qZFw&EQgOTAwbuOsQti7Cf>gGVh^z9 zLmm+PnA_I7tUYgQ5$$jNHw!{F1^6fVl{v9;i1c$hiTyz+J$%r0Vs3 zZ)oINEJJwA&Y@t+TBzil1CHWNV5m2P#uo#)N*wCq>On*~74wFA5mNL8&@HyAT&U(; zP11DifISktihUexdk*Ds*{WobF$my#=H*{X;6lwtFuunm6E3{UHnA&7Fv7&O^c+U= zdI;N6czf+_qDAcKj!faw?VPyES;Tje&4Z%9ohWtqOo)TPVE@MLw=^^hD;s@(a z0IBYrX3Q1%ry!J$E<><@dKPech^hVnT!al*wt6~7Hc+QgrqojUqWYGuO6iMaC1aZw%SehkW z*x-EQFcMSMax~PEsvHDmSz7SWf0iD-fP4zCa9hE@&Av*qEo8`jwkm1C)nA4*RLgVd z8CrE_EY{7S%W`hv(x($db1|zIO!6|!GRk_5bnJE>9QnOZ!177bQ_Zdt{}N&C>WbPl zSN9G$C)+oNn5^J!9O>UtFoK0hULp|K0Av_w zq>Fs(bD(`j#s%zB6~oDuvA8SP6lNslxz==|$-v=Klg$rr>`cuGX{3%QplS#?HDb#iv)hd&tsq!>@^hESe>ddP zl7XrIR;^zAI)puSMif-o^slAV0^ARtWtRfE`^6t|&{2n#_E6xu>Q7Vp3Fy_1PMr`S!ScJ!lhbt;PP1gTHV-ewZFdkb_RU=wa(Y#X*(u30Q?1{XyJWV zbNBf^UwN-#7dG=~Gak0o_jNACYA?P0ZUUI_s#A7Osp&^)R?_(ch_t*_$StQ z*SB3{Y>pPr4G!7V{k5Eph6_d~Iri}2c`$PY`lbL6gglJT)*m4;MZ@d1HqI~E$M0zP zG~OFuI_};|dvzQr7`VI_00a7CT?f7`m;2qy@1Jv}=e14~34E{9FQs;V4PEy#|B+Pv zZ_n!Sp<4#}&;2U%;e3Kmm`4_c+$Ec{v+YfsPUp`YCJztA>iDCo7t(2V{_Eckd_0F6 z6n{KQwmnPtFZ#5WYYb=wu-3YJ8}|0VYliE7tj6=oQJCq++q_QAfU|{{yu9~+Ii;PRxt8l;kn#$&Jw29Ioq1LpW~X*oPePbZJbps8G6uUUS7 zwAbb^t2+(r{YBuob~k`R8RhS+A6exA3fSI$mX9ogwQ`qwfQNW*9=|`<%?b-0=hfp* z|Io$4xY|ZawaS=pLYC$%2~2@d`xDFAHZtb;4!$Py_VKGfWMc)>VAXPQlwih@aTF94 zaEeBpJ2kNrO#AqBFsO;a z<}8_b6Hx-_0c0l`;MG9~h*A7PHpis3NHA8WNypG7AWhm1szk!^7(tX>!lrUnf zA>@waObwmNA^SD@s&M<&tLH~~8+nc+R_v+Ot2f*kfRsa5ZrHSR_u7~9l0my-)S0PB z(ewItLNx3h zMaYpko+W!=^@iY!ai2GH<+?1UIg$3}&JpAJ0%-TX0R9jCPaNd~%HU^Gy7|wf1aLNU zba0_JHZ!sdRrRw)HN*42{&Q}hcfB@B8nhL|BHO>#j*x2E}UhvO5J z!Rzho$}8{r*#~g_=(WsdOAFb11NcO3UOcZ%Dfy9DpoERO2fX-DP!o+~2E;@&4#4#b zh=0;|wd9jnd{K^-+AfNu)fKb%jkL(=dIt%oqJ9sI8mrzpF(X4mz$ERl4iEfdfA;m=?rJQ^xYVI%Ms#NN{Yg$rBwO2_I79?w{9W#Mm1*nJ}UJX1>j8=Nl{oMp^x9v zf7m>|!s1c$5u07W(PrvcQTFF+*7>*r(^dqWy?czEhi{8&gJsptXi z@{%b81}(a%c$}v;_z*=HiEqSw4G1!}*3tmhILN^!Qh4Xc$uD_s&Ak2K{FOqTuKs?{ zKfV#o`NdV>R)FLtu~c6xv(cQC&K+2>Rlps6&mV1pl$Zngpq=g}47J9OV`dr=4{;VC zn=asA&F|h>u%BO83Y`zTK3@Np@aFt(M)a#XH>{hvxnqLgYo0FKwoXXpSp%X?bdGyQ zQd+kcooN+0b)4)tu<@(`w%;$&(3Rgb(|-eH94G=h>;XH;dKYE>4y!t`>(2*Hi58eF_cwcE@vz5|^gi@YhBFUMuTH z9CtjZ;xz0U{u7#}C#!(D6~VeFT|pFOrgs2!!LK59MMNdD--m!Ki2p0xz|h30uG9Tw zKJD=TuX2NzR^$3JgK0V9E@rBCtS>pO58GGDW%K1oYDEwe4->DD2F4LZfT4f{`e=bf z(Ka8(nMt|IxTAoCAQ3uhfowQhwS*w0j^p&F`dFBx9#iR;m|ItrP>W6ev`x~ zT=XjM#mkz`0N_gDzRylNU&dFc^nsUHcmIC!;h`?7+u+)b~&%JAgT?xNd@Noh<+8W1=|bQdzWuoGVV+cau|# zj%`RLVZ%>a;MgidJF{<2azRLdDP7^uWq6kl*9lUP2cQ`p;vRa#2_2E&r5Iz^pjD(e zwJxAmAe1Xj183{=Ej7V%h&1BQ*Vhg+KOpC1IPwlZu8-TB&0UL& z!^B;~8vK!8%>aSJk+PZsZnd8}*z`uQLh3t?k~{;;$^dc}tWuegtn0dx=hE*maL>+6 zI!hT*17u@I=JG?=ROmt~4nP>qf&vU(_s7A{%tL?$l?1Q1hu+E-6eFK)PYZ#b^B>9|wBQc+|Q z+@JDPO^9#Oy)v4If#ncB35O)R&H@ncN!9@Ym!WQQ&b6_^c4{fK>>KRay2JTS4;L()N?qA zkh-_#=9=tQrRyB8h=ckWpBR`@9zL!(XA-rVwMEP<@a$?VOai7{3Mv%$AZ4?2GeGIO zfV!3>zG1;i{=x%h&fkK??H4Yn{6qd_?O*hzix~RA8Zfd67WC2y7sM0(KD;3ID{p_z zq^?2{mqs!in_1M74w3H1=3FS)AzkTL!Fa%oL-)JBP|w4dULNJ-M}b;)6yoMtDsJmQ z<`!4VX@U^RHjmhlSTq|o{bZn~5r9~ME)06XHrJAJLx5udFP1wm{xEt^%F?PFS<)WRIb#6mc`U)5A3Ugn0x`*f`uIsTysT_%79#L^_-M9 zH`a4Vl|$jZMAq*4@}Gn?E)Z}YrsmzKg+3bP`SQW?b~7#sKZUjr8@BdI#X;2{(r5K% zi@!+p0D3%x6Kgt-ssw=5e?IC!+$Q$O>X__ zy1z47ERNDU?lM?c=^^}ve*;)Tb>hOLbUT<^S$PvObGTh*SR*gcj^*p5j`LO5#o8$h zgih_vw6ZgKw2n^}m_C$f`Af7|@ftLC)0F7t^!P82%g###%bzWO$aSCA8WX82i_;L_ zd5x@7{>`ULrTHH5>=hz)c)Mo7%9oy>IwmPdi*WWtf`U``Pe|78z>L6$qys?08DeW(XKWn7#!k{YB9m z_q7UYK`!&*%VkzJr(X>nsLM)YOtZpoCAg6(U)ALsnBEhL=hHm`6I@mWq=7<_I7M~5 zC5?lV*nhiJ5EgjsHHS*9dmPfOENrYDOq0#1*%iqT!f`W*|Hf{+=$u=KaHClB7vuQw z>caR9hzxzKG_393|5IVhY;q-)M>JP}U-2TcOq)=E!eZa+j@SdRU~CJZ&9_e${U5AQ zvMw6rbgrP8F&o_|yHy@M4NvC4%*CU8nLJKK7I>_eW94=DZ4e6{K-IGCt3d$Zvjoa{ zWln_SZ2@cj`+{!2+Y zFtjK&FAnBem5%_lEofF!@2zMkUIEW5={&=4ZHe`9WJnMF&cI z_@E2D&qlWz0Xu`u1nd z0Tyt=I+jSgClsQtqNw&1d402X-;+Z7gI>`{o*f?=YNLmu+vNJk&opK>1VINckn8fT znno6{R71w0Qi_EMzAdXmw4xE4rL|lMljQ?FKFq#2wh`wwSUpa@J$9f^{2uF6s{$&0 zd~ylIRFxE}3zHxzU9vrPVvwC_`TzP<_@$@RthH zI`pDi@w2*YiK{8gXmeVckyw*e-`q>?(3WJB2VOLh#L(K0*Pjz9CcZ)=-hibZ+q`-T z@v}GzzV8-l4K#=}Y|i>BDHH5+kmPAG$3v55SEtO|tA1MBPkoKvVgWXJ%Itv_%-c6Ri)6j=`%f^gwEg|$BG?{Y z1jA-LLm8{2ZU-AFYV8{d6)Ee;1Dojr3;`l7ad1BGR{VqLOLrcJ{YYIXCT(=1M!xgito7Ax< z)O@5I{~o9}rdL*I)+|MQbUrGUv&PmWB|689(KVo!5?KwXEPwd(Lrc87r@XIzZmt29oar+88O{r$(rZ#*?RZH%^z^bhQkU>_NSWB3Z!uXr~*%!B0ecCVL_{XS%8p@0QeVY;u9}Z^5$6`6nE} zTQ7llT(|h)zkacInr8#F_fN0TY-DGoscxiYEh;#NOx~5uCg#*Ihu8k;cVww<{ohrb zs-Db#BI{q4vwuo=(!!Jg%<{0}EvBKT%I^_{{VaGz=H86R?Z)MA_MDtbAmXb=_K@e% z$N==Nee-#Z!qIt6V`bbG#5t>E2V4Z;?hQ{u!ZCbAmS>$@5EtWxbm>QueCrMNc{rpW z)~_N=e&0d)>p-=qD|mN~I0G}*C*%uoKuLVLK}R0B{qCO$J_X%#H@)j ztW;S$M8ktWFL@LCD3;%k(Lb@DWX8DYKgkYED~ps(+WjBq6@Puc+Rr?2?_%8 z`5B@Ct*NrKHgy2if)xQ3*kVIg!rd2Q`91U`gsDRf1ybU(k|pR13OA;<7U->7SrUb2 zQJHUeCcF+FOS3CH2nm#^W@tjwXm>x6g>~0XJ^2`99VNeJZTWunwRC9zqUK;JuE4)Q zl%ziNS9c0WEHG zTF}83oGCp=Qb8-n`^yyFd0L<5$jq43dFWoB0Rg2SkGg}qAQpY@nh$=)hq@?*RJ;hk zjtX>6LT9XSI}6F=AN95ZEh`JKT9)#$8E1lg;izrbjMbNDMLuj6z)~v0d1k0wp5K|^qF`_jC z+aN2pY`^SCe_eDqtEyn`Fco~9x0 zuAx&ES8`6VPnv3nK_8x!lmh|IPD3;4zC+vzk+*`41*@mevBsfSoJLE887pdB%upW0 z88$@?-FaoC0{oDSNyGmo)wt~UxV51?sIwYv>*MGZIh8ciqevLD^tCt6s_!@wd&0Ul zP3t$`Dl33YZTZEO)ERO-0aUFraXp888f^_WxANN1Ys`Ze^tWyR=!I$QIEG}=DoZLJ z?x?HnRZ(myn72jGCVl1pwWdV+*zT@qasn?tA4T5|V>ziBrRee8R`2F@=G#8W|#-EJ^XhvK4ZM9|)S|AuNlE zvYFye(66mFrsn?Hf;$uZl?7SPt&H(U#?E}2d86x|KbW6#ulRqJE=gYQb^)ocSs^Qr zKWMG|b7P=qJ)EZeN8fu`%Aun6Nf2PuUj^Bs;xGo>5oy={rXv6HG&Q~L(S(G!)ui>j zwbBLd3_(QbrIVn^y=|@DBE)ZD!tUlre4sID)X?u_X{~})=h>oqT14g6-}GqH~#+m;SUG4o6O#Y;_(Sp(UWnrNr-Kv=8`W$OKu z*;JdbL0`^@kBH1k(Ktlcw;_{@!TgyY$CsZ{G=a!T(B zjdqwRyHGbL7sk>RvMFSYGLEbK*PZEyJ#~>5sb|pG{pN@)q==f~agh3LY}2swDl8AM zRfoY0b_HUR=MUnjGw5@|@B&>Ny4Flm9bh*-8A7pHeFeg7NkEx*-~kurP%cys)#n-j zEs83_{F!oe44ooJ#2)vwZ2*h+mPVl70aQIj(T&V2IN=_Gk=DF1_*jQ}FXUSE%x@pQ;%c zg$;`i9Lt##7K7s)7%Emarq;br7ckPJmfYUg1XAA4mEV0qoZSDYtw{xa7rP0!!Kf}u zsNl6I?*Gk(nj%S1*ifG=e*LXPs}kEsdtAqi)*1N`S6=vzCmbPE&HRt#trl4$a44yb zm#P}R|0hAYX~t<*fwlng7oJ_Mu=1dCRa7BmX{b#UnhO()d#^CPrbBQnp&0efcpJ1V z0h4^s@0^66QL?B^?g5Ta<}ih}7N*7lt(18Q7oP2}+r*fYP)tj`BkN&U4>_wSs^C;+ zl%#0z;|4u0P(#VeZpYyJhPDq?R(Ut+S=wJOU*l2s*yk7Z!RJk@@g8o*KQ9ic05SKg>iPo8-)SMU#;}2~FI5M0%am>pH9& zOH81TOFi8RiUsP}xlMOhzfR;qIf0L{4ni1C0yai+`S8NfM{<2+4z3`5Qnkai+7Py9 z*g6&HV~9B0KjI-0qd-gvD9{(@U3e~Z4;_;bl8&()k8f6xa&@e#;#P4o2whE8c&AtP zQ@G1{!CJNY#Xd4KBPwwL8^uwH(PVSmv8`bGE;XZ{Cf9=V$%h?lH*Oo; zjJy`|BGl|sO1cIqm_<@I18mfJZ`_R1EAG1Jh4(CwD|OMrYQ*yZw)6^85lpVwVIK0JU&Ol9UD zdIz~MA}f*r<0pIy;W5i8gb#%bUIB{U17!$T1GWrKCOYJU2ZG=LF(P_Ml(dFQKzTdh z#skKK(yn;~cZ&#&=|vzW=|#vv{*dyZBZW(?zb>ykUK{Q!S{1&uA+d?*;_MmDt7e>m z1-YkWL4qOkY#h-vu;|_EA`wLdhbQJS0E3F-a;ywRPDk<26@^~%WMt4{ZOxBsd;M-vYW6-)zhK)Wb zFKE&{!i@kx@9ODXs&tmStw@%_1+qWsor1(JrBpJ#!+EtF6l?z9=VBLP+KM;@cF{)h4qrjos$ZujRvNQf8M9+6R zO~VzK%T)J%6WCVU$cbU?U9Gh_{9xX=xe?^IyV1U+nDRT~FxzbcRm!j8dfMt*^j+4> zz0o`?N$j5BUNV;z4>#ECpX0@XBx*5}O@e_uyv z+Xix)IVt`jX|p^vhmGP{nCi_p+0#*XIpk}YEBe-cQY{RDW98oqN?`D0Z?Wwumv009 z96!enlX-mTPB_LF_?=Pon3@XqqIHD-61atRNHVnUb$^l+GJ`aP@&P)7+ zj#B6E;*z3?!S&%aXBBJ4C%(lwIf8GD0U_>JE3(d}-ArWj+Fn93eu!x^*pa*q zS^t>=q9!*D?`?wXHC*v1$)a}>jqzy(OXFHuH{+?#YI^jY)+~vQiik$?S|dP?7BuyQ z=Tcy}HCZ>|?e(x)xP-LB*z(@>Y&kBpA-?om;PP@cP46{}PpVOHtC8CCWmS8pZ~d=s zuG8Q3S*&V`W)(I$?%TJ`w~}9>-fx&vOUHVV6jw_4XC1P9iymHYKi7&wqKMX`rVJ*f z*Lc==^Za2wYO5tb;uQ+wsMi5@lAmWo>p#(e>nRQ&!THzeAZNc<9(wN=>$bhuei83k z+C?!oH%&%F#*662!2zFbmgwX!@ z_FZ1JUZ*Y=yfZFtKCd{mIWA|B-R-EvYqq}jZDoA_FNSzKdEUfEwp$=fc;UsQHskxL z`3dYrUBP9TxiILj{F{(FmbtqZlr-a8Fh6HD&q5>d(r zUK74Etq*@QNh!iY5Yd5TeYM06q%?!~3Hueu$^5yRlvlwLFWKo+?Jj1 zM)6Qp=G7BFAZC z*LQHRxWPtYi=~Px`jx|=p?yuGx|$R5weG4y%vZd4=*l_0vE4F9`ekf0tI*=s972Mp zqYdD=Ztqw3yN{;)kUZPi88U0#x{^|AR9O-{U$Xw#S1Qk3C)Cq!cO2<`b|pW6USi;S zs_I|xWsjT{jE7gzOY!buXS$ ze&D({Et@ILpc~BZ?<#J24UaIJT&w|06CVryxf3^77x!=-9G{b0ui*3grU`Dao>mbpreeqA@$GU>|el)P4=b0n{1bvQsJW8 zPT@x_L8)K;ef5*{Rz||zZT>0s#DIX+ z*7DUa9`pBRZGG+czFG(Gy01Q%2c5+pY5^*K!mZL90t@7v*bEK7YaeTYdMY0YUt@tQ zDg_S#j%-Ktt}_9)>}d2ZB*8Cr@OIYG$Y(-7r8ZVSfBV+J$9jc~v$bO%?{WR&9`xMz z#o55%#uJRWLm#sr)ry$f#qyVS(%<71hn(@0y~I!_dlZBPqSu*gbiuhq_I3POzH5NX zqr9AUPdbmWuHUW;h?|~&!rVk&nS{Ya|4cxBq1pzCy{S(bdCqE%9C>aH8d(Fui;(mA zq$B3@t0H0XtD?B2>5=~a3C|R#O;7sM7O;S|GRcJW7t2#{KMoNca_{EOQ+VoL`Fgv> z`FcF_89UPvCyzW&ZaGN|Z^3S%zGL^0eUAp)4;S$D#t#48twMo{GqtAr9nPOD_61A) z%}4VEDT}h+y7a(0wn@bJi&!Yl%ExNmrlxbex`jM+vZvY9p8yO*k689mX0Qo)A( zZXQU&&&w@j&(vz4$j3pykrSO|I!&2|&SZtOscgcU{{SV@Mv}xr%>p}GOC4W)jPSW& z9iNniW+NFXKQ0|PB`dGM>ImighlE>&C^Ih_5(}qReQzkBOI}iD;57&+WnfcpmbcNI4r+2)CR?^p}fXyKx(?j#*Z=^}Rxp~rfWY7}libN&I? zP!taqo07jR*(HCftnmRQhmu2)ZB564ob@m`rVUmyxZgnLFux+%)O5W^Y8#ObkSW=AgJa z!wnrNvCns<*zb2Q!rXP%i`fsx?6%)|lL)4YYOHJ#c_T8%<&BDKx9S9IT5Sn=gEIRk z&5r5?>mrv2&lLb$f%f0;sd}S!hMaZXH99K&B^93zM;q|{D7E@IG5!+CNUV`xwRc#&`x z2zM$G6^P@`V|nKKNk(?WBHc=WmI!_m%B6xw_z|SUg&PQbpJqaj$eV^?`!<;Ck>Ed+ z$7cEi#}YN|cTrBMCC@*?gFHw}l(e9vyhKZS?J&1|-(zB)Uw?Ai}f>HV;cLe*eNyH_Q?}g)-^i!xzVdH~| zg87V!m~>Jo>5wtM$prftwbn?7W7tC2+#_~M930c}ggoXOyMQF-bXsEkl^C1(#)ejy z_nA{2L;9NGJ0xI~UFW{yeeT=z_?g-E|450bARsUxLPcq+scH9Pj$dZs`~NlzlYb>D z0a-K+e862p`&)>Bm%Iq(Ve3k5>9onS4XbdZI&n}SUb+lC@1M;^{08@phn~rnU@Fu+ zbC|T+bkptxSxTXzxq%iUY2?*bdOEn&bQ5rdh%r+^hhF-zkxjj|(Z{g%ednvrsaK!w zC*Ljit*fN6;%^|5t!le&YHbM?ivT#tpYNtxW?fl{sWIz)!5Hd02!T{ohcR@GF!+pN zQTnM8wqCl0v~+aC%u=8X>^m8z%48J8!5F$RzXhZa>wb|7Fm=$$)G19joy`TIF5z$E z2;EDG>m%0WZJi!rn1dqRag8d)U|ll+S>mLb&>T|uNFe57wZh229}-I&QUFRVe2p*| z+bm#O3Ol3FUy&LOLO#$1Hyja0byZYIvfpF?Rhq)qf537fV$DrtJXMM$Ud*}?RymDY zo=1ixcQKVpn={0E1cXrp_qYfOkF3_Z5u+JFr~*-WTFw#*J(uuaQJ$^i` z7YwOl2=NqtU~^u0Myd=E4^S0pp{Iv4##&N9V+j1x4wTv0l%?>;^Tt#ppi08RvvRuy z>BO->nxe>!zp^6Tatez65QRpzSkjkoxN0U&i4fju&l!dS0<72HpQON&Tet_!**Q=_ zL{i}z2kvkb-vsWkg*Wfjox;bI;W{?8C0Z3iCXkb2QS&<@AM-FR03mjFhx65O>}6A) zg^!&_f2E;7Z<8*YE`2d#_1BhQXw%hit+UBV?Q%X<^A)GH{^+|Fg(t5B98nul1xRe( zuK-5-^>27f3ES-$r%n ziS4x_W_Fd)aiVhhK`+#C9T1V}jg)i@ze60<>#T4;&nOSbTZ)t|Q~dSy57-PQEGg)xC6H54*CKbokRcaYmfOgogB$RIo_$tCp#@V{Kc!=STanyQ1p6_B|pe&^la z{>z$%NaDW#02Gf6Pt!v{j(!wnfLrY~kkWa_OTTs|1|B1@Ie$J+v=(bm{bDARLeor} z&#UJCn47;led2pEhr~K#U|DkJnGZ)xm1EV`(C^arYHjdp z8WqN+2FW1izL`1#bJcYfviBjz8nWezn>N{qLGb6|6e#pvTA>dzdGE}r@^N?r`Alc$ zLgV9G_jBP{eFD|6=DJlf;1+mtOZQ#-$oA#~58@SP(2J}cZqK(M;=iKxvp?94wg8MC zqvqcnj{34Gzy5DdWW^sFpo-3){lIB?)r@zwVP)iCWL7ymFmHb`a<1|$^j!EPeEHwB z_y3%oJX10LF`k(Zsygee!ebDhgj;*IK6~MvL{0i8Z3q?6A7tnk^K1ap1 zjqwD{dVq(3{I$dsjFAVQUk9LHYKj;&MCIuQQ_JY&ly#)xQm9Ysz;FhjU1I+DAwnWT z+E2VEJQODDPh9sKl3(wF1*H?+pEj*1MflfyFu1CT>|zM-AH@_nD~gDUDH+xjM!X&Z z3o5!FGwAEZs|$I^T7xp}OyqD55|EHJnGDdekotea5YVZ=;R#cJqay%_K|GW--b;uT zgoU1pNen?j#QjH07Hl1`MY$nh1MqOmcQk}maXwh?^$~nWhc{A%{jg3`XC%<8HD^^4 z*6gm$Njc3kz&U+7)aI44m|GgmovNRRs!~i#vKWbMtC!gY1RcDFGS3?h-FDs;V>6+O z>(mha2sCz;W@qk!qR66aH6!8UwE-8?8=^gPGBfUb^#;m&U%Wsy1-!gcad zhmV$qfzbWn??V72TbYyOG#lBF2cc>h3EWWxLL};x^>qSCE;1T#kF|vn$62N=6ZMcM zrB8yp@XuH`YwMB%U2pF~s*qi&kM53gyK)AXL0!I4RQmM^&#|c@%s<|?CQRS^l(&v= zg}j;L*92Z256DbdAs@RQaMd-2nPg?E4@S0|N%@c7^ml(xIQ)PuCrt81E)?GX3=XNn|BihF zis(-mTb)-<&2SkE&BONdiM)zGTF4E-ab0_fiZOd}DYlbH(Jlni0h=IyEYWfm(C3>QrCX`;#h5Vml=4A-5h_tbQj!u z61ei+^5%RsU!bQNtSP`*U@bpX1FYa^nczRsLXGe%VWRv7v6NPQl&Hy|wPBS|*=h1d zei|z(s@nWOc}t5y*HB?!rhE+&+KLGjvulJfLr2G`lY)nh6Qo0?ucJa4N~b55v1ThE zhxzrLR$V9#QcC8JO0QDGyIZ3KU8U8(mENfQTJhFdPE%~8He^>3ZNF}>sOc> zAzc}_&XDR>n~yT~{0O zH!5#mL!E38+echmHS#-I31C=7KJcX#%PK6TjJUBOoAc($qS++FI*-r=JxLX`9I3Yb z0`3wpod*|dknPYDV&#;mb0X^Y;ey|k)KVCrA>l=2a+}yNKQF*=poMoD##jF<(AgUqg>+9-$o;Bm@H zoAkwoq#%T+mzIxTYAtooNJK%rU?%0k<0GHyM1(GD91#>CTE(Ns#XO=nEgZ>M*t+s> zL00_`YKJWsnZ#IQfsma}{MqRFI+PB3mbRox%AyC#qU@gNYkh~X?7hyr9cB zY}N$m2hi>DZHGAd!xr>FcW%$2N+i?HORTZ@Qb84zs{cSM*Fv zn=+HbZCFtl78;?rlsRaA2g>Rn@qUo((kNTFAAD3i4yh%ReDjQN;-f4Z>_7>o5kykT z!7kb`m{@2OuQ7T-<5y#02GqQij-Q5=O(gSkVME zWMuAi`$+QAni=DjHAlHL`@)HC%{Hho&<8tu5DirG#jB7}az)FUvr4A!xdXDBKgpOt zosbe;2Dg+m3@`?$cmsA@opnHaMmwCm1zaFf1?N#CfDEb891Hfs&1aJdSc%_9^vIMj zU?e{rVjz%d!w1(@D6(MUOm|0#-OxBc%BlNp2`I9A)2&Y}g7#B*LN7{;n)1V5jOF;S z2Fz~v1NPIOJz~Jn7$K-x9D}-_ZM-8(_i!-#VN3+;N!{Ex@40&$OeXlvhX&x=Ijt^X z%>mcOdUfixU3WIbL;f@E;8PTNj38UMMIy{MbzC06x19NMa9ab*6m4orAmAANlM4dV}6Q~3FQygk$`f|eeP z_P&way_BwGhtblBH&rB{?fVws?9_SP-gsvoWw6r7{#u{07q&IB%uH$`t>*aiafkW? zsiSW<^FcUVaruBEBDm^yNKzUu7>LX8xUfeKhD)?#Mgat@ZU> z%l4}BRXr?Q@YUeFK%n=o^c(!U>1eO3`M7x3{>?UW(Wr^<+i% zz`XOuNbt_^Z&#;l?xYCXUq;uhbYVeVPT(2Z;NaoH_CR83L2lU3g{1MwZ#Wtd@YLup z^AzODIusD}aNL_rWQVkW|M#&)i>3NIF<6G$z$Gi|DN?DDppenv`Kt9i`6gIa5NTm-2TcDzQYL0MHjVOg= zcCw_3AfSwxh^v62l7lY6(ei6O!2NmwyFZX#)>)|@%D2dr$wIXfX z6L$|JH4somn6~03^)O2t9c}^@pXbX>|HgAshFeVYjK&^`b_)yfhdr0pHi0!4NB5^6 zzVxd)VFdgSvm3N-jjRuYo90JRbqbuQmEGrQ|Nfn*t+f=De`xt0J=*r;9^OCLBilv6 zZ^3l?b$A~&sY12wO5*)BGnp{Jz;+L(w-t(%`rZbOg{P@PE!mVrBe1U}6uUdmOrN1S zUhaLrV0KTQSFf96&3BmeQKaZ8{1$c>eXIAkxWOf^08Fm5F*SW0d764y3bPq?<#bt9 z5zZV7kE&Mf`CD)yh)zuWidDEs99^UdSoX|ieAM?TG3f@G%3pfRWd&kVbE10E)Ep+% zO|iA8zoI4{7vnNqexvbL8O4_|WK-5T?`!?CTFxynDlBLy(M&Q*^tfb-G@~^ZUc6Hi znV(O312TRQoI!II%A7aMHz<3NP~v5_nM*n;F)Y+R%t}cuSh`obNVEKeFE8dLm$7h? zS@^9EPbG=tB<@@pC*Eaj6}PEea<#DtXe;J0S676JFaDOtq$qji`o~p+PM*oxE8L6AZtnEVl2aG=`n?Kk-=q;!K2sq52J-Ch*WW{}}J`lHzE@1wS z_USTt%-~zg_#Pv)L)Mh$`Q7d}&aAaWz4Yw~?$NmTMkNep6Wl0cz2;$^cqpc_Q2?nh93%B_O z{}is=?5G~E@C+}b2$uN*Ln-qU{{cD@T`&3V-RGD6_lg})i!1e^Y3gtPHdyBn$IDJV z4fi_T`AgyDUOt+!mKLmd{j|MZ>~E6JZ2lbJ+z>?3t0`>UK4jwDRWB(FKV8)U`k%Ge z=5x{MQ#&tr&?=O`TIQ_;(iK5PWVN@O@ymfu`nVb3F1X=yJhq8;=KZuk3=sNm52h9) zA_CZ}?N?88ugMvi?y^>Ro<>Vrj_)5Mtx!LM+N@@avLFS~MU&lH!fJXXTVC`JE}RRO z#6jabQwZDza#vke0~gO{bj?E)#9R6oH;|+$kLUO&p-EK^yM5YD?$(+!vF+@fA!Q@$ zgijT7!j)BsHa0G>A4?sZOii6#`5S;H)Vl3= zS9zH~{60O=T4dT-HE*xu!$~{~wM=q1a>O}j^@ zzD){0CE`t1ta*1A3~N8;Ni0(yJ(( zMIkH3pYP1-A`|u^oXrhoF_&okkvqP51d@NHY`Z%>wd+dwf$%)eqerJM|Yx zga(V@2HL@!+%8)yCLxbyuutcmJ4Ty=HP3V!qxc-R|rVQF|!e=0Qm z=;bqIfBIbY9(D6K0Pk|GS$_X6E)cp{rz*3&hWiEW?bdmxJ+Ctv#S1d=5Ib2ezS?_( zG?EFQ4-%fId(F18efOp|YQ-#AqS|-(qPv30B(65YSmR2tlr-BUMS!EOigW~K6_|y-g0O8e98WN zdCxuq%TXvp=spo5oQPIiJM|dsVj)yR9U($|g{etI4j|;7 z#*(98lW(h_QVNL}gJsQmjo%q)iPa4LzFk`DLbtq$@oj8>5ZW&-!IF(xJ(;}9(oNIY zkGv{k0Fc|U%wc3jKl$}9&XJpLcu$M8XH{22_2h}tCk?d8w15$H1DQm|?3xvIIU!T= zE!Kky1vf^e#i#56ijfrkAw(n-hsRKy?DURy!^Det#E>DzQ2_bkijsM09L|~#3ZL{P z%F3}1*=x&RFe71t8OWL1qK}pv3XCx`sHoO?0-%M7#&K_wJ(5tODH8o{p`QL7NCtvx zRgCbk+Re{Tx7+6=P$HAUSN@vCz?scvFOXg0N2h*AP<<6KQW@A{O#k<8I11H`+S?|{ zwK~x=vKT|EgepiMkv6JJTuNn_JSC~eH*qluvPNR70wzUY-NqE~=T%s*KagUAml&^3hI#S>n`<$9Z=GiYrWuz|6?= zm<==uW1>!_#bL0lSqB;f3nf)8O zmk5#?;kz-S8@2iSO7=wcb=&UFwXJ(Z4KO%*ubZ^T#s2sXAp{@%u2|pUy$q8QCKWSE zj3|m~a!>V7@?yVDqMhX%nuw*#72LWY!L4z1ZeVFugPDqD=jPV?)fSBdSRpF10wuI6gUZhpDlfW5Ovj9RAVHA6D+bzGbSc#}ehV zpS%(>TBvj=3+AkplD}0@aT@!_J;`e2jnCualmBp&4bk5Gc8Sw4IW&)ugimWBJLazY zjgp`pT23l_L2g7#o?cQLIJ;g2sXO7oy)DBVz?wcDA})*<~gt;BhZ?U z9D6EpoUhD3vI^<|f_)E*Ah91fYt=t|2A!AAgT|sDpx@<+}lqX{S1q`?~6~5(B zO)$BwL5w2_WZE3h3|06ME@P!XiilzzFREV#9RVUbYF)QlDUTt?G`L*egGNb}`sJe* zi#bK8o)Mi^vl9))`2(M3`Uqq!XkKVT-1#TkU`|R+wvps}MA+5;iX$gFPqDph(X~19 zK#%}O@hsO9Q|VcTRW=E`ggvfrDz~Hwa64@k2J@_4CYWXRNEO$|MjmB#4i5rBUc2k* zfl-1!Gx}?U8I#DzWeUDR3iyKsZfl>Z?FVz+FElw{Xg~H=_<(^UZ39op!CvMXtQ`iB z$OUC;Yy^%YlQYFX3HW?5QM+Ptr%FqRC(Iok?+?BuSpGPg#+JArkyGvZvA!!xj-cIUmO&PPW5z)J+m|S*v9ET!=du zT+BEX0e-pFvZL13=*S_53R>}yl?}H#54DHkY1&eln>V7=sKXWG+{2z6UZH5-mR-u# zZ4?xeYSAl~JV&`F%^^6m#9qhHqc-Kt>Ow=X9y5!h)vk8W*!9dBOBESXw4QDH=eY7CWKBGR+wVYTNT6 zgtEus>mYY>XWC6GnMzaD|xk&0)NnRk^G2t zQ;8!;SReuA?#=MQSO7Pc`7N%ISZ_yhXZhRKiCU4du@R7Q6&g*C!RICO0}x1g$Yp3( z4r#1GRPG81MEIfpk)%OCYX~*bEaNCji2W{JBx7P|^3N@NCp$HL<>;$BVQ}Ly89jt3 z`!BA}@vXD4ZQI#XO?ET6CfjyRwr$%hOf}h)ZQFLgY}@99iBI?Ye0iVyA6Q?mwbr$5 z$GM;TAw>4&f!Q9@9X`lw`_NjP8!~>GVqqz+3DrdszOH#TcL!_HRYLBRD z9+>UKpmvGSCPTr`?}UrIp!(HvE$xi;adk-h4@hC@hyL1NlHk!FT`OXe){_HqT*s|? zY@{1G$Zw)G6O(dCvZ3Z~R(d%;j$v;0J`$d)vjT=!HoptCn&SwCo3cQ>)Q4L+5GBU9K4?UdSDUZ|1>wPV3MdoZ&Y;C}r9hJ6dKimQyjBQ;{PhX|(mYZ*lxW#9moq ziyITJWeAMT$A_4QhQJ0(RpHj$tTx!1>hKttHwI{s+i2&*C!l)Bc5Duf3gTNr)vL^R zp;n|;=9zA+jk9Zi==i;ck(_c0b{WR5LeyV_#f zsOo-x6K2k#D(3O4=kZI_T%w$ER%eoT+Cm*QyZ@XKs2WkbDfMjC68q5`yD&{xKns4!^kC-%t~^7-5^NUBDX0O`Y{W}TL|iXX zoWaxBhOA>x2=uQE2J1a(#+s~4#fUmpX+S=FW7N+U^TJk1l$Sw~hXZf@u?%wv$0KjQ z11MBEs9581gIO?1{SKSqQ3^sV*shB$>Yfa`cM#4KPlABX%(3n=F;*!H6A@$8%5mD zz8J+rAj`C7vak(UH{x|VJUfB+fVqInGJv*+LzdZ&zA3{t&5EXs3H>ccPh&nW?^^{5 z_=?tK6H6*l&6H;UvSFqOO@KFY1+uVW1bx#NW;uE@heju>1w1HaZDr%dBKdysX@sW6 zh;wG6r#i(DSl9mQfF|Vd7r~obSvelloPZL^#WuDT^2G2qNfv*RI;6G$w+rzfD!}}g zv1h}TQ71Rs@J=GPq|P+mpZTgZr!&YVJbQ*qj9L;1acPbInxp>;%=LRD}7n5gt@z8$wShc;&hxVEqt@W;N>3aa!wQURZ5S zO|$AAaYHlB%uk$HNP^z>0vpW}gaO7hadjS#H_Af-wz;+ucBUCnm4B0Lz_$GKZ=tQz zg=(_KuxUkJ`{FL@A0>40kXZj6rVH}qAQce%V#xtgu@)g&`)T04^8gQb2A*4;@ui>5@5O7kF?j)=Zb% zkigJ|_-uSFy9T*Wi(@hh6%-POObRKUCbWmaZ#z3(;3^7DRnJwUg%#n92fFP8j-9g9!hBQs@`tA5R>aOgL%A^yU3QW?>_NpLGp|A z(!Dx1Be5EEOi#b;XlQ@^<-~@k__sdj|(fMBI8=LNm5%2Imv-wtPh>fK=7(y6yUi zr~SD8*hH|ozvW!Ew;QZ}=$Xy8uKM=M!Q+gu$icwSH4$eTPRn-&_x03d0v_f!bE1q% z0fh%OOQG!R#nQ~Z^8PKKy2m@8F*=q-j^y=@$KbT}pu^&o)OCCQ!aGF0?nw2ukK6UP z%AIV`rufHqKIjNW5PDhzDFD?=Chc`1++wgxZRTXD-zF+ZOA$4^yo1YNF{yKwr z9fn^xVRUi9BfgcFxe~^9n_p<6F z$C8VYKUaYz%>F(;_WPN&o4$?3tY>?l4&rCion3h9kH0VNbv~(AcixW}%8Z@ZyslYi z209%DLEM<9bO(+U=s$C3@pVzG;w{FmVtB#u@w%4Y?0X~PHTKWf8(RWW!I`zx z7MR6O5a+WCiDNtl$8ijzkRL4BfQ!6`$)5Kd&jImA;Jy5?7%9Z{ZrjRH*Q@0ahS~5M z+=RnpJrVH>stVmYAPpbHVVD%UsKfel# z_~Eh5vJ~T-!T+30P!hS~v?`cNw?>0U1G1Oz3(6V!EQP{xe@l!Y67H15*n7Pyo%aRL z=Aj_-J@hpV1IOeLEy|ZSD8KTg#Ly9yERNmTY`tVlc+gZ$w#3CQXQAMn=cgq6+M1i~ zgrIiC*ChU?!J3d0g^NE^-JR#vk<^ZqJLWUp%D;1dl|fNLCsEYrJ={XQfzErY1r#(W zx)sDAop|MbofyRKfI5m)Df(E~p*GKG0 z8%Q#L6qAd@33B2R3}wD1%xbAb5@##ffY}ayT#J~+Rs8Zk<7t=jC2Yx3nU}yvvGqMs zS;UnuD&5}5Uwt+RiuzaaLzA839AFd5#MS6qlO z+^I-JE}2W?y4$JVBJ*rLNU|cGYw@vnjLv(>mm|z~q;-Omcg@xV*Bp4dU>JtS{kf0YKdhebyta@;1&(`C|X0ZES`Zduj%PV3BF>w!UZMgkl z^Nz?9y${DbCVv2NAAqu#@C5%##vheE1Pm~2W8Y+7|9E11HGie>gYAx(+Ch9mdq)Do zy8DRt?62K}RlX}*P!ni#7ENne{Aj>7!#>0?!>S9`eA4!T`5+PqBp!^}dH)cZeTV(O z(HrBRImS6iFfiW#vl!~=1fhtDVok6l8cFW{qp5k2PA2{kd5$wd0 z?QhW1fn!=FL&V%X?JVs`?L76Hsk-dq%G!8jR-#gncADAH%5=2~#9z-yRcuS}h?%US z3e_S7B6FWCj!`~5%-w2m5{A-!oTuICou_QCHZ@@d72hsw>D(J|+VQ{vFnQyi zu~-7ExL9G_@1&%GCC097SVk@#@NR=Dygpi%Fp^LKR?9l1~`6zRB@~ z@Ra2iSimt0<2g~K#VYhgLmWw4DRF;C498m_V3z)ERl!Sv-^bminqZ={_QT9KhmnFw z2S*HQTqwR13r&yX7q8eIq5r5SkcoPo7+PFv2zNb-_#KwA6oDa6WBYpxfkd76_g-v2 z(2d-7FhLCzDd2(wMkU*;$7n^d$}Yam=|0MQRJ?h&viue`F5{v;pvTz-c$F^{MZ8WU6ZCDNiM zw7w>ebvwd3sYEaCzV9AP?8qP(t$g(pV<~|!Pp7aWY;l*rHcR!~S=kvGC22oP&wf^5 z|LbTED5l*?r#C0ckd-Z`4~Zb4AWOav@MFG4;xn_rNW4^z$3>TxT{4<7 z8yTV|nFL*c)ce_NxF`Tv7vl|feZjt~+PLC$*i>0l(AGa|)}S*rP~tEZLu*l5fZ`)Z zE)f=$DN6ih)0B)A=emJ`9uLKfM4O)+nf(Q!av#0VlKlI>>*{zE zYs3b5i8waXgTf>r98apC5ZKjomTGjRi54b5v+7y#`SAQ^<+$`Ek~91?QPHvt~P=kC?4r67qlFopzS>Lwz^OPkId3{ll%gzOVHT z?$mh)8Kg$ZLOT=I2bUU^eGHp@{8#bEG7qEA7Yr~kq|aZ#X9N%CWNKvS#9*522ZF~2 z51j>jghf=-7ud@6fL_$j5dSunb(H9>8JhQwy7*dmZ^I{VLAGT-Z2gx^p5 zx&G>o;c(nM^rOe8ZD)`fF=CDjLPNuFTUG)%ODlwLL#c)fn(pQg?w5R)ka=4+-B;_c zS08WOAI`HXwAzXTj>e+)o|>+jPOk94ux2H}@C6>u(&?L{KJDhtS-ABVBPulMa3Q*{ zHRNe|Hw7_)kVZEa5>zFF=&1oMhw@gMMG7SFoNL5L&q_#tEF#EpO!rd+RuXYyr{gIS zf8M_cN5xs_$iPKup*7*A<6%aha4i--zv%s;MLDc z$Re7ho}z`hIau9zux4$bMm0Yt@b3+-qCQY2Xpyn}C-1&brI^5rux0{u#{AE23S@mD znJ#1OnSBzGGBe*j$S^E_nF5@-E5h*lp;*;16s$j9$f%=f%f6McJ+1YFZ1!_B5y^bt zHE0dFu`OmH=-|J~hJk;%u_y;(U=j(#$>O9OLh`;^Gh2Ow9b6;rV#O^N*hR5ltuV!{ z78ho}u}#(DJ&$2Ua5kSHMEwoJ)^8psTo7lf$)0GT3u@UKZzC7b&mCykR}RvwoH6j$ zxSK&+jxF&h>EbITuaiX%;;9!~+eZnF5^Z`m_EeGST-?8c6I?|(d@tbXICEmc7^&z5^(^6nzqXvfaf4CIm^4s+OS4omnWspR!%DbuqdW4lQ8X)G z)T$nYUdG2jA~!PpC`#n_KHZSS>5rEFK1cU5jncJWl=88Ihg8igl;^!DNWmpM;jeU@a8m|p zheE7lGhX>|7KRrvo$~FVUmefdQB}ySjS^aD@!k9Zfh=)CjzDoW%A6vZL|&IQ&d`P= zCHIb26}YeN_dI^Qwc=idb!lBB7Z_*lH#$7#kOw%|luk({=}+;+!cmN9o)L~Bo=_p1 zj$`lEzL24#5a;%)hKh!Yf(m0v3=ir<{=_@Ly*|A|kE47IIS7L(?|_6LF|+*E$=gt^ z@b<^zh%)gC9j!kQFOAJV)q}734JL7*Ch)AS*&%I5OtBY5aUD7z!LB9(m9$XqMbT;| zM#<97&j5H_AzB9HSz+9XB|_p5k+%$<{wm%fJP+YWPwP|txZqsfO6fdq z>4mnj(eEFSqmR_?C(c{Qf8y9?f04)={v1SV%sdsH2O2a~AFo4j_BsX)?eQjZ-Cf}< z_G|p>s2KaRUdw!ia~!MMTg4-K39X9i+C1X>4ZYn*cEtH}yJZwQ!a)|~>@nyhhC2F# z>pAwMUx?W5SpnLxnf9zq^-x7fQLMw!t8(G{n4QSjrxr@tqgl@!#7A>?D#&r(N@Z?Z znKN909D0iO*G}=Bp(VEsV_{bXQ>ZiN*t^n>Lr3Yy8PYy6^xN-+%Cfw?)nEdq;i_y5 z!g!~sL^^d~Mn2srDuaewH6ot$^r-Sut89c_W7@mYNwJs6Ap{q|Yw2j$MzEo5}7e)?)IY;FHgxb3JdmV`GsU|(}By0C~qT$6w7@V&)?1M%Y=t zR!B|a4QKX^hWG0H7D{KN!e9CM5pH#17uz&k!nEqYngNONjR!G#$#;;ZjR+4sDSqzSAB zpKlfi~y6kA^b}hKB4?OLTue z4Bu`dK)cE&wQb?ppC%I{mm$R8FawY)3NR$X89I_dhgy3LKu$XmuXo-_L9iVRF?KUX zS{{8y4P+vlW*KBfH#2kD4LIdJPS4S@(4;&y;ijb(l=(R-{+^MiIU>H`U;-n0=fXTk zlaR~$6^>A75n|l&qyTFE`uPHJftM}Q{|Z&j&T6I1CqoM1!i4JnnYSLc=JT*xt$%CUb-dFyi^v0JVE+6Cko(3VbPRe;chX+civem9}MvO}eQT=RiIQ;w9RS|qKiMi`>nPZB4jZ!?XZ{+BtE zHUN|)*@catCzXhGY(gC}Bq{V&I4^DudcvryL80bLzjAG*nyvMC1_Kh$4egQ?8*4@I z9A=>s7X$XgzAB`0! zsF};`jy5oGFhy3CTN6g+jFAG{d{0*Hg23T(Zo+iF4IwE0D7kR>sw`b-Ws3EuzkFm8 zt#noMkk&0w=e(x!aeJX$L81&Zxmg2Cx{zErra{GFnH@)DofEiWN=i1Arvt(EHqE$% zA&(VuYs%@CErJlZS*=~_(5n9Rv?G~|Mwf73lm&)uGesY&mh6R~Sq3|(D0mfMrjWSm z4F=?P^jY3{V>WBhRHB+28g^6;Rdj-W%yx>!xRpugXu$Sn7HZt%%*AGXh5Ib!8Nnl9 z;YgNj6vjRDi2)jPN*gVSEL-OqYSvGL{t6@8!B{H>GoAbGqdBP#D2`Q;(61rv`L@d0 z6**S=Pq9`dafjAO&rp@m>j)iLnFLC8t`6kwS|8Ig!y)hPgS0##rQt07C7OLcTE>N_ z&KP|<{>^gt7AdNHRcKb2C(Gf*5P?1YB(ln{u2n9wHUPWSK^c3R(#~%BH=j=24aW$H zwxsA)ZRO-|+AJznLI{o>6%rQLwa}aSWc+Dt^S;KwPxd^D!<8O{WIJnP3RK=3&w~4T z;Y_(j5ltN1vtg!W5ee*5J(`95g)`{TrAfCQ7^<{nH@21Ek6aCpU%FimyZjhW zg5WLXumirjh7@$h%-A!|rZ3`oRqjd|G|5;^^4MA@2{-*yN}wZQTg_7nqNA{EVy7NS z_?8KdgK`ikY!0TX6jM$ZUI22vbSfUytm0Hwv0^q*!mmoo$BxXAvV84YM^#`;Saqq? zA)@+1LGD6lN<|e#QK)(8mfTJ|c(9ynsTKO^cLnw>diN#D_DZyI#8P?_)H0BJ$o#{= zl=~8>qJ<3NsU(n&)cNIC9V8*`DWsB_o@FAZ4l)*yif9(;lv`8I3Phwqyu?sI_!es;;QQnw!3w42&zZ6{frXg#3%r>nV z2`QE9v~~h+6v(qaE0_D>YVI`{X^X+$JOgC5T=mY|!g;HQxitGvPy9swqlT2`SPy-Y z#j68Wu+b!aLZ7v6s)Jq&Q04`=7haWaxEw)*!d*Q`x+~Q`3c_cKJnqh-{BZ9X^(CKu zgOEF54%n0=Wn|i1-#mY=gXMknF7PgWf;8}7ma|w_Cb__l#4jnI>V~_!`rhB|dkxq# z$Uop=Bi|7bibbM(6~LY}<0ms||9nfVzH z#(8`Rx*~)%xgQth0unz+%q*twPxu2|QtRk(JI)2_+;EtHcQFp}TFPW1z}s(c`nsmX zjoX!Q^Vuy!%}0ooZQ@sOeId&~naYbcr zi{yzWo-~Qum{-dBoaJdQnl;nNfgYswd=4Sf4yE@PPa-8B%d);OCeJA&1g}%4F z^o!7P`YwU%!CiMOzS{S0I_IMMNUxoLoAS~!lbNf}OZItebx$%oH4lah4>Hxf|B8>i zva7XULcz=JwOsPX9*S+FvTeGL!kbR@iMF11OicFxEqd&~r=cjeUT*-k=hP0i8F87` z1i3ezdCXMX;|j+)NOC(BQhw>3*4<}ntZ|CSr|Yra9_vaE;Cuub6NhJ4*n4;G-&~0B zXW!2_y__+a_^Q<3-d-{5dHc7gOnkOw*y|(3yx9#!SJgqTdaF_rw{QP!NTdk0AyD)) z{UDV|&OCmiYPdWfwg-rx8oXY9K}NI@fu2FB(=DM>gj;+SJxvZ{%~QxNEeDgC_?y@K zx3j@qKAZJ2@0S+~#1((n*VP<9elcWt%c)2Jp0DZ24D#=9qMq+y-%sj4M1ee{d1l&Zw6Yvm+uA;Y+=#8nsBccDIh5t!je^vVWIG#9k2Teo zK<;aD=dYKeumB~$pL8qG#@=P9rG0edJgj#4o_)mOb8~kZ3fzr62Vq(dsl4%5?}3#2 zUeKfGMWd_qU&2>!%RHoyPknvfa-8jb(w$B8r@VRes{XOxEeUYByl;el81|Nq-8FyQ z&+-6a4R&-J8Em_S#d@}Ucik)I=9k31ogYih;T*)Tz*2M83ZaMHWRN}K%`;D<{`y;q z8{1V+^`>S6D_+jsKUOchb=Mbb%AiMsjo#-6{)#o6j3{=`D#9Z%W_p zf~&Z{zB7H-_%*`g^qKDbFbw@#!w+Rn_Xz*6(a;jP~7YY<}U7lb30P7I={ze>x4E{e+ms^c!vX15sf=7!))K-bUxXY&t> zA%WjBC)oo=g@C3hh-^aJ26iH4+63N7Sb{`Y|LOPm!ua(wdCb#nKDJu6rMJ^YfZ6Eu z2Wdtx*1qH^rB+bJJ5P46VBFHH-|10$I<|@!;1GSy_2zcMkQ1iBI@_mdE|+guTxV^Rc6|DmA97hAFa0{Y3m}xs zxhiC&FNAQ1_1kM}pxS zj=U`Lpotg<^KI9Sf14=ysTlbJU`Nr_7_LVmzoTYiKn63IOxwo{`^n>B1`>vc83xT9BM(l)@g~vFF5q?(vh4$S?7d**t$&1QR=!Rko-j94>G}} z=%?C~WgcW@8D}2mji9ZSjb>BRFc13awqg_m`M|ZCf-c9kmw`y%x|@b?*SaTBStNX?)qI1sXXspA9i-f%_!`ZkMjsSPeol1n6KIa zmq4Zyy#2uaJ4dRkF$n(Xk>km3#P7cf_GY*&huAQ|zy^quCpX}~0lu1uKIp28^4ylr zSJTu9au$}k7l|0FXtPCR)7aCwC`P$|q=`FdEz@LY8!XXoErcBDt`O?RZWa1ST!d8A z)P=Ccl2r|KKP47EU|m>W#e6Cv+Q%rXrmogOQ2Fij-CHLa-j^R)-g=Mg-&u?wGSGra zjvQP!{-zg)YK>up0|kQ!!A5+9s64jd)`EX&r5v6@#3XuS>ByYi^zExB&T5`*19FaQ zRw1gsMNjgqgD(_DK2j=>(of%#12nzlUsi@;Dff$NAc7zq_EzqlN zRz@lj4ygIfZ7U=NPePR^xp3j^o#5+h)MKn|brCet`UL)Z1N<5^K#TLxh4%Y&@qBT*O_NorXho=K+D_0x(@8b89#I884!$x zFs1?o6OCsM?(U&jAPgC93bY$SE66C=y9Kxt;NlQp9GA~fGwrI6B@tdS!SxvwkCHP6 zYh35eFyU`&fXSM*y&CCqv_ZihY=wWmy{P!8w(+co((&htJx7Rf*Cmo3^WTs{_;N)< zmvP-dpz9|c42AgPd!Y{1fo#K>LA5%Hl@r9jtHNrQ)nv_6r;hFvVy1Y@@?<-YeMEA^ zPmHwZ7dOw(or_&L?jDiJipz&Lq8D-@;r;<|{Wa=zfV}c|Z7_*U$mrG`id2~}Ej;Z% zEu6F=VkNvWja%5qUm^S9)}S5lC3$;8MC{}lL0=5-H)~idf?uV>si%VkrBBIA{-lz5 z1a5%H&Y>(3|9Q1qkoAGzgfR6MSOinRd>6|7OW#~B^9$Or8h^YET=kl@9$qk()1}l`7nk#e_&@TME;5#gujbg zntv&kZ(ce{5EdT|kCHNiKoDl@JE9a{Av+*y-T=hKg_2wl`0VVb;F^~%;dw-dQ4SOK zV8i6nDXAzD>M_>>Zo}V@ESg~6@^le4YV@){LFa&RWXhxOcAu;yaTAt2D`&r6(9E}` zpGY|fp&6#spGQqs!}`Y{O%?*BR`#@kYdg;RDNF+^-K4QZLI)2?NFT@Y$uKKihDggkejRU`RA++UZv9f8>evh(#Mxx+5E=7PHIm(aL?<$Meg(wzEkxeu}AseIxST z{6s1fapHNWfj+;ar6bJHel#9X=)z@faL}%NHCvxn{`Uz~;8(=N?Vk@-9V1D0P9F{@ z=3DXddcSV!3iu&p&m4KH3IU6{>A+lD0D7md^oC0`nB*TrPhI$N_e+4V;EFVRA4Ng* zPLj{4xZbufM5FX}30$=q<^gPJco2sEPilg|Aar4sfs)-R1QkR>XtuGspXYBX+{8Jj zCBL*tY?SId1ReV*Xl8Q{qn@SanR@dWxPc1Lj5W zDnzO4k`&aH+hA&g%nQPZ5)Y6;AqG@6lKq=gg?H5!XDwLK4yX(Z2|va9 zgU(6FnP>UcMP)xPZHvnLEj5i04WI(450tIE30F$NEx;veY80X$)6xgBo)(b`Bd*A3 zKqg3bptE-&1lh)oWt3++|X;jN)4yS=AaCSAQ5Xl+tL6EcMRj!0aq{^H& zLQ_c;hwf?+ja8%5$!ODBDZp-YsWM=KaQl_^Cc9#|UWQ2vfiyQVjS~Lb6F5Pw@ya8M zf#l2S7GtK;C1-3M1vlbkYV{|5NT>eZVCCQ+l@n*cZ>Bf(9`ivjxPodg8~gpK6pJeouqiV=0F{(jLQyTuAqrtmi7 z)`%;=kjDSXDk-q60LQjXu$YN9^8*;2f|Hzbz|bYpcvVUxhvpImUzS)TRjWY~EvD$h zAQmW`u^^>N)=-`-=%uinb=)qaR?`MCS%Cj<2eeF_Nr8cz|54SSpx}`M3YMz1hnEPDG{vneJ11n%|0|9Q)?*CCB*kWTc3 z)Iy+!qzVAvhZDTb2VxbIL_J}3hfL-UWU+L6Bh~U|0uPX&<;>v!MC_;1Y4DRy5m4WV zLK+E)38_F63k4h473PSx=Fp+!aRz^m6;qj{S&Je;d!OUd2{Vdn&1uI#Da!et*_$YF zD51r-fd-0p!hlx{^1Iyc zZ+o(tXt*RL02FN*ctrRpE+j^d5RITNm+^eB;BW$g>RAqnYlR)QGLkttv1pM~(XtBo z03|+jZvh%7H3^=B8wtjpBq!DWlOTc0^fuILMZ~v+Y*Sc`Qd$)y?84KAX+By>$b$@q zO0omlV#QK%#@ZA`7aa12Xp&&j*izZ=eYYH_5+Kk<;m@HV_UwI;`@1oEoxFiizxQkme#C2*jz$HBn|zPL zH!++#sj+c^QYFPQ?QKf>^ol>3{eDR_$yc0~0>r?Z=_OjBgkv;mpWS9J1Xov1XYk!IJV$ffKM;$ zOkg~a%{Wr_3+t0sJQtTDn;DL@jxDva#Nbg4GFDs&7il1#;GVF$|ra`rC; z#NvB16H#u5*CIG8C=;G@UE(j!P!lj~cTlScH7nPb%n@Wi-4ONsr!@kadQ}ow$vxpX z2l5?rjLo1nAWqM7Jk^*z)k(&5AZrK2rU8OF1~7b*5?p^|u+5Gj%N#d|Lj8ilqy`qr z_H!3?mW!%fiS%Q;%q&ZbB5$ZUGa+*{_Oo9G^#;XIlk^o(zI0K3P*J5!fm%YD*a(K~ z=ZSK1M#`e#B*ee%zABae&WjU+mS&}-fksaYyP1WG$%*U5A0bH5L}IcghZY6tk^_OO zJtsF1g!^z~q`o@5hkf%<9*{F&HuO+XK9+NK^7BfxE*%!6mJywHe=W&X9qbOpr+Jsl zh?~+RW=ZX#pN|p}&r<)9ZQKrWXD8-`m7wP+3w=-UVDLv{7d*!jGz};!+@9>y9fz=p zL6jW+W!fxk+Ba^?IL9BU`74|iV;-0x3D^5ZKzbJe)fUQI=|BY5jFjj~hVS{aL8&J* zcw38!DT*LfJ0DWcOPAD{m$`4jEOab4^n`b4IdKF=5VRv_#ASF6M)o--=||8;@^3fd z+ViKsYPm@R4`cn>NkIb|kyRuyhiZg$<4W11FVVCHoYPb7(0*Mm^T{QskGL%x z<)PgR%0noti9qq0$}&I?8*__IN?@MEI*NUBt@3E>G!qZ6#J<# z-}p@vDc(^U<97~nEK(pDl`D|bE|~wN${W4V0vTFs1TZ`Ge!G_a_L0p5sVGSEja-35 zA$}a4E8Y{&0!JY*($K^cVcJ163t<4%fn_0@krj8#0!gJj6nj&`Ic||U1v47=I0JqF zx-$+K0yV{V-tO5fevAo7jwupUELd5ma{27oB#v;yW`Gvuotn9@z?cZ2tKW_o0;z;TvDR{jpc>ocn>z zHu8dpf~WZ9XA{B+fVn!>_$cY$O1MQ7+PI``<+&` zKMa3dsZ9RiXyr>gkdR5ZwQuxXz&*a%%;hvR| zo{}|K*P;47n~TKWA+$##2~y|P4HUg#+u1dfu#70b_~Enu6VP6&{rM=*%3A5|`w3tM z)0L)CY}^*j`x5JF0{8X+T-KTAxU;L$yY<+o&?Q=*Q{SNFz#X>e-89_N+|uu@XeIsb z{q23+y*m5FyC=@@vfNYuaa--)?EYpw zRBk)u^U!YX?sF5`aP-WKvfsfd>&^U9MM>}TG#|Q^)$RP#{%TWf0qF2@>}Pu$`986f z^rON)f9ihpN@+|@-s7e(oCUk%RT-tCZTUGFNQ4mw%WG^HPb&j+!RJ*O~l$t@BWn>4TN@A(yEMw)wZa)iCQ~ zdR28DO#TO;&UPp4OS!qO#7D{K+e6e~@?)1xhyCtmbpB!0qm3A3r8YlUR6WjII91H~s#&Ugm6y=A+Tz zm6f$)gTwi9XQ^wM@lED%$Ro8uEz3yNumrNJmwU_%oxlt`J=gQz(>Tz+$*HkfD0HMBg2&(>*`BB!s+Y}V6tzXVF|FEMS)|QrNOWY8nQMne!dD}42eKk?_(j4`E zuu||)>;3STL7=tWY3-)59oTwaYVw!MTx5H?iz2=HQC_-PZ?+KRQ`5x8^)v}Q4Fs~a z9jPCfUUwxoIRyJn{zKq7RXXxpu+J7~03LZj&6|D_M<>wfX0}_IZH$krXCkTQ$W4SD z_IFJI^I{@WpCwdYHTSh|Tz?byw2{u9Pq)@|>ueM^tF$+D`E17L6{E6i5Gncpw%th` zwSKAR-+Z55=uZducjoKbJAVM#_C7vyCu+(=EGNy`9-kd}W%|5jsrBzCb%D;ikrCzt z_E{xP(LeB)1)JFh>y3&#$tiPxWysxqXzU^Jz9a3P*n&|F{$uyXU}X(DmHga_4vSz3lwL z&+`|Lyp@#2Z(e@S+rno{hwhQnX^A%Zpo;i@`l$&M=Uv5$P@RS>c#U90v5vw)1A z{Nm!+8T@A6?{_ts{RKeKmYHFsZA8myiev1F`gTK@5mS)GgJXaBzf(nWK6GXPsdTZa_wU!Jt=~d{>eYy;=4%{+}2>B6bH19kV)ldO9n#yIaV<7 z@LkN=TD&6H$9lDkk@UNMSQ#{k^-n?$4Sc<%^IFeTD_%RRf$`n(*G)WJ=L=sqI^l3q zu6<45{YR#Sv|Q4{iBmHiYy82X^iGd1V*V!IfRR#ALe3XHj)Ud)~Z|2{*+bAEJ)CKN0ha?^!i3Oe)rPf5!O(*L>Lc#XgtS#|(2|odW+0Ul(R`1W7wc#bqGA|E=T}56 zeEJQUPB>i)k@}t%FCxcosRy#%kgW%OR*d~%=5p{x3#9k8Q3upkNb(MN2O7h0`HfZw zk$sQ*4nXJeqYGBzTCM{TWoP3v5k!6e;)iiH9J5Dx{nZCUASPxH`;+!o^})&>w*Mr( z317dz!vO&wQQZSum^29JhzW?H*ffaf*TYZfKA71(ls9uv-~7<<9YG(`F}olC6~0bY zcE~(`BHkIFi1+`(oyndcc$DO7$4@ut{}U_(tJqo)h~Z?dY>+iiu&u1|(S4;$r%<() zv73{56P%VZ@-EP0sHN~zTwiP7kl|=Z&TKG4OOw8XQdS@tngW$ zXI)5=X)42LR1gAL-~P5{H)+@y{T;pFN1LvSM4E4MM{mC(w!w@k(j~NjP1|T<(N&}7 zj5J7KLogqH+kI>&vjFA~*#g)ht7N0&C`O|0^G5G3Nh$2l&cb{B+%nU$*ny_S2H~Mm_EW@5al|8i00FWi$)&pct8edaWZrP?GADbRuUW zA}%+XJ84LhTRUv7=_sXc{oZks+l>WykyCGGF7vj6Us^r-(rkO(wweGP9b)dI2eF@^tsn>9+@ieLyssk>HR0Q`#eo{>D_f(Nz zZdVm$HSX#AJ)Reu++Cx7oj(gIIpc2t zt0=6@PSjav9m7-MQE=@~Q*=|ylp4<*lkEJcG(sa%Ig3YH( z-DZ^+MD%rB&l)$)i26Y_J$~Dk3(zX>AKdv`PiK2#KYhIN4xh`p5Ei8rDS2WZsI@h6 zDQSX|bcPSk_77no+^-rtL(k*pnW20mY%N3{S)5@Q-~&eX1=b%&=67W%ypB#d{Q3{T77>>23B{qiVM^0Ox%6qd{$DuL(5tzzY?$*3&8x4S&2x{mAK zkQk?!uI`(MscOAAeZIAiwfmS4e$2B@HR;SgSUHXxJ}9*9L-a3`wEHV&4@3`o5BzSV z?Ws}q+9b;_A6Ln}0{?d@gg(yII|B|3jO@#QbSyI)@L0(of8mjVC^c&b^d-#A1zk;d z(@ITi(^s(bM)I3@+e$h}CIgKOyil+vYK0Wp@Pva`D|FO1J@zFl%{aUHd* zr`6ZJB>cn}oUpk9G-}<%?Dl*y4odQ=$_nQdyfI0wN;LWG2NsT_%?e6`JYF-;WURu% zbSsAPPfXa8P2tX`mE{%~U4p{S;1{@B*l@Q_XI$vYkOSnE&KOch>121p&77s>T(w-P z65A4NxL*=ou$)eZ{Np3AUTx6G6T&DO`7>t{!5d3zf|*N!_q+mR@_Q^yqm%|Bc~1%@ z9M8%YR6BCxVU9YnvN*K{KMAURsNKJE8Pl+h4OL{kX=N03Gd>jH?;e6u0VJAHAY9Ld zq$MT17SHqBip2;v-#k+O)Xq6wJ9BZd@TU3({fVDqnXQ!}{Ku)0^=VlV4=0{i7&pMl|oj6 zwh?PZz07h?c{dI5Q)LHVlqb#llJhP@^9!ktC|Z8-sy^|ePy~5eZtfFqa))94OZm%7 zb7d(WxbQ`x8Wv4I|;7pt~ULtP?6S|EuQKFrEf$}Am zy4|BoPpo=`U+A*n73@ny;>upUsNQaXE^BNu+HuM{h!icIsSx&S=U60HM>pC@5D|jY zzk|{RKDci!B{g8W{*XR&Nq2M(n~#@)bcpwO*R%xv zPo4ibkWb%bzE2b0I_8mTFF|rDh&twc`r5C_Yc*B83!vImWMO6&T|9SNiQZ`MOf zGRA5!Vuo8n{!o1wdkT{FAF;}Z9ouSFoBsaNsY7}(WMh6*J(T(W1VR*tx;`OLPYR_| z1BHfhI!G% zUYEFwNQ?Y{z$=yxLSi2;QXM|VF9!tqJir3L5{=6s5h#SGo7e}1)c{oPk)%6?fj+p5 zG!)}I7>Cf|6NHX{Fwt0z)fhxon0Pu6h>)uCjug23UM<9NEvigh0U@;zJ);D2qChJ* zQ&Yhe|3fi5QRwj?ctZpwXNVCn9$pIZhCcA=1rY#EucJ z7Oq}FzuJO+e$X$nB*N7a{c5~iHI1u5JVAEXM&tmn&)hCTEj2_Ul57?hkHWhsyZy*3 zf!eh|O~k4*aWxbk;A!k{=dI4`us8cdNdzCH;@B2L7P+6Lkj> zd3b-V@7+*uz{Q`XaifWYP|tjjE$k7c!Yz>fQ1EOxlR~?aVErRtiAWRTngn-)+Puix;L8?kk>=sktK+0E|=X6+yZwa*FxhK*@1v_f!rA*&xMv}n4<9_ z*^5l7i@!+Y`wAe0x004DT)aZ##ULkaG=YDJOGdb*)}INFik&x*K)9BY`%BKnO@5?x zE)fGmn<+s^3xq5i;g;VWvV3xgL?RHiK4)wof2yknGURy?tQ5=%Rs`k%W5L{DG?>T6 z5LgM=G<)p@6Ko%{_Sx&{VC8m971#_Lp9wb0#>u+c<{|vGHct5GO!ApGDOS2`J??+g zJZX)|x?{-dYZ$B;ENsWM+H3Mz1Xge35wL*0_S>}}yKd3ut^}*Ganf6bjq|p4B$l&n zT)%P694qr0si(!p#-GdVT4-1I{2#)z$;Ox1d=|bYnIo~kfY+5nN1i=!T07t4+4CZH z5ATTe-o&f799!>d{?K{s#3lSdZ|8sQ$M*$SZ#i}5?D?No*4Na0^n?c#_~$cqOTYJQ zm-F0_)0?`-ykEJw?ummP?|*yGk1NoYpTu^=Z-p+u{mayWzl^>5r*nIk|FP?XlJ2hK z@j&(F;nCN=IdJ&7*r!G>g@Ql3K6IkG&9(N7vj5dbxXo2JezWVX*UtuCe0P83)b7a1 zuP;9FkN^DbgZg*g-S^qc$zLz~UGTS`e&MUXufN=_e5>b$M;`v`J1eh0^wP^K9^U>h z*TU1i`>8d0ob#*u8osBG233xvCoFF?;vC2%!*vjfakhL(*)V- zNKgodD)K^WJS8OmeY2{pzqxwT$S~a2> zLx;&QOPuLMf`Vx^t-@p(wI-v&Tx9JfQ&er(nkpmVXm385PJ|&e5e9$X0vyg7@o~@K z$9pEVcsie$;GOlc-j*=-=sT$f$QHh5h;M`eciSg=`;*Y_(~tJR_xnRfKL7L6CFdm% z6FWTeHM*%ulBCXI*DHrEjqbg&p$om-O`W^&ncHu3+1+K^kN5koMgDMrNqzsZWlz5O zxg%2FpOuwk7r%3aimiVdduzY?;k1Ek15f^F?{il#jGjt#GT%5ey2^3u*ki#>U%r00 z>!q>5H_lytQ#pR;vp7b~U?}?P1rk>)8$LM)pM^Hp=$0aaLvf*d&`` z)2zm3*&+4|>=)VH>>hS6`z7`e`xN^$`^^6#7e)OSP)h>@6aWAK2mnE*npED@QshM% z0068kmvEH_7nlBV4hny4SP6U^#ktpdWoxW>oRwEOfP`$25+IJrCKlL9AZ(mC<_so~ zaz~b>wXH;!6dfd?9N`XE3A9j#YXbyYD1}f;p`3wowDd|}AH9$CwdFnDQ9`fx+CuyO z-^@x@O#S<n{)H2aW}ZJkj+OxELU@t zWUi3jlq6P=6vD%)va399t>!cCNH*_gLikNVws|C#E4!^ygcj1_Ob`;8rotv2-Zz&k zg_7H*Oid~);3a`4^M#5uxg}e`?{JF}ij1Yo$y6?vOqG8s*^yKl0jiIfTnBO1ArK-E z=!LW8WXT<^=2E5Rj5}N%_0y3njOuv8=|aX$7E_h6a->?!P!c96EzsTMZkv)S7TtVC zS`#EUjC8eBLe`SLt>qxaq|Gg-OW9&Y>b9i|~aly=J;^^~m7+9L~NG7M!Muu zK=J6_DSj2AN1oU5nu+h+S4GCAgM1!}R7 ztd??h-45j};<+g`>Xwt~Oy2Kg)k-#3Zlz3T^QqFd>AqdqIN5Z4v2ts=lq!#9s^i7x z%2=teB~&TM&B80FL^tWrnkqT{l57znR$G60iZV~u*Hr3q4fE+;HK|35yK?FHh9&s5 zyFNxJsU%7#5cUfKk+=)d?x=;>sk;X{Y$!)0$I-`$xXxHQn)#c2t zkJILKeQawSWYZKhni@CSHL*p(Q~)9WoS4~laG$8JaCq0`?hV$&0yvyjVGjfXGroV1 zp%GAjyYc)3&v}|5jHZqw0-Dus1cVg|;9t<-9gZFpb|_#tLDSJ=&RkvC%(e{877oM> z&FMK-Z?_CF2;r!sN5xQ0t4LbW7--PlVHnPty4W7FtyMwY=rBxeQ0xSPr489ty{Brn z+m@rp9a9&(YEXM>PSCXQb5=zGX_;ElTd%WeSG8G|V+ILf z|AggHz1hCQ(zc5OSk=~cw%N853p!?$5M#PvM$q~b2?o2JsOiM@X6G4O+a*{8@{YF0 zdq+YKI+38$9d%+bHR0&19hh`Gv^zq;(}PaJB+6@`n4lQDjNRr8YakHpHxqy6ZXH8I z@7GPjkHjO19fl)VG-Nq2La=EeW3clLJ#0v>VADg!P+!6_1)CAFiUh4E$U+2?%_P?o zx{9V_YI~u6lCJG@1}tz72^rh9{em6Z)DfO$X$RUVB2j0+2G(IAYbX6TcER2RH*|8h zDYnB3IN?K}JB#cdG^DW(jBS6?I|8Q0j7U_l*~rL;eDUVF=J#JmC;clYmdig>Q;DepKhqw%>6KkN}ndN`+Ikh!(e~oS@Cig}+6c&c;z5Z5NOjEhb*<8W805A)~BRoEr z0Qz)Trm>h{#}Eg>h7}xCmK;<%OB{dybqltP5U@bPHt$7zdNkJK1Y;^ZJ8VO+6^Mh` zu*wRxO7Fo^Cmw9diArcGmY}FC6AY(F_*jsZdwiLyE{lKScD!IKiGz5Z;PDj=)kVeG zC#!3Ps;)j+T_*~*3JS*o%JKM#3aUs@D+OCk9BA};d{qM!P7u~Fp;jrVehIZ&ur*NV z0aU-oS1YI?f?6Zk0CAu(;PExY>ES1tKHO#?oFw5+GA!hFDAsSr>YS4$=VZZ70YWdZ zPx1K43VVN$uum22RN_GBG>@O&U}g&1r%CP8m6@kWGuH}sIuw=y>I{#sRZu$#YEZDX z#DT_{9$(i0^#HWbkWlLs)EN@$EWrk$unbUVd;BZ~wTqzE3w9=Ppz#ThpVI*K6tve# zsB;w5Itg{IU}r&LIjZbDo1bg;@N;90N3CFI;|zaUuBrrW7jqO+)Z^y|345XetyiUT zz5-t_!7mW(697LRi(c5nQ)VZ>$Q&4gnHPEd0Y&r({oz@r-WM+hWkH{Vf}YmP zH$)$dnhW`m89q^C8#;MXHTp=9&bD)5R~iS(34BOnNvh!*=R6$H`0w*IHspjIdBntF z+4+CyM5BQ|TnBL35$pnZGo7wIIE2)>LREI5x~N#PQ>RcJ{brNdV(|+#HZ0gh@Tm{J zrrQFD#|AW}8BP;5GdG~Ij9^LdSHowwmyhby%*^;oothbthv3=FPCg=U4P-K@A^0PP z73hyPQbrRzgGNDF9TO}C%r#gu>+vy_Z`psZHVQUO9IUp<;~Q0%v1)BL4bu*pxCyef z%27_R43tj7aJ+}-b=9j!4HSy_8!!8StXRA^T`URK(BNxLf8CgMQoVvkqVUfojLtKWYE zLQW!Vsoxf*i{o(du)gSCc@LaR_g11gY?kjfDUK_*w+fcW3TI%r&Es3u+WTnjO9U$r z2k@Wt_$59k*26C~RnL~~zDV~zh59R+D%494x|otlo5>`(VWdU0XErxjM7o=m?q!0N zuhLo8bj=vQPYt`w{ap);X=mB+8Fska#XeT`i$ z*u`M31M?b>U#*z?3Hw^Xwh#vh*LnQf2J8<2y;VYAFW5H7oQ2^Ik6%AgSA-$hB@>|_ zolBHEHwgAgD4h+Z8$EtQqtXFLT{@v8ow!tK-6Ys$&{_|zn>~J$O8iYGU4eg*V=CLr zv1exYMGwg9L!F?Y=tV`5Y+R)p&@Wf$w+MCx(9gy2Qy#xXg<(5|;a0)669?<=^!Tj} zVYm(ISIRKlCfHSwIS<;md;B(~%{oZ^(}G4y8uJs@w*6kDZk5HhR2f4gbJyJ;abnDB;f*@NU%?X z+q9E^Aj3-!f*opL0rtEuy!^UDy8iP3eurR$% zMd`gtrKSUd_p8+G0Xn7TDZxD0wGpm-X`)_j3J0B>yZm~6TCjfyAhrpfec9tr`<}^j z>lwiwBo?H;;_+u2!$cMMkPOqaDohW_Fg+*OZfN8H_EnER=YvHF?0LZ+CKgm)@c4_3 zVAG)ghy;64fjuI@UJ~qc&=?2(Wskp9vn)o4-OIcAOLBYcMf_gT*eix**Y1DPy3b3% zy={XwRrSON1S)^xN0E*rs68bxc?^@7{FZ>p7chydEj{WWvT8>>j)pa_lfO!*{%XBr z5bnH62Yw3_6HXq0E>w-N6 zu_{b_qs_4*ezA-t_?x4H@rFO6UmVz*8xwyrhg4C!@CIQF!2lFXP}lq8 zR51JfSEi@sE7Nw|N5D8NNr4_0RApGOHa5gS?!nZcY zJNdWqMvnjH0P8^elJsxqV)*}^Hu@G49E zbILxc{XG$YBbULae{rz00&5M{rLpfTD%|^5a$bKjEOv~>-T^i^SAg?_Uj9S6kge3| z`wOl3cEfwKw1CLyo8w1t5(wLY@Z(?uCLyR$G$8yW!GA;uKSfM| za3v6a*2{lBf$;n!1Qq!Pgr6t)PYK}{$RrT10>UqQ`Thxn=O!V@^fw~xPw-z5!mm)U zK)8PzMg4EohD|8Hgfd&Sl)sB=cz2>2mYe)t?A|E;NJqFXVr( zBjN8iCj0|>%>fOo{64{dN4ft4#3-77#489^xe=@UX(|6Ru-}-{%$7u`Z@hthG+$$X zw)r11dsEH+7cX&8xEUwc|8?@e=;2xFrRgtimb|*7FUBZ?g1r^8?H>MDsD3?U43TS5 zb(nqwM_D&)`K$U=YKP|qb?Oxz@_&Dr9DG}KxW5TD8;jin>ptw|f7e&)rapy##Fi{J zk=Bo5TCHr=m)8cDKf<;ALyi4C!T$!Gz*&{j+4MpGN z1y9K5hw)7D$3*A8PCK5dcr>3E@y8u_OkalNqdt8)o*50gGaGa*pHAbL|2uyl&yhZz z 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

<7W7zwl>hFsW7gZ^^I03MxNZ$`J0W=>3 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 z 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 wC0c|jZLE4B%i^>igdUPs*t?TV5 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 qwq^@yv`gA0?$afbHzRO(ll&hoMilk{ delta 924322 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

-20t3n|Rkz$wb<+(Pv+uzufY)t6T7yms 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

ae~ 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

pFqPb5vGXKuX|12ylmdE-u>sM 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 z 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

N3&fMvwhMtJG(o(HKV)I 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�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

  • `J{H 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%0D=~|7G=W!j^xQKu` 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 stNZLZl_6l^S(5|!dRCA9 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 From c5f9652019bba8220b4cd73b8d44d147850fbfca Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 13:30:17 +0200 Subject: [PATCH 254/440] CI: Update to test latest OTP 25.0-rc3 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index abe20503f..8a9502f63 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '24', '25.0-rc1'] + otp: ['19.3', '24', '25.0-rc3'] include: - otp: '19.3' rebar: 2 @@ -33,7 +33,7 @@ jobs: - otp: '24' rebar: 3 os: ubuntu-20.04 - - otp: '25.0-rc1' + - otp: '25.0-rc3' rebar: 3 os: ubuntu-20.04 runs-on: ${{ matrix.os }} From bde513d0884b69df1ebab40986e4ae364344e480 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 13:31:14 +0200 Subject: [PATCH 255/440] CI: For older erlang versions, get old rebars --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a9502f63..5c69809bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,13 @@ jobs: with: otp-version: ${{ matrix.otp }} + - name: Get a compatible Rebar + if: matrix.rebar == 2 + run: | + rm rebar + wget https://github.com/processone/ejabberd/raw/21.12/rebar + chmod +x rebar + - name: Prepare databases run: | sudo systemctl start mysql.service From ca786e810234ab603c514664ed99bcf1866573e4 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 13:31:37 +0200 Subject: [PATCH 256/440] CI: Update to the new "make rel" paths --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c69809bb..c6c4945d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,8 +162,8 @@ jobs: $RE/bin/ejabberdctl started $RE/bin/ejabberdctl stop $RE/bin/ejabberdctl stopped - cat $RE/var/log/ejabberd/ejabberd.log - grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log + cat $RE/logs/ejabberd.log + grep -q "is stopped in" $RE/logs/ejabberd.log - name: Check Development Release if: matrix.rebar == 3 @@ -174,8 +174,8 @@ jobs: $RE/bin/ejabberdctl started $RE/bin/ejabberdctl stop $RE/bin/ejabberdctl stopped - cat $RE/var/log/ejabberd/ejabberd.log - grep -q "is stopped in" $RE/var/log/ejabberd/ejabberd.log + cat $RE/logs/ejabberd.log + grep -q "is stopped in" $RE/logs/ejabberd.log - name: Run tests (OTP 19.3) if: matrix.otp == '19.3' From 5ece51f8daf54fe9981fa08cd6feca8a9f441ab3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Sun, 1 May 2022 13:36:52 +0200 Subject: [PATCH 257/440] CI: Update actions versions --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6c4945d7..b8a8b2c6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,7 @@ jobs: steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Test shell scripts if: matrix.otp == 24 @@ -113,7 +113,7 @@ jobs: echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config - name: Cache rebar - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | deps/ From d6de831381a88d3626256dbd9e8764a9a3c696e9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 20 Jul 2021 12:00:36 +0200 Subject: [PATCH 258/440] Runtime: New workflow to test compilation, rel, starting and ejabberdctl --- .github/workflows/runtime.yml | 268 ++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 .github/workflows/runtime.yml diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml new file mode 100644 index 000000000..7e44eb4cb --- /dev/null +++ b/.github/workflows/runtime.yml @@ -0,0 +1,268 @@ +name: Runtime + +on: + push: + paths: + - '*' + - '!*.md' + - '.github/workflows/compile.yml' + - 'checkouts/**' + - 'config/**' + - 'lib/**' + - 'm4/**' + - 'plugins/**' + - 'rel/**' + pull_request: + paths: + - '*' + - '!*.md' + - '.github/workflows/compile.yml' + - 'checkouts/**' + - 'config/**' + - 'lib/**' + - 'm4/**' + - 'plugins/**' + - 'rel/**' + +jobs: + + rebars: + name: Rebars + strategy: + fail-fast: false + matrix: + otp: ['19.3', '21.3', '22.0', '24.3', '25.0-rc3'] + rebar: ['rebar', 'rebar3'] + include: + - otp: '19.3' + os: ubuntu-18.04 + - otp: '21.3' + os: ubuntu-20.04 + - otp: '22.0' + os: ubuntu-20.04 + - otp: '24.3' + os: ubuntu-20.04 + - otp: '25.0-rc3' + os: ubuntu-20.04 + runs-on: ${{ matrix.os }} + container: + image: erlang:${{ matrix.otp }} + + steps: + + - uses: actions/checkout@v3 + + - name: Prepare libraries + run: | + apt-get -qq update + apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ + libsqlite3-dev libwebp-dev libyaml-dev + + - name: Compile + run: | + ./autogen.sh + ./configure --with-rebar=`which ${{ matrix.rebar }}` \ + --prefix=/tmp/ejabberd \ + --enable-all \ + --disable-elixir \ + --disable-odbc + make update + make + + - run: make xref + + - name: Test rel (rebar2) + if: matrix.rebar == 'rebar' + run: | + make rel + rel/ejabberd/bin/ejabberdctl start \ + && rel/ejabberd/bin/ejabberdctl started + rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + rel/ejabberd/bin/ejabberdctl registered_users localhost + cat rel/ejabberd/logs/* + + - name: Test rel + if: matrix.rebar != 'rebar' + run: | + make rel + _build/prod/rel/ejabberd/bin/ejabberdctl start \ + && _build/prod/rel/ejabberd/bin/ejabberdctl started + _build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + _build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost + _build/prod/rel/ejabberd/bin/ejabberdctl stop \ + && _build/prod/rel/ejabberd/bin/ejabberdctl stopped + cat _build/prod/rel/ejabberd/logs/* + + - name: Test dev + if: matrix.rebar != 'rebar' + run: | + make dev + _build/dev/rel/ejabberd/bin/ejabberdctl start \ + && _build/dev/rel/ejabberd/bin/ejabberdctl started + _build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + _build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost + _build/dev/rel/ejabberd/bin/ejabberdctl stop \ + && _build/dev/rel/ejabberd/bin/ejabberdctl stopped + cat _build/dev/rel/ejabberd/logs/* + + mix: + name: Mix + strategy: + fail-fast: false + matrix: + otp: ['21.3', '22.0', '24.3'] + elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0'] + exclude: + - otp: '21.3' + elixir: '1.12.3' + - otp: '21.3' + elixir: '1.13.0' + - otp: '24.3' + elixir: '1.10.3' + - otp: '24.3' + elixir: '1.11.4' + runs-on: ubuntu-20.04 + + steps: + + - uses: actions/checkout@v3 + + - name: Get specific Erlang/OTP + uses: erlef/setup-beam@v1 + with: + otp-version: ${{matrix.otp}} + elixir-version: ${{matrix.elixir}} + + - name: Prepare libraries + run: | + sudo apt-get -qq update + sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ + libsqlite3-dev libwebp-dev libyaml-dev + + - name: Remove Elixir Matchers + run: | + echo "::remove-matcher owner=elixir-mixCompileWarning::" + echo "::remove-matcher owner=elixir-credoOutputDefault::" + echo "::remove-matcher owner=elixir-mixCompileError::" + echo "::remove-matcher owner=elixir-mixTestFailure::" + echo "::remove-matcher owner=elixir-dialyzerOutputDefault::" + + - name: Compile + run: | + ./autogen.sh + ./configure --with-rebar=mix \ + --prefix=/tmp/ejabberd \ + --enable-all \ + --disable-elixir \ + --disable-odbc + mix deps.get + make + + - run: make xref + + - name: Run rel + run: | + make rel + _build/prod/rel/ejabberd/bin/ejabberdctl start \ + && _build/prod/rel/ejabberd/bin/ejabberdctl started + _build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + _build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log + _build/prod/rel/ejabberd/bin/ejabberdctl stop \ + && _build/prod/rel/ejabberd/bin/ejabberdctl stopped + + - name: Run dev + run: | + make dev + _build/dev/rel/ejabberd/bin/ejabberdctl start \ + && _build/dev/rel/ejabberd/bin/ejabberdctl started + _build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass + _build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log + _build/dev/rel/ejabberd/bin/ejabberdctl stop \ + && _build/dev/rel/ejabberd/bin/ejabberdctl stopped + + - name: Check rel + if: always() + run: | + grep -q '^user1$' registered.log + grep -q '^user2$' registered.log + grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log + grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log + test $(find _build/prod/ -empty -name error.log) + grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log + grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log + test $(find _build/dev/ -empty -name error.log) + + - name: View logs failures + if: failure() + run: | + cat _build/prod/rel/ejabberd/logs/ejabberd.log + cat _build/prod/rel/ejabberd/logs/error.log + cat _build/dev/rel/ejabberd/logs/ejabberd.log + cat _build/dev/rel/ejabberd/logs/error.log + + mix25: + name: Mix 25 + strategy: + fail-fast: false + matrix: + otp: ['25.0-rc3'] + runs-on: ubuntu-20.04 + + steps: + + - uses: actions/checkout@v3 + + - name: Get specific Erlang/OTP + uses: ErlGang/setup-erlang@master + with: + otp-version: ${{ matrix.otp }} + + - name: Get Elixir + run: | + wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb \ + && sudo dpkg -i erlang-solutions_2.0_all.deb + sudo apt-get update + sudo apt-get install elixir + mix local.hex --force + mix local.rebar --force + + - name: Prepare libraries + run: | + sudo apt-get -qq update + sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ + libsqlite3-dev libwebp-dev libyaml-dev + + - name: Compile + run: | + ./autogen.sh + ./configure --with-rebar=mix \ + --prefix=/tmp/ejabberd \ + --enable-all \ + --disable-elixir \ + --disable-odbc + mix deps.get + make + + - run: make xref + + - name: Test rel + run: | + make rel + _build/prod/rel/ejabberd/bin/ejabberdctl start \ + && _build/prod/rel/ejabberd/bin/ejabberdctl started + _build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + _build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost + _build/prod/rel/ejabberd/bin/ejabberdctl stop \ + && _build/prod/rel/ejabberd/bin/ejabberdctl stopped + cat _build/prod/rel/ejabberd/logs/* + + - name: Test dev + run: | + make dev + _build/dev/rel/ejabberd/bin/ejabberdctl start \ + && _build/dev/rel/ejabberd/bin/ejabberdctl started + _build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass + _build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost + _build/dev/rel/ejabberd/bin/ejabberdctl stop \ + && _build/dev/rel/ejabberd/bin/ejabberdctl stopped + cat _build/dev/rel/ejabberd/logs/* From 493ee7f5348ba3d6b177a26420ff00bbaba75b6f Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 22 Apr 2022 20:35:35 +0200 Subject: [PATCH 259/440] Container: New Dockerfile, more simple than the one in ejabberd/ecs --- .github/container/Dockerfile | 117 +++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 .github/container/Dockerfile diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile new file mode 100644 index 000000000..5b01c7393 --- /dev/null +++ b/.github/container/Dockerfile @@ -0,0 +1,117 @@ +FROM alpine:3.15.4 AS build +ARG VERSION=master + +RUN apk upgrade --update musl \ + && apk add \ + autoconf \ + automake \ + bash \ + build-base \ + curl \ + elixir \ + erlang-odbc \ + erlang-reltool \ + expat-dev \ + file \ + gd-dev \ + git \ + jpeg-dev \ + libpng-dev \ + libwebp-dev \ + linux-pam-dev \ + openssl \ + openssl-dev \ + sqlite-dev \ + yaml-dev \ + zlib-dev + +RUN mix local.hex --force \ + && mix local.rebar --force + +WORKDIR ejabberd + +RUN git clone https://github.com/processone/ejabberd.git . \ + && git checkout $VERSION \ + && mv .github/container/ejabberdctl.template . \ + && ./autogen.sh \ + && ./configure --with-rebar=mix --enable-all \ + && mix deps.get \ + && make rel + +RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \ + && mkdir -p /opt/ejabberd \ + && mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf + +RUN DESCRIBE=$(git describe --tags) \ + && MIXVER=$(echo $DESCRIBE.0 | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') \ + && mkdir /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin \ + && cp tools/captcha*.sh /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin/ + +RUN export PEM=/opt/ejabberd/conf/server.pem \ + && curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \ + && openssl req -x509 \ + -batch \ + -nodes \ + -newkey rsa:4096 \ + -keyout $PEM \ + -out $PEM \ + -days 3650 \ + -subj "/CN=localhost" \ + && sed -i '/^loglevel:/a \ \ + \nca_file: /opt/ejabberd/conf/cacert.pem \ + \ncertfiles: \ + \n - /opt/ejabberd/conf/server.pem' "/opt/ejabberd/conf/ejabberd.yml" + +FROM alpine:3.15.4 +ENV HOME=/opt/ejabberd + +RUN apk upgrade --update musl \ + && apk add \ + expat \ + freetds \ + gd \ + jpeg \ + libgd \ + libpng \ + libstdc++ \ + libwebp \ + linux-pam \ + ncurses-libs \ + openssl \ + sqlite \ + sqlite-libs \ + unixodbc \ + yaml \ + zlib \ + && ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so \ + && rm -rf /var/cache/apk/* + +COPY --from=build /opt /opt +RUN echo -e \ + "#!/bin/sh \ + \n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \ + \nexport CONFIG_DIR=/opt/ejabberd/conf \ + \nexport LOGS_DIR=/opt/ejabberd/logs \ + \nexport SPOOL_DIR=/opt/ejabberd/database \ + \nexec $(find /opt -name ejabberdctl) \"\$@\"" > /usr/local/bin/ejabberdctl \ + && chmod +x /usr/local/bin/ejabberdctl + +RUN addgroup ejabberd -g 9000 \ + && adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \ + && mkdir -p $HOME/conf $HOME/database $HOME/logs $HOME/upload \ + && chown -R ejabberd:ejabberd $HOME + +HEALTHCHECK \ + --interval=5s \ + --timeout=5s \ + --start-period=5s \ + --retries=120 \ + CMD /usr/local/bin/ejabberdctl status + +WORKDIR $HOME +USER ejabberd +VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"] +EXPOSE 1883 4369-4399 5222 5269 5280 5443 + +ENTRYPOINT ["/usr/local/bin/ejabberdctl"] +CMD ["foreground"] From 8d15e973e24562ef894de355ead51909a9b94ceb Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 10:49:36 +0200 Subject: [PATCH 260/440] Container: Copy ejabberdctl.template, it requires some customizations --- .github/container/ejabberdctl.template | 329 +++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100755 .github/container/ejabberdctl.template diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template new file mode 100755 index 000000000..5b9ef36cb --- /dev/null +++ b/.github/container/ejabberdctl.template @@ -0,0 +1,329 @@ +#!/bin/sh + +# define default configuration +POLL=true +ERL_MAX_PORTS=32000 +ERL_PROCESSES=250000 +ERL_MAX_ETS_TABLES=1400 +FIREWALL_WINDOW="" +INET_DIST_INTERFACE="" +ERLANG_NODE=ejabberd@localhost + +# define default environment variables +[ -z "$SCRIPT" ] && SCRIPT=$0 +SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)" +# shellcheck disable=SC2034 +ERTS_VSN="{{erts_vsn}}" +ERL="{{erl}}" +IEX="{{bindir}}/iex" +EPMD="{{epmd}}" +INSTALLUSER="{{installuser}}" + +# check the proper system user is used +case $(id -un) in + "$INSTALLUSER") + EXEC_CMD="as_current_user" + ;; + root) + if [ -n "$INSTALLUSER" ] ; then + EXEC_CMD="as_install_user" + else + EXEC_CMD="as_current_user" + echo "WARNING: It is not recommended to run ejabberd as root" >&2 + fi + ;; + *) + if [ -n "$INSTALLUSER" ] ; then + echo "ERROR: This command can only be run by root or the user $INSTALLUSER" >&2 + exit 7 + else + EXEC_CMD="as_current_user" + fi + ;; +esac + +# parse command line parameters +while [ $# -gt 0 ]; do + case $1 in + -n|--node) ERLANG_NODE_ARG=$2; shift 2;; + -s|--spool) SPOOL_DIR=$2; shift 2;; + -l|--logs) LOGS_DIR=$2; shift 2;; + -f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;; + -c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;; + -d|--config-dir) CONFIG_DIR=$2; shift 2;; + -t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;; + *) break;; + esac +done + +# define ejabberd variables if not already defined from the command line +: "${CONFIG_DIR:="{{config_dir}}"}" +: "${LOGS_DIR:="{{logs_dir}}"}" +: "${SPOOL_DIR:="{{spool_dir}}"}" +: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}" +: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}" +# Allows passing extra Erlang command-line arguments in vm.args file +: "${VMARGS:="$CONFIG_DIR/vm.args"}" +# shellcheck source=ejabberdctl.cfg.example +[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH" +[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG" +[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s" +: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}" + +# define erl parameters +ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS" +if [ -n "$FIREWALL_WINDOW" ] ; then + ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}" +fi +if [ -n "$INET_DIST_INTERFACE" ] ; then + INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt) + if [ -n "$INET_DIST_INTERFACE2" ] ; then + ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2" + fi +fi +# if vm.args file exists in config directory, pass it to Erlang VM +[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" +ERL_LIBS='{{libdir}}' +ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump +ERL_INETRC="$CONFIG_DIR"/inetrc + +# define ejabberd parameters +EJABBERD_OPTS="$EJABBERD_OPTS\ +$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ +$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")" +[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS" +EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd" + +# export global variables +export EJABBERD_CONFIG_PATH +export EJABBERD_LOG_PATH +export EJABBERD_PID_PATH +export ERL_CRASH_DUMP +export ERL_EPMD_ADDRESS +export ERL_INETRC +export ERL_MAX_PORTS +export ERL_MAX_ETS_TABLES +export CONTRIB_MODULES_PATH +export CONTRIB_MODULES_CONF_DIR +export ERL_LIBS +export SCRIPT_DIR + +# run command either directly or via su $INSTALLUSER +exec_cmd() +{ + case $EXEC_CMD in + as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;; + as_current_user) "$@" ;; + esac +} +exec_erl() +{ + NODE=$1; shift + exec_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@" +} +exec_iex() +{ + NODE=$1; shift + exec_cmd "$IEX" -${S:--}name "$NODE" --erl "$ERLANG_OPTS" "$@" +} + +# usage +debugwarning() +{ + if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then + echo "--------------------------------------------------------------------" + echo "" + echo "IMPORTANT: we will attempt to attach an INTERACTIVE shell" + echo "to an already running ejabberd node." + echo "If an ERROR is printed, it means the connection was not successful." + echo "You can interact with the ejabberd node if you know how to use it." + echo "Please be extremely cautious with your actions," + echo "and exit immediately if you are not completely sure." + echo "" + echo "To detach this shell from ejabberd, press:" + echo " control+c, control+c" + echo "" + echo "--------------------------------------------------------------------" + echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:" + echo " EJABBERD_BYPASS_WARNINGS=true" + echo "Press return to continue" + read -r _ + echo "" + fi +} + +livewarning() +{ + if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then + echo "--------------------------------------------------------------------" + echo "" + echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode." + echo "All log messages will be shown in the command shell." + echo "You can interact with the ejabberd node if you know how to use it." + echo "Please be extremely cautious with your actions," + echo "and exit immediately if you are not completely sure." + echo "" + echo "To exit this LIVE mode and stop ejabberd, press:" + echo " q(). and press the Enter key" + echo "" + echo "--------------------------------------------------------------------" + echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:" + echo " EJABBERD_BYPASS_WARNINGS=true" + echo "Press return to continue" + read -r _ + echo "" + fi +} + +help() +{ + echo "" + echo "Commands to start an ejabberd node:" + echo " start Start in server mode" + echo " foreground Start in server mode (attached)" + echo " foreground-quiet Start in server mode (attached), show only critical messages" + echo " live Start in interactive mode, with Erlang shell" + echo " iexlive Start in interactive mode, with Elixir shell" + echo "" + echo "Commands to interact with a running ejabberd node:" + echo " debug Attach an interactive Erlang shell to a running node" + echo " iexdebug Attach an interactive Elixir shell to a running node" + echo " etop Attach to a running node and start Erlang Top" + echo " ping Send ping to the node, returns pong or pang" + echo " started|stopped Wait for the node to fully start|stop" + echo "" + echo "Optional parameters when starting an ejabberd node:" + echo " --config-dir dir Config ejabberd: $CONFIG_DIR" + echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH" + echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH" + echo " --logs dir Directory for logs: $LOGS_DIR" + echo " --spool dir Database spool dir: $SPOOL_DIR" + echo " --node nodename ejabberd node name: $ERLANG_NODE" + echo "" +} + +# dynamic node name helper +uid() +{ + uuid=$(uuidgen 2>/dev/null) + random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null) + [ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid) + [ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)") + uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/') + [ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}" + [ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}" + [ $# -eq 2 ] && echo "${uuid}-${1}@${2}" +} + +# stop epmd if there is no other running node +stop_epmd() +{ + "$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null +} + +# make sure node not already running and node name unregistered +# if all ok, ensure runtime directory exists and make it current directory +check_start() +{ + "$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && { + pgrep -f "$ERLANG_NODE" >/dev/null && { + echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running." + exit 4 + } + pgrep beam >/dev/null && { + echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered," + echo " but no related beam process has been found." + echo "Shutdown all other erlang nodes, and call 'epmd -kill'." + exit 5 + } + "$EPMD" -kill >/dev/null + } +} + +# allow sync calls +wait_status() +{ + # args: status try delay + # return: 0 OK, 1 KO + timeout="$2" + status=4 + while [ "$status" -ne "$1" ] ; do + sleep "$3" + timeout=$((timeout - 1)) + if [ $timeout -eq 0 ] ; then + status="$1" + else + exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ + -extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null + status="$?" + fi + done + [ $timeout -gt 0 ] +} + +# ensure we can change current directory to SPOOL_DIR +[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR" +cd "$SPOOL_DIR" || { + echo "ERROR: can not access directory $SPOOL_DIR" + exit 6 +} + +# main +case $1 in + start) + check_start + exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached + ;; + foreground) + check_start + exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput + ;; + foreground-quiet) + check_start + exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput -ejabberd quiet true + ;; + live) + livewarning + check_start + exec_erl "$ERLANG_NODE" $EJABBERD_OPTS + ;; + debug) + debugwarning + exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE" + ;; + etop) + exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \ + -s erlang halt -output text + ;; + iexdebug) + debugwarning + exec_iex "$(uid debug)" --remsh "$ERLANG_NODE" + ;; + iexlive) + livewarning + exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd + ;; + ping) + PEER=${2:-$ERLANG_NODE} + [ "$PEER" = "${PEER%.*}" ] && PS="-s" + exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \ + -noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \ + -s erlang halt -output text + ;; + started) + wait_status 0 30 2 # wait 30x2s before timeout + ;; + stopped) + wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout + ;; + *) + exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ + -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" + result=$? + case $result in + 2|3) help;; + *) :;; + esac + exit $result + ;; +esac From 200cea25c80c57fce9a5b4138cec45f60020a7c2 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 10:52:38 +0200 Subject: [PATCH 261/440] Container: Start BEAM with exec to maintain the PID and catch SIGTERM in Docker Stop Until now, when stopping the ejabberd container, Erlang is not gracefully closed, Mnesia is not properly closed... exit code is 137. With this change, when the container is stopped, Erlang receives the SIGTERM signal, shutsdown, Mnesia database is properly closed, ... and exit code is 0. --- .github/container/ejabberdctl.template | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index 5b9ef36cb..fe2404d48 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -109,13 +109,25 @@ export ERL_LIBS export SCRIPT_DIR # run command either directly or via su $INSTALLUSER -exec_cmd() +run_cmd() { case $EXEC_CMD in as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;; as_current_user) "$@" ;; esac } +exec_cmd() +{ + case $EXEC_CMD in + as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;; + as_current_user) exec "$@" ;; + esac +} +run_erl() +{ + NODE=$1; shift + run_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@" +} exec_erl() { NODE=$1; shift @@ -253,7 +265,7 @@ wait_status() if [ $timeout -eq 0 ] ; then status="$1" else - exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ + run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null status="$?" fi @@ -262,7 +274,7 @@ wait_status() } # ensure we can change current directory to SPOOL_DIR -[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR" +[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR" cd "$SPOOL_DIR" || { echo "ERROR: can not access directory $SPOOL_DIR" exit 6 @@ -317,7 +329,7 @@ case $1 in wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout ;; *) - exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ + run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" result=$? case $result in From b0db87c683d797c553eda5900f25882fd6678b5e Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 10:53:14 +0200 Subject: [PATCH 262/440] Container: Experimental support CTL_ON_CREATE and CTL_ON_START environment variables --- .github/container/ejabberdctl.template | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index fe2404d48..c25ac9ef4 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -252,6 +252,28 @@ check_start() } } +post_waiter_fork() +{ + (FIRST_RUN=$FIRST_RUN "$0" post_waiter)& +} + +post_waiter_waiting() +{ + $0 started + [ -n "$FIRST_RUN" ] && [ -n "$CTL_ON_CREATE" ] && (post_waiter_loop $CTL_ON_CREATE) + [ -n "$CTL_ON_START" ] && post_waiter_loop $CTL_ON_START +} + +post_waiter_loop() +{ + LIST=$@ + HEAD=${LIST%% ; *} + TAIL=${LIST#* ; } + echo ":> ejabberdctl $HEAD" + $0 $HEAD + [ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL +} + # allow sync calls wait_status() { @@ -274,6 +296,7 @@ wait_status() } # ensure we can change current directory to SPOOL_DIR +[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true [ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR" cd "$SPOOL_DIR" || { echo "ERROR: can not access directory $SPOOL_DIR" @@ -288,6 +311,7 @@ case $1 in ;; foreground) check_start + post_waiter_fork exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput ;; foreground-quiet) @@ -328,6 +352,9 @@ case $1 in stopped) wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout ;; + post_waiter) + post_waiter_waiting + ;; *) run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" From 9c23a7dc3fc84281b1fda058db26ae1a309f7b17 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 10:55:14 +0200 Subject: [PATCH 263/440] Container: When ERLANG_COOKIE is set, create cookie file; otherwise use -setcookie --- .github/container/ejabberdctl.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index c25ac9ef4..02284cc79 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -17,7 +17,8 @@ ERTS_VSN="{{erts_vsn}}" ERL="{{erl}}" IEX="{{bindir}}/iex" EPMD="{{epmd}}" -INSTALLUSER="{{installuser}}" +[ -z "$ERLANG_COOKIE" ] && ERL_OPTIONS="-setcookie $(cat "${SCRIPT_DIR%/*}/releases/COOKIE")" +[ -n "$ERLANG_COOKIE" ] && [ ! -f "$HOME"/.erlang.cookie ] && echo "$ERLANG_COOKIE" > "$HOME"/.erlang.cookie && chmod 400 "$HOME"/.erlang.cookie # check the proper system user is used case $(id -un) in From ea4a365bf5253806aaf5fe725bac0a30e6bcc3f9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 25 Apr 2022 11:06:01 +0200 Subject: [PATCH 264/440] Container: New GitHub workflow to build and publish containers --- .github/workflows/container.yml | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/container.yml diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml new file mode 100644 index 000000000..84adc5558 --- /dev/null +++ b/.github/workflows/container.yml @@ -0,0 +1,69 @@ +name: Container + +on: + push: + paths-ignore: + - '.devcontainer/**' + - 'examples/**' + - 'lib/**' + - 'man/**' + - 'priv/**' + - '**.md' + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + container: + name: Container + runs-on: ubuntu-20.04 + permissions: + packages: write + steps: + + - name: Check out repository code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Log in to the Container registry + uses: docker/login-action@v1.14.1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get git describe + id: gitdescribe + run: echo "::set-output name=ver::$(git describe --tags)" + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v3.8.0 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + labels: | + org.opencontainers.image.revision=${{ steps.gitdescribe.outputs.ver }} + org.opencontainers.image.licenses=GPL-2.0 + org.opencontainers.image.vendor=ProcessOne + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Build and push Docker image + uses: docker/build-push-action@v2.10.0 + with: + build-args: | + VERSION=${{ steps.gitdescribe.outputs.ver }} + cache-from: type=gha + cache-to: type=gha,mode=max + context: .github/container + labels: ${{ steps.meta.outputs.labels }} + #platforms: linux/amd64,linux/arm64 # arm takes 30 mins to compile + platforms: linux/amd64 + push: true + tags: ${{ steps.meta.outputs.tags }} From cae86f62e69ec283ed6c26f8de6de70b02b1c815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 13:37:40 +0200 Subject: [PATCH 265/440] Update esip in mix.lock --- mix.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.lock b/mix.lock index 87258f746..72ac90e85 100644 --- a/mix.lock +++ b/mix.lock @@ -4,7 +4,7 @@ "eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, - "esip": {:hex, :esip, "1.0.45", "2f21fb9750f7a505e6bbd43f6d48b0e879b808aba6c2224686c83f2bcd7a34bf", [:rebar3], [{:fast_tls, "1.1.13", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.23", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.47", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "1f1eae69f2bd8d75f42c048409eabb4e3dc71ab6412fc5d998edbdade6ad5f75"}, + "esip": {:hex, :esip, "1.0.47", "fdd483ca7e9e46a6d5a62937cbacb147adbe0bdfca5ebc59774cc0a1afa381be", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.2", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "99e703c49e8d325b24cb147c5087151c196406e8572e3a33db95099991fe8f3e"}, "ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"}, "fast_tls": {:hex, :fast_tls, "1.1.15", "398e7ba1076db139307ebea839428e2836ab682e4dac61d95b4705a26aff06b7", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "ef516aa226de9a4605704c18499284cd4fc115a73bd72490341972ce0c2b4d30"}, "fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"}, From f3f80f2f554a8dd0eb948e36300d5472891c171f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 13:41:44 +0200 Subject: [PATCH 266/440] Update p1_pgsql in mix.lock --- mix.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.lock b/mix.lock index 72ac90e85..54d08fb1d 100644 --- a/mix.lock +++ b/mix.lock @@ -17,7 +17,7 @@ "p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"}, - "p1_pgsql": {:hex, :p1_pgsql, "1.1.16", "0338d4c3ab42aa1d3ae312aef38f85279678d90092cfc88da899a130a9c0bf03", [:rebar3], [{:xmpp, "1.5.6", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "3294d8f01115e6d0139c0959b22290d33ac21a596605b203f53a22cb7617b4b3"}, + "p1_pgsql": {:hex, :p1_pgsql, "1.1.18", "db3473d1bba4b45815b05226433fc589a5934190c2afa05fdba45c6a238bf2c6", [:rebar3], [{:xmpp, "1.5.8", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4a3863a5d59fed9f64fec8497a7d4e3d34edf31932364a74371097da2b25fd46"}, "p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"}, "pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"}, "sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"}, From ce18c9341935523b6eb0d51fe4f4844a2b945273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 13:56:16 +0200 Subject: [PATCH 267/440] Simplify rules for choosing jiffy version --- rebar.config | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rebar.config b/rebar.config index e3186a857..6db4fe2fc 100644 --- a/rebar.config +++ b/rebar.config @@ -37,11 +37,9 @@ {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.33"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, - {if_version_below, "20", - {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} - }, {if_version_above, "19", - {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}} + {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}}, + {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} % for R19 and below }, {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}}, {if_version_below, "22", From 6f11210edd7623a6bb19a33e5d8fb8100facad20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 2 May 2022 15:05:55 +0200 Subject: [PATCH 268/440] Implement batch operations in mnesia backend --- src/ejabberd_admin.erl | 27 +++++++++++++++++------ src/mod_mam.erl | 28 ++++++++++++++++++------ src/mod_mam_mnesia.erl | 39 ++++++++++++++++++++++++++++++++- src/mod_offline_mnesia.erl | 44 +++++++++++++++++++++++++++++++++++++- 4 files changed, 122 insertions(+), 16 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index cbad89a9c..ccd72a61f 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -715,13 +715,26 @@ delete_old_messages(Days) -> delete_old_messages_batch(Server, Days, BatchSize, Rate) -> LServer = jid:nameprep(Server), Mod = gen_mod:db_mod(LServer, mod_offline), - case ejabberd_batch:register_task({spool, LServer}, 0, Rate, {LServer, Days, BatchSize}, - fun({L, Da, B} = S) -> - case Mod:remove_old_messages_batch(L, Da, B) of - {ok, Count} -> - {ok, S, Count}; - {error, _} = E -> - E + case ejabberd_batch:register_task({spool, LServer}, 0, Rate, {LServer, Days, BatchSize, none}, + fun({L, Da, B, IS} = S) -> + case {erlang:function_exported(Mod, remove_old_messages_batch, 3), + erlang:function_exported(Mod, remove_old_messages_batch, 4)} of + {true, _} -> + case Mod:remove_old_messages_batch(L, Da, B) of + {ok, Count} -> + {ok, S, Count}; + {error, _} = E -> + E + end; + {_, true} -> + case Mod:remove_old_messages_batch(L, Da, B, IS) of + {ok, IS2, Count} -> + {ok, {L, Da, B, IS2}, Count}; + {error, _} = E -> + E + end; + _ -> + {error, not_implemented_for_backend} end end) of ok -> diff --git a/src/mod_mam.erl b/src/mod_mam.erl index fd292736b..0288e2d52 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -578,13 +578,27 @@ delete_old_messages_batch(Server, Type, Days, BatchSize, Rate) when Type == <<"c TypeA = misc:binary_to_atom(Type), LServer = jid:nameprep(Server), Mod = gen_mod:db_mod(LServer, ?MODULE), - case ejabberd_batch:register_task({mam, LServer}, 0, Rate, {LServer, TypeA, TimeStamp, BatchSize}, - fun({L, T, St, B} = S) -> - case Mod:delete_old_messages_batch(L, St, T, B) of - {ok, Count} -> - {ok, S, Count}; - {error, _} = E -> - E + + case ejabberd_batch:register_task({mam, LServer}, 0, Rate, {LServer, TypeA, TimeStamp, BatchSize, none}, + fun({L, T, St, B, IS} = S) -> + case {erlang:function_exported(Mod, remove_old_messages_batch, 4), + erlang:function_exported(Mod, remove_old_messages_batch, 5)} of + {true, _} -> + case Mod:delete_old_messages_batch(L, St, T, B) of + {ok, Count} -> + {ok, S, Count}; + {error, _} = E -> + E + end; + {_, true} -> + case Mod:remove_old_messages_batch(L, St, T, B, IS) of + {ok, IS2, Count} -> + {ok, {L, St, T, B, IS2}, Count}; + {error, _} = E -> + E + end; + _ -> + {error, not_implemented_for_backend} end end) of ok -> diff --git a/src/mod_mam_mnesia.erl b/src/mod_mam_mnesia.erl index dc5898fca..0fd459c67 100644 --- a/src/mod_mam_mnesia.erl +++ b/src/mod_mam_mnesia.erl @@ -29,7 +29,7 @@ %% API -export([init/2, remove_user/2, remove_room/3, delete_old_messages/3, extended_fields/0, store/8, write_prefs/4, get_prefs/2, select/6, remove_from_archive/3, - is_empty_for_user/2, is_empty_for_room/3]). + is_empty_for_user/2, is_empty_for_room/3, remove_old_messages_batch/5]). -include_lib("stdlib/include/ms_transform.hrl"). -include_lib("xmpp/include/xmpp.hrl"). @@ -131,6 +131,43 @@ delete_old_user_messages(User, TimeStamp, Type) -> Err end. +delete_batch('$end_of_table', _LServer, _TS, _Type, Num) -> + {Num, '$end_of_table'}; +delete_batch(LastUS, _LServer, _TS, _Type, 0) -> + {0, LastUS}; +delete_batch(none, LServer, TS, Type, Num) -> + delete_batch(mnesia:first(archive_msg), LServer, TS, Type, Num); +delete_batch({_, LServer2} = LastUS, LServer, TS, Type, Num) when LServer /= LServer2 -> + delete_batch(mnesia:next(archive_msg, LastUS), LServer, TS, Type, Num); +delete_batch(LastUS, LServer, TS, Type, Num) -> + Left = + lists:foldl( + fun(_, 0) -> + 0; + (#archive_msg{timestamp = TS2, type = Type2} = O, Num2) when TS2 < TS, (Type == all orelse Type == Type2) -> + mnesia:delete_object(O), + Num2 - 1; + (_, Num2) -> + Num2 + end, Num, mnesia:wread({archive_msg, LastUS})), + case Left of + 0 -> {0, LastUS}; + _ -> delete_batch(mnesia:next(archive_msg, LastUS), LServer, TS, Type, Left) + end. + +remove_old_messages_batch(LServer, TimeStamp, Type, Batch, LastUS) -> + R = mnesia:transaction( + fun() -> + {Num, NextUS} = delete_batch(LastUS, LServer, TimeStamp, Type, Batch), + {Batch - Num, NextUS} + end), + case R of + {atomic, {Num, State}} -> + {ok, State, Num}; + {aborted, Err} -> + {error, Err} + end. + extended_fields() -> []. diff --git a/src/mod_offline_mnesia.erl b/src/mod_offline_mnesia.erl index 34893cd97..28a105dcf 100644 --- a/src/mod_offline_mnesia.erl +++ b/src/mod_offline_mnesia.erl @@ -29,7 +29,8 @@ -export([init/2, store_message/1, pop_messages/2, remove_expired_messages/1, remove_old_messages/2, remove_user/2, read_message_headers/2, read_message/3, remove_message/3, read_all_messages/2, - remove_all_messages/2, count_messages/2, import/1]). + remove_all_messages/2, count_messages/2, import/1, + remove_old_messages_batch/4]). -export([need_transform/1, transform/1]). -include_lib("xmpp/include/xmpp.hrl"). @@ -97,6 +98,47 @@ remove_old_messages(Days, _LServer) -> end, mnesia:transaction(F). +delete_batch('$end_of_table', _LServer, _TS, Num) -> + {Num, '$end_of_table'}; +delete_batch(LastUS, _LServer, _TS, 0) -> + {0, LastUS}; +delete_batch(none, LServer, TS, Num) -> + delete_batch(mnesia:first(offline_msg), LServer, TS, Num); +delete_batch({_, LServer2} = LastUS, LServer, TS, Num) when LServer /= LServer2 -> + delete_batch(mnesia:next(offline_msg, LastUS), LServer, TS, Num); +delete_batch(LastUS, LServer, TS, Num) -> + Left = + lists:foldl( + fun(_, 0) -> + 0; + (#offline_msg{timestamp = TS2} = O, Num2) when TS2 < TS -> + mnesia:delete_object(O), + Num2 - 1; + (_, Num2) -> + Num2 + end, Num, mnesia:wread({offline_msg, LastUS})), + case Left of + 0 -> {0, LastUS}; + _ -> delete_batch(mnesia:next(offline_msg, LastUS), LServer, TS, Left) + end. + +remove_old_messages_batch(LServer, Days, Batch, LastUS) -> + S = erlang:system_time(second) - 60 * 60 * 24 * Days, + MegaSecs1 = S div 1000000, + Secs1 = S rem 1000000, + TimeStamp = {MegaSecs1, Secs1, 0}, + R = mnesia:transaction( + fun() -> + {Num, NextUS} = delete_batch(LastUS, LServer, TimeStamp, Batch), + {Batch - Num, NextUS} + end), + case R of + {atomic, {Num, State}} -> + {ok, State, Num}; + {aborted, Err} -> + {error, Err} + end. + remove_user(LUser, LServer) -> US = {LUser, LServer}, F = fun () -> mnesia:delete({offline_msg, US}) end, From 011630f8b9707572fcb4b5ac31412690acb7a400 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 14:52:07 +0200 Subject: [PATCH 269/440] CI: The Binaries job will soon be unnecessary --- .github/workflows/ci.yml | 62 ---------------------------------------- 1 file changed, 62 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8a8b2c6f..52d6c4208 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -279,65 +279,3 @@ jobs: 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' find logs/ -name error.log -exec cat '{}' ';' find logs/ -name exunit.log -exec cat '{}' ';' - - binaries: - name: Binaries - needs: [tests] - strategy: - fail-fast: false - matrix: - otp: ['21.3'] - include: - - otp: '21.3' - rebar: 3 - os: ubuntu-20.04 - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 150 - - name: Get last git tag - run: | - export TAGLAST=`git ls-remote --tags --refs origin 'refs/tags/2*' \ - | tail -1 | awk '{print $2}'` - git fetch origin "$TAGLAST:$TAGLAST" - git describe - - name: Get previous Erlang/OTP - uses: ErlGang/setup-erlang@master - with: - otp-version: ${{ matrix.otp }} - - name: Get a compatible Rebar3 - run: | - wget https://github.com/erlang/rebar3/releases/download/3.15.2/rebar3 \ - && chmod +x rebar3 - - name: Cache Rebar3 - uses: actions/cache@v2 - with: - path: ~/.cache/rebar3/ - key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} - - name: Prepare libraries - run: | - sudo apt-get -qq update - sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ - libsqlite3-dev libwebp-dev libyaml-dev - - name: Compile - run: | - ./autogen.sh - ./configure --with-rebar=./rebar3 \ - --prefix=/tmp/ejabberd \ - --disable-debug \ - --enable-all \ - --disable-elixir - make update - make - - run: make install -s - - name: Strip binaries - run: echo 'beam_lib:strip_files(filelib:wildcard( - "/tmp/ejabberd/lib/*/ebin/*beam")), init:stop().' \ - | erl -boot start_clean - - name: Upload binaries - uses: actions/upload-artifact@v2 - with: - name: ejabberd-binaries - path: /tmp/ejabberd/lib - retention-days: 7 From f1c422db8ec1be40a21fde6513021fb552c44a0b Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 2 May 2022 20:18:52 +0200 Subject: [PATCH 270/440] Runtime: Fix path of own workflow file --- .github/workflows/runtime.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index 7e44eb4cb..596f54fb8 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -5,7 +5,7 @@ on: paths: - '*' - '!*.md' - - '.github/workflows/compile.yml' + - '.github/workflows/runtime.yml' - 'checkouts/**' - 'config/**' - 'lib/**' @@ -16,7 +16,7 @@ on: paths: - '*' - '!*.md' - - '.github/workflows/compile.yml' + - '.github/workflows/runtime.yml' - 'checkouts/**' - 'config/**' - 'lib/**' From 2739a52e0f26a4484fd139ff7bf9c25161b2f785 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 29 Apr 2022 17:30:14 +0200 Subject: [PATCH 271/440] Update options configurable in default_room_options --- src/mod_muc.erl | 39 ++++++++++++++++++++++++++++++++++++++- src/mod_muc_room.erl | 5 +++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/mod_muc.erl b/src/mod_muc.erl index a6e0c6030..9c13926e0 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1281,8 +1281,11 @@ mod_opt_type(default_room_options) -> allow_user_invites => econf:bool(), allow_visitor_nickchange => econf:bool(), allow_visitor_status => econf:bool(), + allow_voice_requests => econf:bool(), anonymous => econf:bool(), captcha_protected => econf:bool(), + description => econf:binary(), + enable_hats => econf:bool(), lang => econf:lang(), logging => econf:bool(), mam => econf:bool(), @@ -1298,7 +1301,11 @@ mod_opt_type(default_room_options) -> econf:enum([moderator, participant, visitor])), public => econf:bool(), public_list => econf:bool(), - title => econf:binary()}); + pubsub => econf:binary(), + title => econf:binary(), + vcard => econf:vcard_temp(), + vcard_xupdate => econf:binary(), + voice_request_min_interval => econf:pos_int()}); mod_opt_type(db_type) -> econf:db_type(?MODULE); mod_opt_type(ram_db_type) -> @@ -1668,6 +1675,11 @@ mod_doc() -> "If disallowed, the status text is stripped before broadcasting " "the presence update to all the room occupants. " "The default value is 'true'.")}}, + {allow_voice_requests, + #{value => "true | false", + desc => + ?T("Allow visitors in a moderated room to request voice. " + "The default value is 'true'.")}}, {anonymous, #{value => "true | false", desc => @@ -1684,6 +1696,16 @@ mod_doc() -> "https://docs.ejabberd.im/admin/configuration/#captcha[CAPTCHA] " "in order to accept their join in the room. " "The default value is 'false'.")}}, + {description, + #{value => ?T("Room Description"), + desc => + ?T("Short description of the room. " + "The default value is an empty string.")}}, + {enable_hats, + #{value => "true | false", + desc => + ?T("Allow extended roles as defined in XEP-0317 Hats. " + "The default value is 'false'.")}}, {lang, #{value => ?T("Language"), desc => @@ -1739,6 +1761,21 @@ mod_doc() -> desc => ?T("The list of participants is public, without requiring " "to enter the room. The default value is 'true'.")}}, + {pubsub, + #{value => ?T("PubSub Node"), + desc => + ?T("XMPP URI of associated Publish/Subscribe node. " + "The default value is an empty string.")}}, + {vcard, + #{value => ?T("vCard"), + desc => + ?T("A custom vCard for the room. See the equivalent mod_muc option." + "The default value is an empty string.")}}, + {voice_request_min_interval, + #{value => ?T("Number"), + desc => + ?T("Minimum interval between voice requests, in seconds. " + "The default value is '1800'.")}}, {mam, #{value => "true | false", desc => diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 8271f5fd7..5f160218c 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -3836,6 +3836,11 @@ remove_nonmembers(StateData) -> -spec set_opts([{atom(), any()}], state()) -> state(). set_opts([], StateData) -> set_vcard_xupdate(StateData); +set_opts([{vcard, Val} | Opts], StateData) + when is_record(Val, vcard_temp) -> + %% default_room_options is setting a default room vcard + ValRaw = fxml:element_to_binary(xmpp:encode(Val)), + set_opts([{vcard, ValRaw} | Opts], StateData); set_opts([{Opt, Val} | Opts], StateData) -> NSD = case Opt of title -> From 853be230a8b5ab97600f120d7f468c7c4fb98cb4 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 22 Feb 2022 00:10:22 +0100 Subject: [PATCH 272/440] Import script for building Linux binaries The tools/make-binaries script creates self-contained OTP releases for Linux/x64 and Linux/arm64 systems. All optional ejabberd features are supported. Erlang/OTP, Elixir, and all dependencies are downloaded and built from source (using crosstool-NG). The generated binaries depend on glibc 2.17 or later, all other external libraries are linked statically. The script should work on any non-ancient Linux/x64 system and requires just a few common development tools (to bootstrap crosstool-NG). The release is installed by creating an "ejabberd" user, extracting the archive into /opt, and moving the systemd unit (or init script) into place. --- .gitignore | 2 + tools/make-binaries | 1444 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1446 insertions(+) create mode 100755 tools/make-binaries diff --git a/.gitignore b/.gitignore index e233877df..24cafb936 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ /rebar.lock /log/ Mnesia.nonode@nohost/ +# Binaries created with tools/make-binaries: +/ejabberd-*.tar.gz diff --git a/tools/make-binaries b/tools/make-binaries new file mode 100755 index 000000000..eed9904cb --- /dev/null +++ b/tools/make-binaries @@ -0,0 +1,1444 @@ +#!/bin/sh + +# Build portable binary release tarballs for Linux/x64 and Linux/arm64. +# +# Author: Holger Weiss . +# +# Copyright (c) 2022 ProcessOne, SARL. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +set -u + +export PATH='/usr/local/bin:/usr/bin:/bin' + +myself=${0##*/} + +info() +{ + echo "$myself: $*" +} + +error() +{ + echo >&2 "$myself: $*" +} + +usage() +{ + echo >&2 "Usage: $myself" + exit 2 +} + +mix_version() +{ + # Mix insists on SemVer format. + local vsn="$(printf '%s' "$1" | sed 's/\.0/./')" + + case $vsn in + *.*.*) printf '%s' "$vsn" ;; + *.*) printf '%s.0' "$vsn" ;; + esac +} + +if ! [ -e 'mix.exs' ] || ! [ -e "tools/$myself" ] +then + error "Please call this script from the repository's root directory." + exit 2 +elif [ $# -ne 0 ] +then + usage +fi + +rel_name='ejabberd' +rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +mix_vsn=$(mix_version "$rel_vsn") +crosstool_vsn='1.24.0' +termcap_vsn='1.3.1' +expat_vsn='2.4.8' +zlib_vsn='1.2.12' +yaml_vsn='0.2.5' +ssl_vsn='1.1.1o' +otp_vsn='24.3.4' +elixir_vsn='1.13.4' +pam_vsn='1.5.2' +png_vsn='1.6.37' +jpeg_vsn='9e' +webp_vsn='1.2.2' +gd_vsn='2.3.3' +odbc_vsn='2.3.10' +sqlite_vsn='3380300' +root_dir="${BUILD_DIR:-$HOME/build}" +bootstrap_dir="$root_dir/bootstrap" +ct_prefix_dir="$root_dir/x-tools" +build_dir="$root_dir/$rel_name" +crosstool_dir="crosstool-ng-$crosstool_vsn" +termcap_dir="termcap-$termcap_vsn" +expat_dir="expat-$expat_vsn" +zlib_dir="zlib-$zlib_vsn" +yaml_dir="yaml-$yaml_vsn" +ssl_dir="openssl-$ssl_vsn" +otp_dir="otp_src_$otp_vsn" +elixir_dir="elixir-$elixir_vsn" +pam_dir="Linux-PAM-$pam_vsn" +png_dir="libpng-$png_vsn" +jpeg_dir="jpeg-$jpeg_vsn" +webp_dir="libwebp-$webp_vsn" +gd_dir="libgd-$gd_vsn" +odbc_dir="unixODBC-$odbc_vsn" +sqlite_dir="sqlite-autoconf-$sqlite_vsn" +crosstool_tar="$crosstool_dir.tar.xz" +termcap_tar="$termcap_dir.tar.gz" +expat_tar="$expat_dir.tar.gz" +zlib_tar="$zlib_dir.tar.gz" +yaml_tar="$yaml_dir.tar.gz" +ssl_tar="$ssl_dir.tar.gz" +otp_tar="$otp_dir.tar.gz" +elixir_tar="v$elixir_vsn.tar.gz" +pam_tar="$pam_dir.tar.xz" +png_tar="$png_dir.tar.gz" +jpeg_tar="jpegsrc.v$jpeg_vsn.tar.gz" +webp_tar="$webp_dir.tar.gz" +gd_tar="$gd_dir.tar.gz" +sqlite_tar="$sqlite_dir.tar.gz" +odbc_tar="$odbc_dir.tar.gz" +rel_tar="$rel_name-$mix_vsn.tar.gz" +ct_jobs=$(nproc) +src_dir="$root_dir/src" +platform='x86_64-pc-linux-gnu' +targets='x86_64-linux-gnu aarch64-linux-gnu' +build_start=$(date '+%F %T') + +umask 022 + +#' Try to find a browser for checking dependency versions. +have_browser() +{ + for browser in 'lynx' 'links' 'elinks' + do + $browser -dump 'https://ejabberd.im/' >'/dev/null' && return 0 + done + return 1 +} +#. + +#' Check whether the given dependency version is up-to-date. +check_vsn() +{ + local name="$1" + local our_vsn="$2" + local src_url="$3" + local reg_exp="$4" + local cur_vsn=$($browser -dump "$src_url" | + sed -n "s/.*$reg_exp.*/\\1/p" | + head -1) + + if [ "$our_vsn" = "$cur_vsn" ] + then + return 0 + else + error "Current $name version is: $cur_vsn" + error "But our $name version is: $our_vsn" + error "Update $0 or set CHECK_DEPS=false" + exit 1 + fi +} +#. + +#' Check whether our dependency versions are up-to-date. +check_deps() +{ + check_vsn 'OpenSSL' "$ssl_vsn" \ + 'https://www.openssl.org/source/' \ + 'openssl-\(1\.[0-9][0-9a-z.]*\)\.tar\.gz' + check_vsn 'LibYAML' "$yaml_vsn" \ + 'https://pyyaml.org/wiki/LibYAML' \ + 'yaml-\([0-9][0-9.]*\)\.tar\.gz' + check_vsn 'zlib' "$zlib_vsn" \ + 'https://zlib.net/' \ + 'zlib-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'Expat' "$expat_vsn" \ + 'https://github.com/libexpat/libexpat/releases' \ + 'expat-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'Termcap' "$termcap_vsn" \ + 'https://ftp.gnu.org/gnu/termcap/' \ + 'termcap-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'SQLite' "$sqlite_vsn" \ + 'https://www.sqlite.org/download.html' \ + 'sqlite-autoconf-\([1-9][0-9]*\)\.tar\.gz' + check_vsn 'ODBC' "$odbc_vsn" \ + 'http://www.unixodbc.org/download.html' \ + 'unixODBC-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'Linux-PAM' "$pam_vsn" \ + 'https://github.com/linux-pam/linux-pam/releases' \ + 'Linux-PAM-\([1-9][0-9.]*\)\.tar\.xz' + check_vsn 'libpng' "$png_vsn" \ + 'http://www.libpng.org/pub/png/libpng.html' \ + 'libpng-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'JPEG' "$jpeg_vsn" \ + 'https://www.ijg.org' \ + 'jpegsrc.v\([1-9][0-9a-z]*\)\.tar\.gz' + check_vsn 'WebP' "$webp_vsn" \ + 'https://developers.google.com/speed/webp/download' \ + 'libwebp-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'LibGD' "$gd_vsn" \ + 'https://github.com/libgd/libgd/releases' \ + 'libgd-\([1-9][0-9.]*\)\.tar\.gz' + check_vsn 'Elixir' "$elixir_vsn" \ + 'https://elixir-lang.org/install.html' \ + 'v\([1-9][0-9.]*\)\.tar\.gz' +} +#. + +#' Create common part of Crosstool-NG configuration file. +create_common_config() +{ + local file="$1" + + cat >"$file" <<-'EOF' + # + # crosstool-NG Configuration + # + CT_CONFIGURE_has_static_link=y + CT_CONFIGURE_has_cxx11=y + CT_CONFIGURE_has_wget=y + CT_CONFIGURE_has_curl=y + CT_CONFIGURE_has_make_3_81_or_newer=y + CT_CONFIGURE_has_make_4_0_or_newer=y + CT_CONFIGURE_has_libtool_2_4_or_newer=y + CT_CONFIGURE_has_libtoolize_2_4_or_newer=y + CT_CONFIGURE_has_autoconf_2_65_or_newer=y + CT_CONFIGURE_has_autoreconf_2_65_or_newer=y + CT_CONFIGURE_has_gnu_m4_1_4_12_or_newer=y + CT_CONFIGURE_has_python_3_4_or_newer=y + CT_CONFIGURE_has_bison_2_7_or_newer=y + CT_CONFIGURE_has_python=y + CT_CONFIGURE_has_git=y + CT_CONFIGURE_has_md5sum=y + CT_CONFIGURE_has_sha1sum=y + CT_CONFIGURE_has_sha256sum=y + CT_CONFIGURE_has_sha512sum=y + CT_CONFIGURE_has_install_with_strip_program=y + CT_CONFIG_VERSION_CURRENT="3" + CT_CONFIG_VERSION="3" + CT_MODULES=y + + # + # Paths + # + CT_LOCAL_TARBALLS_DIR="${HOME}/src" + CT_WORK_DIR="${CT_TOP_DIR}/.build" + CT_BUILD_TOP_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/.build}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" + CT_PREFIX_DIR="${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" + CT_REMOVE_DOCS=y + CT_PREFIX_DIR_RO=y + CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y + CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES=y + + # + # Downloading + # + CT_DOWNLOAD_AGENT_CURL=y + CT_CONNECT_TIMEOUT=10 + CT_DOWNLOAD_CURL_OPTIONS="--location --ftp-pasv --retry 3 --fail --silent" + CT_VERIFY_DOWNLOAD_DIGEST=y + CT_VERIFY_DOWNLOAD_DIGEST_SHA512=y + CT_VERIFY_DOWNLOAD_DIGEST_ALG="sha512" + + # + # Extracting + # + CT_OVERRIDE_CONFIG_GUESS_SUB=y + CT_PATCH_BUNDLED=y + CT_PATCH_ORDER="bundled" + + # + # Build behavior + # + CT_PARALLEL_JOBS=0 + CT_LOAD="" + CT_USE_PIPES=y + CT_EXTRA_CFLAGS_FOR_BUILD="" + CT_EXTRA_LDFLAGS_FOR_BUILD="" + CT_EXTRA_CFLAGS_FOR_HOST="" + CT_EXTRA_LDFLAGS_FOR_HOST="" + CT_CONFIG_SHELL_BASH=y + CT_CONFIG_SHELL="${bash}" + + # + # Logging + # + CT_LOG_EXTRA=y + CT_LOG_LEVEL_MAX="EXTRA" + CT_LOG_PROGRESS_BAR=y + + # + # Target options + # + CT_ARCH_CPU="" + CT_ARCH_TUNE="" + + # + # Options for the CPU architecture + # + CT_ALL_ARCH_CHOICES="ALPHA ARC ARM AVR M68K MICROBLAZE MIPS MOXIE MSP430 NIOS2 POWERPC RISCV S390 SH SPARC X86 XTENSA" + CT_ARCH_SUFFIX="" + CT_OMIT_TARGET_VENDOR=y + + # + # Generic target options + # + CT_DEMULTILIB=y + CT_ARCH_USE_MMU=y + CT_ARCH_SUPPORTS_32=y + CT_ARCH_SUPPORTS_64=y + CT_ARCH_DEFAULT_32=y + CT_ARCH_BITNESS=64 + CT_ARCH_64=y + + # + # Target optimisations + # + CT_ARCH_SUPPORTS_WITH_ARCH=y + CT_ARCH_SUPPORTS_WITH_CPU=y + CT_ARCH_SUPPORTS_WITH_TUNE=y + CT_ARCH_ARCH="" + CT_TARGET_CFLAGS="" + CT_TARGET_LDFLAGS="" + + # + # General toolchain options + # + CT_FORCE_SYSROOT=y + CT_USE_SYSROOT=y + CT_SYSROOT_NAME="sysroot" + CT_SYSROOT_DIR_PREFIX="" + CT_WANTS_STATIC_LINK=y + CT_WANTS_STATIC_LINK_CXX=y + CT_SHOW_CT_VERSION=y + CT_TOOLCHAIN_PKGVERSION="" + CT_TOOLCHAIN_BUGURL="" + + # + # Tuple completion and aliasing + # + CT_TARGET_ALIAS_SED_EXPR="" + CT_TARGET_ALIAS="" + + # + # Toolchain type + # + CT_CROSS=y + CT_TOOLCHAIN_TYPE="cross" + + # + # Build system + # + CT_BUILD="" + CT_BUILD_PREFIX="" + CT_BUILD_SUFFIX="" + + # + # Operating System + # + CT_KERNEL_SUPPORTS_SHARED_LIBS=y + CT_KERNEL_LINUX=y + CT_KERNEL="linux" + CT_KERNEL_CHOICE_KSYM="LINUX" + CT_KERNEL_LINUX_SHOW=y + + # + # Options for linux + # + CT_KERNEL_LINUX_PKG_KSYM="LINUX" + CT_LINUX_DIR_NAME="linux" + CT_LINUX_PKG_NAME="linux" + CT_LINUX_SRC_RELEASE=y + CT_LINUX_PATCH_ORDER="global" + CT_LINUX_V_3_16=y + CT_LINUX_VERSION="3.16.63" + CT_LINUX_MIRRORS="$(CT_Mirrors kernel.org linux ${CT_LINUX_VERSION})" + CT_LINUX_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_LINUX_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_LINUX_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_LINUX_SIGNATURE_FORMAT="unpacked/.sign" + CT_LINUX_4_8_or_older=y + CT_LINUX_older_than_4_8=y + CT_LINUX_later_than_3_7=y + CT_LINUX_3_7_or_later=y + CT_LINUX_later_than_3_2=y + CT_LINUX_3_2_or_later=y + CT_KERNEL_LINUX_VERBOSITY_0=y + CT_KERNEL_LINUX_VERBOSE_LEVEL=0 + CT_KERNEL_LINUX_INSTALL_CHECK=y + CT_ALL_KERNEL_CHOICES="BARE_METAL LINUX WINDOWS" + + # + # Common kernel options + # + CT_SHARED_LIBS=y + + # + # Binary utilities + # + CT_ARCH_BINFMT_ELF=y + CT_BINUTILS_BINUTILS=y + CT_BINUTILS="binutils" + CT_BINUTILS_CHOICE_KSYM="BINUTILS" + CT_BINUTILS_BINUTILS_SHOW=y + + # + # Options for binutils + # + CT_BINUTILS_BINUTILS_PKG_KSYM="BINUTILS" + CT_BINUTILS_DIR_NAME="binutils" + CT_BINUTILS_USE_GNU=y + CT_BINUTILS_USE="BINUTILS" + CT_BINUTILS_PKG_NAME="binutils" + CT_BINUTILS_SRC_RELEASE=y + CT_BINUTILS_PATCH_ORDER="global" + CT_BINUTILS_MIRRORS="$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)" + CT_BINUTILS_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_BINUTILS_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_BINUTILS_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" + CT_BINUTILS_SIGNATURE_FORMAT="packed/.sig" + CT_BINUTILS_later_than_2_27=y + CT_BINUTILS_2_27_or_later=y + CT_BINUTILS_later_than_2_25=y + CT_BINUTILS_2_25_or_later=y + CT_BINUTILS_later_than_2_23=y + CT_BINUTILS_2_23_or_later=y + + # + # GNU binutils + # + CT_BINUTILS_HAS_HASH_STYLE=y + CT_BINUTILS_HAS_GOLD=y + CT_BINUTILS_HAS_PLUGINS=y + CT_BINUTILS_HAS_PKGVERSION_BUGURL=y + CT_BINUTILS_GOLD_SUPPORTS_ARCH=y + CT_BINUTILS_GOLD_SUPPORT=y + CT_BINUTILS_FORCE_LD_BFD_DEFAULT=y + CT_BINUTILS_LINKER_LD_GOLD=y + CT_BINUTILS_GOLD_INSTALLED=y + CT_BINUTILS_GOLD_THREADS=y + CT_BINUTILS_LINKER_BOTH=y + CT_BINUTILS_LINKERS_LIST="ld,gold" + CT_BINUTILS_LD_WRAPPER=y + CT_BINUTILS_LINKER_DEFAULT="bfd" + CT_BINUTILS_PLUGINS=y + CT_BINUTILS_RELRO=m + CT_BINUTILS_EXTRA_CONFIG_ARRAY="" + CT_ALL_BINUTILS_CHOICES="BINUTILS" + + # + # C-library + # + CT_LIBC_GLIBC=y + CT_LIBC="glibc" + CT_LIBC_CHOICE_KSYM="GLIBC" + CT_THREADS="nptl" + CT_LIBC_GLIBC_SHOW=y + + # + # Options for glibc + # + CT_LIBC_GLIBC_PKG_KSYM="GLIBC" + CT_GLIBC_DIR_NAME="glibc" + CT_GLIBC_USE_GNU=y + CT_GLIBC_USE="GLIBC" + CT_GLIBC_PKG_NAME="glibc" + CT_GLIBC_SRC_RELEASE=y + CT_GLIBC_PATCH_ORDER="global" + CT_GLIBC_V_2_17=y + CT_GLIBC_VERSION="2.17" + CT_GLIBC_MIRRORS="$(CT_Mirrors GNU glibc)" + CT_GLIBC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_GLIBC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_GLIBC_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" + CT_GLIBC_SIGNATURE_FORMAT="packed/.sig" + CT_GLIBC_2_29_or_older=y + CT_GLIBC_older_than_2_29=y + CT_GLIBC_2_27_or_older=y + CT_GLIBC_older_than_2_27=y + CT_GLIBC_2_26_or_older=y + CT_GLIBC_older_than_2_26=y + CT_GLIBC_2_25_or_older=y + CT_GLIBC_older_than_2_25=y + CT_GLIBC_2_24_or_older=y + CT_GLIBC_older_than_2_24=y + CT_GLIBC_2_23_or_older=y + CT_GLIBC_older_than_2_23=y + CT_GLIBC_2_20_or_older=y + CT_GLIBC_older_than_2_20=y + CT_GLIBC_2_17_or_later=y + CT_GLIBC_2_17_or_older=y + CT_GLIBC_later_than_2_14=y + CT_GLIBC_2_14_or_later=y + CT_GLIBC_DEP_KERNEL_HEADERS_VERSION=y + CT_GLIBC_DEP_BINUTILS=y + CT_GLIBC_DEP_GCC=y + CT_GLIBC_DEP_PYTHON=y + CT_GLIBC_HAS_NPTL_ADDON=y + CT_GLIBC_HAS_PORTS_ADDON=y + CT_GLIBC_HAS_LIBIDN_ADDON=y + CT_GLIBC_USE_NPTL_ADDON=y + CT_GLIBC_HAS_OBSOLETE_RPC=y + CT_GLIBC_EXTRA_CONFIG_ARRAY="" + CT_GLIBC_CONFIGPARMS="" + CT_GLIBC_EXTRA_CFLAGS="" + CT_GLIBC_ENABLE_OBSOLETE_RPC=y + CT_GLIBC_OLDEST_ABI="" + CT_GLIBC_FORCE_UNWIND=y + CT_GLIBC_KERNEL_VERSION_NONE=y + CT_GLIBC_MIN_KERNEL="" + CT_ALL_LIBC_CHOICES="AVR_LIBC BIONIC GLIBC MINGW_W64 MOXIEBOX MUSL NEWLIB NONE UCLIBC" + CT_LIBC_SUPPORT_THREADS_ANY=y + CT_LIBC_SUPPORT_THREADS_NATIVE=y + + # + # Common C library options + # + CT_THREADS_NATIVE=y + + # + # C compiler + # + CT_CC_CORE_PASSES_NEEDED=y + CT_CC_CORE_PASS_1_NEEDED=y + CT_CC_CORE_PASS_2_NEEDED=y + CT_CC_SUPPORT_CXX=y + CT_CC_SUPPORT_FORTRAN=y + CT_CC_SUPPORT_ADA=y + CT_CC_SUPPORT_OBJC=y + CT_CC_SUPPORT_OBJCXX=y + CT_CC_SUPPORT_GOLANG=y + CT_CC_GCC=y + CT_CC="gcc" + CT_CC_CHOICE_KSYM="GCC" + CT_CC_GCC_SHOW=y + + # + # Options for gcc + # + CT_CC_GCC_PKG_KSYM="GCC" + CT_GCC_DIR_NAME="gcc" + CT_GCC_USE_GNU=y + CT_GCC_USE="GCC" + CT_GCC_PKG_NAME="gcc" + CT_GCC_SRC_RELEASE=y + CT_GCC_PATCH_ORDER="global" + CT_GCC_V_8=y + CT_GCC_VERSION="8.3.0" + CT_GCC_MIRRORS="$(CT_Mirrors GNU gcc/gcc-${CT_GCC_VERSION}) $(CT_Mirrors sourceware gcc/releases/gcc-${CT_GCC_VERSION})" + CT_GCC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_GCC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_GCC_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_GCC_SIGNATURE_FORMAT="" + CT_GCC_later_than_7=y + CT_GCC_7_or_later=y + CT_GCC_later_than_6=y + CT_GCC_6_or_later=y + CT_GCC_later_than_5=y + CT_GCC_5_or_later=y + CT_GCC_later_than_4_9=y + CT_GCC_4_9_or_later=y + CT_GCC_later_than_4_8=y + CT_GCC_4_8_or_later=y + CT_CC_GCC_ENABLE_PLUGINS=y + CT_CC_GCC_GOLD=y + CT_CC_GCC_HAS_LIBMPX=y + CT_CC_GCC_ENABLE_CXX_FLAGS="" + CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY="" + CT_CC_GCC_EXTRA_CONFIG_ARRAY="" + CT_CC_GCC_STATIC_LIBSTDCXX=y + CT_CC_GCC_CONFIG_TLS=m + + # + # Optimisation features + # + CT_CC_GCC_USE_GRAPHITE=y + CT_CC_GCC_USE_LTO=y + + # + # Settings for libraries running on target + # + CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y + + # + # Misc. obscure options. + # + CT_CC_CXA_ATEXIT=y + CT_CC_GCC_SJLJ_EXCEPTIONS=m + CT_CC_GCC_LDBL_128=m + CT_CC_GCC_LNK_HASH_STYLE_BOTH=y + CT_CC_GCC_LNK_HASH_STYLE="both" + CT_CC_GCC_DEC_FLOAT_AUTO=y + CT_ALL_CC_CHOICES="GCC" + + # + # Additional supported languages: + # + CT_CC_LANG_CXX=y + + # + # Debug facilities + # + CT_ALL_DEBUG_CHOICES="DUMA GDB LTRACE STRACE" + + # + # Companion libraries + # + CT_COMP_LIBS_GETTEXT=y + CT_COMP_LIBS_GETTEXT_PKG_KSYM="GETTEXT" + CT_GETTEXT_DIR_NAME="gettext" + CT_GETTEXT_PKG_NAME="gettext" + CT_GETTEXT_SRC_RELEASE=y + CT_GETTEXT_PATCH_ORDER="global" + CT_GETTEXT_V_0_19_8_1=y + CT_GETTEXT_VERSION="0.19.8.1" + CT_GETTEXT_MIRRORS="$(CT_Mirrors GNU gettext)" + CT_GETTEXT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_GETTEXT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_GETTEXT_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.gz" + CT_GETTEXT_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_LIBS_GMP=y + CT_COMP_LIBS_GMP_PKG_KSYM="GMP" + CT_GMP_DIR_NAME="gmp" + CT_GMP_PKG_NAME="gmp" + CT_GMP_SRC_RELEASE=y + CT_GMP_PATCH_ORDER="global" + CT_GMP_V_6_1=y + CT_GMP_VERSION="6.1.2" + CT_GMP_MIRRORS="https://gmplib.org/download/gmp https://gmplib.org/download/gmp/archive $(CT_Mirrors GNU gmp)" + CT_GMP_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_GMP_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_GMP_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2" + CT_GMP_SIGNATURE_FORMAT="packed/.sig" + CT_GMP_later_than_5_1_0=y + CT_GMP_5_1_0_or_later=y + CT_GMP_later_than_5_0_0=y + CT_GMP_5_0_0_or_later=y + CT_GMP_REQUIRE_5_0_0_or_later=y + CT_COMP_LIBS_ISL=y + CT_COMP_LIBS_ISL_PKG_KSYM="ISL" + CT_ISL_DIR_NAME="isl" + CT_ISL_PKG_NAME="isl" + CT_ISL_SRC_RELEASE=y + CT_ISL_PATCH_ORDER="global" + CT_ISL_V_0_20=y + CT_ISL_VERSION="0.20" + CT_ISL_MIRRORS="https://libisl.sourceforge.io" + CT_ISL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_ISL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_ISL_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" + CT_ISL_SIGNATURE_FORMAT="" + CT_ISL_later_than_0_18=y + CT_ISL_0_18_or_later=y + CT_ISL_later_than_0_15=y + CT_ISL_0_15_or_later=y + CT_ISL_REQUIRE_0_15_or_later=y + CT_ISL_later_than_0_14=y + CT_ISL_0_14_or_later=y + CT_ISL_REQUIRE_0_14_or_later=y + CT_ISL_later_than_0_13=y + CT_ISL_0_13_or_later=y + CT_ISL_later_than_0_12=y + CT_ISL_0_12_or_later=y + CT_ISL_REQUIRE_0_12_or_later=y + CT_COMP_LIBS_LIBICONV=y + CT_COMP_LIBS_LIBICONV_PKG_KSYM="LIBICONV" + CT_LIBICONV_DIR_NAME="libiconv" + CT_LIBICONV_PKG_NAME="libiconv" + CT_LIBICONV_SRC_RELEASE=y + CT_LIBICONV_PATCH_ORDER="global" + CT_LIBICONV_V_1_15=y + CT_LIBICONV_VERSION="1.15" + CT_LIBICONV_MIRRORS="$(CT_Mirrors GNU libiconv)" + CT_LIBICONV_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_LIBICONV_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_LIBICONV_ARCHIVE_FORMATS=".tar.gz" + CT_LIBICONV_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_LIBS_MPC=y + CT_COMP_LIBS_MPC_PKG_KSYM="MPC" + CT_MPC_DIR_NAME="mpc" + CT_MPC_PKG_NAME="mpc" + CT_MPC_SRC_RELEASE=y + CT_MPC_PATCH_ORDER="global" + CT_MPC_V_1_1=y + CT_MPC_VERSION="1.1.0" + CT_MPC_MIRRORS="http://www.multiprecision.org/downloads $(CT_Mirrors GNU mpc)" + CT_MPC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_MPC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_MPC_ARCHIVE_FORMATS=".tar.gz" + CT_MPC_SIGNATURE_FORMAT="packed/.sig" + CT_MPC_1_1_0_or_later=y + CT_MPC_1_1_0_or_older=y + CT_COMP_LIBS_MPFR=y + CT_COMP_LIBS_MPFR_PKG_KSYM="MPFR" + CT_MPFR_DIR_NAME="mpfr" + CT_MPFR_PKG_NAME="mpfr" + CT_MPFR_SRC_RELEASE=y + CT_MPFR_PATCH_ORDER="global" + CT_MPFR_V_4_0=y + CT_MPFR_VERSION="4.0.2" + CT_MPFR_MIRRORS="http://www.mpfr.org/mpfr-${CT_MPFR_VERSION} $(CT_Mirrors GNU mpfr)" + CT_MPFR_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_MPFR_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_MPFR_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz .zip" + CT_MPFR_SIGNATURE_FORMAT="packed/.asc" + CT_MPFR_later_than_4_0_0=y + CT_MPFR_4_0_0_or_later=y + CT_MPFR_later_than_3_0_0=y + CT_MPFR_3_0_0_or_later=y + CT_MPFR_REQUIRE_3_0_0_or_later=y + CT_COMP_LIBS_NCURSES=y + CT_COMP_LIBS_NCURSES_PKG_KSYM="NCURSES" + CT_NCURSES_DIR_NAME="ncurses" + CT_NCURSES_PKG_NAME="ncurses" + CT_NCURSES_SRC_RELEASE=y + CT_NCURSES_PATCH_ORDER="global" + CT_NCURSES_V_6_1=y + CT_NCURSES_VERSION="6.1" + CT_NCURSES_MIRRORS="ftp://invisible-island.net/ncurses $(CT_Mirrors GNU ncurses)" + CT_NCURSES_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_NCURSES_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_NCURSES_ARCHIVE_FORMATS=".tar.gz" + CT_NCURSES_SIGNATURE_FORMAT="packed/.sig" + CT_NCURSES_HOST_CONFIG_ARGS="" + CT_NCURSES_HOST_DISABLE_DB=y + CT_NCURSES_HOST_FALLBACKS="linux,xterm,xterm-color,xterm-256color,vt100" + CT_NCURSES_TARGET_CONFIG_ARGS="" + CT_NCURSES_TARGET_FALLBACKS="" + CT_COMP_LIBS_ZLIB=y + CT_COMP_LIBS_ZLIB_PKG_KSYM="ZLIB" + CT_ZLIB_DIR_NAME="zlib" + CT_ZLIB_PKG_NAME="zlib" + CT_ZLIB_SRC_RELEASE=y + CT_ZLIB_PATCH_ORDER="global" + CT_ZLIB_V_1_2_11=y + CT_ZLIB_VERSION="1.2.11" + CT_ZLIB_MIRRORS="http://downloads.sourceforge.net/project/libpng/zlib/${CT_ZLIB_VERSION}" + CT_ZLIB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_ZLIB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_ZLIB_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_ZLIB_SIGNATURE_FORMAT="packed/.asc" + CT_ALL_COMP_LIBS_CHOICES="CLOOG EXPAT GETTEXT GMP ISL LIBELF LIBICONV MPC MPFR NCURSES ZLIB" + CT_LIBICONV_NEEDED=y + CT_GETTEXT_NEEDED=y + CT_GMP_NEEDED=y + CT_MPFR_NEEDED=y + CT_ISL_NEEDED=y + CT_MPC_NEEDED=y + CT_NCURSES_NEEDED=y + CT_ZLIB_NEEDED=y + CT_LIBICONV=y + CT_GETTEXT=y + CT_GMP=y + CT_MPFR=y + CT_ISL=y + CT_MPC=y + CT_NCURSES=y + CT_ZLIB=y + + # + # Companion tools + # + CT_COMP_TOOLS_FOR_HOST=y + CT_COMP_TOOLS_AUTOCONF=y + CT_COMP_TOOLS_AUTOCONF_PKG_KSYM="AUTOCONF" + CT_AUTOCONF_DIR_NAME="autoconf" + CT_AUTOCONF_PKG_NAME="autoconf" + CT_AUTOCONF_SRC_RELEASE=y + CT_AUTOCONF_PATCH_ORDER="global" + CT_AUTOCONF_V_2_69=y + CT_AUTOCONF_VERSION="2.69" + CT_AUTOCONF_MIRRORS="$(CT_Mirrors GNU autoconf)" + CT_AUTOCONF_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_AUTOCONF_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_AUTOCONF_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_AUTOCONF_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_TOOLS_AUTOMAKE=y + CT_COMP_TOOLS_AUTOMAKE_PKG_KSYM="AUTOMAKE" + CT_AUTOMAKE_DIR_NAME="automake" + CT_AUTOMAKE_PKG_NAME="automake" + CT_AUTOMAKE_SRC_RELEASE=y + CT_AUTOMAKE_PATCH_ORDER="global" + CT_AUTOMAKE_V_1_16=y + CT_AUTOMAKE_VERSION="1.16.1" + CT_AUTOMAKE_MIRRORS="$(CT_Mirrors GNU automake)" + CT_AUTOMAKE_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_AUTOMAKE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_AUTOMAKE_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_AUTOMAKE_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_TOOLS_BISON=y + CT_COMP_TOOLS_BISON_PKG_KSYM="BISON" + CT_BISON_DIR_NAME="bison" + CT_BISON_PKG_NAME="bison" + CT_BISON_SRC_RELEASE=y + CT_BISON_PATCH_ORDER="global" + CT_BISON_V_3_3=y + CT_BISON_VERSION="3.3.2" + CT_BISON_MIRRORS="$(CT_Mirrors GNU bison)" + CT_BISON_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_BISON_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_BISON_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_BISON_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_TOOLS_LIBTOOL=y + CT_COMP_TOOLS_LIBTOOL_PKG_KSYM="LIBTOOL" + CT_LIBTOOL_DIR_NAME="libtool" + CT_LIBTOOL_PKG_NAME="libtool" + CT_LIBTOOL_SRC_RELEASE=y + CT_LIBTOOL_PATCH_ORDER="global" + CT_LIBTOOL_V_2_4=y + CT_LIBTOOL_VERSION="2.4.6" + CT_LIBTOOL_MIRRORS="$(CT_Mirrors GNU libtool)" + CT_LIBTOOL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_LIBTOOL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_LIBTOOL_ARCHIVE_FORMATS=".tar.xz .tar.gz" + CT_LIBTOOL_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_TOOLS_M4=y + CT_COMP_TOOLS_M4_PKG_KSYM="M4" + CT_M4_DIR_NAME="m4" + CT_M4_PKG_NAME="m4" + CT_M4_SRC_RELEASE=y + CT_M4_PATCH_ORDER="global" + CT_M4_V_1_4=y + CT_M4_VERSION="1.4.18" + CT_M4_MIRRORS="$(CT_Mirrors GNU m4)" + CT_M4_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_M4_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_M4_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" + CT_M4_SIGNATURE_FORMAT="packed/.sig" + CT_COMP_TOOLS_MAKE=y + CT_COMP_TOOLS_MAKE_PKG_KSYM="MAKE" + CT_MAKE_DIR_NAME="make" + CT_MAKE_PKG_NAME="make" + CT_MAKE_SRC_RELEASE=y + CT_MAKE_PATCH_ORDER="global" + CT_MAKE_V_4_2=y + CT_MAKE_VERSION="4.2.1" + CT_MAKE_MIRRORS="$(CT_Mirrors GNU make)" + CT_MAKE_ARCHIVE_FILENAME="@{pkg_name}-@{version}" + CT_MAKE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" + CT_MAKE_ARCHIVE_FORMATS=".tar.bz2 .tar.gz" + CT_MAKE_SIGNATURE_FORMAT="packed/.sig" + CT_MAKE_later_than_4_0=y + CT_MAKE_4_0_or_later=y + CT_ALL_COMP_TOOLS_CHOICES="AUTOCONF AUTOMAKE BISON DTC LIBTOOL M4 MAKE" + EOF +} +#. + +#' Create Crosstool-NG configuration file for x64. +create_x64_config() +{ + local file="$1" + + create_common_config "$file" + + cat >>"$file" <<-'EOF' + # + # x64 + # + CT_ARCH_X86=y + CT_ARCH="x86" + CT_ARCH_CHOICE_KSYM="X86" + CT_ARCH_X86_SHOW=y + CT_ARCH_X86_PKG_KSYM="" + CT_BINUTILS_V_2_32=y + CT_BINUTILS_VERSION="2.32" + CT_BINUTILS_later_than_2_30=y + CT_BINUTILS_2_30_or_later=y + CT_CC_GCC_LIBMPX=y + CT_CONFIGURE_has_lzip=y + EOF +} +#. + +#' Create Crosstool-NG configuration file for arm64. +create_arm64_config() +{ + local file="$1" + + create_common_config "$file" + + cat >>"$file" <<-'EOF' + # + # arm64 + # + CT_ARCH_ARM=y + CT_ARCH="arm" + CT_ARCH_CHOICE_KSYM="ARM" + CT_ARCH_ARM_SHOW=y + CT_ARCH_ARM_PKG_KSYM="" + CT_ARCH_SUPPORTS_BOTH_MMU=y + CT_ARCH_DEFAULT_HAS_MMU=y + CT_ARCH_SUPPORTS_FLAT_FORMAT=y + CT_ARCH_SUPPORTS_EITHER_ENDIAN=y + CT_ARCH_DEFAULT_LE=y + CT_ARCH_LE=y + CT_ARCH_ENDIAN="little" + CT_ARCH_EXCLUSIVE_WITH_CPU=y + CT_LINUX_REQUIRE_3_7_or_later=y + CT_BINUTILS_V_2_29=y + CT_BINUTILS_VERSION="2.29.1" + CT_BINUTILS_2_30_or_older=y + CT_BINUTILS_older_than_2_30=y + CT_BINUTILS_REQUIRE_older_than_2_30=y + CT_GLIBC_USE_PORTS_ADDON=y + CT_CONFIGURE_has_automake_1_15_or_newer=y + EOF +} +#. + +#' Return our name for the given platform. +arch_name() +{ + local target="$1" + + case $target in + x86_64*) + printf 'x64' + ;; + aarch64*) + printf 'arm64' + ;; + *) + error "Unsupported target platform: $target" + exit 1 + ;; + esac +} +#. + +#' Create and populate /opt/ejabberd directory. +create_data_dir() +{ + local code_dir="$1" + local data_dir="$2" + + mkdir "$data_dir" "$data_dir/database" "$data_dir/logs" + mv "$code_dir/conf" "$data_dir" + chmod 'o-rwx' "$data_dir/"* + curl -o "$data_dir/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' + sed -i '/^loglevel:/a\ +\ +ca_file: /opt/ejabberd/conf/cacert.pem\ +\ +certfiles:\ + - /opt/ejabberd/conf/server.pem' "$data_dir/conf/$rel_name.yml" +} +#. + +#' Add systemd unit and init script. +add_systemd_unit() +{ + local code_dir="$1" + + sed -e "s|@ctlscriptpath@|/opt/$rel_name-$rel_vsn/bin|g" \ + -e "s|@installuser@|$rel_name|g" 'ejabberd.service.template' \ + >"$code_dir/bin/ejabberd.service" + sed -e "s|@ctlscriptpath@|/opt/$rel_name-$rel_vsn/bin|g" \ + -e "s|@installuser@|$rel_name|g" 'ejabberd.init.template' \ + >"$code_dir/bin/ejabberd.init" + chmod '+x' "$code_dir/bin/ejabberd.init" +} +#. + +#' Use our VT100 to avoid depending on Terminfo, adjust options/paths. +edit_ejabberdctl() +{ + local code_dir="$1" + + sed -i \ + -e "2iexport TERM='internal'" \ + -e '/ERL_OPTIONS=/d' \ + -e 's|^ERLANG_NODE=ejabberd$|ERLANG_NODE=ejabberd@localhost|' \ + -e 's|_DIR:=".*}/|_DIR:="/opt/ejabberd/|' \ + "$code_dir/bin/${rel_name}ctl" +} +#. + +#' Delete unused files and directories, just to save some space. +remove_unused_files() +{ + local code_dir="$1" + + # Remove shared object file used only in test suite: + find "$code_dir/lib" -name 'otp_test_engine.so' -delete + + # Remove shared object files of statically linked NIFs: + find "$code_dir/lib/crypto-"* "$code_dir/lib/asn1-"* \ + '(' -name 'asn1rt_nif.so' -o \ + -name 'crypto.so' -o \ + -name 'lib' -o \ + -name 'priv' ')' \ + -delete + + # Remove unused ERTS binaries (see systools_make:erts_binary_filter/0): + find "$code_dir/erts-"*'/bin' \ + '(' -name 'ct_run' -o \ + -name 'dialyzer' -o \ + -name 'erlc' -o \ + -name 'typer' -o \ + -name 'yielding_c_fun' ')' \ + -delete + + # Remove unused Mix stuff: + find "$code_dir/bin" -name 'ejabberd' -delete + find "$code_dir/releases" -name 'COOKIE' -delete +} +#. + +#' Strip ERTS binaries, shared objects, and BEAM files. +strip_files() +{ + local code_dir="$1" + local strip_cmd="$2" + + find "$code_dir/lib" \ + -type f \ + -name '*.so' \ + -exec "$strip_cmd" -s '{}' '+' + find "$code_dir/erts-"*'/bin' "$code_dir/lib/"*'/priv/bin' \ + -type f \ + -perm '-u+x' \ + -exec "$strip_cmd" -s '{}' '+' 2>'/dev/null' || : + erl -noinput -eval \ + "{ok, _} = beam_lib:strip_release('$code_dir'), halt()" +} +#. + +#' Build toochain for a given target. +build_toolchain() +{ + local target="$1" + local prefix="$2" + local arch=$(arch_name "$target") + + if [ -d "$prefix" ] + then + info "Using existing toolchain in $prefix ..." + else + if ! [ -x "$bootstrap_dir/bin/ct-ng" ] + then + info "Extracting Crosstool-NG $crosstool_vsn ..." + cd "$src_dir" + tar -xJf "$crosstool_tar" + cd "$OLDPWD" + + info "Building Crosstool-NG $crosstool_vsn ..." + cd "$src_dir/$crosstool_dir" + ./configure --prefix="$bootstrap_dir" + make + make install + cd "$OLDPWD" + fi + + info "Building toolchain for $arch ..." + cd "$root_dir" + create_${arch}_config '.config' + ct-ng build CT_PREFIX="$ct_prefix_dir" CT_JOBS="$ct_jobs" + rm -rf '.config' '.build' 'build.log' + cd "$OLDPWD" + fi +} +#. + +#' Build target dependencies and the actual release. +build_rel() +{ + local mode="$1" + local target="$2" + local prefix="$3" + local arch="$(arch_name "$target")" + local rel_dir="$PWD/_build/prod" + local target_src_dir="$prefix/src" + local target_dst_dir="$prefix/$rel_name-$rel_vsn" + local target_dst_tar="$rel_name-$rel_vsn-linux-$arch.tar.gz" + local saved_path="$PATH" + + # + # The "$ct_prefix_dir/$target/$target/bin" directory contains cross + # compilation tools without "$target-" prefix. We add it to the PATH, + # just in case tools are called without prefix somewhere. However, we + # try to use the prefixed tools everywhere, so it should be possible to + # omit this directory from the path if desired. See also: + # + # https://stackoverflow.com/a/24243789 + # + export PATH="$ct_prefix_dir/$target/bin:$ct_prefix_dir/$target/$target/bin:$PATH" + export CC="$target-gcc" + export CXX="$target-g++" + export CPP="$target-cpp" + export LD="$target-ld" + export AS="$target-as" + export AR="$target-ar" + export NM="$target-nm" + export RANLIB="$target-ranlib" + export OBJCOPY="$target-objcopy" + export STRIP="$target-strip" + export CPPFLAGS="-I$prefix/include" + export CFLAGS="-g0 -O2 -pipe -fomit-frame-pointer -static-libgcc $CPPFLAGS" + export CXXFLAGS="$CFLAGS -static-libstdc++" + export LDFLAGS="-L$prefix/lib -static-libgcc -static-libstdc++" + export ERL_COMPILER_OPTIONS='[deterministic, no_debug_info]' + + if [ "$mode" = 'cross' ] + then configure="./configure --host=$target --build=$platform" + else configure='./configure' + fi + + mkdir "$prefix" + + info 'Extracting dependencies ...' + mkdir "$target_src_dir" + cd "$target_src_dir" + tar -xzf "$src_dir/$termcap_tar" + tar -xzf "$src_dir/$sqlite_tar" + tar -xzf "$src_dir/$odbc_tar" + tar -xzf "$src_dir/$expat_tar" + tar -xzf "$src_dir/$zlib_tar" + tar -xzf "$src_dir/$yaml_tar" + tar -xzf "$src_dir/$ssl_tar" + tar -xzf "$src_dir/$otp_tar" + tar -xzf "$src_dir/$elixir_tar" + tar -xzf "$src_dir/$png_tar" + tar -xzf "$src_dir/$jpeg_tar" + tar -xzf "$src_dir/$webp_tar" + tar -xzf "$src_dir/$gd_tar" + tar -xJf "$src_dir/$pam_tar" + cd "$OLDPWD" + + info "Building Termcap $termcap_vsn for $arch ..." + cd "$target_src_dir/$termcap_dir" + $configure --prefix="$prefix" + cat >'config.h' <<-'EOF' + #ifndef CONFIG_H + #define CONFIG_H + #define INTERNAL_TERMINAL "internal:\\\n" \ + "\t:am:bs:ms:xn:xo:\\\n" \ + "\t:co#80:it#8:li#24:vt#3:\\\n" \ + "\t:@8=\\EOM:DO=\\E[%dB:K1=\\EOq:K2=\\EOr:K3=\\EOs:K4=\\EOp:K5=\\EOn:\\\n" \ + "\t:LE=\\E[%dD:RA=\\E[?7l:RI=\\E[%dC:SA=\\E[?7h:UP=\\E[%dA:\\\n" \ + "\t:ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\\\n" \ + "\t:ae=^O:as=^N:bl=^G:cb=\\E[1K:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[J:\\\n" \ + "\t:cm=\\E[%i%d;%dH:cr=^M:cs=\\E[%i%d;%dr:ct=\\E[3g:do=^J:\\\n" \ + "\t:eA=\\E(B\\E)0:ho=\\E[H:k0=\\EOy:k1=\\EOP:k2=\\EOQ:k3=\\EOR:\\\n" \ + "\t:k4=\\EOS:k5=\\EOt:k6=\\EOu:k7=\\EOv:k8=\\EOl:k9=\\EOw:k;=\\EOx:\\\n" \ + "\t:kb=^H:kd=\\EOB:ke=\\E[?1l\\E>:kl=\\EOD:kr=\\EOC:ks=\\E[?1h\\E=:\\\n" \ + "\t:ku=\\EOA:le=^H:mb=\\E[5m:md=\\E[1m:me=\\E[m\\017:mr=\\E[7m:\\\n" \ + "\t:nd=\\E[C:rc=\\E8:rs=\\E>\\E[?3l\\E[?4l\\E[?5l\\E[?7h\\E[?8h:\\\n" \ + "\t:..sa=\\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\\016%e\\017%;:\\\n" \ + "\t:sc=\\E7:se=\\E[m:sf=^J:so=\\E[7m:sr=\\EM:st=\\EH:ta=^I:ue=\\E[m:\\\n" \ + "\t:up=\\E[A:us=\\E[4m:" + #endif + EOF + make CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H=1" + make install + cd "$OLDPWD" + + info "Building zlib $zlib_vsn for $arch ..." + cd "$target_src_dir/$zlib_dir" + CFLAGS="$CFLAGS -O3 -fPIC" ./configure --prefix="$prefix" --static + make + make install + cd "$OLDPWD" + + info "Building OpenSSL $ssl_vsn for $arch ..." + cd "$target_src_dir/$ssl_dir" + CFLAGS="$CFLAGS -O3 -fPIC" ./Configure no-shared no-ui-console \ + --prefix="$prefix" \ + --openssldir="$prefix" \ + "linux-${target%-linux-gnu}" + make build_libs + make install_dev + cd "$OLDPWD" + + info "Building Expat $expat_vsn for $arch ..." + cd "$target_src_dir/$expat_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + --without-docbook \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building LibYAML $yaml_vsn for $arch ..." + cd "$target_src_dir/$yaml_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building SQLite $sqlite_vsn for $arch ..." + cd "$target_src_dir/$sqlite_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building ODBC $odbc_vsn for $arch ..." + cd "$target_src_dir/$odbc_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building Linux-PAM $pam_vsn for $arch ..." + cd "$target_src_dir/$pam_dir" + $configure --prefix="$prefix" --includedir="$prefix/include/security" \ + --enable-static --disable-shared --disable-doc --enable-db=no \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building libpng $png_vsn for $arch ..." + cd "$target_src_dir/$png_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building JPEG $jpeg_vsn for $arch ..." + cd "$target_src_dir/$jpeg_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building WebP $webp_vsn for $arch ..." + cd "$target_src_dir/$webp_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building LibGD $gd_vsn for $arch ..." + cd "$target_src_dir/$gd_dir" + $configure --prefix="$prefix" --enable-static --disable-shared \ + --with-zlib="$prefix" \ + --with-webp="$prefix" \ + --with-jpeg="$prefix" \ + --with-png="$prefix" \ + --without-avif \ + --without-fontconfig \ + --without-freetype \ + --without-heif \ + --without-libiconv-prefix \ + --without-liq \ + --without-raqm \ + --without-tiff \ + --without-x \ + --without-xpm \ + CFLAGS="$CFLAGS -O3 -fPIC" + make + make install + cd "$OLDPWD" + + info "Building Erlang/OTP $otp_vsn for $arch ..." + if [ "$mode" = 'cross' ] + then + export PATH="$native_otp_bin:$PATH" # For Bootstrapping/Mix. + export erl_xcomp_sysroot="$prefix" + fi + cd "$target_src_dir/$otp_dir" + # Don't link against libnsl: https://github.com/erlang/otp/pull/5558 + sed -i -e '/LIBS="-lnsl/d' -e '/LIBS="-lsocket/d' \ + 'lib/erl_interface/configure' + # The additional CFLAGS/LIBS below are required by --enable-static-nifs. + # The "-ldl" flag specifically is only needed for ODBC, though. + $configure \ + --prefix="$prefix" \ + --with-ssl="$prefix" \ + --with-odbc="$prefix" \ + --without-javac \ + --disable-dynamic-ssl-lib \ + --enable-static-nifs \ + CFLAGS="$CFLAGS -Wl,-L$prefix/lib" \ + LIBS='-lcrypto -ldl' + make + make install + if [ "$mode" = 'native' ] + then + native_otp_bin="$prefix/bin" + export PATH="$native_otp_bin:$PATH" # For Mix. + else + unset erl_xcomp_sysroot + fi + cd "$OLDPWD" + + info "Building Elixir $elixir_vsn for $arch ..." + cd "$target_src_dir/$elixir_dir" + make install PREFIX="$prefix" + cd "$OLDPWD" + + if [ "$mode" = 'native' ] # In order to only do this once. + then + info "Fetching Mix dependencies" + mix local.hex --force + mix local.rebar --force + fi + + info "Removing old $rel_name builds" + rm -rf '_build' 'deps' + + info "Building $rel_name $rel_vsn for $arch ..." + ./autogen.sh + eimp_defs='-DHAVE_GD -DHAVE_WEBP -DHAVE_JPEG -DHAVE_PNG' + eimp_libs='-lwebp -ljpeg -lpng -lz -lm' + export CC="$CC -Wl,-ldl" # Required by (statically linking) epam. + export LIBS="$eimp_libs -lcrypto -lpthread -ldl" + export CFLAGS="$CFLAGS $eimp_defs" + export LDFLAGS="$LDFLAGS $eimp_libs" + if [ "$mode" = 'cross' ] + then + # Hand over --host/--build to configure scripts of dependencies. + export host_alias="$target" + export build_alias="$platform" + fi + # The cache variable makes cross compilation work. + ac_cv_erlang_root_dir="$prefix/lib/erlang" $configure \ + --with-rebar='mix' \ + --with-sqlite3="$prefix" \ + --enable-user="$rel_name" \ + --enable-all \ + --disable-erlang-version-check + make deps + sed -i 's/ *-lstdc++ *//g' 'deps/'*'/rebar.config'* # Link statically. + if [ "$mode" = 'cross' ] + then + ln -s "$prefix/lib/erlang" 'lib/erlang' + erts_dir=$(ls -1d 'lib/erlang/erts-'*) + ei_inc="$prefix/lib/erlang/lib/erl_interface-"*'/include' + ei_lib="$prefix/lib/erlang/lib/erl_interface-"*'/lib' + export LDLIBS='-lpthread' + export ERL_EI_INCLUDE_DIR=$(ls -1d $ei_inc) + export ERL_EI_LIBDIR=$(ls -1d $ei_lib) + sed -i "/include_executables/a\\ + include_erts: \"$erts_dir\"," 'mix.exs' + fi + make rel + if [ "$mode" = 'cross' ] + then + sed -i '/include_erts/d' 'mix.exs' + rm 'lib/erlang' + unset LDLIBS ERL_EI_INCLUDE_DIR ERL_EI_LIBDIR + unset host_alias build_alias + fi + + info "Putting together $rel_name $rel_vsn archive for $arch ..." + mkdir "$target_dst_dir" + tar -C "$target_dst_dir" -xzf "$rel_dir/$rel_tar" + create_data_dir "$target_dst_dir" "$prefix/$rel_name" + add_systemd_unit "$target_dst_dir" + edit_ejabberdctl "$target_dst_dir" + remove_unused_files "$target_dst_dir" + strip_files "$target_dst_dir" "$STRIP" + tar -C "$prefix" --owner="$rel_name" --group="$rel_name" -cf - \ + "$rel_name" "$rel_name-$rel_vsn" | gzip -9 >"$target_dst_tar" + + info "Created $target_dst_tar successfully." + + unset CC CXX CPP LD AS AR NM RANLIB OBJCOPY STRIP + unset CFLAGS CXXFLAGS LDFLAGS LIBS ERL_COMPILER_OPTIONS + export PATH="$saved_path" +} +#. + +if [ "${CHECK_DEPS:-true}" = 'true' ] +then + if have_browser + then + check_deps + else + error 'Cannot check dependency versions.' + error 'Install a browser or set CHECK_DEPS=false' + exit 1 + fi +else + info "Won't check dependency versions." +fi + +if ! mkdir -p "$root_dir" +then + error 'Set BUILD_DIR to a usable build directory path.' + exit 1 +fi + +# Keep existing toolchains but rebuild everything else. + +info 'Removing old bootstrap tools ...' +rm -rf "$bootstrap_dir" +mkdir "$bootstrap_dir" + +info 'Removing old builds ...' +rm -rf "$build_dir" +mkdir "$build_dir" + +info 'Removing old source ...' +rm -rf "$src_dir" +mkdir "$src_dir" + +info 'Downloading dependencies ...' +cd "$src_dir" +curl -LO "http://crosstool-ng.org/download/crosstool-ng/$crosstool_tar" +curl -LO "https://ftp.gnu.org/gnu/termcap/$termcap_tar" +curl -LO "https://github.com/libexpat/libexpat/releases/download/R_$(printf '%s' "$expat_vsn" | sed 's/\./_/g')/$expat_tar" +curl -LO "https://zlib.net/$zlib_tar" +curl -LO "https://pyyaml.org/download/libyaml/$yaml_tar" +curl -LO "https://www.openssl.org/source/$ssl_tar" +curl -LO "https://github.com/erlang/otp/releases/download/OTP-$otp_vsn/$otp_tar" +curl -LO "https://github.com/elixir-lang/elixir/archive/v$elixir_vsn.tar.gz" +curl -LO "https://github.com/linux-pam/linux-pam/releases/download/v$pam_vsn/$pam_tar" +curl -LO "https://download.sourceforge.net/libpng/$png_tar" +curl -LO "https://www.ijg.org/files/$jpeg_tar" +curl -LO "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/$webp_tar" +curl -LO "https://github.com/libgd/libgd/releases/download/gd-$gd_vsn/$gd_tar" +curl -LO "http://www.unixodbc.org/$odbc_tar" +curl -LO "https://www.sqlite.org/$(date '+%Y')/$sqlite_tar" \ + || curl -LO "https://www.sqlite.org/$(date -d '1 year ago' '+%Y')/$sqlite_tar" \ + || curl -LO "https://www.sqlite.org/$(date -d '2 years ago' '+%Y')/$sqlite_tar" +cd "$OLDPWD" + +mkdir "$bootstrap_dir/bin" +export PATH="$bootstrap_dir/bin:$PATH" # For ct-ng. +export LC_ALL='C.UTF-8' # Elixir insists on a UTF-8 environment. + +for target in $targets +do + prefix="$build_dir/$(arch_name "$target")" + toolchain_dir="$ct_prefix_dir/$target" + + if [ "$(uname -m)-linux-gnu" = "$target" ] + then mode='native' + else mode='cross' + fi + build_toolchain "$target" "$toolchain_dir" + build_rel "$mode" "$target" "$prefix" +done + +info "Build started: $build_start" +info "Build ended: $(date '+%F %T')" + +# vim:set foldmarker=#',#. foldmethod=marker: From ef7470b503674cbdec79014d17e1cd0634c0f104 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 23 Feb 2022 00:54:40 +0100 Subject: [PATCH 273/440] Import script for building DEB and RPM packages The tools/make-packages script creates DEB and RPM packages for Linux/x64 and Linux/arm64 systems using the archives built by the tools/make-binaries script. --- .gitignore | 4 +- tools/make-packages | 237 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 240 insertions(+), 1 deletion(-) create mode 100755 tools/make-packages diff --git a/.gitignore b/.gitignore index 24cafb936..75b784ab7 100644 --- a/.gitignore +++ b/.gitignore @@ -37,5 +37,7 @@ /rebar.lock /log/ Mnesia.nonode@nohost/ -# Binaries created with tools/make-binaries: +# Binaries created with tools/make-{binaries,packages}: +/ejabberd_*.deb +/ejabberd-*.rpm /ejabberd-*.tar.gz diff --git a/tools/make-packages b/tools/make-packages new file mode 100755 index 000000000..366499d97 --- /dev/null +++ b/tools/make-packages @@ -0,0 +1,237 @@ +#!/bin/sh + +# Build DEB and RPM packages for Linux/x64 and Linux/arm64. +# +# Author: Holger Weiss . +# +# Copyright (c) 2022 ProcessOne, SARL. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +set -u + +myself=${0##*/} +architectures='x64 arm64' +iteration=1 + +usage() +{ + echo >&2 "Usage: $myself [-i ]" + exit 2 +} + +while getopts i: opt +do + case $opt in + i) + iteration="$OPTARG" + ;; + \?) + usage + ;; + esac +done +shift $((OPTIND - 1)) + +if ! [ -e 'mix.exs' ] || ! [ -e "tools/$myself" ] +then + echo >&2 "Please call this script from the repository's root directory." + exit 2 +elif [ $# -ne 0 ] +then + usage +fi +if ! type fpm >'/dev/null' +then + echo >&2 'This script requires fpm: https://fpm.readthedocs.io' + exit 1 +fi + +rel_name='ejabberd' +rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +conf_dir="/opt/$rel_name/conf" +pem_file="$conf_dir/server.pem" +tmp_dir=$(mktemp -d "/tmp/.$myself.XXXXXX") + +trap 'rm -rf "$tmp_dir"' INT TERM EXIT +umask 022 + +create_scripts() +{ + local dir="$1" + + cat >"$dir/before-install" <<-EOF + if ! getent group '$rel_name' >'/dev/null' + then groupadd -r '$rel_name' + fi + if ! getent passwd '$rel_name' >'/dev/null' + then useradd -r -m -d '/opt/$rel_name' -g '$rel_name' '$rel_name' + fi + if ! [ -e '$pem_file' ] + then + if ! [ -e '/opt/$rel_name' ] # Huh? + then install -o '$rel_name' -g '$rel_name' -m 750 -d '/opt/$rel_name' + fi + if ! [ -e '$conf_dir' ] + then install -o '$rel_name' -g '$rel_name' -m 750 -d '$conf_dir' + fi + host=\$(hostname --fqdn 2>'/dev/null' || :) + if [ -z "\$host" ] + then host='localhost' + fi + openssl req -x509 \ + -batch \ + -nodes \ + -newkey rsa:4096 \ + -keyout '$pem_file' \ + -out '$pem_file' \ + -days 3650 \ + -subj "/CN=\$host" >'/dev/null' 2>&1 || : + if [ -e '$pem_file' ] + then chown '$rel_name:$rel_name' '$pem_file' + else echo 'Failed to create a TLS certificate for ejabberd.' >&2 + fi + fi + if ! [ -e '/opt/$rel_name/database' ] + then install -o '$rel_name' -g '$rel_name' -m 750 -d '/opt/$rel_name/database' + fi + if ! [ -e '/opt/$rel_name/logs' ] + then install -o '$rel_name' -g '$rel_name' -m 750 -d '/opt/$rel_name/logs' + fi + EOF + + cat >"$dir/after-install" <<-EOF + host=\$(hostname --fqdn 2>'/dev/null' || :) + if [ -n "\$host" ] + then sed -i "s/ - localhost$/ - \$host/" '$conf_dir/$rel_name.yml' + fi + chown 'root:$rel_name' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' + chmod '4750' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' + EOF + + cat >"$dir/after-upgrade" <<-EOF + chown 'root:$rel_name' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' + chmod '4750' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' + EOF + + cat >"$dir/after-remove" <<-EOF + rm -f '/opt/$rel_name/.erlang.cookie' + if getent passwd '$rel_name' >'/dev/null' + then userdel '$rel_name' + fi + if getent group '$rel_name' >'/dev/null' + then groupdel '$rel_name' + fi + EOF +} + +package_architecture() +{ + local target="$1" + local host_target="$(uname -m)-$target" + + case $host_target in + x86_64-x64) + printf 'native' + ;; + x86_64-arm64) + printf 'arm64' + ;; + *) + echo >&2 "Unsupported host/target combination: $host_target" + exit 1 + ;; + esac +} + +make_package() +{ + local output_type="$1" + local architecture="$(package_architecture "$2")" + local dir="$3" + + cd "$dir" # FPM's "--chdir" option doesn't work (as I'd expect). + fpm --output-type "$output_type" \ + --input-type 'dir' \ + --name "$rel_name" \ + --version "$rel_vsn" \ + --iteration "$iteration" \ + --license 'GPL-2+' \ + --category 'net' \ + --provides 'stun-server' \ + --provides 'turn-server' \ + --provides 'xmpp-server' \ + --no-depends \ + --no-auto-depends \ + --deb-maintainerscripts-force-errorchecks \ + --deb-systemd-enable \ + --deb-systemd-auto-start \ + --deb-systemd "./$rel_name.service" \ + --deb-init "./$rel_name" \ + --rpm-init "./$rel_name" \ + --config-files "$conf_dir" \ + --directories "/opt/$rel_name" \ + --directories "/opt/$rel_name-$rel_vsn" \ + --architecture "$architecture" \ + --maintainer 'ejabberd Maintainers ' \ + --vendor 'ProcessOne, SARL' \ + --description 'Robust and scalable XMPP/MQTT/SIP server.' \ + --url 'https://ejabberd.im' \ + --before-install './before-install' \ + --after-install './after-install' \ + --before-upgrade './before-install' \ + --after-upgrade './after-upgrade' \ + --after-remove './after-remove' \ + './opt' './usr' + cd "$OLDPWD" +} + +for arch in $architectures +do + tar_name="$rel_name-$rel_vsn-linux-$arch.tar.gz" + arch_dir="$tmp_dir/$arch" + opt_dir="$arch_dir/opt" + etc_dir="$arch_dir/etc" + bin_dir="$arch_dir/usr/sbin" + dst_dir="$opt_dir/$rel_name-$rel_vsn" + + test -e "$tar_name" || tools/make-binaries + + echo "$myself: Putting together DEB and RPM packages for $arch ..." + + mkdir -p "$opt_dir" "$bin_dir" + tar -C "$opt_dir" -xzf "$tar_name" + + cat >"$bin_dir/${rel_name}ctl" <<-EOF + #!/bin/sh + exec '/opt/$rel_name-$rel_vsn/bin/${rel_name}ctl' "\$@" + EOF + chmod +x "$bin_dir/${rel_name}ctl" + + mkdir -p "$etc_dir/systemd/system" + mv "$dst_dir/bin/$rel_name.service" "$etc_dir/systemd/system" + mv "$dst_dir/bin/$rel_name.init" "$arch_dir/$rel_name" + sed -i \ + "s|opt/$rel_name-$rel_vsn/bin/${rel_name}ctl|usr/sbin/${rel_name}ctl|g" \ + "$etc_dir/systemd/system/$rel_name.service" "$arch_dir/$rel_name" + + create_scripts "$arch_dir" + make_package 'rpm' "$arch" "$arch_dir" + mv "$etc_dir/systemd/system/$rel_name.service" "$arch_dir" + rm -r "$etc_dir" + make_package 'deb' "$arch" "$arch_dir" + mv "$arch_dir/$rel_name"?$rel_vsn*.??? . +done +echo "$myself: Created DEB and RPM packages successfully." From ce6f32906a5d2dc1582ac76bae5e9bb7615a365b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 4 Mar 2022 17:17:23 +0100 Subject: [PATCH 274/440] Import script for building command line installers The tools/make-installers script creates command line installers for Linux/x64 and Linux/arm64 systems using the archives built by the tools/make-binaries script. --- .gitignore | 3 +- tools/make-installers | 217 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+), 1 deletion(-) create mode 100755 tools/make-installers diff --git a/.gitignore b/.gitignore index 75b784ab7..b3ea8f373 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,8 @@ /rebar.lock /log/ Mnesia.nonode@nohost/ -# Binaries created with tools/make-{binaries,packages}: +# Binaries created with tools/make-{binaries,installers,packages}: /ejabberd_*.deb /ejabberd-*.rpm +/ejabberd-*.run /ejabberd-*.tar.gz diff --git a/tools/make-installers b/tools/make-installers new file mode 100755 index 000000000..10f8023d6 --- /dev/null +++ b/tools/make-installers @@ -0,0 +1,217 @@ +#!/bin/sh + +# Build installers for Linux/x64 and Linux/arm64. +# +# Author: Holger Weiss . +# +# Copyright (c) 2022 ProcessOne, SARL. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +set -u + +myself=${0##*/} +architectures='x64 arm64' +iteration=1 + +usage() +{ + echo >&2 "Usage: $myself [-i ]" + exit 2 +} + +while getopts i: opt +do + case $opt in + i) + iteration="$OPTARG" + ;; + \?) + usage + ;; + esac +done +shift $((OPTIND - 1)) + +if ! [ -e 'mix.exs' ] || ! [ -e "tools/$myself" ] +then + echo >&2 "Please call this script from the repository's root directory." + exit 2 +elif [ $# -ne 0 ] +then + usage +fi +if type 'makeself' >'/dev/null' +then makeself='makeself' +elif type 'makeself.sh' >'/dev/null' +then makeself='makeself.sh' +else + echo >&2 'This script requires makeself: https://makeself.io' + exit 1 +fi + +rel_name='ejabberd' +rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +code_path="/opt/$rel_name-$rel_vsn" +data_path="/opt/$rel_name" +conf_path="$data_path/conf" +pem_file="$conf_path/server.pem" +url='https://docs.ejabberd.im/admin/upgrade/#specific-version-upgrade-notes' +tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") + +trap 'rm -rf "$tmp_dir"' INT TERM EXIT +umask 022 + +create_setup_script() +{ + local dir="$1" + local tarball="$2" + + cat >"$dir/setup" <<-EOF + #!/bin/sh + + set -e + set -u + + export PATH='/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin' + + user_agrees() + { + local question="\$*" + + if [ -t 0 ] + then + read -p "\$question (y/n) [n] " response + response="\$(printf '%s' "\$response" | + tr '[:upper:]' '[:lower:]')" + if [ "\$response" = 'y' ] || [ "\$response" = 'yes' ] + then return 0 + else return 1 + fi + else # Assume 'yes' if not running interactively. + return 0 + fi + } + + if [ \$(id -u) != 0 ] + then + echo >&2 'The installer must be run with superuser privileges.' + exit 1 + fi + + if [ -e '/run/systemd/system' ] + then is_systemd=true + else is_systemd=false + fi + if [ -e '$data_path' ] + then is_upgrade=true + else is_upgrade=false + fi + if id -u '$rel_name' >'/dev/null' 2>&1 + then user_exists=true + else user_exists=false + fi + + echo 'The following installation paths will be used:' + echo '- $code_path' + if [ \$is_upgrade = true ] + then echo "- $data_path (existing files won't be modified)" + else echo '- $data_path' + fi + if [ \$is_systemd = true ] + then echo '- /etc/systemd/system/$rel_name.service' + fi + if [ \$user_exists = false ] + then echo 'The $rel_name user is going to be created.' + fi + if [ \$is_systemd = true ] && [ \$is_upgrade = false ] + then echo 'The $rel_name service is going to be enabled and started.' + fi + if ! user_agrees 'Install $rel_name $rel_vsn now?' + then + echo 'Aborting installation.' + exit 1 + fi + + if [ \$user_exists = false ] + then useradd -r -d '$data_path' '$rel_name' + fi + + host=\$(hostname --fqdn 2>'/dev/null' || :) + if [ -z "\$host" ] + then host='localhost' + fi + + tar --skip-old-files -C "\$(dirname '$code_path')" -xf '$tarball' + chown -R -h 'root:root' '$code_path' + chown 'root:$rel_name' '$code_path/lib/epam-'*'/priv/bin/epam' + chmod '4750' '$code_path/lib/epam-'*'/priv/bin/epam' + if [ \$is_upgrade = false ] + then + sed -i "s/ - localhost$/ - \$host/" '$conf_path/$rel_name.yml' + openssl req -x509 \ + -batch \ + -nodes \ + -newkey rsa:4096 \ + -keyout '$pem_file' \ + -out '$pem_file' \ + -days 3650 \ + -subj "/CN=\$host" >'/dev/null' 2>&1 || : + if [ -e '$pem_file' ] + then chown '$rel_name:$rel_name' '$pem_file' + else echo 'Failed to create a TLS certificate for ejabberd.' >&2 + fi + fi + + if [ \$is_systemd = true ] + then + cp '$code_path/bin/$rel_name.service' '/etc/systemd/system/' + systemctl -q daemon-reload + if [ \$is_upgrade = false ] + then systemctl -q --now enable '$rel_name' + fi + elif [ \$is_upgrade = false ] + then + echo 'You might want to install an init script (see the' + echo '$code_path/bin directory for an example).' + fi + echo '$rel_name $rel_vsn has been installed successfully.' + + if [ \$is_upgrade = true ] + then + echo 'Please check the following web site for upgrade notes:' + echo + echo '$url' + echo + echo 'If everything looks fine, restart the $rel_name service.' + fi + EOF + chmod +x "$dir/setup" +} + +for arch in $architectures +do + tar_name="$rel_name-$rel_vsn-linux-$arch.tar" + tgz_name="$tar_name.gz" + installer_name="$rel_name-$rel_vsn-$iteration-linux-$arch.run" + + test -e "$tgz_name" || tools/make-binaries + echo "$myself: Putting together installer for $arch ..." + gzip -c -d <"$tgz_name" >"$tmp_dir/$tar_name" + create_setup_script "$tmp_dir" "$tar_name" + "$makeself" "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' + find "$tmp_dir" -mindepth 1 -delete +done +echo "$myself: Created installers successfully." From a7dc1de980cd126bff66da6b9ea4ab73902d6735 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 8 Mar 2022 10:23:54 +0100 Subject: [PATCH 275/440] make-binaries: Try to avoid rebuilding deps Don't rebuild external dependencies if all of them are up to date. --- tools/make-binaries | 221 ++++++++++++++++++++++++++++++-------------- 1 file changed, 154 insertions(+), 67 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index eed9904cb..0f44e0929 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -120,6 +120,24 @@ src_dir="$root_dir/src" platform='x86_64-pc-linux-gnu' targets='x86_64-linux-gnu aarch64-linux-gnu' build_start=$(date '+%F %T') +have_current_deps='false' +dep_vsns_file="$build_dir/.dep_vsns" +dep_vsns='' +deps='crosstool + termcap + expat + zlib + yaml + ssl + otp + elixir + pam + png + jpeg + webp + gd + odbc + sqlite' umask 022 @@ -158,7 +176,7 @@ check_vsn() #. #' Check whether our dependency versions are up-to-date. -check_deps() +check_configured_dep_vsns() { check_vsn 'OpenSSL' "$ssl_vsn" \ 'https://www.openssl.org/source/' \ @@ -202,6 +220,31 @@ check_deps() } #. +#' Check whether existing dependencies are up-to-date. +check_built_dep_vsns() +{ + for dep in $deps + do + eval dep_vsns=\"\$dep_vsns\$${dep}_vsn\" + done + + if [ -e "$dep_vsns_file" ] + then + if [ "$dep_vsns" = "$(cat "$dep_vsns_file")" ] + then have_current_deps='true' + fi + rm "$dep_vsns_file" + fi +} +#. + +#' Save built dependency versions. +save_built_dep_vsns() +{ + echo "$dep_vsns" >"$dep_vsns_file" +} +#. + #' Create common part of Crosstool-NG configuration file. create_common_config() { @@ -924,6 +967,19 @@ arch_name() } #. +#' Add native Erlang/OTP "bin" directory to PATH (for bootstrapping and Mix). +add_otp_path() +{ + local mode="$1" + local prefix="$2" + + if [ "$mode" = 'native' ] + then native_otp_bin="$prefix/bin" + fi + export PATH="$native_otp_bin:$PATH" +} +#. + #' Create and populate /opt/ejabberd directory. create_data_dir() { @@ -1058,45 +1114,16 @@ build_toolchain() } #. -#' Build target dependencies and the actual release. -build_rel() +#' Build target dependencies. +build_deps() { local mode="$1" local target="$2" local prefix="$3" local arch="$(arch_name "$target")" - local rel_dir="$PWD/_build/prod" local target_src_dir="$prefix/src" - local target_dst_dir="$prefix/$rel_name-$rel_vsn" - local target_dst_tar="$rel_name-$rel_vsn-linux-$arch.tar.gz" local saved_path="$PATH" - # - # The "$ct_prefix_dir/$target/$target/bin" directory contains cross - # compilation tools without "$target-" prefix. We add it to the PATH, - # just in case tools are called without prefix somewhere. However, we - # try to use the prefixed tools everywhere, so it should be possible to - # omit this directory from the path if desired. See also: - # - # https://stackoverflow.com/a/24243789 - # - export PATH="$ct_prefix_dir/$target/bin:$ct_prefix_dir/$target/$target/bin:$PATH" - export CC="$target-gcc" - export CXX="$target-g++" - export CPP="$target-cpp" - export LD="$target-ld" - export AS="$target-as" - export AR="$target-ar" - export NM="$target-nm" - export RANLIB="$target-ranlib" - export OBJCOPY="$target-objcopy" - export STRIP="$target-strip" - export CPPFLAGS="-I$prefix/include" - export CFLAGS="-g0 -O2 -pipe -fomit-frame-pointer -static-libgcc $CPPFLAGS" - export CXXFLAGS="$CFLAGS -static-libstdc++" - export LDFLAGS="-L$prefix/lib -static-libgcc -static-libstdc++" - export ERL_COMPILER_OPTIONS='[deterministic, no_debug_info]' - if [ "$mode" = 'cross' ] then configure="./configure --host=$target --build=$platform" else configure='./configure' @@ -1259,7 +1286,7 @@ build_rel() info "Building Erlang/OTP $otp_vsn for $arch ..." if [ "$mode" = 'cross' ] then - export PATH="$native_otp_bin:$PATH" # For Bootstrapping/Mix. + add_otp_path "$mode" "$prefix" export erl_xcomp_sysroot="$prefix" fi cd "$target_src_dir/$otp_dir" @@ -1280,11 +1307,8 @@ build_rel() make make install if [ "$mode" = 'native' ] - then - native_otp_bin="$prefix/bin" - export PATH="$native_otp_bin:$PATH" # For Mix. - else - unset erl_xcomp_sysroot + then add_otp_path "$mode" "$prefix" + else unset erl_xcomp_sysroot fi cd "$OLDPWD" @@ -1293,6 +1317,60 @@ build_rel() make install PREFIX="$prefix" cd "$OLDPWD" + export PATH="$saved_path" +} +#. + +#' Build the actual release. +build_rel() +{ + local mode="$1" + local target="$2" + local prefix="$3" + local arch="$(arch_name "$target")" + local rel_dir="$PWD/_build/prod" + local target_data_dir="$prefix/$rel_name" + local target_dst_dir="$prefix/$rel_name-$rel_vsn" + local target_dst_tar="$rel_name-$rel_vsn-linux-$arch.tar.gz" + local saved_path="$PATH" + + # + # The "$ct_prefix_dir/$target/$target/bin" directory contains cross + # compilation tools without "$target-" prefix. We add it to the PATH, + # just in case tools are called without prefix somewhere. However, we + # try to use the prefixed tools everywhere, so it should be possible to + # omit this directory from the path if desired. See also: + # + # https://stackoverflow.com/a/24243789 + # + export PATH="$ct_prefix_dir/$target/bin:$ct_prefix_dir/$target/$target/bin:$PATH" + export CC="$target-gcc" + export CXX="$target-g++" + export CPP="$target-cpp" + export LD="$target-ld" + export AS="$target-as" + export AR="$target-ar" + export NM="$target-nm" + export RANLIB="$target-ranlib" + export OBJCOPY="$target-objcopy" + export STRIP="$target-strip" + export CPPFLAGS="-I$prefix/include" + export CFLAGS="-g0 -O2 -pipe -fomit-frame-pointer -static-libgcc $CPPFLAGS" + export CXXFLAGS="$CFLAGS -static-libstdc++" + export LDFLAGS="-L$prefix/lib -static-libgcc -static-libstdc++" + export ERL_COMPILER_OPTIONS='[deterministic, no_debug_info]' + + if [ "$mode" = 'cross' ] + then configure="./configure --host=$target --build=$platform" + else configure='./configure' + fi + + if [ $have_current_deps = false ] + then build_deps "$mode" "$target" "$prefix" + fi + + add_otp_path "$mode" "$prefix" + if [ "$mode" = 'native' ] # In order to only do this once. then info "Fetching Mix dependencies" @@ -1350,13 +1428,14 @@ build_rel() info "Putting together $rel_name $rel_vsn archive for $arch ..." mkdir "$target_dst_dir" tar -C "$target_dst_dir" -xzf "$rel_dir/$rel_tar" - create_data_dir "$target_dst_dir" "$prefix/$rel_name" + create_data_dir "$target_dst_dir" "$target_data_dir" add_systemd_unit "$target_dst_dir" edit_ejabberdctl "$target_dst_dir" remove_unused_files "$target_dst_dir" strip_files "$target_dst_dir" "$STRIP" tar -C "$prefix" --owner="$rel_name" --group="$rel_name" -cf - \ "$rel_name" "$rel_name-$rel_vsn" | gzip -9 >"$target_dst_tar" + rm -rf "$target_dst_dir" "$target_data_dir" info "Created $target_dst_tar successfully." @@ -1370,7 +1449,7 @@ if [ "${CHECK_DEPS:-true}" = 'true' ] then if have_browser then - check_deps + check_configured_dep_vsns else error 'Cannot check dependency versions.' error 'Install a browser or set CHECK_DEPS=false' @@ -1386,40 +1465,46 @@ then exit 1 fi -# Keep existing toolchains but rebuild everything else. +check_built_dep_vsns info 'Removing old bootstrap tools ...' rm -rf "$bootstrap_dir" mkdir "$bootstrap_dir" -info 'Removing old builds ...' -rm -rf "$build_dir" -mkdir "$build_dir" +if [ $have_current_deps = true ] +then + info 'Dependencies are up-to-date ...' +else + # Keep existing toolchains but rebuild everything else. + info 'Removing old builds ...' + rm -rf "$build_dir" + mkdir "$build_dir" -info 'Removing old source ...' -rm -rf "$src_dir" -mkdir "$src_dir" + info 'Removing old source ...' + rm -rf "$src_dir" + mkdir "$src_dir" -info 'Downloading dependencies ...' -cd "$src_dir" -curl -LO "http://crosstool-ng.org/download/crosstool-ng/$crosstool_tar" -curl -LO "https://ftp.gnu.org/gnu/termcap/$termcap_tar" -curl -LO "https://github.com/libexpat/libexpat/releases/download/R_$(printf '%s' "$expat_vsn" | sed 's/\./_/g')/$expat_tar" -curl -LO "https://zlib.net/$zlib_tar" -curl -LO "https://pyyaml.org/download/libyaml/$yaml_tar" -curl -LO "https://www.openssl.org/source/$ssl_tar" -curl -LO "https://github.com/erlang/otp/releases/download/OTP-$otp_vsn/$otp_tar" -curl -LO "https://github.com/elixir-lang/elixir/archive/v$elixir_vsn.tar.gz" -curl -LO "https://github.com/linux-pam/linux-pam/releases/download/v$pam_vsn/$pam_tar" -curl -LO "https://download.sourceforge.net/libpng/$png_tar" -curl -LO "https://www.ijg.org/files/$jpeg_tar" -curl -LO "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/$webp_tar" -curl -LO "https://github.com/libgd/libgd/releases/download/gd-$gd_vsn/$gd_tar" -curl -LO "http://www.unixodbc.org/$odbc_tar" -curl -LO "https://www.sqlite.org/$(date '+%Y')/$sqlite_tar" \ - || curl -LO "https://www.sqlite.org/$(date -d '1 year ago' '+%Y')/$sqlite_tar" \ - || curl -LO "https://www.sqlite.org/$(date -d '2 years ago' '+%Y')/$sqlite_tar" -cd "$OLDPWD" + info 'Downloading dependencies ...' + cd "$src_dir" + curl -LO "http://crosstool-ng.org/download/crosstool-ng/$crosstool_tar" + curl -LO "https://ftp.gnu.org/gnu/termcap/$termcap_tar" + curl -LO "https://github.com/libexpat/libexpat/releases/download/R_$(printf '%s' "$expat_vsn" | sed 's/\./_/g')/$expat_tar" + curl -LO "https://zlib.net/$zlib_tar" + curl -LO "https://pyyaml.org/download/libyaml/$yaml_tar" + curl -LO "https://www.openssl.org/source/$ssl_tar" + curl -LO "https://github.com/erlang/otp/releases/download/OTP-$otp_vsn/$otp_tar" + curl -LO "https://github.com/elixir-lang/elixir/archive/v$elixir_vsn.tar.gz" + curl -LO "https://github.com/linux-pam/linux-pam/releases/download/v$pam_vsn/$pam_tar" + curl -LO "https://download.sourceforge.net/libpng/$png_tar" + curl -LO "https://www.ijg.org/files/$jpeg_tar" + curl -LO "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/$webp_tar" + curl -LO "https://github.com/libgd/libgd/releases/download/gd-$gd_vsn/$gd_tar" + curl -LO "http://www.unixodbc.org/$odbc_tar" + curl -LO "https://www.sqlite.org/$(date '+%Y')/$sqlite_tar" \ + || curl -LO "https://www.sqlite.org/$(date -d '1 year ago' '+%Y')/$sqlite_tar" \ + || curl -LO "https://www.sqlite.org/$(date -d '2 years ago' '+%Y')/$sqlite_tar" + cd "$OLDPWD" +fi mkdir "$bootstrap_dir/bin" export PATH="$bootstrap_dir/bin:$PATH" # For ct-ng. @@ -1438,6 +1523,8 @@ do build_rel "$mode" "$target" "$prefix" done +save_built_dep_vsns + info "Build started: $build_start" info "Build ended: $(date '+%F %T')" From 87995a57deafafcf9cdf32b23ae5990c995d440f Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 8 Mar 2022 17:01:11 +0100 Subject: [PATCH 276/440] Add GitHub Action to build binary packages Publish DEB and RPM packages as well as binary installers for each commit that modifies source code. This allows for testing development code, and makes sure that problems with building binary packages are noticed early on. --- .github/workflows/packages.yml | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/packages.yml diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml new file mode 100644 index 000000000..7ff7b56be --- /dev/null +++ b/.github/workflows/packages.yml @@ -0,0 +1,68 @@ +name: Publish binary packages + +on: + push: + paths-ignore: + - '.devcontainer/**' + - 'examples/**' + - 'lib/**' + - 'man/**' + - 'priv/**' + - '**.md' + pull_request: + paths-ignore: + - '.devcontainer/**' + - 'examples/**' + - 'lib/**' + - 'man/**' + - 'priv/**' + - '**.md' + +jobs: + binaries: + name: Binaries + runs-on: ubuntu-latest + steps: + - name: Cache build directory + uses: actions/cache@v2 + with: + path: ~/build/ + key: ${{runner.os}}-ct-ng-1.24.0 + - name: Install prerequisites + run: | + sudo apt-get -qq update + sudo apt-get -qq install makeself + # https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile + sudo apt-get -qq install build-essential autoconf bison flex gawk + sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin + sudo apt-get -qq install python3-dev texinfo unzip + - name: Install FPM + run: | + gem install --no-document --user-install fpm + echo $HOME/.gem/ruby/*/bin >> $GITHUB_PATH + - name: Check out repository code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Build binary archives + run: CHECK_DEPS=false tools/make-binaries + - name: Build DEB and RPM packages + run: tools/make-packages + - name: Build installers + run: tools/make-installers + - name: Collect packages + run: | + mkdir ejabberd-packages + mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages + - name: Upload packages + uses: actions/upload-artifact@v3 + with: + name: ejabberd-packages + # + # Appending the wildcard character ("*") is a trick to make + # "ejabberd-packages" the root directory of the uploaded ZIP file: + # + # https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions + # + path: ejabberd-packages* + retention-days: 14 From 65437d08ef977f7508223151d962cfe307a4fee9 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 22 Apr 2022 21:37:25 +0200 Subject: [PATCH 277/440] make-binaries: Update to Crosstool-NG 1.25.0-RC2 Update Crosstool-NG to the current release candidate, and use much shorter "defconfig" files for specifying the configuration. --- .github/workflows/packages.yml | 2 +- tools/make-binaries | 674 +-------------------------------- 2 files changed, 10 insertions(+), 666 deletions(-) diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 7ff7b56be..52667879f 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -27,7 +27,7 @@ jobs: uses: actions/cache@v2 with: path: ~/build/ - key: ${{runner.os}}-ct-ng-1.24.0 + key: ${{runner.os}}-ct-ng-1.25.0-RC2 - name: Install prerequisites run: | sudo apt-get -qq update diff --git a/tools/make-binaries b/tools/make-binaries index 0f44e0929..3c74d376c 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -65,7 +65,7 @@ fi rel_name='ejabberd' rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') mix_vsn=$(mix_version "$rel_vsn") -crosstool_vsn='1.24.0' +crosstool_vsn='1.25.0_rc2' termcap_vsn='1.3.1' expat_vsn='2.4.8' zlib_vsn='1.2.12' @@ -251,636 +251,15 @@ create_common_config() local file="$1" cat >"$file" <<-'EOF' - # - # crosstool-NG Configuration - # - CT_CONFIGURE_has_static_link=y - CT_CONFIGURE_has_cxx11=y - CT_CONFIGURE_has_wget=y - CT_CONFIGURE_has_curl=y - CT_CONFIGURE_has_make_3_81_or_newer=y - CT_CONFIGURE_has_make_4_0_or_newer=y - CT_CONFIGURE_has_libtool_2_4_or_newer=y - CT_CONFIGURE_has_libtoolize_2_4_or_newer=y - CT_CONFIGURE_has_autoconf_2_65_or_newer=y - CT_CONFIGURE_has_autoreconf_2_65_or_newer=y - CT_CONFIGURE_has_gnu_m4_1_4_12_or_newer=y - CT_CONFIGURE_has_python_3_4_or_newer=y - CT_CONFIGURE_has_bison_2_7_or_newer=y - CT_CONFIGURE_has_python=y - CT_CONFIGURE_has_git=y - CT_CONFIGURE_has_md5sum=y - CT_CONFIGURE_has_sha1sum=y - CT_CONFIGURE_has_sha256sum=y - CT_CONFIGURE_has_sha512sum=y - CT_CONFIGURE_has_install_with_strip_program=y - CT_CONFIG_VERSION_CURRENT="3" - CT_CONFIG_VERSION="3" - CT_MODULES=y - - # - # Paths - # - CT_LOCAL_TARBALLS_DIR="${HOME}/src" - CT_WORK_DIR="${CT_TOP_DIR}/.build" - CT_BUILD_TOP_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/.build}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" - CT_PREFIX_DIR="${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" - CT_REMOVE_DOCS=y - CT_PREFIX_DIR_RO=y - CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y - CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES=y - - # - # Downloading - # + CT_CONFIG_VERSION="4" CT_DOWNLOAD_AGENT_CURL=y - CT_CONNECT_TIMEOUT=10 - CT_DOWNLOAD_CURL_OPTIONS="--location --ftp-pasv --retry 3 --fail --silent" - CT_VERIFY_DOWNLOAD_DIGEST=y - CT_VERIFY_DOWNLOAD_DIGEST_SHA512=y - CT_VERIFY_DOWNLOAD_DIGEST_ALG="sha512" - - # - # Extracting - # - CT_OVERRIDE_CONFIG_GUESS_SUB=y - CT_PATCH_BUNDLED=y - CT_PATCH_ORDER="bundled" - - # - # Build behavior - # - CT_PARALLEL_JOBS=0 - CT_LOAD="" - CT_USE_PIPES=y - CT_EXTRA_CFLAGS_FOR_BUILD="" - CT_EXTRA_LDFLAGS_FOR_BUILD="" - CT_EXTRA_CFLAGS_FOR_HOST="" - CT_EXTRA_LDFLAGS_FOR_HOST="" - CT_CONFIG_SHELL_BASH=y - CT_CONFIG_SHELL="${bash}" - - # - # Logging - # - CT_LOG_EXTRA=y - CT_LOG_LEVEL_MAX="EXTRA" - CT_LOG_PROGRESS_BAR=y - - # - # Target options - # - CT_ARCH_CPU="" - CT_ARCH_TUNE="" - - # - # Options for the CPU architecture - # - CT_ALL_ARCH_CHOICES="ALPHA ARC ARM AVR M68K MICROBLAZE MIPS MOXIE MSP430 NIOS2 POWERPC RISCV S390 SH SPARC X86 XTENSA" - CT_ARCH_SUFFIX="" CT_OMIT_TARGET_VENDOR=y - - # - # Generic target options - # - CT_DEMULTILIB=y - CT_ARCH_USE_MMU=y - CT_ARCH_SUPPORTS_32=y - CT_ARCH_SUPPORTS_64=y - CT_ARCH_DEFAULT_32=y - CT_ARCH_BITNESS=64 - CT_ARCH_64=y - - # - # Target optimisations - # - CT_ARCH_SUPPORTS_WITH_ARCH=y - CT_ARCH_SUPPORTS_WITH_CPU=y - CT_ARCH_SUPPORTS_WITH_TUNE=y - CT_ARCH_ARCH="" - CT_TARGET_CFLAGS="" - CT_TARGET_LDFLAGS="" - - # - # General toolchain options - # - CT_FORCE_SYSROOT=y - CT_USE_SYSROOT=y - CT_SYSROOT_NAME="sysroot" - CT_SYSROOT_DIR_PREFIX="" - CT_WANTS_STATIC_LINK=y - CT_WANTS_STATIC_LINK_CXX=y - CT_SHOW_CT_VERSION=y - CT_TOOLCHAIN_PKGVERSION="" - CT_TOOLCHAIN_BUGURL="" - - # - # Tuple completion and aliasing - # - CT_TARGET_ALIAS_SED_EXPR="" - CT_TARGET_ALIAS="" - - # - # Toolchain type - # - CT_CROSS=y - CT_TOOLCHAIN_TYPE="cross" - - # - # Build system - # - CT_BUILD="" - CT_BUILD_PREFIX="" - CT_BUILD_SUFFIX="" - - # - # Operating System - # - CT_KERNEL_SUPPORTS_SHARED_LIBS=y - CT_KERNEL_LINUX=y - CT_KERNEL="linux" - CT_KERNEL_CHOICE_KSYM="LINUX" - CT_KERNEL_LINUX_SHOW=y - - # - # Options for linux - # - CT_KERNEL_LINUX_PKG_KSYM="LINUX" - CT_LINUX_DIR_NAME="linux" - CT_LINUX_PKG_NAME="linux" - CT_LINUX_SRC_RELEASE=y - CT_LINUX_PATCH_ORDER="global" - CT_LINUX_V_3_16=y - CT_LINUX_VERSION="3.16.63" - CT_LINUX_MIRRORS="$(CT_Mirrors kernel.org linux ${CT_LINUX_VERSION})" - CT_LINUX_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_LINUX_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_LINUX_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_LINUX_SIGNATURE_FORMAT="unpacked/.sign" - CT_LINUX_4_8_or_older=y - CT_LINUX_older_than_4_8=y - CT_LINUX_later_than_3_7=y - CT_LINUX_3_7_or_later=y - CT_LINUX_later_than_3_2=y - CT_LINUX_3_2_or_later=y - CT_KERNEL_LINUX_VERBOSITY_0=y - CT_KERNEL_LINUX_VERBOSE_LEVEL=0 - CT_KERNEL_LINUX_INSTALL_CHECK=y - CT_ALL_KERNEL_CHOICES="BARE_METAL LINUX WINDOWS" - - # - # Common kernel options - # - CT_SHARED_LIBS=y - - # - # Binary utilities - # - CT_ARCH_BINFMT_ELF=y - CT_BINUTILS_BINUTILS=y - CT_BINUTILS="binutils" - CT_BINUTILS_CHOICE_KSYM="BINUTILS" - CT_BINUTILS_BINUTILS_SHOW=y - - # - # Options for binutils - # - CT_BINUTILS_BINUTILS_PKG_KSYM="BINUTILS" - CT_BINUTILS_DIR_NAME="binutils" - CT_BINUTILS_USE_GNU=y - CT_BINUTILS_USE="BINUTILS" - CT_BINUTILS_PKG_NAME="binutils" - CT_BINUTILS_SRC_RELEASE=y - CT_BINUTILS_PATCH_ORDER="global" - CT_BINUTILS_MIRRORS="$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)" - CT_BINUTILS_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_BINUTILS_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_BINUTILS_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" - CT_BINUTILS_SIGNATURE_FORMAT="packed/.sig" - CT_BINUTILS_later_than_2_27=y - CT_BINUTILS_2_27_or_later=y - CT_BINUTILS_later_than_2_25=y - CT_BINUTILS_2_25_or_later=y - CT_BINUTILS_later_than_2_23=y - CT_BINUTILS_2_23_or_later=y - - # - # GNU binutils - # - CT_BINUTILS_HAS_HASH_STYLE=y - CT_BINUTILS_HAS_GOLD=y - CT_BINUTILS_HAS_PLUGINS=y - CT_BINUTILS_HAS_PKGVERSION_BUGURL=y - CT_BINUTILS_GOLD_SUPPORTS_ARCH=y - CT_BINUTILS_GOLD_SUPPORT=y - CT_BINUTILS_FORCE_LD_BFD_DEFAULT=y - CT_BINUTILS_LINKER_LD_GOLD=y - CT_BINUTILS_GOLD_INSTALLED=y - CT_BINUTILS_GOLD_THREADS=y - CT_BINUTILS_LINKER_BOTH=y - CT_BINUTILS_LINKERS_LIST="ld,gold" - CT_BINUTILS_LD_WRAPPER=y - CT_BINUTILS_LINKER_DEFAULT="bfd" - CT_BINUTILS_PLUGINS=y - CT_BINUTILS_RELRO=m - CT_BINUTILS_EXTRA_CONFIG_ARRAY="" - CT_ALL_BINUTILS_CHOICES="BINUTILS" - - # - # C-library - # - CT_LIBC_GLIBC=y - CT_LIBC="glibc" - CT_LIBC_CHOICE_KSYM="GLIBC" - CT_THREADS="nptl" - CT_LIBC_GLIBC_SHOW=y - - # - # Options for glibc - # - CT_LIBC_GLIBC_PKG_KSYM="GLIBC" - CT_GLIBC_DIR_NAME="glibc" - CT_GLIBC_USE_GNU=y - CT_GLIBC_USE="GLIBC" - CT_GLIBC_PKG_NAME="glibc" - CT_GLIBC_SRC_RELEASE=y - CT_GLIBC_PATCH_ORDER="global" - CT_GLIBC_V_2_17=y - CT_GLIBC_VERSION="2.17" - CT_GLIBC_MIRRORS="$(CT_Mirrors GNU glibc)" - CT_GLIBC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_GLIBC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_GLIBC_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" - CT_GLIBC_SIGNATURE_FORMAT="packed/.sig" - CT_GLIBC_2_29_or_older=y - CT_GLIBC_older_than_2_29=y - CT_GLIBC_2_27_or_older=y - CT_GLIBC_older_than_2_27=y - CT_GLIBC_2_26_or_older=y - CT_GLIBC_older_than_2_26=y - CT_GLIBC_2_25_or_older=y - CT_GLIBC_older_than_2_25=y - CT_GLIBC_2_24_or_older=y - CT_GLIBC_older_than_2_24=y - CT_GLIBC_2_23_or_older=y - CT_GLIBC_older_than_2_23=y - CT_GLIBC_2_20_or_older=y - CT_GLIBC_older_than_2_20=y - CT_GLIBC_2_17_or_later=y - CT_GLIBC_2_17_or_older=y - CT_GLIBC_later_than_2_14=y - CT_GLIBC_2_14_or_later=y - CT_GLIBC_DEP_KERNEL_HEADERS_VERSION=y - CT_GLIBC_DEP_BINUTILS=y - CT_GLIBC_DEP_GCC=y - CT_GLIBC_DEP_PYTHON=y - CT_GLIBC_HAS_NPTL_ADDON=y - CT_GLIBC_HAS_PORTS_ADDON=y - CT_GLIBC_HAS_LIBIDN_ADDON=y - CT_GLIBC_USE_NPTL_ADDON=y - CT_GLIBC_HAS_OBSOLETE_RPC=y - CT_GLIBC_EXTRA_CONFIG_ARRAY="" - CT_GLIBC_CONFIGPARMS="" - CT_GLIBC_EXTRA_CFLAGS="" - CT_GLIBC_ENABLE_OBSOLETE_RPC=y - CT_GLIBC_OLDEST_ABI="" - CT_GLIBC_FORCE_UNWIND=y - CT_GLIBC_KERNEL_VERSION_NONE=y - CT_GLIBC_MIN_KERNEL="" - CT_ALL_LIBC_CHOICES="AVR_LIBC BIONIC GLIBC MINGW_W64 MOXIEBOX MUSL NEWLIB NONE UCLIBC" - CT_LIBC_SUPPORT_THREADS_ANY=y - CT_LIBC_SUPPORT_THREADS_NATIVE=y - - # - # Common C library options - # - CT_THREADS_NATIVE=y - - # - # C compiler - # - CT_CC_CORE_PASSES_NEEDED=y - CT_CC_CORE_PASS_1_NEEDED=y - CT_CC_CORE_PASS_2_NEEDED=y - CT_CC_SUPPORT_CXX=y - CT_CC_SUPPORT_FORTRAN=y - CT_CC_SUPPORT_ADA=y - CT_CC_SUPPORT_OBJC=y - CT_CC_SUPPORT_OBJCXX=y - CT_CC_SUPPORT_GOLANG=y - CT_CC_GCC=y - CT_CC="gcc" - CT_CC_CHOICE_KSYM="GCC" - CT_CC_GCC_SHOW=y - - # - # Options for gcc - # - CT_CC_GCC_PKG_KSYM="GCC" - CT_GCC_DIR_NAME="gcc" - CT_GCC_USE_GNU=y - CT_GCC_USE="GCC" - CT_GCC_PKG_NAME="gcc" - CT_GCC_SRC_RELEASE=y - CT_GCC_PATCH_ORDER="global" - CT_GCC_V_8=y - CT_GCC_VERSION="8.3.0" - CT_GCC_MIRRORS="$(CT_Mirrors GNU gcc/gcc-${CT_GCC_VERSION}) $(CT_Mirrors sourceware gcc/releases/gcc-${CT_GCC_VERSION})" - CT_GCC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_GCC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_GCC_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_GCC_SIGNATURE_FORMAT="" - CT_GCC_later_than_7=y - CT_GCC_7_or_later=y - CT_GCC_later_than_6=y - CT_GCC_6_or_later=y - CT_GCC_later_than_5=y - CT_GCC_5_or_later=y - CT_GCC_later_than_4_9=y - CT_GCC_4_9_or_later=y - CT_GCC_later_than_4_8=y - CT_GCC_4_8_or_later=y - CT_CC_GCC_ENABLE_PLUGINS=y - CT_CC_GCC_GOLD=y - CT_CC_GCC_HAS_LIBMPX=y - CT_CC_GCC_ENABLE_CXX_FLAGS="" - CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY="" - CT_CC_GCC_EXTRA_CONFIG_ARRAY="" - CT_CC_GCC_STATIC_LIBSTDCXX=y - CT_CC_GCC_CONFIG_TLS=m - - # - # Optimisation features - # - CT_CC_GCC_USE_GRAPHITE=y - CT_CC_GCC_USE_LTO=y - - # - # Settings for libraries running on target - # - CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y - - # - # Misc. obscure options. - # - CT_CC_CXA_ATEXIT=y - CT_CC_GCC_SJLJ_EXCEPTIONS=m - CT_CC_GCC_LDBL_128=m - CT_CC_GCC_LNK_HASH_STYLE_BOTH=y - CT_CC_GCC_LNK_HASH_STYLE="both" - CT_CC_GCC_DEC_FLOAT_AUTO=y - CT_ALL_CC_CHOICES="GCC" - - # - # Additional supported languages: - # CT_CC_LANG_CXX=y - - # - # Debug facilities - # - CT_ALL_DEBUG_CHOICES="DUMA GDB LTRACE STRACE" - - # - # Companion libraries - # - CT_COMP_LIBS_GETTEXT=y - CT_COMP_LIBS_GETTEXT_PKG_KSYM="GETTEXT" - CT_GETTEXT_DIR_NAME="gettext" - CT_GETTEXT_PKG_NAME="gettext" - CT_GETTEXT_SRC_RELEASE=y - CT_GETTEXT_PATCH_ORDER="global" - CT_GETTEXT_V_0_19_8_1=y - CT_GETTEXT_VERSION="0.19.8.1" - CT_GETTEXT_MIRRORS="$(CT_Mirrors GNU gettext)" - CT_GETTEXT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_GETTEXT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_GETTEXT_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.gz" - CT_GETTEXT_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_LIBS_GMP=y - CT_COMP_LIBS_GMP_PKG_KSYM="GMP" - CT_GMP_DIR_NAME="gmp" - CT_GMP_PKG_NAME="gmp" - CT_GMP_SRC_RELEASE=y - CT_GMP_PATCH_ORDER="global" - CT_GMP_V_6_1=y - CT_GMP_VERSION="6.1.2" - CT_GMP_MIRRORS="https://gmplib.org/download/gmp https://gmplib.org/download/gmp/archive $(CT_Mirrors GNU gmp)" - CT_GMP_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_GMP_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_GMP_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2" - CT_GMP_SIGNATURE_FORMAT="packed/.sig" - CT_GMP_later_than_5_1_0=y - CT_GMP_5_1_0_or_later=y - CT_GMP_later_than_5_0_0=y - CT_GMP_5_0_0_or_later=y - CT_GMP_REQUIRE_5_0_0_or_later=y - CT_COMP_LIBS_ISL=y - CT_COMP_LIBS_ISL_PKG_KSYM="ISL" - CT_ISL_DIR_NAME="isl" - CT_ISL_PKG_NAME="isl" - CT_ISL_SRC_RELEASE=y - CT_ISL_PATCH_ORDER="global" - CT_ISL_V_0_20=y - CT_ISL_VERSION="0.20" - CT_ISL_MIRRORS="https://libisl.sourceforge.io" - CT_ISL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_ISL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_ISL_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" - CT_ISL_SIGNATURE_FORMAT="" - CT_ISL_later_than_0_18=y - CT_ISL_0_18_or_later=y - CT_ISL_later_than_0_15=y - CT_ISL_0_15_or_later=y - CT_ISL_REQUIRE_0_15_or_later=y - CT_ISL_later_than_0_14=y - CT_ISL_0_14_or_later=y - CT_ISL_REQUIRE_0_14_or_later=y - CT_ISL_later_than_0_13=y - CT_ISL_0_13_or_later=y - CT_ISL_later_than_0_12=y - CT_ISL_0_12_or_later=y - CT_ISL_REQUIRE_0_12_or_later=y - CT_COMP_LIBS_LIBICONV=y - CT_COMP_LIBS_LIBICONV_PKG_KSYM="LIBICONV" - CT_LIBICONV_DIR_NAME="libiconv" - CT_LIBICONV_PKG_NAME="libiconv" - CT_LIBICONV_SRC_RELEASE=y - CT_LIBICONV_PATCH_ORDER="global" - CT_LIBICONV_V_1_15=y - CT_LIBICONV_VERSION="1.15" - CT_LIBICONV_MIRRORS="$(CT_Mirrors GNU libiconv)" - CT_LIBICONV_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_LIBICONV_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_LIBICONV_ARCHIVE_FORMATS=".tar.gz" - CT_LIBICONV_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_LIBS_MPC=y - CT_COMP_LIBS_MPC_PKG_KSYM="MPC" - CT_MPC_DIR_NAME="mpc" - CT_MPC_PKG_NAME="mpc" - CT_MPC_SRC_RELEASE=y - CT_MPC_PATCH_ORDER="global" - CT_MPC_V_1_1=y - CT_MPC_VERSION="1.1.0" - CT_MPC_MIRRORS="http://www.multiprecision.org/downloads $(CT_Mirrors GNU mpc)" - CT_MPC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_MPC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_MPC_ARCHIVE_FORMATS=".tar.gz" - CT_MPC_SIGNATURE_FORMAT="packed/.sig" - CT_MPC_1_1_0_or_later=y - CT_MPC_1_1_0_or_older=y - CT_COMP_LIBS_MPFR=y - CT_COMP_LIBS_MPFR_PKG_KSYM="MPFR" - CT_MPFR_DIR_NAME="mpfr" - CT_MPFR_PKG_NAME="mpfr" - CT_MPFR_SRC_RELEASE=y - CT_MPFR_PATCH_ORDER="global" - CT_MPFR_V_4_0=y - CT_MPFR_VERSION="4.0.2" - CT_MPFR_MIRRORS="http://www.mpfr.org/mpfr-${CT_MPFR_VERSION} $(CT_Mirrors GNU mpfr)" - CT_MPFR_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_MPFR_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_MPFR_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz .zip" - CT_MPFR_SIGNATURE_FORMAT="packed/.asc" - CT_MPFR_later_than_4_0_0=y - CT_MPFR_4_0_0_or_later=y - CT_MPFR_later_than_3_0_0=y - CT_MPFR_3_0_0_or_later=y - CT_MPFR_REQUIRE_3_0_0_or_later=y - CT_COMP_LIBS_NCURSES=y - CT_COMP_LIBS_NCURSES_PKG_KSYM="NCURSES" - CT_NCURSES_DIR_NAME="ncurses" - CT_NCURSES_PKG_NAME="ncurses" - CT_NCURSES_SRC_RELEASE=y - CT_NCURSES_PATCH_ORDER="global" - CT_NCURSES_V_6_1=y - CT_NCURSES_VERSION="6.1" - CT_NCURSES_MIRRORS="ftp://invisible-island.net/ncurses $(CT_Mirrors GNU ncurses)" - CT_NCURSES_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_NCURSES_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_NCURSES_ARCHIVE_FORMATS=".tar.gz" - CT_NCURSES_SIGNATURE_FORMAT="packed/.sig" - CT_NCURSES_HOST_CONFIG_ARGS="" - CT_NCURSES_HOST_DISABLE_DB=y - CT_NCURSES_HOST_FALLBACKS="linux,xterm,xterm-color,xterm-256color,vt100" - CT_NCURSES_TARGET_CONFIG_ARGS="" - CT_NCURSES_TARGET_FALLBACKS="" - CT_COMP_LIBS_ZLIB=y - CT_COMP_LIBS_ZLIB_PKG_KSYM="ZLIB" - CT_ZLIB_DIR_NAME="zlib" - CT_ZLIB_PKG_NAME="zlib" - CT_ZLIB_SRC_RELEASE=y - CT_ZLIB_PATCH_ORDER="global" - CT_ZLIB_V_1_2_11=y - CT_ZLIB_VERSION="1.2.11" - CT_ZLIB_MIRRORS="http://downloads.sourceforge.net/project/libpng/zlib/${CT_ZLIB_VERSION}" - CT_ZLIB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_ZLIB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_ZLIB_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_ZLIB_SIGNATURE_FORMAT="packed/.asc" - CT_ALL_COMP_LIBS_CHOICES="CLOOG EXPAT GETTEXT GMP ISL LIBELF LIBICONV MPC MPFR NCURSES ZLIB" - CT_LIBICONV_NEEDED=y - CT_GETTEXT_NEEDED=y - CT_GMP_NEEDED=y - CT_MPFR_NEEDED=y - CT_ISL_NEEDED=y - CT_MPC_NEEDED=y - CT_NCURSES_NEEDED=y - CT_ZLIB_NEEDED=y - CT_LIBICONV=y - CT_GETTEXT=y - CT_GMP=y - CT_MPFR=y - CT_ISL=y - CT_MPC=y - CT_NCURSES=y - CT_ZLIB=y - - # - # Companion tools - # - CT_COMP_TOOLS_FOR_HOST=y - CT_COMP_TOOLS_AUTOCONF=y - CT_COMP_TOOLS_AUTOCONF_PKG_KSYM="AUTOCONF" - CT_AUTOCONF_DIR_NAME="autoconf" - CT_AUTOCONF_PKG_NAME="autoconf" - CT_AUTOCONF_SRC_RELEASE=y - CT_AUTOCONF_PATCH_ORDER="global" - CT_AUTOCONF_V_2_69=y - CT_AUTOCONF_VERSION="2.69" - CT_AUTOCONF_MIRRORS="$(CT_Mirrors GNU autoconf)" - CT_AUTOCONF_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_AUTOCONF_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_AUTOCONF_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_AUTOCONF_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_TOOLS_AUTOMAKE=y - CT_COMP_TOOLS_AUTOMAKE_PKG_KSYM="AUTOMAKE" - CT_AUTOMAKE_DIR_NAME="automake" - CT_AUTOMAKE_PKG_NAME="automake" - CT_AUTOMAKE_SRC_RELEASE=y - CT_AUTOMAKE_PATCH_ORDER="global" - CT_AUTOMAKE_V_1_16=y - CT_AUTOMAKE_VERSION="1.16.1" - CT_AUTOMAKE_MIRRORS="$(CT_Mirrors GNU automake)" - CT_AUTOMAKE_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_AUTOMAKE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_AUTOMAKE_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_AUTOMAKE_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_TOOLS_BISON=y - CT_COMP_TOOLS_BISON_PKG_KSYM="BISON" - CT_BISON_DIR_NAME="bison" - CT_BISON_PKG_NAME="bison" - CT_BISON_SRC_RELEASE=y - CT_BISON_PATCH_ORDER="global" - CT_BISON_V_3_3=y - CT_BISON_VERSION="3.3.2" - CT_BISON_MIRRORS="$(CT_Mirrors GNU bison)" - CT_BISON_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_BISON_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_BISON_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_BISON_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_TOOLS_LIBTOOL=y - CT_COMP_TOOLS_LIBTOOL_PKG_KSYM="LIBTOOL" - CT_LIBTOOL_DIR_NAME="libtool" - CT_LIBTOOL_PKG_NAME="libtool" - CT_LIBTOOL_SRC_RELEASE=y - CT_LIBTOOL_PATCH_ORDER="global" - CT_LIBTOOL_V_2_4=y - CT_LIBTOOL_VERSION="2.4.6" - CT_LIBTOOL_MIRRORS="$(CT_Mirrors GNU libtool)" - CT_LIBTOOL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_LIBTOOL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_LIBTOOL_ARCHIVE_FORMATS=".tar.xz .tar.gz" - CT_LIBTOOL_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_TOOLS_M4=y - CT_COMP_TOOLS_M4_PKG_KSYM="M4" - CT_M4_DIR_NAME="m4" - CT_M4_PKG_NAME="m4" - CT_M4_SRC_RELEASE=y - CT_M4_PATCH_ORDER="global" - CT_M4_V_1_4=y - CT_M4_VERSION="1.4.18" - CT_M4_MIRRORS="$(CT_Mirrors GNU m4)" - CT_M4_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_M4_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_M4_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" - CT_M4_SIGNATURE_FORMAT="packed/.sig" - CT_COMP_TOOLS_MAKE=y - CT_COMP_TOOLS_MAKE_PKG_KSYM="MAKE" - CT_MAKE_DIR_NAME="make" - CT_MAKE_PKG_NAME="make" - CT_MAKE_SRC_RELEASE=y - CT_MAKE_PATCH_ORDER="global" - CT_MAKE_V_4_2=y - CT_MAKE_VERSION="4.2.1" - CT_MAKE_MIRRORS="$(CT_Mirrors GNU make)" - CT_MAKE_ARCHIVE_FILENAME="@{pkg_name}-@{version}" - CT_MAKE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" - CT_MAKE_ARCHIVE_FORMATS=".tar.bz2 .tar.gz" - CT_MAKE_SIGNATURE_FORMAT="packed/.sig" - CT_MAKE_later_than_4_0=y - CT_MAKE_4_0_or_later=y - CT_ALL_COMP_TOOLS_CHOICES="AUTOCONF AUTOMAKE BISON DTC LIBTOOL M4 MAKE" + CT_ARCH_64=y + CT_KERNEL_LINUX=y + CT_LINUX_V_3_16=y + CT_GLIBC_V_2_17=y + CT_GLIBC_KERNEL_VERSION_NONE=y EOF } #. @@ -893,20 +272,7 @@ create_x64_config() create_common_config "$file" cat >>"$file" <<-'EOF' - # - # x64 - # CT_ARCH_X86=y - CT_ARCH="x86" - CT_ARCH_CHOICE_KSYM="X86" - CT_ARCH_X86_SHOW=y - CT_ARCH_X86_PKG_KSYM="" - CT_BINUTILS_V_2_32=y - CT_BINUTILS_VERSION="2.32" - CT_BINUTILS_later_than_2_30=y - CT_BINUTILS_2_30_or_later=y - CT_CC_GCC_LIBMPX=y - CT_CONFIGURE_has_lzip=y EOF } #. @@ -919,30 +285,7 @@ create_arm64_config() create_common_config "$file" cat >>"$file" <<-'EOF' - # - # arm64 - # CT_ARCH_ARM=y - CT_ARCH="arm" - CT_ARCH_CHOICE_KSYM="ARM" - CT_ARCH_ARM_SHOW=y - CT_ARCH_ARM_PKG_KSYM="" - CT_ARCH_SUPPORTS_BOTH_MMU=y - CT_ARCH_DEFAULT_HAS_MMU=y - CT_ARCH_SUPPORTS_FLAT_FORMAT=y - CT_ARCH_SUPPORTS_EITHER_ENDIAN=y - CT_ARCH_DEFAULT_LE=y - CT_ARCH_LE=y - CT_ARCH_ENDIAN="little" - CT_ARCH_EXCLUSIVE_WITH_CPU=y - CT_LINUX_REQUIRE_3_7_or_later=y - CT_BINUTILS_V_2_29=y - CT_BINUTILS_VERSION="2.29.1" - CT_BINUTILS_2_30_or_older=y - CT_BINUTILS_older_than_2_30=y - CT_BINUTILS_REQUIRE_older_than_2_30=y - CT_GLIBC_USE_PORTS_ADDON=y - CT_CONFIGURE_has_automake_1_15_or_newer=y EOF } #. @@ -1106,7 +449,8 @@ build_toolchain() info "Building toolchain for $arch ..." cd "$root_dir" - create_${arch}_config '.config' + create_${arch}_config 'defconfig' + ct-ng defconfig ct-ng build CT_PREFIX="$ct_prefix_dir" CT_JOBS="$ct_jobs" rm -rf '.config' '.build' 'build.log' cd "$OLDPWD" From b773bb4cd4c64092e436c5eb046503cea8e00592 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 7 Apr 2022 17:57:53 +0200 Subject: [PATCH 278/440] Add some blank lines to output --- tools/make-installers | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/make-installers b/tools/make-installers index 10f8023d6..f7dd4e7f3 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -124,6 +124,7 @@ create_setup_script() else user_exists=false fi + echo echo 'The following installation paths will be used:' echo '- $code_path' if [ \$is_upgrade = true ] @@ -144,6 +145,7 @@ create_setup_script() echo 'Aborting installation.' exit 1 fi + echo if [ \$user_exists = false ] then useradd -r -d '$data_path' '$rel_name' @@ -188,6 +190,7 @@ create_setup_script() echo '$code_path/bin directory for an example).' fi echo '$rel_name $rel_vsn has been installed successfully.' + echo if [ \$is_upgrade = true ] then From 06e448b4d0a83623c8d36df91c14e187474f55e8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 7 Apr 2022 17:59:22 +0200 Subject: [PATCH 279/440] Once installed, show next steps --- tools/make-installers | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/make-installers b/tools/make-installers index f7dd4e7f3..16253a130 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -69,6 +69,7 @@ data_path="/opt/$rel_name" conf_path="$data_path/conf" pem_file="$conf_path/server.pem" url='https://docs.ejabberd.im/admin/upgrade/#specific-version-upgrade-notes' +url_doc_admin='https://docs.ejabberd.im/admin/installation/#administration-account' tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") trap 'rm -rf "$tmp_dir"' INT TERM EXIT @@ -198,7 +199,15 @@ create_setup_script() echo echo '$url' echo - echo 'If everything looks fine, restart the $rel_name service.' + echo 'If everything looks fine, restart the $rel_name service:' + echo ' systemctl restart ejabberd' + else + echo 'Now you can check ejabberd is running correctly:' + echo ' systemctl status ejabberd' + echo + echo 'Next you may want to edit ejabberd.yml to setup hosts,' + echo 'register an account and grant it admin rigts, see:' + echo '$url_doc_admin' fi EOF chmod +x "$dir/setup" From 0964f9cbcddea886e93879d7e9058551a934d8fe Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 11 Apr 2022 10:28:18 +0200 Subject: [PATCH 280/440] Add help header to the installer help --- tools/make-installers | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/make-installers b/tools/make-installers index 16253a130..11b5d4104 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -75,6 +75,22 @@ tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") trap 'rm -rf "$tmp_dir"' INT TERM EXIT umask 022 +create_help_file() +{ + local file="$1" + + cat >"$file" <<-EOF + This is the $rel_name $rel_vsn-$iteration installer for linux-$arch + + Visit + https://www.ejabberd.im/ + + ejabberd Documentation site: + https://docs.ejabberd.im/ + + EOF +} + create_setup_script() { local dir="$1" @@ -222,8 +238,9 @@ do test -e "$tgz_name" || tools/make-binaries echo "$myself: Putting together installer for $arch ..." gzip -c -d <"$tgz_name" >"$tmp_dir/$tar_name" + create_help_file "$tmp_dir/help.txt" create_setup_script "$tmp_dir" "$tar_name" - "$makeself" "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' + "$makeself" --help-header "$tmp_dir/help.txt" "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' find "$tmp_dir" -mindepth 1 -delete done echo "$myself: Created installers successfully." From ba5b6133cd4ab30c5fd6c65cbd1896f6cb374573 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 7 Apr 2022 17:58:36 +0200 Subject: [PATCH 281/440] Create uninstall.txt with instructions --- tools/make-installers | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/make-installers b/tools/make-installers index 11b5d4104..dcedb6b0c 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -71,6 +71,7 @@ pem_file="$conf_path/server.pem" url='https://docs.ejabberd.im/admin/upgrade/#specific-version-upgrade-notes' url_doc_admin='https://docs.ejabberd.im/admin/installation/#administration-account' tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") +path_uninstall="$code_path/uninstall.txt" trap 'rm -rf "$tmp_dir"' INT TERM EXIT umask 022 @@ -209,6 +210,17 @@ create_setup_script() echo '$rel_name $rel_vsn has been installed successfully.' echo + echo >$path_uninstall + echo '# To uninstall ejabberd, first remove the service:' >>$path_uninstall + echo 'systemctl --now disable ejabberd' >>$path_uninstall + echo 'rm -rf /etc/systemd/system/ejabberd.service' >>$path_uninstall + echo >>$path_uninstall + echo '# Remove the binary files' >>$path_uninstall + echo 'rm -rf /opt/ejabberd-*' >>$path_uninstall + echo >>$path_uninstall + echo '# If you want to remove your config, database and logs:' >>$path_uninstall + echo 'rm -rf /opt/ejabberd' >>$path_uninstall + if [ \$is_upgrade = true ] then echo 'Please check the following web site for upgrade notes:' From 985fa2413038864cbbf5962fc9bb7cbcae388fc8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 22 Apr 2022 20:30:23 +0200 Subject: [PATCH 282/440] Apparently the --tags option is required to properly describe a brand new tag --- tools/make-binaries | 2 +- tools/make-installers | 2 +- tools/make-packages | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index 3c74d376c..daab03d88 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -63,7 +63,7 @@ then fi rel_name='ejabberd' -rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') mix_vsn=$(mix_version "$rel_vsn") crosstool_vsn='1.25.0_rc2' termcap_vsn='1.3.1' diff --git a/tools/make-installers b/tools/make-installers index dcedb6b0c..3a95271a4 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -63,7 +63,7 @@ else fi rel_name='ejabberd' -rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') code_path="/opt/$rel_name-$rel_vsn" data_path="/opt/$rel_name" conf_path="$data_path/conf" diff --git a/tools/make-packages b/tools/make-packages index 366499d97..6a665ef90 100755 --- a/tools/make-packages +++ b/tools/make-packages @@ -60,7 +60,7 @@ then fi rel_name='ejabberd' -rel_vsn=$(git describe | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') +rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') conf_dir="/opt/$rel_name/conf" pem_file="$conf_dir/server.pem" tmp_dir=$(mktemp -d "/tmp/.$myself.XXXXXX") From 0302d1615baabd6ff9a6f25fef3ee01aeba6b33e Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 13:28:57 +0200 Subject: [PATCH 283/440] Packages: Rename workflow file to Installers --- .github/workflows/{packages.yml => installers.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{packages.yml => installers.yml} (100%) diff --git a/.github/workflows/packages.yml b/.github/workflows/installers.yml similarity index 100% rename from .github/workflows/packages.yml rename to .github/workflows/installers.yml From d0bca94638d08ca04fb96f1127fe56c1dbc07501 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Apr 2022 13:29:41 +0200 Subject: [PATCH 284/440] Installers: update workflow name --- .github/workflows/installers.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 52667879f..c7b27645f 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -1,4 +1,4 @@ -name: Publish binary packages +name: Installers on: push: @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Cache build directory - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/build/ key: ${{runner.os}}-ct-ng-1.25.0-RC2 From 6e4079586ab1fa0f131bec22e8d0e18ed9551a4e Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 22 Apr 2022 20:35:00 +0200 Subject: [PATCH 285/440] Installers: Add job to create draft release --- .github/workflows/installers.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index c7b27645f..ad513df8d 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -66,3 +66,19 @@ jobs: # path: ejabberd-packages* retention-days: 14 + + release: + name: Release + needs: [binaries] + runs-on: ubuntu-latest + if: github.ref_type == 'tag' + steps: + - name: Download packages + uses: actions/download-artifact@v3 + with: + name: ejabberd-packages + - name: Draft Release + uses: softprops/action-gh-release@v1 + with: + draft: true + files: ejabberd-packages/* From bb2cb19a5c2b3be07d44c32a3dc164d293e791c9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 22 Apr 2022 20:32:57 +0200 Subject: [PATCH 286/440] Move some content from README to new COMPILE and CONTAINER files --- COMPILE.md | 126 ++++++++++++++++++++++ CONTAINER.md | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 251 +++++++++++++++----------------------------- 3 files changed, 497 insertions(+), 168 deletions(-) create mode 100644 COMPILE.md create mode 100644 CONTAINER.md diff --git a/COMPILE.md b/COMPILE.md new file mode 100644 index 000000000..5bcfaa581 --- /dev/null +++ b/COMPILE.md @@ -0,0 +1,126 @@ +Compile and Install ejabberd +============================ + +This document explains how to compile and install ejabberd +from source code. + +For a more detailed explanation, please check the +ejabberd Docs: [Source Code Installation][docs-source]. + +[docs-source]: https://docs.ejabberd.im/admin/installation/#source-code + + +Requirements +------------ + +To compile ejabberd you need: + + - GNU Make + - GCC + - Libexpat ≥ 1.95 + - Libyaml ≥ 0.1.4 + - Erlang/OTP ≥ 19.3 + - OpenSSL ≥ 1.0.0 + +Other optional libraries are: + + - Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138) + - PAM library, for Pluggable Authentication Modules (PAM) + - ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA + challenges + - Elixir ≥ 1.10.3, to support Elixir, and alternative to rebar/rebar3 + +If your system splits packages in libraries and development headers, +install the development packages too. + + +Download Source Code +-------------------- + +There are several ways to obtain the ejabberd source code: + +- Source code archive from [ProcessOne Downloads][p1dl] +- Source code package from [ejabberd GitHub Releases][ghr] +- Latest development code from [ejabberd Git repository][gitrepo] + +[p1dl]: https://www.process-one.net/en/ejabberd/downloads/ +[ghr]: https://github.com/processone/ejabberd/releases +[gitrepo]: https://github.com/processone/ejabberd + + +Compile +------- + +The general instructions to compile ejabberd are: + + ./configure + make + +If the source code doesn't contain a `configure` script, +first of all install `autoconf` and run this to generate it: + + ./autogen.sh + +To configure the compilation, features, install paths... + + ./configure --help + + +Install in the System +--------------------- + +To install ejabberd in the system, run this with system administrator rights (root user): + + sudo make install + +This will: + +- Install the configuration files in `/etc/ejabberd/` +- Install ejabberd binary, header and runtime files in `/lib/ejabberd/` +- Install the administration script: `/sbin/ejabberdctl` +- Install ejabberd documentation in `/share/doc/ejabberd/` +- Create a spool directory: `/var/lib/ejabberd/` +- Create a directory for log files: `/var/log/ejabberd/` + + +Build an OTP Release +-------------------- + +Instead of installing ejabberd in the system, you can build an OTP release +that includes all necessary to run ejabberd in a subdirectory: + + ./configure --with-rebar=rebar3 + make rel + +Or, if you have Elixir available and plan to develop Elixir code: + + ./configure --with-rebar=mix + make dev + +Check the full list of targets: + + make help + + +Start ejabberd +-------------- + +You can use the `ejabberdctl` command line administration script to +start and stop ejabberd. Some examples, depending on your installation method: + +- When installed in the system: + ``` + ejabberdctl start + /sbin/ejabberdctl start + ``` + +- When built an OTP production release: + ``` + _build/prod/rel/ejabberd/bin/ejabberdctl start + _build/prod/rel/ejabberd/bin/ejabberdctl live + ``` + +- Start interactively without installing or building OTP release: + ``` + make relive + ``` diff --git a/CONTAINER.md b/CONTAINER.md new file mode 100644 index 000000000..e62553d71 --- /dev/null +++ b/CONTAINER.md @@ -0,0 +1,288 @@ + +[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=49c0c4)](https://github.com/processone/ejabberd/tags) +[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver)](https://github.com/badlop/ejabberd/pkgs/container/ejabberd) +[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/ejabberd/ecs?label=docker)](https://hub.docker.com/r/ejabberd/ecs/) + + +ejabberd Container +================== + +[ejabberd][home] is an open-source, +robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang], +that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service. + +[home]: https://ejabberd.im/ +[erlang]: https://www.erlang.org/ +[xmpp]: https://xmpp.org/ +[mqtt]: https://mqtt.org/ +[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol + +This document explains how to use the +[ejabberd container images](https://github.com/processone/ejabberd/pkgs/container/ejabberd) +available in the GitHub Container Registry, +built using the files in `.github/container/`. + +Alternatively, there are also +[ejabberd-ecs Docker images](https://hub.docker.com/r/ejabberd/ecs/) +available in Docker Hub, +built using the +[docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs) +repository. + +If you are using a Windows operating system, check the tutorials mentioned in +[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/installation/#docker-image). + + +Start ejabberd +-------------- + +### With default configuration + +Start ejabberd in a new container: + +```bash +docker run --name ejabberd -d -p 5222:5222 ghcr.io/processone/ejabberd +``` + +That runs the container as a daemon, +using ejabberd default configuration file and XMPP domain "localhost". + +Stop the running container: + +```bash +docker stop ejabberd +``` + +Restart the stopped ejabberd container: + +```bash +docker restart ejabberd +``` + + +### Start with Erlang console attached + +Start ejabberd with an Erlang console attached using the `live` command: + +```bash +docker run --name ejabberd -it -p 5222:5222 ghcr.io/processone/ejabberd live +``` + +That uses the default configuration file and XMPP domain "localhost". + + +### Start with your configuration and database + +Pass a configuration file as a volume +and share the local directory to store database: + +```bash +mkdir database +chown ejabberd database + +cp ejabberd.yml.example ejabberd.yml + +docker run --name ejabberd -it \ + -v $(pwd)/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml \ + -v $(pwd)/database:/opt/ejabberd/database \ + -p 5222:5222 ghcr.io/processone/ejabberd live +``` + +Notice that ejabberd runs in the container with an account named `ejabberd`, +and the volumes you mount must grant proper rights to that account. + + +Next steps +---------- + +### Register the administrator account + +The default ejabberd configuration does not grant admin privileges +to any account, +you may want to register a new account in ejabberd +and grant it admin rights. + +Register an account using the `ejabberdctl` script: + +```bash +docker exec -it ejabberd ejabberdctl register admin localhost passw0rd +``` + +Then edit conf/ejabberd.yml and add the ACL as explained in +[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/installation/#administration-account) + + +### Check ejabberd log files + +Check the content of the log files inside the container, +even if you do not put it on a shared persistent drive: + +```bash +docker exec -it ejabberd tail -f logs/ejabberd.log +``` + + +### Inspect the container files + +The container uses Alpine Linux. Start a shell inside the container: + +```bash +docker exec -it ejabberd sh +``` + + +### Open ejabberd debug console + +Open an interactive debug Erlang console attached to a running ejabberd in a running container: + +```bash +docker exec -it ejabberd ejabberdctl debug +``` + + +### CAPTCHA + +ejabberd includes two example CAPTCHA scripts. +If you want to use any of them, first install some additional required libraries: + +```bash +docker exec --user root ejabberd apk add imagemagick ghostscript-fonts bash +``` + +Now update your ejabberd configuration file, for example: +```bash +docker exec -it ejabberd vi conf/ejabberd.yml +``` + +and add the required options: +``` +captcha_cmd: /opt/ejabberd-22.04/lib/ejabberd-22.04/priv/bin/captcha.sh +captcha_url: https://localhost:5443/captcha +``` + +Finally, reload the configuration file or restart the container: +```bash +docker exec ejabberd ejabberdctl reload_config +``` + + +Advanced Container Configuration +-------------------------------- + +### Ports + +This container image exposes the ports: + +- `5222`: The default port for XMPP clients. +- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers. +- `5280`: For admin interface. +- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH. +- `1883`: Used for MQTT +- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering + + +### Volumes + +ejabberd produces two types of data: log files and database spool files (Mnesia). +This is the kind of data you probably want to store on a persistent or local drive (at least the database). + +The volumes you may want to map: + +- `/opt/ejabberd/conf/`: Directory containing configuration and certificates +- `/opt/ejabberd/database/`: Directory containing Mnesia database. +You should back up or export the content of the directory to persistent storage +(host storage, local storage, any storage plugin) +- `/opt/ejabberd/logs/`: Directory containing log files +- `/opt/ejabberd/upload/`: Directory containing uploaded files. This should also be backed up. + +All these files are owned by `ejabberd` user inside the container. + +It's possible to install additional ejabberd modules using volumes, +[this comment](https://github.com/processone/docker-ejabberd/issues/81#issuecomment-1036115146) +explains how to install an additional module using docker-compose. + + +### Commands on start + +The ejabberdctl script reads the `CTL_ON_CREATE` environment variable +the first time the docker container is started, +and reads `CTL_ON_START` every time the container is started. +Those variables can contain one ejabberdctl command, +or several commands separated with the blankspace and `;` characters. + +Example usage (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)): +```yaml + environment: + - CTL_ON_CREATE=register admin localhost asd + - CTL_ON_START=stats registeredusers ; + check_password admin localhost asd ; + status +``` + + +### Clustering + +When setting several containers to form a +[cluster of ejabberd nodes](https://docs.ejabberd.im/admin/guide/clustering/), +each one must have a different +[Erlang Node Name](https://docs.ejabberd.im/admin/guide/security/#erlang-node-name) +and the same +[Erlang Cookie](https://docs.ejabberd.im/admin/guide/security/#erlang-cookie). + +For this you can either: +- edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE` +- set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE` + +Example using environment variables (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)): +```yaml + environment: + - ERLANG_NODE_ARG=ejabberd@node7 + - ERLANG_COOKIE=dummycookie123 +``` + + +Generating a Container Image +---------------------------- + +This container image includes ejabberd as a standalone OTP release built using Elixir. + +That OTP release is configured with: + +- `mix.exs`: Customize ejabberd release +- `vars.config`: ejabberd compilation configuration options +- `config/runtime.exs`: Customize ejabberd paths +- `ejabberd.yml.template`: ejabberd default config file + +Build ejabberd Community Server base image from ejabberd master on GitHub: + +```bash +VERSION = master +docker build \ + --build-arg VERSION=$(VERSION) \ + -t personal/ejabberd:$(VERSION) \ + .github/container +``` + +Build ejabberd Community Server base image for a given ejabberd version, +both for amd64 and arm64 architectures: + +```bash +VERSION = 21.12 +docker buildx build \ + --platform=linux/amd64,linux/arm64 + --build-arg VERSION=$(VERSION) \ + -t personal/ejabberd:$(VERSION) \ + .github/container +``` + +It's also possible to use podman instead of docker, just notice: +- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile +- It mentions that `healthcheck` is not supported by the Open Container Initiative image format +- If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true` +```bash +VERSION = master +podman build \ + --build-arg VERSION=$(VERSION) \ + -t ja:$(version) \ + .github/container +``` diff --git a/README.md b/README.md index f62486150..ade46445b 100644 --- a/README.md +++ b/README.md @@ -6,190 +6,105 @@ ejabberd Community Edition [![Translation status](https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg "Translation status in Weblate")](https://hosted.weblate.org/projects/ejabberd/ejabberd-po/) [![Hex version](https://img.shields.io/hexpm/v/ejabberd.svg "Hex version")](https://hex.pm/packages/ejabberd) -ejabberd is a distributed, fault-tolerant technology that allows the creation -of large-scale instant messaging applications. The server can reliably support -thousands of simultaneous users on a single node and has been designed to -provide exceptional standards of fault tolerance. As an open source -technology, based on industry-standards, ejabberd can be used to build bespoke -solutions very cost effectively. + +[ejabberd][im] is an open-source, +robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang], +that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service. + +Check the features in [ejabberd.im][im], [ejabberd Docs][features], +[ejabberd at ProcessOne][p1home], and a list of [supported protocols and XEPs][xeps]. -Key Features +Installation ------------ -- **Cross-platform** - ejabberd runs under Microsoft Windows and Unix-derived systems such as - Linux, FreeBSD and NetBSD. +There are several ways to install ejabberd: -- **Distributed** - You can run ejabberd on a cluster of machines and all of them will serve the - same XMPP domain(s). When you need more capacity you can simply add a new - cheap node to your cluster. Accordingly, you do not need to buy an expensive - high-end machine to support tens of thousands concurrent users. - -- **Fault-tolerant** - You can deploy an ejabberd cluster so that all the information required for - a properly working service will be replicated permanently on all nodes. This - means that if one of the nodes crashes, the others will continue working - without disruption. In addition, nodes also can be added or replaced ‘on - the fly’. - -- **Administrator-friendly** - ejabberd is built on top of the Open Source Erlang. As a result you do not - need to install an external database, an external web server, amongst others - because everything is already included, and ready to run out of the box. - Other administrator benefits include: - - Comprehensive documentation. - - Straightforward installers for Linux. - - Docker packaging to help with deploy / development on Linux, Windows or MacOS. - - Deb and RPM packaging to support most Linux distributions. - - Web administration. - - Shared roster groups. - - Command line administration tool. - - Can integrate with existing authentication mechanisms. - - Capability to send announce messages. - -- **Internationalized** - ejabberd leads in internationalization. Hence it is very well suited in a - globalized world. Related features are: - - Translated to 25 languages. - - Support for IDNA. - -- **Open Standards** - ejabberd is the first Open Source XMPP server claiming to fully comply to - the XMPP standard. - - Fully XMPP-compliant. - - XML-based protocol. - - Many protocols supported. +- Source code: compile yourself, see [COMPILE](COMPILE.md) +- Installers from [ProcessOne Downloads][p1dl] (run/deb/rpm for x64) +- Installers from [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64) +- Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64) +- Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64) +- Using your [Operating System package][osp] +- Using the [Homebrew][homebrew] package manager -Additional Features -------------------- +Documentation +------------- -Moreover, ejabberd comes with a wide range of other state-of-the-art features: +Please check the [ejabberd Docs][docs] website. -- **Modularity** - - Load only the modules you want. - - Extend ejabberd with your own custom modules. - -- **Security** - - SASL and STARTTLS for c2s and s2s connections. - - STARTTLS and Dialback s2s connections. - - Web Admin accessible via HTTPS secure access. - -- **Databases** - - Internal database for fast deployment (Mnesia). - - Native MySQL support. - - Native PostgreSQL support. - - ODBC data storage support. - - Microsoft SQL Server support. - -- **Authentication** - - Internal authentication. - - PAM, LDAP and ODBC. - - External authentication script. - -- **Others** - - Support for virtual hosting. - - Compressing XML streams with Stream Compression (XEP-0138). - - Statistics via Statistics Gathering (XEP-0039). - - IPv6 support both for c2s and s2s connections. - - Multi-User Chat module with support for clustering and HTML logging. - - Users Directory based on users vCards. - - Publish-Subscribe component with support for Personal Eventing. - - Support for web clients: HTTP Polling and HTTP Binding (BOSH). - - Component support: interface with networks such as AIM, ICQ and MSN. - - -Quickstart guide ----------------- - -### 0. Requirements - -To compile ejabberd you need: - - - GNU Make. - - GCC. - - Libexpat ≥ 1.95. - - Libyaml ≥ 0.1.4. - - Erlang/OTP ≥ 19.3. - - OpenSSL ≥ 1.0.0. - - Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138). Optional. - - PAM library. Optional. For Pluggable Authentication Modules (PAM). - - ImageMagick's Convert program and Ghostscript fonts. Optional. For CAPTCHA - challenges. - - Elixir ≥ 1.10.3. Optional. Alternative to build ejabberd - -If your system splits packages in libraries and development headers, you must -install the development packages also. - -### 1. Compile and install on *nix systems - -To compile ejabberd, execute the following commands. The first one is only -necessary if your source tree didn't come with a `configure` script (In this -case you need autoconf installed). - - ./autogen.sh - ./configure - make - -To install ejabberd, run this command with system administrator rights (root -user): - - sudo make install - -These commands will: - -- Install the configuration files in `/etc/ejabberd/` -- Install ejabberd binary, header and runtime files in `/lib/ejabberd/` -- Install the administration script: `/sbin/ejabberdctl` -- Install ejabberd documentation in `/share/doc/ejabberd/` -- Create a spool directory: `/var/lib/ejabberd/` -- Create a directory for log files: `/var/log/ejabberd/` - - -### 2. Start ejabberd - -You can use the `ejabberdctl` command line administration script to -start and stop ejabberd. For example: - - ejabberdctl start - - -For detailed information please refer to the -[ejabberd Documentation](https://docs.ejabberd.im) - - -### 3. Use ejabberd locally - -Alternatively, you can setup ejabberd without installing in your system: - - ./configure --with-rebar=rebar3 - make dev - -Or, if you have Elixir available and plan to develop Elixir code: - - ./configure --with-rebar=mix - make dev - -Check the full list of targets: +When compiling from source code, you can get some help with: + ./configure --help make help +Once ejabberd is installed, try: -Translation + ejabberdctl help + man ejabberd.yml + + +Development ----------- -Using any gettext editor, you can improve the translation files found in -`priv/msgs/*.po`, and then submit your changes. +Bug reports and features are tracked using [GitHub Issues][issues], +please check [CONTRIBUTING](CONTRIBUTING.md) for details. -Alternatively, a simple way to improve translations is using our Weblate project: -https://hosted.weblate.org/projects/ejabberd/ejabberd-po/ +Translations can be improved online [using Weblate][weblate] +or in your local machine as explained in [Localization][localization]. + +Documentation for developers is available in [ejabberd docs: Developers][docs-dev]. + +Security reports or concerns should preferably be reported privately, +please send an email to the address: contact [at] process-one [dot] net +or some other method from [ProcessOne Contact][p1contact]. + +For commercial offering and support, including _ejabberd Business Edition_ +and _Fluux (ejabberd in the Cloud)_, please check [ProcessOne ejabberd page][p1home]. -Links ------ +Community +--------- -- Documentation: https://docs.ejabberd.im -- Community site: https://www.ejabberd.im -- ejabberd commercial offering and support: https://www.process-one.net/en/ejabberd +There are several places to get in touch with other ejabberd developers and administrators: + +- [ejabberd XMPP chatroom][muc]: ejabberd@conference.process-one.net +- [Mailing list][list] +- [GitHub Discussions][discussions] +- [Stack Overflow][stackoverflow] + + +License +------- + +ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING.md)), +and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MIT License. + + +[discussions]: https://github.com/processone/ejabberd/discussions +[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme +[docs-dev]: https://docs.ejabberd.im/developer/ +[docs]: https://docs.ejabberd.im +[erlang]: https://www.erlang.org/ +[features]: https://docs.ejabberd.im/admin/introduction/ +[github]: https://github.com/processone/ejabberd +[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew +[hubecs]: https://hub.docker.com/r/ejabberd/ecs/ +[im]: https://ejabberd.im/ +[issues]: https://github.com/processone/ejabberd/issues +[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd +[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/ +[mqtt]: https://mqtt.org/ +[muc]: xmpp:ejabberd@conference.process-one.net +[osp]: https://docs.ejabberd.im/admin/installation/#operating-system-packages +[p1contact]: https://www.process-one.net/en/company/contact/ +[p1dl]: https://www.process-one.net/en/ejabberd/downloads/ +[p1home]: https://www.process-one.net/en/ejabberd/ +[packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd +[releases]: https://github.com/processone/ejabberd/releases +[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol +[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest +[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/ +[xeps]: https://www.process-one.net/en/ejabberd/protocols/ +[xmpp]: https://xmpp.org/ From 0fb7213e1ae8862b5c9cfbf9e946da3cd61cf34b Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:19:56 +0200 Subject: [PATCH 287/440] New Arabic translation (thanks to Black) --- priv/msgs/ar.msg | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 priv/msgs/ar.msg diff --git a/priv/msgs/ar.msg b/priv/msgs/ar.msg new file mode 100644 index 000000000..b33565af4 --- /dev/null +++ b/priv/msgs/ar.msg @@ -0,0 +1,11 @@ +%% Generated automatically +%% DO NOT EDIT: run `make translations` instead +%% To improve translations please read: +%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/ + +{" (Add * to the end of field to match substring)"," (أضف * في نهاية الحقل لمطابقة السلسلة الفرعية)"}. +{" has set the subject to: "," حدد الموضوع إلى: "}. +{"# participants","# المشاركين"}. +{"A description of the node","وصف العقدة"}. +{"A Web Page","موقع الكتروني"}. +{"'Displayed groups' not added (they do not exist!): ","لم تتم إضافة \"المجموعات المعروضة\" (فهي غير موجودة!): "}. From f250594738adeda755b22b5e6c09094e2ae8a1c9 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:20:49 +0200 Subject: [PATCH 288/440] Update German translation (thanks to Nautilusx) --- priv/msgs/de.msg | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/priv/msgs/de.msg b/priv/msgs/de.msg index d35d1a92d..8bfa329a9 100644 --- a/priv/msgs/de.msg +++ b/priv/msgs/de.msg @@ -20,6 +20,7 @@ {"Access model","Zugriffsmodell"}. {"Account doesn't exist","Konto existiert nicht"}. {"Action on user","Aktion auf Benutzer"}. +{"Add a hat to a user","Funktion zu einem Benutzer hinzufügen"}. {"Add Jabber ID","Jabber-ID hinzufügen"}. {"Add New","Neue(n) hinzufügen"}. {"Add User","Benutzer hinzufügen"}. @@ -136,6 +137,7 @@ {"Elements","Elemente"}. {"Email Address","E-Mail-Adresse"}. {"Email","E-Mail"}. +{"Enable hats","Funktion einschalten"}. {"Enable logging","Protokollierung aktivieren"}. {"Enable message archiving","Nachrichtenarchivierung aktivieren"}. {"Enabling push without 'node' attribute is not supported","push ohne 'node'-Attribut zu aktivieren wird nicht unterstützt"}. @@ -186,6 +188,9 @@ {"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}. {"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}. {"has been kicked","wurde hinausgeworfen"}. +{"Hat title","Funktionstitel"}. +{"Hat URI","Funktions-URI"}. +{"Hats limit exceeded","Funktionslimit wurde überschritten"}. {"Host unknown","Host unbekannt"}. {"Host","Host"}. {"HTTP File Upload","HTTP-Dateiupload"}. @@ -237,6 +242,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Niederwertigstes Bit des SHA-256-Hashes des Textes sollte hexadezimalem Label gleichen"}. {"leaves the room","verlässt den Raum"}. {"List of rooms","Liste von Räumen"}. +{"List of users with hats","Liste der Benutzer mit Funktionen"}. +{"List users with hats","Benutzer mit Funktionen auflisten"}. {"Logging","Protokollierung"}. {"Low level update script","Low-Level-Aktualisierungsscript"}. {"Make participants list public","Teilnehmerliste öffentlich machen"}. @@ -249,7 +256,7 @@ {"Malformed username","Ungültiger Benutzername"}. {"MAM preference modification denied by service policy","Modifikation der MAM-Präferenzen aufgrund der Dienstrichtlinien verweigert"}. {"March","März"}. -{"Max # of items to persist","Maximale Anzahl persistenter Items"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Maximale Anzahl der aufzubewahrenden Elemente oder `max`, wenn es keine spezifische Begrenzung gibt, außer einer vom Server festgelegten Höchstzahl"}. {"Max payload size in bytes","Maximale Nutzdatengröße in Bytes"}. {"Maximum file size","Maximale Dateigröße"}. {"Maximum Number of History Messages Returned by Room","Maximale Anzahl der vom Raum zurückgegebenen History-Nachrichten"}. @@ -340,7 +347,7 @@ {"Number of Offline Messages","Anzahl der Offline-Nachrichten"}. {"Number of online users","Anzahl der angemeldeten Benutzer"}. {"Number of registered users","Anzahl der registrierten Benutzer"}. -{"Number of seconds after which to automatically purge items","Anzahl der Sekunden, nach der Items automatisch gelöscht werden"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Anzahl der Sekunden, nach denen Elemente automatisch gelöscht werden sollen, oder `max`, wenn es keine spezifische Grenze gibt, außer einer vom Server festgelegten Höchstgrenze"}. {"Occupants are allowed to invite others","Teilnehmer dürfen andere einladen"}. {"Occupants May Change the Subject","Teilnehmer dürfen das Thema ändern"}. {"October","Oktober"}. @@ -419,6 +426,7 @@ {"Registered Users","Registrierte Benutzer"}. {"Registered Users:","Registrierte Benutzer:"}. {"Remote copy","Fernkopie"}. +{"Remove a hat from a user","Eine Funktion bei einem Benutzer entfernen"}. {"Remove All Offline Messages","Alle Offline-Nachrichten löschen"}. {"Remove User","Benutzer löschen"}. {"Remove","Entfernen"}. @@ -437,7 +445,7 @@ {"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}. {"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}. {"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}. -{"Room Configuration","Raum-Konfiguration"}. +{"Room Configuration","Raumkonfiguration"}. {"Room creation is denied by service policy","Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"}. {"Room description","Raumbeschreibung"}. {"Room Occupants","Raumteilnehmer"}. @@ -520,7 +528,7 @@ {"The JIDs of those with an affiliation of owner","Die JIDs jener mit einer Zugehörigkeit von Besitzer"}. {"The JIDs of those with an affiliation of publisher","Die JIDs jener mit einer Zugehörigkeit von Veröffentlicher"}. {"The list of JIDs that may associate leaf nodes with a collection","Die Liste der JIDs die Blattknoten mit einer Sammlung verknüpfen dürfen"}. -{"The maximum number of child nodes that can be associated with a collection","Die maximale Anzahl der Kindknoten die mit einer Sammlung verknüpft werden können"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Die Höchstzahl der untergeordneten Knoten, die einer Sammlung zugeordnet werden können, oder `max`, wenn es keine spezifische Begrenzung gibt, sondern nur eine vom Server festgelegte Höchstzahl"}. {"The minimum number of milliseconds between sending any two notification digests","Die minimale Anzahl an Millisekunden zwischen dem Senden von zwei Benachrichtigungs-Übersichten"}. {"The name of the node","Der Name des Knotens"}. {"The node is a collection node","Der Knoten ist ein Sammlungsknoten"}. @@ -545,7 +553,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise vom Namensraum der Nutzdaten angegeben (gegebenenfalls)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Die URL einer XSL-Transformation welche auf Nutzdaten angewendet werden kann, um ein geeignetes Nachrichtenkörper-Element zu generieren."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Die URL einer XSL-Transformation welche auf das Nutzdaten-Format angewendet werden kann, um ein gültiges Data Forms-Ergebnis zu generieren das der Client mit Hilfe einer generischen Data Forms-Rendering-Engine anzeigen könnte"}. -{"The username is not valid","Der Benutzername ist nicht gültig"}. {"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passwortes auf: "}. {"There was an error creating the account: ","Es trat ein Fehler beim Erstellen des Kontos auf: "}. {"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf: "}. From 28be716c5f01fbc56a4bfd11492cf5b11852ed89 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:21:21 +0200 Subject: [PATCH 289/440] Update French translation (thanks to ButterflyOfFire) --- priv/msgs/fr.msg | 76 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/priv/msgs/fr.msg b/priv/msgs/fr.msg index d35a2fbd5..05ad41e42 100644 --- a/priv/msgs/fr.msg +++ b/priv/msgs/fr.msg @@ -131,6 +131,7 @@ {"ejabberd SOCKS5 Bytestreams module","Module SOCKS5 Bytestreams per ejabberd"}. {"ejabberd vCard module","Module vCard ejabberd"}. {"ejabberd Web Admin","Console Web d'administration de ejabberd"}. +{"ejabberd","ejabberd"}. {"Elements","Éléments"}. {"Email Address","Adresse courriel"}. {"Email","Courriel"}. @@ -144,6 +145,7 @@ {"Enter path to jabberd14 spool file","Entrez le chemin vers le fichier spool de Jabberd 1.4"}. {"Enter path to text file","Entrez le chemin vers le fichier texte"}. {"Enter the text you see","Tapez le texte que vous voyez"}. +{"Erlang XMPP Server","Serveur XMPP Erlang"}. {"Error","Erreur"}. {"Exclude Jabber IDs from CAPTCHA challenge","Exempter des Jabberd IDs du test CAPTCHA"}. {"Export all tables as SQL queries to a file:","Exporter toutes les tables vers un fichier SQL :"}. @@ -162,7 +164,10 @@ {"File larger than ~w bytes","Taille de fichier suppérieur à ~w octets"}. {"Fill in the form to search for any matching XMPP User","Complétez le formulaire pour rechercher un utilisateur XMPP correspondant"}. {"Friday","Vendredi"}. +{"From ~ts","De ~ts"}. {"From","De"}. +{"Full List of Room Admins","Liste complète des administrateurs des salons"}. +{"Full List of Room Owners","Liste complète des propriétaires des salons"}. {"Full Name","Nom complet"}. {"Get Number of Online Users","Récupérer le nombre d'utilisateurs en ligne"}. {"Get Number of Registered Users","Récupérer le nombre d'utilisateurs enregistrés"}. @@ -182,6 +187,7 @@ {"Host unknown","Serveur inconnu"}. {"Host","Serveur"}. {"HTTP File Upload","Téléversement de fichier HTTP"}. +{"Idle connection","Connexion inactive"}. {"If you don't see the CAPTCHA image here, visit the web page.","SI vous ne voyez pas l'image CAPTCHA ici, visitez la page web."}. {"Import Directory","Importer un répertoire"}. {"Import File","Importer un fichier"}. @@ -221,6 +227,7 @@ {"Label:","Étiquette :"}. {"Last Activity","Dernière activité"}. {"Last login","Dernière connexion"}. +{"Last message","Dernier message"}. {"Last month","Dernier mois"}. {"Last year","Dernière année"}. {"leaves the room","quitte le salon"}. @@ -252,6 +259,8 @@ {"Middle Name","Autre nom"}. {"Minimum interval between voice requests (in seconds)","Intervalle minimum entre les demandes de 'voice' (en secondes)"}. {"Moderator privileges required","Les droits de modérateur sont nécessaires"}. +{"Moderator","Modérateur"}. +{"Moderators Only","Modérateurs uniquement"}. {"Modified modules","Modules mis à jour"}. {"Module failed to handle the query","Échec de traitement de la demande"}. {"Monday","Lundi"}. @@ -265,12 +274,14 @@ {"Neither 'role' nor 'affiliation' attribute found","Attribut 'role' ou 'affiliation' absent"}. {"Never","Jamais"}. {"New Password:","Nouveau mot de passe :"}. +{"Nickname can't be empty","Le pseudonyme ne peut être laissé vide"}. {"Nickname Registration at ","Enregistrement d'un pseudo sur "}. {"Nickname ~s does not exist in the room","Le pseudo ~s n'existe pas dans ce salon"}. {"Nickname","Pseudo"}. {"No 'affiliation' attribute found","Attribut 'affiliation' absent"}. {"No available resource found","Aucune ressource disponible"}. {"No body provided for announce message","Pas de corps de message pour l'annonce"}. +{"No child elements found","Aucun élément enfant trouvé"}. {"No data form found","Formulaire non trouvé"}. {"No Data","Aucune information disponible"}. {"No features available","Aucune fonctionalité disponible"}. @@ -291,23 +302,30 @@ {"No services available","Aucun service disponible"}. {"No statistics found for this item","Pas de statistiques"}. {"No 'to' attribute found in the invitation","L'élément 'to' est absent de l'invitation"}. +{"Nobody","Personne"}. {"Node already exists","Ce nœud existe déjà"}. {"Node ID","Identifiant du nœud"}. {"Node index not found","Index de nœud non trouvé"}. {"Node not found","Nœud non trouvé"}. {"Node ~p","Nœud ~p"}. +{"Node","Nœud"}. {"Nodeprep has failed","Échec de formattage"}. {"Nodes","Nœuds"}. {"None","Aucun"}. +{"Not allowed","Non autorisé"}. {"Not Found","Nœud non trouvé"}. {"Not subscribed","Pas abonné"}. {"Notify subscribers when items are removed from the node","Avertir les abonnés lorsque des éléments sont supprimés sur le nœud"}. {"Notify subscribers when the node configuration changes","Avertir les abonnés lorsque la configuration du nœud change"}. {"Notify subscribers when the node is deleted","Avertir les abonnés lorsque le nœud est supprimé"}. {"November","Novembre"}. +{"Number of answers required","Nombre de réponses requises"}. {"Number of occupants","Nombre d'occupants"}. +{"Number of Offline Messages","Nombre de messages hors ligne"}. {"Number of online users","Nombre d'utilisateurs en ligne"}. {"Number of registered users","Nombre d'utilisateurs enregistrés"}. +{"Occupants are allowed to invite others","Les occupants sont autorisés à inviter d’autres personnes"}. +{"Occupants May Change the Subject","Les occupants peuvent changer le sujet"}. {"October","Octobre"}. {"Offline Messages","Messages en attente"}. {"Offline Messages:","Messages hors ligne :"}. @@ -344,13 +362,16 @@ {"Pending","En suspens"}. {"Period: ","Période : "}. {"Persist items to storage","Stockage persistant des éléments"}. +{"Persistent","Persistant"}. {"Ping query is incorrect","Requête ping incorrecte"}. {"Ping","Ping"}. {"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ces options sauvegardent uniquement la base de données interne Mnesia. Si vous utilisez le module ODBC vous devez sauvegarde votre base SQL séparément."}. {"Please, wait for a while before sending new voice request","Attendez un moment avant de re-lancer une requête de voix"}. {"Pong","Pong"}. {"Present real Jabber IDs to","Rendre le Jabber ID réel visible pour"}. -{"private, ","privé"}. +{"Previous session not found","Session précédente introuvable"}. +{"Previous session timed out","La session précédente a expiré"}. +{"private, ","privé, "}. {"Publish-Subscribe","Publication-Abonnement"}. {"PubSub subscriber request","Demande d'abonnement PubSub"}. {"Purge all items when the relevant publisher goes offline","Purger tous les items lorsque publieur est hors-ligne"}. @@ -360,6 +381,7 @@ {"RAM copy","Copie en mémoire vive (RAM)"}. {"Really delete message of the day?","Confirmer la suppression du message du jour ?"}. {"Recipient is not in the conference room","Le destinataire n'est pas dans la conférence"}. +{"Register an XMPP account","Inscrire un compte XMPP"}. {"Registered Users","Utilisateurs enregistrés"}. {"Registered Users:","Utilisateurs enregistrés :"}. {"Register","Enregistrer"}. @@ -385,19 +407,24 @@ {"Room Occupants","Occupants du salon"}. {"Room title","Titre du salon"}. {"Roster groups allowed to subscribe","Groupes de liste de contact autorisés à s'abonner"}. +{"Roster of ~ts","Liste de contacts de ~ts"}. {"Roster size","Taille de la liste de contacts"}. +{"Roster:","Liste de contacts :"}. {"RPC Call Error","Erreur d'appel RPC"}. {"Running Nodes","Nœuds actifs"}. {"Saturday","Samedi"}. {"Script check","Validation du script"}. {"Search Results for ","Résultats de recherche pour "}. +{"Search until the date","Rechercher jusqu’à la date"}. {"Search users in ","Rechercher des utilisateurs "}. +{"Select All","Tout sélectionner"}. {"Send announcement to all online users on all hosts","Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"}. {"Send announcement to all online users","Envoyer l'annonce à tous les utilisateurs en ligne"}. {"Send announcement to all users on all hosts","Envoyer une annonce à tous les utilisateurs de tous les domaines"}. {"Send announcement to all users","Envoyer l'annonce à tous les utilisateurs"}. {"September","Septembre"}. {"Server:","Serveur :"}. +{"Service list retrieval timed out","La récupération de la liste des services a expiré"}. {"Set message of the day and send to online users","Définir le message du jour et l'envoyer aux utilisateurs en ligne"}. {"Set message of the day on all hosts and send to online users","Définir le message du jour pour tous domaines et l'envoyer aux utilisateurs en ligne"}. {"Shared Roster Groups","Groupes de liste de contacts partagée"}. @@ -414,6 +441,7 @@ {"Storage Type","Type de stockage"}. {"Store binary backup:","Sauvegarde binaire :"}. {"Store plain text backup:","Sauvegarde texte :"}. +{"Stream management is already enabled","La gestion des flux est déjà activée"}. {"Subject","Sujet"}. {"Submit","Soumettre"}. {"Submitted","Soumis"}. @@ -421,26 +449,50 @@ {"Subscription","Abonnement"}. {"Subscriptions are not allowed","Les abonnement ne sont pas autorisés"}. {"Sunday","Dimanche"}. +{"Text associated with a picture","Texte associé à une image"}. +{"Text associated with a sound","Texte associé à un son"}. +{"Text associated with a video","Texte associé à une vidéo"}. +{"Text associated with speech","Texte associé au discours"}. {"That nickname is already in use by another occupant","Le pseudo est déjà utilisé par un autre occupant"}. {"That nickname is registered by another person","Le pseudo est enregistré par une autre personne"}. -{"The CAPTCHA is valid.","Le CAPTCHA est valide"}. +{"The account already exists","Le compte existe déjà"}. +{"The account was not unregistered","Le compte n’a pas été désinscrit"}. +{"The body text of the last received message","Le corps du texte du dernier message reçu"}. +{"The CAPTCHA is valid.","Le CAPTCHA est valide."}. {"The CAPTCHA verification has failed","La vérification du CAPTCHA a échoué"}. +{"The captcha you entered is wrong","Le captcha que vous avez saisi est erroné"}. {"The collections with which a node is affiliated","Les collections avec lesquelle un nœud est affilié"}. +{"The datetime when the node was created","La date à laquelle le nœud a été créé"}. {"The default language of the node","La langue par défaut du nœud"}. {"The feature requested is not supported by the conference","La demande de fonctionalité n'est pas supportée par la conférence"}. +{"The JID of the node creator","Le JID du créateur du nœud"}. {"The name of the node","Le nom du nœud"}. +{"The node is a collection node","Le nœud est un nœud de collecte"}. +{"The number of subscribers to the node","Le nombre d’enregistrés au nœud"}. +{"The number of unread or undelivered messages","Le nombre de messages non lus ou non remis"}. {"The password contains unacceptable characters","Le mot de passe contient des caractères non-acceptables"}. {"The password is too weak","Le mot de passe est trop faible"}. {"the password is","le mot de passe est"}. +{"The password of your XMPP account was successfully changed.","Le mot de passe de votre compte XMPP a été modifié avec succès."}. +{"The password was not changed","Le mot de passe n’a pas été modifié"}. +{"The passwords are different","Les mots de passe sont différents"}. {"The query is only allowed from local users","La requête n'est autorisé qu'aux utilisateurs locaux"}. {"The query must not contain elements","La requête ne doit pas contenir d'élément "}. +{"The room subject can be modified by participants","Le sujet du salon peut être modifié par les participants"}. +{"The sender of the last received message","L’expéditeur du dernier message reçu"}. +{"The subscription identifier associated with the subscription request","L’identificateur d’abonnement associé à la demande d’abonnement"}. +{"There was an error changing the password: ","Une erreur s’est produite lors de la modification du mot de passe : "}. {"There was an error creating the account: ","Il y a eu une erreur en créant le compte : "}. {"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte : "}. +{"This page allows to unregister an XMPP account in this XMPP server.","Cette page permet de désenregistrer un compte XMPP sur ce serveur XMPP."}. {"This room is not anonymous","Ce salon n'est pas anonyme"}. +{"This service can not process the address: ~s","Ce service ne peut pas traiter l’adresse : ~s"}. {"Thursday","Jeudi"}. {"Time delay","Délais"}. +{"Timed out waiting for stream resumption","Expiration du délai d’attente pour la reprise du flux"}. {"Time","Heure"}. {"To register, visit ~s","Pour vous enregistrer, visitez ~s"}. +{"To ~ts","À ~ts"}. {"To","A"}. {"Token TTL","Jeton TTL"}. {"Too many active bytestreams","Trop de flux SOCKS5 actifs"}. @@ -448,6 +500,7 @@ {"Too many elements","Trop d'éléments "}. {"Too many elements","Trop d'éléments "}. {"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Trop (~p) d'authentification ont échoué pour cette adresse IP (~s). L'adresse sera débloquée à ~s UTC"}. +{"Too many receiver fields were specified","Trop de champs de récepteurs ont été spécifiés"}. {"Too many unacked stanzas","Trop de stanzas sans accusé de réception (ack)"}. {"Too many users in this conference","Trop d'utilisateurs dans cette conférence"}. {"Total rooms","Nombre de salons"}. @@ -461,8 +514,12 @@ {"Unable to register route on existing local domain","Impossible d'enregistrer la route sur un domaine locale existant"}. {"Unauthorized","Non autorisé"}. {"Unexpected action","Action inattendu"}. +{"Unexpected error condition: ~p","Condition d’erreur inattendue : ~p"}. +{"Unregister an XMPP account","Annuler l’enregistrement d’un compte XMPP"}. {"Unregister","Désinscrire"}. +{"Unselect All","Tout désélectionner"}. {"Unsupported element","Elément non supporté"}. +{"Unsupported version","Version non prise en charge"}. {"Update message of the day (don't send)","Mise à jour du message du jour (pas d'envoi)"}. {"Update message of the day on all hosts (don't send)","Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"}. {"Update plan","Plan de mise à jour"}. @@ -470,12 +527,15 @@ {"Update script","Script de mise à jour"}. {"Update","Mettre à jour"}. {"Uptime:","Temps depuis le démarrage :"}. +{"URL for Archived Discussion Logs","URL des journaux de discussion archivés"}. {"User already exists","L'utilisateur existe déjà"}. -{"User JID","JID de l'utilisateur "}. +{"User JID","JID de l'utilisateur"}. {"User (jid)","Utilisateur (jid)"}. {"User Management","Gestion des utilisateurs"}. +{"User removed","Utilisateur supprimé"}. {"User session not found","Session utilisateur non trouvée"}. {"User session terminated","Session utilisateur terminée"}. +{"User ~ts","Utilisateur ~ts"}. {"Username:","Nom d'utilisateur :"}. {"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}. {"Users Last Activity","Dernière activité des utilisateurs"}. @@ -488,15 +548,22 @@ {"Value of '~s' should be integer","La valeur de '~s' doit être un entier"}. {"Value 'set' of 'type' attribute is not allowed","La valeur de l'attribut 'type' ne peut être 'set'"}. {"vCard User Search","Recherche dans l'annnuaire"}. +{"View Queue","Afficher la file d’attente"}. {"Virtual Hosts","Serveurs virtuels"}. {"Visitors are not allowed to change their nicknames in this room","Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"}. {"Visitors are not allowed to send messages to all occupants","Les visiteurs ne sont pas autorisés à envoyer des messages à tout les occupants"}. +{"Visitor","Visiteur"}. {"Voice request","Demande de voix"}. {"Voice requests are disabled in this conference","Les demandes de voix sont désactivées dans cette conférence"}. {"Wednesday","Mercredi"}. {"When a new subscription is processed","Quand un nouvel abonnement est traité"}. {"When to send the last published item","A quel moment envoyer le dernier élément publié"}. -{"Whether to allow subscriptions","Autoriser l'abonnement ?"}. +{"Whether to allow subscriptions","Autoriser ou non les abonnements"}. +{"Wrong parameters in the web formulary","Paramètres erronés dans le formulaire Web"}. +{"Wrong xmlns","Xmlns incorrect"}. +{"XMPP Account Registration","Enregistrement de compte XMPP"}. +{"XMPP Domains","Domaines XMPP"}. +{"You can later change your password using an XMPP client.","Vous pouvez modifier ultérieurement votre mot de passe à l’aide d’un client XMPP."}. {"You have been banned from this room","Vous avez été exclus de ce salon"}. {"You have joined too many conferences","Vous avec rejoint trop de conférences"}. {"You must fill in field \"Nickname\" in the form","Vous devez préciser le champ \"pseudo\" dans le formulaire"}. @@ -506,4 +573,5 @@ {"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}. {"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}. {"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}. +{"Your XMPP account was successfully unregistered.","Votre compte XMPP a été désinscrit avec succès."}. {"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}. From 449ac8f3e33967015514d93353b3fdfe04ffc2ed Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:22:29 +0200 Subject: [PATCH 290/440] Update Portuguese (Brazil) (thanks to Wellington Terumi Uemura) --- priv/msgs/pt-br.msg | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/priv/msgs/pt-br.msg b/priv/msgs/pt-br.msg index dab5d2d99..b77969b26 100644 --- a/priv/msgs/pt-br.msg +++ b/priv/msgs/pt-br.msg @@ -20,6 +20,7 @@ {"Access model","Modelo de acesso"}. {"Account doesn't exist","A conta não existe"}. {"Action on user","Ação no usuário"}. +{"Add a hat to a user","Adiciona um chapéu num usuário"}. {"Add Jabber ID","Adicionar ID jabber"}. {"Add New","Adicionar novo"}. {"Add User","Adicionar usuário"}. @@ -136,6 +137,7 @@ {"Elements","Elementos"}. {"Email Address","Endereço de e-mail"}. {"Email","Email"}. +{"Enable hats","Ativa chapéus"}. {"Enable logging","Permitir criação de logs"}. {"Enable message archiving","Habilitar arquivamento de mensagens"}. {"Enabling push without 'node' attribute is not supported","Abilitar push sem o atributo 'node' não é suportado"}. @@ -186,6 +188,9 @@ {"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}. {"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}. {"has been kicked","foi removido"}. +{"Hat title","Título do chapéu"}. +{"Hat URI","URI do chapéu"}. +{"Hats limit exceeded","O limite dos chapéus foi excedido"}. {"Host unknown","Máquina desconhecida"}. {"Host","Máquina"}. {"HTTP File Upload","Upload de arquivo HTTP"}. @@ -237,6 +242,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Bits menos significativos do hash sha-256 do texto devem ser iguais ao rótulo hexadecimal"}. {"leaves the room","Sair da sala"}. {"List of rooms","Lista de salas"}. +{"List of users with hats","Lista os usuários com chapéus"}. +{"List users with hats","Lista os usuários com chapéus"}. {"Logging","Registrando no log"}. {"Low level update script","Script de atualização low level"}. {"Make participants list public","Tornar pública a lista de participantes"}. @@ -249,7 +256,7 @@ {"Malformed username","Nome de usuário inválido"}. {"MAM preference modification denied by service policy","Modificação de preferência MAM negada por causa da política de serviços"}. {"March","Março"}. -{"Max # of items to persist","Máximo # de elementos que persistem"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de itens para persistir ou `max` para nenhum limite específico que não seja um servidor imposto como máximo"}. {"Max payload size in bytes","Máximo tamanho do payload em bytes"}. {"Maximum file size","Tamanho máximo do arquivo"}. {"Maximum Number of History Messages Returned by Room","Quantidade máxima das mensagens do histórico que foram devolvidas por sala"}. @@ -340,7 +347,7 @@ {"Number of Offline Messages","Quantidade das mensagens offline"}. {"Number of online users","Número de usuários online"}. {"Number of registered users","Número de usuários registrados"}. -{"Number of seconds after which to automatically purge items","Quantidade de segundos para excluir os itens automaticamente"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}. {"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}. {"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}. {"October","Outubro"}. @@ -419,6 +426,7 @@ {"Registered Users","Usuários Registrados"}. {"Register","Registrar"}. {"Remote copy","Cópia remota"}. +{"Remove a hat from a user","Remove um chapéu de um usuário"}. {"Remove All Offline Messages","Remover Todas as Mensagens Offline"}. {"Remove User","Remover usuário"}. {"Remove","Remover"}. @@ -520,7 +528,7 @@ {"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}. {"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}. {"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós em uma coleção"}. -{"The maximum number of child nodes that can be associated with a collection","A quantidade máxima dos nós relacionados que podem ser associados com uma coleção"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}. {"The minimum number of milliseconds between sending any two notification digests","O número mínimo de milissegundos entre o envio do resumo das duas notificações"}. {"The name of the node","O nome do nó"}. {"The node is a collection node","O nó é um nó da coleção"}. @@ -545,7 +553,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}. -{"The username is not valid","O nome do usuário não é válido"}. {"There was an error changing the password: ","Houve um erro ao alterar a senha: "}. {"There was an error creating the account: ","Houve um erro ao criar esta conta: "}. {"There was an error deleting the account: ","Houve um erro ao deletar esta conta: "}. From 09bdb055fb473096cc80bad5deb37008f719801d Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:23:03 +0200 Subject: [PATCH 291/440] Update Portuguese translation (thanks to Ssantos) --- priv/msgs/pt.msg | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/priv/msgs/pt.msg b/priv/msgs/pt.msg index 65e98cc74..99a8de3a3 100644 --- a/priv/msgs/pt.msg +++ b/priv/msgs/pt.msg @@ -20,6 +20,7 @@ {"Access model","Modelo de acesso"}. {"Account doesn't exist","A conta não existe"}. {"Action on user","Acção no utilizador"}. +{"Add a hat to a user","Adiciona um chapéu num utilizador"}. {"Add Jabber ID","Adicionar ID jabber"}. {"Add New","Adicionar novo"}. {"Add User","Adicionar utilizador"}. @@ -136,6 +137,7 @@ {"Elements","Elementos"}. {"Email Address","Endereço de e-mail"}. {"Email","Email"}. +{"Enable hats","Ativa chapéus"}. {"Enable logging","Permitir criação de logs"}. {"Enable message archiving","Ativar arquivamento de mensagens"}. {"Enabling push without 'node' attribute is not supported","Abilitar push sem o atributo 'node' não é suportado"}. @@ -186,6 +188,9 @@ {"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}. {"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}. {"has been kicked","foi removido"}. +{"Hat title","Título do chapéu"}. +{"Hat URI","URI do chapéu"}. +{"Hats limit exceeded","O limite dos chapéus foi excedido"}. {"Host unknown","Máquina desconhecida"}. {"Host","Máquina"}. {"HTTP File Upload","Upload de ficheiros por HTTP"}. @@ -237,6 +242,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Bits menos significativos do hash sha-256 do texto devem ser iguais ao rótulo hexadecimal"}. {"leaves the room","Sair da sala"}. {"List of rooms","Lista de salas"}. +{"List of users with hats","Lista os utilizadores com chapéus"}. +{"List users with hats","Lista os utilizadores com chapéus"}. {"Logging","Registando no log"}. {"Low level update script","Script de atualização low level"}. {"Make participants list public","Tornar pública a lista de participantes"}. @@ -249,7 +256,7 @@ {"Malformed username","Nome de utilizador inválido"}. {"MAM preference modification denied by service policy","Modificação de preferência MAM negada por causa da política de serviços"}. {"March","Março"}. -{"Max # of items to persist","Máximo # de elementos que persistem"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de itens para persistir ou `max` para nenhum limite específico que não seja um servidor imposto como máximo"}. {"Max payload size in bytes","Máximo tamanho do payload em bytes"}. {"Maximum file size","Tamanho máximo do ficheiro"}. {"Maximum Number of History Messages Returned by Room","Quantidade máxima das mensagens do histórico que foram devolvidas por sala"}. @@ -340,7 +347,7 @@ {"Number of Offline Messages","Quantidade das mensagens offline"}. {"Number of online users","Quantidade de utilizadores online"}. {"Number of registered users","Quantidade de utilizadores registados"}. -{"Number of seconds after which to automatically purge items","Quantidade de segundos para excluir os itens automaticamente"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}. {"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}. {"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}. {"October","Outubro"}. @@ -419,6 +426,7 @@ {"Registered Users:","Utilizadores registados:"}. {"Register","Registar"}. {"Remote copy","Cópia remota"}. +{"Remove a hat from a user","Remove um chapéu de um utilizador"}. {"Remove All Offline Messages","Remover Todas as Mensagens Offline"}. {"Remove User","Eliminar utilizador"}. {"Remove","Remover"}. @@ -520,7 +528,7 @@ {"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}. {"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}. {"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós numa coleção"}. -{"The maximum number of child nodes that can be associated with a collection","A quantidade máxima dos nós relacionados que podem ser associados com uma coleção"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}. {"The minimum number of milliseconds between sending any two notification digests","A quantidade mínima de milissegundos entre o envio do resumo das duas notificações"}. {"The name of the node","O nome do nó"}. {"The node is a collection node","O nó é um nó da coleção"}. @@ -545,7 +553,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}. -{"The username is not valid","O nome do utilizador não é válido"}. {"There was an error changing the password: ","Houve um erro ao alterar a palavra-passe: "}. {"There was an error creating the account: ","Houve um erro ao criar esta conta: "}. {"There was an error deleting the account: ","Houve um erro ao deletar esta conta: "}. From b253cc46d482f4b021a78a3c3d89fd9df6d34a95 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:24:24 +0200 Subject: [PATCH 292/440] Update Chinese (simplified) (thanks to Erix and Yzqzss) --- priv/msgs/zh.msg | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/priv/msgs/zh.msg b/priv/msgs/zh.msg index a3a400afb..b23a1043a 100644 --- a/priv/msgs/zh.msg +++ b/priv/msgs/zh.msg @@ -173,7 +173,7 @@ {"Get Number of Online Users","获取在线用户数"}. {"Get Number of Registered Users","获取注册用户数"}. {"Get Pending","获取挂起"}. -{"Get User Last Login Time","获取用户上次登陆时间"}. +{"Get User Last Login Time","获取用户上次登录时间"}. {"Get User Password","获取用户密码"}. {"Get User Statistics","获取用户统计"}. {"Given Name","中间名"}. @@ -230,7 +230,7 @@ {"Just created","刚刚创建"}. {"Label:","标签:"}. {"Last Activity","上次活动"}. -{"Last login","上次登陆"}. +{"Last login","上次登录"}. {"Last message","最近消息"}. {"Last month","上个月"}. {"Last year","上一年"}. @@ -249,6 +249,7 @@ {"Malformed username","用户名无效"}. {"MAM preference modification denied by service policy","MAM偏好被服务策略拒绝"}. {"March","三月"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","要保留的最大项目数 #,`max`表示除了服务器强加的最大值之外没有特定限制"}. {"Max payload size in bytes","最大有效负载字节数"}. {"Maximum file size","最大文件大小"}. {"Maximum Number of History Messages Returned by Room","房间返回的历史消息最大值"}. @@ -339,6 +340,7 @@ {"Number of Offline Messages","离线消息数量"}. {"Number of online users","在线用户数"}. {"Number of registered users","注册用户数"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","等待多少秒后自动清除项目,“max”表示除服务器施加的最大值外没有特定限制"}. {"Occupants are allowed to invite others","允许成员邀请其他人"}. {"Occupants May Change the Subject","成员可以修改主题"}. {"October","十月"}. @@ -518,6 +520,7 @@ {"The JIDs of those with an affiliation of owner","隶属所有人的JID"}. {"The JIDs of those with an affiliation of publisher","隶属发布人的JID"}. {"The list of JIDs that may associate leaf nodes with a collection","可以将叶节点与集合关联的JID列表"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","可以与集合相关联的最大子节点数,“max”表示除服务器施加的最大值外没有特定限制"}. {"The minimum number of milliseconds between sending any two notification digests","发送任何两个通知摘要之间的最小毫秒数"}. {"The name of the node","该节点的名称"}. {"The node is a collection node","该节点是集合节点"}. From 59e1c5643fec394dd2ed9ff9466a9ca24c544ffa Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:25:00 +0200 Subject: [PATCH 293/440] Update Spanish and Catalan translations --- priv/msgs/ca.msg | 18 +++++++++++++----- priv/msgs/es.msg | 18 +++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/priv/msgs/ca.msg b/priv/msgs/ca.msg index 3d9c9d175..fa2f16285 100644 --- a/priv/msgs/ca.msg +++ b/priv/msgs/ca.msg @@ -20,6 +20,7 @@ {"Access model","Model d'Accés"}. {"Account doesn't exist","El compte no existeix"}. {"Action on user","Acció en l'usuari"}. +{"Add a hat to a user","Afegir un barret a un usuari"}. {"Add Jabber ID","Afegir Jabber ID"}. {"Add New","Afegir nou"}. {"Add User","Afegir usuari"}. @@ -136,6 +137,7 @@ {"Elements","Elements"}. {"Email Address","Adreça de correu"}. {"Email","Correu"}. +{"Enable hats","Activar barrets"}. {"Enable logging","Habilitar el registre de la conversa"}. {"Enable message archiving","Activar l'emmagatzematge de missatges"}. {"Enabling push without 'node' attribute is not supported","No està suportat activar Push sense l'atribut 'node'"}. @@ -186,6 +188,9 @@ {"has been kicked because of an affiliation change","ha sigut expulsat a causa d'un canvi d'afiliació"}. {"has been kicked because the room has been changed to members-only","ha sigut expulsat perquè la sala ara és només per a membres"}. {"has been kicked","ha sigut expulsat"}. +{"Hat title","Títol del barret"}. +{"Hat URI","URI del barret"}. +{"Hats limit exceeded","El límit de tràfic ha sigut sobrepassat"}. {"Host unknown","Host desconegut"}. {"Host","Host"}. {"HTTP File Upload","HTTP File Upload"}. @@ -237,6 +242,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Els bits menys significants del hash SHA-256 del text deurien ser iguals a l'etiqueta hexadecimal"}. {"leaves the room","surt de la sala"}. {"List of rooms","Llista de sales"}. +{"List of users with hats","Llista d'usuaris amb barrets"}. +{"List users with hats","Llista d'usuaris amb barrets"}. {"Logging","Registre"}. {"Low level update script","Script d'actualització de baix nivell"}. {"Make participants list public","Crear una llista de participants pública"}. @@ -249,7 +256,7 @@ {"Malformed username","Nom d'usuari mal format"}. {"MAM preference modification denied by service policy","Se t'ha denegat la modificació de la preferència de MAM per política del servei"}. {"March","Març"}. -{"Max # of items to persist","Màxim # d'elements que persistixen"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Màxim # d'elements a persistir, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}. {"Max payload size in bytes","Màxim tamany del payload en bytes"}. {"Maximum file size","Mida màxima de fitxer"}. {"Maximum Number of History Messages Returned by Room","Numero màxim de missatges de l'historia que retorna la sala"}. @@ -324,6 +331,7 @@ {"Node index not found","Index de node no trobat"}. {"Node not found","Node no trobat"}. {"Node ~p","Node ~p"}. +{"Node","Node"}. {"Nodeprep has failed","Ha fallat Nodeprep"}. {"Nodes","Nodes"}. {"None","Cap"}. @@ -339,7 +347,7 @@ {"Number of Offline Messages","Número de missatges offline"}. {"Number of online users","Número d'usuaris connectats"}. {"Number of registered users","Número d'Usuaris Registrats"}. -{"Number of seconds after which to automatically purge items","Número de segons després dels quals es purgaran automàticament elements"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segons després dels quals es purgaran automàticament elements, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}. {"Occupants are allowed to invite others","Els ocupants poden invitar a altres"}. {"Occupants May Change the Subject","Els ocupants poden canviar el Tema"}. {"October","Octubre"}. @@ -418,6 +426,7 @@ {"Registered Users:","Usuaris registrats:"}. {"Register","Registrar"}. {"Remote copy","Còpia remota"}. +{"Remove a hat from a user","Eliminar un barret d'un usuari"}. {"Remove All Offline Messages","Eliminar tots els missatges offline"}. {"Remove User","Eliminar usuari"}. {"Remove","Borrar"}. @@ -519,7 +528,7 @@ {"The JIDs of those with an affiliation of owner","Els JIDs de qui tenen una afiliació de propietaris"}. {"The JIDs of those with an affiliation of publisher","Els JIDs de qui tenen una afiliació de publicadors"}. {"The list of JIDs that may associate leaf nodes with a collection","La llista de JIDs que poden associar nodes fulla amb una col·lecció"}. -{"The maximum number of child nodes that can be associated with a collection","El màxim número de nodes fills que poden associar-se amb una col·lecció"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El màxim número de nodes fills que poden associar-se amb una col·lecció, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}. {"The minimum number of milliseconds between sending any two notification digests","El número mínim de mil·lisegons entre l'enviament de dos resums de notificacions"}. {"The name of the node","El nom del node"}. {"The node is a collection node","El node es una col·lecció"}. @@ -544,7 +553,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","El tipus de dades al node, usualment especificat pel namespace del payload (si n'hi ha)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de uns transformació XSL que pot ser aplicada als payloads per a generar un element apropiat de contingut de missatge."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformació XSL que pot ser aplicada al format de payload per a generar un resultat valid de Data Forms, que el client puga mostrar usant un métode generic de Data Forms"}. -{"The username is not valid","El nom d'usuari no es vàlid"}. {"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}. {"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}. {"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}. @@ -571,7 +579,7 @@ {"Too many users in this conference","N'hi ha massa usuaris en esta sala de conferència"}. {"To","Per a"}. {"Total rooms","Sales totals"}. -{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}. +{"Traffic rate limit is exceeded","El límit de tràfic ha sigut sobrepassat"}. {"Transactions Aborted:","Transaccions Avortades:"}. {"Transactions Committed:","Transaccions Realitzades:"}. {"Transactions Logged:","Transaccions registrades:"}. diff --git a/priv/msgs/es.msg b/priv/msgs/es.msg index 1f658343a..7a30f4ea2 100644 --- a/priv/msgs/es.msg +++ b/priv/msgs/es.msg @@ -20,6 +20,7 @@ {"Access model","Modelo de Acceso"}. {"Account doesn't exist","La cuenta no existe"}. {"Action on user","Acción en el usuario"}. +{"Add a hat to a user","Añade un sombrero a un usuario"}. {"Add Jabber ID","Añadir Jabber ID"}. {"Add New","Añadir nuevo"}. {"Add User","Añadir usuario"}. @@ -136,6 +137,7 @@ {"Elements","Elementos"}. {"Email Address","Dirección de correo electrónico"}. {"Email","Correo electrónico"}. +{"Enable hats","Activar sombreros"}. {"Enable logging","Guardar históricos"}. {"Enable message archiving","Activar el almacenamiento de mensajes"}. {"Enabling push without 'node' attribute is not supported","No está soportado activar Push sin el atributo 'node'"}. @@ -186,6 +188,9 @@ {"has been kicked because of an affiliation change","ha sido expulsado por un cambio de su afiliación"}. {"has been kicked because the room has been changed to members-only","ha sido expulsado porque la sala es ahora solo para miembros"}. {"has been kicked","ha sido expulsado"}. +{"Hat title","Título del sombrero"}. +{"Hat URI","Dirección del sombrero"}. +{"Hats limit exceeded","Se ha excedido el límite de sombreros"}. {"Host unknown","Dominio desconocido"}. {"Host","Dominio"}. {"HTTP File Upload","Subir fichero por HTTP"}. @@ -237,6 +242,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Los bits menos significativos del hash SHA-256 del texto deberían ser iguales a la etiqueta hexadecimal"}. {"leaves the room","sale de la sala"}. {"List of rooms","Lista de salas"}. +{"List of users with hats","Lista de usuarios con sombreros"}. +{"List users with hats","Listar usuarios con sombreros"}. {"Logging","Histórico de mensajes"}. {"Low level update script","Script de actualización a bajo nivel"}. {"Make participants list public","La lista de participantes es pública"}. @@ -249,7 +256,7 @@ {"Malformed username","Nombre de usuario mal formado"}. {"MAM preference modification denied by service policy","Se ha denegado modificar la preferencia MAM por política del servicio"}. {"March","Marzo"}. -{"Max # of items to persist","Máximo # de elementos que persisten"}. +{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de elementos a persistir, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}. {"Max payload size in bytes","Máximo tamaño del contenido en bytes"}. {"Maximum file size","Tamaño máximo de fichero"}. {"Maximum Number of History Messages Returned by Room","Máximo número de mensajes del historial devueltos por la sala"}. @@ -324,6 +331,7 @@ {"Node index not found","No se ha encontrado índice de nodo"}. {"Node not found","Nodo no encontrado"}. {"Node ~p","Nodo ~p"}. +{"Node","Nodo"}. {"Nodeprep has failed","Ha fallado el procesado del nombre de nodo (nodeprep)"}. {"Nodes","Nodos"}. {"None","Ninguno"}. @@ -339,7 +347,7 @@ {"Number of Offline Messages","Número de mensajes diferidos"}. {"Number of online users","Número de usuarios conectados"}. {"Number of registered users","Número de usuarios registrados"}. -{"Number of seconds after which to automatically purge items","Número de segundos después de los cuales se purgarán elementos automáticamente"}. +{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segundos después de los cuales se purgarán elementos automáticamente, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}. {"Occupants are allowed to invite others","Los ocupantes pueden invitar a otras personas"}. {"Occupants May Change the Subject","Los ocupantes pueden cambiar el Asunto"}. {"October","Octubre"}. @@ -418,6 +426,7 @@ {"Registered Users:","Usuarios registrados:"}. {"Register","Registrar"}. {"Remote copy","Copia remota"}. +{"Remove a hat from a user","Quitarle un sombrero a un usuario"}. {"Remove All Offline Messages","Borrar todos los mensajes diferidos"}. {"Remove User","Eliminar usuario"}. {"Remove","Borrar"}. @@ -519,7 +528,7 @@ {"The JIDs of those with an affiliation of owner","Los JIDs de quienes tienen una afiliación de dueños"}. {"The JIDs of those with an affiliation of publisher","Los JIDs de quienes tienen una afiliación de publicadores"}. {"The list of JIDs that may associate leaf nodes with a collection","La lista de JIDs que pueden asociar nodos hijo con una colección"}. -{"The maximum number of child nodes that can be associated with a collection","El número máximo de nodos hijo que pueden asociarse a una colección"}. +{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El número máximo de nodos hijo que pueden asociarse a una colección, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}. {"The minimum number of milliseconds between sending any two notification digests","El número mínimo de milisegundos entre dos envíos de resumen de notificaciones"}. {"The name of the node","El nombre del nodo"}. {"The node is a collection node","El nodo es una colección"}. @@ -544,7 +553,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","El tipo de datos del nodo, usualmente especificado por el namespace del payload (en caso de haberlo)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de una transformación XSL que puede aplicarse a payloads para generar un elemento de contenido del mensaje apropiado."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformación XSL que puede aplicarse al formato de payload para generar un resultado de Formulario de Datos válido, que el cliente pueda mostrar usando un mecanismo de dibujado genérico de Formulario de Datos"}. -{"The username is not valid","El nombre de usuario no es válido"}. {"There was an error changing the password: ","Hubo uno error al cambiar la contaseña: "}. {"There was an error creating the account: ","Hubo uno error al crear la cuenta: "}. {"There was an error deleting the account: ","Hubo un error borrando la cuenta: "}. @@ -571,7 +579,7 @@ {"Too many users in this conference","Demasiados usuarios en esta sala"}. {"To","Para"}. {"Total rooms","Salas totales"}. -{"Traffic rate limit is exceeded","Se ha exedido el límite de tráfico"}. +{"Traffic rate limit is exceeded","Se ha excedido el límite de tráfico"}. {"Transactions Aborted:","Transacciones abortadas:"}. {"Transactions Committed:","Transacciones finalizadas:"}. {"Transactions Logged:","Transacciones registradas:"}. From 32dee33070fc2d9f994b594e25dae3a4b0a13faa Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 16:25:26 +0200 Subject: [PATCH 294/440] Run 'make translations' for all other languages --- priv/msgs/cs.msg | 1 - priv/msgs/el.msg | 4 ---- priv/msgs/eo.msg | 1 - priv/msgs/gl.msg | 1 - priv/msgs/he.msg | 1 - priv/msgs/hu.msg | 1 - priv/msgs/id.msg | 2 -- priv/msgs/it.msg | 1 - priv/msgs/ja.msg | 2 -- priv/msgs/nl.msg | 1 - priv/msgs/no.msg | 2 -- priv/msgs/pl.msg | 1 - priv/msgs/ru.msg | 2 -- priv/msgs/sk.msg | 1 - priv/msgs/sq.msg | 1 - priv/msgs/sv.msg | 1 - priv/msgs/th.msg | 1 - priv/msgs/tr.msg | 1 - priv/msgs/uk.msg | 1 - priv/msgs/vi.msg | 1 - priv/msgs/wa.msg | 1 - 21 files changed, 28 deletions(-) diff --git a/priv/msgs/cs.msg b/priv/msgs/cs.msg index 7dc4fd16b..c6d3b2207 100644 --- a/priv/msgs/cs.msg +++ b/priv/msgs/cs.msg @@ -181,7 +181,6 @@ {"Make room public searchable","Nastavit místnost jako veřejnou"}. {"Malformed username","Chybně formátováné jméno uživatele"}. {"March",". března"}. -{"Max # of items to persist","Maximální počet položek, které je možné natrvalo uložit"}. {"Max payload size in bytes","Maximální náklad v bajtech"}. {"Maximum Number of Occupants","Počet účastníků"}. {"May",". května"}. diff --git a/priv/msgs/el.msg b/priv/msgs/el.msg index c8fc69e63..ec07d58c1 100644 --- a/priv/msgs/el.msg +++ b/priv/msgs/el.msg @@ -249,7 +249,6 @@ {"Malformed username","Λανθασμένη μορφή ονόματος χρήστη"}. {"MAM preference modification denied by service policy","Άρνηση αλλαγής προτιμήσεων MAM, λόγω της τακτικής Παροχής Υπηρεσιών"}. {"March","Μάρτιος"}. -{"Max # of items to persist","Μέγιστος αριθμός μόνιμων στοιχείων"}. {"Max payload size in bytes","Μέγιστο μέγεθος φορτίου σε bytes"}. {"Maximum file size","Μέγιστο μέγεθος αρχείου"}. {"Maximum Number of History Messages Returned by Room","Μέγιστος αριθμός μηνυμάτων Ιστορικού που επιστρέφονται από την Αίθουσα"}. @@ -339,7 +338,6 @@ {"Number of Offline Messages","Πλήθος μηνυμάτων Χωρίς Σύνδεση"}. {"Number of online users","Αριθμός συνδεδεμένων χρηστών"}. {"Number of registered users","Αριθμός εγγεγραμμένων χρηστών"}. -{"Number of seconds after which to automatically purge items","Πλήθος δευτερολέπτων μετά τα οποία αυτομάτως εκκαθαρίζονται αντικείμενα"}. {"Occupants are allowed to invite others","Οι συμμετέχοντες μπορούν να προσκαλέσουν και άλλους"}. {"Occupants May Change the Subject","Επιτρέψτε στους χρήστες να αλλάζουν το Θέμα"}. {"October","Οκτώβριος"}. @@ -519,7 +517,6 @@ {"The JIDs of those with an affiliation of owner","Το JID αυτών που σχετίζονται με τον ιδιοκτήτη"}. {"The JIDs of those with an affiliation of publisher","Το JID αυτών που σχετίζονται με τον εκδότη"}. {"The list of JIDs that may associate leaf nodes with a collection","Λίστα των JIDs που μπορούν να σχετίζουν leaf κόμβους με μια Συλλογή"}. -{"The maximum number of child nodes that can be associated with a collection","Το μέγιστο πλήθος θυγατρικών κόμβων που μπορούν να συσχετιστούν με μία Συλλογή"}. {"The minimum number of milliseconds between sending any two notification digests","Το ελάχιστο πλήθος χιλιοστών του δευτερολέπτου μεταξύ της αποστολής δύο συγχωνεύσεων ειδοποιήσεων"}. {"The name of the node","Το όνομα του κόμβου"}. {"The node is a collection node","Ο κόμβος είναι κόμβος Συλλογής"}. @@ -544,7 +541,6 @@ {"The type of node data, usually specified by the namespace of the payload (if any)","Ο τύπος των δεδομένων του κόμβου συνήθως προσδιορίζεται από το namespace του φόρτου εργασιών (αν υπάρχουν)"}. {"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Το URL ενός μετασχηματισμού XSL το οποίο μπορεί να εφαρμοστεί σε φόρτους εργασίας για να παραχθεί το κατάλληλο στοιχείο του σώματος του μηνύματος."}. {"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Το URL ενός μετασχηματισμού XSL, το οποίο μπορεί να εφαρμοστεί στους τύπους φόρτου εργασίας για να παραχθεί έγκυρο αποτέλεσμα Data Forms, τέτοιο που ο πελάτης μπορεί να εμφανίσει, χρησιμοποιώντας μια ευρείας χρήσης μηχανή επεξεργασίας Data Forms"}. -{"The username is not valid","Το όνομα Χρήστη δεν είναι έγκυρο"}. {"There was an error changing the password: ","Παρουσιάστηκε σφάλμα κατά την αλλαγή του κωδικού πρόσβασης: "}. {"There was an error creating the account: ","Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού: "}. {"There was an error deleting the account: ","Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού: "}. diff --git a/priv/msgs/eo.msg b/priv/msgs/eo.msg index 91932f66d..a7d9ad214 100644 --- a/priv/msgs/eo.msg +++ b/priv/msgs/eo.msg @@ -186,7 +186,6 @@ {"Make room persistent","Farigu babilejon daŭra"}. {"Make room public searchable","Farigu babilejon publike trovebla"}. {"March","Marĉo"}. -{"Max # of items to persist","Maksimuma kiomo de eroj en konservado"}. {"Max payload size in bytes","Maksimuma aĵo-grando je bajtoj"}. {"Maximum file size","Maksimuma grando de dosiero"}. {"Maximum Number of Occupants","Limigo de nombro de partoprenantoj"}. diff --git a/priv/msgs/gl.msg b/priv/msgs/gl.msg index 817605f1a..07b35e994 100644 --- a/priv/msgs/gl.msg +++ b/priv/msgs/gl.msg @@ -181,7 +181,6 @@ {"Make room public searchable","Sala publicamente visible"}. {"Malformed username","Nome de usuario mal formado"}. {"March","Marzo"}. -{"Max # of items to persist","Máximo # de elementos que persisten"}. {"Max payload size in bytes","Máximo tamaño do payload en bytes"}. {"Maximum Number of Occupants","Número máximo de ocupantes"}. {"May","Maio"}. diff --git a/priv/msgs/he.msg b/priv/msgs/he.msg index d73e43acb..5a4926a88 100644 --- a/priv/msgs/he.msg +++ b/priv/msgs/he.msg @@ -170,7 +170,6 @@ {"Make room public searchable","הפוך חדר לחדר שנתון לחיפוש פומבי"}. {"Malformed username","שם משתמש פגום"}. {"March","מרץ"}. -{"Max # of items to persist","מספר מרבי של פריטים לקיבוע"}. {"Max payload size in bytes","גודל מרבי של מטען ייעוד (payload) ביחידות מידה של byte"}. {"Maximum Number of Occupants","מספר מרבי של נוכחים"}. {"May","מאי"}. diff --git a/priv/msgs/hu.msg b/priv/msgs/hu.msg index abb7d3f2f..bf7782e49 100644 --- a/priv/msgs/hu.msg +++ b/priv/msgs/hu.msg @@ -388,7 +388,6 @@ {"The query is only allowed from local users","A lekérdezés csak helyi felhasználóktól engedélyezett"}. {"The query must not contain elements","A lekérdezés nem tartalmazhat elemeket"}. {"The stanza MUST contain only one element, one element, or one element","A stanzának csak egyetlen elemet, egyetlen elemet vagy egyetlen elemet KELL tartalmaznia"}. -{"The username is not valid","A felhasználónév nem érvényes"}. {"There was an error creating the account: ","Hiba történt a fiók létrehozásakor: "}. {"There was an error deleting the account: ","Hiba történt a fiók törlésekor: "}. {"This room is not anonymous","Ez a szoba nem névtelen"}. diff --git a/priv/msgs/id.msg b/priv/msgs/id.msg index 722a8988e..08a3df2b4 100644 --- a/priv/msgs/id.msg +++ b/priv/msgs/id.msg @@ -227,7 +227,6 @@ {"Make room persistent","Buat ruangan menjadi permanent"}. {"Make room public searchable","Buat ruangan dapat dicari"}. {"March","Maret"}. -{"Max # of items to persist","Max item untuk bertahan"}. {"Max payload size in bytes","Max kapasitas ukuran dalam bytes"}. {"Maximum Number of Occupants","Maksimum Jumlah Penghuni"}. {"May","Mei"}. @@ -423,7 +422,6 @@ {"the password is","kata sandinya"}. {"The password was not changed","Kata sandi belum berubah"}. {"The passwords are different","Kata sandi berbeda"}. -{"The username is not valid","Nama pengguna tidak valid"}. {"There was an error changing the password: ","Ada kesalahan saat merubah kata kunci: "}. {"There was an error creating the account: ","Ada kesalahan saat membuat akun: "}. {"There was an error deleting the account: ","Ada kesalahan saat menghapus akun: "}. diff --git a/priv/msgs/it.msg b/priv/msgs/it.msg index 627707e89..8f117c9f2 100644 --- a/priv/msgs/it.msg +++ b/priv/msgs/it.msg @@ -145,7 +145,6 @@ {"Make room persistent","Rendere la stanza persistente"}. {"Make room public searchable","Rendere la sala visibile al pubblico"}. {"March","Marzo"}. -{"Max # of items to persist","Numero massimo di elementi da conservare persistentemente"}. {"Max payload size in bytes","Dimensione massima del contenuto del messaggio in byte"}. {"Maximum Number of Occupants","Numero massimo di occupanti"}. {"May","Maggio"}. diff --git a/priv/msgs/ja.msg b/priv/msgs/ja.msg index 89531449e..dbdb1ed8a 100644 --- a/priv/msgs/ja.msg +++ b/priv/msgs/ja.msg @@ -191,7 +191,6 @@ {"Make room public searchable","チャットルームを検索可"}. {"Malformed username","不正な形式のユーザー名"}. {"March","3月"}. -{"Max # of items to persist","アイテムの最大保存数"}. {"Max payload size in bytes","最大ぺイロードサイズ (byte)"}. {"Maximum file size","最大ファイルサイズ"}. {"Maximum Number of Occupants","最大在室者数"}. @@ -367,7 +366,6 @@ {"The password of your XMPP account was successfully changed.","XMPP アカウントのパスワード変更に成功しました。"}. {"The password was not changed","このパスワードは変更されませんでした"}. {"The passwords are different","このパスワードが違います"}. -{"The username is not valid","ユーザー名が正しくありません"}. {"There was an error creating the account: ","アカウントの作成中にエラーが発生しました: "}. {"There was an error deleting the account: ","アカウントの削除中にエラーが発生しました: "}. {"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","大文字と小文字は区別しません: macbeth は MacBeth や Macbeth と同じです。"}. diff --git a/priv/msgs/nl.msg b/priv/msgs/nl.msg index 65f359987..5a5010b89 100644 --- a/priv/msgs/nl.msg +++ b/priv/msgs/nl.msg @@ -150,7 +150,6 @@ {"Make room persistent","Chatruimte blijvend maken"}. {"Make room public searchable","Chatruimte doorzoekbaar maken"}. {"March","Maart"}. -{"Max # of items to persist","Maximum aantal in het geheugen te bewaren items"}. {"Max payload size in bytes","Maximumgrootte van bericht in bytes"}. {"Maximum Number of Occupants","Maximum aantal aanwezigen"}. {"May","Mei"}. diff --git a/priv/msgs/no.msg b/priv/msgs/no.msg index 40b6a6727..e883518a4 100644 --- a/priv/msgs/no.msg +++ b/priv/msgs/no.msg @@ -165,7 +165,6 @@ {"Make room persistent","Gjør rommet vedvarende"}. {"Make room public searchable","Gjør rommet offentlig søkbart"}. {"March","mars"}. -{"Max # of items to persist","Høyeste # elementer som skal lagres"}. {"Maximum file size","Maksimal filstørrelse"}. {"Maximum Number of History Messages Returned by Room","Maksimalt antall historikkmeldinger tilbudt av rommet"}. {"May","mai"}. @@ -333,7 +332,6 @@ {"The query must not contain elements","Spørringen kan ikke inneholde -elementer"}. {"The room subject can be modified by participants","Romemnet kan endres av dets deltagere"}. {"The sender of the last received message","Avsender for sist mottatte melding"}. -{"The username is not valid","Brukernavnet er ikke gyldig"}. {"There was an error creating the account: ","En feil inntraff under oppretting av kontoen: "}. {"There was an error deleting the account: ","En feil inntraff under sletting av kontoen: "}. {"This room is not anonymous","Dette rommet er ikke anonymt"}. diff --git a/priv/msgs/pl.msg b/priv/msgs/pl.msg index 3f9e80a8f..52cc374a1 100644 --- a/priv/msgs/pl.msg +++ b/priv/msgs/pl.msg @@ -181,7 +181,6 @@ {"Make room public searchable","Pozwól wyszukiwać pokój"}. {"Malformed username","Nieprawidłowa nazwa użytkownika"}. {"March","Marzec"}. -{"Max # of items to persist","Maksymalna liczba przechowywanych przedmiotów"}. {"Max payload size in bytes","Maksymalna wielkość powiadomienia w bajtach"}. {"Maximum Number of Occupants","Maksymalna liczba uczestników"}. {"May","Maj"}. diff --git a/priv/msgs/ru.msg b/priv/msgs/ru.msg index c52cd7e41..0b63a9c6a 100644 --- a/priv/msgs/ru.msg +++ b/priv/msgs/ru.msg @@ -201,7 +201,6 @@ {"Malformed username","Недопустимое имя пользователя"}. {"MAM preference modification denied by service policy","Изменение настроек архива сообщений запрещено политикой службы"}. {"March","марта"}. -{"Max # of items to persist","Максимальное число сохраняемых публикаций"}. {"Max payload size in bytes","Максимальный размер полезной нагрузки в байтах"}. {"Maximum Number of Occupants","Максимальное количество участников"}. {"May","мая"}. @@ -411,7 +410,6 @@ {"The query is only allowed from local users","Запрос доступен только для локальных пользователей"}. {"The query must not contain elements","Запрос не должен содержать элементов "}. {"The stanza MUST contain only one element, one element, or one element","Строфа может содержать только один элемент , один элемент или один элемент "}. -{"The username is not valid","Недопустимое имя пользователя"}. {"There was an error creating the account: ","Ошибка при создании аккаунта:"}. {"There was an error deleting the account: ","Ошибка при удалении аккаунта:"}. {"This room is not anonymous","Эта комната не анонимная"}. diff --git a/priv/msgs/sk.msg b/priv/msgs/sk.msg index f78303ec4..aaee00ef1 100644 --- a/priv/msgs/sk.msg +++ b/priv/msgs/sk.msg @@ -144,7 +144,6 @@ {"Make room persistent","Nastaviť miestnosť ako trvalú"}. {"Make room public searchable","Nastaviť miestnosť ako verejne prehľadávateľnú"}. {"March","Marec"}. -{"Max # of items to persist","Maximálny počet položiek, ktoré je možné natrvalo uložiť"}. {"Max payload size in bytes","Maximálny náklad v bajtoch"}. {"Maximum Number of Occupants","Počet účastníkov"}. {"May","Máj"}. diff --git a/priv/msgs/sq.msg b/priv/msgs/sq.msg index fa3d7cb11..e6305d935 100644 --- a/priv/msgs/sq.msg +++ b/priv/msgs/sq.msg @@ -331,7 +331,6 @@ {"The password was not changed","Fjalëkalimi s’u ndryshua"}. {"The passwords are different","Fjalëkalimet janë të ndryshëm"}. {"The sender of the last received message","Dërguesi i mesazhit të fundit të marrë"}. -{"The username is not valid","Emri i përdoruesit s’është i vlefshëm"}. {"There was an error changing the password: ","Pati një gabim në ndryshimin e fjalëkalimit: "}. {"There was an error creating the account: ","Pati një gabim në krijimin e llogarisë: "}. {"This room is not anonymous","Kjo dhomë s’është anonime"}. diff --git a/priv/msgs/sv.msg b/priv/msgs/sv.msg index 42d75a679..afd38e2f6 100644 --- a/priv/msgs/sv.msg +++ b/priv/msgs/sv.msg @@ -129,7 +129,6 @@ {"Make room persistent","Gör rummet permanent"}. {"Make room public searchable","Gör rummet publikt sökbart"}. {"March","Mars"}. -{"Max # of items to persist","Högsta antal dataposter som sparas"}. {"Max payload size in bytes","Högsta innehållsstorlek i bytes"}. {"Maximum Number of Occupants","Maximalt antal av användare"}. {"May","Maj"}. diff --git a/priv/msgs/th.msg b/priv/msgs/th.msg index bafd48567..9ec823668 100644 --- a/priv/msgs/th.msg +++ b/priv/msgs/th.msg @@ -110,7 +110,6 @@ {"Make room persistent","สร้างเป็นห้องถาวร"}. {"Make room public searchable","สร้างเป็นห้องที่บุคคลทั่วไปสามารถค้นหาได้"}. {"March","มีนาคม"}. -{"Max # of items to persist","จำนวนสูงสุดของรายการที่ยืนยัน"}. {"Max payload size in bytes","ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"}. {"Maximum Number of Occupants","จำนวนผู้ครอบครองห้องสูงสุด"}. {"May","พฤษภาคม"}. diff --git a/priv/msgs/tr.msg b/priv/msgs/tr.msg index 0db9497b1..8acdf3491 100644 --- a/priv/msgs/tr.msg +++ b/priv/msgs/tr.msg @@ -143,7 +143,6 @@ {"Make room persistent","Odayı kalıcı hale getir"}. {"Make room public searchable","Odayı herkes tarafından aranabilir hale getir"}. {"March","Mart"}. -{"Max # of items to persist","Kalıcı hale getirilecek en fazla öğe sayısı"}. {"Max payload size in bytes","En fazla yük (payload) boyutu (bayt olarak)"}. {"Maximum Number of Occupants","Odada En Fazla Bulunabilecek Kişi Sayısı"}. {"May","Mayıs"}. diff --git a/priv/msgs/uk.msg b/priv/msgs/uk.msg index 2ec5d0ebe..16446c279 100644 --- a/priv/msgs/uk.msg +++ b/priv/msgs/uk.msg @@ -153,7 +153,6 @@ {"Make room persistent","Зробити кімнату постійною"}. {"Make room public searchable","Зробити кімнату видимою всім"}. {"March","березня"}. -{"Max # of items to persist","Максимальне число збережених публікацій"}. {"Max payload size in bytes","Максимальний розмір корисного навантаження в байтах"}. {"Maximum Number of Occupants","Максимальна кількість учасників"}. {"May","травня"}. diff --git a/priv/msgs/vi.msg b/priv/msgs/vi.msg index d403256f8..600ef6422 100644 --- a/priv/msgs/vi.msg +++ b/priv/msgs/vi.msg @@ -110,7 +110,6 @@ {"Make room persistent","Tạo phòng bền vững"}. {"Make room public searchable","Tạo phòng có thể tìm kiếm công khai"}. {"March","Tháng Ba"}. -{"Max # of items to persist","Số mục tối đa để lưu trữ"}. {"Max payload size in bytes","Kích thước dung lượng byte tối đa"}. {"Maximum Number of Occupants","Số Lượng Người Tham Dự Tối Đa"}. {"May","Tháng Năm"}. diff --git a/priv/msgs/wa.msg b/priv/msgs/wa.msg index f6e1fd4a8..f6b618465 100644 --- a/priv/msgs/wa.msg +++ b/priv/msgs/wa.msg @@ -153,7 +153,6 @@ {"Make room persistent","Rinde li såle permaninte"}. {"Make room public searchable","Rinde li såle di berdelaedje cweråve publicmint"}. {"March","måss"}. -{"Max # of items to persist","Nombe macsimoms di cayets permanints"}. {"Max payload size in bytes","Contnou macsimom en octets"}. {"Maximum Number of Occupants","Nombe macsimom di prezints"}. {"May","may"}. From 30b3c6c90846d5d141e6c1a73eb5aad5be1f1372 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 15:18:57 +0200 Subject: [PATCH 295/440] Annotate options and commands recently added --- src/ejabberd_admin.erl | 3 +++ src/ejabberd_oauth.erl | 1 + src/mod_conversejs.erl | 5 ++++- src/mod_host_meta.erl | 2 +- src/mod_mam.erl | 3 +++ src/mod_muc.erl | 2 ++ src/mod_muc_admin.erl | 2 ++ 7 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index ccd72a61f..97e217cbc 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -322,6 +322,7 @@ get_commands_spec() -> args = [{days, integer}], result = {res, rescode}}, #ejabberd_commands{name = delete_old_messages_batch, tags = [purge], desc = "Delete offline messages older than DAYS", + note = "added in 22.05", module = ?MODULE, function = delete_old_messages_batch, args_desc = ["Name of host where messages should be deleted", "Days to keep messages", @@ -334,6 +335,7 @@ get_commands_spec() -> result_example = {ok, <<"Removal of 5000 messages in progress">>}}, #ejabberd_commands{name = delete_old_messages_status, tags = [purge], desc = "Status of delete old offline messages operation", + note = "added in 22.05", module = ?MODULE, function = delete_old_messages_status, args_desc = ["Name of host where messages should be deleted"], args_example = [<<"localhost">>], @@ -343,6 +345,7 @@ get_commands_spec() -> result_example = "Operation in progress, delete 5000 messages"}, #ejabberd_commands{name = abort_delete_old_messages, tags = [purge], desc = "Abort currently running delete old offline messages operation", + note = "added in 22.05", module = ?MODULE, function = delete_old_messages_abort, args_desc = ["Name of host where operation should be aborted"], args_example = [<<"localhost">>], diff --git a/src/ejabberd_oauth.erl b/src/ejabberd_oauth.erl index 2e812d758..51676ac5d 100644 --- a/src/ejabberd_oauth.erl +++ b/src/ejabberd_oauth.erl @@ -101,6 +101,7 @@ get_commands_spec() -> }, #ejabberd_commands{name = oauth_revoke_token, tags = [oauth], desc = "Revoke authorization for a token", + note = "changed in 22.05", module = ?MODULE, function = oauth_revoke_token, args = [{token, binary}], policy = restricted, diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 08b218c67..767a3824b 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -243,7 +243,8 @@ mod_doc() -> #{desc => [?T("This module serves a simple page for the " "https://conversejs.org/[Converse] XMPP web browser client."), "", - ?T("This module is available since ejabberd 21.12."), "", + ?T("This module is available since ejabberd 21.12."), + ?T("Several options were improved in ejabberd 22.05."), "", ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", @@ -320,11 +321,13 @@ mod_doc() -> "The default value is '@HOST@'.")}}, {conversejs_resources, #{value => ?T("Path"), + note => "added in 22.05", desc => ?T("Local path to the Converse files. " "If not set, the public Converse client will be used instead.")}}, {conversejs_options, #{value => "{Name: Value}", + note => "added in 22.05", desc => ?T("Specify additional options to be passed to Converse. " "See https://conversejs.org/docs/html/configuration.html[Converse configuration]. " diff --git a/src/mod_host_meta.erl b/src/mod_host_meta.erl index f2d8b92ad..77fc16058 100644 --- a/src/mod_host_meta.erl +++ b/src/mod_host_meta.erl @@ -192,7 +192,7 @@ mod_doc() -> [?T("This module serves small 'host-meta' files as described in " "https://xmpp.org/extensions/xep-0156.html[XEP-0156: Discovering " "Alternative XMPP Connection Methods]."), "", - ?T("This module is available since ejabberd 22.xx."), "", + ?T("This module is available since ejabberd 22.05."), "", ?T("To use this module, in addition to adding it to the 'modules' " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "http://../listen-options/#request-handlers[request_handlers]."), "", diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 0288e2d52..d5b9a1680 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -1446,6 +1446,7 @@ get_commands_spec() -> result = {res, rescode}}, #ejabberd_commands{name = delete_old_mam_messages_batch, tags = [purge], desc = "Delete MAM messages older than DAYS", + note = "added in 22.05", longdesc = "Valid message TYPEs: " "\"chat\", \"groupchat\", \"all\".", module = ?MODULE, function = delete_old_messages_batch, @@ -1461,6 +1462,7 @@ get_commands_spec() -> result_example = {ok, <<"Removal of 5000 messages in progress">>}}, #ejabberd_commands{name = delete_old_mam_messages_status, tags = [purge], desc = "Status of delete old MAM messages operation", + note = "added in 22.05", module = ?MODULE, function = delete_old_messages_status, args_desc = ["Name of host where messages should be deleted"], args_example = [<<"localhost">>], @@ -1470,6 +1472,7 @@ get_commands_spec() -> result_example = "Operation in progress, delete 5000 messages"}, #ejabberd_commands{name = abort_delete_old_mam_messages, tags = [purge], desc = "Abort currently running delete old MAM messages operation", + note = "added in 22.05", module = ?MODULE, function = delete_old_messages_abort, args_desc = ["Name of host where operation should be aborted"], args_example = [<<"localhost">>], diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 9c13926e0..8ad16a10f 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1634,11 +1634,13 @@ mod_doc() -> " street: Elm Street"]}]}}, {cleanup_affiliations_on_start, #{value => "true | false", + note => "added in 22.05", desc => ?T("Remove affiliations for non-existing local users on startup. " "The default value is 'false'.")}}, {default_room_options, #{value => ?T("Options"), + note => "improved in 22.05", desc => ?T("This option allows to define the desired " "default room options. Note that the creator of a room " diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 5e7ae6696..891f55e96 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -337,6 +337,7 @@ get_commands_spec() -> result = {nodes, {list, {node, string}}}}, #ejabberd_commands{name = subscribe_room_many, tags = [muc_room], desc = "Subscribe several users to a MUC conference", + note = "added in 22.05", longdesc = "This command accept up to 50 users at once (this is configurable with `subscribe_room_many_max_users` option)", module = ?MODULE, function = subscribe_room_many, args_desc = ["Users JIDs and nicks", @@ -1469,6 +1470,7 @@ mod_doc() -> opts => [{subscribe_room_many_max_users, #{value => ?T("Number"), + note => "added in 22.05", desc => ?T("How many users can be subscribed to a room at once using " "the 'subscribe_room_many' command. " From fad5406348f839c7e21457e8cf3f4939a3b8e6e0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 12:39:59 +0200 Subject: [PATCH 296/440] Container: Build containers also for linux/arm64 --- .github/workflows/container.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 84adc5558..8ae2c6873 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -63,7 +63,6 @@ jobs: cache-to: type=gha,mode=max context: .github/container labels: ${{ steps.meta.outputs.labels }} - #platforms: linux/amd64,linux/arm64 # arm takes 30 mins to compile - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} From 49ecddc6462292aa55dd7e0ae06ce48df6f0c62d Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 30 Apr 2022 21:52:15 +0200 Subject: [PATCH 297/440] Dependabot: Detect updates in docker, actions and mix --- .github/dependabot.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..c65905e20 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 + +updates: + + - package-ecosystem: "docker" + directory: "/.github/container/" + schedule: + interval: "weekly" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "mix" + directory: "/" + schedule: + interval: "weekly" From aa190ca8968eb11efd9674ad41cc21e638a05672 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 17:16:51 +0200 Subject: [PATCH 298/440] Run 'make options' --- src/ejabberd_option.erl | 2 +- src/mod_muc_opt.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_option.erl b/src/ejabberd_option.erl index 33e9f5738..29b5b40e8 100644 --- a/src/ejabberd_option.erl +++ b/src/ejabberd_option.erl @@ -370,7 +370,7 @@ disable_sasl_mechanisms() -> disable_sasl_mechanisms(Host) -> ejabberd_config:get_option({disable_sasl_mechanisms, Host}). --spec domain_balancing() -> #{binary()=>#{'component_number':=1..1114111, 'type'=>'bare_destination' | 'bare_source' | 'destination' | 'random' | 'source'}}. +-spec domain_balancing() -> #{binary()=>#{'component_number'=>1..1114111, 'type'=>'bare_destination' | 'bare_source' | 'destination' | 'random' | 'source'}}. domain_balancing() -> ejabberd_config:get_option({domain_balancing, global}). diff --git a/src/mod_muc_opt.erl b/src/mod_muc_opt.erl index 4b9e8b806..c22a9594d 100644 --- a/src/mod_muc_opt.erl +++ b/src/mod_muc_opt.erl @@ -86,7 +86,7 @@ db_type(Opts) when is_map(Opts) -> db_type(Host) -> gen_mod:get_module_opt(Host, mod_muc, db_type). --spec default_room_options(gen_mod:opts() | global | binary()) -> [{atom(),'anyone' | 'false' | 'moderators' | 'nobody' | 'true' | binary() | ['moderator' | 'participant' | 'visitor'] | pos_integer()}]. +-spec default_room_options(gen_mod:opts() | global | binary()) -> [{atom(),'anyone' | 'false' | 'moderators' | 'nobody' | 'true' | 'undefined' | binary() | ['moderator' | 'participant' | 'visitor'] | pos_integer() | tuple()}]. default_room_options(Opts) when is_map(Opts) -> gen_mod:get_opt(default_room_options, Opts); default_room_options(Host) -> From bdfa1b34039ec40bf612f2d679d744601c2309f5 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 17:25:24 +0200 Subject: [PATCH 299/440] Update man page --- man/ejabberd.yml.5 | 313 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 265 insertions(+), 48 deletions(-) diff --git a/man/ejabberd.yml.5 b/man/ejabberd.yml.5 index 48c4509f4..82c9340cc 100644 --- a/man/ejabberd.yml.5 +++ b/man/ejabberd.yml.5 @@ -1,13 +1,13 @@ '\" t .\" Title: ejabberd.yml .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.79.1 -.\" Date: 12/08/2021 +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 05/04/2022 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "EJABBERD\&.YML" "5" "12/08/2021" "\ \&" "\ \&" +.TH "EJABBERD\&.YML" "5" "05/04/2022" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -82,7 +82,7 @@ All options can be changed in runtime by running \fIejabberdctl reload\-config\f .sp Some options can be specified for particular virtual host(s) only using \fIhost_config\fR or \fIappend_host_config\fR options\&. Such options are called \fIlocal\fR\&. Examples are \fImodules\fR, \fIauth_method\fR and \fIdefault_db\fR\&. The options that cannot be defined per virtual host are called \fIglobal\fR\&. Examples are \fIloglevel\fR, \fIcertfiles\fR and \fIlisten\fR\&. It is a configuration mistake to put \fIglobal\fR options under \fIhost_config\fR or \fIappend_host_config\fR section \- ejabberd will refuse to load such configuration\&. .sp -It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/21\&.12/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. +It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/22\&.05/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. .sp Note that this document is intended to provide comprehensive description of all configuration options that can be consulted to understand the meaning of a particular option, its format and possible values\&. It will be quite hard to understand how to configure ejabberd by reading this document only \- for this purpose the reader is recommended to read online Configuration Guide available at https://docs\&.ejabberd\&.im/admin/configuration\&. .SH "TOP LEVEL OPTIONS" @@ -91,7 +91,8 @@ This section describes top level options of ejabberd\&. .PP \fBaccess_rules\fR: \fI{AccessName: {allow|deny: ACLRules|ACLName}}\fR .RS 4 -The option specifies access rules\&. Each access rule is assigned a name that can be referenced from other parts of the configuration file (mostly from +This option defines +Access Rules\&. Each access rule is assigned a name that can be referenced from other parts of the configuration file (mostly from \fIaccess\fR options of ejabberd modules)\&. Each rule definition may contain arbitrary number of \fIallow\fR @@ -1062,7 +1063,7 @@ This option can be used to tune tick time parameter of Whether to use \fInew\fR SQL schema\&. All schemas are located at -https://github\&.com/processone/ejabberd/tree/21\&.12/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The +https://github\&.com/processone/ejabberd/tree/22\&.05/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The \fInew\fR schema allows to handle several XMPP domains in a single ejabberd database\&. Using this \fInew\fR @@ -1360,9 +1361,10 @@ seconds\&. .PP \fBs2s_access\fR: \fIAccess\fR .RS 4 -The access rule to restrict server\-to\-server connections\&. The default value is -\fIall\fR -which means no restrictions are applied\&. +This +Access Rule +defines to what remote servers can s2s connections be established\&. The default value is +\fIall\fR; no restrictions are applied, it is allowed to connect s2s to/from all remote servers\&. .RE .PP \fBs2s_cafile\fR: \fIPath\fR @@ -1776,7 +1778,7 @@ module\&. The default value is obtained at compile time from the underlying vers .RS 4 This option enables validation for \fIOrigin\fR -header to protect against connections from other domains than given in the configuration file\&. In this way, the lower layer load balancer can be chosen for a specific ejabberd implementation while still providing a secure Websocket connection\&. The default value is +header to protect against connections from other domains than given in the configuration file\&. In this way, the lower layer load balancer can be chosen for a specific ejabberd implementation while still providing a secure WebSocket connection\&. The default value is \fIignore\fR\&. An example value of the \fIURL\fR is "https://test\&.example\&.org:8081"\&. @@ -1784,7 +1786,7 @@ is "https://test\&.example\&.org:8081"\&. .PP \fBwebsocket_ping_interval\fR: \fItimeout()\fR .RS 4 -Defines time between pings sent by the server to a client (Websocket level protocol pings are used for this) to keep a connection active\&. If the client doesn\(cqt respond to two consecutive pings, the connection will be assumed as closed\&. The value of +Defines time between pings sent by the server to a client (WebSocket level protocol pings are used for this) to keep a connection active\&. If the client doesn\(cqt respond to two consecutive pings, the connection will be assumed as closed\&. The value of \fI0\fR can be used to disable the feature\&. This option makes the server sending pings only for connections using the RFC compliant protocol\&. For older style connections the server expects that whitespace pings would be used for this purpose\&. The default value is \fI60\fR @@ -2164,7 +2166,7 @@ This module depends on \fImod_privacy\fR where all the configuration is performe The module has no options\&. .SS "mod_bosh" .sp -This module implements XMPP over BOSH as defined in XEP\-0124 and XEP\-0206\&. BOSH stands for Bidirectional\-streams Over Synchronous HTTP\&. It makes it possible to simulate long lived connections required by XMPP over the HTTP protocol\&. In practice, this module makes it possible to use XMPP in a browser without Websocket support and more generally to have a way to use XMPP while having to get through an HTTP proxy\&. +This module implements XMPP over BOSH as defined in XEP\-0124 and XEP\-0206\&. BOSH stands for Bidirectional\-streams Over Synchronous HTTP\&. It makes it possible to simulate long lived connections required by XMPP over the HTTP protocol\&. In practice, this module makes it possible to use XMPP in a browser without WebSocket support and more generally to have a way to use XMPP while having to get through an HTTP proxy\&. .sp .it 1 an-trap .nr an-no-space-flag 1 @@ -2234,9 +2236,9 @@ option, but applied to this module only\&. .PP \fBram_db_type\fR: \fImnesia | sql | redis\fR .RS 4 -Same as +Same as top\-level \fIdefault_ram_db\fR -but applied to this module only\&. +option, but applied to this module only\&. .RE .PP \fBuse_cache\fR: \fItrue | false\fR @@ -2370,11 +2372,13 @@ The module has no options\&. .sp This module serves a simple page for the Converse XMPP web browser client\&. .sp +This module is available since ejabberd 21\&.12\&. Several options were improved in ejabberd 22\&.05\&. +.sp To use this module, in addition to adding it to the \fImodules\fR section, you must also enable it in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. .sp -You must also setup either the option \fIwebsocket_url\fR or \fIbosh_service_url\fR\&. +Make sure either \fImod_bosh\fR or \fIejabberd_http_ws\fR request_handlers are enabled\&. .sp -By default, the options \fIconversejs_css\fR and \fIconversejs_script\fR point to the public Converse\&.js client\&. Alternatively, you can host the client locally using \fImod_http_fileserver\fR\&. +When \fIconversejs_css\fR and \fIconversejs_script\fR are \fIauto\fR, by default they point to the public Converse client\&. .sp .it 1 an-trap .nr an-no-space-flag 1 @@ -2384,29 +2388,61 @@ By default, the options \fIconversejs_css\fR and \fIconversejs_script\fR point t \fBAvailable options:\fR .RS 4 .PP -\fBbosh_service_url\fR: \fIBoshURL\fR +\fBbosh_service_url\fR: \fIauto | BoshURL\fR .RS 4 -BOSH service URL to which Converse\&.js can connect to\&. +BOSH service URL to which Converse can connect to\&. The keyword +\fI@HOST@\fR +is replaced with the real virtual host name\&. If set to +\fIauto\fR, it will build the URL of the first configured BOSH request handler\&. The default value is +\fIauto\fR\&. .RE .PP -\fBconversejs_css\fR: \fIURL\fR +\fBconversejs_css\fR: \fIauto | URL\fR .RS 4 -Converse\&.js CSS URL\&. +Converse CSS URL\&. The keyword +\fI@HOST@\fR +is replaced with the hostname\&. The default value is +\fIauto\fR\&. +.RE +.sp +\fINote\fR about the next option: added in 22\&.05: +.PP +\fBconversejs_options\fR: \fI{Name: Value}\fR +.RS 4 +Specify additional options to be passed to Converse\&. See +Converse configuration\&. Only boolean, integer and string values are supported; lists are not supported\&. +.RE +.sp +\fINote\fR about the next option: added in 22\&.05: +.PP +\fBconversejs_resources\fR: \fIPath\fR +.RS 4 +Local path to the Converse files\&. If not set, the public Converse client will be used instead\&. .RE .PP -\fBconversejs_script\fR: \fIURL\fR +\fBconversejs_script\fR: \fIauto | URL\fR .RS 4 -Converse\&.js main script URL\&. +Converse main script URL\&. The keyword +\fI@HOST@\fR +is replaced with the hostname\&. The default value is +\fIauto\fR\&. .RE .PP \fBdefault_domain\fR: \fIDomain\fR .RS 4 -Specify a domain to act as the default for user JIDs\&. The default value is the first domain defined in the ejabberd configuration file\&. +Specify a domain to act as the default for user JIDs\&. The keyword +\fI@HOST@\fR +is replaced with the hostname\&. The default value is +\fI@HOST@\fR\&. .RE .PP -\fBwebsocket_url\fR: \fIWebsocketURL\fR +\fBwebsocket_url\fR: \fIauto | WebSocketURL\fR .RS 4 -A websocket URL to which Converse\&.js can connect to\&. +A WebSocket URL to which Converse can connect to\&. The keyword +\fI@HOST@\fR +is replaced with the real virtual host name\&. If set to +\fIauto\fR, it will build the URL of the first configured WebSocket request handler\&. The default value is +\fIauto\fR\&. .RE .RE .sp @@ -2415,9 +2451,11 @@ A websocket URL to which Converse\&.js can connect to\&. .nr an-break-flag 1 .br .ps +1 -\fBExample:\fR +\fBExamples:\fR .RS 4 .sp +Manually setup WebSocket url, and use the public Converse client: +.sp .if n \{\ .RS 4 .\} @@ -2426,13 +2464,59 @@ listen: \- port: 5280 module: ejabberd_http + request_handlers: + /bosh: mod_bosh + /websocket: ejabberd_http_ws + /conversejs: mod_conversejs + +modules: + mod_bosh: {} + mod_conversejs: + websocket_url: "ws://@HOST@:5280/websocket" +.fi +.if n \{\ +.RE +.\} +.sp +Host Converse locally and let auto detection of WebSocket and Converse URLs: +.sp +.if n \{\ +.RS 4 +.\} +.nf +listen: + \- + port: 443 + module: ejabberd_http + tls: true request_handlers: /websocket: ejabberd_http_ws /conversejs: mod_conversejs modules: mod_conversejs: - websocket_url: "ws://example\&.org:5280/websocket" + conversejs_resources: "/home/ejabberd/conversejs\-9\&.0\&.0/package/dist" +.fi +.if n \{\ +.RE +.\} +.sp +Configure some additional options for Converse +.sp +.if n \{\ +.RS 4 +.\} +.nf +modules: + mod_conversejs: + websocket_url: auto + conversejs_options: + auto_away: 30 + clear_cache_on_logout: true + i18n: "pt" + locked_domain: "@HOST@" + message_archiving: always + theme: dracula .fi .if n \{\ .RE @@ -2676,9 +2760,79 @@ The number of C2S authentication failures to trigger the IP ban\&. The default v \fI20\fR\&. .RE .RE +.SS "mod_host_meta" +.sp +This module serves small \fIhost\-meta\fR files as described in XEP\-0156: Discovering Alternative XMPP Connection Methods\&. +.sp +This module is available since ejabberd 22\&.05\&. +.sp +To use this module, in addition to adding it to the \fImodules\fR section, you must also enable it in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. +.sp +Notice it only works if ejabberd_http has tls enabled\&. +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBAvailable options:\fR +.RS 4 +.PP +\fBbosh_service_url\fR: \fIundefined | auto | BoshURL\fR +.RS 4 +BOSH service URL to announce\&. The keyword +\fI@HOST@\fR +is replaced with the real virtual host name\&. If set to +\fIauto\fR, it will build the URL of the first configured BOSH request handler\&. The default value is +\fIauto\fR\&. +.RE +.PP +\fBwebsocket_url\fR: \fIundefined | auto | WebSocketURL\fR +.RS 4 +WebSocket URL to announce\&. The keyword +\fI@HOST@\fR +is replaced with the real virtual host name\&. If set to +\fIauto\fR, it will build the URL of the first configured WebSocket request handler\&. The default value is +\fIauto\fR\&. +.RE +.RE +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBExample:\fR +.RS 4 +.sp +.if n \{\ +.RS 4 +.\} +.nf +listen: + \- + port: 443 + module: ejabberd_http + tls: true + request_handlers: + /bosh: mod_bosh + /ws: ejabberd_http_ws + /\&.well\-known/host\-meta: mod_host_meta + /\&.well\-known/host\-meta\&.json: mod_host_meta + +modules: + mod_bosh: {} + mod_host_meta: + bosh_service_url: "https://@HOST@:5443/bosh" + websocket_url: "wss://@HOST@:5443/ws" +.fi +.if n \{\ +.RE +.\} +.RE .SS "mod_http_api" .sp -This module provides a ReST API to call ejabberd commands using JSON data\&. +This module provides a ReST interface to call ejabberd API commands using JSON data\&. .sp To use this module, in addition to adding it to the \fImodules\fR section, you must also enable it in \fIlisten\fR → \fIejabberd_http\fR → request_handlers\&. .sp @@ -3702,14 +3856,23 @@ This option specifies who is allowed to register nickname within the Multi\-User \fIall\fR for backward compatibility, which means that any user is allowed to register any free nick\&. .RE +.sp +\fINote\fR about the next option: added in 22\&.05: +.PP +\fBcleanup_affiliations_on_start\fR: \fItrue | false\fR +.RS 4 +Remove affiliations for non\-existing local users on startup\&. The default value is +\fIfalse\fR\&. +.RE .PP \fBdb_type\fR: \fImnesia | sql\fR .RS 4 -Define the type of persistent storage where the module will store room information\&. The default is the storage defined by the global option -\fIdefault_db\fR, or -\fImnesia\fR -if omitted\&. +Same as top\-level +\fIdefault_db\fR +option, but applied to this module only\&. .RE +.sp +\fINote\fR about the next option: improved in 22\&.05: .PP \fBdefault_room_options\fR: \fIOptions\fR .RS 4 @@ -3767,6 +3930,12 @@ Allow visitors to send status text in presence updates\&. If disallowed, the sta \fItrue\fR\&. .RE .PP +\fBallow_voice_requests\fR: \fItrue | false\fR +.RS 4 +Allow visitors in a moderated room to request voice\&. The default value is +\fItrue\fR\&. +.RE +.PP \fBanonymous\fR: \fItrue | false\fR .RS 4 The room is anonymous: occupants don\(cqt see the real JIDs of other occupants\&. Note that the room moderators can always see the real JIDs of the occupants\&. The default value is @@ -3781,6 +3950,17 @@ in order to accept their join in the room\&. The default value is \fIfalse\fR\&. .RE .PP +\fBdescription\fR: \fIRoom Description\fR +.RS 4 +Short description of the room\&. The default value is an empty string\&. +.RE +.PP +\fBenable_hats\fR: \fItrue | false\fR +.RS 4 +Allow extended roles as defined in XEP\-0317 Hats\&. The default value is +\fIfalse\fR\&. +.RE +.PP \fBlang\fR: \fILanguage\fR .RS 4 Preferred language for the discussions in the room\&. The language format should conform to RFC 5646\&. There is no value by default\&. @@ -3878,10 +4058,26 @@ The list of participants is public, without requiring to enter the room\&. The d \fItrue\fR\&. .RE .PP +\fBpubsub\fR: \fIPubSub Node\fR +.RS 4 +XMPP URI of associated Publish/Subscribe node\&. The default value is an empty string\&. +.RE +.PP \fBtitle\fR: \fIRoom Title\fR .RS 4 A human\-readable title of the room\&. There is no default value .RE +.PP +\fBvcard\fR: \fIvCard\fR +.RS 4 +A custom vCard for the room\&. See the equivalent mod_muc option\&.The default value is an empty string\&. +.RE +.PP +\fBvoice_request_min_interval\fR: \fINumber\fR +.RS 4 +Minimum interval between voice requests, in seconds\&. The default value is +\fI1800\fR\&. +.RE .RE .PP \fBhibernation_timeout\fR: \fIinfinity | Seconds\fR @@ -4010,9 +4206,9 @@ option, but applied to this module only\&. .PP \fBram_db_type\fR: \fImnesia | sql\fR .RS 4 -Define the type of volatile (in\-memory) storage where the module will store room information (\fImuc_online_room\fR -and -\fImuc_online_users\fR)\&. +Same as top\-level +\fIdefault_ram_db\fR +option, but applied to this module only\&. .RE .PP \fBregexp_room_id\fR: \fIstring()\fR @@ -4086,7 +4282,24 @@ This module provides commands to administer local MUC services and their MUC roo .sp This module depends on \fImod_muc\fR\&. .sp -The module has no options\&. +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBAvailable options:\fR +.RS 4 +.sp +\fINote\fR about the next option: added in 22\&.05: +.PP +\fBsubscribe_room_many_max_users\fR: \fINumber\fR +.RS 4 +How many users can be subscribed to a room at once using the +\fIsubscribe_room_many\fR +command\&. The default value is +\fI50\fR\&. +.RE +.RE .SS "mod_muc_log" .sp This module enables optional logging of Multi\-User Chat (MUC) public conversations to HTML\&. Once you enable this module, users can join a room using a MUC capable XMPP client, and if they have enough privileges, they can request the configuration form in which they can set the option to enable room logging\&. @@ -4585,11 +4798,13 @@ option, but applied to this module only\&. .PP \fBuse_mam_for_storage\fR: \fItrue | false\fR .RS 4 -This is an experimental option\&. Enabling this option will make +This is an experimental option\&. Enabling this option, \fImod_offline\fR -not use the former spool table for storing MucSub offline messages, but will use the archive table instead\&. This use of the archive table is cleaner and it makes it possible for clients to slowly drop the former offline use case and rely on message archive instead\&. It also further reduces the storage required when you enabled MucSub\&. Enabling this option has a known drawback for the moment: most of flexible message retrieval queries don\(cqt work (those that allow retrieval/deletion of messages by id), but this specification is not widely used\&. The default value is +uses the +\fImod_mam\fR +archive table instead of its own spool table to retrieve the messages received when the user was offline\&. This allows client developers to slowly drop XEP\-0160 and rely on XEP\-0313 instead\&. It also further reduces the storage required when you enable MucSub\&. Enabling this option has a known drawback for the moment: most of flexible message retrieval queries don\(cqt work (those that allow retrieval/deletion of messages by id), but this specification is not widely used\&. The default value is \fIfalse\fR -to keep former behaviour as default and ensure this option is disabled\&. +to keep former behaviour as default\&. .RE .RE .sp @@ -5085,7 +5300,9 @@ A port number to listen for incoming connections\&. The default value is .PP \fBram_db_type\fR: \fImnesia | redis | sql\fR .RS 4 -Define the type of volatile (in\-memory) storage where the module will store room information\&. +Same as top\-level +\fIdefault_ram_db\fR +option, but applied to this module only\&. .RE .PP \fBrecbuf\fR: \fISize\fR @@ -5284,6 +5501,8 @@ To specify whether or not pubsub should cache last items\&. Value is or \fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows to raise user connection rate\&. The cost is memory usage, as every item is stored in memory\&. .RE +.sp +\fINote\fR about the next option: added in 21\&.12: .PP \fBmax_item_expire_node\fR: \fItimeout() | infinity\fR .RS 4 @@ -5682,6 +5901,8 @@ doesn\(cqt allow to register new accounts from s2s or existing c2s sessions\&. Y .RS 4 Specify rules to restrict access for user unregistration\&. By default any user is able to unregister their account\&. .RE +.sp +\fINote\fR about the next option: added in 21\&.12: .PP \fBallow_modules\fR: \fIall | [Module, \&.\&.\&.]\fR .RS 4 @@ -6100,13 +6321,9 @@ option, but applied to this module only\&. .PP \fBdb_type\fR: \fImnesia | sql\fR .RS 4 -Define the type of storage where the module will create the tables and store user information\&. The default is the storage defined by the top\-level +Same as top\-level \fIdefault_db\fR -option, or -\fImnesia\fR -if omitted\&. If -\fIsql\fR -value is defined, make sure you have defined the database\&. +option, but applied to this module only\&. .RE .PP \fBuse_cache\fR: \fItrue | false\fR @@ -7380,13 +7597,13 @@ TODO ProcessOne\&. .SH "VERSION" .sp -This document describes the configuration file of ejabberd 21\&.12\&. Configuration options of other ejabberd versions may differ significantly\&. +This document describes the configuration file of ejabberd 22\&.05\&. Configuration options of other ejabberd versions may differ significantly\&. .SH "REPORTING BUGS" .sp Report bugs to https://github\&.com/processone/ejabberd/issues .SH "SEE ALSO" .sp -Default configuration file: https://github\&.com/processone/ejabberd/blob/21\&.12/ejabberd\&.yml\&.example +Default configuration file: https://github\&.com/processone/ejabberd/blob/22\&.05/ejabberd\&.yml\&.example .sp Main site: https://ejabberd\&.im .sp From c3d8c3d9c5884dbe93b2d9d0aae33b82c356d6ec Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 4 May 2022 02:36:40 +0200 Subject: [PATCH 300/440] README: Improve badges, header, commercial links --- CONTAINER.md | 2 +- README.md | 34 ++++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CONTAINER.md b/CONTAINER.md index e62553d71..5c5ce62c5 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -1,6 +1,6 @@ [![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=49c0c4)](https://github.com/processone/ejabberd/tags) -[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver)](https://github.com/badlop/ejabberd/pkgs/container/ejabberd) +[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [![Docker Image Version (latest semver)](https://img.shields.io/docker/v/ejabberd/ecs?label=docker)](https://hub.docker.com/r/ejabberd/ecs/) diff --git a/README.md b/README.md index ade46445b..e40f7701b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,27 @@ -ejabberd Community Edition -========================== -[![CI](https://github.com/processone/ejabberd/actions/workflows/ci.yml/badge.svg)](https://github.com/processone/ejabberd/actions/workflows/ci.yml) -[![Coverage Status](https://coveralls.io/repos/github/processone/ejabberd/badge.svg?branch=master "Coverage in coveralls.io")](https://coveralls.io/github/processone/ejabberd?branch=master) -[![Translation status](https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg "Translation status in Weblate")](https://hosted.weblate.org/projects/ejabberd/ejabberd-po/) -[![Hex version](https://img.shields.io/hexpm/v/ejabberd.svg "Hex version")](https://hex.pm/packages/ejabberd) +

    + +

    +

    + + + + + + + + + + +
    + + + + + + +

    [ejabberd][im] is an open-source, @@ -60,8 +77,8 @@ Security reports or concerns should preferably be reported privately, please send an email to the address: contact [at] process-one [dot] net or some other method from [ProcessOne Contact][p1contact]. -For commercial offering and support, including _ejabberd Business Edition_ -and _Fluux (ejabberd in the Cloud)_, please check [ProcessOne ejabberd page][p1home]. +For commercial offering and support, including [ejabberd Business Edition][p1home] +and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home]. Community @@ -88,6 +105,7 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI [docs]: https://docs.ejabberd.im [erlang]: https://www.erlang.org/ [features]: https://docs.ejabberd.im/admin/introduction/ +[fluux]: https://fluux.io/ [github]: https://github.com/processone/ejabberd [homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew [hubecs]: https://hub.docker.com/r/ejabberd/ecs/ From 54a1fcc5e8bca191392b492882ce98cb73388b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 5 May 2022 13:07:03 +0200 Subject: [PATCH 301/440] Improve misc:uri_parse --- src/misc.erl | 23 +++++++++++++++-------- src/mod_http_upload.erl | 2 +- src/mod_sip.erl | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/misc.erl b/src/misc.erl index b502971a0..0733ef298 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -56,23 +56,30 @@ -type distance_cache() :: #{{string(), string()} => non_neg_integer()}. +-spec uri_parse(binary()|string()) -> {ok, string(), string(), number(), string(), string()} | {error, term()}. -ifdef(USE_OLD_HTTP_URI). uri_parse(URL) when is_binary(URL) -> uri_parse(binary_to_list(URL)); uri_parse(URL) -> - {ok, {Scheme, _UserInfo, Host, Port, Path, _Query}} = http_uri:parse(URL), - {ok, Scheme, Host, Port, Path}. + case http_uri:parse(URL) of + {ok, {Scheme, _UserInfo, Host, Port, Path, Query}} -> + {ok, Scheme, Host, Port, Path, Query}; + {error, _} = E -> + E + end. -else. uri_parse(URL) when is_binary(URL) -> uri_parse(binary_to_list(URL)); uri_parse(URL) -> case uri_string:parse(URL) of - #{scheme := Scheme, host := Host, port := Port, path := Path} -> - {ok, Scheme, Host, Port, Path}; - #{scheme := "https", host := Host, path := Path} -> - {ok, "https", Host, 443, Path}; - #{scheme := "http", host := Host, path := Path} -> - {ok, "http", Host, 80, Path} + #{scheme := Scheme, host := Host, port := Port, path := Path} = M1 -> + {ok, Scheme, Host, Port, Path, maps:get(query, M1, "")}; + #{scheme := "https", host := Host, path := Path} = M2 -> + {ok, "https", Host, 443, Path, maps:get(query, M2, "")}; + #{scheme := "http", host := Host, path := Path} = M3 -> + {ok, "http", Host, 80, Path, maps:get(query, M3, "")}; + {error, Atom, _} -> + {error, Atom} end. -endif. diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 88be57718..0544a837d 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -713,7 +713,7 @@ get_proc_name(ServerHost, ModuleName) -> -spec get_proc_name(binary(), atom(), binary()) -> atom(). get_proc_name(ServerHost, ModuleName, PutURL) -> %% Once we depend on OTP >= 20.0, we can use binaries with http_uri. - {ok, _Scheme, Host0, _Port, Path0} = + {ok, _Scheme, Host0, _Port, Path0, _Query} = misc:uri_parse(expand_host(PutURL, ServerHost)), Host = jid:nameprep(iolist_to_binary(Host0)), Path = str:strip(iolist_to_binary(Path0), right, $/), diff --git a/src/mod_sip.erl b/src/mod_sip.erl index 5c1e09467..6a710a6e8 100644 --- a/src/mod_sip.erl +++ b/src/mod_sip.erl @@ -357,7 +357,7 @@ mod_opt_type(via) -> (econf:and_then( econf:url([tls, tcp, udp]), fun(URI) -> - {ok, Type, Host, Port, _} = + {ok, Type, Host, Port, _, _} = misc:uri_parse(URI), {Type, {unicode:characters_to_binary(Host), Port}} end))(U) From bc9e5c5363125dd4688dacccc11136f7f4d0ad91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 5 May 2022 13:46:02 +0200 Subject: [PATCH 302/440] Fix one more place where misc:uri_parse is used --- src/ejabberd_config_transformer.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_config_transformer.erl b/src/ejabberd_config_transformer.erl index c41220ab3..b24d0edd0 100644 --- a/src/ejabberd_config_transformer.erl +++ b/src/ejabberd_config_transformer.erl @@ -103,7 +103,7 @@ transform(_Host, acme, ACME, Acc) -> ACME1 = lists:map( fun({ca_url, URL} = Opt) -> case misc:uri_parse(URL) of - {ok, _, "acme-v01.api.letsencrypt.org", _, _} -> + {ok, _, "acme-v01.api.letsencrypt.org", _, _, _} -> NewURL = ejabberd_acme:default_directory_url(), ?WARNING_MSG("ACME directory URL ~ts defined in " "option acme->ca_url is deprecated " From 3d4f2d365fb4ab1f6cd3b0707735eaa81efdf8ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 6 May 2022 10:06:13 +0200 Subject: [PATCH 303/440] Have consistent schema type in misc:uri_parse --- src/misc.erl | 2 +- src/mod_sip.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/misc.erl b/src/misc.erl index 0733ef298..7380011c2 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -63,7 +63,7 @@ uri_parse(URL) when is_binary(URL) -> uri_parse(URL) -> case http_uri:parse(URL) of {ok, {Scheme, _UserInfo, Host, Port, Path, Query}} -> - {ok, Scheme, Host, Port, Path, Query}; + {ok, atom_to_list(Scheme), Host, Port, Path, Query}; {error, _} = E -> E end. diff --git a/src/mod_sip.erl b/src/mod_sip.erl index 6a710a6e8..cc2857181 100644 --- a/src/mod_sip.erl +++ b/src/mod_sip.erl @@ -359,7 +359,7 @@ mod_opt_type(via) -> fun(URI) -> {ok, Type, Host, Port, _, _} = misc:uri_parse(URI), - {Type, {unicode:characters_to_binary(Host), Port}} + {list_to_atom(Type), {unicode:characters_to_binary(Host), Port}} end))(U) end, [unique]). From c7ab3274c5ce2e4e95843d6a258cdbf3a835180a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 6 May 2022 10:14:50 +0200 Subject: [PATCH 304/440] Return userinfo from misc:uri_parse --- src/ejabberd_config_transformer.erl | 2 +- src/misc.erl | 10 +++++----- src/mod_http_upload.erl | 2 +- src/mod_sip.erl | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ejabberd_config_transformer.erl b/src/ejabberd_config_transformer.erl index b24d0edd0..7a1a03506 100644 --- a/src/ejabberd_config_transformer.erl +++ b/src/ejabberd_config_transformer.erl @@ -103,7 +103,7 @@ transform(_Host, acme, ACME, Acc) -> ACME1 = lists:map( fun({ca_url, URL} = Opt) -> case misc:uri_parse(URL) of - {ok, _, "acme-v01.api.letsencrypt.org", _, _, _} -> + {ok, _, _, "acme-v01.api.letsencrypt.org", _, _, _} -> NewURL = ejabberd_acme:default_directory_url(), ?WARNING_MSG("ACME directory URL ~ts defined in " "option acme->ca_url is deprecated " diff --git a/src/misc.erl b/src/misc.erl index 7380011c2..5eb2cf608 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -62,8 +62,8 @@ uri_parse(URL) when is_binary(URL) -> uri_parse(binary_to_list(URL)); uri_parse(URL) -> case http_uri:parse(URL) of - {ok, {Scheme, _UserInfo, Host, Port, Path, Query}} -> - {ok, atom_to_list(Scheme), Host, Port, Path, Query}; + {ok, {Scheme, UserInfo, Host, Port, Path, Query}} -> + {ok, atom_to_list(Scheme), UserInfo, Host, Port, Path, Query}; {error, _} = E -> E end. @@ -73,11 +73,11 @@ uri_parse(URL) when is_binary(URL) -> uri_parse(URL) -> case uri_string:parse(URL) of #{scheme := Scheme, host := Host, port := Port, path := Path} = M1 -> - {ok, Scheme, Host, Port, Path, maps:get(query, M1, "")}; + {ok, Scheme, maps:get(userinfo, M1, ""), Host, Port, Path, maps:get(query, M1, "")}; #{scheme := "https", host := Host, path := Path} = M2 -> - {ok, "https", Host, 443, Path, maps:get(query, M2, "")}; + {ok, "https", maps:get(userinfo, M2, ""), Host, 443, Path, maps:get(query, M2, "")}; #{scheme := "http", host := Host, path := Path} = M3 -> - {ok, "http", Host, 80, Path, maps:get(query, M3, "")}; + {ok, "http", maps:get(userinfo, M3, ""), Host, 80, Path, maps:get(query, M3, "")}; {error, Atom, _} -> {error, Atom} end. diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl index 0544a837d..bda66253e 100644 --- a/src/mod_http_upload.erl +++ b/src/mod_http_upload.erl @@ -713,7 +713,7 @@ get_proc_name(ServerHost, ModuleName) -> -spec get_proc_name(binary(), atom(), binary()) -> atom(). get_proc_name(ServerHost, ModuleName, PutURL) -> %% Once we depend on OTP >= 20.0, we can use binaries with http_uri. - {ok, _Scheme, Host0, _Port, Path0, _Query} = + {ok, _Scheme, _UserInfo, Host0, _Port, Path0, _Query} = misc:uri_parse(expand_host(PutURL, ServerHost)), Host = jid:nameprep(iolist_to_binary(Host0)), Path = str:strip(iolist_to_binary(Path0), right, $/), diff --git a/src/mod_sip.erl b/src/mod_sip.erl index cc2857181..96e344569 100644 --- a/src/mod_sip.erl +++ b/src/mod_sip.erl @@ -357,7 +357,7 @@ mod_opt_type(via) -> (econf:and_then( econf:url([tls, tcp, udp]), fun(URI) -> - {ok, Type, Host, Port, _, _} = + {ok, Type, _UserInfo, Host, Port, _, _} = misc:uri_parse(URI), {list_to_atom(Type), {unicode:characters_to_binary(Host), Port}} end))(U) From 84d8c156a0745b1a93880c942b14db93b4c35982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 6 May 2022 10:15:23 +0200 Subject: [PATCH 305/440] Fix spec --- src/misc.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/misc.erl b/src/misc.erl index 5eb2cf608..352a0f084 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -56,7 +56,7 @@ -type distance_cache() :: #{{string(), string()} => non_neg_integer()}. --spec uri_parse(binary()|string()) -> {ok, string(), string(), number(), string(), string()} | {error, term()}. +-spec uri_parse(binary()|string()) -> {ok, string(), string(), string(), number(), string(), string()} | {error, term()}. -ifdef(USE_OLD_HTTP_URI). uri_parse(URL) when is_binary(URL) -> uri_parse(binary_to_list(URL)); From ec36dd7ba1df049a95fe4b4f152f9197fe8db9dd Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 6 May 2022 14:03:11 +0200 Subject: [PATCH 306/440] make-binaries: Bump SQLite and ODBC versions --- tools/make-binaries | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index daab03d88..e813ece51 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -78,8 +78,8 @@ png_vsn='1.6.37' jpeg_vsn='9e' webp_vsn='1.2.2' gd_vsn='2.3.3' -odbc_vsn='2.3.10' -sqlite_vsn='3380300' +odbc_vsn='2.3.11' +sqlite_vsn='3380400' root_dir="${BUILD_DIR:-$HOME/build}" bootstrap_dir="$root_dir/bootstrap" ct_prefix_dir="$root_dir/x-tools" From d0452e3bef6f86a635f7749f49fd8a27006dbb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Sautret?= Date: Fri, 6 May 2022 15:12:22 +0200 Subject: [PATCH 307/440] Update version to 22.05 --- CONTAINER.md | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTAINER.md b/CONTAINER.md index 5c5ce62c5..cb32b4090 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -267,7 +267,7 @@ Build ejabberd Community Server base image for a given ejabberd version, both for amd64 and arm64 architectures: ```bash -VERSION = 21.12 +VERSION = 22.05 docker buildx build \ --platform=linux/amd64,linux/arm64 --build-arg VERSION=$(VERSION) \ diff --git a/configure.ac b/configure.ac index bbd9e9d5a..68fb1f4d2 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 21.12` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd]) +AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 22.05` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd]) REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)" REQUIRE_ERLANG_MAX="100.0.0 (No Max)" From fbeaa2e03a0a295301ff67e7e0ac1d452d55e3b2 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 May 2022 16:21:50 +0200 Subject: [PATCH 308/440] Remove dependabot because it gets fired in forks too --- .github/dependabot.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index c65905e20..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 2 - -updates: - - - package-ecosystem: "docker" - directory: "/.github/container/" - schedule: - interval: "weekly" - - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "mix" - directory: "/" - schedule: - interval: "weekly" From e5782a519a10bcf3ddc5a9efa96d467527edc794 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 May 2022 16:22:31 +0200 Subject: [PATCH 309/440] Use alternate method to get priv/ path when copying captcha scripts --- .github/container/Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 5b01c7393..a712f9b71 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -42,10 +42,9 @@ RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \ && mkdir -p /opt/ejabberd \ && mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf -RUN DESCRIBE=$(git describe --tags) \ - && MIXVER=$(echo $DESCRIBE.0 | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') \ - && mkdir /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin \ - && cp tools/captcha*.sh /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin/ +RUN BINPATH=$(dirname $(find /opt -name msgs))/bin/ \ + && mkdir $BINPATH \ + && cp tools/captcha*.sh $BINPATH RUN export PEM=/opt/ejabberd/conf/server.pem \ && curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \ From 3449621ccc97e99219400f5c15d4b354848c6a60 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 May 2022 17:28:11 +0200 Subject: [PATCH 310/440] Temporary workaround to provide a 22.05 tagged container --- .github/workflows/container.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 8ae2c6873..8b399ec38 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -65,4 +65,4 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64 push: true - tags: ${{ steps.meta.outputs.tags }} + tags: ghcr.io/processone/ejabberd:22.05,ghcr.io/processone/ejabberd:latest From 024ad021695b4d2776f09ab06d0273189d702b5f Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 May 2022 17:58:58 +0200 Subject: [PATCH 311/440] Revert "Temporary workaround to provide a 22.05 tagged container" This reverts commit 3449621ccc97e99219400f5c15d4b354848c6a60. --- .github/workflows/container.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 8b399ec38..8ae2c6873 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -65,4 +65,4 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64 push: true - tags: ghcr.io/processone/ejabberd:22.05,ghcr.io/processone/ejabberd:latest + tags: ${{ steps.meta.outputs.tags }} From ed7fc956d5c20cd5de9ca74c0c48378b929c95bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 9 May 2022 16:34:27 +0200 Subject: [PATCH 312/440] Allow muc_{un}subscribe hooks to modify sent packets --- src/mod_muc_room.erl | 70 ++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 5f160218c..f6a7d85b5 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1952,8 +1952,23 @@ set_subscriber(JID, Nick, Nodes, store_room(NewStateData, [{add_subscription, BareJID, Nick, Nodes}]), case not muc_subscribers_is_key(LBareJID, StateData#state.muc_subscribers) of true -> - send_subscriptions_change_notifications(BareJID, Nick, subscribe, NewStateData), - ejabberd_hooks:run(muc_subscribed, ServerHost, [ServerHost, Room, Host, BareJID]); + Packet1a = #message{ + sub_els = [#ps_event{ + items = #ps_items{ + node = ?NS_MUCSUB_NODES_SUBSCRIBERS, + items = [#ps_item{ + id = p1_rand:get_string(), + sub_els = [#muc_subscribe{jid = BareJID, nick = Nick}]}]}}]}, + Packet1b = #message{ + sub_els = [#ps_event{ + items = #ps_items{ + node = ?NS_MUCSUB_NODES_SUBSCRIBERS, + items = [#ps_item{ + id = p1_rand:get_string(), + sub_els = [#muc_subscribe{nick = Nick}]}]}}]}, + {Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_subscribed, ServerHost, {Packet1a, Packet1b}, + [ServerHost, Room, Host, BareJID]), + send_subscriptions_change_notifications(Packet2a, Packet2b, NewStateData); _ -> ok end, @@ -4526,8 +4541,23 @@ process_iq_mucsub(From, #iq{type = set, sub_els = [#muc_unsubscribe{}]}, {MUCSubscribers, #subscriber{nick = Nick}} -> NewStateData = StateData#state{muc_subscribers = MUCSubscribers}, store_room(NewStateData, [{del_subscription, LBareJID}]), - send_subscriptions_change_notifications(BareJID, Nick, unsubscribe, StateData), - ejabberd_hooks:run(muc_unsubscribed, ServerHost, [ServerHost, Room, Host, BareJID]), + Packet1a = #message{ + sub_els = [#ps_event{ + items = #ps_items{ + node = ?NS_MUCSUB_NODES_SUBSCRIBERS, + items = [#ps_item{ + id = p1_rand:get_string(), + sub_els = [#muc_subscribe{jid = BareJID, nick = Nick}]}]}}]}, + Packet1b = #message{ + sub_els = [#ps_event{ + items = #ps_items{ + node = ?NS_MUCSUB_NODES_SUBSCRIBERS, + items = [#ps_item{ + id = p1_rand:get_string(), + sub_els = [#muc_subscribe{nick = Nick}]}]}}]}, + {Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_unsubscribed, ServerHost, {Packet1a, Packet1b}, + [ServerHost, Room, Host, BareJID]), + send_subscriptions_change_notifications(Packet2a, Packet2b, StateData), NewStateData2 = case close_room_if_temporary_and_empty(NewStateData) of {stop, normal, _} -> stop; {next_state, normal_state, SD} -> SD @@ -5117,8 +5147,8 @@ store_room_no_checks(StateData, ChangesHints, Hibernation) -> make_opts(StateData, Hibernation), ChangesHints). --spec send_subscriptions_change_notifications(jid(), binary(), subscribe|unsubscribe, state()) -> ok. -send_subscriptions_change_notifications(From, Nick, Type, State) -> +-spec send_subscriptions_change_notifications(stanza(), stanza(), state()) -> ok. +send_subscriptions_change_notifications(Packet, PacketWithoutJid, State) -> {WJ, WN} = maps:fold( fun(_, #subscriber{jid = JID}, {WithJid, WithNick}) -> @@ -5134,37 +5164,13 @@ send_subscriptions_change_notifications(From, Nick, Type, State) -> muc_subscribers_get_by_node(?NS_MUCSUB_NODES_SUBSCRIBERS, State#state.muc_subscribers)), if WJ /= [] -> - Payload1 = case Type of - subscribe -> #muc_subscribe{jid = From, nick = Nick}; - _ -> #muc_unsubscribe{jid = From, nick = Nick} - end, - Packet1 = #message{ - sub_els = [#ps_event{ - items = #ps_items{ - node = ?NS_MUCSUB_NODES_SUBSCRIBERS, - items = [#ps_item{ - id = p1_rand:get_string(), - sub_els = [Payload1]}]}}]}, - Packet1a = xmpp:put_meta(Packet1, mucsub_subscriber_jid, From), ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WJ, Packet1a, false); + WJ, Packet, false); true -> ok end, if WN /= [] -> - Payload2 = case Type of - subscribe -> #muc_subscribe{nick = Nick}; - _ -> #muc_unsubscribe{nick = Nick} - end, - Packet2 = #message{ - sub_els = [#ps_event{ - items = #ps_items{ - node = ?NS_MUCSUB_NODES_SUBSCRIBERS, - items = [#ps_item{ - id = p1_rand:get_string(), - sub_els = [Payload2]}]}}]}, - Packet2a = xmpp:put_meta(Packet2, mucsub_subscriber_jid, From), ejabberd_router_multicast:route_multicast(State#state.jid, State#state.server_host, - WN, Packet2a, false); + WN, PacketWithoutJid, false); true -> ok end. From a916d94000df1bf748421a5e8b7d7df0b69f362d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 9 May 2022 17:32:34 +0200 Subject: [PATCH 313/440] Pass room state to muc_{un}subscribed hook --- src/mod_muc_room.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index f6a7d85b5..dda31aeb7 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1967,7 +1967,7 @@ set_subscriber(JID, Nick, Nodes, id = p1_rand:get_string(), sub_els = [#muc_subscribe{nick = Nick}]}]}}]}, {Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_subscribed, ServerHost, {Packet1a, Packet1b}, - [ServerHost, Room, Host, BareJID]), + [ServerHost, Room, Host, BareJID, StateData]), send_subscriptions_change_notifications(Packet2a, Packet2b, NewStateData); _ -> ok @@ -4556,7 +4556,7 @@ process_iq_mucsub(From, #iq{type = set, sub_els = [#muc_unsubscribe{}]}, id = p1_rand:get_string(), sub_els = [#muc_subscribe{nick = Nick}]}]}}]}, {Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_unsubscribed, ServerHost, {Packet1a, Packet1b}, - [ServerHost, Room, Host, BareJID]), + [ServerHost, Room, Host, BareJID, StateData]), send_subscriptions_change_notifications(Packet2a, Packet2b, StateData), NewStateData2 = case close_room_if_temporary_and_empty(NewStateData) of {stop, normal, _} -> stop; From 8addf96f9ed0bca07741e419728dcdadaa337c17 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Thu, 12 May 2022 01:02:33 +0200 Subject: [PATCH 314/440] make-binaries: Bump dependency versions --- .github/workflows/installers.yml | 2 +- tools/make-binaries | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index ad513df8d..5fe622411 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -27,7 +27,7 @@ jobs: uses: actions/cache@v3 with: path: ~/build/ - key: ${{runner.os}}-ct-ng-1.25.0-RC2 + key: ${{runner.os}}-ct-ng-1.25.0 - name: Install prerequisites run: | sudo apt-get -qq update diff --git a/tools/make-binaries b/tools/make-binaries index e813ece51..57aaaa7b6 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -65,7 +65,7 @@ fi rel_name='ejabberd' rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') mix_vsn=$(mix_version "$rel_vsn") -crosstool_vsn='1.25.0_rc2' +crosstool_vsn='1.25.0' termcap_vsn='1.3.1' expat_vsn='2.4.8' zlib_vsn='1.2.12' @@ -79,7 +79,7 @@ jpeg_vsn='9e' webp_vsn='1.2.2' gd_vsn='2.3.3' odbc_vsn='2.3.11' -sqlite_vsn='3380400' +sqlite_vsn='3380500' root_dir="${BUILD_DIR:-$HOME/build}" bootstrap_dir="$root_dir/bootstrap" ct_prefix_dir="$root_dir/x-tools" From 6d93d49c6c31f4ae96cdf47d0f8af7e070c42ed2 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 16 May 2022 00:13:43 +0200 Subject: [PATCH 315/440] make-installers: Apply cosmetic changes --- tools/make-installers | 53 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/tools/make-installers b/tools/make-installers index 3a95271a4..2530b4263 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -68,10 +68,12 @@ code_path="/opt/$rel_name-$rel_vsn" data_path="/opt/$rel_name" conf_path="$data_path/conf" pem_file="$conf_path/server.pem" -url='https://docs.ejabberd.im/admin/upgrade/#specific-version-upgrade-notes' -url_doc_admin='https://docs.ejabberd.im/admin/installation/#administration-account' +uninstall_file="$code_path/uninstall.txt" +home_url='https://www.ejabberd.im' +doc_url='https://docs.ejabberd.im' +upgrade_url="$doc_url/admin/upgrade/#specific-version-upgrade-notes" +admin_url="$doc_url/admin/installation/#administration-account" tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") -path_uninstall="$code_path/uninstall.txt" trap 'rm -rf "$tmp_dir"' INT TERM EXIT umask 022 @@ -82,13 +84,13 @@ create_help_file() cat >"$file" <<-EOF This is the $rel_name $rel_vsn-$iteration installer for linux-$arch - - Visit - https://www.ejabberd.im/ - - ejabberd Documentation site: - https://docs.ejabberd.im/ - + + Visit: + $home_url + + ejabberd documentation site: + $doc_url + EOF } @@ -210,22 +212,23 @@ create_setup_script() echo '$rel_name $rel_vsn has been installed successfully.' echo - echo >$path_uninstall - echo '# To uninstall ejabberd, first remove the service:' >>$path_uninstall - echo 'systemctl --now disable ejabberd' >>$path_uninstall - echo 'rm -rf /etc/systemd/system/ejabberd.service' >>$path_uninstall - echo >>$path_uninstall - echo '# Remove the binary files' >>$path_uninstall - echo 'rm -rf /opt/ejabberd-*' >>$path_uninstall - echo >>$path_uninstall - echo '# If you want to remove your config, database and logs:' >>$path_uninstall - echo 'rm -rf /opt/ejabberd' >>$path_uninstall + cat >'$uninstall_file' <<_EOF + # To uninstall ejabberd, first remove the service. If you're using systemd: + systemctl --now disable ejabberd + rm -f /etc/systemd/system/ejabberd.service + + # Remove the binary files: + rm -rf /opt/ejabberd-* + + # If you want to remove your configuration, database and logs: + rm -rf /opt/ejabberd + _EOF if [ \$is_upgrade = true ] then echo 'Please check the following web site for upgrade notes:' echo - echo '$url' + echo '$upgrade_url' echo echo 'If everything looks fine, restart the $rel_name service:' echo ' systemctl restart ejabberd' @@ -233,9 +236,10 @@ create_setup_script() echo 'Now you can check ejabberd is running correctly:' echo ' systemctl status ejabberd' echo - echo 'Next you may want to edit ejabberd.yml to setup hosts,' + echo 'Next you may want to edit ejabberd.yml to set up hosts,' echo 'register an account and grant it admin rigts, see:' - echo '$url_doc_admin' + echo + echo '$admin_url' fi EOF chmod +x "$dir/setup" @@ -252,7 +256,8 @@ do gzip -c -d <"$tgz_name" >"$tmp_dir/$tar_name" create_help_file "$tmp_dir/help.txt" create_setup_script "$tmp_dir" "$tar_name" - "$makeself" --help-header "$tmp_dir/help.txt" "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' + "$makeself" --help-header "$tmp_dir/help.txt" \ + "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' find "$tmp_dir" -mindepth 1 -delete done echo "$myself: Created installers successfully." From c54fe5b29e5f61afddcb98a46c59cbec36860de7 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 16 May 2022 00:45:01 +0200 Subject: [PATCH 316/440] make-installers: Override code on upgrade Use tar's --skip-old-files option for the data directory (/opt/ejabberd) only. Files in the code directory (/opt/ejabberd-$version) should be overridden on upgrade. --- tools/make-installers | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/make-installers b/tools/make-installers index 2530b4263..98540dd34 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -97,7 +97,6 @@ create_help_file() create_setup_script() { local dir="$1" - local tarball="$2" cat >"$dir/setup" <<-EOF #!/bin/sh @@ -176,7 +175,9 @@ create_setup_script() then host='localhost' fi - tar --skip-old-files -C "\$(dirname '$code_path')" -xf '$tarball' + (tar -cf - '$rel_name' | tar --skip-old-files -C "\$(dirname '$code_path')" -xpf -) + (tar -cf - '$rel_name-$rel_vsn' | tar -C "\$(dirname '$code_path')" -xpf -) + chown -R -h 'root:root' '$code_path' chown 'root:$rel_name' '$code_path/lib/epam-'*'/priv/bin/epam' chmod '4750' '$code_path/lib/epam-'*'/priv/bin/epam' @@ -247,15 +248,14 @@ create_setup_script() for arch in $architectures do - tar_name="$rel_name-$rel_vsn-linux-$arch.tar" - tgz_name="$tar_name.gz" + tar_name="$rel_name-$rel_vsn-linux-$arch.tar.gz" installer_name="$rel_name-$rel_vsn-$iteration-linux-$arch.run" - test -e "$tgz_name" || tools/make-binaries + test -e "$tar_name" || tools/make-binaries echo "$myself: Putting together installer for $arch ..." - gzip -c -d <"$tgz_name" >"$tmp_dir/$tar_name" + tar -xzpf "$tar_name" create_help_file "$tmp_dir/help.txt" - create_setup_script "$tmp_dir" "$tar_name" + create_setup_script "$tmp_dir" "$makeself" --help-header "$tmp_dir/help.txt" \ "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' find "$tmp_dir" -mindepth 1 -delete From 861347e911925edfcaa8543fc86ccc253373259d Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 6 May 2022 10:52:11 +0200 Subject: [PATCH 317/440] CHANGELOG: Update to 22.05 version --- CHANGELOG.md | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f804a359..e1435ed1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,108 @@ +# Version 22.05 + +Core +- C2S: Don't expect that socket will be available in `c2s_terminated` hook +- Event handling process hook tracing +- Guard agains `erlang:system_info(logical_processors)` not always returning number +- `domain_balancing`: Allow for specifying `type` only, without specifying `component_number` + +MQTT +- Add TLS certificate authentication for MQTT connections +- Fix login when generating client id, keep connection record (#3593) +- Pass property name as expected in mqtt_codec (fixes login using MQTT 5) +- Support MQTT subscriptions spread over the cluster (#3750) + +MUC +- Attach meta field with real jid to mucsub subscription events +- Handle user removal +- Stop empty MUC rooms 30 seconds after creation +- `default_room_options`: Update options configurable +- `subscribe_room_many_max_users`: New option in `mod_muc_admin` + +mod_conversejs +- Improved options to support `@HOST@` and `auto` values +- Set `auth` and `register` options based on ejabberd configuration +- `conversejs_options`: New option +- `conversejs_resources`: New option + +PubSub +- `mod_pubsub`: Allow for limiting `item_expire` value +- `mod_pubsub`: Unsubscribe JID on whitelist removal +- `node_pep`: Add config-node and multi-items features (#3714) + +SQL +- Improve compatibility with various db engine versions +- Sync old-to-new schema script with reality (#3790) +- Slight improvement in MSSQL testing support, but not yet complete + +Other Modules +- `auth_jwt`: Checking users is active in SM for JWT authenticated user (#3795) +- `mod_configure`: Implement Get List of Registered/Online Users from XEP-0133 +- `mod_host_meta`: New module to serve host-meta files, see XEP-0156 +- `mod_mam`: Store all mucsub notifications not only message notifications +- `mod_ping`: Delete ping timer if resource is gone after the ping has been sent +- `mod_ping`: Don't send ping if resource is gone +- `mod_push`: Fix notifications for pending sessions (XEP-0198) +- `mod_push`: Keep push session ID on session resume +- `mod_shared_roster`: Adjust special group cache size +- `mod_shared_roster`: Normalize JID on unset_presence (#3752) +- `mod_stun_disco`: Fix parsing of IPv6 listeners + +Dependencies +- autoconf: Supported from 2.59 to the new 2.71 +- fast_tls: Update to 1.1.14 to support OpenSSL 3 +- jiffy: Update to 1.1.1 to support Erlang/OTP 25.0-rc1 +- luerl: Update to 1.0.0, now available in hex.pm +- lager: This dependency is used only when Erlang is older than 22 +- rebar2: Updated binary to work from Erlang/OTP 22 to 25 +- rebar3: Updated binary to work from Erlang/OTP 22 to 25 +- `make update`: Fix when used with rebar 3.18 + +Compile +- `mix release`: Copy `include/` files for ejabberd, deps and otp, in `mix.exs` +- `rebar3 release`: Fix ERTS path in `ejabberdctl` +- `configure.ac`: Set default ejabberd version number when not using git +- `mix.exs`: Move some dependencies as optional +- `mix.exs`: No need to use Distillery, Elixir has built-in support for OTP releases (#3788) +- `tools/make-binaries`: New script for building Linux binaries +- `tools/make-installers`: New script for building command line installers + +Start +- New `make relive` similar to `ejabberdctl live` without installing +- `ejabberdctl`: Fix some warnings detected by ShellCheck +- `ejabberdctl`: Mention in the help: `etop`, `ping` and `started`/`stopped` +- `make rel`: Switch to paths: `conf/`, `database/`, `logs/` +- `mix.exs`: Add `-boot` and `-boot_var` in `ejabberdctl` instead of adding `vm.args` +- `tools/captcha.sh`: Fix some warnings detected by ShellCheck + +Commands +- Accept more types of ejabberdctl commands arguments as JSON-encoded +- `delete_old_mam_messages_batch`: New command with rate limit +- `delete_old_messages_batch`: New command with rate limit +- `get_room_occupants_number`: Don't request the whole MUC room state (#3684, #1964) +- `get_vcard`: Add support for MUC room vCard +- `oauth_revoke_token`: Add support to work with all backends +- `room_unused_*`: Optimize commands in SQL by reusing `created_at` +- `rooms_unused_...`: Let `get_all_rooms` handle `global` argument (#3726) +- `stop|restart`: Terminate ejabberd_sm before everything else to ensure sessions closing (#3641) +- `subscribe_room_many`: New command + +Translations +- Updated Catalan +- Updated French +- Updated German +- Updated Portuguese +- Updated Portuguese (Brazil) +- Updated Spanish + +Workflows +- CI: Publish CT logs and Cover on failure to an external GH Pages repo +- CI: Test shell scripts using ShellCheck (#3738) +- Container: New workflow to build and publish containers +- Installers: Add job to create draft release +- Installers: New workflow to build binary packages +- Runtime: New workflow to test compilation, rel, starting and ejabberdctl + # Version 21.12 Commands From 6c9f97d7cc847a4ad395e194d0f4d77fad51372c Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 11 May 2022 18:21:58 +0200 Subject: [PATCH 318/440] Update README.md, the installers are now in GitHub Releases --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e40f7701b..7d526ee55 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ Installation There are several ways to install ejabberd: - Source code: compile yourself, see [COMPILE](COMPILE.md) -- Installers from [ProcessOne Downloads][p1dl] (run/deb/rpm for x64) - Installers from [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64) - Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64) - Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64) @@ -117,7 +116,6 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI [muc]: xmpp:ejabberd@conference.process-one.net [osp]: https://docs.ejabberd.im/admin/installation/#operating-system-packages [p1contact]: https://www.process-one.net/en/company/contact/ -[p1dl]: https://www.process-one.net/en/ejabberd/downloads/ [p1home]: https://www.process-one.net/en/ejabberd/ [packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd [releases]: https://github.com/processone/ejabberd/releases From 78e97f36050c52190769ef73574e8cd40a4c0b29 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 12 May 2022 16:26:55 +0200 Subject: [PATCH 319/440] ex_doc is required to publish docs to hex.pm Revert "Let's assume ex_doc is no longer needed" This reverts commit 2f92dc40dfe4a637cc51663a3b441ea62bf335f7. --- mix.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/mix.exs b/mix.exs index d73489797..003a48e91 100644 --- a/mix.exs +++ b/mix.exs @@ -101,6 +101,7 @@ defmodule Ejabberd.MixProject do [{:base64url, "~> 1.0"}, {:cache_tab, "~> 1.0"}, {:eimp, "~> 1.0"}, + {:ex_doc, ">= 0.0.0", only: :dev}, {:fast_tls, "~> 1.1"}, {:fast_xml, "~> 1.1"}, {:fast_yaml, "~> 1.0"}, From dde096515dea559a50df4cc6a067b9dba871e30d Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 12 May 2022 16:31:23 +0200 Subject: [PATCH 320/440] Update mix.lock with ex_doc --- mix.lock | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mix.lock b/mix.lock index 54d08fb1d..2b9e73b64 100644 --- a/mix.lock +++ b/mix.lock @@ -1,10 +1,12 @@ %{ "base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"}, "cache_tab": {:hex, :cache_tab, "1.0.30", "6d35eecfb65fbe5fc85988503a27338d32de01243f3fc8ea3ee7161af08725a4", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6d8a5e00d8f84c42627706a6dbedb02e34d58495f3ed61935c8475ca0531cda0"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"}, "eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, "esip": {:hex, :esip, "1.0.47", "fdd483ca7e9e46a6d5a62937cbacb147adbe0bdfca5ebc59774cc0a1afa381be", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.2", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "99e703c49e8d325b24cb147c5087151c196406e8572e3a33db95099991fe8f3e"}, + "ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"}, "ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"}, "fast_tls": {:hex, :fast_tls, "1.1.15", "398e7ba1076db139307ebea839428e2836ab682e4dac61d95b4705a26aff06b7", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "ef516aa226de9a4605704c18499284cd4fc115a73bd72490341972ce0c2b4d30"}, "fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"}, @@ -13,7 +15,11 @@ "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"}, + "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"}, "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"}, From 01b791c0fa73058c109e0c10b523b4c6cca8e470 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 12 May 2022 16:30:58 +0200 Subject: [PATCH 321/440] Define license for hex.pm using SPDX identifier Until now, when publishing package to hex.pm, it complained: > The following licenses are not recognized by SPDX: > * GPLv2 > Consider using licenses from https://spdx.org/licenses --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 003a48e91..b3348a6ec 100644 --- a/mix.exs +++ b/mix.exs @@ -164,7 +164,7 @@ defmodule Ejabberd.MixProject do "COPYING", "README.md", "mix.exs", "rebar.config", "rebar.config.script", "vars.config"], maintainers: ["ProcessOne"], - licenses: ["GPLv2"], + licenses: ["GPL-2.0-or-later"], links: %{"Site" => "https://www.ejabberd.im", "Documentation" => "http://docs.ejabberd.im", "Source" => "https://github.com/processone/ejabberd", From 4f8e6fe844804fba59904702d0ef2688958e8852 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 12 May 2022 17:25:11 +0200 Subject: [PATCH 322/440] Fix errors and warnings for "rebar3 edoc" --- src/ejabberd.erl | 2 +- src/ejabberd_auth_ldap.erl | 1 - src/ejabberd_ctl.erl | 18 +++++++++++------- src/ejabberd_logger.erl | 7 ------- src/ejabberd_piefxis.erl | 7 ------- src/ejabberd_s2s.erl | 6 ++---- src/ejabberd_sql.erl | 5 +++-- src/ejabberd_web_admin.erl | 37 +++++++++++++++++++------------------ src/mod_admin_extra.erl | 3 ++- src/mod_http_fileserver.erl | 7 +++++-- src/mod_mqtt_session.erl | 2 +- src/mod_muc_admin.erl | 10 ++++------ src/mod_pubsub.erl | 5 ----- src/mod_roster_mnesia.erl | 1 - src/mod_shared_roster.erl | 6 ++++-- 15 files changed, 52 insertions(+), 65 deletions(-) diff --git a/src/ejabberd.erl b/src/ejabberd.erl index d39af1400..048eb7d98 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -52,7 +52,7 @@ halt() -> ejabberd_logger:flush(), erlang:halt(1, [{flush, true}]). -%% @spec () -> false | string() +-spec get_pid_file() -> false | string(). get_pid_file() -> case os:getenv("EJABBERD_PID_PATH") of false -> diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index 1c3143241..9195d2498 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -151,7 +151,6 @@ get_users(Server, []) -> count_users(Server, Opts) -> length(get_users(Server, Opts)). -%% @spec (User, Server) -> true | false | {error, Error} user_exists(User, Server) -> case catch user_exists_ldap(User, Server) of {'EXIT', _Error} -> {nocache, {error, db_failure}}; diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 057cff66c..e715aac00 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -218,11 +218,11 @@ process(Args, Version) -> end, Code. -%% @spec (Args::[string()], AccessCommands) -> {String::string(), Code::integer()} +-spec process2(Args::[string()], AccessCommands::any()) -> + {String::string(), Code::integer()}. process2(Args, AccessCommands) -> process2(Args, AccessCommands, ?DEFAULT_VERSION). -%% @spec (Args::[string()], AccessCommands, Version) -> {String::string(), Code::integer()} process2(["--auth", User, Server, Pass | Args], AccessCommands, Version) -> process2(Args, AccessCommands, {list_to_binary(User), list_to_binary(Server), list_to_binary(Pass), true}, Version); @@ -271,7 +271,6 @@ determine_string_type(String, Version) -> %% Command calling %%----------------------------- -%% @spec (Args::[string()], Auth, AccessCommands, Version) -> string() | integer() | {string(), integer()} try_run_ctp(Args, Auth, AccessCommands, Version) -> try ejabberd_hooks:run_fold(ejabberd_ctl_process, false, [Args]) of false when Args /= [] -> @@ -292,7 +291,6 @@ try_run_ctp(Args, Auth, AccessCommands, Version) -> {io_lib:format("Error in ejabberd ctl process: '~p' ~p", [Error, Why]), ?STATUS_USAGE} end. -%% @spec (Args::[string()], Auth, AccessCommands, Version) -> string() | integer() | {string(), integer()} try_call_command(Args, Auth, AccessCommands, Version) -> try call_command(Args, Auth, AccessCommands, Version) of {Reason, wrong_command_arguments} -> @@ -316,7 +314,11 @@ try_call_command(Args, Auth, AccessCommands, Version) -> ?STATUS_ERROR} end. -%% @spec (Args::[string()], Auth, AccessCommands, Version) -> string() | integer() | {string(), integer()} | {error, ErrorType} +-spec call_command(Args::[string()], + Auth::noauth | {binary(), binary(), binary(), true}, + AccessCommands::[any()], + Version::integer()) -> + string() | integer() | {string(), integer()} | {error, ErrorType::any()}. call_command([CmdString | Args], Auth, _AccessCommands, Version) -> CmdStringU = ejabberd_regexp:greplace( list_to_binary(CmdString), <<"-">>, <<"_">>), @@ -768,7 +770,8 @@ print_usage_help(MaxC, ShCode) -> %% Print usage command %%----------------------------- -%% @spec (CmdSubString::string(), MaxC::integer(), ShCode::boolean(), Version) -> ok +-spec print_usage_commands2(CmdSubString::string(), MaxC::integer(), + ShCode::boolean(), Version::integer()) -> ok. print_usage_commands2(CmdSubString, MaxC, ShCode, Version) -> %% Get which command names match this substring AllCommandsNames = [atom_to_list(Name) || {Name, _, _} <- ejabberd_commands:list_commands(Version)], @@ -814,7 +817,8 @@ filter_commands_regexp(All, Glob) -> end, All). -%% @spec (Cmd::string(), MaxC::integer(), ShCode::boolean(), Version) -> ok +-spec print_usage_command(Cmd::string(), MaxC::integer(), + ShCode::boolean(), Version::integer()) -> ok. print_usage_command(Cmd, MaxC, ShCode, Version) -> Name = list_to_atom(Cmd), C = ejabberd_commands:get_command_definition(Name, Version), diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl index 217b232fa..e4fe34e0e 100644 --- a/src/ejabberd_logger.erl +++ b/src/ejabberd_logger.erl @@ -113,7 +113,6 @@ get_string_env(Name, Default) -> Default end. --spec start() -> ok. start() -> start(info). @@ -181,17 +180,14 @@ do_start(Level) -> lager:set_loghwm(Handler, LogRateLimit) end, gen_event:which_handlers(lager_event)). --spec restart() -> ok. restart() -> Level = ejabberd_option:loglevel(), application:stop(lager), start(Level). --spec reopen_log() -> ok. reopen_log() -> ok. --spec rotate_log() -> ok. rotate_log() -> catch lager_crash_log ! rotate, lists:foreach( @@ -201,7 +197,6 @@ rotate_log() -> ok end, gen_event:which_handlers(lager_event)). --spec get() -> loglevel(). get() -> Handlers = get_lager_handlers(), lists:foldl(fun(lager_console_backend, _Acc) -> @@ -213,7 +208,6 @@ get() -> end, none, Handlers). --spec set(0..5 | loglevel()) -> ok. set(N) when is_integer(N), N>=0, N=<5 -> set(convert_loglevel(N)); set(Level) when ?is_loglevel(Level) -> @@ -255,7 +249,6 @@ get_lager_version() -> false -> "0.0.0" end. --spec flush() -> ok. flush() -> application:stop(lager), application:stop(sasl). diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index add52770d..8f45efa99 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -642,33 +642,26 @@ make_host_filename(FnT, Host) -> make_host_basefilename(Dir, FnT) -> filename:join([Dir, FnT]). -%% @spec () -> string() make_piefxis_xml_head() -> "". -%% @spec () -> string() make_piefxis_xml_tail() -> "". -%% @spec () -> string() make_piefxis_server_head() -> io_lib:format("", [?NS_PIE, ?NS_XI]). -%% @spec () -> string() make_piefxis_server_tail() -> "". -%% @spec (Host::string()) -> string() make_piefxis_host_head(Host) -> io_lib:format("", [?NS_PIE, ?NS_XI, Host]). -%% @spec () -> string() make_piefxis_host_tail() -> "". -%% @spec (Fn::string()) -> string() make_xinclude(Fn) -> Base = filename:basename(Fn), io_lib:format("", [Base]). diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 9b40ad717..b2b078098 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -589,10 +589,8 @@ allow_host1(MyHost, S2SHost) -> end end. -%% Get information about S2S connections of the specified type. -%% @spec (Type) -> [Info] -%% where Type = in | out -%% Info = [{InfoName::atom(), InfoValue::any()}] +%% @doc Get information about S2S connections of the specified type. +-spec get_info_s2s_connections(Type::in | out) -> [[{InfoName::atom(), InfoValue::any()}]]. get_info_s2s_connections(Type) -> ChildType = case Type of in -> ejabberd_s2s_in_sup; diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index d68d1a8e1..d0f7c658f 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -488,8 +488,9 @@ run_sql_cmd(Command, From, State, Timestamp) -> abort_on_driver_error(outer_op(Command), From, Timestamp) end. -%% Only called by handle_call, only handles top level operations. -%% @spec outer_op(Op) -> {error, Reason} | {aborted, Reason} | {atomic, Result} +%% @doc Only called by handle_call, only handles top level operations. +-spec outer_op(Op::{atom(), binary()}) -> + {error, Reason::binary()} | {aborted, Reason::binary()} | {atomic, Result::any()}. outer_op({sql_query, Query}) -> sql_query_internal(Query); outer_op({sql_transaction, F}) -> diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 7691dd794..46598e1ef 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -52,8 +52,8 @@ %%%================================== %%%% get_acl_access -%% @spec (Path::[string()], Method) -> {HostOfRule, [AccessRule]} -%% where Method = 'GET' | 'POST' +-spec get_acl_rule(Path::[binary()], 'GET' | 'POST') -> + {HostOfRule::binary(), [AccessRule::atom()]}. %% All accounts can access those URLs get_acl_rule([], _) -> {<<"localhost">>, [all]}; @@ -275,10 +275,13 @@ get_auth_account2(HostOfRule, AccessRule, User, Server, make_xhtml(Els, Host, Lang, JID, Level) -> make_xhtml(Els, Host, cluster, Lang, JID, Level). -%% @spec (Els, Host, Node, Lang, JID, Level::integer()) -> {200, [html], xmlelement()} -%% where Host = global | string() -%% Node = cluster | atom() -%% JID = jid() +-spec make_xhtml([xmlel()], + Host::global | binary(), + Node::cluster | atom(), + Lang::binary(), + jid(), + Level::integer()) -> + {200, [html], xmlel()}. make_xhtml(Els, Host, Node, Lang, JID, Level) -> Base = get_base_path_sum(0, 0, Level), MenuItems = make_navigation(Host, Node, Lang, JID, Level), @@ -1877,18 +1880,15 @@ get_table_content(Node, Table, _Type, PageNumber, PageSize) -> %%%================================== %%%% navigation menu -%% @spec (Host, Node, Lang, JID::jid(), Level::integer()) -> [LI] make_navigation(Host, Node, Lang, JID, Level) -> Menu = make_navigation_menu(Host, Node, Lang, JID, Level), make_menu_items(Lang, Menu). -%% @spec (Host, Node, Lang, JID::jid(), Level::integer()) -> Menu -%% where Host = global | string() -%% Node = cluster | string() -%% Lang = string() -%% Menu = {URL, Title} | {URL, Title, [Menu]} -%% URL = string() -%% Title = string() +-spec make_navigation_menu(Host::global | binary(), + Node::cluster | atom(), + Lang::binary(), JID::jid(), Level::integer()) -> + Menu::{URL::binary(), Title::binary()} + | {URL::binary(), Title::binary(), [Menu::any()]}. make_navigation_menu(Host, Node, Lang, JID, Level) -> HostNodeMenu = make_host_node_menu(Host, Node, Lang, JID, Level), @@ -1897,7 +1897,6 @@ make_navigation_menu(Host, Node, Lang, JID, Level) -> NodeMenu = make_node_menu(Host, Node, Lang, Level), make_server_menu(HostMenu, NodeMenu, Lang, JID, Level). -%% @spec (Host, Node, Base, Lang) -> [LI] make_menu_items(global, cluster, Base, Lang) -> HookItems = get_menu_items_hook(server, Lang), make_menu_items(Lang, {Base, <<"">>, HookItems}); @@ -1978,9 +1977,11 @@ get_menu_items_hook({node, Node}, Lang) -> get_menu_items_hook(server, Lang) -> ejabberd_hooks:run_fold(webadmin_menu_main, [], [Lang]). -%% @spec (Lang::string(), Menu) -> [LI] -%% where Menu = {MURI::string(), MName::string(), Items::[Item]} -%% Item = {IURI::string(), IName::string()} | {IURI::string(), IName::string(), Menu} +-spec make_menu_items(Lang::binary(), + {MURI::binary(), MName::binary(), + Items::[{IURI::binary(), IName::binary()} + | {IURI::binary(), IName::binary(), Menu::any()}]}) -> + [xmlel()]. make_menu_items(Lang, Menu) -> lists:reverse(make_menu_items2(Lang, 1, Menu)). diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index cc1996bbd..19aa983f5 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -1538,7 +1538,8 @@ srg_user_del(User, Host, Group, GroupHost) -> %%% %% @doc Send a message to an XMPP account. -%% @spec (Type::binary(), From::binary(), To::binary(), Subject::binary(), Body::binary()) -> ok +-spec send_message(Type::binary(), From::binary(), To::binary(), + Subject::binary(), Body::binary()) -> ok. send_message(Type, From, To, Subject, Body) -> CodecOpts = ejabberd_config:codec_options(), try xmpp:decode( diff --git a/src/mod_http_fileserver.erl b/src/mod_http_fileserver.erl index d20d626bd..9177552a3 100644 --- a/src/mod_http_fileserver.erl +++ b/src/mod_http_fileserver.erl @@ -151,7 +151,9 @@ initialize(Host, Opts) -> content_types = ContentTypes, user_access = UserAccess}. -%% @spec (AdminCTs::[CT], Default::[CT]) -> [CT] +-spec build_list_content_types(AdminCTs::[{binary(), binary()|undefined}], + Default::[{binary(), binary()|undefined}]) -> + [{string(), string()|undefined}]. %% where CT = {Extension::string(), Value} %% Value = string() | undefined %% @doc Return a unified list without duplicates. @@ -265,7 +267,8 @@ code_change(_OldVsn, State, _Extra) -> %% request_handlers callbacks %%==================================================================== -%% @spec (LocalPath, Request) -> {HTTPCode::integer(), [Header], Page::string()} +-spec process(LocalPath::[binary()], #request{}) -> + {HTTPCode::integer(), [{binary(), binary()}], Page::string()}. %% @doc Handle an HTTP request. %% LocalPath is the part of the requested URL path that is "local to the module". %% Returns the page to be sent back to the client and/or HTTP status code. diff --git a/src/mod_mqtt_session.erl b/src/mod_mqtt_session.erl index 6a551f00f..9b8c6ed44 100644 --- a/src/mod_mqtt_session.erl +++ b/src/mod_mqtt_session.erl @@ -436,7 +436,7 @@ upgrade_state(State) -> upgrade_state(setelement(2, State1, VSN+1)) end. --spec upgrade_state(tuple(), 1..?VSN) -> tuple(). +-spec upgrade_state(tuple(), integer()) -> tuple(). upgrade_state(OldState, 1) -> %% Appending 'tls' field erlang:append_element(OldState, false); diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 891f55e96..9651cfe11 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -695,8 +695,7 @@ justcreated_to_binary(J) when is_atom(J) -> %% Create/Delete Room %%---------------------------- -%% @spec (Name::binary(), Host::binary(), ServerHost::binary()) -> -%% ok | error +-spec create_room(Name::binary(), Host::binary(), ServerHost::binary()) -> ok | error. %% @doc Create a room immediately with the default options. create_room(Name1, Host1, ServerHost) -> create_room_with_opts(Name1, Host1, ServerHost, []). @@ -747,8 +746,7 @@ muc_create_room(ServerHost, {Name, Host, _}, DefRoomOpts) -> io:format("Creating room ~ts@~ts~n", [Name, Host]), mod_muc:store_room(ServerHost, Host, Name, DefRoomOpts). -%% @spec (Name::binary(), Host::binary()) -> -%% ok | {error, room_not_exists} +-spec destroy_room(Name::binary(), Host::binary()) -> ok | {error, room_not_exists}. %% @doc Destroy the room immediately. %% If the room has participants, they are not notified that the room was destroyed; %% they will notice when they try to chat and receive an error that the room doesn't exist. @@ -1116,8 +1114,8 @@ send_direct_invitation(FromJid, UserJid, Msg) -> %% Change Room Option %%---------------------------- -%% @spec(Name::string(), Service::string(), Option::string(), Value) -> ok -%% Value = atom() | integer() | string() +-spec change_room_option(Name::binary(), Service::binary(), Option::binary(), + Value::atom() | integer() | string()) -> ok | mod_muc_log_not_enabled. %% @doc Change an option in an existing room. %% Requires the name of the room, the MUC service where it exists, %% the option to change (for example title or max_users), diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 0aa4d1afc..2eff16bfe 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3414,11 +3414,6 @@ node_config(Node, ServerHost, [{RE, Opts}|NodeOpts]) -> node_config(_, _, []) -> []. -%% @spec (Host, Options) -> MaxItems -%% Host = host() -%% Options = [Option] -%% Option = {Key::atom(), Value::term()} -%% MaxItems = integer() | unlimited %% @doc

    Return the maximum number of items for a given node.

    %%

    Unlimited means that there is no limit in the number of items that can %% be stored.

    diff --git a/src/mod_roster_mnesia.erl b/src/mod_roster_mnesia.erl index e42367b1f..19f602f1e 100644 --- a/src/mod_roster_mnesia.erl +++ b/src/mod_roster_mnesia.erl @@ -194,7 +194,6 @@ process_rosteritems(ActionS, SubsS, AsksS, UsersS, ContactsS) -> ), rosteritem_purge({Action, Subs, Asks, Users, Contacts}). -%% @spec ({Action::atom(), Subs::[atom()], Asks::[atom()], User::string(), Contact::string()}) -> {atomic, ok} rosteritem_purge(Options) -> Num_rosteritems = mnesia:table_info(roster, size), io:format("There are ~p roster items in total.~n", [Num_rosteritems]), diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 1960835a1..333a64a45 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -512,7 +512,8 @@ get_group_opt_cached(Host, Group, Opt, Default, Cache) -> proplists:get_value(Opt, Opts, Default) end. -%% @spec (Host::string(), Group::string(), Opt::atom(), Default) -> OptValue | Default +-spec get_group_opt(Host::binary(), Group::binary(), displayed_groups | label, Default) -> + OptValue::any() | Default. get_group_opt(Host, Group, Opt, Default) -> case get_group_opts(Host, Group) of error -> Default; @@ -687,7 +688,8 @@ is_user_in_group(US, Group, Host) -> true end. -%% @spec (Host::string(), {User::string(), Server::string()}, Group::string()) -> {atomic, ok} | error +-spec add_user_to_group(Host::binary(), {User::binary(), Server::binary()}, + Group::binary()) -> {atomic, ok} | error. add_user_to_group(Host, US, Group) -> {_LUser, LServer} = US, case lists:member(LServer, ejabberd_config:get_option(hosts)) of From 432e97296c574cad9844ddb2580c5d085d6cd80f Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 17 May 2022 09:15:48 +0000 Subject: [PATCH 323/440] Fix typos in changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1435ed1a..758bddc0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Core - C2S: Don't expect that socket will be available in `c2s_terminated` hook - Event handling process hook tracing -- Guard agains `erlang:system_info(logical_processors)` not always returning number +- Guard against `erlang:system_info(logical_processors)` not always returning a number - `domain_balancing`: Allow for specifying `type` only, without specifying `component_number` MQTT @@ -36,7 +36,7 @@ SQL - Slight improvement in MSSQL testing support, but not yet complete Other Modules -- `auth_jwt`: Checking users is active in SM for JWT authenticated user (#3795) +- `auth_jwt`: Checking if an user is active in SM for a JWT authenticated user (#3795) - `mod_configure`: Implement Get List of Registered/Online Users from XEP-0133 - `mod_host_meta`: New module to serve host-meta files, see XEP-0156 - `mod_mam`: Store all mucsub notifications not only message notifications From 621445e0965747da69609ffe747527326139685b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 16 May 2022 01:58:17 +0200 Subject: [PATCH 324/440] make-installers: Support non-root installation If the installer is invoked without superuser privileges, warn the user, ask for the installation prefix, and perform a local installation on confirmation. --- tools/make-installers | 240 ++++++++++++++++++++++++++++++------------ 1 file changed, 173 insertions(+), 67 deletions(-) diff --git a/tools/make-installers b/tools/make-installers index 98540dd34..d54a90bd8 100755 --- a/tools/make-installers +++ b/tools/make-installers @@ -64,15 +64,12 @@ fi rel_name='ejabberd' rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') -code_path="/opt/$rel_name-$rel_vsn" -data_path="/opt/$rel_name" -conf_path="$data_path/conf" -pem_file="$conf_path/server.pem" -uninstall_file="$code_path/uninstall.txt" home_url='https://www.ejabberd.im' doc_url='https://docs.ejabberd.im' upgrade_url="$doc_url/admin/upgrade/#specific-version-upgrade-notes" admin_url="$doc_url/admin/installation/#administration-account" +default_code_dir="/opt/$rel_name-$rel_vsn" +default_data_dir="/opt/$rel_name" tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") trap 'rm -rf "$tmp_dir"' INT TERM EXIT @@ -113,51 +110,101 @@ create_setup_script() if [ -t 0 ] then read -p "\$question (y/n) [n] " response - response="\$(printf '%s' "\$response" | - tr '[:upper:]' '[:lower:]')" - if [ "\$response" = 'y' ] || [ "\$response" = 'yes' ] - then return 0 - else return 1 - fi + case "\$response" in + [Yy]|[Yy][Ee][Ss]) + return 0 + ;; + [Nn]|[Nn][Oo]|'') + return 1 + ;; + *) + echo 'Please respond with "yes" or "no".' + user_agrees "\$question" + ;; + esac else # Assume 'yes' if not running interactively. return 0 fi } - if [ \$(id -u) != 0 ] + if [ \$(id -u) = 0 ] then - echo >&2 'The installer must be run with superuser privileges.' - exit 1 + is_superuser=true + else + is_superuser=false + echo "Running without superuser privileges (installer wasn't invoked" + echo 'with "sudo"), cannot perform system-wide installation this way.' + if ! user_agrees 'Continue anyway?' + then + echo 'Aborting installation.' + exit 1 + fi fi + if [ \$is_superuser = true ] + then + code_dir='$default_code_dir' + data_dir='$default_data_dir' + user_name='$rel_name' + group_name='$rel_name' + elif user_agrees "Install $rel_name below \$HOME/opt?" + then + code_dir="\$HOME/opt/$rel_name-$rel_vsn" + data_dir="\$HOME/opt/$rel_name" + user_name="\$(id -u -n)" + group_name="\$(id -g -n)" + else + read -p 'Installation prefix: ' prefix + if printf '%s' "\$prefix" | grep -q '^/' + then + code_dir="\$prefix/$rel_name-$rel_vsn" + data_dir="\$prefix/$rel_name" + user_name="\$(id -u -n)" + group_name="\$(id -g -n)" + else + echo >&2 'Prefix must be specified as an absolute path.' + echo >&2 'Aborting installation.' + exit 1 + fi + fi + + prefix="\$(dirname "\$code_dir")" + conf_dir="\$data_dir/conf" + pem_file="\$conf_dir/server.pem" + uninstall_file="\$code_dir/uninstall.txt" + if [ -e '/run/systemd/system' ] then is_systemd=true else is_systemd=false fi - if [ -e '$data_path' ] + if [ -e "\$data_dir" ] then is_upgrade=true else is_upgrade=false fi - if id -u '$rel_name' >'/dev/null' 2>&1 + if id -u "\$user_name" >'/dev/null' 2>&1 then user_exists=true else user_exists=false fi echo echo 'The following installation paths will be used:' - echo '- $code_path' + echo "- \$code_dir" if [ \$is_upgrade = true ] - then echo "- $data_path (existing files won't be modified)" - else echo '- $data_path' + then echo "- \$data_dir (existing files won't be modified)" + else echo "- \$data_dir (for configuration, database, and log files)" fi - if [ \$is_systemd = true ] - then echo '- /etc/systemd/system/$rel_name.service' - fi - if [ \$user_exists = false ] - then echo 'The $rel_name user is going to be created.' - fi - if [ \$is_systemd = true ] && [ \$is_upgrade = false ] - then echo 'The $rel_name service is going to be enabled and started.' + if [ \$is_superuser = true ] + then + if [ \$is_systemd = true ] + then + echo '- /etc/systemd/system/$rel_name.service' + if [ \$is_upgrade = false ] + then echo 'The $rel_name service is going to be enabled and started.' + fi + fi + if [ \$user_exists = false ] + then echo 'The $rel_name user is going to be created.' + fi fi if ! user_agrees 'Install $rel_name $rel_vsn now?' then @@ -166,8 +213,8 @@ create_setup_script() fi echo - if [ \$user_exists = false ] - then useradd -r -d '$data_path' '$rel_name' + if [ \$user_exists = false ] && [ \$is_superuser = true ] + then useradd -r -d "\$data_dir" "\$user_name" fi host=\$(hostname --fqdn 2>'/dev/null' || :) @@ -175,72 +222,131 @@ create_setup_script() then host='localhost' fi - (tar -cf - '$rel_name' | tar --skip-old-files -C "\$(dirname '$code_path')" -xpf -) - (tar -cf - '$rel_name-$rel_vsn' | tar -C "\$(dirname '$code_path')" -xpf -) + mkdir -p "\$prefix" + tar -cf - '$rel_name' | tar --skip-old-files -C "\$prefix" -xf - + tar -cf - '$rel_name-$rel_vsn' | tar -C "\$prefix" -xf - + + if [ \$is_superuser = true ] + then + if [ \$is_upgrade = false ] + then chown -R -h "\$user_name:\$group_name" "\$data_dir" + fi + chown -R -h "\$(id -u -n):\$group_name" "\$code_dir" + chmod -R g+rX "\$code_dir" + chmod '4750' "\$code_dir/lib/epam-"*'/priv/bin/epam' + else + sed -i "s/^INSTALLUSER=.*/INSTALLUSER=\"\$user_name\"/" \ + "\$code_dir/bin/${rel_name}ctl" + sed -i "s/^USER=.*/USER=\$user_name/" \ + "\$code_dir/bin/$rel_name.init" + sed -i \ + -e "s/^User=.*/User=\$user_name/" \ + -e "s/^Group=.*/Group=\$group_name/" \ + "\$code_dir/bin/$rel_name.service" + fi + if [ "\$code_dir" != '$default_code_dir' ] + then + sed -i "s|$default_code_dir|\$code_dir|g" \ + "\$code_dir/bin/${rel_name}ctl" \ + "\$code_dir/bin/$rel_name.init" \ + "\$code_dir/bin/$rel_name.service" + fi + if [ "\$data_dir" != '$default_data_dir' ] + then + sed -i "s|$default_data_dir|\$data_dir|g" \ + "\$code_dir/bin/${rel_name}ctl" \ + "\$code_dir/bin/$rel_name.init" \ + "\$code_dir/bin/$rel_name.service" \ + "\$data_dir/conf/$rel_name.yml" \ + "\$data_dir/conf/${rel_name}ctl.cfg" + fi - chown -R -h 'root:root' '$code_path' - chown 'root:$rel_name' '$code_path/lib/epam-'*'/priv/bin/epam' - chmod '4750' '$code_path/lib/epam-'*'/priv/bin/epam' if [ \$is_upgrade = false ] then - sed -i "s/ - localhost$/ - \$host/" '$conf_path/$rel_name.yml' + sed -i "s/ - localhost$/ - \$host/" "\$conf_dir/$rel_name.yml" openssl req -x509 \ -batch \ -nodes \ -newkey rsa:4096 \ - -keyout '$pem_file' \ - -out '$pem_file' \ + -keyout "\$pem_file" \ + -out "\$pem_file" \ -days 3650 \ -subj "/CN=\$host" >'/dev/null' 2>&1 || : - if [ -e '$pem_file' ] - then chown '$rel_name:$rel_name' '$pem_file' - else echo 'Failed to create a TLS certificate for ejabberd.' >&2 + if ! [ -e "\$pem_file" ] + then + echo 'Failed to create a TLS certificate for $rel_name.' >&2 + elif [ \$is_superuser = true ] + then + chown "\$user_name:\$group_name" "\$pem_file" fi fi - if [ \$is_systemd = true ] - then - cp '$code_path/bin/$rel_name.service' '/etc/systemd/system/' + case \$is_systemd,\$is_superuser in + true,true) + cp "\$code_dir/bin/$rel_name.service" '/etc/systemd/system/' systemctl -q daemon-reload if [ \$is_upgrade = false ] then systemctl -q --now enable '$rel_name' fi - elif [ \$is_upgrade = false ] - then + ;; + true,false) + echo 'You might want to install a systemd unit (see the' + echo "\$code_dir/bin directory for an example)." + ;; + false,*) echo 'You might want to install an init script (see the' - echo '$code_path/bin directory for an example).' - fi + echo "\$code_dir/bin directory for an example)." + ;; + esac + + echo echo '$rel_name $rel_vsn has been installed successfully.' echo - cat >'$uninstall_file' <<_EOF - # To uninstall ejabberd, first remove the service. If you're using systemd: - systemctl --now disable ejabberd - rm -f /etc/systemd/system/ejabberd.service + cat >"\$uninstall_file" <<-_EOF + # To uninstall $rel_name, first remove the service. If you're using systemd: + systemctl --now disable $rel_name + rm -f /etc/systemd/system/$rel_name.service # Remove the binary files: - rm -rf /opt/ejabberd-* + rm -rf \$code_dir # If you want to remove your configuration, database and logs: - rm -rf /opt/ejabberd + rm -rf \$data_dir _EOF - - if [ \$is_upgrade = true ] + if [ \$is_superuser = true ] then + cat >>"\$uninstall_file" <<-_EOF + + # To remove the user running $rel_name: + userdel \$user_name + _EOF + fi + + if [ \$is_upgrade = false ] + then + if [ \$is_systemd = true ] && [ \$is_superuser = true ] + then + echo 'Now you can check $rel_name is running correctly:' + echo ' systemctl status $rel_name' + echo + fi + echo 'Next you may want to edit $rel_name.yml to set up hosts,' + echo 'register an account and grant it admin rigts, see:' + echo + echo '$admin_url' + else echo 'Please check the following web site for upgrade notes:' echo echo '$upgrade_url' echo - echo 'If everything looks fine, restart the $rel_name service:' - echo ' systemctl restart ejabberd' - else - echo 'Now you can check ejabberd is running correctly:' - echo ' systemctl status ejabberd' - echo - echo 'Next you may want to edit ejabberd.yml to set up hosts,' - echo 'register an account and grant it admin rigts, see:' - echo - echo '$admin_url' + if [ \$is_systemd = true ] && [ \$is_superuser = true ] + then + echo 'If everything looks fine, restart the $rel_name service:' + echo ' systemctl restart $rel_name' + else + echo 'If everything looks fine, restart the $rel_name service.' + fi fi EOF chmod +x "$dir/setup" @@ -253,8 +359,8 @@ do test -e "$tar_name" || tools/make-binaries echo "$myself: Putting together installer for $arch ..." - tar -xzpf "$tar_name" - create_help_file "$tmp_dir/help.txt" + tar -C "$tmp_dir" -xzpf "$tar_name" + create_help_file "$tmp_dir/help.txt" create_setup_script "$tmp_dir" "$makeself" --help-header "$tmp_dir/help.txt" \ "$tmp_dir" "$installer_name" "$rel_name $rel_vsn" './setup' From 99064548e85d6eed9bfbe27fb5a4aee2d04836fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 17 May 2022 12:23:12 +0200 Subject: [PATCH 325/440] Fix parsing of scram password from prosody Looks like parsed integer no longer are convered to floats on erlang side, so let's make check for them less restrictive. --- src/prosody2ejabberd.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prosody2ejabberd.erl b/src/prosody2ejabberd.erl index 07b6427e7..df7dedc9b 100644 --- a/src/prosody2ejabberd.erl +++ b/src/prosody2ejabberd.erl @@ -130,7 +130,7 @@ eval_file(Path) -> maybe_get_scram_auth(Data) -> case proplists:get_value(<<"iteration_count">>, Data, no_ic) of - IC when is_float(IC) -> %% A float like 4096.0 is read + IC when is_number(IC) -> #scram{ storedkey = misc:hex_to_base64(proplists:get_value(<<"stored_key">>, Data, <<"">>)), serverkey = misc:hex_to_base64(proplists:get_value(<<"server_key">>, Data, <<"">>)), From cac31f9325af1030883f9882b0b1b8f07be2c77c Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 18 May 2022 10:20:34 +0200 Subject: [PATCH 326/440] make-packages: Include systemd unit with RPM Don't forget to include the /etc/systemd/system/ejabberd.service unit with the RPM package. Closes #3816. --- tools/make-packages | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/make-packages b/tools/make-packages index 6a665ef90..0d8d2248e 100755 --- a/tools/make-packages +++ b/tools/make-packages @@ -160,9 +160,10 @@ make_package() { local output_type="$1" local architecture="$(package_architecture "$2")" - local dir="$3" + local work_dir="$3" + local include_dirs="$4" - cd "$dir" # FPM's "--chdir" option doesn't work (as I'd expect). + cd "$work_dir" # FPM's "--chdir" option doesn't work (as I'd expect). fpm --output-type "$output_type" \ --input-type 'dir' \ --name "$rel_name" \ @@ -194,7 +195,7 @@ make_package() --before-upgrade './before-install' \ --after-upgrade './after-upgrade' \ --after-remove './after-remove' \ - './opt' './usr' + $include_dirs cd "$OLDPWD" } @@ -228,10 +229,10 @@ do "$etc_dir/systemd/system/$rel_name.service" "$arch_dir/$rel_name" create_scripts "$arch_dir" - make_package 'rpm' "$arch" "$arch_dir" + make_package 'rpm' "$arch" "$arch_dir" './opt ./usr ./etc' mv "$etc_dir/systemd/system/$rel_name.service" "$arch_dir" rm -r "$etc_dir" - make_package 'deb' "$arch" "$arch_dir" + make_package 'deb' "$arch" "$arch_dir" './opt ./usr' mv "$arch_dir/$rel_name"?$rel_vsn*.??? . done echo "$myself: Created DEB and RPM packages successfully." From e6c1bf9c9a1e7aae2069d6d1790133c4c0d9be3a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 18 May 2022 17:08:05 +0200 Subject: [PATCH 327/440] make-binaries: Adjust Mnesia spool directory path Adjust the default Mnesia directory for compatibility with older binary packages. Closes #3818. --- tools/make-binaries | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/make-binaries b/tools/make-binaries index 57aaaa7b6..a15a94224 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -367,6 +367,7 @@ edit_ejabberdctl() -e '/ERL_OPTIONS=/d' \ -e 's|^ERLANG_NODE=ejabberd$|ERLANG_NODE=ejabberd@localhost|' \ -e 's|_DIR:=".*}/|_DIR:="/opt/ejabberd/|' \ + -e 's|/database|/database/$ERLANG_NODE|' \ "$code_dir/bin/${rel_name}ctl" } #. From 75a771bfec3626145d404349fdaec4f0eef83bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 19 May 2022 12:20:42 +0200 Subject: [PATCH 328/440] Don't leak DESTDIR in files copied by 'make install' This fixes issue #3819 --- Makefile.in | 132 ++++++++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/Makefile.in b/Makefile.in index 16e713ebe..7358982f6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -10,27 +10,27 @@ exec_prefix = @exec_prefix@ DESTDIR = # /etc/ejabberd/ -ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd +ETCDIR = @sysconfdir@/ejabberd # /bin/ -BINDIR = $(DESTDIR)@bindir@ +BINDIR = @bindir@ # /sbin/ -SBINDIR = $(DESTDIR)@sbindir@ +SBINDIR = @sbindir@ # /lib/ -LIBDIR = $(DESTDIR)@libdir@ +LIBDIR = @libdir@ # /lib/ejabberd/ -EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd +EJABBERDDIR = @libdir@/ejabberd # /share/doc/ejabberd PACKAGE_TARNAME = @PACKAGE_TARNAME@ datarootdir = @datarootdir@ -DOCDIR = $(DESTDIR)@docdir@ +DOCDIR = @docdir@ # /share/doc/man/man5 -MANDIR = $(DESTDIR)@mandir@/man5 +MANDIR = @mandir@/man5 # /usr/lib/ejabberd/ebin/ BEAMDIR = $(EJABBERDDIR)/ebin @@ -66,10 +66,10 @@ SQLDIR = $(PRIVDIR)/sql LUADIR = $(PRIVDIR)/lua # /var/lib/ejabberd/ -SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd +SPOOLDIR = @localstatedir@/lib/ejabberd # /var/log/ejabberd/ -LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd +LOGDIR = @localstatedir@/log/ejabberd INSTALLUSER=@INSTALLUSER@ # if no user was enabled, don't set privileges or ownership @@ -201,7 +201,7 @@ ELIXIR_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 5,1000, DEPS_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 3,1000,$(1)) MAIN_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,ejabberd) $(1) TO_DEST_SINGLE=$(if $(subst X$(DEPSBASE)X,,X$(word 1,$(1))X),$(call MAIN_TO_DEST,$(1)),$(if $(subst XlibX,,X$(word $(LIBIX),$(1))X),$(call DEPS_TO_DEST,$(wordlist $(DEPIX),1000,$(1))),$(call ELIXIR_TO_DEST,$(wordlist $(DEPIX),1000,$(1))))) -TO_DEST=$(foreach path,$(1),$(call JOIN_PATHS,$(call TO_DEST_SINGLE,$(subst /, ,$(path))))) +TO_DEST=$(foreach path,$(1),$(call JOIN_PATHS,$(DESTDIR)$(call TO_DEST_SINGLE,$(subst /, ,$(path))))) FILTER_DIRS=$(foreach path,$(1),$(if $(wildcard $(path)/*),,$(path))) FILES_WILDCARD=$(call FILTER_DIRS,$(foreach w,$(1),$(wildcard $(w)))) @@ -242,7 +242,7 @@ $(foreach file,$(DEPS_FILES_FILTERED) $(MAIN_FILES),$(eval $(call COPY_template, $(foreach file,$(BINARIES),$(eval $(call COPY_BINARY_template,$(file)))) $(sort $(call TO_DEST,$(MAIN_DIRS) $(DEPS_DIRS))): - $(INSTALL) -d $@ + $(INSTALL) -d $@ $(call TO_DEST,priv/sql/lite.sql): sql/lite.sql $(call TO_DEST,priv/sql) $(INSTALL) -m 644 $< $@ @@ -311,23 +311,23 @@ ejabberdctl.example: vars.config install: copy-files ejabberdctl.example # # Configuration files - $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) - [ -f $(ETCDIR)/ejabberd.yml ] \ - && $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \ - || $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml - [ -f $(ETCDIR)/ejabberdctl.cfg ] \ - && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \ - || $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg - $(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc + $(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR) + [ -f $(DESTDIR)$(ETCDIR)/ejabberd.yml ] \ + && $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(DESTDIR)$(ETCDIR)/ejabberd.yml-new \ + || $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(DESTDIR)$(ETCDIR)/ejabberd.yml + [ -f $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg ] \ + && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg-new \ + || $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg + $(INSTALL) -b -m 644 $(G_USER) inetrc $(DESTDIR)$(ETCDIR)/inetrc # # Administration script - [ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR) - $(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl + [ -d $(DESTDIR)$(SBINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(SBINDIR) + $(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(DESTDIR)$(SBINDIR)/ejabberdctl # Elixir binaries - [ -d $(BINDIR) ] || $(INSTALL) -d -m 755 $(BINDIR) - [ -f $(DEPSDIR)/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/iex $(BINDIR)/iex || true - [ -f $(DEPSDIR)/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir $(BINDIR)/elixir || true - [ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix $(BINDIR)/mix || true + [ -d $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR) + [ -f $(DEPSDIR)/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/iex $(DESTDIR)$(BINDIR)/iex || true + [ -f $(DEPSDIR)/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir $(DESTDIR)$(BINDIR)/elixir || true + [ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix $(DESTDIR)$(BINDIR)/mix || true # # Init script $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ @@ -342,59 +342,59 @@ install: copy-files ejabberdctl.example chmod 644 ejabberd.service # # Spool directory - $(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(SPOOLDIR) + $(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR) + $(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT) + chmod -R 750 $(DESTDIR)$(SPOOLDIR) # # Log directory - $(INSTALL) -d -m 750 $(O_USER) $(LOGDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(LOGDIR) + $(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(LOGDIR) + $(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT) + chmod -R 750 $(DESTDIR)$(LOGDIR) # # Documentation - $(INSTALL) -d $(MANDIR) - $(INSTALL) -d $(DOCDIR) + $(INSTALL) -d $(DESTDIR)$(MANDIR) + $(INSTALL) -d $(DESTDIR)$(DOCDIR) [ -f man/ejabberd.yml.5 ] \ - && $(INSTALL) -m 644 man/ejabberd.yml.5 $(MANDIR) \ + && $(INSTALL) -m 644 man/ejabberd.yml.5 $(DESTDIR)$(MANDIR) \ || echo "Man page not included in sources" - $(INSTALL) -m 644 COPYING $(DOCDIR) + $(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR) uninstall: uninstall-binary uninstall-binary: - rm -f $(SBINDIR)/ejabberdctl - rm -f $(BINDIR)/iex - rm -f $(BINDIR)/elixir - rm -f $(BINDIR)/mix - rm -fr $(DOCDIR) - rm -f $(BEAMDIR)/*.beam - rm -f $(BEAMDIR)/*.app - rm -fr $(BEAMDIR) - rm -f $(INCLUDEDIR)/*.hrl - rm -fr $(INCLUDEDIR) - rm -fr $(PBINDIR) - rm -f $(SODIR)/*.so - rm -fr $(SODIR) - rm -f $(MSGSDIR)/*.msg - rm -fr $(MSGSDIR) - rm -f $(CSSDIR)/*.css - rm -fr $(CSSDIR) - rm -f $(IMGDIR)/*.png - rm -fr $(IMGDIR) - rm -f $(JSDIR)/*.js - rm -fr $(JSDIR) - rm -f $(SQLDIR)/*.sql - rm -fr $(SQLDIR) - rm -fr $(LUADIR)/*.lua - rm -fr $(LUADIR) - rm -fr $(PRIVDIR) - rm -fr $(EJABBERDDIR) + rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl + rm -f $(DESTDIR)$(BINDIR)/iex + rm -f $(DESTDIR)$(BINDIR)/elixir + rm -f $(DESTDIR)$(BINDIR)/mix + rm -fr $(DESTDIR)$(DOCDIR) + rm -f $(DESTDIR)$(BEAMDIR)/*.beam + rm -f $(DESTDIR)$(BEAMDIR)/*.app + rm -fr $(DESTDIR)$(BEAMDIR) + rm -f $(DESTDIR)$(INCLUDEDIR)/*.hrl + rm -fr $(DESTDIR)$(INCLUDEDIR) + rm -fr $(DESTDIR)$(PBINDIR) + rm -f $(DESTDIR)$(SODIR)/*.so + rm -fr $(DESTDIR)$(SODIR) + rm -f $(DESTDIR)$(MSGSDIR)/*.msg + rm -fr $(DESTDIR)$(MSGSDIR) + rm -f $(DESTDIR)$(CSSDIR)/*.css + rm -fr $(DESTDIR)$(CSSDIR) + rm -f $(DESTDIR)$(IMGDIR)/*.png + rm -fr $(DESTDIR)$(IMGDIR) + rm -f $(DESTDIR)$(JSDIR)/*.js + rm -fr $(DESTDIR)$(JSDIR) + rm -f $(DESTDIR)$(SQLDIR)/*.sql + rm -fr $(DESTDIR)$(SQLDIR) + rm -fr $(DESTDIR)$(LUADIR)/*.lua + rm -fr $(DESTDIR)$(LUADIR) + rm -fr $(DESTDIR)$(PRIVDIR) + rm -fr $(DESTDIR)$(EJABBERDDIR) uninstall-all: uninstall-binary - rm -rf $(ETCDIR) - rm -rf $(EJABBERDDIR) - rm -rf $(SPOOLDIR) - rm -rf $(LOGDIR) + rm -rf $(DESTDIR)$(ETCDIR) + rm -rf $(DESTDIR)$(EJABBERDDIR) + rm -rf $(DESTDIR)$(SPOOLDIR) + rm -rf $(DESTDIR)$(LOGDIR) clean: rm -rf $(DEPSDIR)/.got From 93f994d50a243698f0eedf25ecfc9a3d8e233fda Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 20 May 2022 11:24:39 +0200 Subject: [PATCH 329/440] Generate start scripts in "make all", not in "make install" (#3821) --- Makefile.in | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7358982f6..0216341d6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -152,7 +152,7 @@ else endif endif -all: deps src +all: scripts deps src deps: $(DEPSDIR)/.got @@ -297,6 +297,18 @@ ejabberdctl.relive: -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ > ejabberdctl.relive +ejabberd.init: + $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ + -e "s*@installuser@*$(INIT_USER)*g" ejabberd.init.template \ + > ejabberd.init + chmod 755 ejabberd.init + +ejabberd.service: + $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ + -e "s*@installuser@*$(INIT_USER)*g" ejabberd.service.template \ + > ejabberd.service + chmod 644 ejabberd.service + ejabberdctl.example: vars.config $(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \ -e "s*{{config_dir}}*${ETCDIR}*g" \ @@ -308,7 +320,9 @@ ejabberdctl.example: vars.config -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \ > ejabberdctl.example -install: copy-files ejabberdctl.example +scripts: ejabberd.init ejabberd.service ejabberdctl.example + +install: copy-files # # Configuration files $(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR) @@ -329,18 +343,6 @@ install: copy-files ejabberdctl.example [ -f $(DEPSDIR)/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir $(DESTDIR)$(BINDIR)/elixir || true [ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix $(DESTDIR)$(BINDIR)/mix || true # - # Init script - $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ - -e "s*@installuser@*$(INIT_USER)*g" ejabberd.init.template \ - > ejabberd.init - chmod 755 ejabberd.init - # - # Service script - $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \ - -e "s*@installuser@*$(INIT_USER)*g" ejabberd.service.template \ - > ejabberd.service - chmod 644 ejabberd.service - # # Spool directory $(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR) $(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT) From ddc457060b68fa1a7ae596ac96eb67beac072081 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 20 May 2022 11:49:07 +0200 Subject: [PATCH 330/440] Improve "make clean" and "distclean" --- Makefile.in | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index 0216341d6..2ba3d2afb 100644 --- a/Makefile.in +++ b/Makefile.in @@ -112,6 +112,7 @@ ifeq "$(REBAR_VER)" "6" CONFIGURE_DEPS= EBINDIR=$(DEPSDIR)/ejabberd/ebin XREFOPTIONS=graph + CLEANARG=--deps REBARREL=MIX_ENV=prod $(REBAR) release --overwrite REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run @@ -131,6 +132,7 @@ endif CONFIGURE_DEPS=$(REBAR) configure-deps EBINDIR=$(DEPSDIR)/ejabberd/ebin XREFOPTIONS= + CLEANARG=--all REBARREL=$(REBAR) as prod tar REBARDEV=REBAR_PROFILE=dev $(REBAR) release RELIVECMD=$(REBAR) relive @@ -145,6 +147,7 @@ else CONFIGURE_DEPS=$(REBAR) configure-deps EBINDIR=ebin XREFOPTIONS= + CLEANARG= REBARREL=$(REBAR) generate REBARDEV= RELIVECMD=@echo "Rebar2 detected... relive not supported.\ @@ -402,22 +405,23 @@ clean: rm -rf $(DEPSDIR)/.got rm -rf $(DEPSDIR)/.built rm -rf test/*.beam - $(REBAR) clean + rm -f rebar.lock + rm -f ejabberdctl.example ejabberd.init ejabberd.service + $(REBAR) clean $(CLEANARG) clean-rel: rm -rf rel/ejabberd distclean: clean clean-rel + rm -f aclocal.m4 rm -f config.status rm -f config.log rm -rf autom4te.cache rm -rf $(EBINDIR) rm -rf $(DEPSBASE) + rm -rf deps rm -f Makefile rm -f vars.config - rm -f src/ejabberd.app.src - rm -f ejabberdctl.example ejabberd.init ejabberd.service - [ ! -f ../ChangeLog ] || rm -f ../ChangeLog rel: $(REBARREL) From 7d16907296c4b99535ab42486c34a7c2bca168fb Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 12:06:10 +0200 Subject: [PATCH 331/440] Configure eimp with mix to detect image convert properly (#3823) --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 2ba3d2afb..a2c88bc21 100644 --- a/Makefile.in +++ b/Makefile.in @@ -109,7 +109,7 @@ ifeq "$(REBAR_VER)" "6" DEPSBASE=_build DEPSDIR=$(DEPSBASE)/dev/lib GET_DEPS= deps.get - CONFIGURE_DEPS= + CONFIGURE_DEPS=(cd deps/eimp; ./configure) EBINDIR=$(DEPSDIR)/ejabberd/ebin XREFOPTIONS=graph CLEANARG=--deps From 7850ce0ec819be4e3f755419d946426a049106d8 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 12:39:29 +0200 Subject: [PATCH 332/440] Ensure deps configuration is ran when getting deps (#3823) --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index a2c88bc21..8b11de840 100644 --- a/Makefile.in +++ b/Makefile.in @@ -164,9 +164,9 @@ $(DEPSDIR)/.got: rm -rf $(DEPSDIR)/.built mkdir -p $(DEPSDIR) $(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got + $(CONFIGURE_DEPS) $(DEPSDIR)/.built: $(DEPSDIR)/.got - $(CONFIGURE_DEPS) $(REBAR) compile && :> $(DEPSDIR)/.built src: $(DEPSDIR)/.built From 26e6bb4a1729c72c39cb39f82cc5444ec27aecea Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 12:35:09 +0200 Subject: [PATCH 333/440] Use "make deps", which performs additional steps (#3823) --- .github/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index a712f9b71..d3537b23d 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -35,7 +35,7 @@ RUN git clone https://github.com/processone/ejabberd.git . \ && mv .github/container/ejabberdctl.template . \ && ./autogen.sh \ && ./configure --with-rebar=mix --enable-all \ - && mix deps.get \ + && make deps \ && make rel RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \ From 34e1ddb66f87458c0850a0fd97a010cf9e73eb9a Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 13:13:56 +0200 Subject: [PATCH 334/440] Update "make help" with recent changes --- Makefile.in | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8b11de840..25adeec56 100644 --- a/Makefile.in +++ b/Makefile.in @@ -493,9 +493,10 @@ test: help: @echo "" - @echo " [all] Compile dependencies and ejabberd" - @echo " src Compile ejabberd" - @echo " deps Get dependencies" + @echo " [all] " + @echo " scripts Prepare ejabberd start scripts" + @echo " deps Get and configure dependencies" + @echo " src Compile dependencies and ejabberd" @echo " update Update dependencies' source code" @echo " clean Clean binary files" @echo " distclean Clean completely the development files" From 75ffce0417b066f6aaa1645e07a241ac0c743c0f Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 15:01:54 +0200 Subject: [PATCH 335/440] configure also when running "make update", which is similar to "make deps" --- Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in index 25adeec56..42b799c71 100644 --- a/Makefile.in +++ b/Makefile.in @@ -176,6 +176,7 @@ update: rm -rf $(DEPSDIR)/.got rm -rf $(DEPSDIR)/.built $(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got + $(CONFIGURE_DEPS) xref: all $(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS) From 0e25f8d43ea48d0a3db7b1b16f6c40f3077306ce Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 16:41:19 +0200 Subject: [PATCH 336/440] Fix mod_conversejs crash when mod_register not enabled (#3824) --- src/mod_conversejs.erl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 767a3824b..61cec2322 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -183,10 +183,19 @@ get_register_options(Server) -> (_) -> false end, ejabberd_auth:auth_modules(Server)), - Modules = mod_register_opt:allow_modules(Server), + Modules = get_register_modules(Server), ModRegisterAllowsMe = (Modules == all) orelse lists:member(?MODULE, Modules), [{<<"allow_registration">>, AuthSupportsRegister and ModRegisterAllowsMe}]. +get_register_modules(Server) -> + try mod_register_opt:allow_modules(Server) + catch + error:{module_not_loaded, mod_register, _} -> + ?DEBUG("mod_conversejs couldn't get mod_register configuration for " + "vhost ~p: module not loaded in that vhost.", [Server]), + [] + end. + get_extra_options(Host) -> RawOpts = gen_mod:get_module_opt(Host, ?MODULE, conversejs_options), lists:map(fun({Name, <<"true">>}) -> {Name, true}; From 5a2e58e06613bea6637559552459f65e8647d89d Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 23 May 2022 16:52:27 +0200 Subject: [PATCH 337/440] Fix regression on stop_ping in clustering context (thanks to fdie)(#3817) --- src/mod_ping.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 2ee5133fa..825acf2cd 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -203,7 +203,7 @@ user_offline(_SID, JID, _Info) -> case ejabberd_sm:get_session_pid(JID#jid.luser, JID#jid.lserver, JID#jid.lresource) of - none -> + PID when PID =:= none; node(PID) /= node() -> stop_ping(JID#jid.lserver, JID); _ -> ok From c1ee86e85c638f672ccc71faf603d7a9deda05f3 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 25 May 2022 20:37:37 +0200 Subject: [PATCH 338/440] make-binaries: Fix linking of EIMP dependencies Avoid linker errors such as the following when using GCC 10 or newer: | multiple definition of `gdImageCreateFromJpegPtr' See: https://gcc.gnu.org/gcc-10/porting_to.html Fixes #3514. --- tools/make-binaries | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index a15a94224..8ce85c9b7 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -728,11 +728,11 @@ build_rel() info "Building $rel_name $rel_vsn for $arch ..." ./autogen.sh - eimp_defs='-DHAVE_GD -DHAVE_WEBP -DHAVE_JPEG -DHAVE_PNG' + eimp_cflags='-fcommon' eimp_libs='-lwebp -ljpeg -lpng -lz -lm' export CC="$CC -Wl,-ldl" # Required by (statically linking) epam. export LIBS="$eimp_libs -lcrypto -lpthread -ldl" - export CFLAGS="$CFLAGS $eimp_defs" + export CFLAGS="$CFLAGS $eimp_cflags" export LDFLAGS="$LDFLAGS $eimp_libs" if [ "$mode" = 'cross' ] then From b4c78336a6201703c8af9d4bfc17c11becc1034d Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 28 May 2022 10:21:43 +0200 Subject: [PATCH 339/440] make-binaries: Edit rebar.config more carefully Don't break the (currently nonexistent) case where a dependency's rebar.config file specifies LDFLAGS before and after "-lstdc++", such as "-lfoo -lstdc++ -lbar". --- tools/make-binaries | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make-binaries b/tools/make-binaries index 8ce85c9b7..51bf34a43 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -748,7 +748,7 @@ build_rel() --enable-all \ --disable-erlang-version-check make deps - sed -i 's/ *-lstdc++ *//g' 'deps/'*'/rebar.config'* # Link statically. + sed -i 's/ *-lstdc++//g' 'deps/'*'/rebar.config'* # Link statically. if [ "$mode" = 'cross' ] then ln -s "$prefix/lib/erlang" 'lib/erlang' From fbf43f2a310bc011c5d4a4df0b9b786a55a14207 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 28 May 2022 15:00:25 +0200 Subject: [PATCH 340/440] make-binaries: Include CAPTCHA script with release --- tools/make-binaries | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/make-binaries b/tools/make-binaries index 51bf34a43..27359c990 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -357,6 +357,15 @@ add_systemd_unit() } #. +#' Add CAPTCHA script(s). +add_captcha_script() +{ + local code_dir="$1" + + cp -p 'tools/captcha'*'.sh' "$code_dir/lib" +} +#. + #' Use our VT100 to avoid depending on Terminfo, adjust options/paths. edit_ejabberdctl() { @@ -775,6 +784,7 @@ build_rel() tar -C "$target_dst_dir" -xzf "$rel_dir/$rel_tar" create_data_dir "$target_dst_dir" "$target_data_dir" add_systemd_unit "$target_dst_dir" + add_captcha_script "$target_dst_dir" edit_ejabberdctl "$target_dst_dir" remove_unused_files "$target_dst_dir" strip_files "$target_dst_dir" "$STRIP" From 8d94ae4cb0a88b7548a4c70ca4f5f8ac32537342 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 26 May 2022 16:55:55 +0200 Subject: [PATCH 341/440] Container: Fix build instructions --- CONTAINER.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTAINER.md b/CONTAINER.md index cb32b4090..5bcb26cdc 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -256,10 +256,10 @@ That OTP release is configured with: Build ejabberd Community Server base image from ejabberd master on GitHub: ```bash -VERSION = master +VERSION=master docker build \ - --build-arg VERSION=$(VERSION) \ - -t personal/ejabberd:$(VERSION) \ + --build-arg VERSION=$VERSION \ + -t personal/ejabberd:$VERSION \ .github/container ``` @@ -267,11 +267,11 @@ Build ejabberd Community Server base image for a given ejabberd version, both for amd64 and arm64 architectures: ```bash -VERSION = 22.05 +VERSION=22.05 docker buildx build \ --platform=linux/amd64,linux/arm64 - --build-arg VERSION=$(VERSION) \ - -t personal/ejabberd:$(VERSION) \ + --build-arg VERSION=$VERSION \ + -t personal/ejabberd:$VERSION \ .github/container ``` @@ -280,9 +280,9 @@ It's also possible to use podman instead of docker, just notice: - It mentions that `healthcheck` is not supported by the Open Container Initiative image format - If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true` ```bash -VERSION = master +VERSION=master podman build \ - --build-arg VERSION=$(VERSION) \ + --build-arg VERSION=$VERSION \ -t ja:$(version) \ .github/container ``` From 06a2b1c671026239bd0e0c4d7832306755195eaf Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 3 Jun 2022 12:46:00 +0200 Subject: [PATCH 342/440] Container: Support to pass a fork repository as argument --- .github/container/Dockerfile | 3 ++- .github/workflows/container.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index d3537b23d..629985b8d 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -1,4 +1,5 @@ FROM alpine:3.15.4 AS build +ARG REPOSITORY=https://github.com/processone/ejabberd.git ARG VERSION=master RUN apk upgrade --update musl \ @@ -30,7 +31,7 @@ RUN mix local.hex --force \ WORKDIR ejabberd -RUN git clone https://github.com/processone/ejabberd.git . \ +RUN git clone $REPOSITORY . \ && git checkout $VERSION \ && mv .github/container/ejabberdctl.template . \ && ./autogen.sh \ diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 8ae2c6873..7256058e5 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -58,6 +58,7 @@ jobs: uses: docker/build-push-action@v2.10.0 with: build-args: | + REPOSITORY=https://github.com/${{ github.repository }}.git VERSION=${{ steps.gitdescribe.outputs.ver }} cache-from: type=gha cache-to: type=gha,mode=max From a6101cc26df87f463d326bdad4c1e523559cb2dd Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 24 May 2022 20:34:16 +0200 Subject: [PATCH 343/440] Container: Set a less frequent healthcheck to reduce CPU usage (#3826) --- .github/container/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 629985b8d..a879a125d 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -102,10 +102,10 @@ RUN addgroup ejabberd -g 9000 \ && chown -R ejabberd:ejabberd $HOME HEALTHCHECK \ - --interval=5s \ + --interval=1m \ --timeout=5s \ --start-period=5s \ - --retries=120 \ + --retries=10 \ CMD /usr/local/bin/ejabberdctl status WORKDIR $HOME From a89b1f332d279da3c134b074a797fda4b6818409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 10 Jun 2022 15:40:42 +0200 Subject: [PATCH 344/440] Use INSERT ... ON DUPLICATE KEY UPDATE for upsert on mysql This can be used for all upsert expressions (where REPLACE INTO used previously were only possible to use for subset of queries), and may potentially help with deadlocks reported by mysql when we issues multiple querier for same key in quick succession. --- src/ejabberd_sql_pt.erl | 97 ++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index 6c0a2a55f..0f8465942 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -570,43 +570,33 @@ parse_upsert_field1([C | S], Acc, ParamPos, Loc) -> make_sql_upsert(Table, ParseRes, Pos) -> check_upsert(ParseRes, Pos), - HasInsertOnlyFields = lists:any( - fun({_, {false}, _}) -> true; - (_) -> false - end, ParseRes), - MySqlReplace = case HasInsertOnlyFields of - false -> - [erl_syntax:clause( - [erl_syntax:atom(mysql), erl_syntax:underscore()], - [], - [make_sql_upsert_mysql(Table, ParseRes), - erl_syntax:atom(ok)])]; - _ -> - [] - end, erl_syntax:fun_expr( - [erl_syntax:clause( - [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], - [erl_syntax:infix_expr( - erl_syntax:variable("__Version"), - erl_syntax:operator('>='), - erl_syntax:integer(90500))], - [make_sql_upsert_pgsql905(Table, ParseRes), - erl_syntax:atom(ok)]), - erl_syntax:clause( - [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], - [erl_syntax:infix_expr( - erl_syntax:variable("__Version"), - erl_syntax:operator('>='), - erl_syntax:integer(90100))], - [make_sql_upsert_pgsql901(Table, ParseRes), - erl_syntax:atom(ok)])] ++ - MySqlReplace ++ - [erl_syntax:clause( - [erl_syntax:underscore(), erl_syntax:underscore()], - none, - [make_sql_upsert_generic(Table, ParseRes)]) - ]). + [erl_syntax:clause( + [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], + [erl_syntax:infix_expr( + erl_syntax:variable("__Version"), + erl_syntax:operator('>='), + erl_syntax:integer(90500))], + [make_sql_upsert_pgsql905(Table, ParseRes), + erl_syntax:atom(ok)]), + erl_syntax:clause( + [erl_syntax:atom(pgsql), erl_syntax:variable("__Version")], + [erl_syntax:infix_expr( + erl_syntax:variable("__Version"), + erl_syntax:operator('>='), + erl_syntax:integer(90100))], + [make_sql_upsert_pgsql901(Table, ParseRes), + erl_syntax:atom(ok)]), + erl_syntax:clause( + [erl_syntax:atom(mysql), erl_syntax:underscore()], + [], + [make_sql_upsert_mysql(Table, ParseRes), + erl_syntax:atom(ok)]), + erl_syntax:clause( + [erl_syntax:underscore(), erl_syntax:underscore()], + none, + [make_sql_upsert_generic(Table, ParseRes)]) + ]). make_sql_upsert_generic(Table, ParseRes) -> Update = make_sql_query(make_sql_upsert_update(Table, ParseRes)), @@ -672,9 +662,6 @@ make_sql_upsert_update(Table, ParseRes) -> State. make_sql_upsert_insert(Table, ParseRes) -> - make_sql_upsert_insert_replace(Table, ParseRes, "INSERT"). - -make_sql_upsert_insert_replace(Table, ParseRes, Keyword) -> Vals = lists:map( fun({_Field, _, ST}) -> @@ -687,7 +674,7 @@ make_sql_upsert_insert_replace(Table, ParseRes, Keyword) -> end, ParseRes), State = concat_states( - [#state{'query' = [{str, Keyword ++" INTO "}, {str, Table}, {str, "("}]}, + [#state{'query' = [{str, "INSERT INTO "}, {str, Table}, {str, "("}]}, join_states(Fields, ", "), #state{'query' = [{str, ") VALUES ("}]}, join_states(Vals, ", "), @@ -695,15 +682,35 @@ make_sql_upsert_insert_replace(Table, ParseRes, Keyword) -> ]), State. -make_sql_upsert_replace(Table, ParseRes) -> - make_sql_upsert_insert_replace(Table, ParseRes, "REPLACE"). - make_sql_upsert_mysql(Table, ParseRes) -> - Replace = make_sql_query(make_sql_upsert_replace(Table, ParseRes)), + Vals = + lists:map( + fun({_Field, _, ST}) -> + ST + end, ParseRes), + {Fields, Set} = + lists:foldr( + fun({Field, key, _ST}, {F, S}) -> + {[#state{'query' = [{str, Field}]} | F], S}; + ({Field, {false}, _ST}, {F, S}) -> + {[#state{'query' = [{str, Field}]} | F], S}; + ({Field, {true}, _ST}, {F, S}) -> + {[#state{'query' = [{str, Field}]} | F], + [#state{'query' = [{str, Field}, {str, "=VALUES("}, {str, Field}, {str, ")"}]} | S]} + end, {[], []}, ParseRes), + Insert = + concat_states( + [#state{'query' = [{str, "INSERT INTO "}, {str, Table}, {str, "("}]}, + join_states(Fields, ", "), + #state{'query' = [{str, ") VALUES ("}]}, + join_states(Vals, ", "), + #state{'query' = [{str, ") ON DUPLICATE KEY UPDATE "}]}, + join_states(Set, ", ") + ]), erl_syntax:application( erl_syntax:atom(ejabberd_sql), erl_syntax:atom(sql_query_t), - [Replace]). + [make_sql_query(Insert)]). make_sql_upsert_pgsql901(Table, ParseRes0) -> ParseRes = lists:map( From a30d8c718f287e23e8c3ca34893de321d77eb989 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 9 Jun 2022 22:15:53 +0200 Subject: [PATCH 345/440] Update workflows to Erlang 25 --- .github/workflows/ci.yml | 4 ++-- .github/workflows/runtime.yml | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52d6c4208..a4632deca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '24', '25.0-rc3'] + otp: ['19.3', '24', '25.0'] include: - otp: '19.3' rebar: 2 @@ -33,7 +33,7 @@ jobs: - otp: '24' rebar: 3 os: ubuntu-20.04 - - otp: '25.0-rc3' + - otp: '25.0' rebar: 3 os: ubuntu-20.04 runs-on: ${{ matrix.os }} diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index 596f54fb8..881bb630d 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '21.3', '22.0', '24.3', '25.0-rc3'] + otp: ['19.3', '21.3', '22.0', '24.3', '25'] rebar: ['rebar', 'rebar3'] include: - otp: '19.3' @@ -42,7 +42,7 @@ jobs: os: ubuntu-20.04 - otp: '24.3' os: ubuntu-20.04 - - otp: '25.0-rc3' + - otp: '25' os: ubuntu-20.04 runs-on: ${{ matrix.os }} container: @@ -110,17 +110,19 @@ jobs: strategy: fail-fast: false matrix: - otp: ['21.3', '22.0', '24.3'] + otp: ['21.3', '22.0', '25.0'] elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0'] exclude: - otp: '21.3' elixir: '1.12.3' - otp: '21.3' elixir: '1.13.0' - - otp: '24.3' + - otp: '25.0' elixir: '1.10.3' - - otp: '24.3' + - otp: '25.0' elixir: '1.11.4' + - otp: '25.0' + elixir: '1.12.3' runs-on: ubuntu-20.04 steps: From 6d39af7dd6c3ca07423b7fbc1047313e80594a47 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 10 Jun 2022 17:43:49 +0200 Subject: [PATCH 346/440] Runtime: No need for a specific mix erlang 25 job --- .github/workflows/runtime.yml | 67 ----------------------------------- 1 file changed, 67 deletions(-) diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index 881bb630d..8fd9a7054 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -201,70 +201,3 @@ jobs: cat _build/prod/rel/ejabberd/logs/error.log cat _build/dev/rel/ejabberd/logs/ejabberd.log cat _build/dev/rel/ejabberd/logs/error.log - - mix25: - name: Mix 25 - strategy: - fail-fast: false - matrix: - otp: ['25.0-rc3'] - runs-on: ubuntu-20.04 - - steps: - - - uses: actions/checkout@v3 - - - name: Get specific Erlang/OTP - uses: ErlGang/setup-erlang@master - with: - otp-version: ${{ matrix.otp }} - - - name: Get Elixir - run: | - wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb \ - && sudo dpkg -i erlang-solutions_2.0_all.deb - sudo apt-get update - sudo apt-get install elixir - mix local.hex --force - mix local.rebar --force - - - name: Prepare libraries - run: | - sudo apt-get -qq update - sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ - libsqlite3-dev libwebp-dev libyaml-dev - - - name: Compile - run: | - ./autogen.sh - ./configure --with-rebar=mix \ - --prefix=/tmp/ejabberd \ - --enable-all \ - --disable-elixir \ - --disable-odbc - mix deps.get - make - - - run: make xref - - - name: Test rel - run: | - make rel - _build/prod/rel/ejabberd/bin/ejabberdctl start \ - && _build/prod/rel/ejabberd/bin/ejabberdctl started - _build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass - _build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost - _build/prod/rel/ejabberd/bin/ejabberdctl stop \ - && _build/prod/rel/ejabberd/bin/ejabberdctl stopped - cat _build/prod/rel/ejabberd/logs/* - - - name: Test dev - run: | - make dev - _build/dev/rel/ejabberd/bin/ejabberdctl start \ - && _build/dev/rel/ejabberd/bin/ejabberdctl started - _build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass - _build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost - _build/dev/rel/ejabberd/bin/ejabberdctl stop \ - && _build/dev/rel/ejabberd/bin/ejabberdctl stopped - cat _build/dev/rel/ejabberd/logs/* From 382c3836afe92f39eacd525dc5f733033d011526 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 10 Jun 2022 17:45:15 +0200 Subject: [PATCH 347/440] Runtime: Add Xref options to be as strict as CI --- .github/workflows/runtime.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index 8fd9a7054..37bc7e572 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -69,6 +69,14 @@ jobs: make update make + - name: Prepare rebar + run: | + echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2} + ]}.' >>rebar.config + echo '{xref_checks, [deprecated_function_calls, deprecated_functions, + locals_not_used, undefined_function_calls, undefined_functions]}. + % Disabled: exports_not_used,' >>rebar.config + - run: make xref - name: Test rel (rebar2) From a2efde185ab57d3df02b717b6da9ad7a95d9d91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 17 Jun 2022 10:22:57 +0200 Subject: [PATCH 348/440] Fix mam delete_old_messages_batch for sql backend Too much copy/paste from spool equivalent... --- src/mod_mam.erl | 6 +++--- src/mod_mam_mnesia.erl | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index d5b9a1680..693889c2c 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -581,8 +581,8 @@ delete_old_messages_batch(Server, Type, Days, BatchSize, Rate) when Type == <<"c case ejabberd_batch:register_task({mam, LServer}, 0, Rate, {LServer, TypeA, TimeStamp, BatchSize, none}, fun({L, T, St, B, IS} = S) -> - case {erlang:function_exported(Mod, remove_old_messages_batch, 4), - erlang:function_exported(Mod, remove_old_messages_batch, 5)} of + case {erlang:function_exported(Mod, delete_old_messages_batch, 4), + erlang:function_exported(Mod, delete_old_messages_batch, 5)} of {true, _} -> case Mod:delete_old_messages_batch(L, St, T, B) of {ok, Count} -> @@ -591,7 +591,7 @@ delete_old_messages_batch(Server, Type, Days, BatchSize, Rate) when Type == <<"c E end; {_, true} -> - case Mod:remove_old_messages_batch(L, St, T, B, IS) of + case Mod:delete_old_messages_batch(L, St, T, B, IS) of {ok, IS2, Count} -> {ok, {L, St, T, B, IS2}, Count}; {error, _} = E -> diff --git a/src/mod_mam_mnesia.erl b/src/mod_mam_mnesia.erl index 0fd459c67..8b8a4b91e 100644 --- a/src/mod_mam_mnesia.erl +++ b/src/mod_mam_mnesia.erl @@ -29,7 +29,7 @@ %% API -export([init/2, remove_user/2, remove_room/3, delete_old_messages/3, extended_fields/0, store/8, write_prefs/4, get_prefs/2, select/6, remove_from_archive/3, - is_empty_for_user/2, is_empty_for_room/3, remove_old_messages_batch/5]). + is_empty_for_user/2, is_empty_for_room/3, delete_old_messages_batch/5]). -include_lib("stdlib/include/ms_transform.hrl"). -include_lib("xmpp/include/xmpp.hrl"). @@ -155,7 +155,7 @@ delete_batch(LastUS, LServer, TS, Type, Num) -> _ -> delete_batch(mnesia:next(archive_msg, LastUS), LServer, TS, Type, Left) end. -remove_old_messages_batch(LServer, TimeStamp, Type, Batch, LastUS) -> +delete_old_messages_batch(LServer, TimeStamp, Type, Batch, LastUS) -> R = mnesia:transaction( fun() -> {Num, NextUS} = delete_batch(LastUS, LServer, TimeStamp, Type, Batch), From 46c947bc76c34bd6b1d09347828acaa685d76795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 17 Jun 2022 10:35:02 +0200 Subject: [PATCH 349/440] Define batch delete function types in coresponding behaviours --- src/mod_mam.erl | 13 ++++++++++++- src/mod_offline.erl | 7 ++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 693889c2c..7d9e308f5 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -89,7 +89,18 @@ {[{binary(), non_neg_integer(), xmlel()}], boolean(), count()} | {error, db_failure}. --optional_callbacks([use_cache/1, cache_nodes/1, select_with_mucsub/6, select/6, select/7]). +-callback delete_old_messages_batch(binary(), erlang:timestamp(), + all | chat | groupchat, + pos_integer()) -> + {ok, non_neg_integer()} | {error, term()}. + +-callback delete_old_messages_batch(binary(), erlang:timestamp(), + all | chat | groupchat, + pos_integer(), any()) -> + {ok, any(), non_neg_integer()} | {error, term()}. + +-optional_callbacks([use_cache/1, cache_nodes/1, select_with_mucsub/6, select/6, select/7, + delete_old_messages_batch/5, delete_old_messages_batch/4]). %%%=================================================================== %%% API diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 77610f5a7..9e7e3dffe 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -106,9 +106,14 @@ -callback count_messages(binary(), binary()) -> {ets_cache:tag(), non_neg_integer()}. -callback use_cache(binary()) -> boolean(). -callback cache_nodes(binary()) -> [node()]. +-callback remove_old_messages_batch(binary(), non_neg_integer(), pos_integer()) -> + {ok, non_neg_integer()} | {error, term()}. +-callback remove_old_messages_batch(binary(), non_neg_integer(), pos_integer(), any()) -> + {ok, any(), non_neg_integer()} | {error, term()}. -optional_callbacks([remove_expired_messages/1, remove_old_messages/2, - use_cache/1, cache_nodes/1]). + use_cache/1, cache_nodes/1, remove_old_messages_batch/3, + remove_old_messages_batch/4]). depends(_Host, _Opts) -> []. From 06147deccddf8a6a43dfc012d2586fd0e363869a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 21 Jun 2022 11:09:37 +0200 Subject: [PATCH 350/440] Don't register listeners that failed to start in config reload This should alleviate some issues in #3850 --- src/ejabberd_listener.erl | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 9c962be6e..309e167df 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -457,11 +457,19 @@ config_reloaded() -> ok; {_, OldModule, OldOpts} -> _ = stop_listener(EndPoint, OldModule, OldOpts), - ets:insert(?MODULE, {EndPoint, Module, Opts}), - start_listener(EndPoint, Module, Opts); + case start_listener(EndPoint, Module, Opts) of + {ok, _} -> + ets:insert(?MODULE, {EndPoint, Module, Opts}); + _ -> + ok + end; false -> - ets:insert(?MODULE, {EndPoint, Module, Opts}), - start_listener(EndPoint, Module, Opts) + case start_listener(EndPoint, Module, Opts) of + {ok, _} -> + ets:insert(?MODULE, {EndPoint, Module, Opts}); + _ -> + ok + end end end, New). From 991d52f0193e0011fb8a2894dc23c1a34dcda425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 24 Jun 2022 11:36:54 +0200 Subject: [PATCH 351/440] Fix error reporting in 'make options' on OTP24+ --- tools/opt_types.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/opt_types.sh b/tools/opt_types.sh index 92cd943d8..71d69a5d4 100755 --- a/tools/opt_types.sh +++ b/tools/opt_types.sh @@ -483,8 +483,12 @@ options_required([Form]) -> proplists:get_value(required, Opts, []). format_file(Path, Form) -> + Line = case erl_syntax:get_pos(Form) of + {L, _} -> L; + L -> L + end, filename:rootname(filename:basename(Path)) ++ ".erl:" ++ - integer_to_list(erl_syntax:get_pos(Form)). + integer_to_list(Line). module(Path) -> list_to_atom(filename:rootname(filename:basename(Path))). From e10c67a74a7611ba097a3097872efa6c5c08e990 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Mon, 13 Jun 2022 13:28:10 +0200 Subject: [PATCH 352/440] mod_mix_pam: Display joined channels on webadmin page --- src/mod_mix_pam.erl | 67 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index 1fa5c1861..e67ae2c80 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -31,11 +31,15 @@ -export([bounce_sm_packet/1, disco_sm_features/5, remove_user/2, - process_iq/1]). + process_iq/1, + webadmin_user/4, + webadmin_page/3]). -include_lib("xmpp/include/xmpp.hrl"). -include("logger.hrl"). -include("translate.hrl"). +-include("ejabberd_http.hrl"). +-include("ejabberd_web_admin.hrl"). -define(MIX_PAM_CACHE, mix_pam_cache). @@ -61,6 +65,8 @@ start(Host, Opts) -> ejabberd_hooks:add(bounce_sm_packet, Host, ?MODULE, bounce_sm_packet, 50), ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, disco_sm_features, 50), ejabberd_hooks:add(remove_user, Host, ?MODULE, remove_user, 50), + ejabberd_hooks:add(webadmin_user, Host, ?MODULE, webadmin_user, 50), + ejabberd_hooks:add(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0, ?MODULE, process_iq); Err -> @@ -71,6 +77,8 @@ stop(Host) -> ejabberd_hooks:delete(bounce_sm_packet, Host, ?MODULE, bounce_sm_packet, 50), ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, disco_sm_features, 50), ejabberd_hooks:delete(remove_user, Host, ?MODULE, remove_user, 50), + ejabberd_hooks:delete(webadmin_user, Host, ?MODULE, webadmin_user, 50), + ejabberd_hooks:delete(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0). reload(Host, NewOpts, OldOpts) -> @@ -339,6 +347,11 @@ get_channel(JID, Channel) -> end end. +get_channels(JID) -> + {_, LServer, _} = jid:tolower(JID), + Mod = gen_mod:db_mod(LServer, ?MODULE), + Mod:get_channels(JID). + add_channel(JID, Channel, ID) -> Mod = gen_mod:db_mod(JID#jid.lserver, ?MODULE), case Mod:add_channel(JID, Channel, ID) of @@ -399,3 +412,55 @@ delete_cache(Mod, JID, Channel) -> false -> ok end. + +%%%=================================================================== +%%% Webadmin interface +%%%=================================================================== +webadmin_user(Acc, User, Server, Lang) -> + QueueLen = case get_channels({jid:nodeprep(User), jid:nameprep(Server), <<>>}) of + {ok, Channels} -> length(Channels); + error -> -1 + end, + FQueueLen = ?C(integer_to_binary(QueueLen)), + FQueueView = ?AC(<<"mix_channels/">>, ?T("View joined MIX channels")), + Acc ++ + [?XCT(<<"h3">>, ?T("Joined MIX channels:")), + FQueueLen, + ?C(<<" | ">>), + FQueueView]. + +webadmin_page(_, Host, + #request{us = _US, path = [<<"user">>, U, <<"mix_channels">>], + lang = Lang} = _Request) -> + Res = web_mix_channels(U, Host, Lang), + {stop, Res}; +webadmin_page(Acc, _, _) -> Acc. + +web_mix_channels(User, Server, Lang) -> + LUser = jid:nodeprep(User), + LServer = jid:nameprep(Server), + US = {LUser, LServer}, + Items = case get_channels({jid:nodeprep(User), jid:nameprep(Server), <<>>}) of + {ok, Channels} -> Channels; + error -> [] + end, + SItems = lists:sort(Items), + FItems = case SItems of + [] -> [?CT(?T("None"))]; + _ -> + THead = ?XE(<<"thead">>, [?XE(<<"tr">>, [?XCT(<<"td">>, ?T("Channel JID")), + ?XCT(<<"td">>, ?T("Participant ID"))])]), + Entries = lists:map(fun ({JID, ID}) -> + ?XE(<<"tr">>, [ + ?XAC(<<"td">>, [{<<"class">>, <<"valign">>}], jid:encode(JID)), + ?XAC(<<"td">>, [{<<"class">>, <<"valign">>}], ID) + ]) + end, SItems), + [?XE(<<"table">>, [THead, ?XE(<<"tbody">>, Entries)])] + end, + PageTitle = str:translate_and_format(Lang, ?T("Joined MIX channels of ~ts"), [us_to_list(US)]), + (?H1GL(PageTitle, <<"modules/#mod-mix-pam">>, <<"mod_mix_pam">>)) + ++ FItems. + +us_to_list({User, Server}) -> + jid:encode({User, Server, <<"">>}). From 99d9e315a3c0524d84197e63741790d5893c51f4 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Fri, 1 Jul 2022 09:13:37 +0300 Subject: [PATCH 353/440] Don't set affiliation to 'none' if it's already 'none' in mod_muc_room:process_item_change/3 --- src/mod_muc_room.erl | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index dda31aeb7..d2eb80cc4 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -3014,22 +3014,26 @@ process_item_change(Item, SD, UJID) -> send_kickban_presence(UJID, JID, Reason, 307, SD), set_role(JID, none, SD); {JID, affiliation, none, Reason} -> - case (SD#state.config)#config.members_only of - true -> - send_kickban_presence(UJID, JID, Reason, 321, none, SD), - maybe_send_affiliation(JID, none, SD), - SD1 = set_affiliation(JID, none, SD), - set_role(JID, none, SD1); - _ -> - SD1 = set_affiliation(JID, none, SD), - SD2 = case (SD1#state.config)#config.moderated of - true -> set_role(JID, visitor, SD1); - false -> set_role(JID, participant, SD1) - end, - send_update_presence(JID, Reason, SD2, SD), - maybe_send_affiliation(JID, none, SD2), - SD2 - end; + case get_affiliation(JID, SD) of + none -> SD; + _ -> + case (SD#state.config)#config.members_only of + true -> + send_kickban_presence(UJID, JID, Reason, 321, none, SD), + maybe_send_affiliation(JID, none, SD), + SD1 = set_affiliation(JID, none, SD), + set_role(JID, none, SD1); + _ -> + SD1 = set_affiliation(JID, none, SD), + SD2 = case (SD1#state.config)#config.moderated of + true -> set_role(JID, visitor, SD1); + false -> set_role(JID, participant, SD1) + end, + send_update_presence(JID, Reason, SD2, SD), + maybe_send_affiliation(JID, none, SD2), + SD2 + end + end; {JID, affiliation, outcast, Reason} -> send_kickban_presence(UJID, JID, Reason, 301, outcast, SD), maybe_send_affiliation(JID, outcast, SD), From 43f36205bd9a90a9f73f84f431029a57063d7255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 15 Jul 2022 13:51:30 +0200 Subject: [PATCH 354/440] React to sql driver process exit earlier If there are queued request when connection closes we may try to process those requests (by trying to send them to already terminated db process, and waiting until we hit timeout) before we see that driver is not longer alive. This change adds check for driver exit before we process next queued sql request, and immediately switch to connection state if we have one. --- src/ejabberd_sql.erl | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index d0f7c658f..6a11d0346 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -483,9 +483,16 @@ run_sql_cmd(Command, From, State, Timestamp) -> State1 = report_overload(State), {next_state, session_established, State1}; false -> - put(?NESTING_KEY, ?TOP_LEVEL_TXN), - put(?STATE_KEY, State), - abort_on_driver_error(outer_op(Command), From, Timestamp) + receive + {'EXIT', _Pid, Reason} -> + PR = p1_queue:in({sql_cmd, Command, From, Timestamp}, + State#state.pending_requests), + handle_reconnect(Reason, State#state{pending_requests = PR}) + after 0 -> + put(?NESTING_KEY, ?TOP_LEVEL_TXN), + put(?STATE_KEY, State), + abort_on_driver_error(outer_op(Command), From, Timestamp) + end end. %% @doc Only called by handle_call, only handles top level operations. @@ -670,11 +677,10 @@ sql_query_internal(Query) -> pgsql_to_odbc(pgsql:squery(State#state.db_ref, Query, QueryTimeout - 1000)); mysql -> - R = mysql_to_odbc(p1_mysql_conn:squery(State#state.db_ref, + mysql_to_odbc(p1_mysql_conn:squery(State#state.db_ref, [Query], self(), - [{timeout, QueryTimeout - 1000}, - {result_type, binary}])), - R; + [{QueryTimeout - 1000}, + {result_type, binary}])); sqlite -> Host = State#state.host, sqlite_to_odbc(Host, sqlite3:sql_exec(sqlite_db(Host), Query)) @@ -854,7 +860,6 @@ sql_rollback() -> [{mssql, [<<"rollback transaction;">>]}, {any, [<<"rollback;">>]}]). - %% Generate the OTP callback return tuple depending on the driver result. abort_on_driver_error({error, <<"query timed out">>} = Reply, From, Timestamp) -> reply(From, Reply, Timestamp), From 73167ef1bd8da6d4a1c35583d2d5ce03e3447a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 19 Jul 2022 14:32:47 +0200 Subject: [PATCH 355/440] Make first sql reconnect wait shorter time --- src/ejabberd_sql.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 6a11d0346..7f31668d2 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -74,6 +74,7 @@ {db_ref :: undefined | pid(), db_type = odbc :: pgsql | mysql | sqlite | odbc | mssql, db_version :: undefined | non_neg_integer(), + reconnect_count = 0 :: non_neg_integer(), host :: binary(), pending_requests :: p1_queue:queue(), overload_reported :: undefined | integer()}). @@ -375,7 +376,7 @@ connecting(connect, #state{host = Host} = State) -> State1 = State#state{db_ref = Ref, pending_requests = PendingRequests}, State2 = get_db_version(State1), - {next_state, session_established, State2} + {next_state, session_established, State2#state{reconnect_count = 0}} catch _:Reason -> handle_reconnect(Reason, State) end; @@ -467,15 +468,19 @@ print_state(State) -> State. %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- -handle_reconnect(Reason, #state{host = Host} = State) -> - StartInterval = ejabberd_option:sql_start_interval(Host), +handle_reconnect(Reason, #state{host = Host, reconnect_count = RC} = State) -> + StartInterval0 = ejabberd_option:sql_start_interval(Host), + StartInterval = case RC of + 0 -> erlang:min(5000, StartInterval0); + _ -> StartInterval0 + end, ?WARNING_MSG("~p connection failed:~n" "** Reason: ~p~n" "** Retry after: ~B seconds", [State#state.db_type, Reason, StartInterval div 1000]), p1_fsm:send_event_after(StartInterval, connect), - {next_state, connecting, State}. + {next_state, connecting, State#state{reconnect_count = RC + 1}}. run_sql_cmd(Command, From, State, Timestamp) -> case current_time() >= Timestamp of From 7b944444ce955d493bc49d504b91e436e7b4a895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 19 Jul 2022 14:35:35 +0200 Subject: [PATCH 356/440] Catch mysql connection being close earlier --- rebar.config | 2 +- src/ejabberd_sql.erl | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/rebar.config b/rebar.config index 6db4fe2fc..d0b009848 100644 --- a/rebar.config +++ b/rebar.config @@ -56,7 +56,7 @@ {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}}, {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.19"}}}, {if_var_true, mysql, - {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}}, + {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", "82b68eb59a2e5a042605c604f72433c3472d5cf3"}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}}, {if_var_true, pgsql, {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}}, diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 7f31668d2..1e32a87c8 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -684,7 +684,7 @@ sql_query_internal(Query) -> mysql -> mysql_to_odbc(p1_mysql_conn:squery(State#state.db_ref, [Query], self(), - [{QueryTimeout - 1000}, + [{timeout, QueryTimeout - 1000}, {result_type, binary}])); sqlite -> Host = State#state.host, @@ -869,6 +869,9 @@ sql_rollback() -> abort_on_driver_error({error, <<"query timed out">>} = Reply, From, Timestamp) -> reply(From, Reply, Timestamp), {stop, timeout, get(?STATE_KEY)}; +abort_on_driver_error({error, <<"connection closed">>} = Reply, From, Timestamp) -> + reply(From, Reply, Timestamp), + handle_reconnect(<<"connection closed">>, get(?STATE_KEY)); abort_on_driver_error({error, <<"Failed sending data on socket", _/binary>>} = Reply, From, Timestamp) -> reply(From, Reply, Timestamp), From 853f35c7061058703fdb74dac94c6d59c09abd9e Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 26 Jul 2022 12:28:07 +0200 Subject: [PATCH 357/440] Remove nginx and libgd3, so the proper versions can be installed --- .github/workflows/ci.yml | 1 + .github/workflows/runtime.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4632deca..3d9b5d164 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,6 +95,7 @@ jobs: - name: Prepare libraries run: | sudo apt-get -qq update + sudo apt-get -y purge libgd3 nginx sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ libsqlite3-dev libwebp-dev libyaml-dev diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index 37bc7e572..e7d18797a 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -55,6 +55,7 @@ jobs: - name: Prepare libraries run: | apt-get -qq update + apt-get purge -y libgd3 apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ libsqlite3-dev libwebp-dev libyaml-dev @@ -146,6 +147,7 @@ jobs: - name: Prepare libraries run: | sudo apt-get -qq update + sudo apt-get -y purge libgd3 nginx sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ libsqlite3-dev libwebp-dev libyaml-dev From 033656d70ec6dfd26531ee7519ac7d63b9c3ed80 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 21 Jul 2022 13:04:55 +0200 Subject: [PATCH 358/440] Add WebAdmin page for managing external modules --- src/ext_mod.erl | 417 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 415 insertions(+), 2 deletions(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 02666e9eb..e4330e3a8 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -36,13 +36,17 @@ config_dir/0, get_commands_spec/0]). -export([modules_configs/0, module_ebin_dir/1]). -export([compile_erlang_file/2, compile_elixir_file/2]). +-export([web_menu_node/3, web_page_node/5]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -include("ejabberd_commands.hrl"). +-include("ejabberd_web_admin.hrl"). -include("logger.hrl"). +-include("translate.hrl"). +-include_lib("xmpp/include/xmpp.hrl"). -define(REPOS, "https://github.com/processone/ejabberd-contrib"). @@ -57,6 +61,8 @@ init([]) -> application:start(inets), inets:start(httpc, [{profile, ext_mod}]), ejabberd_commands:register_commands(get_commands_spec()), + ejabberd_hooks:add(webadmin_menu_node, ?MODULE, web_menu_node, 50), + ejabberd_hooks:add(webadmin_page_node, ?MODULE, web_page_node, 50), {ok, #state{}}. add_paths() -> @@ -76,6 +82,8 @@ handle_info(Info, State) -> {noreply, State}. terminate(_Reason, _State) -> + ejabberd_hooks:delete(webadmin_menu_node, ?MODULE, web_menu_node, 50), + ejabberd_hooks:delete(webadmin_page_node, ?MODULE, web_page_node, 50), ejabberd_commands:unregister_commands(get_commands_spec()). code_change(_OldVsn, State, _Extra) -> @@ -223,6 +231,7 @@ install(Package) when is_binary(Package) -> ok -> code:add_patha(module_ebin_dir(Module)), ejabberd_config:reload(), + copy_commit_json(Package, Attrs), case erlang:function_exported(Module, post_install, 0) of true -> Module:post_install(); _ -> ok @@ -330,7 +339,8 @@ geturl(Url) -> [U, Pass] -> [{proxy_auth, {U, Pass}}]; _ -> [] end, - case httpc:request(get, {Url, []}, User, [{body_format, binary}], ext_mod) of + UA = {"User-Agent", "ejabberd/ext_mod"}, + case httpc:request(get, {Url, [UA]}, User, [{body_format, binary}], ext_mod) of {ok, {{_, 200, _}, Headers, Response}} -> {ok, Headers, Response}; {ok, {{_, Code, _}, _Headers, Response}} -> @@ -380,7 +390,8 @@ extract_github_master(Repos, DestDir) -> case extract(zip, geturl(Url++"/archive/master.zip"), DestDir) of ok -> RepDir = filename:join(DestDir, module_name(Repos)), - file:rename(RepDir++"-master", RepDir); + file:rename(RepDir++"-master", RepDir), + write_commit_json(Url, RepDir); Error -> Error end. @@ -722,3 +733,405 @@ format({Key, Val}) when is_binary(Val) -> {Key, binary_to_list(Val)}; format({Key, Val}) -> % TODO: improve Yaml parsing {Key, Val}. + +%% -- COMMIT.json + +write_commit_json(Url, RepDir) -> + Url2 = string_replace(Url, "https://github.com", "https://api.github.com/repos"), + BranchUrl = lists:flatten(Url2 ++ "/branches/master"), + {ok, _Headers, Body} = geturl(BranchUrl), + {ok, F} = file:open(filename:join(RepDir, "COMMIT.json"), [raw, write]), + file:write(F, Body), + file:close(F). + +find_commit_json(Attrs) -> + {_, FromPath} = lists:keyfind(path, 1, Attrs), + case {find_commit_json_path(FromPath), + find_commit_json_path(filename:join(FromPath, ".."))} + of + {{ok, FromFile}, _} -> + FromFile; + {_, {ok, FromFile}} -> + FromFile + end. + +-ifdef(HAVE_URI_STRING). %% Erlang/OTP 20 or higher can use this: +string_replace(Subject, Pattern, Replacement) -> + string:replace(Subject, Pattern, Replacement). + +find_commit_json_path(Path) -> + filelib:find_file("COMMIT.json", Path). +-else. % Workaround for Erlang/OTP older than 20: +string_replace(Subject, Pattern, Replacement) -> + B = binary:replace(list_to_binary(Subject), + list_to_binary(Pattern), + list_to_binary(Replacement)), + binary_to_list(B). + +find_commit_json_path(Path) -> + case filelib:wildcard("COMMIT.json", Path) of + [] -> + {error, commit_json_not_found}; + ["COMMIT.json"] = File -> + {ok, filename:join(Path, File)} + end. +-endif. + +copy_commit_json(Package, Attrs) -> + DestPath = module_lib_dir(Package), + FromFile = find_commit_json(Attrs), + file:copy(FromFile, filename:join(DestPath, "COMMIT.json")). + +get_commit_details(Dirname) -> + RepDir = filename:join(sources_dir(), Dirname), + get_commit_details2(filename:join(RepDir, "COMMIT.json")). + +get_commit_details2(Path) -> + case file:read_file(Path) of + {ok, Body} -> + parse_details(Body); + _ -> + #{sha => <<"1234567890">>, + date => <<>>, + message => <<>>, + html => <<>>, + commit_html_url => <<>>} + end. + +parse_details(Body) -> + {Contents} = jiffy:decode(Body), + + {_, {Commit}} = lists:keyfind(<<"commit">>, 1, Contents), + {_, Sha} = lists:keyfind(<<"sha">>, 1, Commit), + {_, CommitHtmlUrl} = lists:keyfind(<<"html_url">>, 1, Commit), + + {_, {Commit2}} = lists:keyfind(<<"commit">>, 1, Commit), + {_, Message} = lists:keyfind(<<"message">>, 1, Commit2), + {_, {Author}} = lists:keyfind(<<"author">>, 1, Commit2), + {_, AuthorName} = lists:keyfind(<<"name">>, 1, Author), + {_, {Committer}} = lists:keyfind(<<"committer">>, 1, Commit2), + {_, Date} = lists:keyfind(<<"date">>, 1, Committer), + + {_, {Links}} = lists:keyfind(<<"_links">>, 1, Contents), + {_, Html} = lists:keyfind(<<"html">>, 1, Links), + + #{sha => Sha, + date => Date, + message => Message, + html => Html, + author_name => AuthorName, + commit_html_url => CommitHtmlUrl}. + +%% -- Web Admin + +-define(AXC(URL, Attributes, Text), + ?XAE(<<"a">>, [{<<"href">>, URL} | Attributes], [?C(Text)]) + ). + +-define(INPUTCHECKED(Type, Name, Value), + ?XA(<<"input">>, + [{<<"type">>, Type}, + {<<"name">>, Name}, + {<<"disabled">>, <<"true">>}, + {<<"checked">>, <<"true">>}, + {<<"value">>, Value} + ] + ) + ). + +web_menu_node(Acc, _Node, Lang) -> + Acc ++ [{<<"contrib">>, translate:translate(Lang, ?T("Contrib Modules"))}]. + +web_page_node(_, Node, [<<"contrib">>], Query, Lang) -> + QueryRes = list_modules_parse_query(Query), + Title = ?H1GL(translate:translate(Lang, ?T("Contrib Modules")), + <<"../../developer/extending-ejabberd/modules/#ejabberd-contrib">>, + <<"ejabberd-contrib">>), + Contents = get_content(Node, Query, Lang), + Result = case QueryRes of + ok -> [?XREST(?T("Submitted"))]; + nothing -> [] + end, + Res = Title ++ Result ++ Contents, + {stop, Res}; +web_page_node(Acc, _, _, _, _) -> + Acc. + +get_module_home(Module, Attrs) -> + case element(2, lists:keyfind(home, 1, Attrs)) of + "https://github.com/processone/ejabberd-contrib/tree/master/" = P1 -> + P1 ++ atom_to_list(Module); + Other -> + Other + end. + +get_module_summary(Attrs) -> + element(2, lists:keyfind(summary, 1, Attrs)). + +get_module_author(Attrs) -> + element(2, lists:keyfind(author, 1, Attrs)). + +get_installed_module_el({ModAtom, Attrs}, Lang) -> + Mod = misc:atom_to_binary(ModAtom), + Home = list_to_binary(get_module_home(ModAtom, Attrs)), + Summary = list_to_binary(get_module_summary(Attrs)), + Author = list_to_binary(get_module_author(Attrs)), + {_, FromPath} = lists:keyfind(path, 1, Attrs), + {ok, FromFile} = find_commit_json_path(FromPath), + + #{sha := CommitSha, + date := CommitDate, + message := CommitMessage, + author_name := CommitAuthorName, + commit_html_url := CommitHtmlUrl} = get_commit_details2(FromFile), + + [SourceSpec] = [S || {M, S} <- available(), M == ModAtom], + SourceFile = find_commit_json(SourceSpec), + #{sha := SourceSha, + date := SourceDate, + message := SourceMessage, + author_name := SourceAuthorName, + commit_html_url := SourceHtmlUrl} = get_commit_details2(SourceFile), + + UpgradeEls = + case CommitSha == SourceSha of + true -> + []; + false -> + SourceTitleEl = make_title_el(SourceDate, SourceMessage, SourceAuthorName), + [?XE(<<"td">>, + [?INPUT(<<"checkbox">>, <<"selected_upgrade">>, Mod), + ?C(<<" ">>), + ?AXC(SourceHtmlUrl, [SourceTitleEl], binary:part(SourceSha, {0, 8})) + ] + ) + ] + end, + + Started = + case gen_mod:is_loaded(hd(ejabberd_option:hosts()), ModAtom) of + false -> + [?C(<<" - ">>)]; + true -> + [] + end, + TitleEl = make_title_el(CommitDate, CommitMessage, CommitAuthorName), + Status = case lists:member({mod_status, 0}, ModAtom:module_info(exports)) of + true -> + [?C(<<" ">>), + ?C(ModAtom:mod_status())]; + false -> [] + end, + HomeTitleEl = make_home_title_el(Summary, Author), + ?XE(<<"tr">>, + [?XE(<<"td">>, [?AXC(Home, [HomeTitleEl], Mod)]), + ?XE(<<"td">>, + [?INPUTTD(<<"checkbox">>, <<"selected_uninstall">>, Mod), + ?C(<<" ">>), + ?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8})), + ?C(<<" ">>)] + ++ Started + ++ Status) + | UpgradeEls]). + +get_available_module_el({ModAtom, Attrs}) -> + Installed = installed(), + Mod = misc:atom_to_binary(ModAtom), + Home = list_to_binary(get_module_home(ModAtom, Attrs)), + Summary = list_to_binary(get_module_summary(Attrs)), + Author = list_to_binary(get_module_author(Attrs)), + HomeTitleEl = make_home_title_el(Summary, Author), + InstallCheckbox = + case lists:keymember(ModAtom, 1, Installed) of + false -> [?INPUT(<<"checkbox">>, <<"selected_install">>, Mod)]; + true -> [?INPUTCHECKED(<<"checkbox">>, <<"selected_install">>, Mod)] + end, + ?XE(<<"tr">>, + [?XE(<<"td">>, InstallCheckbox ++ [?C(<<" ">>), ?AXC(Home, [HomeTitleEl], Mod)]), + ?XE(<<"td">>, [?C(Summary)])]). + +get_installed_modules_table(Lang) -> + Modules = installed(), + Tail = [?XE(<<"tr">>, + [?XE(<<"td">>, []), + ?XE(<<"td">>, + [?INPUTTD(<<"submit">>, <<"uninstall">>, ?T("Uninstall"))] + ), + ?XE(<<"td">>, + [?INPUTT(<<"submit">>, <<"upgrade">>, ?T("Upgrade"))] + ) + ] + ) + ], + TBody = [get_installed_module_el(Module, Lang) || Module <- lists:sort(Modules)], + ?XAE(<<"table">>, + [], + [?XE(<<"tbody">>, TBody ++ Tail)] + ). + +get_available_modules_table(Lang) -> + Modules = get_available_notinstalled(), + Tail = [?XE(<<"tr">>, + [?XE(<<"td">>, + [?INPUTT(<<"submit">>, <<"install">>, ?T("Install"))] + ) + ] + ) + ], + TBody = [get_available_module_el(Module) || Module <- lists:sort(Modules)], + ?XAE(<<"table">>, + [], + [?XE(<<"tbody">>, TBody ++ Tail)] + ). + +make_title_el(Date, Message, AuthorName) -> + LinkTitle = <>, + {<<"title">>, LinkTitle}. + +make_home_title_el(Summary, Author) -> + LinkTitle = <>, + {<<"title">>, LinkTitle}. + +get_content(Node, Query, Lang) -> + Instruct = translate:translate(Lang, ?T("Type a command in a textbox and click Execute.")), + {{_CommandCtl}, _Res} = + case catch parse_and_execute(Query, Node) of + {'EXIT', _} -> {{""}, Instruct}; + Result_tuple -> Result_tuple + end, + + AvailableModulesEls = get_available_modules_table(Lang), + InstalledModulesEls = get_installed_modules_table(Lang), + + Sources = get_sources_list(), + SourceEls = (?XAE(<<"table">>, + [], + [?XE(<<"tbody">>, + (lists:map( + fun(Dirname) -> + #{sha := CommitSha, + date := CommitDate, + message := CommitMessage, + html := Html, + author_name := AuthorName, + commit_html_url := CommitHtmlUrl + } = get_commit_details(Dirname), + TitleEl = make_title_el(CommitDate, CommitMessage, AuthorName), + ?XE(<<"tr">>, + [?XE(<<"td">>, [?AC(Html, Dirname)]), + ?XE(<<"td">>, + [?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8}))] + ), + ?XE(<<"td">>, [?C(CommitMessage)]) + ]) + end, + lists:sort(Sources) + )) + ) + ] + )), + + [?XC(<<"p">>, + translate:translate( + Lang, ?T("Update specs to get modules source, then install desired ones.") + ) + ), + ?XAE(<<"form">>, + [{<<"method">>, <<"post">>}], + [?XCT(<<"h3">>, ?T("Sources Specs:")), + SourceEls, + ?BR, + ?INPUTT(<<"submit">>, + <<"updatespecs">>, + translate:translate(Lang, ?T("Update Specs"))), + + ?XCT(<<"h3">>, ?T("Installed Modules:")), + InstalledModulesEls, + ?BR, + + ?XCT(<<"h3">>, ?T("Other Modules Available:")), + AvailableModulesEls + ] + ) + ]. + +get_sources_list() -> + case file:list_dir(sources_dir()) of + {ok, Filenames} -> Filenames; + {error, enoent} -> [] + end. + +get_available_notinstalled() -> + Installed = installed(), + lists:filter( + fun({Mod, _}) -> + not lists:keymember(Mod, 1, Installed) + end, + available() + ). + +parse_and_execute(Query, Node) -> + {[Exec], _} = lists:partition( + fun(ExType) -> + lists:keymember(ExType, 1, Query) + end, + [<<"updatespecs">>] + ), + Commands = {get_val(<<"updatespecs">>, Query)}, + {_, R} = parse1_command(Exec, Commands, Node), + {Commands, R}. + +get_val(Val, Query) -> + {value, {_, R}} = lists:keysearch(Val, 1, Query), + binary_to_list(R). + +parse1_command(<<"updatespecs">>, {_}, _Node) -> + Res = update(), + {oook, io_lib:format("~p", [Res])}. + +list_modules_parse_query(Query) -> + case {lists:keysearch(<<"install">>, 1, Query), + lists:keysearch(<<"upgrade">>, 1, Query), + lists:keysearch(<<"uninstall">>, 1, Query)} + of + {{value, _}, _, _} -> list_modules_parse_install(Query); + {_, {value, _}, _} -> list_modules_parse_upgrade(Query); + {_, _, {value, _}} -> list_modules_parse_uninstall(Query); + _ -> nothing + end. + +list_modules_parse_install(Query) -> + lists:foreach( + fun({Mod, _}) -> + ModBin = misc:atom_to_binary(Mod), + case lists:member({<<"selected_install">>, ModBin}, Query) of + true -> install(Mod); + _ -> ok + end + end, + get_available_notinstalled()), + ok. + +list_modules_parse_upgrade(Query) -> + lists:foreach( + fun({Mod, _}) -> + ModBin = misc:atom_to_binary(Mod), + case lists:member({<<"selected_upgrade">>, ModBin}, Query) of + true -> upgrade(Mod); + _ -> ok + end + end, + installed()), + ok. + +list_modules_parse_uninstall(Query) -> + lists:foreach( + fun({Mod, _}) -> + ModBin = misc:atom_to_binary(Mod), + case lists:member({<<"selected_uninstall">>, ModBin}, Query) of + true -> uninstall(Mod); + _ -> ok + end + end, + installed()), + ok. From a38ed7fb2c79e849ddb0767fe7c3ad38afdd74b0 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Jul 2022 12:29:06 +0200 Subject: [PATCH 359/440] Handle not found COMMIT.json, for example in GH Actions --- src/ext_mod.erl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index e4330e3a8..df2d0c676 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -752,7 +752,9 @@ find_commit_json(Attrs) -> {{ok, FromFile}, _} -> FromFile; {_, {ok, FromFile}} -> - FromFile + FromFile; + _ -> + not_found end. -ifdef(HAVE_URI_STRING). %% Erlang/OTP 20 or higher can use this: @@ -779,8 +781,12 @@ find_commit_json_path(Path) -> copy_commit_json(Package, Attrs) -> DestPath = module_lib_dir(Package), - FromFile = find_commit_json(Attrs), - file:copy(FromFile, filename:join(DestPath, "COMMIT.json")). + case find_commit_json(Attrs) of + not_found -> + ok; + FromFile -> + file:copy(FromFile, filename:join(DestPath, "COMMIT.json")) + end. get_commit_details(Dirname) -> RepDir = filename:join(sources_dir(), Dirname), From bc8050eb03453b4c1b221394a95ec0aac406f803 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Jul 2022 12:40:07 +0200 Subject: [PATCH 360/440] Don't bother with COMMIT.json user-friendly feature in automated user case --- src/ext_mod.erl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index df2d0c676..7058cd7ac 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -391,7 +391,7 @@ extract_github_master(Repos, DestDir) -> ok -> RepDir = filename:join(DestDir, module_name(Repos)), file:rename(RepDir++"-master", RepDir), - write_commit_json(Url, RepDir); + maybe_write_commit_json(Url, RepDir); Error -> Error end. @@ -736,6 +736,14 @@ format({Key, Val}) -> % TODO: improve Yaml parsing %% -- COMMIT.json +maybe_write_commit_json(Url, RepDir) -> + case (os:getenv("GITHUB_ACTIONS") == "true") of + true -> + ok; + false -> + write_commit_json(Url, RepDir) + end. + write_commit_json(Url, RepDir) -> Url2 = string_replace(Url, "https://github.com", "https://api.github.com/repos"), BranchUrl = lists:flatten(Url2 ++ "/branches/master"), From 1ea53bf9405498ed7fc6656979f64f5c9aaea80e Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 27 Jul 2022 11:47:16 +0200 Subject: [PATCH 361/440] Add syntax_tools to applications, required when using ejabberd_sql_pt (#3869) --- mix.exs | 2 +- src/ejabberd.app.src.script | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index b3348a6ec..6f2d6ffbc 100644 --- a/mix.exs +++ b/mix.exs @@ -43,7 +43,7 @@ defmodule Ejabberd.MixProject do extra_applications: [:mix], applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose, - :p1_utils, :stringprep, :yconf], + :p1_utils, :stringprep, :syntax_tools, :yconf], included_applications: [:mnesia, :os_mon, :cache_tab, :eimp, :mqtree, :p1_acme, :p1_oauth2, :pkix, :xmpp] diff --git a/src/ejabberd.app.src.script b/src/ejabberd.app.src.script index a657b640b..4c8745146 100644 --- a/src/ejabberd.app.src.script +++ b/src/ejabberd.app.src.script @@ -14,7 +14,7 @@ Vars = case file:consult(filename:join([filename:dirname(SCRIPT), "..", "vars.co Vars ++ [{modules, []}, {registered, []}, - {applications, [kernel, sasl, ssl, stdlib]}, + {applications, [kernel, sasl, ssl, stdlib, syntax_tools]}, {included_applications, [compiler, inets, mnesia, os_mon, cache_tab, From 3d329c7e8f43bc2a8ac05ad2c54b13df184894ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 28 Jul 2022 13:17:35 +0200 Subject: [PATCH 362/440] Make connection close errors bubble up from inside sql transaction --- src/ejabberd_sql.erl | 72 ++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 1e32a87c8..d4d7c74a8 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -479,6 +479,12 @@ handle_reconnect(Reason, #state{host = Host, reconnect_count = RC} = State) -> "** Retry after: ~B seconds", [State#state.db_type, Reason, StartInterval div 1000]), + case State#state.db_type of + mysql -> catch p1_mysql_conn:stop(State#state.db_ref); + sqlite -> catch sqlite3:close(sqlite_db(State#state.host)); + pgsql -> catch pgsql:terminate(State#state.db_ref); + _ -> ok + end, p1_fsm:send_event_after(StartInterval, connect), {next_state, connecting, State#state{reconnect_count = RC + 1}}. @@ -562,9 +568,7 @@ outer_transaction(F, NRestarts, _Reason) -> {atomic, Res} catch ?EX_RULE(throw, {aborted, Reason}, _) when NRestarts > 0 -> - sql_rollback(), - put(?NESTING_KEY, ?TOP_LEVEL_TXN), - outer_transaction(F, NRestarts - 1, Reason); + rollback_transaction(F, NRestarts, Reason); ?EX_RULE(throw, {aborted, Reason}, Stack) when NRestarts =:= 0 -> StackTrace = ?EX_STACK(Stack), ?ERROR_MSG("SQL transaction restarts exceeded~n** " @@ -573,11 +577,36 @@ outer_transaction(F, NRestarts, _Reason) -> "== ~p", [?MAX_TRANSACTION_RESTARTS, Reason, StackTrace, get(?STATE_KEY)]), - sql_rollback(), - {aborted, Reason}; + rollback_transaction(F, NRestarts, Reason); ?EX_RULE(exit, Reason, _) -> - sql_rollback(), - {aborted, Reason} + rollback_transaction(F, 0, Reason) + end. + +rollback_transaction(F, NRestarts, Reason) -> + Res = case driver_restart_required(Reason) of + true -> + {aborted, Reason}; + _ -> + case sql_rollback() of + {Tag, Reason2} when Tag == error; Tag == aborted -> + case driver_restart_required(Reason2) of + true -> + {aborted, Reason2}; + _ -> + continue + end; + _ -> + continue + end + end, + case Res of + continue when NRestarts > 0 -> + put(?NESTING_KEY, ?TOP_LEVEL_TXN), + outer_transaction(F, NRestarts - 1, Reason); + continue -> + {aborted, Reason}; + Other -> + Other end. execute_bloc(F) -> @@ -865,23 +894,22 @@ sql_rollback() -> [{mssql, [<<"rollback transaction;">>]}, {any, [<<"rollback;">>]}]). +driver_restart_required(<<"query timed out">>) -> true; +driver_restart_required(<<"connection closed">>) -> true; +driver_restart_required(<<"Failed sending data on socket", _/binary>>) -> true; +driver_restart_required(<<"SQL connection failed">>) -> true; +driver_restart_required(<<"Communication link failure">>) -> true; +driver_restart_required(_) -> false. + %% Generate the OTP callback return tuple depending on the driver result. -abort_on_driver_error({error, <<"query timed out">>} = Reply, From, Timestamp) -> +abort_on_driver_error({Tag, Msg} = Reply, From, Timestamp) when Tag == error; Tag == aborted -> reply(From, Reply, Timestamp), - {stop, timeout, get(?STATE_KEY)}; -abort_on_driver_error({error, <<"connection closed">>} = Reply, From, Timestamp) -> - reply(From, Reply, Timestamp), - handle_reconnect(<<"connection closed">>, get(?STATE_KEY)); -abort_on_driver_error({error, <<"Failed sending data on socket", _/binary>>} = Reply, - From, Timestamp) -> - reply(From, Reply, Timestamp), - {stop, closed, get(?STATE_KEY)}; -abort_on_driver_error({error, <<"SQL connection failed">>} = Reply, From, Timestamp) -> - reply(From, Reply, Timestamp), - {stop, timeout, get(?STATE_KEY)}; -abort_on_driver_error({error, <<"Communication link failure">>} = Reply, From, Timestamp) -> - reply(From, Reply, Timestamp), - {stop, closed, get(?STATE_KEY)}; + case driver_restart_required(Msg) of + true -> + handle_reconnect(Msg, get(?STATE_KEY)); + _ -> + {next_state, session_established, get(?STATE_KEY)} + end; abort_on_driver_error(Reply, From, Timestamp) -> reply(From, Reply, Timestamp), {next_state, session_established, get(?STATE_KEY)}. From 2b3644c8ac7dc4cc81b73332964f860d8186a31d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 28 Jul 2022 19:24:28 +0200 Subject: [PATCH 363/440] Handle errors reported from begin/commit inside transaction --- src/ejabberd_sql.erl | 80 +++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index d4d7c74a8..53135e8f4 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -560,44 +560,54 @@ outer_transaction(F, NRestarts, _Reason) -> [T]), erlang:exit(implementation_faulty) end, - sql_begin(), - put(?NESTING_KEY, PreviousNestingLevel + 1), - try F() of - Res -> - sql_commit(), - {atomic, Res} - catch - ?EX_RULE(throw, {aborted, Reason}, _) when NRestarts > 0 -> - rollback_transaction(F, NRestarts, Reason); - ?EX_RULE(throw, {aborted, Reason}, Stack) when NRestarts =:= 0 -> - StackTrace = ?EX_STACK(Stack), - ?ERROR_MSG("SQL transaction restarts exceeded~n** " - "Restarts: ~p~n** Last abort reason: " - "~p~n** Stacktrace: ~p~n** When State " - "== ~p", - [?MAX_TRANSACTION_RESTARTS, Reason, - StackTrace, get(?STATE_KEY)]), - rollback_transaction(F, NRestarts, Reason); - ?EX_RULE(exit, Reason, _) -> - rollback_transaction(F, 0, Reason) + case sql_begin() of + {error, Reason} -> + maybe_restart_transaction(F, NRestarts, Reason, false); + _ -> + put(?NESTING_KEY, PreviousNestingLevel + 1), + try F() of + Res -> + case sql_commit() of + {error, Reason} -> + restart(Reason); + _ -> + {atomic, Res} + end + catch + ?EX_RULE(throw, {aborted, Reason}, _) when NRestarts > 0 -> + maybe_restart_transaction(F, NRestarts, Reason, true); + ?EX_RULE(throw, {aborted, Reason}, Stack) when NRestarts =:= 0 -> + StackTrace = ?EX_STACK(Stack), + ?ERROR_MSG("SQL transaction restarts exceeded~n** " + "Restarts: ~p~n** Last abort reason: " + "~p~n** Stacktrace: ~p~n** When State " + "== ~p", + [?MAX_TRANSACTION_RESTARTS, Reason, + StackTrace, get(?STATE_KEY)]), + maybe_restart_transaction(F, NRestarts, Reason, true); + ?EX_RULE(exit, Reason, _) -> + maybe_restart_transaction(F, 0, Reason, true) + end end. -rollback_transaction(F, NRestarts, Reason) -> +maybe_restart_transaction(F, NRestarts, Reason, DoRollback) -> Res = case driver_restart_required(Reason) of - true -> - {aborted, Reason}; - _ -> - case sql_rollback() of - {Tag, Reason2} when Tag == error; Tag == aborted -> - case driver_restart_required(Reason2) of - true -> - {aborted, Reason2}; - _ -> - continue - end; - _ -> - continue - end + true -> + {aborted, Reason}; + _ when DoRollback -> + case sql_rollback() of + {error, Reason2} -> + case driver_restart_required(Reason2) of + true -> + {aborted, Reason2}; + _ -> + continue + end; + _ -> + continue + end; + _ -> + continue end, case Res of continue when NRestarts > 0 -> From 9b647a7afec222cb009b7aba649b5f00386138b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 28 Jul 2022 19:25:17 +0200 Subject: [PATCH 364/440] Skip connection exit message when we triggered reconnection --- src/ejabberd_sql.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 53135e8f4..3cd2dc345 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -443,6 +443,8 @@ handle_sync_event(_Event, _From, StateName, State) -> code_change(_OldVsn, StateName, State, _Extra) -> {ok, StateName, State}. +handle_info({'EXIT', _Pid, _Reason}, connecting, State) -> + {next_state, connecting, State}; handle_info({'EXIT', _Pid, Reason}, _StateName, State) -> handle_reconnect(Reason, State); handle_info(Info, StateName, State) -> From 555ff2db4c051ce5263f8e1dfc958aad0c0d186a Mon Sep 17 00:00:00 2001 From: Mark Zealey <6083471+mzealey@users.noreply.github.com> Date: Mon, 1 Aug 2022 11:07:54 +0100 Subject: [PATCH 365/440] Add log_burst_limit_* options (#3865) * Add log_burst_limit_* options On our ejabberd deployment we were sometimes seeing more than 500 msgs/sec of legitimate traffic, however this was getting silently dropped. Provide config options to enable this limit to be configured from the config file. * Pass new logging vars in via ejabberdctl --- .github/container/ejabberdctl.template | 4 +++- ejabberdctl.template | 4 +++- src/ejabberd_logger.erl | 6 +++++- src/ejabberd_option.erl | 10 ++++++++++ src/ejabberd_options.erl | 8 ++++++++ src/ejabberd_options_doc.erl | 11 +++++++++++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index 02284cc79..7ba20d68e 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -91,7 +91,9 @@ ERL_INETRC="$CONFIG_DIR"/inetrc # define ejabberd parameters EJABBERD_OPTS="$EJABBERD_OPTS\ $(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ -$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")" +$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ +$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ +$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")" [ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS" EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd" diff --git a/ejabberdctl.template b/ejabberdctl.template index 5b9ef36cb..60b295c27 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -90,7 +90,9 @@ ERL_INETRC="$CONFIG_DIR"/inetrc # define ejabberd parameters EJABBERD_OPTS="$EJABBERD_OPTS\ $(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ -$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")" +$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ +$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\ +$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")" [ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS" EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd" diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl index e4fe34e0e..3d6c08650 100644 --- a/src/ejabberd_logger.erl +++ b/src/ejabberd_logger.erl @@ -266,13 +266,17 @@ start(Level) -> ErrorLog = filename:join([Dir, "error.log"]), LogRotateSize = get_integer_env(log_rotate_size, 10*1024*1024), LogRotateCount = get_integer_env(log_rotate_count, 1), + LogBurstLimitWindowTime = get_integer_env(log_burst_limit_window_time, 1000), + LogBurstLimitCount = get_integer_env(log_burst_limit_count, 500), Config = #{max_no_bytes => LogRotateSize, max_no_files => LogRotateCount, filesync_repeat_interval => no_repeat, file_check => 1000, sync_mode_qlen => 1000, drop_mode_qlen => 1000, - flush_qlen => 5000}, + flush_qlen => 5000, + burst_limit_window_time => LogBurstLimitWindowTime, + burst_limit_max_count => LogBurstLimitCount}, FmtConfig = #{legacy_header => false, time_designator => $ , max_size => 100*1024, diff --git a/src/ejabberd_option.erl b/src/ejabberd_option.erl index 29b5b40e8..063502f80 100644 --- a/src/ejabberd_option.erl +++ b/src/ejabberd_option.erl @@ -72,6 +72,8 @@ -export([ldap_tls_verify/0, ldap_tls_verify/1]). -export([ldap_uids/0, ldap_uids/1]). -export([listen/0]). +-export([log_burst_limit_count/0]). +-export([log_burst_limit_window_time/0]). -export([log_rotate_count/0]). -export([log_rotate_size/0]). -export([loglevel/0]). @@ -583,6 +585,14 @@ ldap_uids(Host) -> listen() -> ejabberd_config:get_option({listen, global}). +-spec log_burst_limit_count() -> pos_integer(). +log_burst_limit_count() -> + ejabberd_config:get_option({log_burst_limit_count, global}). + +-spec log_burst_limit_window_time() -> pos_integer(). +log_burst_limit_window_time() -> + ejabberd_config:get_option({log_burst_limit_window_time, global}). + -spec log_rotate_count() -> non_neg_integer(). log_rotate_count() -> ejabberd_config:get_option({log_rotate_count, global}). diff --git a/src/ejabberd_options.erl b/src/ejabberd_options.erl index 8837ef475..bbf218532 100644 --- a/src/ejabberd_options.erl +++ b/src/ejabberd_options.erl @@ -222,6 +222,10 @@ opt_type(log_rotate_count) -> econf:non_neg_int(); opt_type(log_rotate_size) -> econf:pos_int(infinity); +opt_type(log_burst_limit_window_time) -> + econf:timeout(second); +opt_type(log_burst_limit_count) -> + econf:pos_int(); opt_type(loglevel) -> fun(N) when is_integer(N) -> (econf:and_then( @@ -576,6 +580,8 @@ options() -> {listen, []}, {log_rotate_count, 1}, {log_rotate_size, 10*1024*1024}, + {log_burst_limit_window_time, timer:seconds(1)}, + {log_burst_limit_count, 500}, {max_fsm_queue, undefined}, {modules, []}, {negotiation_timeout, timer:seconds(30)}, @@ -722,6 +728,8 @@ globals() -> loglevel, log_rotate_count, log_rotate_size, + log_burst_limit_count, + log_burst_limit_window_time, negotiation_timeout, net_ticktime, new_sql_schema, diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 9d4cea829..1d1dd8913 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -815,6 +815,17 @@ doc() -> ?T("The size (in bytes) of a log file to trigger rotation. " "If set to 'infinity', log rotation is disabled. " "The default value is '10485760' (that is, 10 Mb).")}}, + {log_burst_limit_count, + #{value => ?T("Number"), + desc => + ?T("The number of messages to accept in " + "`log_burst_limit_window_time` period before starting to " + "drop them. Default 500")}}, + {log_burst_limit_window_time, + #{value => ?T("Number"), + desc => + ?T("The time period to rate-limit log messages " + "by. Defaults to 1 second.")}}, {max_fsm_queue, #{value => ?T("Size"), desc => From a798a21386a822c92284854b4b6deef3a9bc5950 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 4 Aug 2022 11:46:39 +0200 Subject: [PATCH 366/440] CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d9b5d164..30b108d6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -113,6 +113,9 @@ jobs: echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config + - name: Remove syntax_tools from release + run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script + - name: Cache rebar uses: actions/cache@v3 with: @@ -262,7 +265,7 @@ jobs: sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ejabberd_test;" - sudo sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl + sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl - run: CT_BACKENDS=mysql,pgsql make test id: ctnewschema - name: Check results From 00e6b0c97c74015a8266e75b8277c70248c81d8d Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 4 Aug 2022 12:25:53 +0200 Subject: [PATCH 367/440] Show allow_query_users room option in disco info (#3830) --- rebar.config | 2 +- src/mod_muc_room.erl | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index d0b009848..22c66beae 100644 --- a/rebar.config +++ b/rebar.config @@ -70,7 +70,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.2"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.8"}}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}} ]}. diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index d2eb80cc4..961b51762 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -4321,6 +4321,7 @@ iq_disco_info_extras(Lang, StateData, Static) -> {description, Config#config.description}, {changesubject, Config#config.allow_change_subj}, {allowinvites, Config#config.allow_user_invites}, + {allow_query_users, Config#config.allow_query_users}, {allowpm, AllowPM}, {lang, Config#config.lang}], Fs2 = case Config#config.pubsub of From 72944d895b9f5004a83b870ba8a4c82c39c84dff Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 4 Aug 2022 17:09:44 +0200 Subject: [PATCH 368/440] ext_mod: Handle correctly when COMMIT.json not found --- src/ext_mod.erl | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 7058cd7ac..8ff4015d5 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -805,10 +805,11 @@ get_commit_details2(Path) -> {ok, Body} -> parse_details(Body); _ -> - #{sha => <<"1234567890">>, + #{sha => unknown_sha, date => <<>>, message => <<>>, html => <<>>, + author_name => <<>>, commit_html_url => <<>>} end. @@ -891,8 +892,10 @@ get_installed_module_el({ModAtom, Attrs}, Lang) -> Summary = list_to_binary(get_module_summary(Attrs)), Author = list_to_binary(get_module_author(Attrs)), {_, FromPath} = lists:keyfind(path, 1, Attrs), - {ok, FromFile} = find_commit_json_path(FromPath), - + FromFile = case find_commit_json_path(FromPath) of + {ok, FF} -> FF; + {error, _} -> "dummypath" + end, #{sha := CommitSha, date := CommitDate, message := CommitMessage, @@ -925,7 +928,7 @@ get_installed_module_el({ModAtom, Attrs}, Lang) -> Started = case gen_mod:is_loaded(hd(ejabberd_option:hosts()), ModAtom) of false -> - [?C(<<" - ">>)]; + [?C(<<" ">>)]; true -> [] end, @@ -942,8 +945,8 @@ get_installed_module_el({ModAtom, Attrs}, Lang) -> ?XE(<<"td">>, [?INPUTTD(<<"checkbox">>, <<"selected_uninstall">>, Mod), ?C(<<" ">>), - ?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8})), - ?C(<<" ">>)] + get_commit_link(CommitHtmlUrl, TitleEl, CommitSha), + ?C(<<" - ">>)] ++ Started ++ Status) | UpgradeEls]). @@ -1006,6 +1009,11 @@ make_home_title_el(Summary, Author) -> LinkTitle = <>, {<<"title">>, LinkTitle}. +get_commit_link(_CommitHtmlUrl, _TitleErl, unknown_sha) -> + ?C(<<"Please Update Specs">>); +get_commit_link(CommitHtmlUrl, TitleEl, CommitSha) -> + ?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8})). + get_content(Node, Query, Lang) -> Instruct = translate:translate(Lang, ?T("Type a command in a textbox and click Execute.")), {{_CommandCtl}, _Res} = @@ -1034,7 +1042,7 @@ get_content(Node, Query, Lang) -> ?XE(<<"tr">>, [?XE(<<"td">>, [?AC(Html, Dirname)]), ?XE(<<"td">>, - [?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8}))] + [get_commit_link(CommitHtmlUrl, TitleEl, CommitSha)] ), ?XE(<<"td">>, [?C(CommitMessage)]) ]) From 7d8fa3c88075b598a0bf636285c736bc94fc8266 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 5 Aug 2022 16:10:25 +0200 Subject: [PATCH 369/440] ext_mod: Support managing remote nodes in the cluster --- src/ext_mod.erl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 8ff4015d5..3b9db2940 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -36,7 +36,7 @@ config_dir/0, get_commands_spec/0]). -export([modules_configs/0, module_ebin_dir/1]). -export([compile_erlang_file/2, compile_elixir_file/2]). --export([web_menu_node/3, web_page_node/5]). +-export([web_menu_node/3, web_page_node/5, get_page/3]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -858,6 +858,12 @@ web_menu_node(Acc, _Node, Lang) -> Acc ++ [{<<"contrib">>, translate:translate(Lang, ?T("Contrib Modules"))}]. web_page_node(_, Node, [<<"contrib">>], Query, Lang) -> + Res = rpc:call(Node, ?MODULE, get_page, [Node, Query, Lang]), + {stop, Res}; +web_page_node(Acc, _, _, _, _) -> + Acc. + +get_page(Node, Query, Lang) -> QueryRes = list_modules_parse_query(Query), Title = ?H1GL(translate:translate(Lang, ?T("Contrib Modules")), <<"../../developer/extending-ejabberd/modules/#ejabberd-contrib">>, @@ -867,10 +873,7 @@ web_page_node(_, Node, [<<"contrib">>], Query, Lang) -> ok -> [?XREST(?T("Submitted"))]; nothing -> [] end, - Res = Title ++ Result ++ Contents, - {stop, Res}; -web_page_node(Acc, _, _, _, _) -> - Acc. + Title ++ Result ++ Contents. get_module_home(Module, Attrs) -> case element(2, lists:keyfind(home, 1, Attrs)) of From 682c2587607aa56b7c5fc7759961ae9416a4af01 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 8 Aug 2022 12:15:09 +0200 Subject: [PATCH 370/440] Copy ejabberd-docker-install.bat from docker-ejabberd git and rename it --- .../container/ejabberd-container-install.bat | 292 ++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100755 .github/container/ejabberd-container-install.bat diff --git a/.github/container/ejabberd-container-install.bat b/.github/container/ejabberd-container-install.bat new file mode 100755 index 000000000..aedcd4165 --- /dev/null +++ b/.github/container/ejabberd-container-install.bat @@ -0,0 +1,292 @@ +@echo off + +:: +:: ejabberd Docker installer for Windows +:: ------------------------------------- +:: v0.3 +:: +:: This batch script downloads an ejabberd docker image +:: and setups a docker container to run ejabberd. + +:: +:: 1. Download and install Docker: +:: +:: If you use Windows 10, download Docker Desktop from: +:: https://www.docker.com/ +:: +:: If you use Windows 7 or 8, download Docker Toolbox from: +:: https://github.com/docker/toolbox/releases +:: After installation, run Docker Quickstart Installer +:: + +:: +:: 2. Edit those options: + +:: Directory where your ejabberd deployment files will be installed +:: (configuration, database, logs, ...) +:: +:: In Windows 10 you can configure the path: + +set INSTALL_DIR_WINDOWS10=C:\ejabberd + +:: In older Windows, not configurable, it will be installed in: +:: C:\Users\%USERNAME%\ejabberd + +:: Please enter the desired ejabberd domain name. +:: The domain is the visible attribute that is added to the username +:: to form the Jabber Identifier (for example: user@example.net). +:: This computer must be known on the network with this address name. +:: You can later add more in conf/ejabberd.yml + +set HOST=localhost + +:: Please enter the administrator username for the current +:: ejabberd installation. A Jabber account with this username +:: will be created and granted administrative privileges. +:: Don't use blankspaces in the username. + +set USER=admin + +:: Please provide a password for that new administrator account + +set PASSWORD= + +:: By default this downloads 'latest' ejabberd version, +:: but you can set a specific version, for example 21.01 + +set VERSION=latest + +:: This tells docker what ports ejabberd will use. +:: You can later configure them in conf/ejabberd.yml + +set PORTS=5180 5222 5269 5443 + +:: +:: 3. Now save this script and run it. +:: + +:: +:: 4. When installation is completed: +:: +:: If using Windows 10, open Docker Desktop and you can: +:: +:: - (>) START the ejabberd container +:: - Enter WebAdmin: click the ([->]) OPEN IN BROWSER button +:: - To try ejabberdctl, click the (>_) CLI button, then: bin/ejabberdctl +:: - ([]) STOP the ejabberd container +:: +:: If using an old Windows, open Kitematic and you can: +:: +:: - START the ejabberd container +:: - Open your configuration, logs, ... in Settings > Volumes +:: - Enter WebAdmin in Settings > Hostname/Ports > click on the 5180 port +:: - Try ejabberdctl in EXEC, then: bin/ejabberdctl +:: - STOP the ejabberd container +:: +:: You can delete the container and create it again running this script, +:: the configuration and database are maintained. +:: + +::=============================================================== +:: Check Windows version +:: +::=============================================================== + +set INSTALL_DIR_DOCKER=c/Users/%USERNAME%/ejabberd + +for /f "tokens=4-5 delims=. " %%i in ('ver') do set WVERSION=%%i.%%j +if "%wversion%" == "10.0" ( + echo === Preparing paths to install in Windows 10... + set INSTALL_DIR=%INSTALL_DIR_WINDOWS10% + set VC=-v %INSTALL_DIR_WINDOWS10%\conf:/home/ejabberd/conf + set VD=-v %INSTALL_DIR_WINDOWS10%\database:/home/ejabberd/database + set VL=-v %INSTALL_DIR_WINDOWS10%\logs:/home/ejabberd/logs + set VM=-v %INSTALL_DIR_WINDOWS10%\ejabberd-modules:/home/ejabberd/.ejabberd-modules + set DOCKERDOWNLOAD="First download and install Docker Desktop from https://www.docker.com/" +) else ( + echo === Preparing paths to install in Windows older than 10... + set INSTALL_DIR=C:\Users\%USERNAME%\ejabberd + set VC=-v "/%INSTALL_DIR_DOCKER%/conf:/home/ejabberd/conf" + set VD=-v "/%INSTALL_DIR_DOCKER%/database:/home/ejabberd/database" + set VL=-v "/%INSTALL_DIR_DOCKER%/logs:/home/ejabberd/logs" + set VM=-v "/%INSTALL_DIR_DOCKER%/ejabberd-modules:/home/ejabberd/.ejabberd-modules" + set DOCKERDOWNLOAD="First download and install Docker Toolbox from https://github.com/docker/toolbox/releases" +) +set VOLUMES=%VC% %VD% %VL% %VM% + +::=============================================================== +:: Check docker is installed +:: +::=============================================================== + +docker version >NUL +if %ERRORLEVEL% NEQ 0 ( + echo. + echo === ERROR: It seems docker is not installed!!! + echo. + echo %DOCKERDOWNLOAD% + echo === Then try to run this script again. + echo. + pause + exit 1 +) + +::=============================================================== +:: Check install options are correctly set +:: +::=============================================================== + +if [%PASSWORD%]==[] ( + echo. + echo === ERROR: PASSWORD not set!!! + echo. + echo === Please edit this script and set the PASSWORD. + echo === Then try to run this script again. + echo. + pause + exit 1 +) + +::=============================================================== +:: Download Docker image +:: +::=============================================================== + +set IMAGE=ejabberd/ecs:%VERSION% + +echo. +echo === Checking if the '%IMAGE%' docker image was already downloaded... +docker image history %IMAGE% >NUL +if %ERRORLEVEL% NEQ 0 ( + echo === The '%IMAGE%' docker image was not downloaded yet. + echo. + echo === Downloading the '%IMAGE%' docker image, please wait... + docker pull %IMAGE% +) else ( + echo === The '%IMAGE%' docker image was already downloaded. +) + +::=============================================================== +:: Create preliminary container +:: +::=============================================================== + +echo. +echo === Checking if the 'ejabberd' docker container already exists... +docker container logs ejabberd +if %ERRORLEVEL% EQU 0 ( + echo. + echo === The 'ejabberd' docker container already exists. + echo === Nothing to do, so installation finishes now. + echo === You can go to Docker Desktop and start the 'ejabberd' container. + echo. + pause + exit 1 +) else ( + echo === The 'ejabberd' docker container doesn't yet exist, + echo === so let's continue the installation process. +) + +echo. +if exist %INSTALL_DIR% ( + echo === The INSTALL_DIR %INSTALL_DIR% already exists. + echo === No need to create the preliminary 'ejabberd-pre' image. +) else ( + echo === The INSTALL_DIR %INSTALL_DIR% doesn't exist. + echo === Let's create the preliminary 'ejabberd-pre' image. + CALL :create-ejabberd-pre +) + +::=============================================================== +:: Create final container +:: +::=============================================================== + +echo. +echo === Creating the final 'ejabberd' docker container using %IMAGE% image... + +setlocal EnableDelayedExpansion +set PS= +for %%a in (%PORTS%) do ( + set PS=!PS! -p %%a:%%a +) + +docker create --name ejabberd --hostname localhost %PS% %VOLUMES% %IMAGE% + +echo. +echo === Installation completed. +echo. +pause + +EXIT /B %ERRORLEVEL% + +::=============================================================== +:: Function to create preliminary container +:: +::=============================================================== + +:create-ejabberd-pre + +echo. +echo === Creating a preliminary 'ejabberd-pre' docker image using %IMAGE% image... +docker create --name ejabberd-pre --hostname localhost %IMAGE% + +echo. +echo === Now 'ejabberd-pre' will be started. +docker container start ejabberd-pre + +echo. +echo === Waiting ejabberd to be running... +set /A timeout = 10 +set status=4 +goto :while + +:statusstart +docker exec -it ejabberd-pre bin/ejabberdctl status +goto :statusend + +:while +if %status% GTR 0 ( + echo. + timeout /t 1 /nobreak >NUL + set /A timeout = timeout - 1 + if %timeout% EQU 0 ( + set status=-1 + ) else ( + goto :statusstart + :statusend + set status=%ERRORLEVEL% + ) + goto :while +) + +echo. +echo === Setting a few options... +docker exec -it ejabberd-pre sed -i "s!- localhost!- %HOST%!g" conf/ejabberd.yml +docker exec -it ejabberd-pre sed -i "s!admin@localhost!%USER%@%HOST%!g" conf/ejabberd.yml +docker exec -it ejabberd-pre sed -i "s!5280!5180!g" conf/ejabberd.yml +docker exec -it ejabberd-pre sed -i "s!\"/admin\"!/!g" conf/ejabberd.yml +docker exec -it ejabberd-pre bin/ejabberdctl reload_config + +echo. +echo === Registering the administrator account... +docker exec -it ejabberd-pre bin/ejabberdctl register %USER% %HOST% %PASSWORD% +docker exec -it ejabberd-pre bin/ejabberdctl stop + +echo. +echo === Copying conf, database, logs... +mkdir %INSTALL_DIR% +mkdir %INSTALL_DIR%\conf +mkdir %INSTALL_DIR%\database +mkdir %INSTALL_DIR%\logs +mkdir %INSTALL_DIR%\ejabberd-modules +docker cp ejabberd-pre:/home/ejabberd/conf/ %INSTALL_DIR% +docker cp ejabberd-pre:/home/ejabberd/database/ %INSTALL_DIR% +docker cp ejabberd-pre:/home/ejabberd/logs/ %INSTALL_DIR% + +echo. +echo === Deleting the preliminary 'ejabberd-pre' docker image... +docker stop ejabberd-pre +docker rm ejabberd-pre + +EXIT /B 0 From f080aa5fd98f92e83c9b6cf6edd8fd3f89cd70ef Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 8 Aug 2022 12:18:03 +0200 Subject: [PATCH 371/440] Apply the minimal changes required to use the GHCR image --- .../container/ejabberd-container-install.bat | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/container/ejabberd-container-install.bat b/.github/container/ejabberd-container-install.bat index aedcd4165..5d3abacea 100755 --- a/.github/container/ejabberd-container-install.bat +++ b/.github/container/ejabberd-container-install.bat @@ -98,18 +98,18 @@ for /f "tokens=4-5 delims=. " %%i in ('ver') do set WVERSION=%%i.%%j if "%wversion%" == "10.0" ( echo === Preparing paths to install in Windows 10... set INSTALL_DIR=%INSTALL_DIR_WINDOWS10% - set VC=-v %INSTALL_DIR_WINDOWS10%\conf:/home/ejabberd/conf - set VD=-v %INSTALL_DIR_WINDOWS10%\database:/home/ejabberd/database - set VL=-v %INSTALL_DIR_WINDOWS10%\logs:/home/ejabberd/logs - set VM=-v %INSTALL_DIR_WINDOWS10%\ejabberd-modules:/home/ejabberd/.ejabberd-modules + set VC=-v %INSTALL_DIR_WINDOWS10%\conf:/opt/ejabberd/conf + set VD=-v %INSTALL_DIR_WINDOWS10%\database:/opt/ejabberd/database + set VL=-v %INSTALL_DIR_WINDOWS10%\logs:/opt/ejabberd/logs + set VM=-v %INSTALL_DIR_WINDOWS10%\ejabberd-modules:/opt/ejabberd/.ejabberd-modules set DOCKERDOWNLOAD="First download and install Docker Desktop from https://www.docker.com/" ) else ( echo === Preparing paths to install in Windows older than 10... set INSTALL_DIR=C:\Users\%USERNAME%\ejabberd - set VC=-v "/%INSTALL_DIR_DOCKER%/conf:/home/ejabberd/conf" - set VD=-v "/%INSTALL_DIR_DOCKER%/database:/home/ejabberd/database" - set VL=-v "/%INSTALL_DIR_DOCKER%/logs:/home/ejabberd/logs" - set VM=-v "/%INSTALL_DIR_DOCKER%/ejabberd-modules:/home/ejabberd/.ejabberd-modules" + set VC=-v "/%INSTALL_DIR_DOCKER%/conf:/opt/ejabberd/conf" + set VD=-v "/%INSTALL_DIR_DOCKER%/database:/opt/ejabberd/database" + set VL=-v "/%INSTALL_DIR_DOCKER%/logs:/opt/ejabberd/logs" + set VM=-v "/%INSTALL_DIR_DOCKER%/ejabberd-modules:/opt/ejabberd/.ejabberd-modules" set DOCKERDOWNLOAD="First download and install Docker Toolbox from https://github.com/docker/toolbox/releases" ) set VOLUMES=%VC% %VD% %VL% %VM% @@ -152,7 +152,7 @@ if [%PASSWORD%]==[] ( :: ::=============================================================== -set IMAGE=ejabberd/ecs:%VERSION% +set IMAGE=ghcr.io/processone/ejabberd:%VERSION% echo. echo === Checking if the '%IMAGE%' docker image was already downloaded... @@ -242,7 +242,7 @@ set status=4 goto :while :statusstart -docker exec -it ejabberd-pre bin/ejabberdctl status +docker exec -it ejabberd-pre ejabberdctl status goto :statusend :while @@ -263,15 +263,15 @@ if %status% GTR 0 ( echo. echo === Setting a few options... docker exec -it ejabberd-pre sed -i "s!- localhost!- %HOST%!g" conf/ejabberd.yml -docker exec -it ejabberd-pre sed -i "s!admin@localhost!%USER%@%HOST%!g" conf/ejabberd.yml +docker exec -it ejabberd-pre sed -i "s!^acl:!acl:\n admin:\n user:\n - \"%USER%@%HOST%\"!g" conf/ejabberd.yml docker exec -it ejabberd-pre sed -i "s!5280!5180!g" conf/ejabberd.yml -docker exec -it ejabberd-pre sed -i "s!\"/admin\"!/!g" conf/ejabberd.yml -docker exec -it ejabberd-pre bin/ejabberdctl reload_config +docker exec -it ejabberd-pre sed -i "s!/admin!/!g" conf/ejabberd.yml +docker exec -it ejabberd-pre ejabberdctl reload_config echo. echo === Registering the administrator account... -docker exec -it ejabberd-pre bin/ejabberdctl register %USER% %HOST% %PASSWORD% -docker exec -it ejabberd-pre bin/ejabberdctl stop +docker exec -it ejabberd-pre ejabberdctl register %USER% %HOST% %PASSWORD% +docker exec -it ejabberd-pre ejabberdctl stop echo. echo === Copying conf, database, logs... @@ -280,9 +280,9 @@ mkdir %INSTALL_DIR%\conf mkdir %INSTALL_DIR%\database mkdir %INSTALL_DIR%\logs mkdir %INSTALL_DIR%\ejabberd-modules -docker cp ejabberd-pre:/home/ejabberd/conf/ %INSTALL_DIR% -docker cp ejabberd-pre:/home/ejabberd/database/ %INSTALL_DIR% -docker cp ejabberd-pre:/home/ejabberd/logs/ %INSTALL_DIR% +docker cp ejabberd-pre:/opt/ejabberd/conf/ %INSTALL_DIR% +docker cp ejabberd-pre:/opt/ejabberd/database/ %INSTALL_DIR% +docker cp ejabberd-pre:/opt/ejabberd/logs/ %INSTALL_DIR% echo. echo === Deleting the preliminary 'ejabberd-pre' docker image... From c2cd592eff701dcd3ea31b5d2bd1cd23df5b9331 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 8 Aug 2022 12:24:02 +0200 Subject: [PATCH 372/440] Update documentation to reflect the GHCR image usage --- .../container/ejabberd-container-install.bat | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/container/ejabberd-container-install.bat b/.github/container/ejabberd-container-install.bat index 5d3abacea..704011a6d 100755 --- a/.github/container/ejabberd-container-install.bat +++ b/.github/container/ejabberd-container-install.bat @@ -1,11 +1,11 @@ @echo off :: -:: ejabberd Docker installer for Windows +:: ejabberd container installer for Windows :: ------------------------------------- -:: v0.3 +:: v0.4 :: -:: This batch script downloads an ejabberd docker image +:: This batch script downloads an ejabberd container image :: and setups a docker container to run ejabberd. :: @@ -52,7 +52,9 @@ set USER=admin set PASSWORD= :: By default this downloads 'latest' ejabberd version, -:: but you can set a specific version, for example 21.01 +:: but you can set a specific version, for example '22.05' +:: or the bleeding edge 'master'. See available tags in +:: https://github.com/processone/ejabberd/pkgs/container/ejabberd set VERSION=latest @@ -72,7 +74,7 @@ set PORTS=5180 5222 5269 5443 :: :: - (>) START the ejabberd container :: - Enter WebAdmin: click the ([->]) OPEN IN BROWSER button -:: - To try ejabberdctl, click the (>_) CLI button, then: bin/ejabberdctl +:: - To try ejabberdctl, click the (>_) CLI button, then: ejabberdctl :: - ([]) STOP the ejabberd container :: :: If using an old Windows, open Kitematic and you can: @@ -80,7 +82,7 @@ set PORTS=5180 5222 5269 5443 :: - START the ejabberd container :: - Open your configuration, logs, ... in Settings > Volumes :: - Enter WebAdmin in Settings > Hostname/Ports > click on the 5180 port -:: - Try ejabberdctl in EXEC, then: bin/ejabberdctl +:: - Try ejabberdctl in EXEC, then: ejabberdctl :: - STOP the ejabberd container :: :: You can delete the container and create it again running this script, @@ -155,15 +157,15 @@ if [%PASSWORD%]==[] ( set IMAGE=ghcr.io/processone/ejabberd:%VERSION% echo. -echo === Checking if the '%IMAGE%' docker image was already downloaded... +echo === Checking if the '%IMAGE%' container image was already downloaded... docker image history %IMAGE% >NUL if %ERRORLEVEL% NEQ 0 ( - echo === The '%IMAGE%' docker image was not downloaded yet. + echo === The '%IMAGE%' container image was not downloaded yet. echo. - echo === Downloading the '%IMAGE%' docker image, please wait... + echo === Downloading the '%IMAGE%' container image, please wait... docker pull %IMAGE% ) else ( - echo === The '%IMAGE%' docker image was already downloaded. + echo === The '%IMAGE%' container image was already downloaded. ) ::=============================================================== @@ -172,18 +174,18 @@ if %ERRORLEVEL% NEQ 0 ( ::=============================================================== echo. -echo === Checking if the 'ejabberd' docker container already exists... +echo === Checking if the 'ejabberd' container already exists... docker container logs ejabberd if %ERRORLEVEL% EQU 0 ( echo. - echo === The 'ejabberd' docker container already exists. + echo === The 'ejabberd' container already exists. echo === Nothing to do, so installation finishes now. echo === You can go to Docker Desktop and start the 'ejabberd' container. echo. pause exit 1 ) else ( - echo === The 'ejabberd' docker container doesn't yet exist, + echo === The 'ejabberd' container doesn't yet exist, echo === so let's continue the installation process. ) @@ -203,7 +205,7 @@ if exist %INSTALL_DIR% ( ::=============================================================== echo. -echo === Creating the final 'ejabberd' docker container using %IMAGE% image... +echo === Creating the final 'ejabberd' container using %IMAGE% image... setlocal EnableDelayedExpansion set PS= @@ -228,7 +230,7 @@ EXIT /B %ERRORLEVEL% :create-ejabberd-pre echo. -echo === Creating a preliminary 'ejabberd-pre' docker image using %IMAGE% image... +echo === Creating a preliminary 'ejabberd-pre' container using %IMAGE% image... docker create --name ejabberd-pre --hostname localhost %IMAGE% echo. @@ -285,7 +287,7 @@ docker cp ejabberd-pre:/opt/ejabberd/database/ %INSTALL_DIR% docker cp ejabberd-pre:/opt/ejabberd/logs/ %INSTALL_DIR% echo. -echo === Deleting the preliminary 'ejabberd-pre' docker image... +echo === Deleting the preliminary 'ejabberd-pre' container... docker stop ejabberd-pre docker rm ejabberd-pre From e85873873617d3b74e4556da8c30333b48144b09 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 10 Aug 2022 18:28:35 +0200 Subject: [PATCH 373/440] ejabberd_listener: Let module take over socket For some use cases, it may be necessary to allow a module to take over socket ownership during initialization. --- src/ejabberd_listener.erl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 309e167df..41eec8c1e 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -318,6 +318,9 @@ start_connection(Module, Arity, Socket, State, Sup) -> supervisor:start_child(Sup, [{gen_tcp, Socket}, State]) end, case Res of + {ok, Pid, preowned_socket} -> + Module:accept(Pid), + {ok, Pid}; {ok, Pid} -> case gen_tcp:controlling_process(Socket, Pid) of ok -> From 7564a4e95368e41cc9d63371d942ebca50f537ce Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 12 Jun 2022 15:55:59 +0200 Subject: [PATCH 374/440] mod_mix_pam: Provide MIX channels as roster entries via hook --- include/mod_roster.hrl | 3 ++- src/mod_mix_pam.erl | 26 ++++++++++++++++++++++++++ src/mod_roster.erl | 6 +++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/include/mod_roster.hrl b/include/mod_roster.hrl index 6ec05b3da..3f9a951c4 100644 --- a/include/mod_roster.hrl +++ b/include/mod_roster.hrl @@ -28,7 +28,8 @@ ask = none :: ask() | '_', groups = [] :: [binary()] | '_', askmessage = <<"">> :: binary() | '_', - xs = [] :: [fxml:xmlel()] | '_' + xs = [] :: [fxml:xmlel()] | '_', + mix_participant_id = <<>> :: binary() | '_' }). -record(roster_version, diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index e67ae2c80..9bf75d1ba 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -32,11 +32,13 @@ disco_sm_features/5, remove_user/2, process_iq/1, + get_mix_roster_items/2, webadmin_user/4, webadmin_page/3]). -include_lib("xmpp/include/xmpp.hrl"). -include("logger.hrl"). +-include("mod_roster.hrl"). -include("translate.hrl"). -include("ejabberd_http.hrl"). -include("ejabberd_web_admin.hrl"). @@ -65,6 +67,7 @@ start(Host, Opts) -> ejabberd_hooks:add(bounce_sm_packet, Host, ?MODULE, bounce_sm_packet, 50), ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, disco_sm_features, 50), ejabberd_hooks:add(remove_user, Host, ?MODULE, remove_user, 50), + ejabberd_hooks:add(roster_get, Host, ?MODULE, get_mix_roster_items, 50), ejabberd_hooks:add(webadmin_user, Host, ?MODULE, webadmin_user, 50), ejabberd_hooks:add(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0, @@ -77,6 +80,7 @@ stop(Host) -> ejabberd_hooks:delete(bounce_sm_packet, Host, ?MODULE, bounce_sm_packet, 50), ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, disco_sm_features, 50), ejabberd_hooks:delete(remove_user, Host, ?MODULE, remove_user, 50), + ejabberd_hooks:delete(roster_get, Host, ?MODULE, get_mix_roster_items, 50), ejabberd_hooks:delete(webadmin_user, Host, ?MODULE, webadmin_user, 50), ejabberd_hooks:delete(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0). @@ -208,6 +212,28 @@ process_iq(#iq{type = set, process_iq(IQ) -> xmpp:make_error(IQ, unsupported_query_error(IQ)). +-spec get_mix_roster_items([#roster{}], {binary(), binary()}) -> [#roster{}]. +get_mix_roster_items(Acc, {LUser, LServer}) -> + JID = jid:make(LUser, LServer), + case get_channels(JID) of + {ok, Channels} -> + lists:map( + fun({#jid{luser=Channel, lserver=Service}, Id}) -> + #roster{ + jid = {Channel, Service, <<>>}, + name = <<>>, + subscription = both, + ask = none, + groups = [<<"Channels">>], + askmessage = <<>>, + xs = [], + mix_participant_id = Id + } + end, Channels); + _ -> + [] + end ++ Acc. + -spec remove_user(binary(), binary()) -> ok | {error, db_failure}. remove_user(LUser, LServer) -> Mod = gen_mod:db_mod(LServer, ?MODULE), diff --git a/src/mod_roster.erl b/src/mod_roster.erl index e2b176502..d3a0c6be2 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -426,7 +426,11 @@ encode_item(Item) -> both -> subscribe; _ -> undefined end, - groups = Item#roster.groups}. + groups = Item#roster.groups, + mix_channel = case Item#roster.mix_participant_id of + <<>> -> undefined; + _ -> #mix_roster_channel{'participant-id' = Item#roster.mix_participant_id} + end}. -spec decode_item(roster_item(), #roster{}, boolean()) -> #roster{}. decode_item(#roster_item{subscription = remove} = Item, R, _) -> From 3bf0892c748739882a0a1830eead7e8b6dab5e75 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Mon, 20 Jun 2022 11:42:19 +0200 Subject: [PATCH 375/440] mod_mix_pam: Do roster pushes on join/leave Before the channels were added/removed from the database but the clients were not notified of it. --- src/mod_mix_pam.erl | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index 9bf75d1ba..9491d217a 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -293,6 +293,18 @@ process_join_result(#iq{from = Channel, #iq{to = To} = IQ) -> case add_channel(To, Channel, ID) of ok -> + % Do roster push + #jid{luser = ChannelName, lserver = Service} = Channel, + mod_roster:push_item(To, #roster{}, #roster{ + jid = {ChannelName, Service, <<>>}, + name = <<>>, + subscription = none, + ask = none, + groups = [], + askmessage = <<>>, + mix_participant_id = ID + }), + % send IQ result ChanID = make_channel_id(Channel, ID), Join1 = Join#mix_join{id = <<"">>, jid = ChanID}, ResIQ = xmpp:make_iq_result(IQ, #mix_client_join{join = Join1}), @@ -304,7 +316,15 @@ process_join_result(Err, IQ) -> process_iq_error(Err, IQ). -spec process_leave_result(iq(), iq()) -> ok. -process_leave_result(#iq{type = result, sub_els = [#mix_leave{} = Leave]}, IQ) -> +process_leave_result(#iq{from = Channel, type = result, sub_els = [#mix_leave{} = Leave]}, + #iq{to = User} = IQ) -> + % Do roster push + #jid{luser = ChannelName, lserver = Service} = Channel, + mod_roster:push_item(User, + #roster{jid = {ChannelName, Service, <<>>}, subscription = none}, + #roster{jid = {ChannelName, Service, <<>>}, + subscription = remove}), + % send iq result ResIQ = xmpp:make_iq_result(IQ, #mix_client_leave{leave = Leave}), ejabberd_router:route(ResIQ); process_leave_result(Err, IQ) -> From d450d40178f7d2077f65eb91a34c9cf525471452 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 26 Jun 2022 21:39:37 +0200 Subject: [PATCH 376/440] mod_roster: Respect MIX setting MIX extensions are not sent to clients if they haven't been enabled by the client with in the roster get request. --- src/mod_roster.erl | 69 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/src/mod_roster.erl b/src/mod_roster.erl index d3a0c6be2..27fac3131 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -64,6 +64,7 @@ -define(ROSTER_CACHE, roster_cache). -define(ROSTER_ITEM_CACHE, roster_item_cache). -define(ROSTER_VERSION_CACHE, roster_version_cache). +-define(SM_MIX_ANNOTATE, roster_mix_annotate). -type c2s_state() :: ejabberd_c2s:state(). -export_type([subscription/0]). @@ -274,11 +275,12 @@ write_roster_version(LUser, LServer, InTransaction) -> %% - roster versioning is used by server and client, BUT the server isn't storing versions on db OR %% - the roster version from client don't match current version. -spec process_iq_get(iq()) -> iq(). -process_iq_get(#iq{to = To, - sub_els = [#roster_query{ver = RequestedVersion}]} = IQ) -> +process_iq_get(#iq{to = To, from = From, + sub_els = [#roster_query{ver = RequestedVersion, mix_annotate = MixAnnotate}]} = IQ) -> LUser = To#jid.luser, LServer = To#jid.lserver, US = {LUser, LServer}, + MixEnabled = MixAnnotate == #mix_roster_annotate{}, {ItemsToSend, VersionToSend} = case {mod_roster_opt:versioning(LServer), mod_roster_opt:store_current_id(LServer)} of @@ -313,9 +315,16 @@ process_iq_get(#iq{to = To, roster_get, To#jid.lserver, [], [US])), false} end, + % Store that MIX annotation is enabled (for roster pushes) + set_mix_annotation_enabled(From, MixEnabled), + % Only include element when MIX annotation is enabled + Items = case ItemsToSend of + false -> false; + FullItems -> process_items_mix(FullItems, MixEnabled) + end, xmpp:make_iq_result( IQ, - case {ItemsToSend, VersionToSend} of + case {Items, VersionToSend} of {false, false} -> undefined; {Items, false} -> @@ -512,11 +521,12 @@ push_item(To, OldItem, NewItem) -> -spec push_item(jid(), #roster{}, #roster{}, undefined | binary()) -> ok. push_item(To, OldItem, NewItem, Ver) -> route_presence_change(To, OldItem, NewItem), + [Item] = process_items_mix([encode_item(NewItem)], To), IQ = #iq{type = set, to = To, from = jid:remove_resource(To), id = <<"push", (p1_rand:get_string())/binary>>, sub_els = [#roster_query{ver = Ver, - items = [encode_item(NewItem)]}]}, + items = [Item]}]}, ejabberd_router:route(IQ). -spec route_presence_change(jid(), #roster{}, #roster{}) -> ok. @@ -869,6 +879,57 @@ send_unsubscribing_presence(From, Item) -> true -> ok end. +%%%=================================================================== +%%% MIX +%%%=================================================================== + +-spec remove_mix_channel([#roster_item{}]) -> [#roster_item{}]. +remove_mix_channel(Items) -> + lists:map( + fun(Item) -> + Item#roster_item{mix_channel = undefined} + end, Items). + +-spec process_items_mix([#roster_item{}], boolean() | jid()) -> [#roster_item{}]. +process_items_mix(Items, true) -> Items; +process_items_mix(Items, false) -> remove_mix_channel(Items); +process_items_mix(Items, JID) -> process_items_mix(Items, is_mix_annotation_enabled(JID)). + +-spec is_mix_annotation_enabled(jid()) -> boolean(). +is_mix_annotation_enabled(#jid{luser = User, lserver = Host, lresource = Res}) -> + case ejabberd_sm:get_user_info(User, Host, Res) of + offline -> false; + Info -> + case lists:keyfind(?SM_MIX_ANNOTATE, 1, Info) of + {_, true} -> true; + _ -> false + end + end. + +-spec set_mix_annotation_enabled(jid(), boolean()) -> ok | {error, any()}. +set_mix_annotation_enabled(#jid{luser = U, lserver = Host, lresource = R} = JID, false) -> + case is_mix_annotation_enabled(JID) of + true -> + ?DEBUG("Disabling roster MIX annotation for ~ts@~ts/~ts", [U, Host, R]), + case ejabberd_sm:del_user_info(U, Host, R, ?SM_MIX_ANNOTATE) of + ok -> ok; + {error, Reason} = Err -> + ?ERROR_MSG("Failed to disable roster MIX annotation for ~ts@~ts/~ts: ~p", + [U, Host, R, Reason]), + Err + end; + false -> ok + end; +set_mix_annotation_enabled(#jid{luser = U, lserver = Host, lresource = R}, true)-> + ?DEBUG("Enabling roster MIX annotation for ~ts@~ts/~ts", [U, Host, R]), + case ejabberd_sm:set_user_info(U, Host, R, ?SM_MIX_ANNOTATE, true) of + ok -> ok; + {error, Reason} = Err -> + ?ERROR_MSG("Failed to enable roster MIX annotation for ~ts@~ts/~ts: ~p", + [U, Host, R, Reason]), + Err + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec set_items(binary(), binary(), roster_query()) -> {atomic, ok} | {aborted, any()}. From d6b72f1c5dba891d6d1bb4a24bb297170b130a73 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sat, 16 Jul 2022 23:23:48 +0200 Subject: [PATCH 377/440] mod_roster: Change hook type from #roster{} to #roster_item{} The problem with #roster{} is that every new record entry is also stored in the mnesia roster table. Adding the mix_participant_id there makes no sense because the normal roster items are no MIX channels. Using \#roster_item{} for the hook and #roster{} for storing the normal items seems to be a better idea. --- include/mod_roster.hrl | 3 +- src/ejabberd_c2s.erl | 12 ++--- src/mod_admin_extra.erl | 13 +++-- src/mod_mix_pam.erl | 32 +++++------- src/mod_roster.erl | 89 +++++++++++++++------------------- src/mod_shared_roster.erl | 22 ++++----- src/mod_shared_roster_ldap.erl | 11 ++--- 7 files changed, 79 insertions(+), 103 deletions(-) diff --git a/include/mod_roster.hrl b/include/mod_roster.hrl index 3f9a951c4..6ec05b3da 100644 --- a/include/mod_roster.hrl +++ b/include/mod_roster.hrl @@ -28,8 +28,7 @@ ask = none :: ask() | '_', groups = [] :: [binary()] | '_', askmessage = <<"">> :: binary() | '_', - xs = [] :: [fxml:xmlel()] | '_', - mix_participant_id = <<>> :: binary() | '_' + xs = [] :: [fxml:xmlel()] | '_' }). -record(roster_version, diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 6f1038947..ec5c610e8 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -777,9 +777,9 @@ broadcast_presence_unavailable(#{jid := JID, pres_a := PresA} = State, Pres, Roster = ejabberd_hooks:run_fold(roster_get, LServer, [], [{LUser, LServer}]), lists:foldl( - fun(#roster{jid = LJID, subscription = Sub}, Acc) + fun(#roster_item{jid = ItemJID, subscription = Sub}, Acc) when Sub == both; Sub == from -> - maps:put(LJID, 1, Acc); + maps:put(jid:tolower(ItemJID), 1, Acc); (_, Acc) -> Acc end, #{BareJID => 1}, Roster); @@ -813,8 +813,7 @@ broadcast_presence_available(#{jid := JID} = State, [], [{LUser, LServer}]), {FJIDs, TJIDs} = lists:foldl( - fun(#roster{jid = LJID, subscription = Sub}, {F, T}) -> - To = jid:make(LJID), + fun(#roster_item{jid = To, subscription = Sub}, {F, T}) -> F1 = if Sub == both orelse Sub == from -> Pres1 = xmpp:set_to(Pres, To), case privacy_check_packet(State, Pres1, out) of @@ -843,10 +842,9 @@ broadcast_presence_available(#{jid := JID} = State, Items = ejabberd_hooks:run_fold( roster_get, LServer, [], [{LUser, LServer}]), JIDs = lists:foldl( - fun(#roster{jid = LJID, subscription = Sub}, Tos) + fun(#roster_item{jid = To, subscription = Sub}, Tos) when Sub == both orelse Sub == from -> - To = jid:make(LJID), - P = xmpp:set_to(Pres, jid:make(LJID)), + P = xmpp:set_to(Pres, To), case privacy_check_packet(State, P, out) of allow -> [To|Tos]; deny -> Tos diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index 19aa983f5..b0dffd2d6 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -1333,16 +1333,15 @@ get_roster(User, Server) -> %% several times, each one in a different group. make_roster_xmlrpc(Roster) -> lists:foldl( - fun(Item, Res) -> - JIDS = jid:encode(Item#roster.jid), - Nick = Item#roster.name, - Subs = atom_to_list(Item#roster.subscription), - Ask = atom_to_list(Item#roster.ask), - Groups = case Item#roster.groups of + fun(#roster_item{jid = JID, name = Nick, subscription = Sub, ask = Ask} = Item, Res) -> + JIDS = jid:encode(JID), + Subs = atom_to_list(Sub), + Asks = atom_to_list(Ask), + Groups = case Item#roster_item.groups of [] -> [<<>>]; Gs -> Gs end, - ItemsX = [{JIDS, Nick, Subs, Ask, Group} || Group <- Groups], + ItemsX = [{JIDS, Nick, Subs, Asks, Group} || Group <- Groups], ItemsX ++ Res end, [], diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index 9491d217a..ca3b4e6ea 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -212,22 +212,20 @@ process_iq(#iq{type = set, process_iq(IQ) -> xmpp:make_error(IQ, unsupported_query_error(IQ)). --spec get_mix_roster_items([#roster{}], {binary(), binary()}) -> [#roster{}]. +-spec get_mix_roster_items([#roster_item{}], {binary(), binary()}) -> [#roster_item{}]. get_mix_roster_items(Acc, {LUser, LServer}) -> JID = jid:make(LUser, LServer), case get_channels(JID) of {ok, Channels} -> lists:map( - fun({#jid{luser=Channel, lserver=Service}, Id}) -> - #roster{ - jid = {Channel, Service, <<>>}, + fun({ItemJID, Id}) -> + #roster_item{ + jid = ItemJID, name = <<>>, subscription = both, - ask = none, + ask = undefined, groups = [<<"Channels">>], - askmessage = <<>>, - xs = [], - mix_participant_id = Id + mix_channel = #mix_roster_channel{'participant-id' = Id} } end, Channels); _ -> @@ -288,21 +286,19 @@ process_leave(#iq{from = From, end. -spec process_join_result(iq(), iq()) -> ok. -process_join_result(#iq{from = Channel, +process_join_result(#iq{from = #jid{} = Channel, type = result, sub_els = [#mix_join{id = ID} = Join]}, #iq{to = To} = IQ) -> case add_channel(To, Channel, ID) of ok -> % Do roster push - #jid{luser = ChannelName, lserver = Service} = Channel, - mod_roster:push_item(To, #roster{}, #roster{ - jid = {ChannelName, Service, <<>>}, + mod_roster:push_item(To, #roster_item{jid = #jid{}}, #roster_item{ + jid = Channel, name = <<>>, subscription = none, - ask = none, + ask = undefined, groups = [], - askmessage = <<>>, - mix_participant_id = ID + mix_channel = #mix_roster_channel{'participant-id' = ID} }), % send IQ result ChanID = make_channel_id(Channel, ID), @@ -319,11 +315,9 @@ process_join_result(Err, IQ) -> process_leave_result(#iq{from = Channel, type = result, sub_els = [#mix_leave{} = Leave]}, #iq{to = User} = IQ) -> % Do roster push - #jid{luser = ChannelName, lserver = Service} = Channel, mod_roster:push_item(User, - #roster{jid = {ChannelName, Service, <<>>}, subscription = none}, - #roster{jid = {ChannelName, Service, <<>>}, - subscription = remove}), + #roster_item{jid = Channel, subscription = none}, + #roster_item{jid = Channel, subscription = remove}), % send iq result ResIQ = xmpp:make_iq_result(IQ, #mix_client_leave{leave = Leave}), ejabberd_router:route(ResIQ); diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 27fac3131..fdf9de9f4 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -41,7 +41,7 @@ -behaviour(gen_mod). -export([start/2, stop/1, reload/3, process_iq/1, export/1, - import_info/0, process_local_iq/1, get_user_roster/2, + import_info/0, process_local_iq/1, get_user_roster_items/2, import/5, get_roster/2, push_item/3, import_start/2, import_stop/2, is_subscribed/2, c2s_self_presence/1, in_subscription/2, @@ -92,7 +92,7 @@ start(Host, Opts) -> Mod:init(Host, Opts), init_cache(Mod, Host, Opts), ejabberd_hooks:add(roster_get, Host, ?MODULE, - get_user_roster, 50), + get_user_roster_items, 50), ejabberd_hooks:add(roster_in_subscription, Host, ?MODULE, in_subscription, 50), ejabberd_hooks:add(roster_out_subscription, Host, @@ -114,7 +114,7 @@ start(Host, Opts) -> stop(Host) -> ejabberd_hooks:delete(roster_get, Host, ?MODULE, - get_user_roster, 50), + get_user_roster_items, 50), ejabberd_hooks:delete(roster_in_subscription, Host, ?MODULE, in_subscription, 50), ejabberd_hooks:delete(roster_out_subscription, Host, @@ -205,9 +205,8 @@ process_local_iq(#iq{lang = Lang} = IQ) -> -spec roster_hash([#roster{}]) -> binary(). roster_hash(Items) -> - str:sha(term_to_binary(lists:sort([R#roster{groups = - lists:sort(Grs)} - || R = #roster{groups = Grs} + str:sha(term_to_binary(lists:sort([R#roster_item{groups = lists:sort(Grs)} + || R = #roster_item{groups = Grs} <- Items]))). %% Returns a list that may contain an xmlelement with the XEP-237 feature if it's enabled. @@ -227,7 +226,6 @@ get_versioning_feature(Acc, Host) -> -spec roster_version(binary(), binary()) -> undefined | binary(). roster_version(LServer, LUser) -> - US = {LUser, LServer}, case mod_roster_opt:store_current_id(LServer) of true -> case read_roster_version(LUser, LServer) of @@ -235,8 +233,7 @@ roster_version(LServer, LUser) -> {ok, V} -> V end; false -> - roster_hash(ejabberd_hooks:run_fold(roster_get, LServer, - [], [US])) + roster_hash(run_roster_get_hook(LUser, LServer)) end. -spec read_roster_version(binary(), binary()) -> {ok, binary()} | error. @@ -279,7 +276,6 @@ process_iq_get(#iq{to = To, from = From, sub_els = [#roster_query{ver = RequestedVersion, mix_annotate = MixAnnotate}]} = IQ) -> LUser = To#jid.luser, LServer = To#jid.lserver, - US = {LUser, LServer}, MixEnabled = MixAnnotate == #mix_roster_annotate{}, {ItemsToSend, VersionToSend} = case {mod_roster_opt:versioning(LServer), @@ -288,32 +284,22 @@ process_iq_get(#iq{to = To, from = From, case read_roster_version(LUser, LServer) of error -> RosterVersion = write_roster_version(LUser, LServer), - {lists:map(fun encode_item/1, - ejabberd_hooks:run_fold( - roster_get, To#jid.lserver, [], [US])), - RosterVersion}; + {run_roster_get_hook(LUser, LServer), RosterVersion}; {ok, RequestedVersion} -> {false, false}; {ok, NewVersion} -> - {lists:map(fun encode_item/1, - ejabberd_hooks:run_fold( - roster_get, To#jid.lserver, [], [US])), - NewVersion} + {run_roster_get_hook(LUser, LServer), NewVersion} end; {true, false} when RequestedVersion /= undefined -> - RosterItems = ejabberd_hooks:run_fold( - roster_get, To#jid.lserver, [], [US]), + RosterItems = run_roster_get_hook(LUser, LServer), case roster_hash(RosterItems) of RequestedVersion -> {false, false}; New -> - {lists:map(fun encode_item/1, RosterItems), New} + {RosterItems, New} end; _ -> - {lists:map(fun encode_item/1, - ejabberd_hooks:run_fold( - roster_get, To#jid.lserver, [], [US])), - false} + {run_roster_get_hook(LUser, LServer), false} end, % Store that MIX annotation is enabled (for roster pushes) set_mix_annotation_enabled(From, MixEnabled), @@ -334,16 +320,21 @@ process_iq_get(#iq{to = To, from = From, ver = Version} end). --spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}]. -get_user_roster(Acc, {LUser, LServer}) -> - Items = get_roster(LUser, LServer), - lists:filter(fun (#roster{subscription = none, - ask = in}) -> - false; - (_) -> true - end, - Items) - ++ Acc. +-spec run_roster_get_hook(binary(), binary()) -> [#roster_item{}]. +run_roster_get_hook(LUser, LServer) -> + ejabberd_hooks:run_fold(roster_get, LServer, [], [{LUser, LServer}]). + +-spec get_filtered_roster(binary(), binary()) -> [#roster{}]. +get_filtered_roster(LUser, LServer) -> + lists:filter( + fun (#roster{subscription = none, ask = in}) -> false; + (_) -> true + end, + get_roster(LUser, LServer)). + +-spec get_user_roster_items([#roster_item{}], {binary(), binary()}) -> [#roster_item{}]. +get_user_roster_items(Acc, {LUser, LServer}) -> + lists:map(fun encode_item/1, get_filtered_roster(LUser, LServer)) ++ Acc. -spec get_roster(binary(), binary()) -> [#roster{}]. get_roster(LUser, LServer) -> @@ -435,11 +426,7 @@ encode_item(Item) -> both -> subscribe; _ -> undefined end, - groups = Item#roster.groups, - mix_channel = case Item#roster.mix_participant_id of - <<>> -> undefined; - _ -> #mix_roster_channel{'participant-id' = Item#roster.mix_participant_id} - end}. + groups = Item#roster.groups}. -spec decode_item(roster_item(), #roster{}, boolean()) -> #roster{}. decode_item(#roster_item{subscription = remove} = Item, R, _) -> @@ -494,7 +481,7 @@ set_item_and_notify_clients(To, #roster_item{jid = PeerJID} = RosterItem, end, case transaction(LUser, LServer, [PeerLJID], F) of {atomic, {OldItem, NewItem}} -> - push_item(To, OldItem, NewItem), + push_item(To, encode_item(OldItem), encode_item(NewItem)), case NewItem#roster.subscription of remove -> send_unsubscribing_presence(To, OldItem); @@ -505,7 +492,7 @@ set_item_and_notify_clients(To, #roster_item{jid = PeerJID} = RosterItem, {error, Reason} end. --spec push_item(jid(), #roster{}, #roster{}) -> ok. +-spec push_item(jid(), #roster_item{}, #roster_item{}) -> ok. push_item(To, OldItem, NewItem) -> #jid{luser = LUser, lserver = LServer} = To, Ver = case mod_roster_opt:versioning(LServer) of @@ -518,10 +505,10 @@ push_item(To, OldItem, NewItem) -> push_item(To1, OldItem, NewItem, Ver) end, ejabberd_sm:get_user_resources(LUser, LServer)). --spec push_item(jid(), #roster{}, #roster{}, undefined | binary()) -> ok. +-spec push_item(jid(), #roster_item{}, #roster_item{}, undefined | binary()) -> ok. push_item(To, OldItem, NewItem, Ver) -> route_presence_change(To, OldItem, NewItem), - [Item] = process_items_mix([encode_item(NewItem)], To), + [Item] = process_items_mix([NewItem], To), IQ = #iq{type = set, to = To, from = jid:remove_resource(To), id = <<"push", (p1_rand:get_string())/binary>>, @@ -529,11 +516,11 @@ push_item(To, OldItem, NewItem, Ver) -> items = [Item]}]}, ejabberd_router:route(IQ). --spec route_presence_change(jid(), #roster{}, #roster{}) -> ok. +-spec route_presence_change(jid(), #roster_item{}, #roster_item{}) -> ok. route_presence_change(From, OldItem, NewItem) -> - OldSub = OldItem#roster.subscription, - NewSub = NewItem#roster.subscription, - To = jid:make(NewItem#roster.jid), + OldSub = OldItem#roster_item.subscription, + NewSub = NewItem#roster_item.subscription, + To = NewItem#roster_item.jid, NewIsFrom = NewSub == both orelse NewSub == from, OldIsFrom = OldSub == both orelse OldSub == from, if NewIsFrom andalso not OldIsFrom -> @@ -657,7 +644,9 @@ process_subscription(Direction, User, Server, JID1, NewItem#roster.ask == in -> ok; true -> - push_item(jid:make(User, Server), OldItem, NewItem) + push_item(jid:make(User, Server), + encode_item(OldItem), + encode_item(NewItem)) end, true; none -> @@ -835,7 +824,7 @@ in_auto_reply(_, _, _) -> none. remove_user(User, Server) -> LUser = jid:nodeprep(User), LServer = jid:nameprep(Server), - Items = get_user_roster([], {LUser, LServer}), + Items = get_filtered_roster(LUser, LServer), send_unsubscription_to_rosteritems(LUser, LServer, Items), Mod = gen_mod:db_mod(LServer, ?MODULE), Mod:remove_user(LUser, LServer), diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 333a64a45..067d4504b 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -185,8 +185,8 @@ cache_nodes(Mod, Host) -> false -> ejabberd_cluster:get_nodes() end. --spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}]. -get_user_roster(Items, {U, S} = US) -> +-spec get_user_roster([#roster_item{}], {binary(), binary()}) -> [#roster_item{}]. +get_user_roster(Items, {_, S} = US) -> {DisplayedGroups, Cache} = get_user_displayed_groups(US), SRUsers = lists:foldl( fun(Group, Acc1) -> @@ -216,10 +216,10 @@ get_user_roster(Items, {U, S} = US) -> end end, SRUsers, Items), - SRItems = [#roster{usj = {U, S, {U1, S1, <<"">>}}, - us = US, jid = {U1, S1, <<"">>}, - name = get_rosteritem_name(U1, S1), - subscription = both, ask = none, groups = GroupLabels} + SRItems = [#roster_item{jid = jid:make(U1, S1), + name = get_rosteritem_name(U1, S1), + subscription = both, ask = undefined, + groups = GroupLabels} || {{U1, S1}, GroupLabels} <- dict:to_list(SRUsersRest)], SRItems ++ NewItems1. @@ -855,16 +855,14 @@ displayed_to_groups(GroupName, LServer) -> push_item(User, Server, Item) -> mod_roster:push_item(jid:make(User, Server), - Item#roster{subscription = none}, + Item#roster_item{subscription = none}, Item). push_roster_item(User, Server, ContactU, ContactS, ContactN, GroupLabel, Subscription) -> - Item = #roster{usj = - {User, Server, {ContactU, ContactS, <<"">>}}, - us = {User, Server}, jid = {ContactU, ContactS, <<"">>}, - name = ContactN, subscription = Subscription, ask = none, - groups = [GroupLabel]}, + Item = #roster_item{jid = jid:make(ContactU, ContactS), + name = ContactN, subscription = Subscription, ask = undefined, + groups = [GroupLabel]}, push_item(User, Server, Item). -spec c2s_self_presence({presence(), ejabberd_c2s:state()}) diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 216dd4ce1..2b4ec1daf 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -109,8 +109,8 @@ depends(_Host, _Opts) -> %%-------------------------------------------------------------------- %% Hooks %%-------------------------------------------------------------------- --spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}]. -get_user_roster(Items, {U, S} = US) -> +-spec get_user_roster([#roster_item{}], {binary(), binary()}) -> [#roster_item{}]. +get_user_roster(Items, US) -> SRUsers = get_user_to_groups_map(US, true), {NewItems1, SRUsersRest} = lists:mapfoldl(fun (Item, SRUsers1) -> @@ -135,10 +135,9 @@ get_user_roster(Items, {U, S} = US) -> end end, SRUsers, Items), - SRItems = [#roster{usj = {U, S, {U1, S1, <<"">>}}, - us = US, jid = {U1, S1, <<"">>}, - name = get_user_name(U1, S1), subscription = both, - ask = none, groups = GroupNames} + SRItems = [#roster_item{jid = jid:make(U1, S1), + name = get_user_name(U1, S1), subscription = both, + ask = undefined, groups = GroupNames} || {{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)], SRItems ++ NewItems1. From 648245e974b142e6d9f3c4fd40771c87fadc6c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Sun, 26 Jun 2022 17:25:22 +0200 Subject: [PATCH 378/440] mod_mix, mod_mix_pam: Add handling of IQs with newer MIX namespaces Supported are mix:core:{0,1} and mix:pam:{0,2} --- mix.exs | 2 +- src/mod_mix.erl | 29 ++++++++++++++++++----------- src/mod_mix_pam.erl | 17 +++++++++-------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/mix.exs b/mix.exs index 6f2d6ffbc..ef88e321c 100644 --- a/mix.exs +++ b/mix.exs @@ -114,7 +114,7 @@ defmodule Ejabberd.MixProject do {:p1_utils, "~> 1.0"}, {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, - {:xmpp, "~> 1.5"}, + {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/src/mod_mix.erl b/src/mod_mix.erl index 002ef5696..c278f2146 100644 --- a/src/mod_mix.erl +++ b/src/mod_mix.erl @@ -350,7 +350,7 @@ format_status(_Opt, Status) -> %%%=================================================================== -spec process_mix_create(iq()) -> iq(). process_mix_create(#iq{to = To, from = From, - sub_els = [#mix_create{channel = Chan}]} = IQ) -> + sub_els = [#mix_create{channel = Chan, xmlns = XmlNs}]} = IQ) -> Host = To#jid.lserver, ServerHost = ejabberd_router:host_of_route(Host), Mod = gen_mod:db_mod(ServerHost, ?MODULE), @@ -374,7 +374,7 @@ process_mix_create(#iq{to = To, from = From, end, case Ret of ok -> - xmpp:make_iq_result(IQ, #mix_create{channel = Chan1}); + xmpp:make_iq_result(IQ, #mix_create{channel = Chan1, xmlns = XmlNs}); {error, conflict} -> xmpp:make_error(IQ, channel_exists_error(IQ)); {error, db_failure} -> @@ -384,7 +384,7 @@ process_mix_create(#iq{to = To, from = From, -spec process_mix_destroy(iq()) -> iq(). process_mix_destroy(#iq{to = To, from = #jid{luser = U, lserver = S}, - sub_els = [#mix_destroy{channel = Chan}]} = IQ) -> + sub_els = [#mix_destroy{channel = Chan, xmlns = XmlNs}]} = IQ) -> Host = To#jid.lserver, ServerHost = ejabberd_router:host_of_route(Host), Mod = gen_mod:db_mod(ServerHost, ?MODULE), @@ -392,7 +392,7 @@ process_mix_destroy(#iq{to = To, {ok, {#jid{luser = U, lserver = S}, _, _}} -> case Mod:del_channel(ServerHost, Chan, Host) of ok -> - xmpp:make_iq_result(IQ, #mix_destroy{channel = Chan}); + xmpp:make_iq_result(IQ, #mix_destroy{channel = Chan, xmlns = XmlNs}); {error, db_failure} -> xmpp:make_error(IQ, db_error(IQ)) end; @@ -406,7 +406,7 @@ process_mix_destroy(#iq{to = To, -spec process_mix_join(iq()) -> iq(). process_mix_join(#iq{to = To, from = From, - sub_els = [#mix_join{} = JoinReq]} = IQ) -> + sub_els = [#mix_join{xmlns = XmlNs} = JoinReq]} = IQ) -> Chan = To#jid.luser, Host = To#jid.lserver, ServerHost = ejabberd_router:host_of_route(Host), @@ -423,7 +423,8 @@ process_mix_join(#iq{to = To, from = From, notify_participant_joined(Mod, ServerHost, To, From, ID, Nick), xmpp:make_iq_result(IQ, #mix_join{id = ID, subscribe = Nodes, - nick = Nick}) + nick = Nick, + xmlns = XmlNs}) catch _:{badmatch, {error, db_failure}} -> xmpp:make_error(IQ, db_error(IQ)) end; @@ -435,7 +436,7 @@ process_mix_join(#iq{to = To, from = From, -spec process_mix_leave(iq()) -> iq(). process_mix_leave(#iq{to = To, from = From, - sub_els = [#mix_leave{}]} = IQ) -> + sub_els = [#mix_leave{xmlns = XmlNs}]} = IQ) -> {Chan, Host, _} = jid:tolower(To), ServerHost = ejabberd_router:host_of_route(Host), Mod = gen_mod:db_mod(ServerHost, ?MODULE), @@ -453,7 +454,7 @@ process_mix_leave(#iq{to = To, from = From, xmpp:make_error(IQ, db_error(IQ)) end; {error, notfound} -> - xmpp:make_iq_result(IQ, #mix_leave{}); + xmpp:make_iq_result(IQ, #mix_leave{xmlns = XmlNs}); {error, db_failure} -> xmpp:make_error(IQ, db_error(IQ)) end; @@ -465,7 +466,7 @@ process_mix_leave(#iq{to = To, from = From, -spec process_mix_setnick(iq()) -> iq(). process_mix_setnick(#iq{to = To, from = From, - sub_els = [#mix_setnick{nick = Nick}]} = IQ) -> + sub_els = [#mix_setnick{nick = Nick, xmlns = XmlNs}]} = IQ) -> {Chan, Host, _} = jid:tolower(To), ServerHost = ejabberd_router:host_of_route(Host), Mod = gen_mod:db_mod(ServerHost, ?MODULE), @@ -474,12 +475,12 @@ process_mix_setnick(#iq{to = To, from = From, {ok, _} -> case Mod:get_participant(ServerHost, Chan, Host, BFrom) of {ok, {_, Nick}} -> - xmpp:make_iq_result(IQ, #mix_setnick{nick = Nick}); + xmpp:make_iq_result(IQ, #mix_setnick{nick = Nick, xmlns = XmlNs}); {ok, {ID, _}} -> case Mod:set_participant(ServerHost, Chan, Host, BFrom, ID, Nick) of ok -> notify_participant_joined(Mod, ServerHost, To, From, ID, Nick), - xmpp:make_iq_result(IQ, #mix_setnick{nick = Nick}); + xmpp:make_iq_result(IQ, #mix_setnick{nick = Nick, xmlns = XmlNs}); {error, db_failure} -> xmpp:make_error(IQ, db_error(IQ)) end; @@ -688,12 +689,16 @@ register_iq_handlers(Host) -> ?MODULE, process_disco_items), gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MIX_CORE_0, ?MODULE, process_mix_core), + gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MIX_CORE_1, + ?MODULE, process_mix_core), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_DISCO_INFO, ?MODULE, process_disco_info), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_DISCO_ITEMS, ?MODULE, process_disco_items), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_CORE_0, ?MODULE, process_mix_core), + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_CORE_1, + ?MODULE, process_mix_core), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PUBSUB, ?MODULE, process_pubsub_query), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_2, @@ -704,8 +709,10 @@ unregister_iq_handlers(Host) -> gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO), gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS), gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_MIX_CORE_0), + gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_MIX_CORE_1), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_DISCO_INFO), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_DISCO_ITEMS), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_CORE_0), + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_CORE_1), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PUBSUB), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MAM_2). diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index ca3b4e6ea..08b9125cc 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -70,8 +70,8 @@ start(Host, Opts) -> ejabberd_hooks:add(roster_get, Host, ?MODULE, get_mix_roster_items, 50), ejabberd_hooks:add(webadmin_user, Host, ?MODULE, webadmin_user, 50), ejabberd_hooks:add(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), - gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0, - ?MODULE, process_iq); + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0, ?MODULE, process_iq), + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_2, ?MODULE, process_iq); Err -> Err end. @@ -83,7 +83,8 @@ stop(Host) -> ejabberd_hooks:delete(roster_get, Host, ?MODULE, get_mix_roster_items, 50), ejabberd_hooks:delete(webadmin_user, Host, ?MODULE, webadmin_user, 50), ejabberd_hooks:delete(webadmin_page_host, Host, ?MODULE, webadmin_page, 50), - gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0). + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_0), + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MIX_PAM_2). reload(Host, NewOpts, OldOpts) -> NewMod = gen_mod:db_mod(NewOpts, ?MODULE), @@ -263,7 +264,7 @@ remove_user(LUser, LServer) -> -spec process_join(iq()) -> ignore. process_join(#iq{from = From, sub_els = [#mix_client_join{channel = Channel, - join = Join}]} = IQ) -> + join = Join}]} = IQ) -> ejabberd_router:route_iq( #iq{from = jid:remove_resource(From), to = Channel, type = set, sub_els = [Join]}, @@ -287,7 +288,7 @@ process_leave(#iq{from = From, -spec process_join_result(iq(), iq()) -> ok. process_join_result(#iq{from = #jid{} = Channel, - type = result, sub_els = [#mix_join{id = ID} = Join]}, + type = result, sub_els = [#mix_join{id = ID, xmlns = XmlNs} = Join]}, #iq{to = To} = IQ) -> case add_channel(To, Channel, ID) of ok -> @@ -303,7 +304,7 @@ process_join_result(#iq{from = #jid{} = Channel, % send IQ result ChanID = make_channel_id(Channel, ID), Join1 = Join#mix_join{id = <<"">>, jid = ChanID}, - ResIQ = xmpp:make_iq_result(IQ, #mix_client_join{join = Join1}), + ResIQ = xmpp:make_iq_result(IQ, #mix_client_join{join = Join1, xmlns = XmlNs}), ejabberd_router:route(ResIQ); {error, db_failure} -> ejabberd_router:route_error(IQ, db_error(IQ)) @@ -312,14 +313,14 @@ process_join_result(Err, IQ) -> process_iq_error(Err, IQ). -spec process_leave_result(iq(), iq()) -> ok. -process_leave_result(#iq{from = Channel, type = result, sub_els = [#mix_leave{} = Leave]}, +process_leave_result(#iq{from = Channel, type = result, sub_els = [#mix_leave{xmlns = XmlNs} = Leave]}, #iq{to = User} = IQ) -> % Do roster push mod_roster:push_item(User, #roster_item{jid = Channel, subscription = none}, #roster_item{jid = Channel, subscription = remove}), % send iq result - ResIQ = xmpp:make_iq_result(IQ, #mix_client_leave{leave = Leave}), + ResIQ = xmpp:make_iq_result(IQ, #mix_client_leave{leave = Leave, xmlns = XmlNs}), ejabberd_router:route(ResIQ); process_leave_result(Err, IQ) -> process_iq_error(Err, IQ). From b0526cd90396b9a1e58369a9508fef5ae6dfec46 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 10 Jul 2022 21:00:09 +0200 Subject: [PATCH 379/440] mod_mix, mod_mix_pam: Add new MIX namespaces to disco features --- src/mod_mix.erl | 9 +++++---- src/mod_mix_pam.erl | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mod_mix.erl b/src/mod_mix.erl index c278f2146..6ac2bd60c 100644 --- a/src/mod_mix.erl +++ b/src/mod_mix.erl @@ -168,9 +168,10 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<>>} = To, Identity = #identity{category = <<"conference">>, type = <<"mix">>, name = translate:translate(Lang, Name)}, - Features = [?NS_DISCO_INFO, ?NS_DISCO_ITEMS, - ?NS_MIX_CORE_0, ?NS_MIX_CORE_SEARCHABLE_0, - ?NS_MIX_CORE_CREATE_CHANNEL_0], + Features = [?NS_DISCO_INFO, ?NS_DISCO_ITEMS, ?NS_MIX_CORE_0, + ?NS_MIX_CORE_SEARCHABLE_0, ?NS_MIX_CORE_CREATE_CHANNEL_0, + ?NS_MIX_CORE_1, ?NS_MIX_CORE_SEARCHABLE_1, + ?NS_MIX_CORE_CREATE_CHANNEL_1], xmpp:make_iq_result( IQ, #disco_info{features = Features, identities = [Identity], @@ -186,7 +187,7 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To, Identity = #identity{category = <<"conference">>, type = <<"mix">>}, Features = [?NS_DISCO_INFO, ?NS_DISCO_ITEMS, - ?NS_MIX_CORE_0, ?NS_MAM_2], + ?NS_MIX_CORE_0, ?NS_MIX_CORE_1, ?NS_MAM_2], xmpp:make_iq_result( IQ, #disco_info{node = Node, features = Features, diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index 08b9125cc..e3addafd6 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -181,7 +181,7 @@ bounce_sm_packet(Acc) -> disco_sm_features({error, _Error} = Acc, _From, _To, _Node, _Lang) -> Acc; disco_sm_features(Acc, _From, _To, <<"">>, _Lang) -> - {result, [?NS_MIX_PAM_0 | + {result, [?NS_MIX_PAM_0, ?NS_MIX_PAM_2 | case Acc of {result, Features} -> Features; empty -> [] From 4a52b73a17c1e9b486a7f107bc1ecf2bbc4add92 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Fri, 12 Aug 2022 14:32:48 +0200 Subject: [PATCH 380/440] mod_shared_roster: Fix wrong hook type #roster{} (now #roster_item{}) The hook type was changed from #roster{} to #roster_item{} by me in the recent MIX changes. Unfortunately I've overseen this one (and unit tests + dialyzer passed). --- src/mod_shared_roster.erl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 067d4504b..7d59e2fc9 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -202,14 +202,13 @@ get_user_roster(Items, {_, S} = US) -> end, dict:new(), DisplayedGroups), {NewItems1, SRUsersRest} = lists:mapfoldl( - fun(Item, SRUsers1) -> - {_, _, {U1, S1, _}} = Item#roster.usj, - US1 = {U1, S1}, + fun(Item = #roster_item{jid = #jid{luser = User1, lserver = Server1}}, SRUsers1) -> + US1 = {User1, Server1}, case dict:find(US1, SRUsers1) of {ok, GroupLabels} -> - {Item#roster{subscription = both, - groups = Item#roster.groups ++ GroupLabels, - ask = none}, + {Item#roster_item{subscription = both, + groups = Item#roster_item.groups ++ GroupLabels, + ask = undefined}, dict:erase(US1, SRUsers1)}; error -> {Item, SRUsers1} From b1e6e408f87edd6d33bba23f0d5bf0bf0bab61a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Mon, 27 Jun 2022 10:48:38 +0200 Subject: [PATCH 381/440] mod_mix: Return user jid on join --- src/mod_mix.erl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mod_mix.erl b/src/mod_mix.erl index 6ac2bd60c..256715af0 100644 --- a/src/mod_mix.erl +++ b/src/mod_mix.erl @@ -424,6 +424,7 @@ process_mix_join(#iq{to = To, from = From, notify_participant_joined(Mod, ServerHost, To, From, ID, Nick), xmpp:make_iq_result(IQ, #mix_join{id = ID, subscribe = Nodes, + jid = make_channel_id(To, ID), nick = Nick, xmlns = XmlNs}) catch _:{badmatch, {error, db_failure}} -> @@ -646,6 +647,11 @@ make_id(JID, Key) -> Data = jid:encode(jid:tolower(jid:remove_resource(JID))), xmpp_util:hex(misc:crypto_hmac(sha256, Data, Key, 10)). +-spec make_channel_id(jid(), binary()) -> jid(). +make_channel_id(JID, ID) -> + {U, S, R} = jid:split(JID), + jid:make(<>, S, R). + %%%=================================================================== %%% Error generators %%%=================================================================== From 0faf34b26d9b83cbe36d88077b4be4dc586c9094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Sat, 2 Jul 2022 17:20:35 +0200 Subject: [PATCH 382/440] Parse sub elements of the mix join remote result --- src/mod_mix_pam.erl | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index e3addafd6..379ab3930 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -262,13 +262,25 @@ remove_user(LUser, LServer) -> %%% Internal functions %%%=================================================================== -spec process_join(iq()) -> ignore. -process_join(#iq{from = From, +process_join(#iq{from = From, lang = Lang, sub_els = [#mix_client_join{channel = Channel, join = Join}]} = IQ) -> ejabberd_router:route_iq( #iq{from = jid:remove_resource(From), to = Channel, type = set, sub_els = [Join]}, - fun(ResIQ) -> process_join_result(ResIQ, IQ) end), + fun(#iq{sub_els = [El]} = ResIQ) -> + try xmpp:decode(El) of + MixJoin -> + process_join_result(ResIQ#iq { + sub_els = [MixJoin] + }, IQ) + catch + _:{xmpp_codec, Reason} -> + Txt = xmpp:io_format_error(Reason), + Err = xmpp:err_bad_request(Txt, Lang), + ejabberd_router:route_error(IQ, Err) + end + end), ignore. -spec process_leave(iq()) -> iq() | error. @@ -309,7 +321,7 @@ process_join_result(#iq{from = #jid{} = Channel, {error, db_failure} -> ejabberd_router:route_error(IQ, db_error(IQ)) end; -process_join_result(Err, IQ) -> +process_join_result(#iq{type = error} = Err, IQ) -> process_iq_error(Err, IQ). -spec process_leave_result(iq(), iq()) -> ok. From 9a8a8437249792b8d230e36c4bf2855f5607cc9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Sat, 2 Jul 2022 20:20:24 +0200 Subject: [PATCH 383/440] Fix filter_nodes The previous implementation always returned an empty list while testing it. However I don't really understand why that happened. The list comprehension based one works, although it looks equivalent to me. --- src/mod_mix.erl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mod_mix.erl b/src/mod_mix.erl index 256715af0..315c7b80d 100644 --- a/src/mod_mix.erl +++ b/src/mod_mix.erl @@ -593,10 +593,8 @@ known_nodes() -> -spec filter_nodes([binary()]) -> [binary()]. filter_nodes(Nodes) -> - lists:filter( - fun(Node) -> - lists:member(Node, Nodes) - end, known_nodes()). + KnownNodes = known_nodes(), + [Node || KnownNode <- KnownNodes, Node <- Nodes, KnownNode == Node]. -spec multicast(module(), binary(), binary(), binary(), binary(), fun((jid()) -> message())) -> ok. From bce429dc441da10a98edf9200e3e06863d0becbb Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 21 Aug 2022 15:48:28 +0200 Subject: [PATCH 384/440] make-packages: Fix permissions on RPM systems RPM resets ownership/permissions of /opt/ejabberd and its subdirectories on installation. Therefore, fix those in the "after-install" script. --- tools/make-packages | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/make-packages b/tools/make-packages index 0d8d2248e..3b3388ae8 100755 --- a/tools/make-packages +++ b/tools/make-packages @@ -119,6 +119,8 @@ create_scripts() fi chown 'root:$rel_name' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' chmod '4750' '/opt/$rel_name-$rel_vsn/lib/epam-'*'/priv/bin/epam' + chown -R -h '$rel_name:$rel_name' '/opt/$rel_name' + chmod 'o-rwx' '/opt/$rel_name/'* EOF cat >"$dir/after-upgrade" <<-EOF From a9e85674b80af45b50e0977c31038ffa2e267adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 24 Aug 2022 10:30:02 +0200 Subject: [PATCH 385/440] Fix mucsub unsubscribe notification payload to have muc_unsubcribe in it ...instead of muc_subscribe --- src/mod_muc_room.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 961b51762..0df7b420d 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -4552,14 +4552,14 @@ process_iq_mucsub(From, #iq{type = set, sub_els = [#muc_unsubscribe{}]}, node = ?NS_MUCSUB_NODES_SUBSCRIBERS, items = [#ps_item{ id = p1_rand:get_string(), - sub_els = [#muc_subscribe{jid = BareJID, nick = Nick}]}]}}]}, + sub_els = [#muc_unsubscribe{jid = BareJID, nick = Nick}]}]}}]}, Packet1b = #message{ sub_els = [#ps_event{ items = #ps_items{ node = ?NS_MUCSUB_NODES_SUBSCRIBERS, items = [#ps_item{ id = p1_rand:get_string(), - sub_els = [#muc_subscribe{nick = Nick}]}]}}]}, + sub_els = [#muc_unsubscribe{nick = Nick}]}]}}]}, {Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_unsubscribed, ServerHost, {Packet1a, Packet1b}, [ServerHost, Room, Host, BareJID, StateData]), send_subscriptions_change_notifications(Packet2a, Packet2b, StateData), From cfc8746d29c42ca252a2104bf537629fa704b502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 24 Aug 2022 11:14:32 +0200 Subject: [PATCH 386/440] Update roster_get hook in mod_shared_roster_ldap to use #roster_item{} --- src/mod_shared_roster_ldap.erl | 37 +++++++++++++--------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 2b4ec1daf..36ed63c97 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -112,29 +112,20 @@ depends(_Host, _Opts) -> -spec get_user_roster([#roster_item{}], {binary(), binary()}) -> [#roster_item{}]. get_user_roster(Items, US) -> SRUsers = get_user_to_groups_map(US, true), - {NewItems1, SRUsersRest} = lists:mapfoldl(fun (Item, - SRUsers1) -> - {_, _, {U1, S1, _}} = - Item#roster.usj, - US1 = {U1, S1}, - case dict:find(US1, - SRUsers1) - of - {ok, GroupNames} -> - {Item#roster{subscription - = - both, - groups = - Item#roster.groups ++ GroupNames, - ask = - none}, - dict:erase(US1, - SRUsers1)}; - error -> - {Item, SRUsers1} - end - end, - SRUsers, Items), + {NewItems1, SRUsersRest} = lists:mapfoldl( + fun(Item = #roster_item{jid = #jid{luser = U1, lserver = S1}}, SRUsers1) -> + US1 = {U1, S1}, + case dict:find(US1, SRUsers1) of + {ok, GroupNames} -> + {Item#roster_item{subscription = both, + groups = Item#roster_item.groups ++ GroupNames, + ask = none}, + dict:erase(US1, SRUsers1)}; + error -> + {Item, SRUsers1} + end + end, + SRUsers, Items), SRItems = [#roster_item{jid = jid:make(U1, S1), name = get_user_name(U1, S1), subscription = both, ask = undefined, groups = GroupNames} From fba651822dc9a718642018ba0616aefad540403a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Mon, 29 Aug 2022 11:26:31 +0200 Subject: [PATCH 387/440] Handle invalid values in X-Forwarded-For header more gracefuly --- src/ejabberd_http.erl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ejabberd_http.erl b/src/ejabberd_http.erl index 56de7e255..fe13868f4 100644 --- a/src/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -535,12 +535,14 @@ analyze_ip_xff({IPLast, Port}, XFF) -> TrustedProxies) of true -> - {ok, IPFirst} = inet_parse:address( - binary_to_list(ClientIP)), - ?DEBUG("The IP ~w was replaced with ~w due to " - "header X-Forwarded-For: ~ts", - [IPLast, IPFirst, XFF]), - IPFirst; + case inet_parse:address(binary_to_list(ClientIP)) of + {ok, IPFirst} -> + ?DEBUG("The IP ~w was replaced with ~w due to " + "header X-Forwarded-For: ~ts", + [IPLast, IPFirst, XFF]), + IPFirst; + E -> throw(E) + end; false -> IPLast end, {IPClient, Port}. From 63caa369beac157fa26c31d624e599b0bff861af Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 31 Aug 2022 18:10:22 +0200 Subject: [PATCH 388/440] mod_pubsub: Don't crash on command failures Handle 'delete_old_items' and 'delete_expired_items' errors gracefully. --- src/mod_pubsub.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 2eff16bfe..7b01c4af0 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -4197,7 +4197,7 @@ delete_old_items(N) -> end end, Nodes); _ -> - error + [error] end end, ejabberd_option:hosts()), case lists:member(error, Results) of @@ -4235,7 +4235,7 @@ delete_expired_items() -> end end, Nodes); _ -> - error + [error] end end, ejabberd_option:hosts()), case lists:member(error, Results) of From 7a1ca4b203f27ea8a1e96b4de699d9989e909668 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 24 Aug 2022 11:32:19 +0200 Subject: [PATCH 389/440] mod_host_meta: Complain at start if listener is not encrypted --- src/mod_host_meta.erl | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/mod_host_meta.erl b/src/mod_host_meta.erl index 77fc16058..abbca332a 100644 --- a/src/mod_host_meta.erl +++ b/src/mod_host_meta.erl @@ -51,12 +51,14 @@ %%%---------------------------------------------------------------------- start(_Host, _Opts) -> + report_hostmeta_listener(), ok. stop(_Host) -> ok. reload(_Host, _NewOpts, _OldOpts) -> + report_hostmeta_listener(), ok. depends(_Host, _Opts) -> @@ -66,7 +68,7 @@ depends(_Host, _Opts) -> %%% HTTP handlers %%%---------------------------------------------------------------------- -process([], #request{method = 'GET', tp = https, host = Host, path = Path}) -> +process([], #request{method = 'GET', host = Host, path = Path}) -> case lists:last(Path) of <<"host-meta">> -> file_xml(Host); @@ -174,6 +176,23 @@ find_handler_port_path(Tls, Module) -> (_) -> false end, ets:tab2list(ejabberd_listener)). +report_hostmeta_listener() -> + case {find_handler_port_path(false, ?MODULE), + find_handler_port_path(true, ?MODULE)} of + {[], []} -> + ?CRITICAL_MSG("It seems you enabled ~p in 'modules' but forgot to " + "add it as a request_handler in an ejabberd_http " + "listener.", [?MODULE]); + {[_|_], _} -> + ?WARNING_MSG("Apparently ~p is enabled in a request_handler in a " + "non-encrypted ejabberd_http listener. This is " + "disallowed by XEP-0156. Please enable 'tls' in that " + "listener, or setup a proxy encryption mechanism.", + [?MODULE]); + {[], [_|_]} -> + ok + end. + %%%---------------------------------------------------------------------- %%% Options and Doc %%%---------------------------------------------------------------------- From 4ae06f039d4c2bf8af71d658ba10b63e41bd0472 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 17 Aug 2022 17:28:31 +0200 Subject: [PATCH 390/440] Add definition to detect OTP older than 25, used by ejabberd_auth_http --- rebar.config | 1 + 1 file changed, 1 insertion(+) diff --git a/rebar.config b/rebar.config index 22c66beae..d25c31ca2 100644 --- a/rebar.config +++ b/rebar.config @@ -114,6 +114,7 @@ {if_version_below, "23", {d, 'USE_OLD_PG2'}}, {if_version_below, "24", {d, 'COMPILER_REPORTS_ONLY_LINES'}}, {if_version_below, "24", {d, 'SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL'}}, + {if_version_below, "25", {d, 'OTP_BELOW_25'}}, {if_var_false, debug, no_debug_info}, {if_var_true, debug, debug_info}, {if_var_true, elixir, {d, 'ELIXIR_ENABLED'}}, From 808def7d32fc5fed40d982d26e6f0ff028a736c7 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 1 Sep 2022 12:53:24 +0200 Subject: [PATCH 391/440] The #roster_item.ask allowed values are subscribe|undefined --- src/mod_shared_roster_ldap.erl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 36ed63c97..ebcb77ab3 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -118,8 +118,7 @@ get_user_roster(Items, US) -> case dict:find(US1, SRUsers1) of {ok, GroupNames} -> {Item#roster_item{subscription = both, - groups = Item#roster_item.groups ++ GroupNames, - ask = none}, + groups = Item#roster_item.groups ++ GroupNames}, dict:erase(US1, SRUsers1)}; error -> {Item, SRUsers1} From aaf391b284d9dbe0f86a098f52529942ec2b37a6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 1 Sep 2022 13:00:56 +0200 Subject: [PATCH 392/440] Catch all errors from jose_jwt:verify and log debugging details (#3890) --- src/ejabberd_auth_jwt.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_auth_jwt.erl b/src/ejabberd_auth_jwt.erl index f38600bc7..d1fe4d15a 100644 --- a/src/ejabberd_auth_jwt.erl +++ b/src/ejabberd_auth_jwt.erl @@ -146,6 +146,9 @@ check_jwt_token(User, Server, Token) -> {false, _, _} -> false catch - error:{badarg, _} -> + A:B -> + ?DEBUG("jose_jwt:verify failed ~n for account ~p@~p~n " + " JWK and token: ~p~n with error: ~p", + [User, Server, {JWK, Token}, {A, B}]), false end. From f624b146369d473332e023bfca131b689402ca42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 1 Sep 2022 13:37:48 +0200 Subject: [PATCH 393/440] Add function for getting room diagnostics --- src/mod_muc_admin.erl | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index 9651cfe11..f29a5b56f 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -41,11 +41,11 @@ set_room_affiliation/4, get_room_affiliations/2, get_room_affiliation/3, web_menu_main/2, web_page_main/2, web_menu_host/3, subscribe_room/4, subscribe_room_many/3, - unsubscribe_room/2, get_subscribers/2, - get_room_serverhost/1, - web_page_host/3, - mod_opt_type/1, mod_options/1, - get_commands_spec/0, find_hosts/1]). + unsubscribe_room/2, get_subscribers/2, + get_room_serverhost/1, + web_page_host/3, + mod_opt_type/1, mod_options/1, + get_commands_spec/0, find_hosts/1, room_diagnostics/2]). -include("logger.hrl"). -include_lib("xmpp/include/xmpp.hrl"). @@ -1184,6 +1184,28 @@ get_room_pid(Name, Service) -> invalid_service end. +room_diagnostics(Name, Service) -> + try get_room_serverhost(Service) of + ServerHost -> + RMod = gen_mod:ram_db_mod(ServerHost, mod_muc), + case RMod:find_online_room(ServerHost, Name, Service) of + error -> + room_hibernated; + {ok, Pid} -> + case rpc:pinfo(Pid, [current_stacktrace, message_queue_len, messages]) of + [{_, R}, {_, QL}, {_, Q}] -> + #{stacktrace => R, queue_size => QL, queue => lists:sublist(Q, 10)}; + _ -> + unable_to_probe_process + end + end + catch + error:{invalid_domain, _} -> + invalid_service; + error:{unregistered_route, _} -> + invalid_service + end. + %% It is required to put explicitly all the options because %% the record elements are replaced at compile time. %% So, this can't be parametrized. From 9a3ba9d76f742c7484f7d9f08b12790bf465f605 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 2 Sep 2022 11:28:02 +0200 Subject: [PATCH 394/440] Update Github Action workflows: Ubuntu 18 is deprecated and 22 is added CI: - Update Ubuntu to 20.04, the lowest available starting in April 2023 [1] - Don't test 19.3, as it isn't available in Ubuntu 20.04 - Use OTP 25 for Shellcheck, Coveralls, ECIL page - Use erlef instead of ErlGang, supports better old erlangs in new ubuntus - Remove support for rebar2 testing, as that's done in Runtime CI-19.3: - Add a temporary workflow for testing ejabberd with OTP 19.3 Container and Runtime: - Update Ubuntu to latest (22.04) [1] https://github.com/actions/runner-images/issues/6002 https://github.com/ErlGang/setup-erlang https://github.com/erlef/setup-beam --- .github/workflows/ci-19.3.yml | 229 ++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 60 +++------ .github/workflows/container.yml | 2 +- .github/workflows/runtime.yml | 17 +-- 4 files changed, 251 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/ci-19.3.yml diff --git a/.github/workflows/ci-19.3.yml b/.github/workflows/ci-19.3.yml new file mode 100644 index 000000000..c65a26050 --- /dev/null +++ b/.github/workflows/ci-19.3.yml @@ -0,0 +1,229 @@ +name: CI (19.3) + +on: + push: + paths-ignore: + - '.devcontainer/**' + - 'examples/**' + - 'lib/**' + - 'man/**' + - 'priv/**' + - '**.md' + pull_request: + paths-ignore: + - '.devcontainer/**' + - 'examples/**' + - 'lib/**' + - 'man/**' + - 'priv/**' + - '**.md' + +jobs: + + tests: + name: Tests + strategy: + fail-fast: false + matrix: + otp: ['19.3'] + runs-on: ubuntu-18.04 + services: + redis: + image: redis + ports: + - 6379:6379 + + steps: + + - uses: actions/checkout@v3 + + - name: Get specific Erlang/OTP + uses: erlef/setup-beam@v1 + with: + otp-version: ${{ matrix.otp }} + + - name: Get a compatible Rebar3 + run: | + rm rebar3 + wget https://github.com/processone/ejabberd/raw/21.12/rebar3 + chmod +x rebar3 + + - name: Prepare databases + run: | + sudo systemctl start mysql.service + sudo systemctl start postgresql.service + mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost' + IDENTIFIED BY 'ejabberd_test';" + mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" + mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* + TO 'ejabberd_test'@'localhost';" + mysql -u root -proot ejabberd_test < sql/mysql.sql + pg_isready + sudo -u postgres psql -c "CREATE USER ejabberd_test + WITH PASSWORD 'ejabberd_test';" + sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" + sudo -u postgres psql ejabberd_test -f sql/pg.sql + sudo -u postgres psql -c "GRANT ALL PRIVILEGES + ON DATABASE ejabberd_test TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + TABLES IN SCHEMA public + TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + SEQUENCES IN SCHEMA public + TO ejabberd_test;" + + - name: Prepare libraries + run: | + sudo apt-get -qq update + sudo apt-get -y purge libgd3 nginx + sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \ + libsqlite3-dev libwebp-dev libyaml-dev + + - name: Prepare rebar + run: | + echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2} + ]}.' >>rebar.config + echo '{xref_checks, [deprecated_function_calls, deprecated_functions, + locals_not_used, undefined_function_calls, undefined_functions]}. + % Disabled: exports_not_used,' >>rebar.config + echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab, + eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml, + mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix, + sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config + echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config + echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config + + - name: Remove syntax_tools from release + run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script + + - name: Cache rebar + uses: actions/cache@v3 + with: + path: | + ~/.cache/rebar3/ + key: ${{matrix.otp}}-${{hashFiles('rebar.config')}} + + - name: Compile + run: | + ./autogen.sh + ./configure --with-rebar=./rebar3 \ + --prefix=/tmp/ejabberd \ + --enable-all \ + --disable-elixir \ + --disable-mssql \ + --disable-odbc + make update + make + + - run: make install -s + - run: make hooks + - run: make options + - run: make xref + - run: make dialyzer + + - name: Check Production Release + run: | + make rel + RE=_build/prod/rel/ejabberd + $RE/bin/ejabberdctl start + $RE/bin/ejabberdctl started + $RE/bin/ejabberdctl stop + $RE/bin/ejabberdctl stopped + cat $RE/logs/ejabberd.log + grep -q "is stopped in" $RE/logs/ejabberd.log + + - name: Check Development Release + run: | + make dev + RE=_build/dev/rel/ejabberd + $RE/bin/ejabberdctl start + $RE/bin/ejabberdctl started + $RE/bin/ejabberdctl stop + $RE/bin/ejabberdctl stopped + cat $RE/logs/ejabberd.log + grep -q "is stopped in" $RE/logs/ejabberd.log + + - name: Run tests + id: ct + run: | + (cd priv && ln -sf ../sql) + COMMIT=`echo $GITHUB_SHA | cut -c 1-7` + DATE=`date +%s` + REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"` + NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT + LABEL=`git show -s --format=%s | cut -c 1-30` + ./rebar3 ct --name $NODENAME --label "$LABEL" + ./rebar3 cover + + - name: Check results + if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped') + id: ctresults + run: | + [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true + ln `find logs/ -name suite.log` logs/suite.log + grep 'TEST COMPLETE' logs/suite.log + grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log + test $(find logs/ -empty -name error.log) + + - name: View logs failures + if: failure() && steps.ctresults.outcome == 'failure' + run: | + cat logs/suite.log | awk \ + 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' + find logs/ -name error.log -exec cat '{}' ';' + find logs/ -name exunit.log -exec cat '{}' ';' + + - name: Upload test logs + if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' + uses: peaceiris/actions-gh-pages@v3 + with: + publish_dir: _build/test + exclude_assets: '.github,lib,plugins' + external_repository: processone/ecil + deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} + keep_files: true + + - name: View ECIL address + if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd' + run: | + CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'` + echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/" + + - name: Prepare new schema + run: | + [[ -d logs ]] && rm -rf logs + [[ -d _build/test/logs ]] && rm -rf _build/test/logs || true + mysql -u root -proot -e "DROP DATABASE ejabberd_test;" + sudo -u postgres psql -c "DROP DATABASE ejabberd_test;" + mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" + mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* + TO 'ejabberd_test'@'localhost';" + mysql -u root -proot ejabberd_test < sql/mysql.new.sql + sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" + sudo -u postgres psql ejabberd_test -f sql/pg.new.sql + sudo -u postgres psql -c "GRANT ALL PRIVILEGES + ON DATABASE ejabberd_test TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + TABLES IN SCHEMA public + TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + SEQUENCES IN SCHEMA public + TO ejabberd_test;" + sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl + - run: CT_BACKENDS=mysql,pgsql make test + id: ctnewschema + - name: Check results + if: always() && steps.ctnewschema.outcome != 'skipped' + run: | + [[ -d _build ]] && ln -s _build/test/logs/last/ logs || true + ln `find logs/ -name suite.log` logs/suite.log + grep 'TEST COMPLETE' logs/suite.log + grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log + test $(find logs/ -empty -name error.log) + - name: View logs failures + if: failure() && steps.ctnewschema.outcome != 'skipped' + run: | + cat logs/suite.log | awk \ + 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}' + find logs/ -name error.log -exec cat '{}' ';' + find logs/ -name exunit.log -exec cat '{}' ';' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30b108d6d..ba236f9ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,18 +25,8 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '24', '25.0'] - include: - - otp: '19.3' - rebar: 2 - os: ubuntu-18.04 - - otp: '24' - rebar: 3 - os: ubuntu-20.04 - - otp: '25.0' - rebar: 3 - os: ubuntu-20.04 - runs-on: ${{ matrix.os }} + otp: ['20.0', '21.3', '24.3', '25'] + runs-on: ubuntu-20.04 services: redis: image: redis @@ -48,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - name: Test shell scripts - if: matrix.otp == 24 + if: matrix.otp == 25 run: | shellcheck test/ejabberd_SUITE_data/gencerts.sh shellcheck tools/captcha.sh @@ -56,17 +46,17 @@ jobs: shellcheck -x ejabberdctl.template - name: Get specific Erlang/OTP - uses: ErlGang/setup-erlang@master - if: matrix.otp != 24 + if: matrix.otp != 25 + uses: erlef/setup-beam@v1 with: otp-version: ${{ matrix.otp }} - - name: Get a compatible Rebar - if: matrix.rebar == 2 + - name: Get a compatible Rebar3 + if: matrix.otp <= '21.3' run: | - rm rebar - wget https://github.com/processone/ejabberd/raw/21.12/rebar - chmod +x rebar + rm rebar3 + wget https://github.com/processone/ejabberd/raw/21.12/rebar3 + chmod +x rebar3 - name: Prepare databases run: | @@ -120,14 +110,11 @@ jobs: uses: actions/cache@v3 with: path: | - deps/ - dialyzer/ - ebin/ ~/.cache/rebar3/ - key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}} + key: ${{matrix.otp}}-${{hashFiles('rebar.config')}} - name: Download test logs - if: matrix.otp == 24 && github.repository == 'processone/ejabberd' + if: matrix.otp == 25 && github.repository == 'processone/ejabberd' continue-on-error: true run: | mkdir -p _build/test @@ -138,8 +125,7 @@ jobs: - name: Compile run: | ./autogen.sh - [[ ${{ matrix.rebar }} = 2 ]] && REBAR=rebar || REBAR=`which rebar3` - ./configure --with-rebar=$REBAR \ + ./configure --with-rebar=./rebar3 \ --prefix=/tmp/ejabberd \ --enable-all \ --disable-elixir \ @@ -152,13 +138,9 @@ jobs: - run: make hooks - run: make options - run: make xref - - run: | - make dialyzer - [ ${{ matrix.rebar }} = 3 ] && true \ - || { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; } + - run: make dialyzer - name: Check Production Release - if: matrix.rebar == 3 run: | make rel RE=_build/prod/rel/ejabberd @@ -170,7 +152,6 @@ jobs: grep -q "is stopped in" $RE/logs/ejabberd.log - name: Check Development Release - if: matrix.rebar == 3 run: | make dev RE=_build/dev/rel/ejabberd @@ -181,12 +162,7 @@ jobs: cat $RE/logs/ejabberd.log grep -q "is stopped in" $RE/logs/ejabberd.log - - name: Run tests (OTP 19.3) - if: matrix.otp == '19.3' - id: ct2 - run: make test - name: Run tests - if: matrix.otp != '19.3' id: ct run: | (cd priv && ln -sf ../sql) @@ -195,8 +171,8 @@ jobs: REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"` NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT LABEL=`git show -s --format=%s | cut -c 1-30` - rebar3 ct --name $NODENAME --label "$LABEL" - rebar3 cover + ./rebar3 ct --name $NODENAME --label "$LABEL" + ./rebar3 cover - name: Check results if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped') @@ -217,11 +193,11 @@ jobs: find logs/ -name exunit.log -exec cat '{}' ';' - name: Send to coveralls - if: matrix.otp == 24 + if: matrix.otp == 25 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - DIAGNOSTIC=1 rebar3 as test coveralls send + DIAGNOSTIC=1 ./rebar3 as test coveralls send curl -v -k https://coveralls.io/webhook \ --header "Content-Type: application/json" \ --data '{"repo_name":"$GITHUB_REPOSITORY", diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 7256058e5..a246e3640 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -17,7 +17,7 @@ env: jobs: container: name: Container - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest permissions: packages: write steps: diff --git a/.github/workflows/runtime.yml b/.github/workflows/runtime.yml index e7d18797a..b991e8b1a 100644 --- a/.github/workflows/runtime.yml +++ b/.github/workflows/runtime.yml @@ -31,20 +31,9 @@ jobs: strategy: fail-fast: false matrix: - otp: ['19.3', '21.3', '22.0', '24.3', '25'] + otp: ['19.3', '20.3', '24.3', '25'] rebar: ['rebar', 'rebar3'] - include: - - otp: '19.3' - os: ubuntu-18.04 - - otp: '21.3' - os: ubuntu-20.04 - - otp: '22.0' - os: ubuntu-20.04 - - otp: '24.3' - os: ubuntu-20.04 - - otp: '25' - os: ubuntu-20.04 - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest container: image: erlang:${{ matrix.otp }} @@ -132,7 +121,7 @@ jobs: elixir: '1.11.4' - otp: '25.0' elixir: '1.12.3' - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: From 42e384beb720f053d223f63ad8a5006da1ea933b Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 6 Sep 2022 13:22:27 +0200 Subject: [PATCH 395/440] Fix unix socket support for ejabberd_http (thanks to Simon Lipp)(#3894) --- src/misc.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/misc.erl b/src/misc.erl index 352a0f084..8662e5f19 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -222,6 +222,8 @@ encode_base64(Data) -> ip_to_list({local, _}) -> <<"unix">>; +ip_to_list(local) -> + <<"unix">>; ip_to_list({IP, _Port}) -> ip_to_list(IP); %% This function clause could use inet_parse too: From f542a823090a16e4545a988f6231d6b096600442 Mon Sep 17 00:00:00 2001 From: Roman Hargrave Date: Tue, 6 Sep 2022 10:59:33 -0700 Subject: [PATCH 396/440] feat: do not clone repo inside container build --- .dockerignore | 43 +++++++++++++++++++++++++++++++++ .github/container/Dockerfile | 7 +++--- .github/workflows/container.yml | 4 +-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/.dockerignore b/.dockerignore index 94b549649..b825bcd1f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,46 @@ .git .win32 .examples +*.swp +*~ +\#*# +.#* +.edts +*.dump +/Makefile +/config.log +/config.status +/config/releases.exs +/configure +/aclocal.m4 +/*.cache +/deps/ +/.deps-update/ +/ebin/ +/ejabberd.init +/ejabberd.service +/ejabberdctl +/ejabberdctl.example +/rel/ejabberd/ +/rel/overlays/ +/src/eldap_filter_yecc.erl +/vars.config +/dialyzer/ +/test/*.beam +/test/*.ctc +/logs/ +/priv/bin/captcha*sh +/priv/sql +/rel/ejabberd +/_build +/database/ +/.rebar +/rebar.lock +/log/ +Mnesia.nonode@nohost/ +# Binaries created with tools/make-{binaries,installers,packages}: +/ejabberd_*.deb +/ejabberd-*.rpm +/ejabberd-*.run +/ejabberd-*.tar.gz + diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index a879a125d..4f4b78970 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -1,5 +1,4 @@ FROM alpine:3.15.4 AS build -ARG REPOSITORY=https://github.com/processone/ejabberd.git ARG VERSION=master RUN apk upgrade --update musl \ @@ -29,11 +28,11 @@ RUN apk upgrade --update musl \ RUN mix local.hex --force \ && mix local.rebar --force +COPY . ./ejabberd + WORKDIR ejabberd -RUN git clone $REPOSITORY . \ - && git checkout $VERSION \ - && mv .github/container/ejabberdctl.template . \ +RUN mv .github/container/ejabberdctl.template . \ && ./autogen.sh \ && ./configure --with-rebar=mix --enable-all \ && make deps \ diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index a246e3640..ccf7dac83 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -58,11 +58,11 @@ jobs: uses: docker/build-push-action@v2.10.0 with: build-args: | - REPOSITORY=https://github.com/${{ github.repository }}.git VERSION=${{ steps.gitdescribe.outputs.ver }} cache-from: type=gha cache-to: type=gha,mode=max - context: .github/container + context: . + file: .github/container/Dockerfile labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64 push: true From 17a583514367a52ddbca12dd5ab621262adaf50e Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 6 Sep 2022 17:41:09 +0200 Subject: [PATCH 397/440] Simplify recent commit (thanks to Simon Lipp)(#3894) --- src/misc.erl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/misc.erl b/src/misc.erl index 8662e5f19..232e0ea33 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -220,15 +220,13 @@ encode_base64(Data) -> -spec ip_to_list(inet:ip_address() | undefined | {inet:ip_address(), inet:port_number()}) -> binary(). -ip_to_list({local, _}) -> - <<"unix">>; -ip_to_list(local) -> - <<"unix">>; ip_to_list({IP, _Port}) -> ip_to_list(IP); %% This function clause could use inet_parse too: ip_to_list(undefined) -> <<"unknown">>; +ip_to_list(local) -> + <<"unix">>; ip_to_list(IP) -> list_to_binary(inet_parse:ntoa(IP)). From 14cced0bad41e819f53dba79fb48b5660c21d4d4 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 7 Sep 2022 11:43:34 +0200 Subject: [PATCH 398/440] Container: No need to search for the ejabberdctl binary --- .github/container/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 4f4b78970..a9f1c2e2a 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -63,6 +63,7 @@ RUN export PEM=/opt/ejabberd/conf/server.pem \ FROM alpine:3.15.4 ENV HOME=/opt/ejabberd +ARG VERSION=master RUN apk upgrade --update musl \ && apk add \ @@ -92,7 +93,7 @@ RUN echo -e \ \nexport CONFIG_DIR=/opt/ejabberd/conf \ \nexport LOGS_DIR=/opt/ejabberd/logs \ \nexport SPOOL_DIR=/opt/ejabberd/database \ - \nexec $(find /opt -name ejabberdctl) \"\$@\"" > /usr/local/bin/ejabberdctl \ + \nexec /opt/ejabberd-$VERSION/bin/ejabberdctl \"\$@\"" > /usr/local/bin/ejabberdctl \ && chmod +x /usr/local/bin/ejabberdctl RUN addgroup ejabberd -g 9000 \ From c496baaf876e7732e0521dc7bba2b3bbc75fbcd6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 7 Sep 2022 12:02:36 +0200 Subject: [PATCH 399/440] Container: Don't complain if the bin/ directory already exists --- .github/container/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index a9f1c2e2a..24d296c69 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -43,7 +43,7 @@ RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \ && mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf RUN BINPATH=$(dirname $(find /opt -name msgs))/bin/ \ - && mkdir $BINPATH \ + && mkdir -p $BINPATH \ && cp tools/captcha*.sh $BINPATH RUN export PEM=/opt/ejabberd/conf/server.pem \ From fe2fd776ef95556585726000a31547d838b47150 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 6 Sep 2022 12:03:12 +0200 Subject: [PATCH 400/440] Update CONTAINER example calls to recent changes --- CONTAINER.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/CONTAINER.md b/CONTAINER.md index 5bcb26cdc..6f15b8ba5 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -256,11 +256,10 @@ That OTP release is configured with: Build ejabberd Community Server base image from ejabberd master on GitHub: ```bash -VERSION=master docker build \ - --build-arg VERSION=$VERSION \ - -t personal/ejabberd:$VERSION \ - .github/container + -t personal/ejabberd \ + -f .github/container/Dockerfile \ + . ``` Build ejabberd Community Server base image for a given ejabberd version, @@ -268,11 +267,12 @@ both for amd64 and arm64 architectures: ```bash VERSION=22.05 +git checkout $VERSION docker buildx build \ --platform=linux/amd64,linux/arm64 - --build-arg VERSION=$VERSION \ -t personal/ejabberd:$VERSION \ - .github/container + -f .github/container/Dockerfile \ + . ``` It's also possible to use podman instead of docker, just notice: @@ -280,9 +280,8 @@ It's also possible to use podman instead of docker, just notice: - It mentions that `healthcheck` is not supported by the Open Container Initiative image format - If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true` ```bash -VERSION=master podman build \ - --build-arg VERSION=$VERSION \ - -t ja:$(version) \ - .github/container + -t ja \ + -f .github/container/Dockerfile \ + . ``` From 3312eaa51dcd48797a068eb3f1786bd133b93d61 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 7 Sep 2022 13:56:19 +0200 Subject: [PATCH 401/440] Add more examples of podman usage --- CONTAINER.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CONTAINER.md b/CONTAINER.md index 6f15b8ba5..8f9c07ae8 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -281,7 +281,15 @@ It's also possible to use podman instead of docker, just notice: - If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true` ```bash podman build \ - -t ja \ + -t ejabberd \ -f .github/container/Dockerfile \ . + +podman run --name eja1 -d -p 5222:5222 localhost/ejabberd + +podman exec eja1 ejabberdctl status + +podman exec -it eja1 sh + +podman stop eja1 ``` From b017207ac1ec9365ded321dd213e6eb7aca49634 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 9 Sep 2022 18:27:49 +0200 Subject: [PATCH 402/440] mod_admin_extra: Handle empty roster group names Don't let 'add_rosteritem' create a roster group with an empty name. Thanks to Licaon_Kter for reporting the issue. --- src/mod_admin_extra.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index b0dffd2d6..12e775cfb 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -1409,7 +1409,7 @@ push_roster_item(LU, LS, R, U, S, Action) -> xmpp:set_from_to(ResIQ, jid:remove_resource(LJID), LJID)). build_roster_item(U, S, {add, Nick, Subs, Group}) -> - Groups = binary:split(Group,<<";">>, [global]), + Groups = binary:split(Group,<<";">>, [global, trim]), #roster_item{jid = jid:make(U, S), name = Nick, subscription = misc:binary_to_atom(Subs), From 5bb4731bc1a6f9726bdcf379d57cc925812feaae Mon Sep 17 00:00:00 2001 From: Stu Tomlinson Date: Tue, 13 Sep 2022 08:37:46 +0100 Subject: [PATCH 403/440] make-binaries: Bump dependency versions --- tools/make-binaries | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index 27359c990..297b2c57e 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -70,16 +70,16 @@ termcap_vsn='1.3.1' expat_vsn='2.4.8' zlib_vsn='1.2.12' yaml_vsn='0.2.5' -ssl_vsn='1.1.1o' -otp_vsn='24.3.4' -elixir_vsn='1.13.4' +ssl_vsn='1.1.1q' +otp_vsn='24.3.4.4' +elixir_vsn='1.14.0' pam_vsn='1.5.2' png_vsn='1.6.37' jpeg_vsn='9e' -webp_vsn='1.2.2' +webp_vsn='1.2.4' gd_vsn='2.3.3' odbc_vsn='2.3.11' -sqlite_vsn='3380500' +sqlite_vsn='3390300' root_dir="${BUILD_DIR:-$HOME/build}" bootstrap_dir="$root_dir/bootstrap" ct_prefix_dir="$root_dir/x-tools" From add55e19474bf4e76830b94d865d90562c1d0fde Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 13 Sep 2022 14:25:13 +0200 Subject: [PATCH 404/440] make-binaries: Bump Erlang/OTP version to 24.3.4.5 --- tools/make-binaries | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make-binaries b/tools/make-binaries index 297b2c57e..bf8c59445 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -71,7 +71,7 @@ expat_vsn='2.4.8' zlib_vsn='1.2.12' yaml_vsn='0.2.5' ssl_vsn='1.1.1q' -otp_vsn='24.3.4.4' +otp_vsn='24.3.4.5' elixir_vsn='1.14.0' pam_vsn='1.5.2' png_vsn='1.6.37' From 4d3875f4ff1c274c26c56344a3d07360065c8521 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 1 Oct 2021 12:11:51 +0200 Subject: [PATCH 405/440] Store role, and use it when joining a moderated room (#3330) --- include/mod_muc_room.hrl | 2 ++ src/mod_muc.erl | 2 +- src/mod_muc_room.erl | 24 +++++++++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl index 56eddeaa4..48d72b111 100644 --- a/include/mod_muc_room.hrl +++ b/include/mod_muc_room.hrl @@ -122,6 +122,7 @@ robots = #{} :: robots(), nicks = #{} :: nicks(), affiliations = #{} :: affiliations(), + roles = #{} :: roles(), history = #lqueue{} :: lqueue(), subject = [] :: [text()], subject_author = <<"">> :: binary(), @@ -137,3 +138,4 @@ -type robots() :: #{jid() => {binary(), stanza()}}. -type nicks() :: #{binary() => [ljid()]}. -type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}. +-type roles() :: #{ljid() => role() | {role(), binary()}}. diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 8ad16a10f..c1c1c7f2a 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -1177,7 +1177,7 @@ opts_to_binary(Opts) -> {subject, iolist_to_binary(Subj)}; ({subject_author, Author}) -> {subject_author, iolist_to_binary(Author)}; - ({affiliations, Affs}) -> + ({AffOrRole, Affs}) when (AffOrRole == affiliation) or (AffOrRole == role) -> {affiliations, lists:map( fun({{U, S, R}, Aff}) -> NewAff = diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 0df7b420d..044725bd4 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1732,7 +1732,8 @@ set_role(JID, Role, StateData) -> end, StateData#state.users, LJIDs), StateData#state.nicks} end, - StateData#state{users = Users, nicks = Nicks}. + Roles = maps:put(jid:remove_resource(LJID), Role, StateData#state.roles), + StateData#state{users = Users, nicks = Nicks, roles = Roles}. -spec get_role(jid(), state()) -> role(). get_role(JID, StateData) -> @@ -2144,7 +2145,7 @@ add_new_user(From, Nick, Packet, StateData) -> Collision, mod_muc:can_use_nick(StateData#state.server_host, StateData#state.host, From, Nick), - get_default_role(Affiliation, StateData)} + get_occupant_initial_role(From, Affiliation, StateData)} of {false, _, _, _} when NUsers >= MaxUsers orelse NUsers >= MaxAdminUsers -> Txt = ?T("Too many users in this conference"), @@ -4010,6 +4011,8 @@ set_opts([{Opt, Val} | Opts], StateData) -> StateData#state{muc_subscribers = MUCSubscribers}; affiliations -> StateData#state{affiliations = maps:from_list(Val)}; + roles -> + StateData#state{roles = maps:from_list(Val)}; subject -> Subj = if Val == <<"">> -> []; is_binary(Val) -> [#text{data = Val}]; @@ -4022,7 +4025,9 @@ set_opts([{Opt, Val} | Opts], StateData) -> lists:map(fun({U, H}) -> {U, maps:from_list(H)} end, Val)), StateData#state{hats_users = Hats}; - _ -> StateData + Other -> + ?INFO_MSG("Unknown MUC room option, will be discarded: ~p", [Other]), + StateData end, set_opts(Opts, NSD). @@ -4041,6 +4046,18 @@ set_vcard_xupdate(#state{config = set_vcard_xupdate(State) -> State. +get_occupant_initial_role(Jid, Affiliation, #state{roles = Roles} = StateData) -> + DefaultRole = get_default_role(Affiliation, StateData), + case (StateData#state.config)#config.moderated of + true -> + get_occupant_stored_role(Jid, Roles, DefaultRole); + false -> + DefaultRole + end. + +get_occupant_stored_role(Jid, Roles, DefaultRole) -> + maps:get(jid:split(jid:remove_resource(Jid)), Roles, DefaultRole). + -define(MAKE_CONFIG_OPT(Opt), {get_config_opt_name(Opt), element(Opt, Config)}). @@ -4084,6 +4101,7 @@ make_opts(StateData, Hibernation) -> (?SETS):to_list((StateData#state.config)#config.captcha_whitelist)}, {affiliations, maps:to_list(StateData#state.affiliations)}, + {roles, maps:to_list(StateData#state.roles)}, {subject, StateData#state.subject}, {subject_author, StateData#state.subject_author}, {hats_users, From a8121cd7e50787547d4bcc5a5defe194527c2ad4 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 7 Sep 2022 16:44:50 +0200 Subject: [PATCH 406/440] Don't persist 'none' role (thanks to Blake Miller)(#3330) --- src/mod_muc_room.erl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 044725bd4..94d574962 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1732,7 +1732,16 @@ set_role(JID, Role, StateData) -> end, StateData#state.users, LJIDs), StateData#state.nicks} end, - Roles = maps:put(jid:remove_resource(LJID), Role, StateData#state.roles), + Roles = case Role of + %% Don't persist 'none' role: if someone is kicked, they will + %% maintain the same role they had *before* they were kicked + none -> + StateData#state.roles; + NewRole -> + maps:put(jid:remove_resource(LJID), + NewRole, + StateData#state.roles) + end, StateData#state{users = Users, nicks = Nicks, roles = Roles}. -spec get_role(jid(), state()) -> role(). From d0bc83147a02805fcd0c6262472bac1bccaa5b63 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 12 Sep 2022 11:42:54 +0200 Subject: [PATCH 407/440] Container: Copy .ejabberd-modules directory if available --- .github/container/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 24d296c69..541dabd66 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -46,6 +46,8 @@ RUN BINPATH=$(dirname $(find /opt -name msgs))/bin/ \ && mkdir -p $BINPATH \ && cp tools/captcha*.sh $BINPATH +RUN [ ! -d .ejabberd-modules ] || cp -r .ejabberd-modules /opt/ejabberd/ + RUN export PEM=/opt/ejabberd/conf/server.pem \ && curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \ && openssl req -x509 \ From a564707da4d22726f9d95168a482dda998378219 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 12 Sep 2022 18:00:14 +0200 Subject: [PATCH 408/440] Container: Get ejabberd-contrib sources to include them --- .github/workflows/container.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index ccf7dac83..d36965d97 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -27,6 +27,12 @@ jobs: with: fetch-depth: 0 + - name: Checkout ejabberd-contrib + uses: actions/checkout@v3 + with: + repository: processone/ejabberd-contrib + path: .ejabberd-modules/sources/ejabberd-contrib + - name: Log in to the Container registry uses: docker/login-action@v1.14.1 with: From 4664358176ae2399239189832b864569b3636b28 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 12 Sep 2022 13:01:06 +0200 Subject: [PATCH 409/440] Ignore .ejabberd-modules/ , may be used when building container --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b3ea8f373..6bfafc069 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ /*.cache /deps/ /.deps-update/ +/.ejabberd-modules/ /ebin/ /ejabberd.init /ejabberd.service From 30f1e284681db482ef78da6d865ccc79120e4ca3 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 26 May 2022 18:35:14 +0200 Subject: [PATCH 410/440] Support ERL_DIST_PORT option to work without epmd Please note: - Erlang/OTP 23.1 or higher is required to use ERL_DIST_PORT - "make relive" doesn't support ERL_DIST_PORT, neither rebar3 nor elixir - "make install" doesn't work with Elixir since at least ejabberd 21.07 Reference: https://www.erlang.org/blog/otp-23-highlights/ https://blog.erlware.org/epmdlessless/ --- ejabberdctl.cfg.example | 22 ++++++++++++++++++++-- ejabberdctl.template | 16 ++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/ejabberdctl.cfg.example b/ejabberdctl.cfg.example index 2300378e0..8b15933db 100644 --- a/ejabberdctl.cfg.example +++ b/ejabberdctl.cfg.example @@ -47,10 +47,28 @@ #INET_DIST_INTERFACE=127.0.0.1 #. -#' ERL_EPMD_ADDRESS: IP addresses where epmd listens for connections +#' ERL_DIST_PORT: Port number for Erlang distribution +# +# For Erlang distribution, clustering and ejabberdctl usage, the +# Erlang VM listens in a random TCP port number, and the Erlang Port +# Mapper Daemon (EPMD) is spawned and used to determine this port +# number. +# +# ERL_DIST_PORT can define this port number. In that case, EPMD is +# not spawned during ejabberd startup, and ERL_EPMD_ADDRESS is +# ignored. ERL_DIST_PORT must be set to the same port number during +# ejabberd startup and when calling ejabberdctl. This feature +# requires at least Erlang/OTP 23.1. +# +# Default: not defined +# +#ERL_DIST_PORT=5210 + +#. +#' ERL_EPMD_ADDRESS: IP addresses where EPMD listens for connections # # This environment variable may be set to a comma-separated -# list of IP addresses, in which case the epmd daemon +# list of IP addresses, in which case the EPMD daemon # will listen only on the specified address(es) and on the # loopback address (which is implicitly added to the list if it # has not been specified). The default behaviour is to listen on diff --git a/ejabberdctl.template b/ejabberdctl.template index 60b295c27..3b6ee7c64 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -81,6 +81,7 @@ if [ -n "$INET_DIST_INTERFACE" ] ; then ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2" fi fi +[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -erl_epmd_port $ERL_DIST_PORT -start_epmd false" # if vm.args file exists in config directory, pass it to Erlang VM [ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" ERL_LIBS='{{libdir}}' @@ -102,6 +103,7 @@ export EJABBERD_LOG_PATH export EJABBERD_PID_PATH export ERL_CRASH_DUMP export ERL_EPMD_ADDRESS +export ERL_DIST_PORT export ERL_INETRC export ERL_MAX_PORTS export ERL_MAX_ETS_TABLES @@ -110,6 +112,11 @@ export CONTRIB_MODULES_CONF_DIR export ERL_LIBS export SCRIPT_DIR +set_dist_client() +{ + [ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false" +} + # run command either directly or via su $INSTALLUSER exec_cmd() { @@ -220,6 +227,7 @@ uid() # stop epmd if there is no other running node stop_epmd() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null } @@ -227,6 +235,7 @@ stop_epmd() # if all ok, ensure runtime directory exists and make it current directory check_start() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && { pgrep -f "$ERLANG_NODE" >/dev/null && { echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running." @@ -291,14 +300,17 @@ case $1 in ;; debug) debugwarning + set_dist_client exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE" ;; etop) + set_dist_client exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \ -s erlang halt -output text ;; iexdebug) debugwarning + set_dist_client exec_iex "$(uid debug)" --remsh "$ERLANG_NODE" ;; iexlive) @@ -308,17 +320,21 @@ case $1 in ping) PEER=${2:-$ERLANG_NODE} [ "$PEER" = "${PEER%.*}" ] && PS="-s" + set_dist_client exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \ -noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \ -s erlang halt -output text ;; started) + set_dist_client wait_status 0 30 2 # wait 30x2s before timeout ;; stopped) + set_dist_client wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout ;; *) + set_dist_client exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" result=$? From 5ee1dc9e8d80d52ec9f3dd3f043dfdd4c90c303a Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 31 May 2022 13:35:15 +0200 Subject: [PATCH 411/440] Container: Support ERL_DIST_PORT --- .github/container/Dockerfile | 2 +- .github/container/ejabberdctl.template | 16 ++++++++++++++++ CONTAINER.md | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 541dabd66..a60446c32 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -113,7 +113,7 @@ HEALTHCHECK \ WORKDIR $HOME USER ejabberd VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"] -EXPOSE 1883 4369-4399 5222 5269 5280 5443 +EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443 ENTRYPOINT ["/usr/local/bin/ejabberdctl"] CMD ["foreground"] diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index 7ba20d68e..de3826a46 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -82,6 +82,7 @@ if [ -n "$INET_DIST_INTERFACE" ] ; then ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2" fi fi +[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -erl_epmd_port $ERL_DIST_PORT -start_epmd false" # if vm.args file exists in config directory, pass it to Erlang VM [ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" ERL_LIBS='{{libdir}}' @@ -103,6 +104,7 @@ export EJABBERD_LOG_PATH export EJABBERD_PID_PATH export ERL_CRASH_DUMP export ERL_EPMD_ADDRESS +export ERL_DIST_PORT export ERL_INETRC export ERL_MAX_PORTS export ERL_MAX_ETS_TABLES @@ -111,6 +113,11 @@ export CONTRIB_MODULES_CONF_DIR export ERL_LIBS export SCRIPT_DIR +set_dist_client() +{ + [ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false" +} + # run command either directly or via su $INSTALLUSER run_cmd() { @@ -233,6 +240,7 @@ uid() # stop epmd if there is no other running node stop_epmd() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null } @@ -240,6 +248,7 @@ stop_epmd() # if all ok, ensure runtime directory exists and make it current directory check_start() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && { pgrep -f "$ERLANG_NODE" >/dev/null && { echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running." @@ -328,14 +337,17 @@ case $1 in ;; debug) debugwarning + set_dist_client exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE" ;; etop) + set_dist_client exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \ -s erlang halt -output text ;; iexdebug) debugwarning + set_dist_client exec_iex "$(uid debug)" --remsh "$ERLANG_NODE" ;; iexlive) @@ -345,20 +357,24 @@ case $1 in ping) PEER=${2:-$ERLANG_NODE} [ "$PEER" = "${PEER%.*}" ] && PS="-s" + set_dist_client exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \ -noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \ -s erlang halt -output text ;; started) + set_dist_client wait_status 0 30 2 # wait 30x2s before timeout ;; stopped) + set_dist_client wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout ;; post_waiter) post_waiter_waiting ;; *) + set_dist_client run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" result=$? diff --git a/CONTAINER.md b/CONTAINER.md index 8f9c07ae8..d42a0ae6e 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -179,6 +179,7 @@ This container image exposes the ports: - `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH. - `1883`: Used for MQTT - `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering +- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD ### Volumes @@ -233,6 +234,23 @@ For this you can either: - edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE` - set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE` +Example to connect a local `ejabberdctl` to a containerized ejabberd: +1. When creating the container, export port 5210, and set `ERLANG_COOKIE`: +``` +docker run --name ejabberd -it \ + -e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \ + -p 5210:5210 -p 5222:5222 \ + ghcr.io/processone/ejabberd +``` +2. Set `ERL_DIST_PORT=5210` in ejabberdctl.cfg of container and local ejabberd +3. Restart the container +4. Now use `ejabberdctl` in your local ejabberd deployment + +To connect using a local `ejabberd` script: +``` +ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping +``` + Example using environment variables (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)): ```yaml environment: From e22d49661091aaf92ad4ec6eac5814ca1bd77531 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Fri, 16 Sep 2022 12:28:48 +0200 Subject: [PATCH 412/440] Update xmpp module --- mix.exs | 2 +- rebar.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index ef88e321c..c47d4f8b0 100644 --- a/mix.exs +++ b/mix.exs @@ -114,7 +114,7 @@ defmodule Ejabberd.MixProject do {:p1_utils, "~> 1.0"}, {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, - {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5", override: true}, + {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "62325549cced01b12878d79286311ae62fe0fc4f", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/rebar.config b/rebar.config index d25c31ca2..bde90d50b 100644 --- a/rebar.config +++ b/rebar.config @@ -70,7 +70,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.2"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5"}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "62325549cced01b12878d79286311ae62fe0fc4f"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}} ]}. From eeed1ca87fef84524032331c59a7a7b33c49ea8c Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 15 Sep 2022 23:23:57 +0200 Subject: [PATCH 413/440] Adapt to renaming of 'participant-id' from mix_roster_channel record --- src/mod_mix_pam.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod_mix_pam.erl b/src/mod_mix_pam.erl index 379ab3930..7bd6f2a71 100644 --- a/src/mod_mix_pam.erl +++ b/src/mod_mix_pam.erl @@ -226,7 +226,7 @@ get_mix_roster_items(Acc, {LUser, LServer}) -> subscription = both, ask = undefined, groups = [<<"Channels">>], - mix_channel = #mix_roster_channel{'participant-id' = Id} + mix_channel = #mix_roster_channel{participant_id = Id} } end, Channels); _ -> @@ -311,7 +311,7 @@ process_join_result(#iq{from = #jid{} = Channel, subscription = none, ask = undefined, groups = [], - mix_channel = #mix_roster_channel{'participant-id' = ID} + mix_channel = #mix_roster_channel{participant_id = ID} }), % send IQ result ChanID = make_channel_id(Channel, ID), From 14882342befd4a3f66edc868922b7badaf9e16ed Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 15 Sep 2022 23:25:31 +0200 Subject: [PATCH 414/440] Adapt to change of mix_annotate type to boolean in roster_query --- src/mod_roster.erl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mod_roster.erl b/src/mod_roster.erl index fdf9de9f4..b6cf771f0 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -273,10 +273,9 @@ write_roster_version(LUser, LServer, InTransaction) -> %% - the roster version from client don't match current version. -spec process_iq_get(iq()) -> iq(). process_iq_get(#iq{to = To, from = From, - sub_els = [#roster_query{ver = RequestedVersion, mix_annotate = MixAnnotate}]} = IQ) -> + sub_els = [#roster_query{ver = RequestedVersion, mix_annotate = MixEnabled}]} = IQ) -> LUser = To#jid.luser, LServer = To#jid.lserver, - MixEnabled = MixAnnotate == #mix_roster_annotate{}, {ItemsToSend, VersionToSend} = case {mod_roster_opt:versioning(LServer), mod_roster_opt:store_current_id(LServer)} of From cde8c8ce7df7ca6d7c8b2785a871e9ff9eca388c Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 16 Sep 2022 11:42:34 +0200 Subject: [PATCH 415/440] Remove unused header files which content is already in xmpp library --- include/adhoc.hrl | 44 ----------------------------------- include/ejabberd_config.hrl | 30 ------------------------ include/mod_vcard_xupdate.hrl | 22 ------------------ 3 files changed, 96 deletions(-) delete mode 100644 include/adhoc.hrl delete mode 100644 include/ejabberd_config.hrl delete mode 100644 include/mod_vcard_xupdate.hrl diff --git a/include/adhoc.hrl b/include/adhoc.hrl deleted file mode 100644 index aa784d9b0..000000000 --- a/include/adhoc.hrl +++ /dev/null @@ -1,44 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% -%%% ejabberd, Copyright (C) 2002-2022 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%---------------------------------------------------------------------- - --record(adhoc_request, -{ - lang = <<"">> :: binary(), - node = <<"">> :: binary(), - sessionid = <<"">> :: binary(), - action = <<"">> :: binary(), - xdata = false :: false | xmlel(), - others = [] :: [xmlel()] -}). - --record(adhoc_response, -{ - lang = <<"">> :: binary(), - node = <<"">> :: binary(), - sessionid = <<"">> :: binary(), - status :: atom(), - defaultaction = <<"">> :: binary(), - actions = [] :: [binary()], - notes = [] :: [{binary(), binary()}], - elements = [] :: [xmlel()] -}). - --type adhoc_request() :: #adhoc_request{}. --type adhoc_response() :: #adhoc_response{}. diff --git a/include/ejabberd_config.hrl b/include/ejabberd_config.hrl deleted file mode 100644 index c9805a3da..000000000 --- a/include/ejabberd_config.hrl +++ /dev/null @@ -1,30 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% -%%% ejabberd, Copyright (C) 2002-2022 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%---------------------------------------------------------------------- - --record(local_config, {key :: any(), value :: any()}). - --type local_config() :: #local_config{}. - --record(state, - {opts = [] :: [acl:acl() | local_config()], - hosts = [] :: [binary()], - override_local = false :: boolean(), - override_global = false :: boolean(), - override_acls = false :: boolean()}). diff --git a/include/mod_vcard_xupdate.hrl b/include/mod_vcard_xupdate.hrl deleted file mode 100644 index 16e1d7bfc..000000000 --- a/include/mod_vcard_xupdate.hrl +++ /dev/null @@ -1,22 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% -%%% ejabberd, Copyright (C) 2002-2022 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%---------------------------------------------------------------------- - --record(vcard_xupdate, {us = {<<>>, <<>>} :: {binary(), binary()}, - hash = <<>> :: binary()}). From fac74f623e117fa2ce070acf20ad328dcb991ebc Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 14 Jun 2022 13:18:23 +0200 Subject: [PATCH 416/440] Remove unused macro definitions detected by rebar3_hank ?OFFLINE_TABLE_LOCK_THRESHOLD is unused: definition and usage added in 4103f30812ed99c984a2fdb16aabca139c9255d7 definition copied, and usage moved to mod_offline_mnesia, in 901d2e0aed83d195a4d1cf2929114b07dcac0dd8 definition and usage removed in mod_offline_mnesia in d88e4d495ffc2ae950f77e440aa7c5d06c864309 this definition looks useless ?VERSION_MULTICAST is unused: added in 0cf8d1fa6e931367b63b133396478593146a8d07 it was never used ?DISCO_QUERY_TIMEOUT is unused: added in 0cf8d1fa6e931367b63b133396478593146a8d07 it was never used ?FEATURE/1 is unused: added in 0cf8d1fa6e931367b63b133396478593146a8d07 usage removed in bc33a3873dbb0828714eef69094213575fc979b6 ?DEFAULT_MAX_USERS_PRESENCE is unused: added in f817762cc48c13476a531bc40059cd17aea4cf0b usage removed in ba2b650464bd3aae2b6b0f3a3177476360cb6d08 ?CT_XML is unused: added in 46568fb9596d8203c635477b30c91d2928847dea removed in 3dc55c6d47e3093a6147ce275c7269a7d08ffc45 --- src/mod_muc_room.erl | 2 -- src/mod_multicast.erl | 6 ------ src/mod_offline.erl | 2 -- 3 files changed, 10 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 94d574962..32ea90b2b 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -78,8 +78,6 @@ -define(MAX_USERS_DEFAULT_LIST, [5, 10, 20, 30, 50, 100, 200, 500, 1000, 2000, 5000]). --define(DEFAULT_MAX_USERS_PRESENCE,1000). - -define(MUC_HAT_ADD_CMD, <<"http://prosody.im/protocol/hats#add">>). -define(MUC_HAT_REMOVE_CMD, <<"http://prosody.im/protocol/hats#remove">>). -define(MUC_HAT_LIST_CMD, <<"p1:hats#list">>). diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl index 92de4c7ad..a702f0f74 100644 --- a/src/mod_multicast.erl +++ b/src/mod_multicast.erl @@ -66,8 +66,6 @@ %% All the elements are of type value() --define(VERSION_MULTICAST, <<"$Revision: 440 $ ">>). - -define(PURGE_PROCNAME, ejabberd_mod_multicast_purgeloop). @@ -79,8 +77,6 @@ -define(CACHE_PURGE_TIMER, 86400000). --define(DISCO_QUERY_TIMEOUT, 10000). - -define(DEFAULT_LIMIT_LOCAL_MESSAGE, 100). -define(DEFAULT_LIMIT_LOCAL_PRESENCE, 100). @@ -268,8 +264,6 @@ process_iq(#iq{type = T}, _) when T == set; T == get -> process_iq(_, _) -> reply. --define(FEATURE(Feat), Feat). - iq_disco_info(From, Lang, State) -> Name = mod_multicast_opt:name(State#state.lserver), #disco_info{ diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 9e7e3dffe..a66ffb20d 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -79,8 +79,6 @@ -include("translate.hrl"). --define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000). - %% default value for the maximum number of user messages -define(MAX_USER_MESSAGES, infinity). From 2229e4c6dbd2edf042997c50deeab753411b9379 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 10 Dec 2020 21:59:07 +0100 Subject: [PATCH 417/440] Allow MUC service admins to bypass max_user_conferences limitation --- src/mod_muc_room.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 32ea90b2b..79d7da928 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -2144,11 +2144,11 @@ add_new_user(From, Nick, Packet, StateData) -> mod_muc_opt:max_user_conferences(StateData#state.server_host), Collision = nick_collision(From, Nick, StateData), IsSubscribeRequest = not is_record(Packet, presence), - case {(ServiceAffiliation == owner orelse - ((Affiliation == admin orelse Affiliation == owner) + case {ServiceAffiliation == owner orelse + ((((Affiliation == admin orelse Affiliation == owner) andalso NUsers < MaxAdminUsers) orelse NUsers < MaxUsers) - andalso NConferences < MaxConferences, + andalso NConferences < MaxConferences), Collision, mod_muc:can_use_nick(StateData#state.server_host, StateData#state.host, From, Nick), From 796f567db1857c9605791217ba6f00d459a2106a Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 27 Aug 2021 12:38:47 +0200 Subject: [PATCH 418/440] The archive_msg export fun requires MUC Service for room archives --- src/ejd2sql.erl | 8 +++++++- src/mod_mam_sql.erl | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ejd2sql.erl b/src/ejd2sql.erl index 6afad112c..469457048 100644 --- a/src/ejd2sql.erl +++ b/src/ejd2sql.erl @@ -165,12 +165,18 @@ import_info(Mod) -> %%%---------------------------------------------------------------------- export(LServer, Table, IO, ConvertFun) -> DbType = ejabberd_option:sql_type(LServer), + LServerConvert = case Table of + archive_msg -> + [LServer | mod_muc_admin:find_hosts(LServer)]; + _ -> + LServer + end, F = fun () -> mnesia:read_lock_table(Table), {_N, SQLs} = mnesia:foldl( fun(R, {N, SQLs} = Acc) -> - case ConvertFun(LServer, R) of + case ConvertFun(LServerConvert, R) of [] -> Acc; SQL1 -> diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 9eb9716fb..09175d83f 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -362,10 +362,10 @@ export(_Server) -> [] end}, {archive_msg, - fun(Host, #archive_msg{us ={LUser, LServer}, + fun([Host | HostTail], #archive_msg{us ={LUser, LServer}, id = _ID, timestamp = TS, peer = Peer, type = Type, nick = Nick, packet = Pkt}) - when LServer == Host -> + when (LServer == Host) or ([LServer] == HostTail) -> TStmp = misc:now_to_usec(TS), SUser = case Type of chat -> LUser; From 09b33e17a6d640105fc13902115fcf6e57403b60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 15 Sep 2022 10:18:49 +0200 Subject: [PATCH 419/440] Update mysql --- mix.exs | 2 +- mix.lock | 4 ++-- rebar.config | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mix.exs b/mix.exs index c47d4f8b0..8cfade7c0 100644 --- a/mix.exs +++ b/mix.exs @@ -138,7 +138,7 @@ defmodule Ejabberd.MixProject do {config(:zlib), {:ezlib, "~> 1.0"}}, {if_version_below('22', true), {:lager, "~> 3.9.1"}}, {config(:lua), {:luerl, "~> 1.0"}}, - {config(:mysql), {:p1_mysql, "~> 1.0"}}, + {config(:mysql), {:p1_mysql, "~> 1.0.20"}}, {config(:pgsql), {:p1_pgsql, "~> 1.1"}}, {config(:sqlite), {:sqlite3, "~> 1.1"}}, {config(:stun), {:stun, "~> 1.0"}}], do: diff --git a/mix.lock b/mix.lock index 2b9e73b64..f1964fe9f 100644 --- a/mix.lock +++ b/mix.lock @@ -21,7 +21,7 @@ "mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"}, - "p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"}, + "p1_mysql": {:hex, :p1_mysql, "1.0.20", "08aeade83a24902a5fca2dbf78fa674eef25ca4e66250b4be8bd3580f35880e7", [:rebar3], [], "hexpm", "12152e8feadcf8ce586334314ca27cb088f12e0a5c850c496a8df69859390877"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"}, "p1_pgsql": {:hex, :p1_pgsql, "1.1.18", "db3473d1bba4b45815b05226433fc589a5934190c2afa05fdba45c6a238bf2c6", [:rebar3], [{:xmpp, "1.5.8", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4a3863a5d59fed9f64fec8497a7d4e3d34edf31932364a74371097da2b25fd46"}, "p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"}, @@ -30,6 +30,6 @@ "stringprep": {:hex, :stringprep, "1.0.28", "9a9823d8449309e4e8ca0bdb2547e43d5de4e1d943f23826c25015150b8daa66", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "66df7d1181fec899c824bd8d00253f369103514828db5e04ee1ba7a0a61568e0"}, "stun": {:hex, :stun, "1.2.2", "8c61f71c5094c69739dc6b3e916be734ce80c1a15551e00d547115a66e91e5bc", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4f54c7b86e2aa413faec35a9fb699048471e1c06a721c53e6ac44b405fd2a3b9"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, - "xmpp": {:hex, :xmpp, "1.5.8", "96c08537a4d7d9695326a01be8162cb980803be4358671b0fd1369ae9c5e05d8", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.28", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "966a4539dea7331310be809eaccd5d02af5874303a90679d35bee2117f825b4a"}, + "xmpp": {:git, "https://github.com/processone/xmpp.git", "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5", [ref: "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5"]}, "yconf": {:hex, :yconf, "1.0.13", "25557689f71897e20c8630ae8865ce083437d325e7d5a6f8ee950c7e0e7be4e1", [:rebar3], [{:fast_yaml, "1.0.33", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "3fd478212b3da121229684288f5154c3610ac6b6c3dbbbdd7886737cab82d851"}, } diff --git a/rebar.config b/rebar.config index bde90d50b..4a27d49f6 100644 --- a/rebar.config +++ b/rebar.config @@ -56,7 +56,7 @@ {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}}, {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.19"}}}, {if_var_true, mysql, - {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", "82b68eb59a2e5a042605c604f72433c3472d5cf3"}}}, + {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.20"}}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}}, {if_var_true, pgsql, {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}}, From 4a22604701edea85519ee565f8cb23265db6f76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 22 Sep 2022 11:11:02 +0200 Subject: [PATCH 420/440] Export mod_muc_admin:get_room_pid/2 --- src/mod_muc_admin.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl index f29a5b56f..5f96801c6 100644 --- a/src/mod_muc_admin.erl +++ b/src/mod_muc_admin.erl @@ -45,7 +45,8 @@ get_room_serverhost/1, web_page_host/3, mod_opt_type/1, mod_options/1, - get_commands_spec/0, find_hosts/1, room_diagnostics/2]). + get_commands_spec/0, find_hosts/1, room_diagnostics/2, + get_room_pid/2]). -include("logger.hrl"). -include_lib("xmpp/include/xmpp.hrl"). From 403dc41b5f819551149b9629742fa22e6672e79d Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 23 Sep 2022 13:45:09 +0200 Subject: [PATCH 421/440] make-binaries: Fix GitHub release version checks Adapt to changes to GitHub release pages. --- tools/make-binaries | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index bf8c59445..28cbf7461 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -189,7 +189,7 @@ check_configured_dep_vsns() 'zlib-\([1-9][0-9.]*\)\.tar\.gz' check_vsn 'Expat' "$expat_vsn" \ 'https://github.com/libexpat/libexpat/releases' \ - 'expat-\([1-9][0-9.]*\)\.tar\.gz' + '[0-9]\]\([1-9][0-9.]*\)' check_vsn 'Termcap' "$termcap_vsn" \ 'https://ftp.gnu.org/gnu/termcap/' \ 'termcap-\([1-9][0-9.]*\)\.tar\.gz' @@ -201,7 +201,7 @@ check_configured_dep_vsns() 'unixODBC-\([1-9][0-9.]*\)\.tar\.gz' check_vsn 'Linux-PAM' "$pam_vsn" \ 'https://github.com/linux-pam/linux-pam/releases' \ - 'Linux-PAM-\([1-9][0-9.]*\)\.tar\.xz' + '[0-9]\]Linux-PAM \([1-9][0-9.]*\)' check_vsn 'libpng' "$png_vsn" \ 'http://www.libpng.org/pub/png/libpng.html' \ 'libpng-\([1-9][0-9.]*\)\.tar\.gz' @@ -213,7 +213,7 @@ check_configured_dep_vsns() 'libwebp-\([1-9][0-9.]*\)\.tar\.gz' check_vsn 'LibGD' "$gd_vsn" \ 'https://github.com/libgd/libgd/releases' \ - 'libgd-\([1-9][0-9.]*\)\.tar\.gz' + 'gd-\([1-9][0-9.]*\)' check_vsn 'Elixir' "$elixir_vsn" \ 'https://elixir-lang.org/install.html' \ 'v\([1-9][0-9.]*\)\.tar\.gz' From e4c20aa67415e9c8b56b6fe92adc631590d01562 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 23 Sep 2022 13:46:19 +0200 Subject: [PATCH 422/440] make-binaries: Bump Expat and libpng versions --- tools/make-binaries | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/make-binaries b/tools/make-binaries index 28cbf7461..20749da11 100755 --- a/tools/make-binaries +++ b/tools/make-binaries @@ -67,14 +67,14 @@ rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:] mix_vsn=$(mix_version "$rel_vsn") crosstool_vsn='1.25.0' termcap_vsn='1.3.1' -expat_vsn='2.4.8' +expat_vsn='2.4.9' zlib_vsn='1.2.12' yaml_vsn='0.2.5' ssl_vsn='1.1.1q' otp_vsn='24.3.4.5' elixir_vsn='1.14.0' pam_vsn='1.5.2' -png_vsn='1.6.37' +png_vsn='1.6.38' jpeg_vsn='9e' webp_vsn='1.2.4' gd_vsn='2.3.3' From c99ff6059ffb4028b624d3c325505d3bb1153513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 28 Sep 2022 18:28:24 +0200 Subject: [PATCH 423/440] Fix cache invalidation in shared roster Doing srg_get_info for not existing group, then srg_create, will make srg_add_user fail because it will get info that group doesn't exist from cache. --- src/mod_shared_roster.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 7d59e2fc9..69bbc520d 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -422,6 +422,7 @@ create_group(Host, Group, Opts) -> end, case use_cache(Mod, Host) of true -> + ets_cache:delete(?GROUP_OPTS_CACHE, {Host, Group}, cache_nodes(Mod, Host)), ets_cache:insert(?GROUP_OPTS_CACHE, {Host, Group}, Opts, cache_nodes(Mod, Host)); _ -> ok From 77dacf92d2a5695f35c82eb9efdb3dd61e62859f Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 30 Sep 2022 17:51:41 +0200 Subject: [PATCH 424/440] Annotate new options --- src/ejabberd_options_doc.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ejabberd_options_doc.erl b/src/ejabberd_options_doc.erl index 1d1dd8913..5cc0cc721 100644 --- a/src/ejabberd_options_doc.erl +++ b/src/ejabberd_options_doc.erl @@ -817,12 +817,14 @@ doc() -> "The default value is '10485760' (that is, 10 Mb).")}}, {log_burst_limit_count, #{value => ?T("Number"), + note => "added in 22.10", desc => ?T("The number of messages to accept in " "`log_burst_limit_window_time` period before starting to " "drop them. Default 500")}}, {log_burst_limit_window_time, #{value => ?T("Number"), + note => "added in 22.10", desc => ?T("The time period to rate-limit log messages " "by. Defaults to 1 second.")}}, From 77f9254f4579db4ce070bfa701a80b8e47c65a46 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 30 Sep 2022 19:05:04 +0200 Subject: [PATCH 425/440] Handle case that module exports mod_doc, but nothing in it --- src/ejabberd_doc.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_doc.erl b/src/ejabberd_doc.erl index c603a5f9a..ba28c8116 100644 --- a/src/ejabberd_doc.erl +++ b/src/ejabberd_doc.erl @@ -48,7 +48,10 @@ man(Lang) -> {[{M, Descr, DocOpts, #{example => Example}}|Mods], SubMods}; #{opts := DocOpts} -> {ParentMod, Backend} = strip_backend_suffix(M), - {Mods, dict:append(ParentMod, {M, Backend, DocOpts}, SubMods)} + {Mods, dict:append(ParentMod, {M, Backend, DocOpts}, SubMods)}; + #{} -> + warn("module ~s is not properly documented", [M]), + Acc catch _:undef -> case erlang:function_exported( M, mod_options, 1) of From 1e24ad817cdee6c1b47a8e0c572a802d84f57feb Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 30 Sep 2022 18:27:34 +0200 Subject: [PATCH 426/440] Update man page --- man/ejabberd.yml.5 | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/man/ejabberd.yml.5 b/man/ejabberd.yml.5 index 82c9340cc..dab3bcc50 100644 --- a/man/ejabberd.yml.5 +++ b/man/ejabberd.yml.5 @@ -2,12 +2,12 @@ .\" Title: ejabberd.yml .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/04/2022 +.\" Date: 10/12/2022 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "EJABBERD\&.YML" "5" "05/04/2022" "\ \&" "\ \&" +.TH "EJABBERD\&.YML" "5" "10/12/2022" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -82,7 +82,7 @@ All options can be changed in runtime by running \fIejabberdctl reload\-config\f .sp Some options can be specified for particular virtual host(s) only using \fIhost_config\fR or \fIappend_host_config\fR options\&. Such options are called \fIlocal\fR\&. Examples are \fImodules\fR, \fIauth_method\fR and \fIdefault_db\fR\&. The options that cannot be defined per virtual host are called \fIglobal\fR\&. Examples are \fIloglevel\fR, \fIcertfiles\fR and \fIlisten\fR\&. It is a configuration mistake to put \fIglobal\fR options under \fIhost_config\fR or \fIappend_host_config\fR section \- ejabberd will refuse to load such configuration\&. .sp -It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/22\&.05/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. +It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/22\&.10/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&. .sp Note that this document is intended to provide comprehensive description of all configuration options that can be consulted to understand the meaning of a particular option, its format and possible values\&. It will be quite hard to understand how to configure ejabberd by reading this document only \- for this purpose the reader is recommended to read online Configuration Guide available at https://docs\&.ejabberd\&.im/admin/configuration\&. .SH "TOP LEVEL OPTIONS" @@ -1006,6 +1006,22 @@ The option for listeners configuration\&. See the Listen Modules section for details\&. .RE +.sp +\fINote\fR about the next option: added in 22\&.10: +.PP +\fBlog_burst_limit_count\fR: \fINumber\fR +.RS 4 +The number of messages to accept in +log_burst_limit_window_time +period before starting to drop them\&. Default 500 +.RE +.sp +\fINote\fR about the next option: added in 22\&.10: +.PP +\fBlog_burst_limit_window_time\fR: \fINumber\fR +.RS 4 +The time period to rate\-limit log messages by\&. Defaults to 1 second\&. +.RE .PP \fBlog_rotate_count\fR: \fINumber\fR .RS 4 @@ -1063,7 +1079,7 @@ This option can be used to tune tick time parameter of Whether to use \fInew\fR SQL schema\&. All schemas are located at -https://github\&.com/processone/ejabberd/tree/22\&.05/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The +https://github\&.com/processone/ejabberd/tree/22\&.10/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The \fInew\fR schema allows to handle several XMPP domains in a single ejabberd database\&. Using this \fInew\fR @@ -7597,13 +7613,13 @@ TODO ProcessOne\&. .SH "VERSION" .sp -This document describes the configuration file of ejabberd 22\&.05\&. Configuration options of other ejabberd versions may differ significantly\&. +This document describes the configuration file of ejabberd 22\&.10\&. Configuration options of other ejabberd versions may differ significantly\&. .SH "REPORTING BUGS" .sp Report bugs to https://github\&.com/processone/ejabberd/issues .SH "SEE ALSO" .sp -Default configuration file: https://github\&.com/processone/ejabberd/blob/22\&.05/ejabberd\&.yml\&.example +Default configuration file: https://github\&.com/processone/ejabberd/blob/22\&.10/ejabberd\&.yml\&.example .sp Main site: https://ejabberd\&.im .sp From 83150e0b763203a97de7c6f114fdafb560916890 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:17:55 +0200 Subject: [PATCH 427/440] Update Catalan translation (thanks to Maite Guix) --- priv/msgs/ca.msg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/priv/msgs/ca.msg b/priv/msgs/ca.msg index fa2f16285..3f32a525b 100644 --- a/priv/msgs/ca.msg +++ b/priv/msgs/ca.msg @@ -172,6 +172,8 @@ {"Full List of Room Admins","Llista completa de administradors de la sala"}. {"Full List of Room Owners","Llista completa de propietaris de la sala"}. {"Full Name","Nom complet"}. +{"Get List of Online Users","Obté la llista d'usuaris en línia"}. +{"Get List of Registered Users","Obté la llista d'usuaris registrats"}. {"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}. {"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}. {"Get Pending","Obtenir Pendents"}. @@ -527,6 +529,8 @@ {"The JIDs of those to contact with questions","Els JIDs a qui contactar amb preguntes"}. {"The JIDs of those with an affiliation of owner","Els JIDs de qui tenen una afiliació de propietaris"}. {"The JIDs of those with an affiliation of publisher","Els JIDs de qui tenen una afiliació de publicadors"}. +{"The list of all online users","La llista de tots els usuaris en línia"}. +{"The list of all users","La llista de tots els usuaris"}. {"The list of JIDs that may associate leaf nodes with a collection","La llista de JIDs que poden associar nodes fulla amb una col·lecció"}. {"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El màxim número de nodes fills que poden associar-se amb una col·lecció, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}. {"The minimum number of milliseconds between sending any two notification digests","El número mínim de mil·lisegons entre l'enviament de dos resums de notificacions"}. From 28fb992947468eb29a40e7adda8a980d204da217 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:19:00 +0200 Subject: [PATCH 428/440] Update German translation (thanks to nautilusx) --- priv/msgs/de.msg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/priv/msgs/de.msg b/priv/msgs/de.msg index 8bfa329a9..a0c71f903 100644 --- a/priv/msgs/de.msg +++ b/priv/msgs/de.msg @@ -172,6 +172,8 @@ {"Full List of Room Admins","Vollständige Liste der Raumadmins"}. {"Full List of Room Owners","Vollständige Liste der Raumbesitzer"}. {"Full Name","Vollständiger Name"}. +{"Get List of Online Users","Liste der angemeldeten Benutzer abrufen"}. +{"Get List of Registered Users","Liste der registrierten Benutzer abrufen"}. {"Get Number of Online Users","Anzahl der angemeldeten Benutzer abrufen"}. {"Get Number of Registered Users","Anzahl der registrierten Benutzer abrufen"}. {"Get Pending","Ausstehende abrufen"}. @@ -527,6 +529,8 @@ {"The JIDs of those to contact with questions","Die JIDs jener, die bei Fragen zu kontaktieren sind"}. {"The JIDs of those with an affiliation of owner","Die JIDs jener mit einer Zugehörigkeit von Besitzer"}. {"The JIDs of those with an affiliation of publisher","Die JIDs jener mit einer Zugehörigkeit von Veröffentlicher"}. +{"The list of all online users","Die Liste aller angemeldeter Benutzer"}. +{"The list of all users","Die Liste aller Benutzer"}. {"The list of JIDs that may associate leaf nodes with a collection","Die Liste der JIDs die Blattknoten mit einer Sammlung verknüpfen dürfen"}. {"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Die Höchstzahl der untergeordneten Knoten, die einer Sammlung zugeordnet werden können, oder `max`, wenn es keine spezifische Begrenzung gibt, sondern nur eine vom Server festgelegte Höchstzahl"}. {"The minimum number of milliseconds between sending any two notification digests","Die minimale Anzahl an Millisekunden zwischen dem Senden von zwei Benachrichtigungs-Übersichten"}. From d34274549cbe28f3b1573881233cb3c80ec9fee7 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:19:27 +0200 Subject: [PATCH 429/440] Update Spanish translation (thanks to Eduardo Malaspina) --- priv/msgs/es.msg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/priv/msgs/es.msg b/priv/msgs/es.msg index 7a30f4ea2..c9d227178 100644 --- a/priv/msgs/es.msg +++ b/priv/msgs/es.msg @@ -172,6 +172,8 @@ {"Full List of Room Admins","Lista completa de administradores de la sala"}. {"Full List of Room Owners","Lista completa de dueños de la sala"}. {"Full Name","Nombre completo"}. +{"Get List of Online Users","Ver lista de usuarios conectados"}. +{"Get List of Registered Users","Ver lista de usuarios registrados"}. {"Get Number of Online Users","Ver número de usuarios conectados"}. {"Get Number of Registered Users","Ver número de usuarios registrados"}. {"Get Pending","Obtener pendientes"}. @@ -527,6 +529,8 @@ {"The JIDs of those to contact with questions","Los JIDs a quienes contactar con preguntas"}. {"The JIDs of those with an affiliation of owner","Los JIDs de quienes tienen una afiliación de dueños"}. {"The JIDs of those with an affiliation of publisher","Los JIDs de quienes tienen una afiliación de publicadores"}. +{"The list of all online users","La lista de todos los usuarios conectados"}. +{"The list of all users","La lista de todos los usuarios"}. {"The list of JIDs that may associate leaf nodes with a collection","La lista de JIDs que pueden asociar nodos hijo con una colección"}. {"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El número máximo de nodos hijo que pueden asociarse a una colección, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}. {"The minimum number of milliseconds between sending any two notification digests","El número mínimo de milisegundos entre dos envíos de resumen de notificaciones"}. From b14b84744a679200dc54114f613145b6af22289d Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:20:04 +0200 Subject: [PATCH 430/440] Update French translation (thanks to Maxime Leroy) --- priv/msgs/fr.msg | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/priv/msgs/fr.msg b/priv/msgs/fr.msg index 05ad41e42..aa8499c1b 100644 --- a/priv/msgs/fr.msg +++ b/priv/msgs/fr.msg @@ -169,6 +169,8 @@ {"Full List of Room Admins","Liste complète des administrateurs des salons"}. {"Full List of Room Owners","Liste complète des propriétaires des salons"}. {"Full Name","Nom complet"}. +{"Get List of Online Users","Récupérer les utilisateurs en ligne"}. +{"Get List of Registered Users","Récupérer les utilisateurs enregistrés"}. {"Get Number of Online Users","Récupérer le nombre d'utilisateurs en ligne"}. {"Get Number of Registered Users","Récupérer le nombre d'utilisateurs enregistrés"}. {"Get User Last Login Time","Récupérer la dernière date de connexion de l'utilisateur"}. @@ -184,6 +186,7 @@ {"has been kicked because of an affiliation change","a été éjecté à cause d'un changement d'autorisation"}. {"has been kicked because the room has been changed to members-only","a été éjecté car la salle est désormais réservée aux membres"}. {"has been kicked","a été expulsé"}. +{"Hats limit exceeded","La limite a été dépassée"}. {"Host unknown","Serveur inconnu"}. {"Host","Serveur"}. {"HTTP File Upload","Téléversement de fichier HTTP"}. @@ -250,6 +253,7 @@ {"May","Mai"}. {"Membership is required to enter this room","Vous devez être membre pour accèder à ce salon"}. {"Members:","Membres :"}. +{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Mémorisez votre mot de passe, ou écrivez-le sur un papier conservé dans un endroit secret. Dans XMPP il n'y a pas de mécanisme pour retrouver votre mot de passe si vous l'avez oublié."}. {"Memory","Mémoire"}. {"Message body","Corps du message"}. {"Message not found in forwarded payload","Message non trouvé dans l'enveloppe transférée"}. @@ -265,6 +269,7 @@ {"Module failed to handle the query","Échec de traitement de la demande"}. {"Monday","Lundi"}. {"Multicast","Multidiffusion"}. +{"Multiple elements are not allowed by RFC6121","Les multiples éléments ne sont pas autorisés avec RFC6121"}. {"Multi-User Chat","Discussion de groupe"}. {"Name","Nom"}. {"Name:","Nom :"}. @@ -278,6 +283,8 @@ {"Nickname Registration at ","Enregistrement d'un pseudo sur "}. {"Nickname ~s does not exist in the room","Le pseudo ~s n'existe pas dans ce salon"}. {"Nickname","Pseudo"}. +{"No address elements found","Aucun élément d'adresse trouvé"}. +{"No addresses element found","Aucun élément d'adresses trouvé"}. {"No 'affiliation' attribute found","Attribut 'affiliation' absent"}. {"No available resource found","Aucune ressource disponible"}. {"No body provided for announce message","Pas de corps de message pour l'annonce"}. @@ -285,6 +292,7 @@ {"No data form found","Formulaire non trouvé"}. {"No Data","Aucune information disponible"}. {"No features available","Aucune fonctionalité disponible"}. +{"No element found","Aucun élément trouvé"}. {"No hook has processed this command","Aucun gestionnaire n'a pris en charge cette commande"}. {"No info about last activity found","Aucune activité précédente trouvée"}. {"No 'item' element found","Aucun élément 'item' trouvé"}. @@ -368,10 +376,15 @@ {"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ces options sauvegardent uniquement la base de données interne Mnesia. Si vous utilisez le module ODBC vous devez sauvegarde votre base SQL séparément."}. {"Please, wait for a while before sending new voice request","Attendez un moment avant de re-lancer une requête de voix"}. {"Pong","Pong"}. +{"Possessing 'ask' attribute is not allowed by RFC6121","L'appartenance de l'attribut 'ask' n'est pas autorisé avec RFC6121"}. {"Present real Jabber IDs to","Rendre le Jabber ID réel visible pour"}. {"Previous session not found","Session précédente introuvable"}. +{"Previous session PID has been killed","Le précédent PID de session a été tuée"}. +{"Previous session PID has exited","Le précédent PID de session a quitté"}. +{"Previous session PID is dead","Le précédent PID de session est mort"}. {"Previous session timed out","La session précédente a expiré"}. {"private, ","privé, "}. +{"Public","Public"}. {"Publish-Subscribe","Publication-Abonnement"}. {"PubSub subscriber request","Demande d'abonnement PubSub"}. {"Purge all items when the relevant publisher goes offline","Purger tous les items lorsque publieur est hors-ligne"}. @@ -380,6 +393,10 @@ {"RAM and disc copy","Copie en mémoire vive (RAM) et sur disque"}. {"RAM copy","Copie en mémoire vive (RAM)"}. {"Really delete message of the day?","Confirmer la suppression du message du jour ?"}. +{"Receive notification from all descendent nodes","Recevoir les notifications de tous les nœuds descendants"}. +{"Receive notification from direct child nodes only","Recevoir les notifications des nœuds enfants seulement"}. +{"Receive notification of new items only","Recevoir les notifications des nouveaux éléments uniquement"}. +{"Receive notification of new nodes only","Recevoir les notifications de tous les nouveaux nœuds descendants"}. {"Recipient is not in the conference room","Le destinataire n'est pas dans la conférence"}. {"Register an XMPP account","Inscrire un compte XMPP"}. {"Registered Users","Utilisateurs enregistrés"}. @@ -412,9 +429,11 @@ {"Roster:","Liste de contacts :"}. {"RPC Call Error","Erreur d'appel RPC"}. {"Running Nodes","Nœuds actifs"}. +{"~s invites you to the room ~s","~s vous invite dans la salle de discussion ~s"}. {"Saturday","Samedi"}. {"Script check","Validation du script"}. {"Search Results for ","Résultats de recherche pour "}. +{"Search the text","Recherche le texte"}. {"Search until the date","Rechercher jusqu’à la date"}. {"Search users in ","Rechercher des utilisateurs "}. {"Select All","Tout sélectionner"}. @@ -431,9 +450,12 @@ {"Show Integral Table","Montrer la table intégralement"}. {"Show Ordinary Table","Montrer la table ordinaire"}. {"Shut Down Service","Arrêter le service"}. +{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}. +{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Certains clients XMPP peuvent stocker votre mot de passe sur votre ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la sécurité de votre ordinateur."}. {"Specify the access model","Définir le modèle d'accès"}. {"Specify the event message type","Définir le type de message d'événement"}. {"Specify the publisher model","Définir le modèle de publication"}. +{"Stanza ID","Identifiant Stanza"}. {"Statistics of ~p","Statistiques de ~p"}. {"Statistics","Statistiques"}. {"Stop","Arrêter"}. @@ -446,6 +468,7 @@ {"Submit","Soumettre"}. {"Submitted","Soumis"}. {"Subscriber Address","Adresse de l'abonné"}. +{"Subscribers may publish","Les souscripteurs peuvent publier"}. {"Subscription","Abonnement"}. {"Subscriptions are not allowed","Les abonnement ne sont pas autorisés"}. {"Sunday","Dimanche"}. @@ -466,8 +489,11 @@ {"The default language of the node","La langue par défaut du nœud"}. {"The feature requested is not supported by the conference","La demande de fonctionalité n'est pas supportée par la conférence"}. {"The JID of the node creator","Le JID du créateur du nœud"}. +{"The list of all online users","Les utilisateurs en ligne"}. +{"The list of all users","La liste de tous les utilisateurs"}. {"The name of the node","Le nom du nœud"}. {"The node is a collection node","Le nœud est un nœud de collecte"}. +{"The node is a leaf node (default)","Ce nœud est un nœud feuille (défaut)"}. {"The number of subscribers to the node","Le nombre d’enregistrés au nœud"}. {"The number of unread or undelivered messages","Le nombre de messages non lus ou non remis"}. {"The password contains unacceptable characters","Le mot de passe contient des caractères non-acceptables"}. @@ -484,6 +510,8 @@ {"There was an error changing the password: ","Une erreur s’est produite lors de la modification du mot de passe : "}. {"There was an error creating the account: ","Il y a eu une erreur en créant le compte : "}. {"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte : "}. +{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","C'est insensible à la casse : macbeth est identique à MacBeth et Macbeth."}. +{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Cette page permet de créer un compte XMPP sur ce serveur XMPP. Votre JID (Jabber IDentifier, identifiant Jabber) sera de la forme : nom@serveur. Prière de lire avec attention les instructions pour remplir correctement ces champs."}. {"This page allows to unregister an XMPP account in this XMPP server.","Cette page permet de désenregistrer un compte XMPP sur ce serveur XMPP."}. {"This room is not anonymous","Ce salon n'est pas anonyme"}. {"This service can not process the address: ~s","Ce service ne peut pas traiter l’adresse : ~s"}. @@ -558,11 +586,16 @@ {"Wednesday","Mercredi"}. {"When a new subscription is processed","Quand un nouvel abonnement est traité"}. {"When to send the last published item","A quel moment envoyer le dernier élément publié"}. +{"Whether an entity wants to receive or disable notifications","Quand une entité veut recevoir ou désactiver les notifications"}. +{"Whether owners or publisher should receive replies to items","Quand les propriétaires ou annonceurs doivent revoir des réponses à leurs éléments"}. {"Whether to allow subscriptions","Autoriser ou non les abonnements"}. +{"Whether to notify owners about new subscribers and unsubscribes","Quand notifier le propriétaire à propos des nouvelles souscriptions et désinscriptions"}. {"Wrong parameters in the web formulary","Paramètres erronés dans le formulaire Web"}. {"Wrong xmlns","Xmlns incorrect"}. {"XMPP Account Registration","Enregistrement de compte XMPP"}. {"XMPP Domains","Domaines XMPP"}. +{"You are being removed from the room because of a system shutdown","Vous avez été éjecté du salon de discussion en raison de l'arrêt du système"}. +{"You are not joined to the channel","Vous n'avez pas rejoint ce canal"}. {"You can later change your password using an XMPP client.","Vous pouvez modifier ultérieurement votre mot de passe à l’aide d’un client XMPP."}. {"You have been banned from this room","Vous avez été exclus de ce salon"}. {"You have joined too many conferences","Vous avec rejoint trop de conférences"}. @@ -573,5 +606,6 @@ {"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}. {"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}. {"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}. +{"Your XMPP account was successfully registered.","Votre compte XMPP a été enregistré avec succès."}. {"Your XMPP account was successfully unregistered.","Votre compte XMPP a été désinscrit avec succès."}. {"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}. From 1942f1b3703d599b22f04c539ca2ca0d37fb2c87 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:20:43 +0200 Subject: [PATCH 431/440] Update Portuguese (Brazil) translation (thanks to Wellington Terumi Uemura) --- priv/msgs/pt-br.msg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/priv/msgs/pt-br.msg b/priv/msgs/pt-br.msg index b77969b26..3c922acf0 100644 --- a/priv/msgs/pt-br.msg +++ b/priv/msgs/pt-br.msg @@ -172,6 +172,8 @@ {"Full List of Room Admins","Lista completa dos administradores das salas"}. {"Full List of Room Owners","Lista completa dos proprietários das salas"}. {"Full Name","Nome completo"}. +{"Get List of Online Users","Obter a lista de usuários online"}. +{"Get List of Registered Users","Obter a lista de usuários registrados"}. {"Get Number of Online Users","Obter Número de Usuários Online"}. {"Get Number of Registered Users","Obter Número de Usuários Registrados"}. {"Get Pending","Obter os pendentes"}. @@ -527,6 +529,8 @@ {"The JIDs of those to contact with questions","Os JIDs daqueles para entrar em contato com perguntas"}. {"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}. {"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}. +{"The list of all online users","A lista de todos os usuários online"}. +{"The list of all users","A lista de todos os usuários"}. {"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós em uma coleção"}. {"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}. {"The minimum number of milliseconds between sending any two notification digests","O número mínimo de milissegundos entre o envio do resumo das duas notificações"}. From 4e4c6967306a9084eedb2b738388661074ae8110 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:21:11 +0200 Subject: [PATCH 432/440] Update Russian translation (thanks to AHOHNMYC) --- priv/msgs/ru.msg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/priv/msgs/ru.msg b/priv/msgs/ru.msg index 0b63a9c6a..962c83ae8 100644 --- a/priv/msgs/ru.msg +++ b/priv/msgs/ru.msg @@ -7,6 +7,7 @@ {" has set the subject to: "," установил(а) тему: "}. {"A friendly name for the node","Легко запоминаемое имя для узла"}. {"A password is required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}. +{"A Web Page","Веб-страница"}. {"Accept","Принять"}. {"Access denied by service policy","Доступ запрещён политикой службы"}. {"Account doesn't exist","Учётная запись не существует"}. @@ -20,6 +21,7 @@ {"All activity","Вся статистика"}. {"All Users","Все пользователи"}. {"Allow this Jabber ID to subscribe to this pubsub node?","Разрешить этому Jabber ID подписаться на данный узел?"}. +{"Allow this person to register with the room?","Разрешить пользователю зарегистрироваться в комнате?"}. {"Allow users to change the subject","Разрешить пользователям изменять тему"}. {"Allow users to query other users","Разрешить iq-запросы к пользователям"}. {"Allow users to send invites","Разрешить пользователям посылать приглашения"}. From 582a245cc7efafb124c57d2ce6f899222dde381d Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:22:17 +0200 Subject: [PATCH 433/440] Update Ukrainian translation (thanks to Artem) --- priv/msgs/uk.msg | 228 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 214 insertions(+), 14 deletions(-) diff --git a/priv/msgs/uk.msg b/priv/msgs/uk.msg index 16446c279..e2b99949f 100644 --- a/priv/msgs/uk.msg +++ b/priv/msgs/uk.msg @@ -3,12 +3,18 @@ %% To improve translations please read: %% https://docs.ejabberd.im/developer/extending-ejabberd/localization/ +{" (Add * to the end of field to match substring)"," Заповніть поля для пошуку користувача Jabber (Додайте * в кінець поля для пошуку підрядка)"}. {" has set the subject to: "," встановив(ла) тему: "}. +{"# participants","# учасників"}. +{"A description of the node","Опис вузла"}. {"A friendly name for the node","Псевдонім для вузла"}. {"A password is required to enter this room","Щоб зайти в цю конференцію, необхідно ввести пароль"}. +{"A Web Page","Веб-сторінка"}. {"Accept","Прийняти"}. {"Access denied by service policy","Доступ заборонений політикою служби"}. +{"Account doesn't exist","Обліковий запис не існує"}. {"Action on user","Дія над користувачем"}. +{"Add a hat to a user","Додати капелюх користувачу"}. {"Add Jabber ID","Додати Jabber ID"}. {"Add New","Додати"}. {"Add User","Додати користувача"}. @@ -17,7 +23,9 @@ {"Administrator privileges required","Необхідні права адміністратора"}. {"All activity","Вся статистика"}. {"All Users","Всі користувачі"}. -{"Allow this Jabber ID to subscribe to this pubsub node?","Чи дозволити цьому Jabber ID підписатись новини наданого вузла"}. +{"Allow subscription","Дозволити підписку"}. +{"Allow this Jabber ID to subscribe to this pubsub node?","Дозволити цьому Jabber ID підписатись на даний pubsub-вузол?"}. +{"Allow this person to register with the room?","Дозволити цій людині зареєструватися в кімнаті?"}. {"Allow users to change the subject","Дозволити користувачам змінювати тему"}. {"Allow users to query other users","Дозволити iq-запити до користувачів"}. {"Allow users to send invites","Дозволити користувачам надсилати запрошення"}. @@ -27,17 +35,41 @@ {"Allow visitors to send status text in presence updates","Дозволити відвідувачам відсилати текст статусу в оновленнях присутності"}. {"Allow visitors to send voice requests","Дозволити відвідувачам надсилати голосові запрошення"}. {"Announcements","Сповіщення"}. +{"Answer associated with a picture","Відповідь, пов’язана зі зображенням"}. +{"Answer associated with a video","Відповідь, пов'язана з відео"}. +{"Answer associated with speech","Відповідь, пов'язана з мовленням"}. +{"Answer to a question","Відповідь на запитання"}. +{"Anyone in the specified roster group(s) may subscribe and retrieve items","Будь-хто в зазначеному списку груп(и) може підписатися та отримати елементи"}. +{"Anyone may associate leaf nodes with the collection","Будь-хто може зв'язати вузли листів з колекцією"}. +{"Anyone may publish","Будь-хто може опублікувати"}. +{"Anyone may subscribe and retrieve items","Будь-хто може підписатися та отримати елементи"}. +{"Anyone with Voice","Усі, хто має голос"}. {"April","квітня"}. +{"Attribute 'channel' is required for this request","Для цього запиту потрібен атрибут \"канал\""}. +{"Attribute 'id' is mandatory for MIX messages","Для MIX повідомлень потрібен атрибут \"id\""}. +{"Attribute 'jid' is not allowed here","Атрибут 'jid' тут заборонений"}. +{"Attribute 'node' is not allowed here","Атрибут \"вузол\" тут заборонений"}. {"August","серпня"}. +{"Automatic node creation is not enabled","Автоматичне створення вузлів не ввімкнено"}. {"Backup Management","Керування резервним копіюванням"}. {"Backup of ~p","Резервне копіювання ~p"}. {"Backup to File at ","Резервне копіювання в файл на "}. {"Backup","Резервне копіювання"}. {"Bad format","Неправильний формат"}. {"Birthday","День народження"}. +{"Both the username and the resource are required","Потрібне ім'я користувача та ресурс"}. +{"Bytestream already activated","Потік байтів вже активовано"}. +{"Cannot remove active list","Неможливо видалити активний список"}. +{"Cannot remove default list","Неможливо видалити список за промовчанням"}. {"CAPTCHA web page","Адреса капчі"}. +{"Challenge ID","ID виклику"}. {"Change Password","Змінити пароль"}. {"Change User Password","Змінити Пароль Користувача"}. +{"Changing password is not allowed","Зміна пароля заборонена"}. +{"Changing role/affiliation is not allowed","Зміна ролі/рангу заборонена"}. +{"Channel already exists","Канал уже існує"}. +{"Channel does not exist","Канал не існує"}. +{"Channels","Канали"}. {"Characters not allowed:","Заборонені символи:"}. {"Chatroom configuration modified","Конфігурація кімнати змінилась"}. {"Chatroom is created","Створено кімнату"}. @@ -47,41 +79,55 @@ {"Chatrooms","Кімнати"}. {"Choose a username and password to register with this server","Виберіть назву користувача та пароль для реєстрації на цьому сервері"}. {"Choose storage type of tables","Оберіть тип збереження таблиць"}. -{"Choose whether to approve this entity's subscription.","Вирішіть, чи задовольнити запит цього об'єкту на підписку"}. +{"Choose whether to approve this entity's subscription.","Вирішіть, чи задовольнити запит цього об'єкту на підписку."}. {"City","Місто"}. +{"Client acknowledged more stanzas than sent by server","Клієнт підтвердив більше повідомлень, ніж було відправлено сервером"}. {"Commands","Команди"}. {"Conference room does not exist","Конференція не існує"}. {"Configuration of room ~s","Конфігурація кімнати ~s"}. {"Configuration","Конфігурація"}. {"Connected Resources:","Підключені ресурси:"}. +{"Contact Addresses (normally, room owner or owners)","Контактні адреси (зазвичай, власника або власників кімнати)"}. {"Country","Країна"}. {"CPU Time:","Процесорний час:"}. +{"Current Discussion Topic","Поточна тема обговорення"}. +{"Database failure","Помилка база даних"}. {"Database Tables at ~p","Таблиці бази даних на ~p"}. {"Database Tables Configuration at ","Конфігурація таблиць бази даних на "}. {"Database","База даних"}. {"December","грудня"}. {"Default users as participants","Зробити користувачів учасниками за замовчуванням"}. +{"Delete content","Видалити вміст"}. {"Delete message of the day on all hosts","Видалити повідомлення дня на усіх хостах"}. {"Delete message of the day","Видалити повідомлення дня"}. {"Delete Selected","Видалити виділені"}. +{"Delete table","Видалити таблицю"}. {"Delete User","Видалити Користувача"}. {"Deliver event notifications","Доставляти сповіщення про події"}. {"Deliver payloads with event notifications","Доставляти разом з повідомленнями про публікації самі публікації"}. {"Description:","Опис:"}. {"Disc only copy","Тільки диск"}. +{"'Displayed groups' not added (they do not exist!): ","\"Відображені групи\" не додано (вони не існують!): "}. +{"Displayed:","Відображено:"}. +{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Нікому не кажіть свій пароль, навіть адміністраторам XMPP-сервера."}. {"Dump Backup to Text File at ","Копіювання в текстовий файл на "}. {"Dump to Text File","Копіювання в текстовий файл"}. +{"Duplicated groups are not allowed by RFC6121","RFC6121 забороняє дублювати групи"}. {"Edit Properties","Змінити параметри"}. -{"Either approve or decline the voice request.","Підтвердить або відхилите голосовий запит"}. +{"Either approve or decline the voice request.","Підтвердіть або відхиліть голосовий запит."}. +{"ejabberd HTTP Upload service","Служба відвантаження по HTTP для ejabberd"}. {"ejabberd MUC module","ejabberd MUC модуль"}. {"ejabberd Multicast service","Мультікаст ejabberd сервіс"}. {"ejabberd Publish-Subscribe module","Модуль ejabberd Публікації-Підписки"}. {"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams модуль"}. {"ejabberd vCard module","ejabberd vCard модуль"}. {"ejabberd Web Admin","Веб-інтерфейс Адміністрування ejabberd"}. +{"ejabberd","ejabberd"}. {"Elements","Елементи"}. +{"Email Address","Адреса ел. пошти"}. {"Email","Електронна пошта"}. -{"Enable logging","Включити журнал роботи"}. +{"Enable hats","Увімкнути капелюхи"}. +{"Enable logging","Увімкнути журнал роботи"}. {"Enable message archiving","Ввімкнути архівацію повідомлень"}. {"End User Session","Закінчити Сеанс Користувача"}. {"Enter nickname you want to register","Введіть псевдонім, який ви хочете зареєструвати"}. @@ -90,16 +136,29 @@ {"Enter path to jabberd14 spool file","Введіть шлях до файла зі спула jabberd14"}. {"Enter path to text file","Введіть шлях до текстового файла"}. {"Enter the text you see","Введіть текст, що ви бачите"}. +{"Erlang XMPP Server","Ерланґ XMPP Сервер"}. {"Error","Помилка"}. {"Exclude Jabber IDs from CAPTCHA challenge","Пропускати ці Jabber ID без CAPTCHA-запиту"}. -{"Export all tables as SQL queries to a file:","Експорт усіх таблиць, як SQL запити, у файл"}. +{"Export all tables as SQL queries to a file:","Експортувати всі таблиці у файл як SQL запити:"}. {"Export data of all users in the server to PIEFXIS files (XEP-0227):","Експорт даних всіх користувачів сервера до файлу PIEFXIS (XEP-0227):"}. {"Export data of users in a host to PIEFXIS files (XEP-0227):","Експорт даних користувачів домена до файлу PIEFXIS (XEP-0227):"}. +{"External component failure","Помилка зовнішнього компонента"}. +{"External component timeout","Тайм-аут зовнішнього компонента"}. +{"Failed to activate bytestream","Не вдалося активувати потік байтів"}. {"Failed to extract JID from your voice request approval","Помилка витягнення JID з вашого схвалення голосового запиту"}. +{"Failed to map delegated namespace to external component","Не вдалося зіставити делегований простір імен із зовнішнім компонентом"}. +{"Failed to parse HTTP response","Не вдалося розібрати HTTP-відповідь"}. +{"Failed to process option '~s'","Не вдалося обробити параметр \"~s\""}. {"Family Name","Прізвище"}. +{"FAQ Entry","Запис в ЧаПи"}. {"February","лютого"}. +{"File larger than ~w bytes","Файл більший, ніж ~w байт"}. +{"Fill in the form to search for any matching XMPP User","Заповніть форму для пошуку будь-якого відповідного користувача XMPP"}. {"Friday","П'ятниця"}. +{"From ~ts","Від ~ts"}. {"From","Від кого"}. +{"Full List of Room Admins","Повний перелік адміністраторів кімнати"}. +{"Full List of Room Owners","Повний перелік власників кімнати"}. {"Full Name","Повне ім'я"}. {"Get Number of Online Users","Отримати Кількість Підключених Користувачів"}. {"Get Number of Registered Users","Отримати Кількість Зареєстрованих Користувачів"}. @@ -107,6 +166,7 @@ {"Get User Password","Отримати Пароль Користувача"}. {"Get User Statistics","Отримати Статистику по Користувачу"}. {"Grant voice to this person?","Надати голос персоні?"}. +{"Groups that will be displayed to the members","Групи, які показуватимуться учасникам"}. {"Groups","Групи"}. {"Group","Група"}. {"has been banned","заборонили вхід в кімнату"}. @@ -114,8 +174,11 @@ {"has been kicked because of an affiliation change","вигнано з кімнати внаслідок зміни рангу"}. {"has been kicked because the room has been changed to members-only","вигнано з кімнати тому, що вона стала тільки для учасників"}. {"has been kicked","вигнали з кімнати"}. +{"Host unknown","Невідоме ім'я сервера"}. {"Host","Хост"}. -{"If you don't see the CAPTCHA image here, visit the web page.","Якщо ви не бачите зображення капчі, перейдіть за за цією адресою."}. +{"HTTP File Upload","Відвантаження файлів по HTTP"}. +{"Idle connection","Неактивне підключення"}. +{"If you don't see the CAPTCHA image here, visit the web page.","Якщо ви не бачите зображення CAPTCHA, перейдіть за адресою."}. {"Import Directory","Імпорт з директорії"}. {"Import File","Імпорт з файла"}. {"Import user data from jabberd14 spool file:","Імпорт користувачів з файла спула jabberd14:"}. @@ -123,27 +186,46 @@ {"Import users data from a PIEFXIS file (XEP-0227):","Імпорт даних користовучів з файлу PIEFXIS (XEP-0227):"}. {"Import users data from jabberd14 spool directory:","Імпорт користувачів з діректорії спула jabberd14:"}. {"Import Users from Dir at ","Імпортування користувача з директорії на "}. -{"Import Users From jabberd14 Spool Files","Імпорт користувачів з jabberd14 файлів \"Spool\""}. +{"Import Users From jabberd14 Spool Files","Імпорт користувачів з jabberd14 файлів \"Spool\""}. +{"Improper domain part of 'from' attribute","Неправильна доменна частина атрибута \"from\""}. {"Improper message type","Неправильний тип повідомлення"}. {"Incoming s2s Connections:","Вхідні s2s-з'єднання:"}. +{"Incorrect CAPTCHA submit","Неправильний ввід CAPTCHA"}. +{"Incorrect data form","Неправильна форма даних"}. {"Incorrect password","Неправильний пароль"}. +{"Incorrect value of 'action' attribute","Неправильне значення атрибута \"action\""}. +{"Incorrect value of 'action' in data form","Неправильне значення \"action\" у формі даних"}. +{"Incorrect value of 'path' in data form","Неправильне значення \"path\" у формі даних"}. +{"Insufficient privilege","Недостатньо привілеїв"}. +{"Internal server error","Внутрішня помилка сервера"}. +{"Invalid 'from' attribute in forwarded message","Неприйнятний атрибут \"from\" у пересланому повідомленні"}. +{"Invalid node name","Неприйнятне ім'я вузла"}. +{"Invalid 'previd' value","Неприйнятне значення \"previd\""}. +{"Invitations are not allowed in this conference","Запрошення на цю конференцію не допускаються"}. {"IP addresses","IP адреси"}. {"is now known as","змінив(ла) псевдонім на"}. {"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Не дозволяється відправляти помилкові повідомлення в кімнату. Учасник (~s) відправив помилкове повідомлення (~s), та був виганий з кімнати"}. {"It is not allowed to send private messages of type \"groupchat\"","Не дозволяється надсилати приватні повідомлення типу \"groupchat\""}. -{"It is not allowed to send private messages to the conference","Не дозволяється надсилати приватні повідомлення в конференцію"}. +{"It is not allowed to send private messages to the conference","Не дозволяється надсилати приватні повідомлення в конференцію"}. {"It is not allowed to send private messages","Приватні повідомлення не дозволені"}. {"Jabber ID","Jabber ID"}. {"January","січня"}. +{"JID normalization failed","Помилка нормалізації JID"}. {"joins the room","увійшов(ла) в кімнату"}. {"July","липня"}. {"June","червня"}. +{"Just created","Щойно створено"}. +{"Label:","Мітка:"}. {"Last Activity","Останнє підключення"}. {"Last login","Останнє підключення"}. +{"Last message","Останнє повідомлення"}. {"Last month","За останній місяць"}. {"Last year","За останній рік"}. {"leaves the room","вийшов(ла) з кімнати"}. {"List of rooms","Перелік кімнат"}. +{"List of users with hats","Список користувачів із капелюхами"}. +{"List users with hats","Список користувачів із капелюхами"}. +{"Logging","Журналювання"}. {"Low level update script","Низькорівневий сценарій поновлення"}. {"Make participants list public","Зробити список учасників видимим всім"}. {"Make room CAPTCHA protected","Зробити кімнату захищеною капчею"}. @@ -152,43 +234,89 @@ {"Make room password protected","Зробити кімнату захищеною паролем"}. {"Make room persistent","Зробити кімнату постійною"}. {"Make room public searchable","Зробити кімнату видимою всім"}. +{"Malformed username","Неправильне ім’я користувача"}. {"March","березня"}. {"Max payload size in bytes","Максимальний розмір корисного навантаження в байтах"}. +{"Maximum file size","Макс. розмір файлу"}. +{"Maximum Number of History Messages Returned by Room","Максимальна кількість повідомлень історії на кімнату"}. +{"Maximum number of items to persist","Максимальна кількість елементів для збереження"}. {"Maximum Number of Occupants","Максимальна кількість учасників"}. {"May","травня"}. +{"Members not added (inexistent vhost!): ","Учасників не додано (вірт. сервер не існує!): "}. {"Membership is required to enter this room","В цю конференцію можуть входити тільки її члени"}. {"Members:","Члени:"}. {"Memory","Пам'ять"}. {"Message body","Тіло повідомлення"}. +{"Message not found in forwarded payload","Повідомлення не знайдено в пересланому вмісті"}. +{"Messages from strangers are rejected","Повідомлення від незнайомців відхиляються"}. +{"Messages of type headline","Повідомлення типу \"заголовок\""}. +{"Messages of type normal","Повідомлення типу \"звичайні\""}. {"Middle Name","По-батькові"}. {"Minimum interval between voice requests (in seconds)","Мінімальний інтервал між голосовими запитами (в секундах)"}. {"Moderator privileges required","Необхідні права модератора"}. {"Moderator","Модератор"}. {"Modified modules","Змінені модулі"}. +{"Module failed to handle the query","Модулю не вдалося обробити запит"}. {"Monday","Понеділок"}. {"Multicast","Мультікаст"}. +{"Multiple elements are not allowed by RFC6121","Кілька елементів не дозволені RFC6121"}. {"Multi-User Chat","Багато-користувальницький чат"}. {"Name","Назва"}. {"Name:","Назва:"}. +{"Neither 'jid' nor 'nick' attribute found","Не знайдено ні атрибута \"jid\", ні \"nick\""}. +{"Neither 'role' nor 'affiliation' attribute found","Не знайдено ні атрибута \"role\", ні \"affiliation\""}. {"Never","Ніколи"}. {"New Password:","Новий Пароль:"}. +{"Nickname can't be empty","Псевдонім не може бути порожнім"}. {"Nickname Registration at ","Реєстрація псевдоніма на "}. {"Nickname ~s does not exist in the room","Псевдонім ~s в кімнаті відсутній"}. {"Nickname","Псевдонім"}. +{"No address elements found","Не знайдено елементів адреси"}. +{"No addresses element found","Не знайдено елемента адрес"}. +{"No 'affiliation' attribute found","Не знайдено атрибут \"affiliation\""}. +{"No available resource found","Не знайдено доступного ресурсу"}. {"No body provided for announce message","Тіло оголошення має бути непустим"}. +{"No child elements found","Не знайдено дочірніх елементів"}. +{"No data form found","Не знайдено форми даних"}. {"No Data","Немає даних"}. +{"No features available","Немає доступних функцій"}. +{"No element found","Вузол не знайдено"}. +{"No hook has processed this command","Жоден хук не обробив цю команду"}. +{"No info about last activity found","Не знайдено інформації про останню діяльність"}. +{"No 'item' element found","Елемент \"item\" не знайдено"}. +{"No items found in this query","У цьому запиті не знайдено жодного елемента"}. {"No limit","Без обмежень"}. +{"No module is handling this query","Жоден модуль не може обробити цей запит"}. +{"No node specified","Вузол не вказано"}. +{"No 'password' found in data form","Не знайдено \"пароль\" у формі даних"}. +{"No 'password' found in this query","Не знайдено \"пароль\" у цьому запиті"}. +{"No 'path' found in data form","Не знайдено \"path\" у формі даних"}. +{"No pending subscriptions found","Не знайдено очікуваних рішення підписок"}. +{"No privacy list with this name found","Немає списку конфіденційності з такою назвою"}. +{"No private data found in this query","Приватних даних у цьому запиті не знайдено"}. +{"No running node found","Не знайдено запущеного вузла"}. +{"No services available","Немає доступних сервісів"}. +{"No statistics found for this item","Для цього елемента статистичні дані не знайдено"}. +{"No 'to' attribute found in the invitation","У запрошенні не знайдено атрибут \"до\""}. +{"Node already exists","Вузол уже існує"}. {"Node ID","ID вузла"}. +{"Node index not found","Індекс вузла не знайдено"}. {"Node not found","Вузол не знайдено"}. {"Node ~p","Вузол ~p"}. +{"Nodeprep has failed","Не вдалося виконати Nodeprep"}. {"Nodes","Вузли"}. +{"Node","Вузол"}. {"None","Немає"}. +{"Not allowed","Не дозволяється"}. {"Not Found","не знайдено"}. +{"Not subscribed","Не підписаний"}. {"Notify subscribers when items are removed from the node","Повідомляти абонентів про видалення публікацій із збірника"}. {"Notify subscribers when the node configuration changes","Повідомляти абонентів про зміни в конфігурації збірника"}. {"Notify subscribers when the node is deleted","Повідомляти абонентів про видалення збірника"}. {"November","листопада"}. +{"Number of answers required","Кількість необхідних відповідей"}. {"Number of occupants","Кількість присутніх"}. +{"Number of Offline Messages","Кількість автономних повідомлень"}. {"Number of online users","Кількість підключених користувачів"}. {"Number of registered users","Кількість зареєстрованих користувачів"}. {"October","грудня"}. @@ -199,19 +327,26 @@ {"Online Users","Підключені користувачі"}. {"Online Users:","Підключені користувачі:"}. {"Online","Підключений"}. +{"Only admins can see this","Тільки адміністратори можуть це бачити"}. +{"Only collection node owners may associate leaf nodes with the collection","Лише власники вузлів колекції можуть асоціювати листові вузли з колекцією"}. {"Only deliver notifications to available users","Доставляти повідомленнями тільки доступним користувачам"}. +{"Only or tags are allowed","Дозволені лише теги або "}. +{"Only element is allowed in this query","У цьому запиті дозволено лише елемент "}. {"Only members may query archives of this room","Тільки модератори можуть запитувати архіви цієї кімнати"}. {"Only moderators and participants are allowed to change the subject in this room","Тільки модератори та учасники можуть змінювати тему в цій кімнаті"}. {"Only moderators are allowed to change the subject in this room","Тільки модератори можуть змінювати тему в цій кімнаті"}. {"Only moderators can approve voice requests","Тільки модератори можуть схвалювати голосові запити"}. {"Only occupants are allowed to send messages to the conference","Тільки присутнім дозволяється надсилати повідомленняя в конференцію"}. {"Only occupants are allowed to send queries to the conference","Тільки присутнім дозволяється відправляти запити в конференцію"}. +{"Only publishers may publish","Тільки видавці можуть публікувати"}. {"Only service administrators are allowed to send service messages","Тільки адміністратор сервісу може надсилати службові повідомлення"}. +{"Only those on a whitelist may associate leaf nodes with the collection","Лише ті, хто входить до білого списку, можуть асоціювати листові вузли з колекцією"}. {"Organization Name","Назва організації"}. {"Organization Unit","Відділ організації"}. {"Outgoing s2s Connections","Вихідні s2s-з'єднання"}. {"Outgoing s2s Connections:","Вихідні s2s-з'єднання:"}. {"Owner privileges required","Необхідні права власника"}. +{"Packet relay is denied by service policy","Пересилання пакетів заборонене політикою сервісу"}. {"Packet","Пакет"}. {"Participant","Учасник"}. {"Password Verification","Перевірка Пароля"}. @@ -221,22 +356,25 @@ {"Path to Dir","Шлях до директорії"}. {"Path to File","Шлях до файла"}. {"Pending","Очікування"}. -{"Period: ","Період"}. +{"Period: ","Період: "}. {"Persist items to storage","Зберегати публікації до сховища"}. {"Ping","Пінг"}. {"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Зауважте, що ця опція відповідає за резервне копіювання тільки вбудованної бази даних Mnesia. Якщо Ви також використовуєте інше сховище для даних (наприклад за допомогою модуля ODBC), то його резервне копіювання потрібно робити окремо."}. {"Please, wait for a while before sending new voice request","Будь ласка, почекайте деякий час перед тим, як знову відправляти голосовий запит"}. {"Pong","Понг"}. {"Present real Jabber IDs to","Зробити реальні Jabber ID учасників видимими"}. +{"Previous session not found","Попередній сеанс не знайдено"}. {"private, ","приватна, "}. {"Publish-Subscribe","Публікація-Підписка"}. {"PubSub subscriber request","Запит на підписку PubSub"}. {"Purge all items when the relevant publisher goes offline","Видалити всі елементи, коли особа, що їх опублікувала, вимикається від мережі"}. +{"Push record not found","Push-запис не знайдено"}. {"Queries to the conference members are not allowed in this room","Запити до користувачів в цій конференції заборонені"}. {"RAM and disc copy","ОЗП та диск"}. {"RAM copy","ОЗП"}. {"Really delete message of the day?","Насправді, видалити повідомлення дня?"}. {"Recipient is not in the conference room","Адресата немає в конференції"}. +{"Register an XMPP account","Зареєструвати XMPP-запис"}. {"Registered Users","Зареєстровані користувачі"}. {"Registered Users:","Зареєстровані користувачі:"}. {"Register","Реєстрація"}. @@ -254,15 +392,20 @@ {"Restore plain text backup immediately:","Відновити з текстової резервної копії негайно:"}. {"Restore","Відновлення з резервної копії"}. {"Roles for which Presence is Broadcasted","Ролі для яких поширюється наявність"}. +{"Roles that May Send Private Messages","Ролі, що можуть надсилати приватні повідомлення"}. {"Room Configuration","Конфігурація кімнати"}. {"Room creation is denied by service policy","Створювати конференцію заборонено політикою служби"}. {"Room description","Опис кімнати"}. {"Room Occupants","Учасники кімнати"}. +{"Room terminates","Кімната припиняється"}. {"Room title","Назва кімнати"}. {"Roster groups allowed to subscribe","Дозволені для підписки групи ростера"}. +{"Roster of ~ts","Список контактів ~ts"}. {"Roster size","Кількість контактів"}. +{"Roster:","Список контактів:"}. {"RPC Call Error","Помилка виклику RPC"}. {"Running Nodes","Працюючі вузли"}. +{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}. {"Saturday","Субота"}. {"Script check","Перевірка сценарію"}. {"Search Results for ","Результати пошуку в "}. @@ -291,26 +434,46 @@ {"Store plain text backup:","Зберегти текстову резервну копію:"}. {"Subject","Тема"}. {"Submitted","Відправлено"}. -{"Submit","Відправити"}. +{"Submit","Надіслати"}. {"Subscriber Address","Адреса абонента"}. {"Subscription","Підписка"}. {"Sunday","Неділя"}. {"That nickname is already in use by another occupant","Псевдонім зайнято кимось з присутніх"}. {"That nickname is registered by another person","Псевдонім зареєстровано кимось іншим"}. -{"The CAPTCHA is valid.","Перевірку капчею закінчено успішно"}. +{"The account was not unregistered","Обліковий запис не було видалено"}. +{"The CAPTCHA is valid.","Перевірку CAPTCHA успішно завершено."}. {"The CAPTCHA verification has failed","Перевірку капчею не пройдено"}. {"The collections with which a node is affiliated","Колекція, до якої входить вузол"}. {"The password is too weak","Пароль надто простий"}. -{"the password is","пароль:"}. -{"There was an error creating the account: ","Помилка при створенні акаунту:"}. +{"the password is","паролем є"}. +{"The presence states for which an entity wants to receive notifications","Стан присутності, для якого сутність хоче отримувати сповіщення"}. +{"The query is only allowed from local users","Запит дозволено лише від локальних користувачів"}. +{"The query must not contain elements","Запит не повинен містити елементів "}. +{"The room subject can be modified by participants","Тема кімнати може бути змінена учасниками"}. +{"The sender of the last received message","Відправник останнього отриманого повідомлення"}. +{"The stanza MUST contain only one element, one element, or one element","Строфа ПОВИННА містити лише один елемент , один елемент або один елемент "}. +{"The subscription identifier associated with the subscription request","Ідентифікатор підписки, пов’язаний із запитом на підписку"}. +{"There was an error changing the password: ","Помилка при зміні пароля: "}. +{"There was an error creating the account: ","Помилка при створенні облікового запису: "}. {"There was an error deleting the account: ","Помилка при видаленні акаунту: "}. +{"This page allows to unregister an XMPP account in this XMPP server.","Ця сторінка дозволяє видалити свій обліковий запис з XMPP-сервера."}. {"This room is not anonymous","Ця кімната не анонімна"}. {"Thursday","Четвер"}. {"Time delay","Час затримки"}. +{"Timed out waiting for stream resumption","Час очікування на відновлення потоку закінчився"}. {"Time","Час"}. +{"To register, visit ~s","Щоб зареєструватися, відвідайте ~s"}. +{"To ~ts","До ~ts"}. +{"Token TTL","Токен TTL"}. +{"Too many active bytestreams","Надто багато активних потоків байтів"}. {"Too many CAPTCHA requests","Надто багато CAPTCHA-запитів"}. -{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Забагато (~p) помилок авторизації з цієї IP адреси (~s). Адресу буде розблоковано о ~s UTC"}. +{"Too many child elements","Надто багато дочірніх елементів"}. +{"Too many elements","Надто багато елементів "}. +{"Too many elements","Надто багато елементів "}. +{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Забагато (~p) помилок авторизації з цієї IP адреси (~s). Адресу буде розблоковано о ~s UTC"}. +{"Too many receiver fields were specified","Вказано забагато одержувачів"}. {"Too many unacked stanzas","Занадто багато пакетів без відповідей"}. +{"Too many users in this conference","Надто багато користувачів у цій конференції"}. {"Total rooms","Всього кімнат"}. {"To","Кому"}. {"Traffic rate limit is exceeded","Швидкість передачі інформації було перевищено"}. @@ -318,10 +481,18 @@ {"Transactions Committed:","Транзакції завершені:"}. {"Transactions Logged:","Транзакції запротокольовані:"}. {"Transactions Restarted:","Транзакції перезапущені:"}. +{"~ts's Offline Messages Queue","Черга автономних повідомлень ~ts"}. {"Tuesday","Вівторок"}. {"Unable to generate a CAPTCHA","Нема можливості згенерувати капчу"}. +{"Unable to register route on existing local domain","Неможливо зареєструвати маршрут на наявному локальному домені"}. {"Unauthorized","Не авторизовано"}. +{"Unexpected action","Несподівана дія"}. +{"Unexpected error condition: ~p","Умова несподіваної помилки: ~p"}. +{"Unregister an XMPP account","Видалити обліковий запис XMPP"}. {"Unregister","Видалити"}. +{"Unselect All","Скасувати виділення з усіх"}. +{"Unsupported element","Непідтримуваний елемент "}. +{"Unsupported version","Непідтримувана версія"}. {"Update message of the day (don't send)","Оновити повідомлення дня (не надсилати)"}. {"Update message of the day on all hosts (don't send)","Оновити повідомлення дня на всіх хостах (не надсилати)"}. {"Update plan","План оновлення"}. @@ -329,15 +500,26 @@ {"Update script","Сценарій поновлення"}. {"Update","Обновити"}. {"Uptime:","Час роботи:"}. +{"URL for Archived Discussion Logs","URL-адреса для журналів архівних обговорень"}. +{"User already exists","Користувач уже існує"}. {"User JID","JID Користувача"}. +{"User (jid)","Користувач (jid)"}. {"User Management","Управління Користувачами"}. +{"User removed","Користувача видалено"}. +{"User session not found","Сеанс користувача не знайдено"}. +{"User session terminated","Сеанс користувача припинено"}. +{"User ~ts","Користувач ~ts"}. {"Username:","Ім'я користувача:"}. {"Users are not allowed to register accounts so quickly","Користувачам не дозволено так часто реєструвати облікові записи"}. {"Users Last Activity","Статистика останнього підключення користувачів"}. {"Users","Користувачі"}. {"User","Користувач"}. {"Validate","Затвердити"}. +{"Value of '~s' should be boolean","Значення \"~s\" має бути логічним"}. +{"Value of '~s' should be datetime string","Значення \"~s\" має бути рядком дати і часу"}. +{"Value of '~s' should be integer","Значення \"~s\" має бути цілим числом"}. {"vCard User Search","Пошук користувачів по vCard"}. +{"View Queue","Переглянути чергу"}. {"Virtual Hosts","віртуальні хости"}. {"Visitors are not allowed to change their nicknames in this room","Відвідувачам не дозволяється змінювати псевдонім в цій кімнаті"}. {"Visitors are not allowed to send messages to all occupants","Відвідувачам не дозволяється надсилати повідомлення всім присутнім"}. @@ -345,9 +527,24 @@ {"Voice requests are disabled in this conference","Голосові запити відключені в цій конференції"}. {"Voice request","Голосовий запит"}. {"Wednesday","Середа"}. +{"When a new subscription is processed","Під час обробки нової підписки"}. {"When to send the last published item","Коли надсилати останній опублікований елемент"}. +{"Whether owners or publisher should receive replies to items","Чи повинні власники або видавець отримувати відповіді на елементи"}. +{"Whether the node is a leaf (default) or a collection","Чи є вузол листом (типово) чи колекцією"}. {"Whether to allow subscriptions","Дозволяти підписку"}. +{"Whether to make all subscriptions temporary, based on subscriber presence","Чи робити всі підписки тимчасовими, залежно від присутності читача"}. +{"Whether to notify owners about new subscribers and unsubscribes","Чи повідомляти власників про нових читачів та їх втрату"}. +{"Who may associate leaf nodes with a collection","Хто може пов’язувати листові вузли з колекцією"}. +{"Wrong parameters in the web formulary","Неправильні параметри у веб-формі"}. +{"Wrong xmlns","Неправильний xmlns"}. +{"XMPP Account Registration","Реєстрація облікового запису XMPP"}. +{"XMPP Domains","Домени XMPP"}. +{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI-адреса асоційованого вузла публікацій-підписок"}. +{"You are being removed from the room because of a system shutdown","Ви будете видалені з кімнати через завершення роботи системи"}. +{"You are not joined to the channel","Ви не приєднані до каналу"}. +{"You can later change your password using an XMPP client.","Пізніше ви можете змінити пароль за допомогою XMPP-клієнта."}. {"You have been banned from this room","Вам заборонено входити в цю конференцію"}. +{"You have joined too many conferences","Ви приєднані до надто великої кількості конференцій"}. {"You must fill in field \"Nickname\" in the form","Вам необхідно заповнити поле \"Псевдонім\" у формі"}. {"You need a client that supports x:data and CAPTCHA to register","Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:data"}. {"You need a client that supports x:data to register the nickname","Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:data"}. @@ -355,3 +552,6 @@ {"Your active privacy list has denied the routing of this stanza.","Маршрутизація цієї строфи була відмінена активним списком приватності."}. {"Your contact offline message queue is full. The message has been discarded.","Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було збережено."}. {"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"}. +{"Your XMPP account was successfully registered.","Ваш обліковий запис XMPP успішно зареєстровано."}. +{"Your XMPP account was successfully unregistered.","Ваш обліковий запис XMPP успішно видалено."}. +{"You're not allowed to create nodes","Вам заборонено створювати вузли"}. From 7be52065dd5d13dfb77b8aee11cdd154b27a09aa Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:24:25 +0200 Subject: [PATCH 434/440] Update Chinese (Simplified) translation (thanks to Eric) --- priv/msgs/zh.msg | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/priv/msgs/zh.msg b/priv/msgs/zh.msg index b23a1043a..590590f04 100644 --- a/priv/msgs/zh.msg +++ b/priv/msgs/zh.msg @@ -20,6 +20,7 @@ {"Access model","访问模型"}. {"Account doesn't exist","账号不存在"}. {"Action on user","对用户的动作"}. +{"Add a hat to a user","给用户添加头衔"}. {"Add Jabber ID","添加Jabber ID"}. {"Add New","添加新用户"}. {"Add User","添加用户"}. @@ -136,6 +137,7 @@ {"Elements","元素"}. {"Email Address","电邮地址"}. {"Email","电子邮件"}. +{"Enable hats","启用头衔"}. {"Enable logging","启用服务器端聊天记录"}. {"Enable message archiving","启用消息归档"}. {"Enabling push without 'node' attribute is not supported","不支持未使用'node'属性就开启推送"}. @@ -170,6 +172,8 @@ {"Full List of Room Admins","房间管理员完整列表"}. {"Full List of Room Owners","房间持有人完整列表"}. {"Full Name","全名"}. +{"Get List of Online Users","获取在线用户列表"}. +{"Get List of Registered Users","获取注册用户列表"}. {"Get Number of Online Users","获取在线用户数"}. {"Get Number of Registered Users","获取注册用户数"}. {"Get Pending","获取挂起"}. @@ -186,6 +190,9 @@ {"has been kicked because of an affiliation change","因联属关系改变而被踢出"}. {"has been kicked because the room has been changed to members-only","因该房间改为只对会员开放而被踢出"}. {"has been kicked","已被踢出"}. +{"Hat title","头衔标题"}. +{"Hat URI","头衔 URI"}. +{"Hats limit exceeded","已超过头衔限制"}. {"Host unknown","主人未知"}. {"Host","主机"}. {"HTTP File Upload","HTTP文件上传"}. @@ -237,6 +244,8 @@ {"Least significant bits of SHA-256 hash of text should equal hexadecimal label","文本的SHA-256哈希的最低有效位应等于十六进制标签"}. {"leaves the room","离开房间"}. {"List of rooms","房间列表"}. +{"List of users with hats","有头衔用户的列表"}. +{"List users with hats","有头衔用户列表"}. {"Logging","正在记录"}. {"Low level update script","低级别更新脚本"}. {"Make participants list public","公开参与人列表"}. @@ -419,6 +428,7 @@ {"Registered Users:","注册用户:"}. {"Register","注册"}. {"Remote copy","远程复制"}. +{"Remove a hat from a user","移除用户头衔"}. {"Remove All Offline Messages","移除所有离线消息"}. {"Remove User","删除用户"}. {"Remove","移除"}. @@ -519,6 +529,8 @@ {"The JIDs of those to contact with questions","问题联系人的JID"}. {"The JIDs of those with an affiliation of owner","隶属所有人的JID"}. {"The JIDs of those with an affiliation of publisher","隶属发布人的JID"}. +{"The list of all online users","所有在线用户列表"}. +{"The list of all users","所有用户列表"}. {"The list of JIDs that may associate leaf nodes with a collection","可以将叶节点与集合关联的JID列表"}. {"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","可以与集合相关联的最大子节点数,“max”表示除服务器施加的最大值外没有特定限制"}. {"The minimum number of milliseconds between sending any two notification digests","发送任何两个通知摘要之间的最小毫秒数"}. From d29fdc4d2e2f96b639c3319fa2b2d145259559e1 Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:41:14 +0200 Subject: [PATCH 435/440] Remove unnecessary text string --- src/ext_mod.erl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 3b9db2940..eeb310207 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -1018,10 +1018,9 @@ get_commit_link(CommitHtmlUrl, TitleEl, CommitSha) -> ?AXC(CommitHtmlUrl, [TitleEl], binary:part(CommitSha, {0, 8})). get_content(Node, Query, Lang) -> - Instruct = translate:translate(Lang, ?T("Type a command in a textbox and click Execute.")), {{_CommandCtl}, _Res} = case catch parse_and_execute(Query, Node) of - {'EXIT', _} -> {{""}, Instruct}; + {'EXIT', _} -> {{""}, <<"">>}; Result_tuple -> Result_tuple end, From 67094ca065573737df84fc9eae44193b487e986d Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 11:51:22 +0200 Subject: [PATCH 436/440] Update Catalan and Spanish translations --- priv/msgs/ca.msg | 15 +++++++++++++++ priv/msgs/es.msg | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/priv/msgs/ca.msg b/priv/msgs/ca.msg index 3f32a525b..4e6c8d864 100644 --- a/priv/msgs/ca.msg +++ b/priv/msgs/ca.msg @@ -79,6 +79,7 @@ {"Changing role/affiliation is not allowed","No està permès canviar el rol/afiliació"}. {"Channel already exists","El canal ja existeix"}. {"Channel does not exist","El canal no existeix"}. +{"Channel JID","JID del Canal"}. {"Channels","Canals"}. {"Characters not allowed:","Caràcters no permesos:"}. {"Chatroom configuration modified","Configuració de la sala de xat modificada"}. @@ -98,6 +99,7 @@ {"Configuration","Configuració"}. {"Connected Resources:","Recursos connectats:"}. {"Contact Addresses (normally, room owner or owners)","Adreces de contacte (normalment, propietaris de la sala)"}. +{"Contrib Modules","Mòduls Contrib"}. {"Country","Pais"}. {"CPU Time:","Temps de CPU:"}. {"Current Discussion Topic","Assumpte de discussió actual"}. @@ -215,6 +217,8 @@ {"Incorrect value of 'action' attribute","Valor incorrecte del atribut 'action'"}. {"Incorrect value of 'action' in data form","Valor incorrecte de 'action' al formulari de dades"}. {"Incorrect value of 'path' in data form","Valor incorrecte de 'path' al formulari de dades"}. +{"Installed Modules:","Mòduls instal·lats:"}. +{"Install","Instal·lar"}. {"Insufficient privilege","Privilegi insuficient"}. {"Internal server error","Error intern del servidor"}. {"Invalid 'from' attribute in forwarded message","Atribut 'from' invàlid al missatge reenviat"}. @@ -231,6 +235,8 @@ {"January","Gener"}. {"JID normalization denied by service policy","S'ha denegat la normalització del JID per política del servei"}. {"JID normalization failed","Ha fallat la normalització del JID"}. +{"Joined MIX channels of ~ts","Canals MIX units de ~ts"}. +{"Joined MIX channels:","Canals MIX units:"}. {"joins the room","entra a la sala"}. {"July","Juliol"}. {"June","Juny"}. @@ -351,6 +357,7 @@ {"Number of registered users","Número d'Usuaris Registrats"}. {"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segons després dels quals es purgaran automàticament elements, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}. {"Occupants are allowed to invite others","Els ocupants poden invitar a altres"}. +{"Occupants are allowed to query others","Els ocupants poden enviar peticions a altres"}. {"Occupants May Change the Subject","Els ocupants poden canviar el Tema"}. {"October","Octubre"}. {"Offline Messages:","Missatges fora de línia:"}. @@ -377,11 +384,13 @@ {"Only those on a whitelist may subscribe and retrieve items","Només qui estiga a una llista blanca pot subscriure's i recuperar elements"}. {"Organization Name","Nom de la organizació"}. {"Organization Unit","Unitat de la organizació"}. +{"Other Modules Available:","Altres mòduls disponibles:"}. {"Outgoing s2s Connections:","Connexions d'eixida s2s:"}. {"Outgoing s2s Connections","Connexions s2s d'eixida"}. {"Owner privileges required","Es requerixen privilegis de propietari de la sala"}. {"Packet relay is denied by service policy","S'ha denegat el reenviament del paquet per política del servei"}. {"Packet","Paquet"}. +{"Participant ID","ID del Participant"}. {"Participant","Participant"}. {"Password Verification","Verificació de la Contrasenya"}. {"Password Verification:","Verificació de la Contrasenya:"}. @@ -484,6 +493,7 @@ {"Shut Down Service","Apager el Servei"}. {"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}. {"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clients XMPP poden emmagatzemar la teva contrasenya al ordinador, però només hauries de fer això al teu ordinador personal, per raons de seguretat."}. +{"Sources Specs:","Especificacions de Codi Font:"}. {"Specify the access model","Especificar el model d'accés"}. {"Specify the event message type","Especifica el tipus de missatge d'event"}. {"Specify the publisher model","Especificar el model del publicant"}. @@ -595,6 +605,7 @@ {"Unauthorized","No autoritzat"}. {"Unexpected action","Acció inesperada"}. {"Unexpected error condition: ~p","Condició d'error inesperada: ~p"}. +{"Uninstall","Desinstal·lar"}. {"Unregister an XMPP account","Anul·lar el registre d'un compte XMPP"}. {"Unregister","Anul·lar el registre"}. {"Unselect All","Deseleccionar tots"}. @@ -605,7 +616,10 @@ {"Update ~p","Actualitzar ~p"}. {"Update plan","Pla d'actualització"}. {"Update script","Script d'actualització"}. +{"Update specs to get modules source, then install desired ones.","Actualitza les especificacions per obtindre el codi font dels mòduls, després instal·la els que vulgues."}. +{"Update Specs","Actualitzar Especificacions"}. {"Update","Actualitzar"}. +{"Upgrade","Actualitza"}. {"Uptime:","Temps en marxa:"}. {"URL for Archived Discussion Logs","URL dels Arxius de Discussions"}. {"User already exists","El usuari ja existeix"}. @@ -628,6 +642,7 @@ {"Value of '~s' should be integer","El valor de '~s' deuria ser un numero enter"}. {"Value 'set' of 'type' attribute is not allowed","El valor 'set' a l'atribut 'type' no és permès"}. {"vCard User Search","vCard recerca d'usuari"}. +{"View joined MIX channels","Vore els canals MIX units"}. {"View Queue","Vore Cua"}. {"View Roster","Vore Llista de contactes"}. {"Virtual Hosts","Hosts virtuals"}. diff --git a/priv/msgs/es.msg b/priv/msgs/es.msg index c9d227178..f3cebdb44 100644 --- a/priv/msgs/es.msg +++ b/priv/msgs/es.msg @@ -79,6 +79,7 @@ {"Changing role/affiliation is not allowed","No está permitido cambiar el rol/afiliación"}. {"Channel already exists","El canal ya existe"}. {"Channel does not exist","El canal no existe"}. +{"Channel JID","JID del Canal"}. {"Channels","Canales"}. {"Characters not allowed:","Caracteres no permitidos:"}. {"Chatroom configuration modified","Configuración de la sala modificada"}. @@ -98,6 +99,7 @@ {"Configuration","Configuración"}. {"Connected Resources:","Recursos conectados:"}. {"Contact Addresses (normally, room owner or owners)","Direcciones de contacto (normalmente la del dueño o dueños de la sala)"}. +{"Contrib Modules","Módulos Contrib"}. {"Country","País"}. {"CPU Time:","Tiempo consumido de CPU:"}. {"Current Discussion Topic","Tema de discusión actual"}. @@ -215,6 +217,8 @@ {"Incorrect value of 'action' attribute","Valor incorrecto del atributo 'action'"}. {"Incorrect value of 'action' in data form","Valor incorrecto de 'action' en el formulario de datos"}. {"Incorrect value of 'path' in data form","Valor incorrecto de 'path' en el formulario de datos"}. +{"Installed Modules:","Módulos Instalados:"}. +{"Install","Instalar"}. {"Insufficient privilege","Privilegio insuficiente"}. {"Internal server error","Error interno en el servidor"}. {"Invalid 'from' attribute in forwarded message","Atributo 'from' no válido en el mensaje reenviado"}. @@ -231,6 +235,8 @@ {"January","Enero"}. {"JID normalization denied by service policy","Se ha denegado la normalización del JID por política del servicio"}. {"JID normalization failed","Ha fallado la normalización del JID"}. +{"Joined MIX channels of ~ts","Canales MIX unidos de ~ts"}. +{"Joined MIX channels:","Canales MIX unidos:"}. {"joins the room","entra en la sala"}. {"July","Julio"}. {"June","Junio"}. @@ -351,6 +357,7 @@ {"Number of registered users","Número de usuarios registrados"}. {"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segundos después de los cuales se purgarán elementos automáticamente, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}. {"Occupants are allowed to invite others","Los ocupantes pueden invitar a otras personas"}. +{"Occupants are allowed to query others","Los ocupantes pueden enviar peticiones a otros"}. {"Occupants May Change the Subject","Los ocupantes pueden cambiar el Asunto"}. {"October","Octubre"}. {"Offline Messages","Mensajes diferidos"}. @@ -377,11 +384,13 @@ {"Only those on a whitelist may subscribe and retrieve items","Solo quienes están en una lista blanca pueden suscribirse y recibir elementos"}. {"Organization Name","Nombre de la organización"}. {"Organization Unit","Unidad de la organización"}. +{"Other Modules Available:","Otros módulos disponibles:"}. {"Outgoing s2s Connections","Conexiones S2S salientes"}. {"Outgoing s2s Connections:","Conexiones S2S salientes:"}. {"Owner privileges required","Se requieren privilegios de propietario de la sala"}. {"Packet relay is denied by service policy","Se ha denegado el reenvío del paquete por política del servicio"}. {"Packet","Paquete"}. +{"Participant ID","ID del Participante"}. {"Participant","Participante"}. {"Password Verification","Verificación de la contraseña"}. {"Password Verification:","Verificación de la contraseña:"}. @@ -484,6 +493,7 @@ {"Shut Down Service","Detener el servicio"}. {"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}. {"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Algunos clientes XMPP pueden guardar tu contraseña en la máquina, pero solo deberías hacer esto en tu propia máquina personal, por razones de seguridad."}. +{"Sources Specs:","Especificaciones de Códigos Fuente:"}. {"Specify the access model","Especifica el modelo de acceso"}. {"Specify the event message type","Especifica el tipo del mensaje de evento"}. {"Specify the publisher model","Especificar el modelo del publicante"}. @@ -595,6 +605,7 @@ {"Unauthorized","No autorizado"}. {"Unexpected action","Acción inesperada"}. {"Unexpected error condition: ~p","Condición de error inesperada: ~p"}. +{"Uninstall","Desinstalar"}. {"Unregister an XMPP account","Borrar una cuenta XMPP"}. {"Unregister","Borrar"}. {"Unselect All","Deseleccionar todo"}. @@ -605,7 +616,10 @@ {"Update ~p","Actualizar ~p"}. {"Update plan","Plan de actualización"}. {"Update script","Script de actualización"}. +{"Update specs to get modules source, then install desired ones.","Actualizar Especificaciones para conseguir el código fuente de los módulos, luego instala los que quieras."}. +{"Update Specs","Actualizar Especificaciones"}. {"Update","Actualizar"}. +{"Upgrade","Actualizar"}. {"Uptime:","Tiempo desde el inicio:"}. {"URL for Archived Discussion Logs","URL del registro de discusiones archivadas"}. {"User already exists","El usuario ya existe"}. @@ -628,6 +642,7 @@ {"Value of '~s' should be integer","El valor de '~s' debería ser un entero"}. {"Value 'set' of 'type' attribute is not allowed","El valor 'set' del atributo 'type' no está permitido"}. {"vCard User Search","Búsqueda de vCard de usuarios"}. +{"View joined MIX channels","Ver los canales MIX unidos"}. {"View Queue","Ver Cola"}. {"View Roster","Ver Lista de contactos"}. {"Virtual Hosts","Dominios Virtuales"}. From c4d834b8799ce3efafba8398562c48200212a9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 12 Oct 2022 12:44:27 +0200 Subject: [PATCH 437/440] Update deps --- mix.exs | 2 +- mix.lock | 18 +++++++++--------- rebar.config | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mix.exs b/mix.exs index 8cfade7c0..93e9a7d81 100644 --- a/mix.exs +++ b/mix.exs @@ -114,7 +114,7 @@ defmodule Ejabberd.MixProject do {:p1_utils, "~> 1.0"}, {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, - {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "62325549cced01b12878d79286311ae62fe0fc4f", override: true}, + {:xmpp, ">= 1.6.0"}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/mix.lock b/mix.lock index f1964fe9f..eb097dc7d 100644 --- a/mix.lock +++ b/mix.lock @@ -5,12 +5,12 @@ "eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"}, "epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"}, "eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"}, - "esip": {:hex, :esip, "1.0.47", "fdd483ca7e9e46a6d5a62937cbacb147adbe0bdfca5ebc59774cc0a1afa381be", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.2", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "99e703c49e8d325b24cb147c5087151c196406e8572e3a33db95099991fe8f3e"}, + "esip": {:hex, :esip, "1.0.48", "3b3b3afc798be9458517d4fd2730674322368e54c2c1211aa630327354946d1b", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.6", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "02b9fc6e071415cbc62105f5115aeb68d11184bdad3960da7b62ea3e99e7fccf"}, "ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"}, "ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"}, - "fast_tls": {:hex, :fast_tls, "1.1.15", "398e7ba1076db139307ebea839428e2836ab682e4dac61d95b4705a26aff06b7", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "ef516aa226de9a4605704c18499284cd4fc115a73bd72490341972ce0c2b4d30"}, + "fast_tls": {:hex, :fast_tls, "1.1.16", "85fa7f3112ea4ff5ccb4f3abadc130a8c855ad74eb00869487399cb0c322d208", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "aa08cca89b4044e74f1f12e399817d8beaeae3ee006c98a893c0bfb1d81fba51"}, "fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"}, - "fast_yaml": {:hex, :fast_yaml, "1.0.33", "5c735da21a4d23b7ed592603b1cd7aba25f91a735d3c0a8df2816d335a8def6e", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "efa60a2acbcd2c2e72eb5e16f1475726b9d88afca3ad6dbb4bc549266863e7c8"}, + "fast_yaml": {:hex, :fast_yaml, "1.0.34", "3be1ed8a37fe87a53f7f2ad1ee9586dcc257103d0b1d1f0ee6306cad9d54c29a", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "926dc1798399418d3983bd53356f3395b01c07a550f6b8d1dd5d6cc07c22c1c9"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"}, "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, @@ -20,16 +20,16 @@ "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"}, + "p1_acme": {:hex, :p1_acme, "1.0.20", "c976cbca2dd1bdcf71a6e17fb512e30451b5f258694157f7b63963767ee26560", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.14", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "70e0ecf8c8729dfc01f6a15279ef9fa4003c3b5af47b6732d9312296a8ba4f5c"}, "p1_mysql": {:hex, :p1_mysql, "1.0.20", "08aeade83a24902a5fca2dbf78fa674eef25ca4e66250b4be8bd3580f35880e7", [:rebar3], [], "hexpm", "12152e8feadcf8ce586334314ca27cb088f12e0a5c850c496a8df69859390877"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"}, - "p1_pgsql": {:hex, :p1_pgsql, "1.1.18", "db3473d1bba4b45815b05226433fc589a5934190c2afa05fdba45c6a238bf2c6", [:rebar3], [{:xmpp, "1.5.8", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4a3863a5d59fed9f64fec8497a7d4e3d34edf31932364a74371097da2b25fd46"}, + "p1_pgsql": {:hex, :p1_pgsql, "1.1.19", "dc615844fd22a2e45182018d5bcc6b757ac19f576fab3fe6d69e1c0ff25cee2b", [:rebar3], [{:xmpp, "1.6.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4b0c6d30bbf881feb01171d13f444a6e05e1d19b6926e3f56f4028823d02730b"}, "p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"}, "pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"}, "sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"}, - "stringprep": {:hex, :stringprep, "1.0.28", "9a9823d8449309e4e8ca0bdb2547e43d5de4e1d943f23826c25015150b8daa66", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "66df7d1181fec899c824bd8d00253f369103514828db5e04ee1ba7a0a61568e0"}, - "stun": {:hex, :stun, "1.2.2", "8c61f71c5094c69739dc6b3e916be734ce80c1a15551e00d547115a66e91e5bc", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4f54c7b86e2aa413faec35a9fb699048471e1c06a721c53e6ac44b405fd2a3b9"}, + "stringprep": {:hex, :stringprep, "1.0.29", "02f23e8c3a219a3dfe40a22e908bece3a2f68af0ff599ea8a7b714ecb21e62ee", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "928eba304c3006eb1512110ebd7b87db163b00859a09375a1e4466152c6c462a"}, + "stun": {:hex, :stun, "1.2.6", "5d1978d340ea20efb28bc1e58779a3a1d64568c66168db4d20692e76ce813d5e", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "21aed098457e5099e925129459590592e001c470cf7503e5614a7a6b688ff146"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, - "xmpp": {:git, "https://github.com/processone/xmpp.git", "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5", [ref: "cdda2bea2df0b4ed40fbd854f6f1bf21c6b7a8c5"]}, - "yconf": {:hex, :yconf, "1.0.13", "25557689f71897e20c8630ae8865ce083437d325e7d5a6f8ee950c7e0e7be4e1", [:rebar3], [{:fast_yaml, "1.0.33", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "3fd478212b3da121229684288f5154c3610ac6b6c3dbbbdd7886737cab82d851"}, + "xmpp": {:hex, :xmpp, "1.6.0", "2ca2180eac1a97e929d1cfa1e4faabef4f32a719331c7f56e47d305c0ec8e438", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "5fd723c95bce79600a8f44ba79cf5d3b1dac80af65493a4a414e39791f7dd7e9"}, + "yconf": {:hex, :yconf, "1.0.14", "b216f385f729b338385b25176f6e4fe8cabfdf7ede9c40a35b2e77fc93e98fc8", [:rebar3], [{:fast_yaml, "1.0.34", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "a8a9262553c11ed4cd13cc8e656e53acb00f9385f0a50cd235af7d02e9204bce"}, } diff --git a/rebar.config b/rebar.config index 4a27d49f6..14c8c81e5 100644 --- a/rebar.config +++ b/rebar.config @@ -30,12 +30,12 @@ {if_var_true, redis, {eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}}, {if_var_true, sip, - {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.47"}}}}, + {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.48"}}}}, {if_var_true, zlib, {ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}}, - {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.15"}}}, + {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.16"}}}, {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}}, - {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.33"}}}, + {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.34"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {if_version_above, "19", {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}}, @@ -54,12 +54,12 @@ {luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}} }}, {mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}}, - {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.19"}}}, + {p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.20"}}}, {if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.20"}}}}, {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}}, {if_var_true, pgsql, - {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}}, + {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.19"}}}}, {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}}, {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}}, {if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix @@ -67,11 +67,11 @@ {rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}}, {if_var_true, sqlite, {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}}, - {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}}, + {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.29"}}}, {if_var_true, stun, - {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.2"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "62325549cced01b12878d79286311ae62fe0fc4f"}}, - {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}} + {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.6"}}}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.6.0"}}}, + {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.14"}}} ]}. {gitonly_deps, [elixir]}. From b529f72d8fa0b31c17ccb2cc7acf0d8b18d6b54f Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 14:09:21 +0200 Subject: [PATCH 438/440] Update Chinese (Simplified) translation (thanks to Eric) --- priv/msgs/zh.msg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/priv/msgs/zh.msg b/priv/msgs/zh.msg index 590590f04..8eb4f244b 100644 --- a/priv/msgs/zh.msg +++ b/priv/msgs/zh.msg @@ -79,6 +79,7 @@ {"Changing role/affiliation is not allowed","不允许修改角色/单位"}. {"Channel already exists","频道已存在"}. {"Channel does not exist","频道不存在"}. +{"Channel JID","频道 JID"}. {"Channels","频道"}. {"Characters not allowed:","不允许字符:"}. {"Chatroom configuration modified","聊天室配置已修改"}. @@ -98,6 +99,7 @@ {"Configuration","配置"}. {"Connected Resources:","已连接资源:"}. {"Contact Addresses (normally, room owner or owners)","联系人地址 (通常为房间持有人)"}. +{"Contrib Modules","Contrib 模块"}. {"Country","国家"}. {"CPU Time:","CPU时间:"}. {"Current Discussion Topic","当前讨论话题"}. @@ -215,6 +217,8 @@ {"Incorrect value of 'action' attribute","'action' 属性的值不正确"}. {"Incorrect value of 'action' in data form","数据表单中 'action' 的值不正确"}. {"Incorrect value of 'path' in data form","数据表单中 'path' 的值不正确"}. +{"Installed Modules:","已安装的模块:"}. +{"Install","安装"}. {"Insufficient privilege","权限不足"}. {"Internal server error","内部服务器错误"}. {"Invalid 'from' attribute in forwarded message","转发的信息中 'from' 属性的值无效"}. @@ -231,6 +235,8 @@ {"January","一月"}. {"JID normalization denied by service policy","JID规范化被服务策略拒绝"}. {"JID normalization failed","JID规范化失败"}. +{"Joined MIX channels of ~ts","加入了 ~ts 的 MIX 频道"}. +{"Joined MIX channels:","加入了 MIX 频道:"}. {"joins the room","加入房间"}. {"July","七月"}. {"June","六月"}. @@ -351,6 +357,7 @@ {"Number of registered users","注册用户数"}. {"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","等待多少秒后自动清除项目,“max”表示除服务器施加的最大值外没有特定限制"}. {"Occupants are allowed to invite others","允许成员邀请其他人"}. +{"Occupants are allowed to query others","成员可查询其他人"}. {"Occupants May Change the Subject","成员可以修改主题"}. {"October","十月"}. {"Offline Messages","离线消息"}. @@ -377,11 +384,13 @@ {"Only those on a whitelist may subscribe and retrieve items","仅白名单用户可以订阅和检索内容项"}. {"Organization Name","组织名称"}. {"Organization Unit","组织单位"}. +{"Other Modules Available:","其他可用模块:"}. {"Outgoing s2s Connections","出站 s2s 连接"}. {"Outgoing s2s Connections:","出站 s2s 连接:"}. {"Owner privileges required","需要持有人权限"}. {"Packet relay is denied by service policy","包中继被服务策略拒绝"}. {"Packet","数据包"}. +{"Participant ID","参与者 ID"}. {"Participant","参与人"}. {"Password Verification:","密码确认:"}. {"Password Verification","确认密码"}. @@ -484,6 +493,7 @@ {"Shut Down Service","关闭服务"}. {"SOCKS5 Bytestreams","SOCKS5 字节流"}. {"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","某些 XMPP 客户端可以在计算机里存储你的密码. 处于安全考虑, 请仅在你的个人计算机里使用该功能."}. +{"Sources Specs:","源参数:"}. {"Specify the access model","指定访问范例"}. {"Specify the event message type","指定事件消息类型"}. {"Specify the publisher model","指定发布人范例"}. @@ -595,6 +605,7 @@ {"Unauthorized","未认证的"}. {"Unexpected action","意外行为"}. {"Unexpected error condition: ~p","意外错误条件: ~p"}. +{"Uninstall","卸载"}. {"Unregister an XMPP account","注销XMPP帐户"}. {"Unregister","取消注册"}. {"Unselect All","取消全选"}. @@ -605,7 +616,10 @@ {"Update plan","更新计划"}. {"Update ~p","更新~p"}. {"Update script","更新脚本"}. +{"Update specs to get modules source, then install desired ones.","更新参数获取模块源,然后安装所需的模块。"}. +{"Update Specs","更新参数"}. {"Update","更新"}. +{"Upgrade","升级"}. {"Uptime:","正常运行时间:"}. {"URL for Archived Discussion Logs","已归档对话日志的URL"}. {"User already exists","用户已存在"}. @@ -628,6 +642,7 @@ {"Value of '~s' should be integer","'~s' 的值应为整数"}. {"Value 'set' of 'type' attribute is not allowed","不允许 'type' 属性的 'set' 值"}. {"vCard User Search","vCard用户搜索"}. +{"View joined MIX channels","查看已加入的 MIX 频道"}. {"View Queue","查看队列"}. {"View Roster","查看花名册"}. {"Virtual Hosts","虚拟主机"}. From d2f79e268e219c339e7cc2ebe82f158ee0582b2d Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 12 Oct 2022 17:09:49 +0200 Subject: [PATCH 439/440] Update Portuguese (Brazil) translation (thanks to Wellington Terumi Uemura) --- priv/msgs/pt-br.msg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/priv/msgs/pt-br.msg b/priv/msgs/pt-br.msg index 3c922acf0..bd295de2e 100644 --- a/priv/msgs/pt-br.msg +++ b/priv/msgs/pt-br.msg @@ -79,6 +79,7 @@ {"Changing role/affiliation is not allowed","Não é permitida a alteração da função/afiliação"}. {"Channel already exists","O canal já existe"}. {"Channel does not exist","O canal não existe"}. +{"Channel JID","Canal JID"}. {"Channels","Canais"}. {"Characters not allowed:","Caracteres não aceitos:"}. {"Chatroom configuration modified","Configuração da sala de bate-papo modificada"}. @@ -98,6 +99,7 @@ {"Configuration","Configuração"}. {"Connected Resources:","Recursos conectados:"}. {"Contact Addresses (normally, room owner or owners)","Endereços de contato (normalmente, o proprietário ou os proprietários da sala)"}. +{"Contrib Modules","Módulos contrib"}. {"Country","País"}. {"CPU Time:","Tempo da CPU:"}. {"Current Discussion Topic","Assunto em discussão"}. @@ -215,6 +217,8 @@ {"Incorrect value of 'action' attribute","Valor incorreto do atributo 'action'"}. {"Incorrect value of 'action' in data form","Valor incorreto de 'action' no formulário de dados"}. {"Incorrect value of 'path' in data form","Valor incorreto de 'path' no formulário de dados"}. +{"Installed Modules:","Módulos instalados:"}. +{"Install","Instalar"}. {"Insufficient privilege","Privilégio insuficiente"}. {"Internal server error","Erro interno do servidor"}. {"Invalid 'from' attribute in forwarded message","Atributo 'from' inválido na mensagem reenviada"}. @@ -231,6 +235,8 @@ {"January","Janeiro"}. {"JID normalization denied by service policy","Normalização JID negada por causa da política de serviços"}. {"JID normalization failed","A normalização JID falhou"}. +{"Joined MIX channels of ~ts","Entrou no canais MIX do ~ts"}. +{"Joined MIX channels:","Uniu-se aos canais MIX:"}. {"joins the room","Entrar na sala"}. {"July","Julho"}. {"June","Junho"}. @@ -351,6 +357,7 @@ {"Number of registered users","Número de usuários registrados"}. {"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}. {"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}. +{"Occupants are allowed to query others","Os ocupantes estão autorizados a consultar os outros"}. {"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}. {"October","Outubro"}. {"Offline Messages","Mensagens offline"}. @@ -377,11 +384,13 @@ {"Only those on a whitelist may subscribe and retrieve items","Apenas aqueles presentes em uma lista branca podem se inscrever e recuperar os itens"}. {"Organization Name","Nome da organização"}. {"Organization Unit","Departamento/Unidade"}. +{"Other Modules Available:","Outros módulos disponíveis:"}. {"Outgoing s2s Connections","Conexões s2s de Saída"}. {"Outgoing s2s Connections:","Saída das conexões s2s:"}. {"Owner privileges required","Se requer privilégios de proprietário da sala"}. {"Packet relay is denied by service policy","A retransmissão de pacote é negada por causa da política de serviço"}. {"Packet","Pacote"}. +{"Participant ID","ID do participante"}. {"Participant","Participante"}. {"Password Verification:","Verificação da Senha:"}. {"Password Verification","Verificação de Senha"}. @@ -484,6 +493,7 @@ {"Shut Down Service","Parar Serviço"}. {"SOCKS5 Bytestreams","Bytestreams SOCKS5"}. {"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clientes XMPP podem armazenar a sua senha no seu computador, só faça isso no seu computador particular por questões de segurança."}. +{"Sources Specs:","Especificações das fontes:"}. {"Specify the access model","Especificar os modelos de acesso"}. {"Specify the event message type","Especificar o tipo de mensagem para o evento"}. {"Specify the publisher model","Especificar o modelo do publicante"}. @@ -595,6 +605,7 @@ {"Unauthorized","Não Autorizado"}. {"Unexpected action","Ação inesperada"}. {"Unexpected error condition: ~p","Condição de erro inesperada: ~p"}. +{"Uninstall","Desinstalar"}. {"Unregister an XMPP account","Excluir uma conta XMPP"}. {"Unregister","Deletar registro"}. {"Unselect All","Desmarcar todos"}. @@ -605,7 +616,10 @@ {"Update ~p","Atualizar ~p"}. {"Update plan","Plano de Atualização"}. {"Update script","Script de atualização"}. +{"Update specs to get modules source, then install desired ones.","Atualize as especificações para obter a fonte dos módulos e instale os que desejar."}. +{"Update Specs","Atualizar as especificações"}. {"Update","Atualizar"}. +{"Upgrade","Atualização"}. {"Uptime:","Tempo de atividade:"}. {"URL for Archived Discussion Logs","A URL para o arquivamento dos registros da discussão"}. {"User already exists","Usuário já existe"}. @@ -628,6 +642,7 @@ {"Value of '~s' should be integer","Valor de '~s' deveria ser um inteiro"}. {"Value 'set' of 'type' attribute is not allowed","Valor 'set' não permitido para atributo 'type'"}. {"vCard User Search","Busca de Usuário vCard"}. +{"View joined MIX channels","Exibir os canais MIX aderidos"}. {"View Queue","Exibir a fila"}. {"View Roster","Ver a lista"}. {"Virtual Hosts","Hosts virtuais"}. From 28b3134098934db456277c4be42a0075bd9d24a6 Mon Sep 17 00:00:00 2001 From: Frank <5943122+fdie@users.noreply.github.com> Date: Tue, 18 Oct 2022 15:38:55 +0200 Subject: [PATCH 440/440] fix table creation on a running cluster (#3913) --- src/ejabberd_mnesia.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_mnesia.erl b/src/ejabberd_mnesia.erl index 70dfe3e6e..88762746c 100644 --- a/src/ejabberd_mnesia.erl +++ b/src/ejabberd_mnesia.erl @@ -172,7 +172,10 @@ change_table_copy_type(Name, TabDef) -> if NewType /= CurrType -> ?INFO_MSG("Changing Mnesia table '~ts' from ~ts to ~ts", [Name, CurrType, NewType]), - mnesia_op(change_table_copy_type, [Name, node(), NewType]); + if CurrType == unknown -> mnesia_op(add_table_copy, [Name, node(), NewType]); + true -> + mnesia_op(change_table_copy_type, [Name, node(), NewType]) + end; true -> {atomic, ok} end.
  • ^lj|PSGm@IAc@w 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