From 50f35f1b0747ba9616392b9f8011b68cda7bfa5b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 26 Apr 2015 16:22:09 +0200 Subject: [PATCH 1/3] Fix service disco handling for bare account JIDs Don't swap the sending and receiving JIDs while checking whether the client that requested service discovery information for a bare account JID is a subscribed contact. --- src/mod_disco.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 40f0f8e06..4231df68d 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -357,13 +357,13 @@ is_presence_subscribed(#jid{luser = User, #jid{luser = LUser, lserver = LServer}) -> lists:any(fun (#roster{jid = {TUser, TServer, _}, subscription = S}) -> - if LUser == TUser, LServer == TServer, S /= none -> + if User == TUser, Server == TServer, S /= none -> true; true -> false end end, - ejabberd_hooks:run_fold(roster_get, Server, [], - [{User, Server}])) + ejabberd_hooks:run_fold(roster_get, LServer, [], + [{LUser, LServer}])) orelse User == LUser andalso Server == LServer. process_sm_iq_info(From, To, From 0edba763fbcef233c2fe7b5b33895fac370226c8 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 26 Apr 2015 16:32:03 +0200 Subject: [PATCH 2/3] mod_disco: Omit 'roster_get' call if possible As a small optimization, avoid running the 'roster_get' hook in the (common) case where a client requests service discovery information for its own bare JID. --- src/mod_disco.erl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 4231df68d..724b9b957 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -352,6 +352,9 @@ get_sm_items(empty, From, To, _Node, _Lang) -> _ -> {error, ?ERR_NOT_ALLOWED} end. +is_presence_subscribed(#jid{luser = User, + lserver = Server}, + #jid{luser = User, lserver = Server}) -> true; is_presence_subscribed(#jid{luser = User, lserver = Server}, #jid{luser = LUser, lserver = LServer}) -> @@ -363,8 +366,7 @@ is_presence_subscribed(#jid{luser = User, end end, ejabberd_hooks:run_fold(roster_get, LServer, [], - [{LUser, LServer}])) - orelse User == LUser andalso Server == LServer. + [{LUser, LServer}])). process_sm_iq_info(From, To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) -> From dc449687a01c9e874f3f8f8e8d3d5cd1c8c5f422 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sun, 26 Apr 2015 16:36:17 +0200 Subject: [PATCH 3/3] mod_disco: Apply minor readability improvements --- src/mod_disco.erl | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 724b9b957..00b65d23e 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -352,21 +352,19 @@ get_sm_items(empty, From, To, _Node, _Lang) -> _ -> {error, ?ERR_NOT_ALLOWED} end. -is_presence_subscribed(#jid{luser = User, - lserver = Server}, +is_presence_subscribed(#jid{luser = User, lserver = Server}, #jid{luser = User, lserver = Server}) -> true; -is_presence_subscribed(#jid{luser = User, - lserver = Server}, - #jid{luser = LUser, lserver = LServer}) -> - lists:any(fun (#roster{jid = {TUser, TServer, _}, - subscription = S}) -> - if User == TUser, Server == TServer, S /= none -> - true; - true -> false - end +is_presence_subscribed(#jid{luser = FromUser, lserver = FromServer}, + #jid{luser = ToUser, lserver = ToServer}) -> + lists:any(fun (#roster{jid = {SubUser, SubServer, _}, subscription = Sub}) + when FromUser == SubUser, FromServer == SubServer, + Sub /= none -> + true; + (_RosterEntry) -> + false end, - ejabberd_hooks:run_fold(roster_get, LServer, [], - [{LUser, LServer}])). + ejabberd_hooks:run_fold(roster_get, ToServer, [], + [{ToUser, ToServer}])). process_sm_iq_info(From, To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) ->