aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-13 12:30:05 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-13 12:30:05 +0300
commite987b888481e3e68f6259e96e7c54af84d168c3c (patch)
tree48ab94c92db66383f7dbf8f4d1a015b6f09f5820 /src
parentRename #error{} record to #stanza_error{} (diff)
Make common tests working again
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl2
-rw-r--r--src/mod_announce.erl55
-rw-r--r--src/mod_blocking.erl44
-rw-r--r--src/mod_client_state.erl2
-rw-r--r--src/mod_mam.erl9
-rw-r--r--src/mod_mam_mnesia.erl8
-rw-r--r--src/mod_mix.erl31
-rw-r--r--src/mod_muc.erl10
-rw-r--r--src/mod_offline.erl2
-rw-r--r--src/mod_privacy.erl14
-rw-r--r--src/mod_pubsub.erl38
-rw-r--r--src/mod_register.erl8
-rw-r--r--src/mod_roster.erl73
-rw-r--r--src/mod_vcard.erl2
-rw-r--r--src/mod_vcard_ldap.erl8
-rw-r--r--src/mod_vcard_xupdate.erl2
-rw-r--r--src/node_flat.erl2
-rw-r--r--src/xmpp_codec.erl66
-rw-r--r--src/xmpp_util.erl2
19 files changed, 192 insertions, 186 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index e658536ab..186f7e9a5 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -2663,7 +2663,7 @@ make_resume_id(StateData) ->
add_resent_delay_info(_State, #iq{} = El, _Time) ->
El;
add_resent_delay_info(#state{server = From}, El, Time) ->
- xmpp_util:add_delay_info(El, From, Time, <<"Resent">>).
+ xmpp_util:add_delay_info(El, jid:make(From), Time, <<"Resent">>).
%%%----------------------------------------------------------------------
%%% XEP-0352
diff --git a/src/mod_announce.erl b/src/mod_announce.erl
index d9209f418..8d2fbebff 100644
--- a/src/mod_announce.erl
+++ b/src/mod_announce.erl
@@ -130,34 +130,37 @@ stop(Host) ->
{wait, Proc}.
%% Announcing via messages to a custom resource
--spec announce(jid(), jid(), stanza()) -> ok.
+-spec announce(jid(), jid(), stanza()) -> ok | stop.
announce(From, #jid{luser = <<>>} = To, #message{} = Packet) ->
Proc = gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME),
- case To#jid.lresource of
- <<"announce/all">> ->
- Proc ! {announce_all, From, To, Packet};
- <<"announce/all-hosts/all">> ->
- Proc ! {announce_all_hosts_all, From, To, Packet};
- <<"announce/online">> ->
- Proc ! {announce_online, From, To, Packet};
- <<"announce/all-hosts/online">> ->
- Proc ! {announce_all_hosts_online, From, To, Packet};
- <<"announce/motd">> ->
- Proc ! {announce_motd, From, To, Packet};
- <<"announce/all-hosts/motd">> ->
- Proc ! {announce_all_hosts_motd, From, To, Packet};
- <<"announce/motd/update">> ->
- Proc ! {announce_motd_update, From, To, Packet};
- <<"announce/all-hosts/motd/update">> ->
- Proc ! {announce_all_hosts_motd_update, From, To, Packet};
- <<"announce/motd/delete">> ->
- Proc ! {announce_motd_delete, From, To, Packet};
- <<"announce/all-hosts/motd/delete">> ->
- Proc ! {announce_all_hosts_motd_delete, From, To, Packet};
- _ ->
- ok
- end,
- ok;
+ Res = case To#jid.lresource of
+ <<"announce/all">> ->
+ Proc ! {announce_all, From, To, Packet};
+ <<"announce/all-hosts/all">> ->
+ Proc ! {announce_all_hosts_all, From, To, Packet};
+ <<"announce/online">> ->
+ Proc ! {announce_online, From, To, Packet};
+ <<"announce/all-hosts/online">> ->
+ Proc ! {announce_all_hosts_online, From, To, Packet};
+ <<"announce/motd">> ->
+ Proc ! {announce_motd, From, To, Packet};
+ <<"announce/all-hosts/motd">> ->
+ Proc ! {announce_all_hosts_motd, From, To, Packet};
+ <<"announce/motd/update">> ->
+ Proc ! {announce_motd_update, From, To, Packet};
+ <<"announce/all-hosts/motd/update">> ->
+ Proc ! {announce_all_hosts_motd_update, From, To, Packet};
+ <<"announce/motd/delete">> ->
+ Proc ! {announce_motd_delete, From, To, Packet};
+ <<"announce/all-hosts/motd/delete">> ->
+ Proc ! {announce_all_hosts_motd_delete, From, To, Packet};
+ _ ->
+ ok
+ end,
+ case Res of
+ ok -> ok;
+ _ -> stop
+ end;
announce(_From, _To, _Packet) ->
ok.
diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl
index 55e3ca151..b3bbff96e 100644
--- a/src/mod_blocking.erl
+++ b/src/mod_blocking.erl
@@ -74,39 +74,37 @@ process_iq(IQ) ->
-spec process_iq_get({error, stanza_error()} | {result, xmpp_element() | undefined},
iq(), userlist()) ->
- {error, stanza_error()} | {result, block_list()}.
+ {error, stanza_error()} |
+ {result, xmpp_element() | undefined}.
process_iq_get(_, #iq{lang = Lang, from = From,
sub_els = [#block_list{}]}, _) ->
#jid{luser = LUser, lserver = LServer} = From,
- {stop, process_blocklist_get(LUser, LServer, Lang)};
+ process_blocklist_get(LUser, LServer, Lang);
process_iq_get(Acc, _, _) -> Acc.
-spec process_iq_set({error, stanza_error()} |
{result, xmpp_element() | undefined} |
{result, xmpp_element() | undefined, userlist()},
iq()) -> {error, stanza_error()} |
- {result, undefined} |
- {result, undefined, userlist()}.
-process_iq_set(_, #iq{from = From, lang = Lang, sub_els = [SubEl]}) ->
+ {result, xmpp_element() | undefined} |
+ {result, xmpp_element() | undefined, userlist()}.
+process_iq_set(Acc, #iq{from = From, lang = Lang, sub_els = [SubEl]}) ->
#jid{luser = LUser, lserver = LServer} = From,
- Res = case SubEl of
- #block{items = []} ->
- Txt = <<"No items found in this query">>,
- {error, xmpp:err_bad_request(Txt, Lang)};
- #block{items = Items} ->
- JIDs = [jid:tolower(Item) || Item <- Items],
- process_blocklist_block(LUser, LServer, JIDs, Lang);
- #unblock{items = []} ->
- process_blocklist_unblock_all(LUser, LServer, Lang);
- #unblock{items = Items} ->
- JIDs = [jid:tolower(Item) || Item <- Items],
- process_blocklist_unblock(LUser, LServer, JIDs, Lang);
- _ ->
- Txt = <<"Only <block/> and <unblock/> are allowed "
- "in this request">>,
- {error, xmpp:err_bad_request(Txt, Lang)}
- end,
- {stop, Res};
+ case SubEl of
+ #block{items = []} ->
+ Txt = <<"No items found in this query">>,
+ {error, xmpp:err_bad_request(Txt, Lang)};
+ #block{items = Items} ->
+ JIDs = [jid:tolower(Item) || Item <- Items],
+ process_blocklist_block(LUser, LServer, JIDs, Lang);
+ #unblock{items = []} ->
+ process_blocklist_unblock_all(LUser, LServer, Lang);
+ #unblock{items = Items} ->
+ JIDs = [jid:tolower(Item) || Item <- Items],
+ process_blocklist_unblock(LUser, LServer, JIDs, Lang);
+ _ ->
+ Acc
+ end;
process_iq_set(Acc, _) -> Acc.
-spec list_to_blocklist_jids([listitem()], [ljid()]) -> [ljid()].
diff --git a/src/mod_client_state.erl b/src/mod_client_state.erl
index f72f334f3..7f0658eff 100644
--- a/src/mod_client_state.erl
+++ b/src/mod_client_state.erl
@@ -277,7 +277,7 @@ get_queue(C2SState) ->
get_stanzas(Queue, Host) ->
lists:map(fun({_Key, Time, Stanza}) ->
- xmpp_util:add_delay_info(Stanza, Host, Time,
+ xmpp_util:add_delay_info(Stanza, jid:make(Host), Time,
<<"Client Inactive">>)
end, Queue).
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index 2529b7389..ea267c1c0 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -834,6 +834,10 @@ msg_to_el(#archive_msg{timestamp = TS, packet = Pkt1, nick = Nick, peer = Peer},
#forwarded{sub_els = [Pkt2],
delay = #delay{stamp = TS, from = jid:make(LServer)}}.
+maybe_update_from_to(#xmlel{} = El, JidRequestor, JidArchive, Peer,
+ {groupchat, _, _} = MsgType, Nick) ->
+ Pkt = xmpp:decode(El, [ignore_els]),
+ maybe_update_from_to(Pkt, JidRequestor, JidArchive, Peer, MsgType, Nick);
maybe_update_from_to(#message{sub_els = Els} = Pkt, JidRequestor, JidArchive,
Peer, {groupchat, Role,
#state{config = #config{anonymous = Anon}}},
@@ -908,7 +912,8 @@ send(Msgs, Count, IsComplete,
Result = if NS == ?NS_MAM_TMP ->
#mam_query{xmlns = NS, id = QID, rsm = RSMOut};
true ->
- #mam_fin{id = QID, rsm = RSMOut, complete = IsComplete}
+ #mam_fin{xmlns = NS, id = QID, rsm = RSMOut,
+ complete = IsComplete}
end,
if NS == ?NS_MAM_TMP; NS == ?NS_MAM_1 ->
lists:foreach(
@@ -950,6 +955,8 @@ limit_max(#rsm_set{max = Max} = RSM, _NS) when Max > ?MAX_PAGE_SIZE ->
limit_max(RSM, _NS) ->
RSM.
+match_interval(Now, Start, undefined) ->
+ Now >= Start;
match_interval(Now, Start, End) ->
(Now >= Start) and (Now =< End).
diff --git a/src/mod_mam_mnesia.erl b/src/mod_mam_mnesia.erl
index cbe7c336c..ecaa4d053 100644
--- a/src/mod_mam_mnesia.erl
+++ b/src/mod_mam_mnesia.erl
@@ -134,7 +134,10 @@ select(_LServer, JidRequestor,
#jid{luser = LUser, lserver = LServer} = JidArchive,
#mam_query{start = Start, 'end' = End,
with = With, rsm = RSM}, MsgType) ->
- MS = make_matchspec(LUser, LServer, Start, End, With),
+ LWith = if With /= undefined -> jid:tolower(With);
+ true -> undefined
+ end,
+ MS = make_matchspec(LUser, LServer, Start, End, LWith),
Msgs = mnesia:dirty_select(archive_msg, MS),
SortedMsgs = lists:keysort(#archive_msg.timestamp, Msgs),
{FilteredMsgs, IsComplete} = filter_by_rsm(SortedMsgs, RSM),
@@ -155,6 +158,9 @@ select(_LServer, JidRequestor,
now_to_usec({MSec, Sec, USec}) ->
(MSec*1000000 + Sec)*1000000 + USec.
+make_matchspec(LUser, LServer, Start, undefined, With) ->
+ %% List is always greater than a tuple
+ make_matchspec(LUser, LServer, Start, [], With);
make_matchspec(LUser, LServer, Start, End, {_, _, <<>>} = With) ->
ets:fun2ms(
fun(#archive_msg{timestamp = TS,
diff --git a/src/mod_mix.erl b/src/mod_mix.erl
index f39408210..7ca09f4db 100644
--- a/src/mod_mix.erl
+++ b/src/mod_mix.erl
@@ -209,19 +209,18 @@ do_route(_State, _From, _To, _Packet) ->
subscribe_nodes(From, To, Nodes) ->
LTo = jid:tolower(jid:remove_resource(To)),
LFrom = jid:tolower(jid:remove_resource(From)),
- From_s = jid:to_string(LFrom),
lists:foldl(
fun(_Node, {error, _} = Err) ->
Err;
(Node, {result, _}) ->
- case mod_pubsub:subscribe_node(LTo, Node, From, From_s, []) of
+ case mod_pubsub:subscribe_node(LTo, Node, From, From, []) of
{error, _} = Err ->
case is_item_not_found(Err) of
true ->
case mod_pubsub:create_node(
LTo, To#jid.lserver, Node, LFrom, <<"mix">>) of
{result, _} ->
- mod_pubsub:subscribe_node(LTo, Node, From, From_s, []);
+ mod_pubsub:subscribe_node(LTo, Node, From, From, []);
Error ->
Error
end;
@@ -235,13 +234,12 @@ subscribe_nodes(From, To, Nodes) ->
unsubscribe_nodes(From, To, Nodes) ->
LTo = jid:tolower(jid:remove_resource(To)),
- LFrom = jid:tolower(jid:remove_resource(From)),
- From_s = jid:to_string(LFrom),
+ BareFrom = jid:remove_resource(From),
lists:foldl(
fun(_Node, {error, _} = Err) ->
Err;
(Node, {result, _} = Result) ->
- case mod_pubsub:unsubscribe_node(LTo, Node, From, From_s, <<"">>) of
+ case mod_pubsub:unsubscribe_node(LTo, Node, From, BareFrom, <<"">>) of
{error, _} = Err ->
case is_not_subscribed(Err) of
true -> Result;
@@ -297,19 +295,16 @@ delete_item(From, To, Node, ItemID) ->
end
end.
-is_item_not_found({error, ErrEl}) ->
- case fxml:get_subtag_with_xmlns(
- ErrEl, <<"item-not-found">>, ?NS_STANZAS) of
- #xmlel{} -> true;
- _ -> false
- end.
+-spec is_item_not_found({error, stanza_error()}) -> boolean().
+is_item_not_found({error, #stanza_error{reason = 'item-not-found'}}) -> true;
+is_item_not_found({error, _}) -> false.
-is_not_subscribed({error, ErrEl}) ->
- case fxml:get_subtag_with_xmlns(
- ErrEl, <<"not-subscribed">>, ?NS_PUBSUB_ERRORS) of
- #xmlel{} -> true;
- _ -> false
- end.
+-spec is_not_subscribed({error, stanza_error()}) -> boolean().
+is_not_subscribed({error, #stanza_error{sub_els = Els}}) ->
+ %% TODO: make xmpp:get_els function working for any XMPP element
+ %% with sub_els field
+ xmpp:has_subtag(#message{sub_els = Els},
+ #ps_error{type = 'not-subscribed'}).
depends(_Host, _Opts) ->
[{mod_pubsub, hard}].
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index 3eca79fec..66604394b 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -668,17 +668,17 @@ get_nick(ServerHost, Host, From) ->
Mod:get_nick(LServer, Host, From).
iq_get_register_info(ServerHost, Host, From, Lang) ->
- {Nick, Registered} = case get_nick(ServerHost, Host, From) of
- error -> {<<"">>, false};
- N -> {N, true}
- end,
+ {Nick, NickVals, Registered} = case get_nick(ServerHost, Host, From) of
+ error -> {<<"">>, [], false};
+ N -> {N, [N], true}
+ end,
Title = <<(translate:translate(
Lang, <<"Nickname Registration at ">>))/binary, Host/binary>>,
Inst = translate:translate(Lang, <<"Enter nickname you want to register">>),
Field = #xdata_field{type = 'text-single',
label = translate:translate(Lang, <<"Nickname">>),
var = <<"nick">>,
- values = [Nick]},
+ values = NickVals},
X = #xdata{type = form, title = Title,
instructions = [Inst], fields = [Field]},
#register{nick = Nick,
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index 509406aa4..a2bcec894 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -616,7 +616,7 @@ offline_msg_to_route(LServer, #offline_msg{} = R) ->
undefined ->
Pkt;
TS ->
- xmpp_util:add_delay_info(Pkt, LServer, TS,
+ xmpp_util:add_delay_info(Pkt, jid:make(LServer), TS,
<<"Offline Storage">>)
end,
{route, R#offline_msg.from, R#offline_msg.to, Pkt1}.
diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl
index 3be3f2d3b..2f318deec 100644
--- a/src/mod_privacy.erl
+++ b/src/mod_privacy.erl
@@ -101,7 +101,8 @@ process_iq(IQ) ->
xmpp:make_error(IQ, xmpp:err_not_allowed()).
-spec process_iq_get({error, stanza_error()} | {result, xmpp_element() | undefined},
- iq(), userlist()) -> {error, stanza_error()} | {result, privacy_query()}.
+ iq(), userlist()) -> {error, stanza_error()} |
+ {result, xmpp_element() | undefined}.
process_iq_get(_, #iq{from = From, lang = Lang,
sub_els = [#privacy_query{lists = Lists}]},
#userlist{name = Active}) ->
@@ -114,7 +115,9 @@ process_iq_get(_, #iq{from = From, lang = Lang,
_ ->
Txt = <<"Too many <list/> elements">>,
{error, xmpp:err_bad_request(Txt, Lang)}
- end.
+ end;
+process_iq_get(Acc, _, _) ->
+ Acc.
-spec process_lists_get(binary(), binary(), binary(), binary()) ->
{error, stanza_error()} | {result, privacy_query()}.
@@ -218,7 +221,8 @@ decode_value(Type, Value) ->
{result, xmpp_element() | undefined} |
{result, xmpp_element() | undefined, userlist()},
iq()) -> {error, stanza_error()} |
- {result, undefined, userlist()}.
+ {result, xmpp_element() | undefined} |
+ {result, xmpp_element() | undefined, userlist()}.
process_iq_set(_, #iq{from = From, lang = Lang,
sub_els = [#privacy_query{default = Default,
active = Active,
@@ -236,7 +240,9 @@ process_iq_set(_, #iq{from = From, lang = Lang,
Txt = <<"There should be exactly one element in this query: "
"<list/>, <active/> or <default/>">>,
{error, xmpp:err_bad_request(Txt, Lang)}
- end.
+ end;
+process_iq_set(Acc, _) ->
+ Acc.
-spec process_default_set(binary(), binary(), none | binary(),
binary()) -> {error, stanza_error()} | {result, undefined}.
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index b470d83d9..f7e1a9834 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -69,9 +69,7 @@
tree_action/3, node_action/4, node_call/4]).
%% general helpers for plugins
--export([subscription_to_string/1, affiliation_to_string/1,
- string_to_subscription/1, string_to_affiliation/1,
- extended_error/2, service_jid/1,
+-export([extended_error/2, service_jid/1,
tree/1, tree/2, plugin/2, plugins/1, config/3,
host/1, serverhost/1]).
@@ -2170,7 +2168,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIds, RSM) ->
get_items(Host, Node) ->
Action = fun (#pubsub_node{type = Type, id = Nidx}) ->
- node_call(Host, Type, get_items, [Nidx, service_jid(Host), none])
+ node_call(Host, Type, get_items, [Nidx, service_jid(Host), undefined])
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {_, {Items, _}}} -> Items;
@@ -2187,7 +2185,7 @@ get_item(Host, Node, ItemId) ->
end.
get_allowed_items_call(Host, Nidx, From, Type, Options, Owners) ->
- case get_allowed_items_call(Host, Nidx, From, Type, Options, Owners, none) of
+ case get_allowed_items_call(Host, Nidx, From, Type, Options, Owners, undefined) of
{result, {Items, _RSM}} -> {result, Items};
Error -> Error
end.
@@ -2203,7 +2201,7 @@ get_last_item(Host, Type, Nidx, LJID) ->
LastItem -> LastItem
end.
get_last_item(Host, Type, Nidx, LJID, mnesia) ->
- case node_action(Host, Type, get_items, [Nidx, LJID, none]) of
+ case node_action(Host, Type, get_items, [Nidx, LJID, undefined]) of
{result, {[LastItem|_], _}} -> LastItem;
_ -> undefined
end;
@@ -2218,7 +2216,7 @@ get_last_item(_Host, _Type, _Nidx, _LJID, _) ->
get_last_items(Host, Type, Nidx, LJID, Number) ->
get_last_items(Host, Type, Nidx, LJID, Number, gen_mod:db_type(serverhost(Host), ?MODULE)).
get_last_items(Host, Type, Nidx, LJID, Number, mnesia) ->
- case node_action(Host, Type, get_items, [Nidx, LJID, none]) of
+ case node_action(Host, Type, get_items, [Nidx, LJID, undefined]) of
{result, {Items, _}} -> lists:sublist(Items, Number);
_ -> []
end;
@@ -2714,32 +2712,6 @@ get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, A
get_roster_info(OwnerUser, OwnerServer, JID, AllowedGroups) ->
get_roster_info(OwnerUser, OwnerServer, jid:tolower(JID), AllowedGroups).
-string_to_affiliation(<<"owner">>) -> owner;
-string_to_affiliation(<<"publisher">>) -> publisher;
-string_to_affiliation(<<"publish-only">>) -> publish_only;
-string_to_affiliation(<<"member">>) -> member;
-string_to_affiliation(<<"outcast">>) -> outcast;
-string_to_affiliation(<<"none">>) -> none;
-string_to_affiliation(_) -> false.
-
-string_to_subscription(<<"subscribed">>) -> subscribed;
-string_to_subscription(<<"pending">>) -> pending;
-string_to_subscription(<<"unconfigured">>) -> unconfigured;
-string_to_subscription(<<"none">>) -> none;
-string_to_subscription(_) -> false.
-
-affiliation_to_string(owner) -> <<"owner">>;
-affiliation_to_string(publisher) -> <<"publisher">>;
-affiliation_to_string(publish_only) -> <<"publish-only">>;
-affiliation_to_string(member) -> <<"member">>;
-affiliation_to_string(outcast) -> <<"outcast">>;
-affiliation_to_string(_) -> <<"none">>.
-
-subscription_to_string(subscribed) -> <<"subscribed">>;
-subscription_to_string(pending) -> <<"pending">>;
-subscription_to_string(unconfigured) -> <<"unconfigured">>;
-subscription_to_string(_) -> <<"none">>.
-
-spec service_jid(jid() | ljid() | binary()) -> jid().
service_jid(#jid{} = Jid) -> Jid;
service_jid({U, S, R}) -> jid:make(U, S, R);
diff --git a/src/mod_register.erl b/src/mod_register.erl
index 334af4514..44a64539e 100644
--- a/src/mod_register.erl
+++ b/src/mod_register.erl
@@ -146,12 +146,10 @@ process_iq(#iq{type = set, lang = Lang, to = To, from = From,
end;
true ->
case From of
- #jid{user = User, lserver = Server, resource = Resource} ->
+ #jid{luser = LUser, lserver = Server} ->
ResIQ = xmpp:make_iq_result(IQ),
- ejabberd_router:route(jid:make(User, Server, Resource),
- jid:make(User, Server, Resource),
- ResIQ),
- ejabberd_auth:remove_user(User, Server),
+ ejabberd_router:route(From, From, ResIQ),
+ ejabberd_auth:remove_user(LUser, Server),
ignore;
_ ->
Txt = <<"The query is only allowed from local users">>,
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 2a41907a4..feebd3945 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -308,13 +308,13 @@ encode_item(Item) ->
end,
groups = Item#roster.groups}.
-decode_item(#roster_item{} = Item, R, Managed) ->
+decode_item(Item, R, Managed) ->
R#roster{jid = jid:tolower(Item#roster_item.jid),
name = Item#roster_item.name,
subscription = case Item#roster_item.subscription of
remove -> remove;
Sub when Managed -> Sub;
- _ -> undefined
+ _ -> R#roster.subscription
end,
groups = Item#roster_item.groups}.
@@ -334,45 +334,48 @@ try_process_iq_set(#iq{from = From, lang = Lang} = IQ) ->
end.
process_iq_set(#iq{from = From, to = To, id = Id,
- sub_els = [#roster_query{items = Items}]} = IQ) ->
+ sub_els = [#roster_query{items = QueryItems}]} = IQ) ->
Managed = is_managed_from_id(Id),
- lists:foreach(fun (Item) -> process_item_set(From, To, Item, Managed)
- end,
- Items),
- xmpp:make_iq_result(IQ).
-
-process_item_set(From, To, #roster_item{jid = JID1} = QueryItem, Managed) ->
#jid{user = User, luser = LUser, lserver = LServer} = From,
- LJID = jid:tolower(JID1),
F = fun () ->
- Item = get_roster_by_jid_t(LUser, LServer, LJID),
- Item2 = decode_item(QueryItem, Item, Managed),
- Item3 = ejabberd_hooks:run_fold(roster_process_item,
- LServer, Item2,
- [LServer]),
- case Item3#roster.subscription of
- remove -> del_roster_t(LUser, LServer, LJID);
- _ -> update_roster_t(LUser, LServer, LJID, Item3)
- end,
- send_itemset_to_managers(From, Item3, Managed),
- case roster_version_on_db(LServer) of
- true -> write_roster_version_t(LUser, LServer);
- false -> ok
- end,
- {Item, Item3}
+ lists:map(
+ fun(#roster_item{jid = JID1} = QueryItem) ->
+ LJID = jid:tolower(JID1),
+ Item = get_roster_by_jid_t(LUser, LServer, LJID),
+ Item2 = decode_item(QueryItem, Item, Managed),
+ Item3 = ejabberd_hooks:run_fold(roster_process_item,
+ LServer, Item2,
+ [LServer]),
+ case Item3#roster.subscription of
+ remove -> del_roster_t(LUser, LServer, LJID);
+ _ -> update_roster_t(LUser, LServer, LJID, Item3)
+ end,
+ case roster_version_on_db(LServer) of
+ true -> write_roster_version_t(LUser, LServer);
+ false -> ok
+ end,
+ {Item, Item3}
+ end, QueryItems)
end,
case transaction(LServer, F) of
- {atomic, {OldItem, Item}} ->
- push_item(User, LServer, To, Item),
- case Item#roster.subscription of
- remove ->
- send_unsubscribing_presence(From, OldItem), ok;
- _ -> ok
- end;
+ {atomic, ItemPairs} ->
+ lists:foreach(
+ fun({OldItem, Item}) ->
+ send_itemset_to_managers(From, Item, Managed),
+ push_item(User, LServer, To, Item),
+ case Item#roster.subscription of
+ remove ->
+ send_unsubscribing_presence(From, OldItem);
+ _ ->
+ ok
+ end
+ end, ItemPairs),
+ xmpp:make_iq_result(IQ);
E ->
- ?DEBUG("ROSTER: roster item set error: ~p~n", [E]), ok
- end;
-process_item_set(_From, _To, _, _Managed) -> ok.
+ ?ERROR_MSG("roster set failed:~nIQ = ~s~nError = ~p",
+ [xmpp:pp(IQ), E]),
+ xmpp:make_error(IQ, xmpp:err_internal_server_error())
+ end.
push_item(User, Server, From, Item) ->
ejabberd_sm:route(jid:make(<<"">>, <<"">>, <<"">>),
diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl
index 1f6edb460..8333d32cf 100644
--- a/src/mod_vcard.erl
+++ b/src/mod_vcard.erl
@@ -137,7 +137,7 @@ stop(Host) ->
?NS_VCARD),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE,
get_sm_features, 50),
- Mod = gen_mod:db_type(Host, ?MODULE),
+ Mod = gen_mod:db_mod(Host, ?MODULE),
Mod:stop(Host),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
Proc ! stop,
diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl
index 191676224..d8efe30f5 100644
--- a/src/mod_vcard_ldap.erl
+++ b/src/mod_vcard_ldap.erl
@@ -248,10 +248,10 @@ ldap_attribute_to_vcard({Attr, Value}, V) ->
<<"tel">> -> V#vcard_temp{tel = [#vcard_tel{number = Value}|Ts]};
<<"email">> -> V#vcard_temp{email = [#vcard_email{userid = Value}|Es]};
<<"photo">> -> V#vcard_temp{photo = #vcard_photo{binval = Value}};
- <<"family">> -> V#vcard_temp{n = N#vcard_name{family = V}};
- <<"given">> -> V#vcard_temp{n = N#vcard_name{given = V}};
- <<"middle">> -> V#vcard_temp{n = N#vcard_name{middle = V}};
- <<"orgname">> -> V#vcard_temp{org = O#vcard_org{name = V}};
+ <<"family">> -> V#vcard_temp{n = N#vcard_name{family = Value}};
+ <<"given">> -> V#vcard_temp{n = N#vcard_name{given = Value}};
+ <<"middle">> -> V#vcard_temp{n = N#vcard_name{middle = Value}};
+ <<"orgname">> -> V#vcard_temp{org = O#vcard_org{name = Value}};
<<"orgunit">> -> V#vcard_temp{org = O#vcard_org{units = [Value]}};
<<"locality">> -> V#vcard_temp{adr = [A#vcard_adr{locality = Value}]};
<<"street">> -> V#vcard_temp{adr = [A#vcard_adr{street = Value}]};
diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl
index 5cc87056e..27688e8fb 100644
--- a/src/mod_vcard_xupdate.erl
+++ b/src/mod_vcard_xupdate.erl
@@ -52,7 +52,7 @@ depends(_Host, _Opts) ->
%% Hooks
%%====================================================================
-spec update_presence(presence(), binary(), binary()) -> presence().
-update_presence(#presence{type = undefined} = Packet, User, Host) ->
+update_presence(#presence{type = available} = Packet, User, Host) ->
presence_with_xupdate(Packet, User, Host);
update_presence(Packet, _User, _Host) -> Packet.
diff --git a/src/node_flat.erl b/src/node_flat.erl
index 2ec9afe54..e80aaad34 100644
--- a/src/node_flat.erl
+++ b/src/node_flat.erl
@@ -707,7 +707,7 @@ del_state(Nidx, Key) ->
%% relational database), or they can even decide not to persist any items.</p>
get_items(Nidx, _From, _RSM) ->
Items = mnesia:match_object(#pubsub_item{itemid = {'_', Nidx}, _ = '_'}),
- {result, {lists:reverse(lists:keysort(#pubsub_item.modification, Items)), none}}.
+ {result, {lists:reverse(lists:keysort(#pubsub_item.modification, Items)), undefined}}.
get_items(Nidx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId, RSM) ->
SubKey = jid:tolower(JID),
diff --git a/src/xmpp_codec.erl b/src/xmpp_codec.erl
index 8653d591c..00ee53aaf 100644
--- a/src/xmpp_codec.erl
+++ b/src/xmpp_codec.erl
@@ -286,6 +286,8 @@ decode({xmlel, _name, _attrs, _} = _el, Opts) ->
_el);
{<<"fin">>, <<"urn:xmpp:mam:0">>} ->
decode_mam_fin(<<"urn:xmpp:mam:0">>, IgnoreEls, _el);
+ {<<"fin">>, <<"urn:xmpp:mam:1">>} ->
+ decode_mam_fin(<<"urn:xmpp:mam:1">>, IgnoreEls, _el);
{<<"prefs">>, <<"urn:xmpp:mam:0">>} ->
decode_mam_prefs(<<"urn:xmpp:mam:0">>, IgnoreEls, _el);
{<<"prefs">>, <<"urn:xmpp:mam:1">>} ->
@@ -1688,6 +1690,7 @@ is_known_tag({xmlel, _name, _attrs, _} = _el) ->
{<<"disable">>, <<"urn:xmpp:carbons:2">>} -> true;
{<<"forwarded">>, <<"urn:xmpp:forward:0">>} -> true;
{<<"fin">>, <<"urn:xmpp:mam:0">>} -> true;
+ {<<"fin">>, <<"urn:xmpp:mam:1">>} -> true;
{<<"prefs">>, <<"urn:xmpp:mam:0">>} -> true;
{<<"prefs">>, <<"urn:xmpp:mam:1">>} -> true;
{<<"prefs">>, <<"urn:xmpp:mam:tmp">>} -> true;
@@ -2978,9 +2981,8 @@ encode({mam_result, _, _, _, _} = Result) ->
encode_mam_result(Result, []);
encode({mam_prefs, _, _, _, _} = Prefs) ->
encode_mam_prefs(Prefs, []);
-encode({mam_fin, _, _, _, _} = Fin) ->
- encode_mam_fin(Fin,
- [{<<"xmlns">>, <<"urn:xmpp:mam:0">>}]);
+encode({mam_fin, _, _, _, _, _} = Fin) ->
+ encode_mam_fin(Fin, []);
encode({forwarded, _, _} = Forwarded) ->
encode_forwarded(Forwarded,
[{<<"xmlns">>, <<"urn:xmpp:forward:0">>}]);
@@ -3196,7 +3198,7 @@ get_name({iq, _, _, _, _, _, _}) -> <<"iq">>;
get_name({last, _, _}) -> <<"query">>;
get_name({legacy_auth, _, _, _, _}) -> <<"query">>;
get_name({mam_archived, _, _}) -> <<"archived">>;
-get_name({mam_fin, _, _, _, _}) -> <<"fin">>;
+get_name({mam_fin, _, _, _, _, _}) -> <<"fin">>;
get_name({mam_prefs, _, _, _, _}) -> <<"prefs">>;
get_name({mam_query, _, _, _, _, _, _, _, _}) ->
<<"query">>;
@@ -3466,7 +3468,7 @@ get_ns({last, _, _}) -> <<"jabber:iq:last">>;
get_ns({legacy_auth, _, _, _, _}) ->
<<"jabber:iq:auth">>;
get_ns({mam_archived, _, _}) -> <<"urn:xmpp:mam:tmp">>;
-get_ns({mam_fin, _, _, _, _}) -> <<"urn:xmpp:mam:0">>;
+get_ns({mam_fin, Xmlns, _, _, _, _}) -> Xmlns;
get_ns({mam_prefs, Xmlns, _, _, _}) -> Xmlns;
get_ns({mam_query, Xmlns, _, _, _, _, _, _, _}) ->
Xmlns;
@@ -3898,7 +3900,7 @@ pp(mam_query, 8) ->
pp(mam_archived, 2) -> [by, id];
pp(mam_result, 4) -> [xmlns, queryid, id, sub_els];
pp(mam_prefs, 4) -> [xmlns, default, always, never];
-pp(mam_fin, 4) -> [id, rsm, stable, complete];
+pp(mam_fin, 5) -> [xmlns, id, rsm, stable, complete];
pp(forwarded, 2) -> [delay, sub_els];
pp(carbons_disable, 0) -> [];
pp(carbons_enable, 0) -> [];
@@ -8600,10 +8602,10 @@ decode_mam_fin(__TopXMLNS, __IgnoreEls,
{xmlel, <<"fin">>, _attrs, _els}) ->
Rsm = decode_mam_fin_els(__TopXMLNS, __IgnoreEls, _els,
undefined),
- {Id, Stable, Complete} =
+ {Id, Xmlns, Stable, Complete} =
decode_mam_fin_attrs(__TopXMLNS, _attrs, undefined,
- undefined, undefined),
- {mam_fin, Id, Rsm, Stable, Complete}.
+ undefined, undefined, undefined),
+ {mam_fin, Xmlns, Id, Rsm, Stable, Complete}.
decode_mam_fin_els(__TopXMLNS, __IgnoreEls, [], Rsm) ->
Rsm;
@@ -8622,37 +8624,45 @@ decode_mam_fin_els(__TopXMLNS, __IgnoreEls, [_ | _els],
decode_mam_fin_els(__TopXMLNS, __IgnoreEls, _els, Rsm).
decode_mam_fin_attrs(__TopXMLNS,
- [{<<"queryid">>, _val} | _attrs], _Id, Stable,
+ [{<<"queryid">>, _val} | _attrs], _Id, Xmlns, Stable,
Complete) ->
- decode_mam_fin_attrs(__TopXMLNS, _attrs, _val, Stable,
- Complete);
+ decode_mam_fin_attrs(__TopXMLNS, _attrs, _val, Xmlns,
+ Stable, Complete);
decode_mam_fin_attrs(__TopXMLNS,
- [{<<"stable">>, _val} | _attrs], Id, _Stable,
+ [{<<"xmlns">>, _val} | _attrs], Id, _Xmlns, Stable,
Complete) ->
decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, _val,
- Complete);
+ Stable, Complete);
+decode_mam_fin_attrs(__TopXMLNS,
+ [{<<"stable">>, _val} | _attrs], Id, Xmlns, _Stable,
+ Complete) ->
+ decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, Xmlns,
+ _val, Complete);
decode_mam_fin_attrs(__TopXMLNS,
- [{<<"complete">>, _val} | _attrs], Id, Stable,
+ [{<<"complete">>, _val} | _attrs], Id, Xmlns, Stable,
_Complete) ->
- decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, Stable,
- _val);
+ decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, Xmlns,
+ Stable, _val);
decode_mam_fin_attrs(__TopXMLNS, [_ | _attrs], Id,
- Stable, Complete) ->
- decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, Stable,
- Complete);
-decode_mam_fin_attrs(__TopXMLNS, [], Id, Stable,
+ Xmlns, Stable, Complete) ->
+ decode_mam_fin_attrs(__TopXMLNS, _attrs, Id, Xmlns,
+ Stable, Complete);
+decode_mam_fin_attrs(__TopXMLNS, [], Id, Xmlns, Stable,
Complete) ->
{decode_mam_fin_attr_queryid(__TopXMLNS, Id),
+ decode_mam_fin_attr_xmlns(__TopXMLNS, Xmlns),
decode_mam_fin_attr_stable(__TopXMLNS, Stable),
decode_mam_fin_attr_complete(__TopXMLNS, Complete)}.
-encode_mam_fin({mam_fin, Id, Rsm, Stable, Complete},
+encode_mam_fin({mam_fin, Xmlns, Id, Rsm, Stable,
+ Complete},
_xmlns_attrs) ->
_els = lists:reverse('encode_mam_fin_$rsm'(Rsm, [])),
_attrs = encode_mam_fin_attr_complete(Complete,
encode_mam_fin_attr_stable(Stable,
- encode_mam_fin_attr_queryid(Id,
- _xmlns_attrs))),
+ encode_mam_fin_attr_xmlns(Xmlns,
+ encode_mam_fin_attr_queryid(Id,
+ _xmlns_attrs)))),
{xmlel, <<"fin">>, _attrs, _els}.
'encode_mam_fin_$rsm'(undefined, _acc) -> _acc;
@@ -8669,6 +8679,14 @@ encode_mam_fin_attr_queryid(<<>>, _acc) -> _acc;
encode_mam_fin_attr_queryid(_val, _acc) ->
[{<<"queryid">>, _val} | _acc].
+decode_mam_fin_attr_xmlns(__TopXMLNS, undefined) ->
+ <<>>;
+decode_mam_fin_attr_xmlns(__TopXMLNS, _val) -> _val.
+
+encode_mam_fin_attr_xmlns(<<>>, _acc) -> _acc;
+encode_mam_fin_attr_xmlns(_val, _acc) ->
+ [{<<"xmlns">>, _val} | _acc].
+
decode_mam_fin_attr_stable(__TopXMLNS, undefined) ->
undefined;
decode_mam_fin_attr_stable(__TopXMLNS, _val) ->
diff --git a/src/xmpp_util.erl b/src/xmpp_util.erl
index 20231fffa..43178e86f 100644
--- a/src/xmpp_util.erl
+++ b/src/xmpp_util.erl
@@ -68,7 +68,7 @@ unwrap_carbon(Stanza) -> Stanza.
-spec is_standalone_chat_state(stanza()) -> boolean().
is_standalone_chat_state(Stanza) ->
case unwrap_carbon(Stanza) of
- #message{sub_els = Els} ->
+ #message{body = [], subject = [], sub_els = Els} ->
IgnoreNS = [?NS_CHATSTATES, ?NS_DELAY],
Stripped = [El || El <- Els,
not lists:member(xmpp:get_ns(El), IgnoreNS)],