Date: Sunday, February 20, 2022 @ 13:45:34 Author: dvzrv Revision: 1135278
upgpkg: mailman3 3.3.5-5: Rebuild to add fix for mangled moderated messages when cross-posting. Add patch for mangled messages when modering messages that are cross-posted between lists: https://bugs.archlinux.org/task/73863 https://gitlab.com/mailman/mailman/-/issues/955 Remove unneeded quotes and curly braces. Remove commented code. Added: mailman3/trunk/mailman3-3.3.5-moderate_cross_posted.patch Modified: mailman3/trunk/PKGBUILD --------------------------------------------+ PKGBUILD | 107 +++++++++++++-------------- mailman3-3.3.5-moderate_cross_posted.patch | 86 +++++++++++++++++++++ 2 files changed, 140 insertions(+), 53 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2022-02-20 13:12:10 UTC (rev 1135277) +++ PKGBUILD 2022-02-20 13:45:34 UTC (rev 1135278) @@ -3,22 +3,22 @@ _name=mailman pkgname=mailman3 pkgver=3.3.5 -pkgrel=4 +pkgrel=5 pkgdesc="The GNU mailing list manager" -arch=('any') +arch=(any) url="https://www.list.org/" -license=('GPL3') +license=(GPL3) # mailman3 does not support python-sqlalchemy >= 1.4 https://gitlab.com/mailman/mailman/-/issues/899 -depends=('gunicorn' 'python-aiosmtpd' 'python-alembic' 'python-atpublic' -'python-authheaders' 'python-authres' 'python-click' 'python-dateutil' -'python-dnspython' 'python-falcon' 'python-flufl.bounce' 'python-flufl.i18n' -'python-flufl-lock' 'python-importlib_resources' 'python-lazr.config' -'python-passlib' 'python-requests' 'python-sqlalchemy1.3' -'python-zope-component' 'python-zope-configuration' 'python-zope-event' -'python-zope-interface') -makedepends=('git' 'python-setuptools') -checkdepends=('python-flufl.testing' 'python-nose2' 'python-psycopg2' -'python-pymysql' 'python-pytest') +depends=(gunicorn python-aiosmtpd python-alembic python-atpublic +python-authheaders python-authres python-click python-dateutil +python-dnspython python-falcon python-flufl.bounce python-flufl.i18n +python-flufl-lock python-importlib_resources python-lazr.config +python-passlib python-requests python-sqlalchemy1.3 +python-zope-component python-zope-configuration python-zope-event +python-zope-interface) +makedepends=(git python-setuptools) +checkdepends=(python-flufl.testing python-nose2 python-psycopg2 +python-pymysql python-pytest) optdepends=('hyperkitty: for local archive and list interaction' 'lynx: for the default HTML to plaintext conversion' 'mailman3-hyperkitty: for archiving mails with an instance of hyperkitty' @@ -27,25 +27,27 @@ 'python-psycopg2: for PostgreSQL support' 'python-pymysql: for MySQL support' 'smtp-server: for using a local mail server') -conflicts=('mailman') -replaces=('mailman-core') -backup=('etc/mailman.cfg') +conflicts=(mailman) +replaces=(mailman-core) +backup=(etc/mailman.cfg) # the pypi sdist tarball for 3.3.5 misses the chain of trust: # https://gitlab.com/mailman/mailman/-/issues/948 -# source=("https://files.pythonhosted.org/packages/source/${_name::1}/${_name}/${_name}-${pkgver}.tar.gz"{,.asc} -source=("${pkgname}::git+https://gitlab.com/${_name}/${_name}#tag=${pkgver}?signed" - "${pkgname}-3.3.5-python-alembic1.7.patch" - "${pkgname}.service" - "${pkgname}-digests.service" - "${pkgname}-digests.timer" - "${pkgname}-gatenews.service" - "${pkgname}-gatenews.timer" - "${pkgname}-notify.service" - "${pkgname}-notify.timer" - "${pkgname}.sysusers" - "${pkgname}.tmpfiles") +# source=(https://files.pythonhosted.org/packages/source/${_name::1}/$_name/$_name-$pkgver.tar.gz{,.asc} +source=( + $pkgname::git+https://gitlab.com/$_name/$_name#tag=$pkgver?signed + $pkgname.service + $pkgname-digests.service + $pkgname-digests.timer + $pkgname-gatenews.service + $pkgname-gatenews.timer + $pkgname-notify.service + $pkgname-notify.timer + $pkgname.sysusers + $pkgname.tmpfiles + $pkgname-3.3.5-python-alembic1.7.patch + $pkgname-3.3.5-moderate_cross_posted.patch +) sha512sums=('SKIP' - '3cba6577f70a212eca3590afbb03de0943c3509c7f93c29cd50da538e7a109626790becfa3f83098ee085ccf33c0612a9bedf3292089cfc9bdeabb83bda3f653' '5773eae02dee11b83eb73ba81bca98d9d0a22fa3175d53172d17bbc0e9821360a4d562b6f42a3bb55c2f0c0b5b50ab84ee82da4cf8b3ff38555a378687dcde3c' 'dccb7bfac560252f6c36ce26149d72d7faa52c1ff283b725deab802b0a94c45692224936b1a099b95dd5d90782dd39ecb15e299303d0264f1c14a6ac8052ee77' '5d7ccba8cf1262ab052078f2188ded15e43e1201302c7c24ce763efef9789ec99d8ea9a19e8fbd9bc5a38f47a162fe5cf4b0ade284894cb57af66350f23507bc' @@ -54,9 +56,10 @@ 'edc14e009d117c9799bb5d20f0f81dd580acdc184c35cbaf6596056467bc3116d77e5e4a1d9957cf23201cfd57c3a82970fe996e0565c8e527d83fcfc132051a' 'b8538618be8bdd6313d24b844d15c8f25a059c3391cd06db69314b7be19996bfbe913d6c0c9c99d6a19c4f92df32212d31785e92fb32faf5eb792fffe121fcce' '074cf58a93204d4b7631c4cc8af62d5720560301c6fefef6baa5d3aa33e72720870757fac7803f7b2835f8f02bb776f9d049df5c7528c743b56dda7da2085b07' - '6f4b51fd5eb34ac974b3312c34eb1437d9435cfd50f0cb89db02b94ce514bceca2c6dc7cb172b79b2d6a23d68e7ea391ec58dbd9899938c0fe88c03c67c521b9') + '6f4b51fd5eb34ac974b3312c34eb1437d9435cfd50f0cb89db02b94ce514bceca2c6dc7cb172b79b2d6a23d68e7ea391ec58dbd9899938c0fe88c03c67c521b9' + '3cba6577f70a212eca3590afbb03de0943c3509c7f93c29cd50da538e7a109626790becfa3f83098ee085ccf33c0612a9bedf3292089cfc9bdeabb83bda3f653' + '55fa201bedc7926dfe1b8d7ca81c72e575f4c83a80ca3585c66f222efbc78c1a70af74be864d3e310aec7f10d2fc740e746c7d995b84aea716aceadd4c266d16') b2sums=('SKIP' - '736b7bfb0d41cbf0703212139f326c1aeb04d7d800b0819c4f5fe101d5d105686dfe2fa0d8c2ae2c87d3e23314a8c126a83b5b4d467d7fb1b8073e176daa297b' '3efaa4559bcf54b322f4a21ee3000f5b2bea72dad2f9f436967f5c4d4ed8046bc08f8e31457991e63252237134f3f7d2f9e7e7862ebc211aeef11d506ded4440' 'fc6d6545dad6cecfd4c1197269a3ec025eb0b830e04151bb2dee778b9e357127667c5a65ea401b10e31e2ec6a8509719de29c30471fa50d09634c934bdf50b9b' 'b0d764dd4f7017c2d5b76e8a52b0c8d75e35b0b0d9025609853d389f8fa0732ea902549ef168f988bf845370cf67aeb7d439af8dec1997127522055b11e64000' @@ -65,50 +68,48 @@ 'ca8aca1a916e99ed313adfd57c33fdd7a3e1b883e22daae8a1e32084331aa32e7ab99b8adfb6ef95b8b696232d044c65de23dba28b2c7e31a9bd02a5f2cb22c2' 'b980470b16171ed0e32a0c1d9de7d5e6802431dd5275089c03f7bc862d5ac886b78af8aa8828faa71a63e847c9caf660c3da2890828ecb2e0bea537c2c4001a5' '594d6a6712f9e817f4d935225d3a1d87c96e23f1e449caab6bfb00ce2a0421af1401505c6d1d280a03f8c551136639f0dabf27d8b549ca4ea26bdb3febdda660' - '461dce577696405011ed89f7fc109caaf27f4183b4d315baa8ad03db0f12015ebc447cbe9c0b8c5bcba38b63fcaf45adcfcb3e5bf5afb7eb0bd87a2e1b0301e5') + '461dce577696405011ed89f7fc109caaf27f4183b4d315baa8ad03db0f12015ebc447cbe9c0b8c5bcba38b63fcaf45adcfcb3e5bf5afb7eb0bd87a2e1b0301e5' + '736b7bfb0d41cbf0703212139f326c1aeb04d7d800b0819c4f5fe101d5d105686dfe2fa0d8c2ae2c87d3e23314a8c126a83b5b4d467d7fb1b8073e176daa297b' + '21e9213373b2432e0c7a90bd11b203e7e71dc110001dde40e9a258d6c26de9484a6b45c06444864bb65f727a587c5eec7b052358549025a9fab4e9cb9762a5fb') validpgpkeys=('541EA0448453394FF77A0ECC9D9B2BA061D0A67C') # Abhilash Raj <[email protected]> prepare() { -# mv -v "${_name}-$pkgver" "$pkgname-$pkgver" -# cd "$pkgname-$pkgver" - cd "$pkgname" # use python-alembic >= 1.7 as well, as alembic upstream claims to support sqlalchemy >= 1.3 - patch -Np1 -i ../"${pkgname}-3.3.5-python-alembic1.7.patch" + patch -d $pkgname -Np1 -i ../$pkgname-3.3.5-python-alembic1.7.patch + + # fix issue with moderating cross-posted messages: https://gitlab.com/mailman/mailman/-/issues/955 + patch -d $pkgname -Np1 -i ../$pkgname-3.3.5-moderate_cross_posted.patch + + cd $pkgname # make sure that mailman runs in a FHS compliant way - echo -e "[mailman]\nlayout: fhs" >> "../${_name}.cfg" + printf "[mailman]\nlayout: fhs\n" >> ../$_name.cfg # set /var/lib/mailman instead of /var/tmp/mailman as default var_dir: - sed -e 's|/var/tmp/mailman|/var/lib/mailman|g' \ - -i src/${_name}/config/schema.cfg + sed -e 's|/var/tmp/mailman|/var/lib/mailman|g' -i src/$_name/config/schema.cfg } build() { -# cd "$pkgname-$pkgver" - cd "$pkgname" + cd $pkgname python setup.py build } check() { -# cd "$pkgname-$pkgver" - cd "$pkgname" + cd $pkgname # thanks to test design it is impossible to run tests: # https://gitlab.com/mailman/mailman/-/issues/400 } package() { -# cd "$pkgname-$pkgver" - cd "$pkgname" - python setup.py install --optimize=1 --root="${pkgdir}" + cd $pkgname + python setup.py install --optimize=1 --root="$pkgdir" # config - install -vDm 640 "../${_name}.cfg" -t "${pkgdir}/etc/" + install -vDm 640 ../$_name.cfg -t "$pkgdir/etc/" # state dir - install -vdm 750 "${pkgdir}/var/lib/mailman" + install -vdm 750 "$pkgdir/var/lib/mailman" # sysusers.d - install -vDm 644 "../${pkgname}.sysusers" \ - "${pkgdir}/usr/lib/sysusers.d/${pkgname}.conf" + install -vDm 644 ../$pkgname.sysusers "$pkgdir/usr/lib/sysusers.d/$pkgname.conf" # tmpfiles.d - install -vDm 644 "../${pkgname}.tmpfiles" \ - "${pkgdir}/usr/lib/tmpfiles.d/${pkgname}.conf" + install -vDm 644 ../$pkgname.tmpfiles "$pkgdir/usr/lib/tmpfiles.d/$pkgname.conf" # services and timer - install -vDm 644 ../*.{service,timer} -t "${pkgdir}/usr/lib/systemd/system" + install -vDm 644 ../*.{service,timer} -t "$pkgdir/usr/lib/systemd/system" } Added: mailman3-3.3.5-moderate_cross_posted.patch =================================================================== --- mailman3-3.3.5-moderate_cross_posted.patch (rev 0) +++ mailman3-3.3.5-moderate_cross_posted.patch 2022-02-20 13:45:34 UTC (rev 1135278) @@ -0,0 +1,86 @@ +diff --git a/src/mailman/app/moderator.py b/src/mailman/app/moderator.py +index 513d0108e..aa044b83d 100644 +--- a/src/mailman/app/moderator.py ++++ b/src/mailman/app/moderator.py +@@ -189,7 +189,7 @@ def handle_message(mlist, id, action, comment=None, forward=None): + # Delete the request and message if it's not being kept. + if not keep: + # There are two pended tokens. The request id has the moderator +- # token, but wee need to delete the user token too. ++ # token, but we need to delete the user token too. + user_token = None + pendings = getUtility(IPendings) + for token, data in pendings.find(pend_type='held message'): +@@ -200,7 +200,14 @@ def handle_message(mlist, id, action, comment=None, forward=None): + if user_token is not None: + pendings.confirm(user_token, expunge=True) + requestdb.delete_request(id) +- message_store.delete_message(message_id) ++ # Only delete the message from the message store if there's no other ++ # request for it. ++ delete = True ++ for token, data in pendings.find(pend_type='data'): ++ if data['_mod_message_id'] == message_id: ++ delete = False ++ if delete: ++ message_store.delete_message(message_id) + # Log the rejection + if rejection: + note = """%s: %s posting: +diff --git a/src/mailman/app/tests/test_moderation.py b/src/mailman/app/tests/test_moderation.py +index a99048a48..1206611f5 100644 +--- a/src/mailman/app/tests/test_moderation.py ++++ b/src/mailman/app/tests/test_moderation.py +@@ -206,9 +206,36 @@ Message-ID: <alpha> + self.assertIsNone(message) + self.assertIsNone(getUtility(IPendings).confirm(hash)) + ++ def test_handled_cross_posted_message_not_removed(self): ++ # A cross posted message is not removed when handled on the first list. ++ mlist2 = create_list('[email protected]') ++ request_db2 = IListRequests(mlist2) ++ request_id = hold_message(self._mlist, self._msg) ++ request_id2 = hold_message(mlist2, self._msg) ++ # Get the hashes for these pending requests. ++ hash0 = list(self._request_db.held_requests)[0].data_hash ++ hash1 = list(request_db2.held_requests)[0].data_hash ++ # Handle the first list's message. ++ handle_message(self._mlist, request_id, Action.discard) ++ # There's now only the request for list2. ++ self.assertEqual(self._request_db.count, 0) ++ self.assertEqual(request_db2.count, 1) ++ message = getUtility(IMessageStore).get_message_by_id('<alpha>') ++ self.assertIsNotNone(message) ++ self.assertIsNone(getUtility(IPendings).confirm(hash0)) ++ self.assertIsNotNone(getUtility(IPendings).confirm(hash1, ++ expunge=False)) ++ # Handle the second list's message. ++ handle_message(mlist2, request_id2, Action.discard) ++ # Now the request and message are gone. ++ self.assertEqual(request_db2.count, 0) ++ message = getUtility(IMessageStore).get_message_by_id('<alpha>') ++ self.assertIsNone(message) ++ self.assertIsNone(getUtility(IPendings).confirm(hash1)) ++ + def test_all_pendings_removed(self): + # A held message pends two tokens, One for the moderator and one for +- # the user. Ensure both are removed when meddage is handled. ++ # the user. Ensure both are removed when message is handled. + request_id = hold_message(self._mlist, self._msg) + # The hold chain does more. + pendings = getUtility(IPendings) +diff --git a/src/mailman/app/moderator.py b/src/mailman/app/moderator.py +index aa044b83d..898b14160 100644 +--- a/src/mailman/app/moderator.py ++++ b/src/mailman/app/moderator.py +@@ -204,8 +204,9 @@ def handle_message(mlist, id, action, comment=None, forward=None): + # request for it. + delete = True + for token, data in pendings.find(pend_type='data'): +- if data['_mod_message_id'] == message_id: ++ if data and data.get('_mod_message_id') == message_id: + delete = False ++ break + if delete: + message_store.delete_message(message_id) + # Log the rejection
