From dca4ddd3d804bcfce144ac113fe91b554fad7f66 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Mon, 30 Oct 2023 10:34:30 -0700 Subject: [PATCH 1/6] Prep for 2.7.4 (#9823) * Set the delegated field in Lexicon config to bypass subdomain resolution (#9821) The Lexicon-based DNS plugins use a mechanism to determine which actual segment of the input domain is actually the DNS zone in which the DNS-01 challenge has to be initiated (eg. `subdomain.domain.com` or `domain.com` for input `subdomain.domain.com`): they tries recursively to configure Lexicon and initiate authentication from the most specific to most generic domain segment, and select the first segment where Lexicon stop erroring out. This mechanism broke with #9746 because now the plugins call Lexicon client instead of the underlying providers, and the client makes guess on the actual domain requested. Typically for `subdomain.domain.com` it will actually try to authenticate against `domain.com`, and so the mechanism above does not work anymore. This PR fixes the issue by using the `delegated` field in Lexicon config each time the plugin needs it. This field is designed for this kind of purpose: it will instruct Lexicon what is the actual DNS zone domain instead of guessing it. I tested the change with one of my OVH account. The expected behavior is re-established and the plugin is able to test `subdomain.domain.com` then `domain.com` as before. Fixes #9791 Fixes #9818 (cherry picked from commit cf4f07d17e22924f7d7d3f41a09136df22981765) * add changelog entry for 9821 (#9822) (cherry picked from commit 7bb85f844069cafbf1184d46f6e3c649fbfcc7d4) --------- Co-authored-by: Adrien Ferrand --- certbot/CHANGELOG.md | 10 ++++++++++ certbot/certbot/plugins/dns_common_lexicon.py | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 3ed4d2ff2..4e82bd157 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,6 +2,16 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). +## 2.7.4 - master + +### Fixed + +* Fixed a bug introduced in version 2.7.0 of our Lexicon based DNS plugins that + caused them to fail to find the DNS zone that needs to be modified in some + cases. + +More details about these changes can be found on our GitHub repo. + ## 2.7.3 - 2023-10-24 ### Fixed diff --git a/certbot/certbot/plugins/dns_common_lexicon.py b/certbot/certbot/plugins/dns_common_lexicon.py index 6e07e6dc4..be94e191b 100644 --- a/certbot/certbot/plugins/dns_common_lexicon.py +++ b/certbot/certbot/plugins/dns_common_lexicon.py @@ -198,6 +198,10 @@ class LexiconDNSAuthenticator(dns_common.DNSAuthenticator): dict_config = { 'domain': domain, + # We bypass Lexicon subdomain resolution by setting the 'delegated' field in the config + # to the value of the 'domain' field itself. Here we consider that the domain passed to + # _build_lexicon_config() is already the exact subdomain of the actual DNS zone to use. + 'delegated': domain, 'provider_name': self._provider_name, 'ttl': self._ttl, self._provider_name: {item[2]: self._credentials.conf(item[0]) From 9650c2596847263dd82127d326adb3bc22fd4f92 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 31 Oct 2023 17:10:11 -0700 Subject: [PATCH 2/6] Fix change detection on mutable values (#9829) (#9830) * handle mutable values * add unit test * add changelog entry * fix typo (cherry picked from commit c3c29afdca43cc1e17e33ba9d4e6120167f5112c) --- certbot/CHANGELOG.md | 2 + certbot/certbot/_internal/cli/helpful.py | 1 + .../_internal/tests/configuration_test.py | 9 ++- certbot/certbot/configuration.py | 65 ++++++++++++++++--- certbot/certbot/tests/util.py | 4 +- 5 files changed, 69 insertions(+), 12 deletions(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 4e82bd157..1faadc4c4 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -6,6 +6,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed +* Fixed a bug introduced in version 2.7.0 that caused interactively entered + webroot plugin values to not be saved for renewal. * Fixed a bug introduced in version 2.7.0 of our Lexicon based DNS plugins that caused them to fail to find the DNS zone that needs to be modified in some cases. diff --git a/certbot/certbot/_internal/cli/helpful.py b/certbot/certbot/_internal/cli/helpful.py index 2f3b4554c..73b4b316d 100644 --- a/certbot/certbot/_internal/cli/helpful.py +++ b/certbot/certbot/_internal/cli/helpful.py @@ -165,6 +165,7 @@ class HelpfulArgumentParser: def remove_config_file_domains_for_renewal(self, config: NamespaceConfig) -> None: """Make "certbot renew" safe if domains are set in cli.ini.""" # Works around https://github.com/certbot/certbot/issues/4096 + assert config.argument_sources is not None if (config.argument_sources['domains'] == ArgumentSource.CONFIG_FILE and self.verb == "renew"): config.domains = [] diff --git a/certbot/certbot/_internal/tests/configuration_test.py b/certbot/certbot/_internal/tests/configuration_test.py index 8d88bb16a..8daed4fbf 100644 --- a/certbot/certbot/_internal/tests/configuration_test.py +++ b/certbot/certbot/_internal/tests/configuration_test.py @@ -165,17 +165,22 @@ class NamespaceConfigTest(test_util.ConfigTestCase): def test_set_by_user_exception(self): from certbot.configuration import NamespaceConfig - + # a newly created NamespaceConfig has no argument sources dict, so an # exception is raised config = NamespaceConfig(self.config.namespace) with pytest.raises(RuntimeError): config.set_by_user('whatever') - + # now set an argument sources dict config.set_argument_sources({}) assert not config.set_by_user('whatever') + def test_set_by_user_mutables(self): + assert not self.config.set_by_user('domains') + self.config.domains.append('example.org') + assert self.config.set_by_user('domains') + if __name__ == '__main__': sys.exit(pytest.main(sys.argv[1:] + [__file__])) # pragma: no cover diff --git a/certbot/certbot/configuration.py b/certbot/certbot/configuration.py index 4720d7ecc..3e37c7d6e 100644 --- a/certbot/certbot/configuration.py +++ b/certbot/certbot/configuration.py @@ -66,7 +66,8 @@ class NamespaceConfig: self.namespace: argparse.Namespace # Avoid recursion loop because of the delegation defined in __setattr__ object.__setattr__(self, 'namespace', namespace) - object.__setattr__(self, 'argument_sources', None) + object.__setattr__(self, '_argument_sources', None) + object.__setattr__(self, '_previously_accessed_mutables', {}) self.namespace.config_dir = os.path.abspath(self.namespace.config_dir) self.namespace.work_dir = os.path.abspath(self.namespace.work_dir) @@ -90,7 +91,7 @@ class NamespaceConfig: """ # Avoid recursion loop because of the delegation defined in __setattr__ - object.__setattr__(self, 'argument_sources', argument_sources) + object.__setattr__(self, '_argument_sources', argument_sources) def set_by_user(self, var: str) -> bool: @@ -145,15 +146,48 @@ class NamespaceConfig: """ If an argument_sources dict was set, overwrites an argument's source to be ArgumentSource.RUNTIME. Used when certbot sets an argument's values - at runtime. + at runtime. This also clears the modified value from + _previously_accessed_mutables since it is no longer needed. """ - if self.argument_sources is not None: - self.argument_sources[name] = ArgumentSource.RUNTIME + if self._argument_sources is not None: + self._argument_sources[name] = ArgumentSource.RUNTIME + if name in self._previously_accessed_mutables: + del self._previously_accessed_mutables[name] + + @property + def argument_sources(self) -> Optional[Dict[str, ArgumentSource]]: + """Returns _argument_sources after handling any changes to accessed mutable values.""" + # We keep values in _previously_accessed_mutables until we've detected a modification to try + # to provide up-to-date information when argument_sources is accessed. Once a mutable object + # has been accessed, it can be modified at any time if a reference to it was kept somewhere + # else. + + # We copy _previously_accessed_mutables because _mark_runtime_override modifies it. + for name, prev_value in self._previously_accessed_mutables.copy().items(): + current_value = getattr(self.namespace, name) + if current_value != prev_value: + self._mark_runtime_override(name) + return self._argument_sources # Delegate any attribute not explicitly defined to the underlying namespace object. + # + # If any mutable namespace attributes are explicitly defined in the future, you'll probably want + # to take an approach like the one used in __getattr__ and the argument_sources property. def __getattr__(self, name: str) -> Any: - return getattr(self.namespace, name) + arg_sources = self.argument_sources + value = getattr(self.namespace, name) + if arg_sources is not None: + # If the requested attribute was already modified at runtime, we don't need to track any + # future changes. + if name not in arg_sources or arg_sources[name] != ArgumentSource.RUNTIME: + # If name is already in _previously_accessed_mutables, we don't need to make a copy + # of it again. If its value was changed, this would have been caught while preparing + # the return value of the property self.argument_sources accessed earlier in this + # function. + if name not in self._previously_accessed_mutables and not _is_immutable(value): + self._previously_accessed_mutables[name] = copy.deepcopy(value) + return value def __setattr__(self, name: str, value: Any) -> None: self._mark_runtime_override(name) @@ -425,9 +459,10 @@ class NamespaceConfig: # Work around https://bugs.python.org/issue1515 for py26 tests :( :( new_ns = copy.deepcopy(self.namespace) new_config = type(self)(new_ns) - if self.set_argument_sources is not None: - new_sources = copy.deepcopy(self.argument_sources) - new_config.set_argument_sources(new_sources) + # Avoid recursion loop because of the delegation defined in __setattr__ + object.__setattr__(new_config, '_argument_sources', copy.deepcopy(self.argument_sources)) + object.__setattr__(new_config, '_previously_accessed_mutables', + copy.deepcopy(self._previously_accessed_mutables)) return new_config @@ -450,3 +485,15 @@ def _check_config_sanity(config: NamespaceConfig) -> None: for domain in config.namespace.domains: # This may be redundant, but let's be paranoid util.enforce_domain_sanity(domain) + + +def _is_immutable(value: Any) -> bool: + """Is value of an immutable type?""" + if isinstance(value, tuple): + # tuples are only immutable if all contained values are immutable. + return all(_is_immutable(subvalue) for subvalue in value) + for immutable_type in (int, float, complex, str, bytes, bool, frozenset,): + if isinstance(value, immutable_type): + return True + # The last case we consider here is None which is also immutable. + return value is None diff --git a/certbot/certbot/tests/util.py b/certbot/certbot/tests/util.py index bbe2ffe9c..5d078cfbd 100644 --- a/certbot/certbot/tests/util.py +++ b/certbot/certbot/tests/util.py @@ -1,6 +1,7 @@ """Test utilities.""" import atexit from contextlib import ExitStack +import copy from importlib import reload as reload_module import io import logging @@ -403,7 +404,8 @@ class ConfigTestCase(TempDirTestCase): def setUp(self) -> None: super().setUp() self.config = configuration.NamespaceConfig( - mock.MagicMock(**constants.CLI_DEFAULTS), + # We make a copy here so any mutable values from CLI_DEFAULTS do not get modified. + mock.MagicMock(**copy.deepcopy(constants.CLI_DEFAULTS)), ) self.config.set_argument_sources({}) self.config.namespace.verb = "certonly" From a92bb44ff9c18abe80806340fbf3abba83c6e0b4 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 1 Nov 2023 06:23:12 -0700 Subject: [PATCH 3/6] Update changelog for 2.7.4 release --- certbot/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 1faadc4c4..9c87266f2 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,7 +2,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). -## 2.7.4 - master +## 2.7.4 - 2023-11-01 ### Fixed From b62133e3e19367b82b5fde3d5f5ad97e6ced5447 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 1 Nov 2023 06:24:18 -0700 Subject: [PATCH 4/6] Release 2.7.4 --- acme/setup.py | 2 +- certbot-apache/setup.py | 2 +- certbot-compatibility-test/setup.py | 2 +- certbot-dns-cloudflare/setup.py | 2 +- certbot-dns-digitalocean/setup.py | 2 +- certbot-dns-dnsimple/setup.py | 2 +- certbot-dns-dnsmadeeasy/setup.py | 2 +- certbot-dns-gehirn/setup.py | 2 +- certbot-dns-google/setup.py | 2 +- certbot-dns-linode/setup.py | 2 +- certbot-dns-luadns/setup.py | 2 +- certbot-dns-nsone/setup.py | 2 +- certbot-dns-ovh/setup.py | 2 +- certbot-dns-rfc2136/setup.py | 2 +- certbot-dns-route53/setup.py | 2 +- certbot-dns-sakuracloud/setup.py | 2 +- certbot-nginx/setup.py | 2 +- certbot/certbot/__init__.py | 2 +- certbot/docs/cli-help.txt | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index 85f6ef62f..d292f8def 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -3,7 +3,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 7e4fe1443..3e708146e 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index d7e9a8713..35a820751 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index 04fcf61d3..bf5a36557 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'cloudflare>=1.5.1', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index 390af42bc..fd3483ff5 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'python-digitalocean>=1.11', # 1.15.0 or newer is recommended for TTL support diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index 5e3eb6bb8..106324f89 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ # This version of lexicon is required to address the problem described in diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index e5a58e658..3617c46ff 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index 5294895b3..be4cfbc07 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index e328cb629..b0f78d128 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'google-api-python-client>=1.6.5', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 47c108e85..337b6b4d8 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index 8cce68501..5acece1ab 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index b05b7bb66..2b6a1948f 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 479337e8f..85be5c5bc 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.15.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index 7a2d66ba6..c5374dc04 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dnspython>=1.15.0', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index d17793c9e..dd1f03a5b 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'boto3>=1.15.15', diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index 289de7a58..455c4745c 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index a0c9680d5..775a361be 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.3' +version = '2.7.4' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index a84a327fd..fc427a33d 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -3,7 +3,7 @@ import sys import warnings # version number like 1.2.3a0, must have at least 2 parts, like 1.2 -__version__ = '2.7.3' +__version__ = '2.7.4' if sys.version_info[:2] == (3, 7): warnings.warn( diff --git a/certbot/docs/cli-help.txt b/certbot/docs/cli-help.txt index f191740b2..b190fb6b8 100644 --- a/certbot/docs/cli-help.txt +++ b/certbot/docs/cli-help.txt @@ -122,7 +122,7 @@ optional arguments: case, and to know when to deprecate support for past Python versions and flags. If you wish to hide this information from the Let's Encrypt server, set this to - "". (default: CertbotACMEClient/2.7.3 (certbot; + "". (default: CertbotACMEClient/2.7.4 (certbot; OS_NAME OS_VERSION) Authenticator/XXX Installer/YYY (SUBCOMMAND; flags: FLAGS) Py/major.minor.patchlevel). The flags encoded in the user agent are: --duplicate, From 2ae810c45a0f329714153932aa8c1d4a7a5375f1 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 1 Nov 2023 06:24:19 -0700 Subject: [PATCH 5/6] Add contents to certbot/CHANGELOG.md for next version --- certbot/CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 9c87266f2..638fc9a26 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,6 +2,22 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). +## 2.8.0 - master + +### Added + +* + +### Changed + +* + +### Fixed + +* + +More details about these changes can be found on our GitHub repo. + ## 2.7.4 - 2023-11-01 ### Fixed From 2adaacab82314a8fd07a6bfd5445314bcc7f34d1 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 1 Nov 2023 06:24:20 -0700 Subject: [PATCH 6/6] Bump version to 2.8.0 --- acme/docs/jws-help.txt | 2 +- acme/setup.py | 2 +- certbot-apache/setup.py | 2 +- certbot-compatibility-test/setup.py | 2 +- certbot-dns-cloudflare/setup.py | 2 +- certbot-dns-digitalocean/setup.py | 2 +- certbot-dns-dnsimple/setup.py | 2 +- certbot-dns-dnsmadeeasy/setup.py | 2 +- certbot-dns-gehirn/setup.py | 2 +- certbot-dns-google/setup.py | 2 +- certbot-dns-linode/setup.py | 2 +- certbot-dns-luadns/setup.py | 2 +- certbot-dns-nsone/setup.py | 2 +- certbot-dns-ovh/setup.py | 2 +- certbot-dns-rfc2136/setup.py | 2 +- certbot-dns-route53/setup.py | 2 +- certbot-dns-sakuracloud/setup.py | 2 +- certbot-nginx/setup.py | 2 +- certbot/certbot/__init__.py | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/acme/docs/jws-help.txt b/acme/docs/jws-help.txt index bfd16dff4..34cf5ce23 100644 --- a/acme/docs/jws-help.txt +++ b/acme/docs/jws-help.txt @@ -3,6 +3,6 @@ usage: jws [-h] [--compact] {sign,verify} ... positional arguments: {sign,verify} -options: +optional arguments: -h, --help show this help message and exit --compact diff --git a/acme/setup.py b/acme/setup.py index d292f8def..7b0797a72 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -3,7 +3,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 3e708146e..02e044638 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index 35a820751..bf4caa30c 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index bf5a36557..ec24a643c 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'cloudflare>=1.5.1', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index fd3483ff5..129697b35 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'python-digitalocean>=1.11', # 1.15.0 or newer is recommended for TTL support diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index 106324f89..733340b93 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ # This version of lexicon is required to address the problem described in diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index 3617c46ff..7d306117c 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index be4cfbc07..639cb3a48 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index b0f78d128..564b8ba99 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'google-api-python-client>=1.6.5', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 337b6b4d8..80f7a3e70 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index 5acece1ab..9f7ccf85f 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 2b6a1948f..026697a10 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 85be5c5bc..555df5453 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.15.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index c5374dc04..c74a29361 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dnspython>=1.15.0', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index dd1f03a5b..1190822ec 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'boto3>=1.15.15', diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index 455c4745c..d8fdd6651 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 775a361be..400d04e5e 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '2.7.4' +version = '2.8.0.dev0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index fc427a33d..d1a65fba7 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -3,7 +3,7 @@ import sys import warnings # version number like 1.2.3a0, must have at least 2 parts, like 1.2 -__version__ = '2.7.4' +__version__ = '2.8.0.dev0' if sys.version_info[:2] == (3, 7): warnings.warn(