ejabberd_hooks:run(sm_remove_connection_hook,
JID#jid.lserver, [SID, JID, Info]).
--spec check_in_subscription(any(), binary(), binary(),
- any(), any(), any()) -> any().
-
+-spec check_in_subscription(boolean(), binary(), binary(), jid(),
+ subscribe | subscribed | unsubscribe | unsubscribed,
+ binary()) -> boolean() | {stop, false}.
check_in_subscription(Acc, User, Server, _JID, _Type, _Reason) ->
case ejabberd_auth:is_user_exists(User, Server) of
true -> Acc;
%% ejabberd_hooks callback.
%%--------------------------------------------------------------------
--spec handle_slot_request(term(), jid(), binary(), non_neg_integer(), binary())
- -> term().
+-spec handle_slot_request(allow | deny, jid(), binary(),
+ non_neg_integer(), binary()) -> allow | deny.
handle_slot_request(allow, #jid{lserver = ServerHost} = JID, Path, Size,
_Lang) ->
Res -> Res
end.
+-spec remove_user(binary(), binary()) -> any().
remove_user(User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),
Mod:remove_room(LServer, LName, LHost),
ok.
-get_room_config(X, RoomState, _From, Lang) ->
+-spec get_room_config([xdata_field()], mod_muc_room:state(), jid(), binary())
+ -> [xdata_field()].
+get_room_config(XFields, RoomState, _From, Lang) ->
Config = RoomState#state.config,
Label = <<"Enable message archiving">>,
Var = <<"muc#roomconfig_mam">>,
label = translate:translate(Lang, Label),
var = Var,
values = [Val]},
- X ++ [XField].
+ XFields ++ [XField].
+-spec set_room_option({pos_integer(), _}, binary(), [binary()], binary())
+ -> {pos_integer(), _}.
set_room_option(_Acc, <<"muc#roomconfig_mam">> = Opt, Vals, Lang) ->
try
Val = case Vals of
set_room_option(Acc, _Opt, _Vals, _Lang) ->
Acc.
+-spec user_receive_packet(stanza(), ejabberd_c2s:state(), jid(), jid(), jid()) -> stanza().
user_receive_packet(Pkt, C2SState, JID, Peer, To) ->
LUser = JID#jid.luser,
LServer = JID#jid.lserver,
Pkt
end.
+-spec user_send_packet(stanza(), ejabberd_c2s:state(), jid(), jid()) -> stanza().
user_send_packet(Pkt, C2SState, JID, Peer) ->
LUser = JID#jid.luser,
LServer = JID#jid.lserver,
Pkt
end.
+-spec user_send_packet_strip_tag(stanza(), ejabberd_c2s:state(),
+ jid(), jid()) -> stanza().
user_send_packet_strip_tag(Pkt, _C2SState, JID, _Peer) ->
LServer = JID#jid.lserver,
strip_my_archived_tag(Pkt, LServer).
+-spec muc_filter_message(message(), mod_muc_room:state(),
+ jid(), jid(), binary()) -> message().
muc_filter_message(Pkt, #state{config = Config} = MUCState,
RoomJID, From, FromNick) ->
if Config#config.mam ->
process_iq_v0_3(IQ) ->
process_iq(IQ).
+-spec muc_process_iq(ignore | iq(), mod_muc_room:state()) -> ignore | iq().
muc_process_iq(#iq{type = T, lang = Lang,
from = From,
sub_els = [#mam_query{xmlns = NS}]} = IQ,
disco_sm_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
+-spec message_is_archived(boolean(), ejabberd_c2s:state(),
+ jid(), jid(), message()) -> boolean().
message_is_archived(true, _C2SState, _Peer, _JID, _Pkt) ->
true;
message_is_archived(false, C2SState, Peer,
sm_remove_connection_hook(_SID, #jid{lserver=LServer}, _Info) ->
push(LServer, sm_remove_connection).
+-spec user_send_packet(stanza(), ejabberd_c2s:state(), jid(), jid()) -> stanza().
user_send_packet(Packet, _C2SState, #jid{lserver=LServer}, _To) ->
push(LServer, user_send_packet),
Packet.
+
+-spec user_receive_packet(stanza(), ejabberd_c2s:state(), jid(), jid(), jid()) -> stanza().
user_receive_packet(Packet, _C2SState, _JID, _From, #jid{lserver=LServer}) ->
push(LServer, user_receive_packet),
Packet.
_ -> ok
end.
+-spec pop_offline_messages([{route, jid(), jid(), message()}],
+ binary(), binary()) ->
+ [{route, jid(), jid(), message()}].
pop_offline_messages(Ls, User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),
depends(_Host, _Opts) ->
[].
+-spec check_packet(allow | deny, binary(), binary(), _,
+ {jid(), jid(), stanza()}, in | out) -> allow | deny.
check_packet(_, _User, Server, _PrivacyList,
{From, To, #presence{type = Type}}, Dir) ->
IsSubscription = case Type of
out_subscription(_, _, _, _) ->
true.
+-spec in_subscription(boolean(), binary(), binary(), jid(),
+ subscribe | subscribed | unsubscribe | unsubscribed,
+ binary()) -> true.
in_subscription(_, User, Server, Owner, unsubscribed, _) ->
unsubscribe_user(jid:make(User, Server, <<>>), Owner),
true;
false).
%% Returns a list that may contain an xmlelement with the XEP-237 feature if it's enabled.
+-spec get_versioning_feature([xmpp_element()], binary()) -> [xmpp_element()].
get_versioning_feature(Acc, Host) ->
case roster_versioning_enabled(Host) of
true ->
xmpp:make_error(IQ, xmpp:err_internal_server_error(Txt, Lang))
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,
end,
ejabberd_sm:get_user_resources(User, Server)).
+-spec get_subscription_lists({[ljid()], [ljid()]}, binary(), binary())
+ -> {[ljid()], [ljid()]}.
get_subscription_lists(_Acc, User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod:transaction(LServer, F).
+-spec in_subscription(boolean(), binary(), binary(), jid(),
+ subscribe | subscribed | unsubscribe | unsubscribed,
+ binary()) -> boolean().
in_subscription(_, User, Server, JID, Type, Reason) ->
process_subscription(in, User, Server, JID, Type,
Reason).
end;
process_item_set_t(_LUser, _LServer, _) -> ok.
+-spec get_in_pending_subscriptions([presence()], binary(), binary()) -> [presence()].
get_in_pending_subscriptions(Ls, User, Server) ->
LServer = jid:nameprep(Server),
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod:read_subscription_and_groups(LUser, LServer, LJID).
+-spec get_jid_info({subscription(), [binary()]}, binary(), binary(), jid())
+ -> {subscription(), [binary()]}.
get_jid_info(_, User, Server, JID) ->
LJID = jid:tolower(JID),
case read_subscription_and_groups(User, Server, LJID) of
depends(_Host, _Opts) ->
[].
+-spec log_user_send(stanza(), ejabberd_c2s:state(), jid(), jid()) -> stanza().
log_user_send(Packet, _C2SState, From, To) ->
log_packet(From, To, Packet, From#jid.lserver),
Packet.
+-spec log_user_receive(stanza(), ejabberd_c2s:state(), jid(), jid(), jid()) -> stanza().
log_user_receive(Packet, _C2SState, _JID, From, To) ->
log_packet(From, To, Packet, To#jid.lserver),
Packet.
+-spec log_packet(jid(), jid(), stanza(), binary()) -> ok.
log_packet(From, To, Packet, Host) ->
Loggers = gen_mod:get_module_opt(Host, ?MODULE, loggers,
fun(L) ->
depends(_Host, _Opts) ->
[].
+-spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}].
get_user_roster(Items, US) ->
{U, S} = US,
DisplayedGroups = get_user_displayed_groups(US),
%% This function rewrites the roster entries when moving or renaming
%% them in the user contact list.
+-spec process_item(#roster{}, binary()) -> #roster{}.
process_item(RosterItem, Host) ->
USFrom = {UserFrom, ServerFrom} = RosterItem#roster.us,
{UserTo, ServerTo, ResourceTo} = RosterItem#roster.jid,
jid:make(Server),
ResIQ).
+-spec get_subscription_lists({[ljid()], [ljid()]}, binary(), binary())
+ -> {[ljid()], [ljid()]}.
get_subscription_lists({F, T}, User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),
SRJIDs = [{U1, S1, <<"">>} || {U1, S1} <- SRUsers],
{lists:usort(SRJIDs ++ F), lists:usort(SRJIDs ++ T)}.
+-spec get_jid_info({subscription(), [binary()]}, binary(), binary(), jid())
+ -> {subscription(), [binary()]}.
get_jid_info({Subscription, Groups}, User, Server,
JID) ->
LUser = jid:nodeprep(User),
error -> {Subscription, Groups}
end.
+-spec in_subscription(boolean(), binary(), binary(), jid(),
+ subscribe | subscribed | unsubscribe | unsubscribed,
+ binary()) -> boolean().
in_subscription(Acc, User, Server, JID, Type,
_Reason) ->
process_subscription(in, User, Server, JID, Type, Acc).
%%--------------------------------------------------------------------
%% Hooks
%%--------------------------------------------------------------------
+-spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}].
get_user_roster(Items, {U, S} = US) ->
SRUsers = get_user_to_groups_map(US, true),
{NewItems1, SRUsersRest} = lists:mapfoldl(fun (Item,
%% This function in use to rewrite the roster entries when moving or renaming
%% them in the user contact list.
+-spec process_item(#roster{}, binary()) -> #roster{}.
process_item(RosterItem, _Host) ->
USFrom = RosterItem#roster.us,
{User, Server, _Resource} = RosterItem#roster.jid,
_ -> RosterItem#roster{subscription = both, ask = none}
end.
+-spec get_subscription_lists({[ljid()], [ljid()]}, binary(), binary())
+ -> {[ljid()], [ljid()]}.
get_subscription_lists({F, T}, User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),
SRJIDs = [{U1, S1, <<"">>} || {U1, S1} <- SRUsers],
{lists:usort(SRJIDs ++ F), lists:usort(SRJIDs ++ T)}.
+-spec get_jid_info({subscription(), [binary()]}, binary(), binary(), jid())
+ -> {subscription(), [binary()]}.
get_jid_info({Subscription, Groups}, User, Server,
JID) ->
LUser = jid:nodeprep(User),
error -> {Subscription, Groups}
end.
+-spec in_subscription(boolean(), binary(), binary(), jid(),
+ subscribe | subscribed | unsubscribe | unsubscribed,
+ binary()) -> boolean().
in_subscription(Acc, User, Server, JID, Type,
_Reason) ->
process_subscription(in, User, Server, JID, Type, Acc).
Mod:search(LServer, Data, AllowReturnAll, MaxMatch).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec remove_user(binary(), binary()) -> any().
remove_user(User, Server) ->
LUser = jid:nodeprep(User),
LServer = jid:nameprep(Server),