Changeset - c5bbc94ae7b2
[Not reviewed]
1 1 1
Chel Sea (chain) - 11 years ago 2014-03-26 10:32:42
chain@rpgfiction.net
bump remote roster to 2.1.13 (thanks to _vt@conference.spectrum.im)
3 files changed with 200 insertions and 223 deletions:
0 comments (0 inline, 0 general)
net-im/ejabberd/Manifest
Show inline comments
 
AUX e211bf522ecfa0f8177f20c5e7ff21a1a47f940b.patch 7137 SHA256 18773b66cf966f5f9771ce9424e436019bf33a4cff41f7c11163693232862f09 SHA512 4c9484c2c1e288f0e97d1c79d91dcf7242888229ad39c1e56c51e2146b062a2c5c1fbd5f69f3985077f1f89adaf5e1b645c1774ab5fff8d5ad807b6ed656c8e0 WHIRLPOOL 65de90da31182d1deead6c36750eb97d1ca054e07ca55345820b0fd0291b21d6646da75125a1cda479fe8be09475b1b800256f8b50e071c3ac17fa3cc049f087
 
AUX ejabberd-2.1.x-remote-roster.patch 12478 SHA256 7305d005385188d5a883b9259e05a00ca4a5e2a00e1cff420bb6d1bb31549b71 SHA512 be97f1885ac6cb3fe9f2db81e69bbf85dd86d4ecc57a2eb887b065e2932cb3f405d66a1bcbf9f8e5a4db49756fb24ae1d6a4008f6a3a16c68d0554d6c4a3e2ab WHIRLPOOL 95b024c102818fdf2b5768336b30b70cf8d4c81f8ea551e3605e8b311de865392c5784bc460e8dc75ea260fa8ad9b20a8611e2e16042d90a7ab3233401343853
 
AUX ejabberd-3.confd 161 SHA256 0296d3d281a321cd7380772c1d89a94e4a86f85b7f43bf9dc1af74935c2e6386 SHA512 07143642982df18461fdecd16daaad3baf6a06f8222d7a76757797c531be2803975ed60cc43aace24a624aa7c73bd8fdc6e023e739de492271b79e571f27c8fb WHIRLPOOL 657c44991244d58c10590093a7f58f654cb45cf7e22244b474459c63a449c17d0cf1d6f2d62008ddb34f0022f8fc9e31f22d2010cb3d1070a462bcb22a9a81fc
 
AUX ejabberd-3.initd 1018 SHA256 1c07fa02152b42bee44a8d1cd3f031596aeee37276ec4a36d765e3c54aa23075 SHA512 1142b4f1ca240f20603ca9a64819780ff4a1d9fbde2940fd1dab6cbca1d2de5108cf35aa00ff1c037dc72a778c6502521e3908c6cde5a39c4bb3c9fc1c70aceb WHIRLPOOL 59c15d4e7225c927768123cd93ebb0d1479c1ef500c179a8811eaa0db1d0d4562d7e3134fd02ffdeb866ca05e19e13570df419c6d51a7a7314cde4ef858c796e
 
DIST ejabberd-2.1.11.tgz 2014232 SHA256 91d5c10e64f9faa60c345c68304746f493d71f82723302955d40d6619e3d87de SHA512 6f09c80b03a84595294c679d49b5991985707f6c9e8c2f9fad94618224666e05b4325a5bef840d2ccf0c803038fc11b49b168716a3e258312216e201bdd4bb88 WHIRLPOOL 2ab09c84619173090acabf19cde10f14e3240fa6b89fb7d963bd79aca960b11a6f869f691d219c55b1b0a664c676afc800599671dfc923a0302d2075eec0e224
 
DIST ejabberd-2.1.12.tgz 1999224 SHA256 38f0825346773c00c85a66b33586c75f2d191d1eb0ed8ae09fa17368d6ddfd19 SHA512 725ab9563a6c73e85b5115f66bac157cf9b1170913c1bfed7cf066408c6b3ac5b4bdba22c6c3ed1505391a7048a86ce3b59484f78264ab023612c539422278db WHIRLPOOL 3de3b103f69b8ead3d68cb70f3073808c40cd9541f0fd97aff7173f3ecabf6755295e1c30de83e67c844dc6886a5c2cb55a26980f4275cb32008e922591ae35a
 
DIST ejabberd-2.1.13.tgz 1999853 SHA256 a80d1c72e435da31758261cb0c04fe750ac71fc3e33a3b606123efd3b3abc86d SHA512 9348271f0cf1d9a7e6c53204121568e77820afc50fff1271e7b7ef66c5c5d7d067034c46472250423c4e9052046b18c1c8178f09eda0b0bfe25a1eac465fd07b WHIRLPOOL 2c366d2f7c4371db56f47f5492ef27028a589186eeddb7a6b4e8aac0537b1b80ee31a9760f0551063ce2c2a658b9b5eafb7ed25294e00eb69480231a599a7b10
 
