diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_sm.erl | 6 | ||||
-rw-r--r-- | src/mod_roster.erl | 56 | ||||
-rw-r--r-- | src/mod_roster_odbc.erl | 92 | ||||
-rw-r--r-- | src/mod_shared_roster.erl | 5 | ||||
-rw-r--r-- | src/odbc/pg.sql | 6 |
5 files changed, 91 insertions, 74 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 2ad148ac..f140951d 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -8,7 +8,6 @@ -module(ejabberd_sm). -author('alexey@sevcom.net'). --vsn('$Revision$ '). -behaviour(gen_server). @@ -306,8 +305,9 @@ do_route(From, To, Packet) -> {Pass, Subsc} = case xml:get_attr_s("type", Attrs) of "subscribe" -> - Reason = xml:get_tag_cdata( - xml:get_subtag(Packet, "status")), + Reason = xml:get_path_s( + Packet, + [{elem, "status"}, cdata]), {ejabberd_hooks:run_fold( roster_in_subscription, LServer, diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 4ddd30c6..ce5cb4e8 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -417,7 +417,7 @@ process_subscription(Direction, User, Server, JID1, Type, Reason) -> AskMessage = case NewState of {_, both} -> Reason; {_, in} -> Reason; - {_, _} -> [] + _ -> "" end, case NewState of none -> @@ -641,35 +641,37 @@ process_item_attrs_ws(Item, []) -> Item. get_in_pending_subscriptions(Ls, User, Server) -> - JID = jlib:make_jid(User, Server,""), - case mnesia:dirty_index_read(roster, {User,Server}, #roster.us) of + JID = jlib:make_jid(User, Server, ""), + US = {JID#jid.luser, JID#jid.lserver}, + case mnesia:dirty_index_read(roster, US, #roster.us) of Result when list(Result) -> Ls ++ lists:map( - fun(R) -> - Message = R#roster.askmessage, - Status = if is_binary(Message) -> - binary_to_list(Message); - true -> - [] - end, - {xmlelement, "presence", [{"from", jlib:jid_to_string(R#roster.jid)}, - {"to", jlib:jid_to_string(JID)}, - {"type", "subscribe"}], - [{xmlelement, "status", [], - [{xmlcdata, Status}]}]} - end, - lists:filter( - fun(R) -> - case R#roster.ask of - in -> true; - both -> true; - _ -> false - end - end, - Result)); - _ -> [] + fun(R) -> + Message = R#roster.askmessage, + Status = if is_binary(Message) -> + binary_to_list(Message); + true -> + "" + end, + {xmlelement, "presence", + [{"from", jlib:jid_to_string(R#roster.jid)}, + {"to", jlib:jid_to_string(JID)}, + {"type", "subscribe"}], + [{xmlelement, "status", [], + [{xmlcdata, Status}]}]} + end, + lists:filter( + fun(R) -> + case R#roster.ask of + in -> true; + both -> true; + _ -> false + end + end, + Result)); + _ -> + Ls end. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl index 440898d2..a9f596c8 100644 --- a/src/mod_roster_odbc.erl +++ b/src/mod_roster_odbc.erl @@ -8,7 +8,6 @@ -module(mod_roster_odbc). -author('alexey@sevcom.net'). --vsn('$Revision$ '). -behaviour(gen_mod). @@ -126,10 +125,10 @@ get_user_roster(Acc, {LUser, LServer}) -> case catch ejabberd_odbc:sql_query( LServer, ["select username, jid, nick, subscription, ask, " - "server, subscribe, type from rosterusers " + "askmessage, server, subscribe, type from rosterusers " "where username='", Username, "'"]) of {selected, ["username", "jid", "nick", "subscription", "ask", - "server", "subscribe", "type"], + "askmessage", "server", "subscribe", "type"], Items} when is_list(Items) -> JIDGroups = case catch ejabberd_odbc:sql_query( LServer, @@ -216,11 +215,12 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) -> F = fun() -> {selected, ["username", "jid", "nick", "subscription", - "ask", "server", "subscribe", "type"], + "ask", "askmessage", "server", "subscribe", "type"], Res} = ejabberd_odbc:sql_query_t( ["select username, jid, nick, subscription, " - "ask, server, subscribe, type from rosterusers " + "ask, askmessage, server, subscribe, type " + "from rosterusers " "where username='", Username, "' " "and jid='", SJID, "'"]), Item = case Res of @@ -410,10 +410,10 @@ get_subscription_lists(_, User, Server) -> case catch ejabberd_odbc:sql_query( LServer, ["select username, jid, nick, subscription, ask, " - "server, subscribe, type from rosterusers " + "askmessage, server, subscribe, type from rosterusers " "where username='", Username, "'"]) of {selected, ["username", "jid", "nick", "subscription", "ask", - "server", "subscribe", "type"], + "askmessage", "server", "subscribe", "type"], Items} when is_list(Items) -> fill_subscription_lists(LServer, Items, [], []); _ -> @@ -458,12 +458,13 @@ process_subscription(Direction, User, Server, JID1, Type, Reason) -> Item = case ejabberd_odbc:sql_query_t( ["select username, jid, nick, subscription, ask, " - "server, subscribe, type from rosterusers " + "askmessage, server, subscribe, type " + "from rosterusers " "where username='", Username, "' " "and jid='", SJID, "';"]) of {selected, ["username", "jid", "nick", "subscription", "ask", - "server", "subscribe", "type"], + "askmessage", "server", "subscribe", "type"], [I]} -> R = raw_to_record(LServer, I), Groups = @@ -506,7 +507,7 @@ process_subscription(Direction, User, Server, JID1, Type, Reason) -> AskMessage = case NewState of {_, both} -> Reason; {_, in} -> Reason; - {_, _} -> [] + _ -> "" end, case NewState of none -> @@ -770,35 +771,47 @@ process_item_attrs_ws(Item, []) -> get_in_pending_subscriptions(Ls, User, Server) -> - JID = jlib:make_jid(User, Server,""), - case mnesia:dirty_index_read(roster, {User,Server}, #roster.us) of - Result when list(Result) -> + JID = jlib:make_jid(User, Server, ""), + LUser = JID#jid.luser, + LServer = JID#jid.lserver, + Username = ejabberd_odbc:escape(LUser), + case catch ejabberd_odbc:sql_query( + LServer, + ["select username, jid, nick, subscription, ask, " + "askmessage, server, subscribe, type from rosterusers " + "where username='", Username, "'"]) of + {selected, ["username", "jid", "nick", "subscription", "ask", + "askmessage", "server", "subscribe", "type"], + Items} when is_list(Items) -> Ls ++ lists:map( - fun(R) -> - Message = R#roster.askmessage, - Status = if is_binary(Message) -> - binary_to_list(Message); - true -> - [] - end, - {xmlelement, "presence", [{"from", jlib:jid_to_string(R#roster.jid)}, - {"to", jlib:jid_to_string(JID)}, - {"type", "subscribe"}], - [{xmlelement, "status", [], - [{xmlcdata, Status}]}]} - end, - lists:filter( - fun(R) -> - case R#roster.ask of - in -> true; - both -> true; - _ -> false - end - end, - Result)); - _ -> [] + fun(R) -> + Message = R#roster.askmessage, + Status = if is_binary(Message) -> + binary_to_list(Message); + true -> + "" + end, + {xmlelement, "presence", + [{"from", jlib:jid_to_string(R#roster.jid)}, + {"to", jlib:jid_to_string(JID)}, + {"type", "subscribe"}], + [{xmlelement, "status", [], + [{xmlcdata, Status}]}]} + end, + lists:flatmap( + fun(I) -> + R = raw_to_record(LServer, I), + case R#roster.ask of + in -> [R]; + both -> [R]; + _ -> [] + end + end, + Items)); + _ -> + Ls end. - + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -869,7 +882,7 @@ get_jid_info(_, User, Server, JID) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -raw_to_record(LServer, {User, SJID, Nick, SSubscription, SAsk, +raw_to_record(LServer, {User, SJID, Nick, SSubscription, SAsk, SAskMessage, _SServer, _SSubscribe, _SType}) -> case jlib:string_to_jid(SJID) of error -> @@ -895,7 +908,8 @@ raw_to_record(LServer, {User, SJID, Nick, SSubscription, SAsk, jid = LJID, name = Nick, subscription = Subscription, - ask = Ask} + ask = Ask, + askmessage = SAskMessage} end. record_to_string(#roster{us = {User, _Server}, diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 90bb3c00..e6b18c5a 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -8,7 +8,6 @@ -module(mod_shared_roster). -author('alexey@sevcom.net'). --vsn('$Revision: 24 $ '). -behaviour(gen_mod). @@ -16,7 +15,7 @@ get_user_roster/2, get_subscription_lists/3, get_jid_info/4, - in_subscription/5, + in_subscription/6, out_subscription/4, list_groups/1, create_group/2, @@ -148,7 +147,7 @@ get_jid_info({Subscription, Groups}, User, Server, JID) -> {Subscription, Groups} end. -in_subscription(Acc, User, Server, JID, Type) -> +in_subscription(Acc, User, Server, JID, Type, _Reason) -> process_subscription(in, User, Server, JID, Type, Acc). out_subscription(User, Server, JID, Type) -> diff --git a/src/odbc/pg.sql b/src/odbc/pg.sql index d115e1e5..a7059d50 100644 --- a/src/odbc/pg.sql +++ b/src/odbc/pg.sql @@ -18,7 +18,7 @@ CREATE TABLE rosterusers ( nick text, subscription character(1) NOT NULL, ask character(1) NOT NULL, - askmessage text, + askmessage text NOT NULL, server character(1) NOT NULL, subscribe text, "type" text @@ -99,4 +99,6 @@ CREATE INDEX i_vcard_search_lorgunit ON vcard_search(lorgunit); -- ALTER TABLE spool ALTER COLUMN seq SET NOT NULL; --- To update from 1.x: --- ALTER TABLE rosterusers ADD COLUMN askmessage text AFTER ask; +-- ALTER TABLE rosterusers ADD COLUMN askmessage text; +-- UPDATE rosterusers SET askmessage = ''; +-- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL; |