Compare commits

...

4 Commits

Author SHA1 Message Date
Badlop 426e33d3a6 Fix previous commit: shellcheck reported a warning 2024-04-04 15:58:48 +02:00
Badlop d6d8bce0e4 If INET_DIST_INTERFACE is IPv6, set required option (thanks to Stu Tomlinson)(#4189) 2024-04-04 13:42:09 +02:00
Badlop 7c76f2b764 Handle the "approved" attribute. As feature isn't implemented, discard it (#4188)
Reference:
https://xmpp.org/rfcs/rfc6121.html#roster-syntax-items-approved

Additionally, when roster contains unknown attribute, discard it and
show a warning
2024-04-04 13:42:09 +02:00
Paweł Chmielowski 735516ed37 Don't start sql connection pools for unknown hosts
It's possible to trigger that by passing wrong domain to some ctl commands,
and if you don't have default credentials for sql connections, you get
repeating errors when this pools tries to reconnect from error.
2024-04-04 11:05:34 +02:00
4 changed files with 43 additions and 26 deletions

View File

@ -79,6 +79,9 @@ fi
if [ -n "$INET_DIST_INTERFACE" ] ; then
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -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
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
fi
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
fi
fi

View File

@ -78,6 +78,9 @@ fi
if [ -n "$INET_DIST_INTERFACE" ] ; then
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -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
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
fi
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
fi
fi

View File

@ -37,30 +37,36 @@ start(Host) ->
case is_started(Host) of
true -> ok;
false ->
App = case ejabberd_option:sql_type(Host) of
mysql -> p1_mysql;
pgsql -> p1_pgsql;
sqlite -> sqlite3;
_ -> odbc
end,
ejabberd:start_app(App),
Spec = #{id => gen_mod:get_module_proc(Host, ?MODULE),
start => {ejabberd_sql_sup, start_link, [Host]},
restart => transient,
shutdown => infinity,
type => supervisor,
modules => [?MODULE]},
case supervisor:start_child(ejabberd_db_sup, Spec) of
{ok, _} ->
ejabberd_sql_schema:start(Host),
ok;
{error, {already_started, Pid}} ->
%% Wait for the supervisor to fully start
_ = supervisor:count_children(Pid),
ok;
{error, Why} = Err ->
?ERROR_MSG("Failed to start ~ts: ~p", [?MODULE, Why]),
Err
case lists:member(Host, ejabberd_option:hosts()) of
false ->
?WARNING_MSG("Rejecting start of sql worker for unknown host: ~ts", [Host]),
{error, invalid_host};
true ->
App = case ejabberd_option:sql_type(Host) of
mysql -> p1_mysql;
pgsql -> p1_pgsql;
sqlite -> sqlite3;
_ -> odbc
end,
ejabberd:start_app(App),
Spec = #{id => gen_mod:get_module_proc(Host, ?MODULE),
start => {ejabberd_sql_sup, start_link, [Host]},
restart => transient,
shutdown => infinity,
type => supervisor,
modules => [?MODULE]},
case supervisor:start_child(ejabberd_db_sup, Spec) of
{ok, _} ->
ejabberd_sql_schema:start(Host),
ok;
{error, {already_started, Pid}} ->
%% Wait for the supervisor to fully start
_ = supervisor:count_children(Pid),
ok;
{error, Why} = Err ->
?ERROR_MSG("Failed to start ~ts: ~p", [?MODULE, Why]),
Err
end
end
end.

View File

@ -322,8 +322,13 @@ convert_roster_item(LUser, LServer, JIDstring, LuaList) ->
[R#roster{name = Name}];
({<<"persist">>, false}, _) ->
[];
(_, []) ->
[]
({<<"approved">>, _}, [R]) ->
[R];
(A, [R]) ->
io:format("Warning: roster of user ~ts@~ts includes unknown "
"attribute:~n ~p~nand that one is discarded.~n",
[LUser, LServer, A]),
[R]
end, [InitR], LuaList)
catch _:{bad_jid, _} ->
[]