diff --git a/net-im/ejabberd/Manifest b/net-im/ejabberd/Manifest index 51b2e60267a1324f38791d4cc92e2f1dba681916..81f19cb57fe8e2d2d6c16296beb9d7d9cd96e8c9 100644 --- a/net-im/ejabberd/Manifest +++ b/net-im/ejabberd/Manifest @@ -1,9 +1,10 @@ +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 diff --git a/net-im/ejabberd/ejabberd-2.1.12-r1.ebuild b/net-im/ejabberd/ejabberd-2.1.12-r1.ebuild deleted file mode 100644 index 02b010b4b69a66525743b384aece77da777dbdb6..0000000000000000000000000000000000000000 --- a/net-im/ejabberd/ejabberd-2.1.12-r1.ebuild +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 1999-2013 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/net-im/ejabberd/ejabberd-2.1.12.ebuild,v 1.4 2013/05/14 09:42:10 ago Exp $ - -EAPI=5 - -inherit eutils multilib pam ssl-cert - -DESCRIPTION="The Erlang Jabber Daemon" -HOMEPAGE="http://www.ejabberd.im/ https://github.com/processone/ejabberd/" -SRC_URI="http://www.process-one.net/downloads/${PN}/${PV}/${P}.tgz - mod_statsdx? ( http://dev.gentoo.org/~radhermit/dist/${PN}-mod_statsdx-1118.patch.gz )" - -LICENSE="GPL-2" -SLOT="0" -KEYWORDS="~amd64 ~arm ~ia64 ppc ~sparc ~x86" -EJABBERD_MODULES="mod_irc mod_muc mod_proxy65 mod_pubsub mod_statsdx" -IUSE="captcha debug ldap odbc pam remoteroster +web zlib ${EJABBERD_MODULES}" - -DEPEND=">=net-im/jabber-base-0.01 - >=dev-libs/expat-1.95 - >=dev-lang/erlang-12.2.5[ssl] - odbc? ( dev-db/unixODBC ) - ldap? ( =net-nds/openldap-2* ) - >=dev-libs/openssl-0.9.8e - captcha? ( media-gfx/imagemagick[truetype,png] ) - zlib? ( sys-libs/zlib )" -#>=sys-apps/shadow-4.1.4.2-r3 - fixes bug in su that made ejabberdctl unworkable. -RDEPEND="${DEPEND} - >=sys-apps/shadow-4.1.4.2-r3 - pam? ( virtual/pam )" - -S=${WORKDIR}/${P}/src - -# paths in net-im/jabber-base -JABBER_ETC="${EPREFIX}/etc/jabber" -#JABBER_RUN="/var/run/jabber" -JABBER_SPOOL="${EPREFIX}/var/spool/jabber" -JABBER_LOG="${EPREFIX}/var/log/jabber" -JABBER_DOC="${EPREFIX}/usr/share/doc/${PF}" - -src_prepare() { - if use mod_statsdx; then - ewarn "mod_statsdx is not a part of upstream tarball but is a third-party module" - ewarn "taken from here: http://www.ejabberd.im/mod_stats2file" - EPATCH_OPTS="-p2" epatch "${WORKDIR}"/${PN}-mod_statsdx-1118.patch - fi - - if use remoteroster; then - ewarn "Remote roster has not yet been accepted for consideration or" - ewarn "approved in any official manner by the XMPP Standards Foundation," - ewarn "and is not yet an XMPP Extension Protocol (XEP)." - EPATCH_OPTS="-d ${WORKDIR}/${P}" epatch "${FILESDIR}/ejabberd-2.1.x-remote-roster.patch" - fi - - # don't install release notes (we'll do this manually) - sed '/install .* [.][.]\/doc\/[*][.]txt $(DOCDIR)/d' -i Makefile.in || die - # Set correct paths - sed -e "/^EJABBERDDIR[[:space:]]*=/{s:ejabberd:${PF}:}" \ - -e "/^ETCDIR[[:space:]]*=/{s:@sysconfdir@/ejabberd:${JABBER_ETC}:}" \ - -e "/^LOGDIR[[:space:]]*=/{s:@localstatedir@/log/ejabberd:${JABBER_LOG}:}" \ - -e "/^SPOOLDIR[[:space:]]*=/{s:@localstatedir@/lib/ejabberd:${JABBER_SPOOL}:}" \ - -i Makefile.in || die - sed -e "/EJABBERDDIR=/{s:ejabberd:${PF}:}" \ - -e "s|\(ETCDIR=\)@SYSCONFDIR@.*|\1${JABBER_ETC}|" \ - -e "s|\(LOGS_DIR=\)@LOCALSTATEDIR@.*|\1${JABBER_LOG}|" \ - -e "s|\(SPOOLDIR=\)@LOCALSTATEDIR@.*|\1${JABBER_SPOOL}|" \ - -i ejabberdctl.template || die - - # Set shell, so it'll work even in case jabber user have no shell - # This is gentoo specific I guess since other distributions may have - # ejabberd user with reall shell, while we share this user among different - # jabberd implementations. - sed '/^HOME/aSHELL=/bin/sh' -i ejabberdctl.template || die - sed '/^export HOME/aexport SHELL' -i ejabberdctl.template || die - - #sed -e "s:/share/doc/ejabberd/:${JABBER_DOC}:" -i web/ejabberd_web_admin.erl - - # fix up the ssl cert paths in ejabberd.cfg to use our cert - sed -e "s:/path/to/ssl.pem:/etc/ssl/ejabberd/server.pem:g" \ - -i ejabberd.cfg.example || die "Failed sed ejabberd.cfg.example" - - # correct path to captcha script in default ejabberd.cfg - sed -e 's|\({captcha_cmd,[[:space:]]*"\).\+"}|\1/usr/'$(get_libdir)'/erlang/lib/'${P}'/priv/bin/captcha.sh"}|' \ - -i ejabberd.cfg.example || die "Failed sed ejabberd.cfg.example" - - # disable mod_irc in ejabberd.cfg - if ! use mod_irc; then - sed -i -e "s/{mod_irc,/%{mod_irc,/" \ - -i ejabberd.cfg.example || die "Failed to disable mod_irc" - fi - -} - -src_configure() { - econf \ - --docdir="${EPREFIX}/usr/share/doc/${PF}/html" \ - --libdir="${EPREFIX}/usr/$(get_libdir)/erlang/lib/" \ - $(use_enable mod_irc) \ - $(use_enable ldap eldap) \ - $(use_enable mod_muc) \ - $(use_enable mod_proxy65) \ - $(use_enable mod_pubsub) \ - $(use_enable web) \ - $(use_enable odbc) \ - $(use_enable zlib ejabberd_zlib) \ - $(use_enable pam) \ - --enable-user=jabber -} - -src_compile() { - emake $(use debug && echo debug=true ejabberd_debug=true) -} - -src_install() { - default - - # Pam helper module permissions - # http://www.process-one.net/docs/ejabberd/guide_en.html - if use pam; then - pamd_mimic_system xmpp auth account || die "Cannot create pam.d file" - fowners root:jabber "/usr/$(get_libdir)/erlang/lib/${PF}/priv/bin/epam" - fperms 4750 "/usr/$(get_libdir)/erlang/lib/${PF}/priv/bin/epam" - fi - - cd "${WORKDIR}/${P}/doc" - dodoc "release_notes_${PV%%_rc*}.txt" - - #dodir /var/lib/ejabberd - newinitd "${FILESDIR}/${PN}-3.initd" ${PN} - newconfd "${FILESDIR}/${PN}-3.confd" ${PN} -} - -pkg_postinst() { - elog "For configuration instructions, please see" - elog "/usr/share/doc/${PF}/html/guide.html, or the online version at" - elog "http://www.process-one.net/en/ejabberd/docs/guide_en/" - - if ! use web ; then - ewarn - ewarn "The web USE flag is off, this has disabled the web admin interface." - ewarn - fi - - elog - elog '====================================================================' - elog 'Quick Start Guide:' - elog '1) Add output of `hostname -f` to /etc/jabber/ejabberd.cfg line 91' - elog ' {hosts, ["localhost", "thehost"]}.' - elog '2) Add an admin user to /etc/jabber/ejabberd.cfg line 360' - elog ' {acl, admin, {user, "theadmin", "thehost"}}.' - elog '3) Start the server' - elog ' # /etc/init.d/ejabberd start' - elog '4) Register the admin user' - elog ' # /usr/sbin/ejabberdctl register theadmin thehost thepassword' - elog '5) Log in with your favourite jabber client or using the web admin' - - # Upgrading from ejabberd-2.0.x: - if grep -E '^[^#]*EJABBERD_NODE=' "${EROOT}/etc/conf.d/ejabberd" >/dev/null 2>&1; then - source "${EROOT}/etc/conf.d/ejabberd" - ewarn - ewarn "!!! WARNING !!! WARNING !!! WARNING !!! WARNING !!!" - ewarn "Starting with 2.1.x some paths and configuration files were" - ewarn "changed to reflect upstream intentions better. Notable changes are:" - ewarn - ewarn "1. Everything (even init scripts) is now handled with ejabberdctl script." - ewarn "Thus main configuration file became /etc/jabberd/ejabberdctl.cfg" - ewarn "You must update ERLANG_NODE there with the value of EJABBERD_NODE" - ewarn "from /etc/conf.d/ejebberd or ejabberd will refuse to start." - ewarn - ewarn "2. SSL certificate is now generated with ssl-cert eclass and resides" - ewarn "at standard location: /etc/ssl/ejabberd/server.pem." - ewarn - ewarn "3. Cookie now resides at /var/spool/jabber/.erlang.cookie" - ewarn - ewarn "4. /var/log/jabber/sasl.log is now /var/log/jabber/erlang.log" - ewarn - ewarn "5. Crash dumps (if any) will be located at /var/log/jabber" - - local i ctlcfg new_ctlcfg - i=0 - ctlcfg=${EROOT}/etc/jabber/ejabberdctl.cfg - while :; do - new_ctlcfg=$(printf "${EROOT}/etc/jabber/._cfg%04d_ejabberdctl.cfg" ${i}) - [[ ! -e ${new_ctlcfg} ]] && break - ctlcfg=${new_ctlcfg} - ((i++)) - done - - ewarn - ewarn "Updating ${ctlcfg} (debug: ${new_ctlcfg})" - sed -e "/#ERLANG_NODE=/aERLANG_NODE=$EJABBERD_NODE" "${ctlcfg}" > "${new_ctlcfg}" || die - - if [[ -e ${EROOT}/var/run/jabber/.erlang.cookie ]]; then - ewarn "Moving .erlang.cookie..." - if [[ -e ${EROOT}/var/spool/jabber/.erlang.cookie ]]; then - mv -v "${EROOT}"/var/spool/jabber/.erlang.cookie{,bak} - fi - mv -v "${EROOT}"/var/{run/jabber,spool/jabber}/.erlang.cookie - fi - ewarn - ewarn "We'll try to handle upgrade automagically but, please, do your" - ewarn "own checks and do not forget to run 'etc-update'!" - ewarn "PLEASE! Run 'etc-update' now!" - fi - - SSL_ORGANIZATION="${SSL_ORGANIZATION:-Ejabberd XMPP Server}" - install_cert /etc/ssl/ejabberd/server - # Fix ssl cert permissions bug #369809 - chown root:jabber "${EROOT}/etc/ssl/ejabberd/server.pem" - chmod 0440 "${EROOT}/etc/ssl/ejabberd/server.pem" - if [[ -e ${EROOT}/etc/jabber/ssl.pem ]]; then - ewarn - ewarn "The location of SSL certificates has changed. If you are" - ewarn "upgrading from ${CATEGORY}/${PN}-2.0.5* or earlier you might" - ewarn "want to move your old certificates from /etc/jabber into" - ewarn "/etc/ssl/ejabberd/, update config files and" - ewarn "rm /etc/jabber/ssl.pem to avoid this message." - ewarn - fi -} diff --git a/net-im/ejabberd/files/e211bf522ecfa0f8177f20c5e7ff21a1a47f940b.patch b/net-im/ejabberd/files/e211bf522ecfa0f8177f20c5e7ff21a1a47f940b.patch new file mode 100644 index 0000000000000000000000000000000000000000..693f7d04d4a049e4e02e8e168dbda5623c57c2b9 --- /dev/null +++ b/net-im/ejabberd/files/e211bf522ecfa0f8177f20c5e7ff21a1a47f940b.patch @@ -0,0 +1,197 @@ +From e211bf522ecfa0f8177f20c5e7ff21a1a47f940b Mon Sep 17 00:00:00 2001 +From: Badlop +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 +