24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-20 22:22:09 +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>
* 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,
To = M#offline_msg.to,
Packet0 = exmpp_stanza:set_jids(
M#offline_msg.packet,
From,
To,
M#offline_msg.packet),
To),
Packet1 = exmpp_xml:append_child(Packet0,
jlib:timestamp_to_xml(
calendar:now_to_universal_time(
M#offline_msg.timestamp))),
XML =
ejabberd_odbc:escape(
exmpp_xml:document_to_string(Packet1)),
exmpp_xml:document_to_list(Packet1)),
odbc_queries:add_spool_sql(Username, XML)
end, Msgs),
case catch odbc_queries:add_spool(Host, Query) of
@ -156,7 +156,7 @@ stop(Host) ->
ok.
store_packet(From, To, Packet) ->
Type = exmpp_stanza_:get_type(Packet, 'type'),
Type = exmpp_stanza:get_type(Packet),
if
(Type /= "error") and (Type /= "groupchat") and
(Type /= "headline") ->
@ -237,35 +237,45 @@ find_x_expire(TimeStamp, [_ | Els]) ->
pop_offline_messages(Ls, User, Server) ->
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
EUser = ejabberd_odbc:escape(LUser),
case odbc_queries:get_and_del_spool_msg_t(LServer, EUser) of
{atomic, {selected, ["username","xml"], Rs}} ->
Ls ++ lists:flatmap(
fun({_, XML}) ->
try
[El] = exmpp_xml:parse_document(XML, [namespace, name_as_atom]),
To = exmpp_jid:list_to_jid(
exmpp_stanza:get_recipient(El)),
From = exmpp_jid:list_to_jid(
exmpp_stanza:get_sender(El)),
[{route, From, To, El}]
catch
_ ->
[]
end
end, Rs);
try
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
EUser = ejabberd_odbc:escape(LUser),
case odbc_queries:get_and_del_spool_msg_t(LServer, EUser) of
{atomic, {selected, ["username","xml"], Rs}} ->
Ls ++ lists:flatmap(
fun({_, XML}) ->
try
[El] = exmpp_xml:parse_document(XML, [namespace, name_as_atom, autoload_known]),
To = exmpp_jid:list_to_jid(
exmpp_stanza:get_recipient(El)),
From = exmpp_jid:list_to_jid(
exmpp_stanza:get_sender(El)),
[{route, From, To, El}]
catch
_ ->
[]
end
end, Rs);
_ ->
Ls
end
catch
_ ->
Ls
[]
end.
remove_user(User, Server) ->
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
odbc_queries:del_spool_msg(LServer, Username).
try
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
odbc_queries:del_spool_msg(LServer, Username)
catch
_ ->
ok
end.
%% Helper functions:
@ -298,30 +308,36 @@ webadmin_page(_, Host,
webadmin_page(Acc, _, _) -> Acc.
user_queue(User, Server, Query, Lang) ->
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
US = {LUser, LServer},
Res = user_queue_parse_query(Username, LServer, Query),
Msgs = case catch ejabberd_odbc:sql_query(
LServer,
["select username, xml from spool"
" where username='", Username, "'"
" order by seq;"]) of
{selected, ["username", "xml"], Rs} ->
lists:flatmap(
fun({_, XML}) ->
try exmpp_xml:parse_document(XML, [namespace, name_as_atom]) of
[El] ->
[El]
catch
_ ->
[]
end
end, Rs);
_ ->
[]
end,
{US, Msgs, Res} = try
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
US0 = {LUser, LServer},
R = user_queue_parse_query(Username, LServer, Query),
M = case catch ejabberd_odbc:sql_query(
LServer,
["select username, xml from spool"
" where username='", Username, "'"
" order by seq;"]) of
{selected, ["username", "xml"], Rs} ->
lists:flatmap(
fun({_, XML}) ->
try exmpp_xml:parse_document(XML, [namespace, name_as_atom, autoload_known]) of
[El] ->
[El]
catch
_ ->
[]
end
end, Rs);
_ ->
[]
end,
{US0, M, R}
catch
_ ->
{{"invalid", "invalid"}, [], nothing}
end,
FMsgs =
lists:map(
fun(#xmlel{} = Msg) ->
@ -373,7 +389,7 @@ user_queue_parse_query(Username, LServer, Query) ->
{selected, ["xml", "seq"], Rs} ->
lists:flatmap(
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, Seq}]
catch
@ -412,19 +428,24 @@ us_to_list({User, Server}) ->
exmpp_jid:jid_to_list(User, Server).
webadmin_user(Acc, User, Server, Lang) ->
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
QueueLen = case catch ejabberd_odbc:sql_query(
LServer,
["select count(*) from spool"
" where username='", Username, "';"]) of
{selected, [_], [{SCount}]} ->
SCount;
_ ->
0
end,
FQueueLen = [?AC("queue/", QueueLen)],
FQueueLen = try
LUser = exmpp_stringprep:nodeprep(User),
LServer = exmpp_stringprep:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
QueueLen = case catch ejabberd_odbc:sql_query(
LServer,
["select count(*) from spool"
" where username='", Username, "';"]) of
{selected, [_], [{SCount}]} ->
SCount;
_ ->
0
end,
[?AC("queue/", QueueLen)]
catch
_ ->
[?C("?")]
end,
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen.
%% ------------------------------------------------

View File

@ -835,7 +835,7 @@ record_to_string(#roster{us = {User, _Server},
ask = Ask,
askmessage = AskMessage}) ->
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)),
Nick = ejabberd_odbc:escape(Name),
SSubscription = case Subscription of
@ -865,7 +865,7 @@ groups_to_string(#roster{us = {User, _Server},
jid = JID,
groups = Groups}) ->
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)),
%% 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 "
"where username='", Username, "';"]) of
{selected, ["vcard"], [{SVCARD}]} ->
case exmpp_xml:parse_document(SVCARD) of
{error, _Reason} ->
exmpp_iq:error(IQ_Rec, 'service-unavailable');
VCARD ->
try exmpp_xml:parse_document(SVCARD,
[namespace, name_as_atom, autoload_known]) of
[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;
{selected, ["vcard"], []} ->
exmpp_iq:result(IQ_Rec);