DIST ejabberd-mod_statsdx-1080.patch.gz 14024 SHA256 0f3a3a991c14d797e795ef4fffcf19aa9a54608f5053b759187ec7d3696b9edb SHA512 cdec93504501f60d01defe8634d2fe1ee900d78bd8d4568313b581d0e306144df50d3a8d2b724091bdb7c4a7f65c6bb4ebc4bd053ffdda7acb6512b92d1249cf WHIRLPOOL 881b776b6476319c81ae9bfea286baff1020f0b1acdc8437cf38105678f141eb5bd1cbb615326886cc0937db8039901c6ab5747b63b7934fca8356e96454a290
 
DIST ejabberd-mod_statsdx-1118.patch.gz 13989 SHA256 5e5d975e44248cf2b0d6dd0ecf4c477e8479b2b4d0bd531e80f4623fd787320e SHA512 99399323150990cda15e707385f0f26fa790d4ba188a97ac46daaaab9c25e72a7ec72a875573136f17a18648017074d76e4e267b544dc4c95a5101ed9ad6815d WHIRLPOOL 05997f03bb70136ee5e829ea9c55e3aeb0704150f1ed54f11c6cce382a82106129fc1a6ef35a62780837cd2b59fbb384fa10f3bb49813acaee8c5edc22ae3702
 
EBUILD ejabberd-2.1.11-r1.ebuild 8281 SHA256 4af64183b0642ec0cadfe9992f4636ed4c0b20ea33c8201daa7d0b7390b477dc SHA512 315d7d6387c3e6c131517d40e922b859dbfdaf4c73719292bf2a829abb4708075a006a0a206c81c048b6d2dce3c8cf2ba4419e6d10d76d695dd70a9b59df3074 WHIRLPOOL 79e239c4c1a66d38a61d61fba0cf6a495352651bccad27158f16af2ce36152100e8cbd1a24005b5691cee7841f4b892364b469d44f84531e8896c61fcc4f0d79
 
EBUILD ejabberd-2.1.12-r1.ebuild 8309 SHA256 3c567ada8db3be10e8853435a65bf8bf9c0f64b7949c4f381c7fccb83123b142 SHA512 7fdfc0548a4f01adb2c7f21595a81451e97a9088790efb640103e9131c243d859ad0ddc879eafcbe636abac6776426df1a1f118d5aeb530cc28ab16c164a9da9 WHIRLPOOL 25e77914fdd6a81fcf84b63470f31bd42dfabc5e154f857e15611a9fec4769e5b6a5d4770021d245c2564d78fa96c8a81d8080bc8cc442d5a4a030c73825e09e
 
EBUILD ejabberd-2.1.13-r2.ebuild 8643 SHA256 253d19a7e894c25e3b1e4c79c7688a19646713be65c5804ed7a3bdf5b194cf9b SHA512 f5975a63032c0c1301849f9fb8e87f7e673c416f171c34f450d8e0c0899eafa4e8a15fe41e06d506bd0f0508efe7391e890cdbf408d0da3aedd22bf0b717e13a WHIRLPOOL 0093931c6d53eb4b644f39a0e6aa92ec9d3d865df94197ea57dad04880038c9db70287e01169d0ecfb466a47287f6043716b8ffaee621947e1876a6dc1223e33
net-im/ejabberd/ejabberd-2.1.12-r1.ebuild
Show inline comments
 
deleted file
net-im/ejabberd/files/e211bf522ecfa0f8177f20c5e7ff21a1a47f940b.patch
Show inline comments
 
new file 100644
 
From e211bf522ecfa0f8177f20c5e7ff21a1a47f940b Mon Sep 17 00:00:00 2001
 
From: Badlop <badlop@process-one.net>
 
Date: Wed, 26 Feb 2014 18:01:47 +0100
 
Subject: [PATCH] Support XEP-0321: Remote Roster Management (EJAB-1381)
 

	
 
---
 
 doc/guide.tex      |  15 +++++++-
 
 src/mod_roster.erl | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 
 2 files changed, 109 insertions(+), 6 deletions(-)
 

	
 
diff --git a/doc/guide.tex b/doc/guide.tex
 
index 4656356..5d5bf2f 100644
 
--- a/doc/guide.tex
 
+++ b/doc/guide.tex
 
