24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-28 22:52:27 +02:00

Fix multiple bugs in ODBC mods.

PR:		EJABP-1
Submitted by:	Pablo Polvorin <pablo.polvorin@process-one.net>

SVN Revision: 1589
This commit is contained in:
Jean-Sébastien Pédron 2008-10-01 09:41:57 +00:00
parent ddcb94649d
commit 2309f9b8bc
4 changed files with 102 additions and 72 deletions

View File

@ -1,3 +1,9 @@
2008-10-01 Jean-Sébastien Pédron <js.pedron@meetic-corp.com>
* src/mod_offline_odbc.erl, src/mod_vcard_odbc.erl,
src/mod_roster_odbc.erl: Fix multiple bugs in ODBC mods, thanks to
Pablo Polvorin!
2008-09-29 Jean-Sébastien Pédron <js.pedron@meetic-corp.com> 2008-09-29 Jean-Sébastien Pédron <js.pedron@meetic-corp.com>
* src/jlib.erl (parse_xdata_submit, parse_xdata_fields): Fix a bug * src/jlib.erl (parse_xdata_submit, parse_xdata_fields): Fix a bug

View File

@ -103,16 +103,16 @@ loop(Host, MaxOfflineMsgs) ->
From = M#offline_msg.from, From = M#offline_msg.from,
To = M#offline_msg.to, To = M#offline_msg.to,
Packet0 = exmpp_stanza:set_jids( Packet0 = exmpp_stanza:set_jids(
M#offline_msg.packet,
From, From,
To, To),
M#offline_msg.packet),
Packet1 = exmpp_xml:append_child(Packet0, Packet1 = exmpp_xml:append_child(Packet0,
jlib:timestamp_to_xml( jlib:timestamp_to_xml(
calendar:now_to_universal_time( calendar:now_to_universal_time(
M#offline_msg.timestamp))), M#offline_msg.timestamp))),
XML = XML =
ejabberd_odbc:escape( ejabberd_odbc:escape(
exmpp_xml:document_to_string(Packet1)), exmpp_xml:document_to_list(Packet1)),
odbc_queries:add_spool_sql(Username, XML) odbc_queries:add_spool_sql(Username, XML)
end, Msgs), end, Msgs),
case catch odbc_queries:add_spool(Host, Query) of case catch odbc_queries:add_spool(Host, Query) of
@ -156,7 +156,7 @@ stop(Host) ->
ok. ok.
store_packet(From, To, Packet) -> store_packet(From, To, Packet) ->
Type = exmpp_stanza_:get_type(Packet, 'type'), Type = exmpp_stanza:get_type(Packet),
if if
(Type /= "error") and (Type /= "groupchat") and (Type /= "error") and (Type /= "groupchat") and
(Type /= "headline") -> (Type /= "headline") ->
@ -237,6 +237,7 @@ find_x_expire(TimeStamp, [_ | Els]) ->
pop_offline_messages(Ls, User, Server) -> pop_offline_messages(Ls, User, Server) ->
try
LUser = exmpp_stringprep:nodeprep(User), LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server), LServer = exmpp_stringprep:nameprep(Server),
EUser = ejabberd_odbc:escape(LUser), EUser = ejabberd_odbc:escape(LUser),
@ -245,7 +246,7 @@ pop_offline_messages(Ls, User, Server) ->
Ls ++ lists:flatmap( Ls ++ lists:flatmap(
fun({_, XML}) -> fun({_, XML}) ->
try try
[El] = exmpp_xml:parse_document(XML, [namespace, name_as_atom]), [El] = exmpp_xml:parse_document(XML, [namespace, name_as_atom, autoload_known]),
To = exmpp_jid:list_to_jid( To = exmpp_jid:list_to_jid(
exmpp_stanza:get_recipient(El)), exmpp_stanza:get_recipient(El)),
From = exmpp_jid:list_to_jid( From = exmpp_jid:list_to_jid(
@ -258,14 +259,23 @@ pop_offline_messages(Ls, User, Server) ->
end, Rs); end, Rs);
_ -> _ ->
Ls Ls
end
catch
_ ->
[]
end. end.
remove_user(User, Server) -> remove_user(User, Server) ->
try
LUser = exmpp_stringprep:nodeprep(User), LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server), LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser), Username = ejabberd_odbc:escape(LUser),
odbc_queries:del_spool_msg(LServer, Username). odbc_queries:del_spool_msg(LServer, Username)
catch
_ ->
ok
end.
%% Helper functions: %% Helper functions:
@ -298,12 +308,13 @@ webadmin_page(_, Host,
webadmin_page(Acc, _, _) -> Acc. webadmin_page(Acc, _, _) -> Acc.
user_queue(User, Server, Query, Lang) -> user_queue(User, Server, Query, Lang) ->
{US, Msgs, Res} = try
LUser = exmpp_stringprep:nodeprep(User), LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server), LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser), Username = ejabberd_odbc:escape(LUser),
US = {LUser, LServer}, US0 = {LUser, LServer},
Res = user_queue_parse_query(Username, LServer, Query), R = user_queue_parse_query(Username, LServer, Query),
Msgs = case catch ejabberd_odbc:sql_query( M = case catch ejabberd_odbc:sql_query(
LServer, LServer,
["select username, xml from spool" ["select username, xml from spool"
" where username='", Username, "'" " where username='", Username, "'"
@ -311,7 +322,7 @@ user_queue(User, Server, Query, Lang) ->
{selected, ["username", "xml"], Rs} -> {selected, ["username", "xml"], Rs} ->
lists:flatmap( lists:flatmap(
fun({_, XML}) -> fun({_, XML}) ->
try exmpp_xml:parse_document(XML, [namespace, name_as_atom]) of try exmpp_xml:parse_document(XML, [namespace, name_as_atom, autoload_known]) of
[El] -> [El] ->
[El] [El]
catch catch
@ -322,6 +333,11 @@ user_queue(User, Server, Query, Lang) ->
_ -> _ ->
[] []
end, end,
{US0, M, R}
catch
_ ->
{{"invalid", "invalid"}, [], nothing}
end,
FMsgs = FMsgs =
lists:map( lists:map(
fun(#xmlel{} = Msg) -> fun(#xmlel{} = Msg) ->
@ -373,7 +389,7 @@ user_queue_parse_query(Username, LServer, Query) ->
{selected, ["xml", "seq"], Rs} -> {selected, ["xml", "seq"], Rs} ->
lists:flatmap( lists:flatmap(
fun({XML, Seq}) -> fun({XML, Seq}) ->
try exmpp_xml:parse_document(XML, [namespace, name_as_atom]) of try exmpp_xml:parse_document(XML, [namespace, name_as_atom, autoload_known]) of
[El] -> [El] ->
[{El, Seq}] [{El, Seq}]
catch catch
@ -412,6 +428,7 @@ us_to_list({User, Server}) ->
exmpp_jid:jid_to_list(User, Server). exmpp_jid:jid_to_list(User, Server).
webadmin_user(Acc, User, Server, Lang) -> webadmin_user(Acc, User, Server, Lang) ->
FQueueLen = try
LUser = exmpp_stringprep:nodeprep(User), LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server), LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser), Username = ejabberd_odbc:escape(LUser),
@ -424,7 +441,11 @@ webadmin_user(Acc, User, Server, Lang) ->
_ -> _ ->
0 0
end, end,
FQueueLen = [?AC("queue/", QueueLen)], [?AC("queue/", QueueLen)]
catch
_ ->
[?C("?")]
end,
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen. Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen.
%% ------------------------------------------------ %% ------------------------------------------------

View File

@ -835,7 +835,7 @@ record_to_string(#roster{us = {User, _Server},
ask = Ask, ask = Ask,
askmessage = AskMessage}) -> askmessage = AskMessage}) ->
Username = ejabberd_odbc:escape(User), Username = ejabberd_odbc:escape(User),
{U, S, R} = jlib:short_prepd_jid(JID), {U, S, R} = JID,
SJID = ejabberd_odbc:escape(exmpp_jid:jid_to_list(U, S, R)), SJID = ejabberd_odbc:escape(exmpp_jid:jid_to_list(U, S, R)),
Nick = ejabberd_odbc:escape(Name), Nick = ejabberd_odbc:escape(Name),
SSubscription = case Subscription of SSubscription = case Subscription of
@ -865,7 +865,7 @@ groups_to_string(#roster{us = {User, _Server},
jid = JID, jid = JID,
groups = Groups}) -> groups = Groups}) ->
Username = ejabberd_odbc:escape(User), Username = ejabberd_odbc:escape(User),
{U, S, R} = jlib:short_prepd_jid(JID), {U, S, R} = JID,
SJID = ejabberd_odbc:escape(exmpp_jid:jid_to_list(U, S, R)), SJID = ejabberd_odbc:escape(exmpp_jid:jid_to_list(U, S, R)),
%% Empty groups do not need to be converted to string to be inserted in %% Empty groups do not need to be converted to string to be inserted in

View File

@ -136,11 +136,14 @@ process_sm_iq(_From, To, #iq{type = get} = IQ_Rec) ->
["select vcard from vcard " ["select vcard from vcard "
"where username='", Username, "';"]) of "where username='", Username, "';"]) of
{selected, ["vcard"], [{SVCARD}]} -> {selected, ["vcard"], [{SVCARD}]} ->
case exmpp_xml:parse_document(SVCARD) of try exmpp_xml:parse_document(SVCARD,
{error, _Reason} -> [namespace, name_as_atom, autoload_known]) of
exmpp_iq:error(IQ_Rec, 'service-unavailable'); [VCARD] ->
VCARD ->
exmpp_iq:result(IQ_Rec, VCARD) exmpp_iq:result(IQ_Rec, VCARD)
catch
_Type:_Error ->
?ERROR_MSG("Error parsing vCard: ~s", [SVCARD]),
exmpp_iq:error(IQ_Rec, 'service-unavailable')
end; end;
{selected, ["vcard"], []} -> {selected, ["vcard"], []} ->
exmpp_iq:result(IQ_Rec); exmpp_iq:result(IQ_Rec);