summaryrefslogtreecommitdiff
path: root/src/mod_roster.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_roster.erl')
-rw-r--r--src/mod_roster.erl80
1 files changed, 47 insertions, 33 deletions
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index bfe76cca..73e77b24 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -46,9 +46,9 @@ start(Opts) ->
process_iq(From, To, IQ) ->
{iq, ID, Type, XMLNS, SubEl} = IQ,
- {_, Server, _} = From,
+ #jid{lserver = LServer} = From,
case ?MYNAME of
- Server ->
+ LServer ->
process_local_iq(From, To, IQ);
_ ->
{iq, ID, error, XMLNS,
@@ -67,8 +67,7 @@ process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
process_iq_get(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
- {User, _, _} = From,
- LUser = jlib:tolower(User),
+ #jid{luser = LUser} = From,
F = fun() ->
mnesia:index_read(roster, LUser, #roster.user)
end,
@@ -120,19 +119,19 @@ item_to_xml(Item) ->
process_iq_set(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
- {User, _, _} = From,
{xmlelement, Name, Attrs, Els} = SubEl,
- lists:foreach(fun(El) -> process_item_set(User, From, To, El) end, Els),
+ lists:foreach(fun(El) -> process_item_set(From, To, El) end, Els),
{iq, ID, result, XMLNS, []}.
-process_item_set(User, From, To, {xmlelement, Name, Attrs, Els} = XItem) ->
- JID = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
- LUser = jlib:tolower(User),
- case JID of
+process_item_set(From, To, {xmlelement, Name, Attrs, Els} = XItem) ->
+ JID1 = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
+ #jid{user = User, luser = LUser} = From,
+ case JID1 of
error ->
ok;
_ ->
- LJID = jlib:jid_tolower(JID),
+ JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
+ LJID = jlib:jid_tolower(JID1),
F = fun() ->
Res = mnesia:read({roster, {LUser, LJID}}),
Item = case Res of
@@ -175,7 +174,7 @@ process_item_set(User, From, To, {xmlelement, Name, Attrs, Els} = XItem) ->
end,
if IsTo ->
ejabberd_router:route(
- From, OldItem#roster.jid,
+ From, jlib:make_jid(OldItem#roster.jid),
{xmlelement, "presence",
[{"type", "unsubscribe"}],
[]});
@@ -183,7 +182,7 @@ process_item_set(User, From, To, {xmlelement, Name, Attrs, Els} = XItem) ->
end,
if IsFrom ->
ejabberd_router:route(
- From, OldItem#roster.jid,
+ From, jlib:make_jid(OldItem#roster.jid),
{xmlelement, "presence",
[{"type", "unsubscribed"}],
[]});
@@ -198,7 +197,7 @@ process_item_set(User, From, To, {xmlelement, Name, Attrs, Els} = XItem) ->
ok
end
end;
-process_item_set(User, From, To, _) ->
+process_item_set(From, To, _) ->
ok.
process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
@@ -207,7 +206,8 @@ process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
case jlib:string_to_jid(Val) of
error ->
process_item_attrs(Item, Attrs);
- JID ->
+ JID1 ->
+ JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
process_item_attrs(Item#roster{jid = JID}, Attrs)
end;
"name" ->
@@ -252,7 +252,9 @@ process_item_els(Item, []) ->
push_item(User, From, Item) ->
- ejabberd_sm ! {route, {"", "", ""}, {User, "", ""},
+ ejabberd_sm ! {route,
+ jlib:make_jid("", "", ""),
+ jlib:make_jid(User, "", ""),
{xmlelement, "broadcast", [],
[{item,
Item#roster.jid,
@@ -269,12 +271,12 @@ push_item(User, Resource, From, Item) ->
[item_to_xml(Item)]}]},
ejabberd_router ! {route,
From,
- {User, ?MYNAME, Resource},
+ jlib:make_jid(User, ?MYNAME, Resource),
jlib:iq_to_xml(ResIQ)}.
get_subscription_lists(User) ->
- LUser = jlib:tolower(User),
+ LUser = jlib:nodeprep(User),
F = fun() ->
mnesia:index_read(roster, LUser, #roster.user)
end,
@@ -286,7 +288,6 @@ get_subscription_lists(User) ->
end.
fill_subscription_lists([I | Is], F, T) ->
- %J = I#roster.jid,
J = element(2, I#roster.uj),
case I#roster.subscription of
both ->
@@ -303,9 +304,8 @@ fill_subscription_lists([], F, T) ->
in_subscription(User, From, Type) ->
- LUser = jlib:tolower(User),
+ LUser = jlib:nodeprep(User),
LFrom = jlib:jid_tolower(From),
- {FU, FS, FR} = From,
F = fun() ->
case mnesia:read({roster, {LUser, LFrom}}) of
[] ->
@@ -317,6 +317,9 @@ in_subscription(User, From, Type) ->
unsubscribed ->
false;
subscribed ->
+ JID = {From#jid.user,
+ From#jid.server,
+ From#jid.resource},
NewItem = #roster{uj = {LUser, LFrom},
user = LUser,
jid = From},
@@ -376,8 +379,12 @@ in_subscription(User, From, Type) ->
{atomic, false} ->
false;
{atomic, {update, Presence, Item}} ->
- ejabberd_router:route({User, ?MYNAME, ""}, {FU, FS, ""}, Presence),
- ejabberd_sm ! {route, {"", "", ""}, {User, "", ""},
+ ejabberd_router:route({User, ?MYNAME, ""},
+ jlib:jid_replace_resource(From, ""),
+ Presence),
+ ejabberd_sm ! {route,
+ jlib:make_jid("", "", ""),
+ jlib:make_jid(User, "", ""),
{xmlelement, "broadcast", [],
[{item,
Item#roster.jid,
@@ -390,9 +397,9 @@ in_subscription(User, From, Type) ->
false
end.
-out_subscription(User, JID, Type) ->
- LUser = jlib:tolower(User),
- LJID = jlib:jid_tolower(JID),
+out_subscription(User, JID1, Type) ->
+ LUser = jlib:nodeprep(User),
+ LJID = jlib:jid_tolower(JID1),
F = fun() ->
Item = case mnesia:read({roster, {LUser, LJID}}) of
[] ->
@@ -400,6 +407,9 @@ out_subscription(User, JID, Type) ->
(Type == unsubscribed) ->
false;
true ->
+ JID = {JID1#jid.user,
+ JID1#jid.server,
+ JID1#jid.resource},
#roster{uj = {LUser, LJID},
user = LUser,
jid = JID}
@@ -448,7 +458,9 @@ out_subscription(User, JID, Type) ->
push_item(User, {"", ?MYNAME, ""}, Item),
if
Update ->
- ejabberd_sm ! {route, {"", "", ""}, {User, "", ""},
+ ejabberd_sm ! {route,
+ jlib:make_jid("", "", ""),
+ jlib:make_jid(User, "", ""),
{xmlelement, "broadcast", [],
[{item,
Item#roster.jid,
@@ -461,7 +473,7 @@ out_subscription(User, JID, Type) ->
end.
remove_user(User) ->
- LUser = jlib:tolower(User),
+ LUser = jlib:nodeprep(User),
F = fun() ->
lists:foreach(fun(R) ->
mnesia:delete_object(R)
@@ -480,12 +492,13 @@ set_items(User, SubEl) ->
mnesia:transaction(F).
process_item_set_t(User, {xmlelement, Name, Attrs, Els} = XItem) ->
- JID = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
- LUser = jlib:tolower(User),
- case JID of
+ JID1 = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
+ LUser = jlib:nodeprep(User),
+ case JID1 of
error ->
ok;
_ ->
+ JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
LJID = jlib:jid_tolower(JID),
Res = mnesia:read({roster, {LUser, LJID}}),
Item = #roster{uj = {LUser, LJID},
@@ -509,7 +522,8 @@ process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
case jlib:string_to_jid(Val) of
error ->
process_item_attrs_ws(Item, Attrs);
- JID ->
+ JID1 ->
+ JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
process_item_attrs_ws(Item#roster{jid = JID}, Attrs)
end;
"name" ->
@@ -548,7 +562,7 @@ process_item_attrs_ws(Item, []) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_jid_info(User, JID) ->
- LUser = jlib:tolower(User),
+ LUser = jlib:nodeprep(User),
LJID = jlib:jid_tolower(JID),
case catch mnesia:dirty_read(roster, {LUser, LJID}) of
[#roster{subscription = Subscription, groups = Groups}] ->