@@ -4052,15 +4052,28 @@
 
    not add/remove/modify contacts,
 
    or subscribe/unsubscribe presence.
 
    By default there aren't restrictions.
 
+ \titem{managers} \ind{options!managers}
 
+   List of remote entities that can manage users rosters using Remote Roster Management
 
+   (\xepref{0321}).
 
+   The protocol sections implemented are:
 
+   \term{4.2. The remote entity requests current user's roster}.
 
+   \term{4.3. The user updates roster}.
 
+   \term{4.4. The remote entity updates the user's roster}.
 
+   A remote entity cab only get or modify roster items that have the same domain as the entity.
 
+   Default value is: \term{[]}.
 
 \end{description}
 
 
 
-This example configuration enables Roster Versioning with storage of current id:
 
+This example configuration enables Roster Versioning with storage of current id.
 
+The ICQ and MSN transports can get ICQ and MSN contacts, add them, or remove them for any local account:
 
 \begin{verbatim}
 
 modules:
 
   ...
 
   mod_roster:
 
     versioning: true
 
     store_current_id: true
 
+    managers:
 
+     - "icq.example.org"
 
+     - "msn.example.org"
 
   ...
 
 \end{verbatim}
 
 
 
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
 
index 7415aa3..4851b8f 100644
 
--- a/src/mod_roster.erl
 
+++ b/src/mod_roster.erl
 
@@ -130,6 +130,9 @@ stop(Host) ->
 
     gen_iq_handler:remove_iq_handler(ejabberd_sm, Host,
 
 				     ?NS_ROSTER).
 
 
 
+process_iq(From, To, IQ) when ((From#jid.luser == <<"">>) andalso (From#jid.resource == <<"">>)) ->
 
+    process_iq_manager(From, To, IQ);
 
+
 
 process_iq(From, To, IQ) ->
 
     #iq{sub_el = SubEl} = IQ,
 
     #jid{lserver = LServer} = From,
 
@@ -465,15 +468,16 @@ try_process_iq_set(From, To, #iq{sub_el = SubEl} = IQ) ->
 
 	    process_iq_set(From, To, IQ)
 
     end.
 
 
 
-process_iq_set(From, To, #iq{sub_el = SubEl} = IQ) ->
 
+process_iq_set(From, To, #iq{sub_el = SubEl, id = Id} = IQ) ->
 
     #xmlel{children = Els} = SubEl,
 
-    lists:foreach(fun (El) -> process_item_set(From, To, El)
 
+    Managed = is_managed_from_id(Id),
 
+    lists:foreach(fun (El) -> process_item_set(From, To, El, Managed)
 
 		  end,
 
 		  Els),
 
     IQ#iq{type = result, sub_el = []}.
 
 
 
 process_item_set(From, To,
 
-		 #xmlel{attrs = Attrs, children = Els}) ->
 
+		 #xmlel{attrs = Attrs, children = Els}, Managed) ->
 
     JID1 = jlib:string_to_jid(xml:get_attr_s(<<"jid">>,
 
 					     Attrs)),
 
     #jid{user = User, luser = LUser, lserver = LServer} =
 
@@ -484,12 +488,13 @@ process_item_set(From, To,
 
 	  LJID = jlib:jid_tolower(JID1),
 
 	  F = fun () ->
 
 		      Item = get_roster_by_jid_t(LUser, LServer, LJID),
 
-		      Item1 = process_item_attrs(Item, Attrs),
 
+		      Item1 = process_item_attrs_managed(Item, Attrs, Managed),
 
 		      Item2 = process_item_els(Item1, Els),
 
 		      case Item2#roster.subscription of
 
 			remove -> del_roster_t(LUser, LServer, LJID);
 
 			_ -> update_roster_t(LUser, LServer, LJID, Item2)
 
 		      end,
 
+                      send_itemset_to_managers(From, Item2, Managed),
 
 		      Item3 = ejabberd_hooks:run_fold(roster_process_item,
 
 						      LServer, Item2,
 
 						      [LServer]),
 
@@ -511,7 +516,7 @@ process_item_set(From, To,
 
 		?DEBUG("ROSTER: roster item set error: ~p~n", [E]), ok
 
 	  end
 
     end;
 
-process_item_set(_From, _To, _) -> ok.
 
+process_item_set(_From, _To, _, _Managed) -> ok.
 
 
 
 process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
 
     case Attr of
 
@@ -1554,6 +1559,91 @@ webadmin_user(Acc, _User, _Server, Lang) ->
 
     Acc ++
 
       [?XE(<<"h3">>, [?ACT(<<"roster/">>, <<"Roster">>)])].
 
 
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+
 
+%% Implement XEP-0321 Remote Roster Management
 
+
 
+process_iq_manager(From, To, IQ) ->
 
+    %% Check what access is allowed for From to To
 
+    MatchDomain = From#jid.lserver,
 
+    case is_domain_managed(MatchDomain, To#jid.lserver) of
 
+	true ->
 
+	    process_iq_manager2(MatchDomain, To, IQ);
 
+	false ->
 
+	    #iq{sub_el = SubEl} = IQ,
 
+	    IQ#iq{type = error, sub_el = [SubEl, ?ERR_BAD_REQUEST]}
 
+    end.
 
+
 
+process_iq_manager2(MatchDomain, To, IQ) ->
 
+    %% If IQ is SET, filter the input IQ
 
+    IQFiltered = maybe_filter_request(MatchDomain, IQ),
 
+    %% Call the standard function with reversed JIDs
 
+    IdInitial = IQFiltered#iq.id,
 
+    ResIQ = process_iq(To, To, IQFiltered#iq{id = <<"roster-remotely-managed">>}),
 
+    %% Filter the output IQ
 
+    filter_stanza(MatchDomain, ResIQ#iq{id = IdInitial}).
 
+
 
+is_domain_managed(ContactHost, UserHost) ->
 
+    Managers = gen_mod:get_module_opt(UserHost, ?MODULE, managers,
 
+						fun(B) when is_list(B) -> B end,
 
+						[]),
 
+    lists:member(ContactHost, Managers).
 
+
 
+maybe_filter_request(MatchDomain, IQ) when IQ#iq.type == set ->
 
+    filter_stanza(MatchDomain, IQ);
 
+maybe_filter_request(_MatchDomain, IQ) ->
 
+    IQ.
 
+
 
+filter_stanza(_MatchDomain, #iq{sub_el = []} = IQ) ->
 
+    IQ;
 
+filter_stanza(MatchDomain, #iq{sub_el = [SubEl | _]} = IQ) ->
 
+    #iq{sub_el = SubElFiltered} = IQRes =
 
+	filter_stanza(MatchDomain, IQ#iq{sub_el = SubEl}),
 
+    IQRes#iq{sub_el = [SubElFiltered]};
 
+filter_stanza(MatchDomain, #iq{sub_el = SubEl} = IQ) ->
 
+    #xmlel{name = Type, attrs = Attrs, children = Items} = SubEl,
 
+    ItemsFiltered = lists:filter(
 
+		      fun(Item) ->
 
+			      is_item_of_domain(MatchDomain, Item) end, Items),
 
+    SubElFiltered = #xmlel{name=Type, attrs = Attrs, children = ItemsFiltered},
 
+    IQ#iq{sub_el = SubElFiltered}.
 
+
 
+is_item_of_domain(MatchDomain, #xmlel{} = El) ->
 
+    lists:any(fun(Attr) -> is_jid_of_domain(MatchDomain, Attr) end, El#xmlel.attrs);
 
+is_item_of_domain(_MatchDomain, {xmlcdata, _}) ->
 
+    false.
 
+
 
+is_jid_of_domain(MatchDomain, {<<"jid">>, JIDString}) ->
 
+    case jlib:string_to_jid(JIDString) of
 
+	JID when JID#jid.lserver == MatchDomain -> true;
 
+	_ -> false
 
+    end;
 
+is_jid_of_domain(_, _) ->
 
+    false.
 
+
 
+process_item_attrs_managed(Item, Attrs, true) ->
 
+    process_item_attrs_ws(Item, Attrs);
 
+process_item_attrs_managed(Item, _Attrs, false) ->
 
+    process_item_attrs(Item, _Attrs).
 
+
 
+send_itemset_to_managers(_From, _Item, true) ->
 
+    ok;
 
+send_itemset_to_managers(From, Item, false) ->
 
+    {_, UserHost} = Item#roster.us,
 
+    {_ContactUser, ContactHost, _ContactResource} = Item#roster.jid,
 
+    %% Check if the component is an allowed manager
 
+    IsManager = is_domain_managed(ContactHost, UserHost),
 
+    case IsManager of
 
+	true -> push_item(<<"">>, ContactHost, <<"">>, From, Item);
 
+	false -> ok
 
+    end.
 
+
 
+is_managed_from_id(<<"roster-remotely-managed">>) ->
 
+    true;
 
+is_managed_from_id(_Id) ->
 
+    false.
 
+
 
+
 
 export(_Server) ->
 
     [{roster,
 
       fun(Host, #roster{usj = {LUser, LServer, LJID}} = R)
 
-- 
 
1.8.5.5
 

	
0 comments (0 inline, 0 general)