diff -Nru python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136/_internal/dns_rfc2136.py python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136/_internal/dns_rfc2136.py --- python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136/_internal/dns_rfc2136.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136/_internal/dns_rfc2136.py 2025-04-07 18:03:33.000000000 -0400 @@ -91,12 +91,13 @@ if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") + algorithm: str = (self.credentials.conf('algorithm') or '').upper() + return _RFC2136Client(cast(str, self.credentials.conf('server')), int(cast(str, self.credentials.conf('port')) or self.PORT), cast(str, self.credentials.conf('name')), cast(str, self.credentials.conf('secret')), - self.ALGORITHMS.get(self.credentials.conf('algorithm') or '', - dns.tsig.HMAC_MD5), + self.ALGORITHMS.get(algorithm, dns.tsig.HMAC_MD5), (self.credentials.conf('sign_query') or '').upper() == "TRUE") diff -Nru python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136/_internal/tests/dns_rfc2136_test.py python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136/_internal/tests/dns_rfc2136_test.py --- python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136/_internal/tests/dns_rfc2136_test.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136/_internal/tests/dns_rfc2136_test.py 2025-04-07 18:03:33.000000000 -0400 @@ -41,7 +41,9 @@ self.mock_client = mock.MagicMock() # _get_rfc2136_client | pylint: disable=protected-access self.orig_get_client = self.auth._get_rfc2136_client - self.auth._get_rfc2136_client = mock.MagicMock(return_value=self.mock_client) + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.auth, '_get_rfc2136_client', mock.MagicMock(return_value=self.mock_client)) def test_get_client_default_conf_values(self): # algorithm and sign_query are intentionally absent to test that the default (None) @@ -51,7 +53,7 @@ self.auth.credentials.conf = lambda key: creds.get(key, None) client = self.orig_get_client() assert client.algorithm == self.auth.ALGORITHMS["HMAC-MD5"] - assert client.sign_query == False + assert client.sign_query is False @test_util.patch_display_util() def test_perform(self, unused_mock_get_utility): @@ -77,12 +79,17 @@ self.auth.perform([self.achall]) @test_util.patch_display_util() - def test_valid_algorithm_passes(self, unused_mock_get_utility): + @mock.patch('certbot_dns_rfc2136._internal.dns_rfc2136._RFC2136Client') + def test_valid_algorithm_passes(self, client, unused_mock_get_utility): + from certbot_dns_rfc2136._internal.dns_rfc2136 import Authenticator + config = VALID_CONFIG.copy() config["rfc2136_algorithm"] = "HMAC-sha512" dns_test_common.write(config, self.config.rfc2136_credentials) + self.auth = Authenticator(self.config, "rfc2136") self.auth.perform([self.achall]) + assert dns.tsig.HMAC_SHA512 in client.call_args.args def test_invalid_server_raises(self): config = VALID_CONFIG.copy() @@ -117,7 +124,9 @@ def test_add_txt_record(self, query_mock): query_mock.return_value.rcode.return_value = dns.rcode.NOERROR # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) self.rfc2136_client.add_txt_record("bar", "baz", 42) @@ -128,7 +137,9 @@ def test_add_txt_record_wraps_errors(self, query_mock): query_mock.side_effect = Exception # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) with pytest.raises(errors.PluginError): self.rfc2136_client.add_txt_record("bar", "baz", 42) @@ -137,7 +148,9 @@ def test_add_txt_record_server_error(self, query_mock): query_mock.return_value.rcode.return_value = dns.rcode.NXDOMAIN # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) with pytest.raises(errors.PluginError): self.rfc2136_client.add_txt_record("bar", "baz", 42) @@ -146,7 +159,9 @@ def test_del_txt_record(self, query_mock): query_mock.return_value.rcode.return_value = dns.rcode.NOERROR # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) self.rfc2136_client.del_txt_record("bar", "baz") @@ -157,7 +172,9 @@ def test_del_txt_record_wraps_errors(self, query_mock): query_mock.side_effect = Exception # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) with pytest.raises(errors.PluginError): self.rfc2136_client.del_txt_record("bar", "baz") @@ -166,14 +183,18 @@ def test_del_txt_record_server_error(self, query_mock): query_mock.return_value.rcode.return_value = dns.rcode.NXDOMAIN # _find_domain | pylint: disable=protected-access - self.rfc2136_client._find_domain = mock.MagicMock(return_value="example.com") + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_find_domain', mock.MagicMock(return_value="example.com")) with pytest.raises(errors.PluginError): self.rfc2136_client.del_txt_record("bar", "baz") def test_find_domain(self): # _query_soa | pylint: disable=protected-access - self.rfc2136_client._query_soa = mock.MagicMock(side_effect=[False, False, True]) + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_query_soa', mock.MagicMock(side_effect=[False, False, True])) # _find_domain | pylint: disable=protected-access domain = self.rfc2136_client._find_domain('foo.bar.'+DOMAIN) @@ -182,7 +203,9 @@ def test_find_domain_wraps_errors(self): # _query_soa | pylint: disable=protected-access - self.rfc2136_client._query_soa = mock.MagicMock(return_value=False) + # workaround for wont-fix https://github.com/python/mypy/issues/2427 that works with + # both strict and non-strict mypy + setattr(self.rfc2136_client, '_query_soa', mock.MagicMock(return_value=False)) with pytest.raises(errors.PluginError): self.rfc2136_client._find_domain('foo.bar.'+DOMAIN) @@ -237,11 +260,12 @@ def test_query_soa_signed(self, mock_make_query, unused_mock_query): mock_make_query.return_value = mock.MagicMock() self.rfc2136_client.sign_query = True - self.rfc2136_client.algorithm = "alg0" + self.rfc2136_client.algorithm = dns.tsig.HMAC_MD5 self.rfc2136_client._query_soa(DOMAIN) - mock_make_query.return_value.use_tsig.assert_called_with(mock.ANY, algorithm="alg0") + mock_make_query.return_value.use_tsig.assert_called_with(mock.ANY, + algorithm=dns.tsig.HMAC_MD5) if __name__ == "__main__": diff -Nru python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136.egg-info/PKG-INFO python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136.egg-info/PKG-INFO --- python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136.egg-info/PKG-INFO 2024-02-08 14:45:42.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136.egg-info/PKG-INFO 2025-04-07 18:03:40.000000000 -0400 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: certbot-dns-rfc2136 -Version: 2.9.0 +Version: 4.0.0 Summary: RFC 2136 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project @@ -13,25 +13,34 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Security Classifier: Topic :: System :: Installation/Setup Classifier: Topic :: System :: Networking Classifier: Topic :: System :: Systems Administration Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 License-File: LICENSE.txt -Requires-Dist: dnspython>=1.15.0 -Requires-Dist: setuptools>=41.6.0 -Requires-Dist: acme>=2.9.0 -Requires-Dist: certbot>=2.9.0 +Requires-Dist: dnspython>=2.6.1 +Requires-Dist: acme>=4.0.0 +Requires-Dist: certbot>=4.0.0 Provides-Extra: docs Requires-Dist: Sphinx>=1.0; extra == "docs" Requires-Dist: sphinx_rtd_theme; extra == "docs" Provides-Extra: test Requires-Dist: pytest; extra == "test" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: provides-extra +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary diff -Nru python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136.egg-info/requires.txt python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136.egg-info/requires.txt --- python-certbot-dns-rfc2136-2.9.0/certbot_dns_rfc2136.egg-info/requires.txt 2024-02-08 14:45:42.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/certbot_dns_rfc2136.egg-info/requires.txt 2025-04-07 18:03:40.000000000 -0400 @@ -1,7 +1,6 @@ -dnspython>=1.15.0 -setuptools>=41.6.0 -acme>=2.9.0 -certbot>=2.9.0 +dnspython>=2.6.1 +acme>=4.0.0 +certbot>=4.0.0 [docs] Sphinx>=1.0 diff -Nru python-certbot-dns-rfc2136-2.9.0/debian/changelog python-certbot-dns-rfc2136-4.0.0/debian/changelog --- python-certbot-dns-rfc2136-2.9.0/debian/changelog 2024-02-16 15:36:38.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/debian/changelog 2025-05-24 22:53:03.000000000 -0400 @@ -1,3 +1,11 @@ +python-certbot-dns-rfc2136 (4.0.0-1) unstable; urgency=medium + + * d/watch: newer packages use an underscore + * New upstream version 4.0.0 + * Bump dependency requirements (Closes: #1106477) + + -- Harlan Lieberman-Berg Sat, 24 May 2025 22:53:03 -0400 + python-certbot-dns-rfc2136 (2.9.0-1) unstable; urgency=medium * New upstream version 2.9.0 diff -Nru python-certbot-dns-rfc2136-2.9.0/debian/control python-certbot-dns-rfc2136-4.0.0/debian/control --- python-certbot-dns-rfc2136-2.9.0/debian/control 2024-02-16 15:36:38.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/debian/control 2025-05-24 22:52:49.000000000 -0400 @@ -7,8 +7,8 @@ Build-Depends: debhelper-compat (= 13), dh-python, python3, - python3-acme-abi-2 (>= 2.1~), - python3-certbot-abi-2 (>= 2.1~), + python3-acme-abi-4 (>= 4.0~), + python3-certbot-abi-4 (>= 4.0~), python3-dnspython, python3-mock, python3-pytest, @@ -26,7 +26,7 @@ Package: python3-certbot-dns-rfc2136 Architecture: all Depends: certbot, - python3-certbot-abi-2 (>= ${Abi-major-minor-version}), + python3-certbot-abi-4 (>= ${Abi-major-minor-version}), ${misc:Depends}, ${python3:Depends} Enhances: certbot diff -Nru python-certbot-dns-rfc2136-2.9.0/debian/watch python-certbot-dns-rfc2136-4.0.0/debian/watch --- python-certbot-dns-rfc2136-2.9.0/debian/watch 2021-08-23 18:37:56.000000000 -0400 +++ python-certbot-dns-rfc2136-4.0.0/debian/watch 2025-05-24 22:51:48.000000000 -0400 @@ -1,4 +1,4 @@ version=4 opts=uversionmangle=s/(rc|a|b|c)/~$1/,pgpsigurlmangle=s/$/.asc/ \ -https://pypi.debian.net/certbot-dns-rfc2136/certbot-dns-rfc2136-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) +https://pypi.debian.net/certbot-dns-rfc2136/certbot_dns_rfc2136-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) diff -Nru python-certbot-dns-rfc2136-2.9.0/docs/conf.py python-certbot-dns-rfc2136-4.0.0/docs/conf.py --- python-certbot-dns-rfc2136-2.9.0/docs/conf.py 2024-02-08 14:45:17.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/docs/conf.py 2025-04-07 18:03:33.000000000 -0400 @@ -170,6 +170,6 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'acme': ('https://acme-python.readthedocs.org/en/latest/', None), + 'acme': ('https://acme-python.readthedocs.io/en/latest/', None), 'certbot': ('https://eff-certbot.readthedocs.io/en/stable/', None), } diff -Nru python-certbot-dns-rfc2136-2.9.0/PKG-INFO python-certbot-dns-rfc2136-4.0.0/PKG-INFO --- python-certbot-dns-rfc2136-2.9.0/PKG-INFO 2024-02-08 14:45:42.115183400 -0500 +++ python-certbot-dns-rfc2136-4.0.0/PKG-INFO 2025-04-07 18:03:40.632477500 -0400 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: certbot-dns-rfc2136 -Version: 2.9.0 +Version: 4.0.0 Summary: RFC 2136 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project @@ -13,25 +13,34 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Security Classifier: Topic :: System :: Installation/Setup Classifier: Topic :: System :: Networking Classifier: Topic :: System :: Systems Administration Classifier: Topic :: Utilities -Requires-Python: >=3.8 +Requires-Python: >=3.9 License-File: LICENSE.txt -Requires-Dist: dnspython>=1.15.0 -Requires-Dist: setuptools>=41.6.0 -Requires-Dist: acme>=2.9.0 -Requires-Dist: certbot>=2.9.0 +Requires-Dist: dnspython>=2.6.1 +Requires-Dist: acme>=4.0.0 +Requires-Dist: certbot>=4.0.0 Provides-Extra: docs Requires-Dist: Sphinx>=1.0; extra == "docs" Requires-Dist: sphinx_rtd_theme; extra == "docs" Provides-Extra: test Requires-Dist: pytest; extra == "test" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: provides-extra +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary diff -Nru python-certbot-dns-rfc2136-2.9.0/setup.py python-certbot-dns-rfc2136-4.0.0/setup.py --- python-certbot-dns-rfc2136-2.9.0/setup.py 2024-02-08 14:45:18.000000000 -0500 +++ python-certbot-dns-rfc2136-4.0.0/setup.py 2025-04-07 18:03:33.000000000 -0400 @@ -4,11 +4,13 @@ from setuptools import find_packages from setuptools import setup -version = '2.9.0' +version = '4.0.0' install_requires = [ - 'dnspython>=1.15.0', - 'setuptools>=41.6.0', + # This version was chosen because it is the version packaged in RHEL 9 and Debian unstable. It + # is possible this requirement could be relaxed to allow for an even older version of dnspython + # if necessary. + 'dnspython>=2.6.1', ] if os.environ.get('SNAP_BUILD'): @@ -39,7 +41,7 @@ author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.8', + python_requires='>=3.9', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,11 +50,11 @@ 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Security', 'Topic :: System :: Installation/Setup',