From 89902e26bf7b163a24dcb6bdf59786378ffe8311 Mon Sep 17 00:00:00 2001 From: zoracon Date: Thu, 31 Aug 2023 16:06:47 -0700 Subject: [PATCH 01/29] Add YAML files for Readthedocs requirements --- acme/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-cloudflare/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-cloudflare/docs/.readthedocs.yaml | 31 +++++++++++++++++ certbot-dns-digitalocean/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-dnsimple/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-dnsmadeeasy/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-gehirn/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-google/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-linode/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-luadns/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-nsone/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-ovh/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-rfc2136/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-route53/.readthedocs.yaml | 33 +++++++++++++++++++ certbot-dns-sakuracloud/.readthedocs.yaml | 33 +++++++++++++++++++ certbot/.readthedocs.yaml | 33 +++++++++++++++++++ 16 files changed, 526 insertions(+) create mode 100644 acme/.readthedocs.yaml create mode 100644 certbot-dns-cloudflare/.readthedocs.yaml create mode 100644 certbot-dns-cloudflare/docs/.readthedocs.yaml create mode 100644 certbot-dns-digitalocean/.readthedocs.yaml create mode 100644 certbot-dns-dnsimple/.readthedocs.yaml create mode 100644 certbot-dns-dnsmadeeasy/.readthedocs.yaml create mode 100644 certbot-dns-gehirn/.readthedocs.yaml create mode 100644 certbot-dns-google/.readthedocs.yaml create mode 100644 certbot-dns-linode/.readthedocs.yaml create mode 100644 certbot-dns-luadns/.readthedocs.yaml create mode 100644 certbot-dns-nsone/.readthedocs.yaml create mode 100644 certbot-dns-ovh/.readthedocs.yaml create mode 100644 certbot-dns-rfc2136/.readthedocs.yaml create mode 100644 certbot-dns-route53/.readthedocs.yaml create mode 100644 certbot-dns-sakuracloud/.readthedocs.yaml create mode 100644 certbot/.readthedocs.yaml diff --git a/acme/.readthedocs.yaml b/acme/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/acme/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-cloudflare/.readthedocs.yaml b/certbot-dns-cloudflare/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-cloudflare/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-cloudflare/docs/.readthedocs.yaml b/certbot-dns-cloudflare/docs/.readthedocs.yaml new file mode 100644 index 000000000..f1a975ecc --- /dev/null +++ b/certbot-dns-cloudflare/docs/.readthedocs.yaml @@ -0,0 +1,31 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: docs/requirements.txt \ No newline at end of file diff --git a/certbot-dns-digitalocean/.readthedocs.yaml b/certbot-dns-digitalocean/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-digitalocean/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-dnsimple/.readthedocs.yaml b/certbot-dns-dnsimple/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-dnsimple/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-dnsmadeeasy/.readthedocs.yaml b/certbot-dns-dnsmadeeasy/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-dnsmadeeasy/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-gehirn/.readthedocs.yaml b/certbot-dns-gehirn/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-gehirn/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-google/.readthedocs.yaml b/certbot-dns-google/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-google/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-linode/.readthedocs.yaml b/certbot-dns-linode/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-linode/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-luadns/.readthedocs.yaml b/certbot-dns-luadns/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-luadns/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-nsone/.readthedocs.yaml b/certbot-dns-nsone/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-nsone/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-ovh/.readthedocs.yaml b/certbot-dns-ovh/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-ovh/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-rfc2136/.readthedocs.yaml b/certbot-dns-rfc2136/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-rfc2136/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-route53/.readthedocs.yaml b/certbot-dns-route53/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-route53/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot-dns-sakuracloud/.readthedocs.yaml b/certbot-dns-sakuracloud/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot-dns-sakuracloud/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file diff --git a/certbot/.readthedocs.yaml b/certbot/.readthedocs.yaml new file mode 100644 index 000000000..9893f2828 --- /dev/null +++ b/certbot/.readthedocs.yaml @@ -0,0 +1,33 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: + - pdf + - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: ../tools/requirements.txt \ No newline at end of file From 24c8825d2263cbc40fcfa6ff9beef79242bf35ef Mon Sep 17 00:00:00 2001 From: zoracon Date: Wed, 20 Sep 2023 12:46:33 -0700 Subject: [PATCH 02/29] Swap out with updated AMI image IDs - Add comments for other OS --- letstest/targets/targets.yaml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/letstest/targets/targets.yaml b/letstest/targets/targets.yaml index 502205b8b..ed00d6e2b 100644 --- a/letstest/targets/targets.yaml +++ b/letstest/targets/targets.yaml @@ -5,38 +5,40 @@ targets: #----------------------------------------------------------------------------- - #Ubuntu - - ami: ami-051dcca84f1edfff1 + # Ubuntu + # These AMI were found onhttps://cloud-images.ubuntu.com/locator/ec2/. + - ami: ami-0fc5d935ebf8bc3bc name: ubuntu22.04 type: ubuntu virt: hvm user: ubuntu - - ami: ami-0758470213bdd23b1 + - ami: ami-0fe0238291c8e3f07 name: ubuntu20.04 type: ubuntu virt: hvm user: ubuntu #----------------------------------------------------------------------------- # Debian - - ami: ami-0fec2c2e2017f4e7b + # These AMI were found on https://wiki.debian.org/Cloud/AmazonEC2Image. + - ami: ami-0c20d96b50ac700e3 name: debian11 type: ubuntu virt: hvm user: admin - - ami: ami-02ff60b9d37a0a0be + - ami: ami-0f238cd7c96d866ad name: debian12 type: ubuntu virt: hvm user: admin #----------------------------------------------------------------------------- # CentOS - # These AMI were found on https://wiki.centos.org/Cloud/AWS. - - ami: ami-00e87074e52e6c9f9 + # These AMI were found on https://centos.org/download/aws-images/. + - ami: ami-0aedf6b1cb669b4c7 name: centos7 type: centos virt: hvm user: centos - - ami: ami-0c0e36522a91d66e1 + - ami: ami-0d5144f02e4eb6f05 name: centos9stream type: centos virt: hvm From a3353b5c42e185cf44d02f37453960f475f1e759 Mon Sep 17 00:00:00 2001 From: zoracon Date: Wed, 20 Sep 2023 12:55:48 -0700 Subject: [PATCH 03/29] Revert "Swap out with updated AMI image IDs" This reverts commit 24c8825d2263cbc40fcfa6ff9beef79242bf35ef. --- letstest/targets/targets.yaml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/letstest/targets/targets.yaml b/letstest/targets/targets.yaml index ed00d6e2b..502205b8b 100644 --- a/letstest/targets/targets.yaml +++ b/letstest/targets/targets.yaml @@ -5,40 +5,38 @@ targets: #----------------------------------------------------------------------------- - # Ubuntu - # These AMI were found onhttps://cloud-images.ubuntu.com/locator/ec2/. - - ami: ami-0fc5d935ebf8bc3bc + #Ubuntu + - ami: ami-051dcca84f1edfff1 name: ubuntu22.04 type: ubuntu virt: hvm user: ubuntu - - ami: ami-0fe0238291c8e3f07 + - ami: ami-0758470213bdd23b1 name: ubuntu20.04 type: ubuntu virt: hvm user: ubuntu #----------------------------------------------------------------------------- # Debian - # These AMI were found on https://wiki.debian.org/Cloud/AmazonEC2Image. - - ami: ami-0c20d96b50ac700e3 + - ami: ami-0fec2c2e2017f4e7b name: debian11 type: ubuntu virt: hvm user: admin - - ami: ami-0f238cd7c96d866ad + - ami: ami-02ff60b9d37a0a0be name: debian12 type: ubuntu virt: hvm user: admin #----------------------------------------------------------------------------- # CentOS - # These AMI were found on https://centos.org/download/aws-images/. - - ami: ami-0aedf6b1cb669b4c7 + # These AMI were found on https://wiki.centos.org/Cloud/AWS. + - ami: ami-00e87074e52e6c9f9 name: centos7 type: centos virt: hvm user: centos - - ami: ami-0d5144f02e4eb6f05 + - ami: ami-0c0e36522a91d66e1 name: centos9stream type: centos virt: hvm From f5cb0a156b98a625c18acc18946945cf96bfbf91 Mon Sep 17 00:00:00 2001 From: zoracon Date: Wed, 20 Sep 2023 12:58:36 -0700 Subject: [PATCH 04/29] Remove duplicate file - was in the incorrect directory --- certbot-dns-cloudflare/docs/.readthedocs.yaml | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 certbot-dns-cloudflare/docs/.readthedocs.yaml diff --git a/certbot-dns-cloudflare/docs/.readthedocs.yaml b/certbot-dns-cloudflare/docs/.readthedocs.yaml deleted file mode 100644 index f1a975ecc..000000000 --- a/certbot-dns-cloudflare/docs/.readthedocs.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Read the Docs configuration file for Sphinx projects -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Set the OS, Python version and other tools you might need -build: - os: ubuntu-22.04 - tools: - python: "3.11" - -# Build documentation in the "docs/" directory with Sphinx -sphinx: - configuration: docs/conf.py - # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs - # builder: "dirhtml" - # Fail on all warnings to avoid broken references - # fail_on_warning: true - -# Optionally build your docs in additional formats such as PDF and ePub -# formats: - - pdf - - epub - -# Optional but recommended, declare the Python requirements required -# to build your documentation -# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -# python: -# install: -# - requirements: docs/requirements.txt \ No newline at end of file From 6c66764f25b4c3f1030ab88a7624d5d07bef11e1 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Tue, 3 Oct 2023 11:22:04 -0700 Subject: [PATCH 05/29] 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 68467b5a9..102638021 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.0 - 2023-10-03 ### Added From 08d1979bcbd2c5e43019980506d5b76e8e5f4437 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Tue, 3 Oct 2023 11:22:04 -0700 Subject: [PATCH 06/29] Bump version to 2.8.0 --- 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 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index 290de57f9..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.0' +version = '2.8.0.dev0' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 9e494b0ed..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.0' +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 f45ccd44d..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.0' +version = '2.8.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index 8933b75fd..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.0' +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 dd2d6b40d..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.0' +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 ac8f1e5d5..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.0' +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 d3fcf3cec..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.0' +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 328b12b32..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.0' +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 1e8f59a89..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.0' +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 41dfa16ef..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.0' +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 0269ba1f9..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.0' +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 cd7ca7631..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.0' +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 69a6107a9..5495baf99 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.0' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index c3d88732a..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.0' +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 d7fa8e464..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.0' +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 4407ef2fe..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.0' +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 20a669fe6..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.0' +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 4ee4d4293..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.0' +__version__ = '2.8.0.dev0' if sys.version_info[:2] == (3, 7): warnings.warn( From 02efc8c5cae79ff272884d120caf95900cf35b3b Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Wed, 4 Oct 2023 16:22:13 -0700 Subject: [PATCH 07/29] Bump setup.py's ConfigArgParse version (#9784) I neglected to do this during #9678, so looks like some pip installs are failing to get the minimum required version. --- certbot/setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/certbot/setup.py b/certbot/setup.py index f607d558b..2c86a1446 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -28,10 +28,7 @@ install_requires = [ # simplicity. See https://github.com/certbot/certbot/issues/8761 for more # info. f'acme>={version}', - # We technically need ConfigArgParse 0.10.0 for Python 2.6 support, but - # saying so here causes a runtime error against our temporary fork of 0.9.3 - # in which we added 2.6 support (see #2243), so we relax the requirement. - 'ConfigArgParse>=0.9.3', + 'ConfigArgParse>=1.5.3', 'configobj>=5.0.6', 'cryptography>=3.2.1', 'distro>=1.0.1', From 4e60a0d03a77296db35846acf7939801c2e27fa7 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Thu, 5 Oct 2023 13:15:30 -0700 Subject: [PATCH 08/29] Fix dnsimple typo (#9787) Fixes https://github.com/certbot/certbot/issues/9786. --- .../certbot_dns_dnsimple/_internal/dns_dnsimple.py | 2 +- certbot/CHANGELOG.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py index 3d1017f0b..c9ef1cdd1 100644 --- a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py +++ b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py @@ -39,7 +39,7 @@ class Authenticator(dns_common_lexicon.LexiconDNSAuthenticator): @property def _provider_name(self) -> str: - return 'dnssimple' + return 'dnsimple' def _handle_http_error(self, e: HTTPError, domain_name: str) -> errors.PluginError: hint = None diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 102638021..4506cb9ca 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,7 +14,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed -* +* Fixed a bug that broke the DNS plugin for DNSimple that was introduced in + version 2.7.0 of the plugin. More details about these changes can be found on our GitHub repo. From 5849ff73fb40dfe8b733da33388faa4dfc9253e2 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Fri, 6 Oct 2023 11:39:08 -0700 Subject: [PATCH 09/29] update pinned dependencies (#9788) This fixes the security alerts those with access can see at https://github.com/certbot/certbot/security/dependabot. --- tools/requirements.txt | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tools/requirements.txt b/tools/requirements.txt index 2d134b272..be328117e 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -12,28 +12,28 @@ astroid==2.13.5 ; python_full_version >= "3.7.2" and python_version < "4.0" attrs==23.1.0 ; python_version >= "3.7" and python_version < "4.0" azure-core==1.29.4 ; python_version >= "3.7" and python_version < "4.0" azure-devops==7.1.0b3 ; python_version >= "3.7" and python_version < "4.0" -babel==2.12.1 ; python_version >= "3.7" and python_version < "4.0" +babel==2.13.0 ; python_version >= "3.7" and python_version < "4.0" backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" bcrypt==4.0.1 ; python_version >= "3.7" and python_version < "4.0" beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "4.0" bleach==6.0.0 ; python_version >= "3.7" and python_version < "4.0" -boto3==1.28.45 ; python_version >= "3.7" and python_version < "4.0" -botocore==1.31.45 ; python_version >= "3.7" and python_version < "4.0" +boto3==1.28.60 ; python_version >= "3.7" and python_version < "4.0" +botocore==1.31.60 ; python_version >= "3.7" and python_version < "4.0" cachecontrol==0.12.14 ; python_version >= "3.7" and python_version < "4.0" cachetools==5.3.1 ; python_version >= "3.7" and python_version < "4.0" cachy==0.3.0 ; python_version >= "3.7" and python_version < "4.0" certifi==2023.7.22 ; python_version >= "3.7" and python_version < "4.0" cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" -charset-normalizer==3.2.0 ; python_version >= "3.7" and python_version < "4.0" +charset-normalizer==3.3.0 ; python_version >= "3.7" and python_version < "4.0" cleo==1.0.0a5 ; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.11.7 ; python_version >= "3.7" and python_version < "4.0" +cloudflare==2.12.4 ; python_version >= "3.7" and python_version < "4.0" colorama==0.4.6 ; python_version < "4.0" and sys_platform == "win32" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and platform_system == "Windows" configargparse==1.7 ; python_version >= "3.7" and python_version < "4.0" configobj==5.0.8 ; python_version >= "3.7" and python_version < "4.0" coverage==7.2.7 ; python_version >= "3.7" and python_version < "4.0" crashtest==0.3.1 ; python_version >= "3.7" and python_version < "4.0" -cryptography==41.0.3 ; python_version >= "3.7" and python_version < "4.0" +cryptography==41.0.4 ; python_version >= "3.7" and python_version < "4.0" cython==0.29.36 ; python_version >= "3.7" and python_version < "4.0" decorator==5.1.1 ; python_version >= "3.7" and python_version < "4.0" deprecated==1.2.14 ; python_version >= "3.7" and python_version < "4.0" @@ -48,10 +48,10 @@ exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.11" execnet==2.0.2 ; python_version >= "3.7" and python_version < "4.0" fabric==3.2.2 ; python_version >= "3.7" and python_version < "4.0" filelock==3.12.2 ; python_version >= "3.7" and python_version < "4.0" -google-api-core==2.11.1 ; python_version >= "3.7" and python_version < "4.0" -google-api-python-client==2.99.0 ; python_version >= "3.7" and python_version < "4.0" +google-api-core==2.12.0 ; python_version >= "3.7" and python_version < "4.0" +google-api-python-client==2.102.0 ; python_version >= "3.7" and python_version < "4.0" google-auth-httplib2==0.1.1 ; python_version >= "3.7" and python_version < "4.0" -google-auth==2.23.0 ; python_version >= "3.7" and python_version < "4.0" +google-auth==2.23.2 ; python_version >= "3.7" and python_version < "4.0" googleapis-common-protos==1.60.0 ; python_version >= "3.7" and python_version < "4.0" html5lib==1.1 ; python_version >= "3.7" and python_version < "4.0" httplib2==0.22.0 ; python_version >= "3.7" and python_version < "4.0" @@ -66,7 +66,7 @@ ipython==7.34.0 ; python_version >= "3.7" and python_version < "4.0" isodate==0.6.1 ; python_version >= "3.7" and python_version < "4.0" isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "4.0" jaraco-classes==3.2.3 ; python_version >= "3.7" and python_version < "4.0" -jedi==0.19.0 ; python_version >= "3.7" and python_version < "4.0" +jedi==0.19.1 ; python_version >= "3.7" and python_version < "4.0" jeepney==0.8.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" jinja2==3.1.2 ; python_version >= "3.7" and python_version < "4.0" jmespath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" @@ -88,7 +88,7 @@ msrest==0.7.1 ; python_version >= "3.7" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "4.0" mypy==1.4.1 ; python_version >= "3.7" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.7" and python_version < "4.0" -packaging==23.1 ; python_version >= "3.7" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.7" and python_version < "4.0" paramiko==3.3.1 ; python_version >= "3.7" and python_version < "4.0" parsedatetime==2.6 ; python_version >= "3.7" and python_version < "4.0" parso==0.8.3 ; python_version >= "3.7" and python_version < "4.0" @@ -104,7 +104,7 @@ poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" poetry-plugin-export==1.2.0 ; python_version >= "3.7" and python_version < "4.0" poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" prompt-toolkit==3.0.39 ; python_version >= "3.7" and python_version < "4.0" -protobuf==4.24.3 ; python_version >= "3.7" and python_version < "4.0" +protobuf==4.24.4 ; python_version >= "3.7" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "4.0" @@ -136,9 +136,9 @@ requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" requests-toolbelt==0.9.1 ; python_version >= "3.7" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.7" and python_version < "4.0" rfc3986==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -rich==13.5.2 ; python_version >= "3.7" and python_version < "4.0" +rich==13.6.0 ; python_version >= "3.7" and python_version < "4.0" rsa==4.9 ; python_version >= "3.7" and python_version < "4" -s3transfer==0.6.2 ; python_version >= "3.7" and python_version < "4.0" +s3transfer==0.7.0 ; python_version >= "3.7" and python_version < "4.0" secretstorage==3.3.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" semantic-version==2.10.0 ; python_version >= "3.7" and python_version < "4.0" setuptools-rust==1.7.0 ; python_version >= "3.7" and python_version < "4.0" @@ -156,7 +156,7 @@ sphinxcontrib-jquery==4.1 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" -tldextract==3.5.0 ; python_version >= "3.7" and python_version < "4.0" +tldextract==3.6.0 ; python_version >= "3.7" and python_version < "4.0" tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6" tomlkit==0.12.1 ; python_version < "4.0" and python_version >= "3.7" tox==3.28.0 ; python_version >= "3.7" and python_version < "4.0" @@ -167,7 +167,7 @@ types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "4.0" types-pyopenssl==23.2.0.2 ; python_version >= "3.7" and python_version < "4.0" types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "4.0" types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "4.0" -types-pytz==2023.3.0.1 ; python_version >= "3.7" and python_version < "4.0" +types-pytz==2023.3.1.1 ; python_version >= "3.7" and python_version < "4.0" types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "4.0" types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "4.0" types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "4.0" @@ -175,9 +175,9 @@ types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "4.0" types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "4.0" typing-extensions==4.7.1 ; python_version >= "3.7" and python_version < "4.0" uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" -urllib3==1.26.16 ; python_version >= "3.7" and python_version < "4.0" +urllib3==1.26.17 ; python_version >= "3.7" and python_version < "4.0" virtualenv==20.21.1 ; python_version >= "3.7" and python_version < "4.0" -wcwidth==0.2.6 ; python_version >= "3.7" and python_version < "4.0" +wcwidth==0.2.8 ; python_version >= "3.7" and python_version < "4.0" webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" wheel==0.41.2 ; python_version >= "3.7" and python_version < "4.0" wrapt==1.15.0 ; python_version < "4.0" and python_version >= "3.7" From 61773be971edf6a291a0ba0f8e8ad10b57e46dc5 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Fri, 6 Oct 2023 11:39:19 -0700 Subject: [PATCH 10/29] update changelog for configargparse (#9789) I'd like to do a bug fix release for https://github.com/certbot/certbot/issues/9786. If we're doing one, I figure we may as well flag this change from https://github.com/certbot/certbot/pull/9784 too. --- certbot/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 4506cb9ca..e87e7062a 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -16,6 +16,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). * Fixed a bug that broke the DNS plugin for DNSimple that was introduced in version 2.7.0 of the plugin. +* Correctly specified the new minimum version of the ConfigArgParse package + that Certbot requires which is 1.5.3. More details about these changes can be found on our GitHub repo. From dcac5ed8f07db58d7d68201c799520f7961cdb32 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 10 Oct 2023 06:40:53 -0700 Subject: [PATCH 11/29] 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 60973dabb..3fbb107da 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.1 - 2023-10-10 ### Fixed From 8bf21cad25bfc9a969182204ccce9719ae89c0f0 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 10 Oct 2023 06:40:53 -0700 Subject: [PATCH 12/29] 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 2b51aaf16..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.1' +version = '2.8.0.dev0' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index d6c1a8845..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.1' +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 995645ef5..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.1' +version = '2.8.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index d4f721747..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.1' +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 07f108205..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.1' +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 895b6871a..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.1' +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 85bbbbe37..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.1' +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 0c7a419fd..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.1' +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 f2103916e..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.1' +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 0ce400e6f..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.1' +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 c59bc168e..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.1' +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 2c05e0cb1..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.1' +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 d8315f66a..5495baf99 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.1' +version = '2.8.0.dev0' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index 007bd0638..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.1' +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 6f6e040e8..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.1' +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 b8f5660a6..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.1' +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 4f9c2c24a..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.1' +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 1dbc91774..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.1' +__version__ = '2.8.0.dev0' if sys.version_info[:2] == (3, 7): warnings.warn( From 01d129dfca697f357873d083d4629cea920ca17d Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Tue, 10 Oct 2023 16:02:24 +0200 Subject: [PATCH 13/29] Adapt to Python 3.12.0rc2 (#9764) The warning message changed from "datetime.utcfromtimestamp() is deprecated" to "datetime.datetime.utcfromtimestamp() is deprecated" --- pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 46beca405..ea038151c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -42,5 +42,5 @@ filterwarnings = ignore:.*declare_namespace\(':DeprecationWarning ignore:pkg_resources is deprecated as an API:DeprecationWarning ignore:Python 3.7 support will be dropped:PendingDeprecationWarning - ignore:datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:pytz.tzinfo + ignore:.*datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:pytz.tzinfo ignore:Boto3 will no longer support Python 3.7 From 8a95c030e63b126a5eae137806957428d579505b Mon Sep 17 00:00:00 2001 From: Adrien Ferrand Date: Fri, 13 Oct 2023 15:57:42 +0200 Subject: [PATCH 14/29] Drop Python 3.7 support (#9792) * Drop Python 3.7 support * Fix lint and test * Check for venv generation * Update requirements * Update oldest constaints and compatibility tests runtime --- .../templates/jobs/extended-tests-jobs.yml | 11 +- .../templates/jobs/standard-tests-jobs.yml | 18 +- acme/acme/__init__.py | 8 - acme/setup.py | 3 +- certbot-apache/setup.py | 3 +- certbot-ci/setup.py | 3 +- certbot-compatibility-test/Dockerfile | 4 +- certbot-compatibility-test/setup.py | 3 +- certbot-dns-cloudflare/setup.py | 3 +- certbot-dns-digitalocean/setup.py | 3 +- .../_internal/tests/dns_dnsimple_test.py | 3 +- certbot-dns-dnsimple/setup.py | 3 +- .../_internal/tests/dns_dnsmadeeasy_test.py | 5 +- certbot-dns-dnsmadeeasy/setup.py | 3 +- .../_internal/tests/dns_gehirn_test.py | 5 +- certbot-dns-gehirn/setup.py | 3 +- certbot-dns-google/setup.py | 3 +- certbot-dns-linode/setup.py | 3 +- .../_internal/tests/dns_luadns_test.py | 3 +- certbot-dns-luadns/setup.py | 3 +- .../_internal/tests/dns_nsone_test.py | 5 +- certbot-dns-nsone/setup.py | 3 +- .../_internal/tests/dns_ovh_test.py | 4 +- certbot-dns-ovh/setup.py | 3 +- certbot-dns-rfc2136/setup.py | 3 +- certbot-dns-route53/setup.py | 3 +- .../_internal/tests/dns_sakuracloud_test.py | 5 +- certbot-dns-sakuracloud/setup.py | 3 +- .../certbot_nginx/_internal/nginxparser.py | 5 +- certbot-nginx/setup.py | 3 +- certbot/CHANGELOG.md | 2 +- certbot/certbot/__init__.py | 9 - .../certbot/_internal/display/completer.py | 5 +- certbot/certbot/_internal/main.py | 4 - certbot/certbot/_internal/plugins/disco.py | 4 +- certbot/certbot/plugins/dns_common_lexicon.py | 21 +- certbot/certbot/plugins/dns_test_common.py | 8 +- .../plugins/dns_test_common_lexicon.py | 12 +- certbot/setup.py | 9 +- letstest/setup.py | 3 +- pytest.ini | 7 +- tools/oldest_constraints.txt | 196 +++++----- tools/pinning/current/pyproject.toml | 10 +- tools/pinning/oldest/pyproject.toml | 4 +- tools/requirements.txt | 363 +++++++++--------- tools/venv.py | 2 +- tox.ini | 6 +- windows-installer/setup.py | 3 +- 48 files changed, 368 insertions(+), 430 deletions(-) diff --git a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml index ae2249129..264919aae 100644 --- a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml @@ -8,9 +8,6 @@ jobs: - group: certbot-common strategy: matrix: - linux-py38: - PYTHON_VERSION: 3.8 - TOXENV: py38 linux-py39: PYTHON_VERSION: 3.9 TOXENV: py39 @@ -20,17 +17,13 @@ jobs: linux-isolated: TOXENV: 'isolated-{acme,certbot,apache,cloudflare,digitalocean,dnsimple,dnsmadeeasy,gehirn,google,linode,luadns,nsone,ovh,rfc2136,route53,sakuracloud,nginx}' linux-boulder-v2-integration-certbot-oldest: - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: integration-certbot-oldest ACME_SERVER: boulder-v2 linux-boulder-v2-integration-nginx-oldest: - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: integration-nginx-oldest ACME_SERVER: boulder-v2 - linux-boulder-v2-py37-integration: - PYTHON_VERSION: 3.7 - TOXENV: integration - ACME_SERVER: boulder-v2 linux-boulder-v2-py38-integration: PYTHON_VERSION: 3.8 TOXENV: integration diff --git a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml index 0d6ac9690..6edf03544 100644 --- a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml @@ -4,9 +4,9 @@ jobs: PYTHON_VERSION: 3.11 strategy: matrix: - macos-py37-cover: + macos-py38-cover: IMAGE_NAME: macOS-12 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: cover # As of pip 23.1.0, builds started failing on macOS unless this flag was set. # See https://github.com/certbot/certbot/pull/9717#issuecomment-1610861794. @@ -14,11 +14,11 @@ jobs: macos-cover: IMAGE_NAME: macOS-12 TOXENV: cover - # See explanation under macos-py37-cover. + # See explanation under macos-py38-cover. PIP_USE_PEP517: "true" - windows-py37: + windows-py38: IMAGE_NAME: windows-2019 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: py-win windows-py39-cover: IMAGE_NAME: windows-2019 @@ -30,12 +30,12 @@ jobs: TOXENV: integration-certbot linux-oldest: IMAGE_NAME: ubuntu-22.04 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: oldest - linux-py37: + linux-py38: IMAGE_NAME: ubuntu-22.04 - PYTHON_VERSION: 3.7 - TOXENV: py37 + PYTHON_VERSION: 3.8 + TOXENV: py38 linux-cover: IMAGE_NAME: ubuntu-22.04 TOXENV: cover diff --git a/acme/acme/__init__.py b/acme/acme/__init__.py index cd250b3ca..1e21b5896 100644 --- a/acme/acme/__init__.py +++ b/acme/acme/__init__.py @@ -6,7 +6,6 @@ This module is an implementation of the `ACME protocol`_. """ import sys -import warnings # This code exists to keep backwards compatibility with people using acme.jose # before it became the standalone josepy package. @@ -20,10 +19,3 @@ for mod in list(sys.modules): # preserved (acme.jose.* is josepy.*) if mod == 'josepy' or mod.startswith('josepy.'): sys.modules['acme.' + mod.replace('josepy', 'jose', 1)] = sys.modules[mod] - -if sys.version_info[:2] == (3, 7): - warnings.warn( - "Python 3.7 support will be dropped in the next planned release of " - "acme. Please upgrade your Python version.", - PendingDeprecationWarning, - ) # pragma: no cover diff --git a/acme/setup.py b/acme/setup.py index 7b0797a72..a67fab48b 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -44,14 +44,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 02e044638..771a1d0be 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -30,7 +30,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -39,7 +39,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-ci/setup.py b/certbot-ci/setup.py index 3fddcf104..2cb8308c1 100644 --- a/certbot-ci/setup.py +++ b/certbot-ci/setup.py @@ -32,14 +32,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-compatibility-test/Dockerfile b/certbot-compatibility-test/Dockerfile index 0dfeddcff..091ab5f85 100644 --- a/certbot-compatibility-test/Dockerfile +++ b/certbot-compatibility-test/Dockerfile @@ -1,5 +1,5 @@ -FROM debian:buster -MAINTAINER Brad Warren +FROM docker.io/python:3.8-buster +LABEL maintainer="Brad Warren " # This does not include the dependencies needed to build cryptography. See # https://cryptography.io/en/latest/installation/#building-cryptography-on-linux diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index bf4caa30c..ca74fedb7 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -18,14 +18,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index ec24a643c..62b4d91c5 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index 129697b35..da7146cb5 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py index ff299ad49..e0d389be1 100644 --- a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py +++ b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py @@ -3,6 +3,7 @@ from unittest import mock import sys import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -16,7 +17,7 @@ TOKEN = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: ...') + LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: ...', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index 733340b93..d27f49562 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -41,7 +41,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -50,7 +50,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py index 286e65ed9..4adb70643 100644 --- a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py +++ b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py @@ -4,6 +4,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -19,8 +20,8 @@ SECRET_KEY = 'bar' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'403 Client Error: Forbidden for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'403 Client Error: Forbidden for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index 7d306117c..337b00460 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py index 3d082049d..3df3c5431 100644 --- a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py +++ b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py @@ -5,6 +5,7 @@ import unittest from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -20,8 +21,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index 639cb3a48..7938c06f0 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index 564b8ba99..1c6c76893 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -40,7 +40,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -49,7 +49,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 80f7a3e70..668df1e35 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py b/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py index 0b424e860..890616b5e 100644 --- a/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py +++ b/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -17,7 +18,7 @@ TOKEN = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - LOGIN_ERROR = HTTPError("401 Client Error: Unauthorized for url: ...") + LOGIN_ERROR = HTTPError("401 Client Error: Unauthorized for url: ...", response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index 9f7ccf85f..402070e00 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py b/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py index ae0ff4c21..3f6e7e7c7 100644 --- a/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py +++ b/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -17,8 +18,8 @@ API_KEY = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 026697a10..52b03fa50 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py b/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py index 2b054a304..a5d553cd9 100644 --- a/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py +++ b/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py @@ -3,6 +3,7 @@ from unittest import mock import sys import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -20,8 +21,7 @@ class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): DOMAIN_NOT_FOUND = Exception('Domain example.com not found') - LOGIN_ERROR = HTTPError('403 Client Error: Forbidden for url: https://eu.api.ovh.com/1.0/...') - + LOGIN_ERROR = HTTPError('403 Client Error: Forbidden for url: https://eu.api.ovh.com/1.0/...', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 5495baf99..e4c615f3f 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index c74a29361..eaf651d0f 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index 1190822ec..05ea16eba 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py index e7e0b108e..44a36b9e0 100644 --- a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py +++ b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -18,8 +19,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index d8fdd6651..ccc7efd13 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-nginx/certbot_nginx/_internal/nginxparser.py b/certbot-nginx/certbot_nginx/_internal/nginxparser.py index 1c74cd367..6f2e73443 100644 --- a/certbot-nginx/certbot_nginx/_internal/nginxparser.py +++ b/certbot-nginx/certbot_nginx/_internal/nginxparser.py @@ -10,8 +10,8 @@ from typing import Iterable from typing import Iterator from typing import List from typing import overload +from typing import SupportsIndex from typing import Tuple -from typing import TYPE_CHECKING from typing import Union from pyparsing import Combine @@ -27,9 +27,6 @@ from pyparsing import stringEnd from pyparsing import White from pyparsing import ZeroOrMore -if TYPE_CHECKING: - from typing_extensions import SupportsIndex # typing.SupportsIndex not supported on Python 3.7 - logger = logging.getLogger(__name__) diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 400d04e5e..03dda4d4b 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -28,7 +28,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -37,7 +37,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 3fbb107da..28a866731 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -10,7 +10,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Changed -* +* Support for Python 3.7 was removed. ### Fixed diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index d1a65fba7..39c239fa1 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -1,13 +1,4 @@ """Certbot client.""" -import sys -import warnings # version number like 1.2.3a0, must have at least 2 parts, like 1.2 __version__ = '2.8.0.dev0' - -if sys.version_info[:2] == (3, 7): - warnings.warn( - "Python 3.7 support will be dropped in the next planned release of " - "certbot. Please upgrade your Python version.", - PendingDeprecationWarning, - ) # pragma: no cover diff --git a/certbot/certbot/_internal/display/completer.py b/certbot/certbot/_internal/display/completer.py index 821aba780..7d26f0875 100644 --- a/certbot/certbot/_internal/display/completer.py +++ b/certbot/certbot/_internal/display/completer.py @@ -3,12 +3,9 @@ import glob from types import TracebackType from typing import Callable from typing import Iterator +from typing import Literal from typing import Optional from typing import Type -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from typing_extensions import Literal # readline module is not available on all systems try: diff --git a/certbot/certbot/_internal/main.py b/certbot/certbot/_internal/main.py index ef3626161..70332e32c 100644 --- a/certbot/certbot/_internal/main.py +++ b/certbot/certbot/_internal/main.py @@ -1863,10 +1863,6 @@ def main(cli_args: Optional[List[str]] = None) -> Optional[Union[str, int]]: if config.func != plugins_cmd: # pylint: disable=comparison-with-callable raise - if sys.version_info[:2] == (3, 7): - logger.warning("Python 3.7 support will be dropped in the next planned release " - "of Certbot - please upgrade your Python version.") - with make_displayer(config) as displayer: display_obj.set_display(displayer) diff --git a/certbot/certbot/_internal/plugins/disco.py b/certbot/certbot/_internal/plugins/disco.py index c0426bcd8..9454e176c 100644 --- a/certbot/certbot/_internal/plugins/disco.py +++ b/certbot/certbot/_internal/plugins/disco.py @@ -182,9 +182,9 @@ class PluginsRegistry(Mapping): plugin_paths = plugin_paths_string.split(':') if plugin_paths_string else [] # XXX should ensure this only happens once sys.path.extend(plugin_paths) - entry_points = list(importlib_metadata.entry_points( + entry_points = list(importlib_metadata.entry_points( # pylint: disable=unexpected-keyword-arg group=constants.SETUPTOOLS_PLUGINS_ENTRY_POINT)) - old_entry_points = list(importlib_metadata.entry_points( + old_entry_points = list(importlib_metadata.entry_points( # pylint: disable=unexpected-keyword-arg group=constants.OLD_SETUPTOOLS_PLUGINS_ENTRY_POINT)) for entry_point in entry_points + old_entry_points: try: diff --git a/certbot/certbot/plugins/dns_common_lexicon.py b/certbot/certbot/plugins/dns_common_lexicon.py index d61534a10..6e07e6dc4 100644 --- a/certbot/certbot/plugins/dns_common_lexicon.py +++ b/certbot/certbot/plugins/dns_common_lexicon.py @@ -30,9 +30,9 @@ try: from lexicon.config import ConfigResolver from lexicon.interfaces import Provider except ImportError: # pragma: no cover - Client = None - ConfigResolver = None - Provider = None + Client = None # type: ignore + ConfigResolver = None # type: ignore + Provider = None # type: ignore logger = logging.getLogger(__name__) @@ -148,19 +148,18 @@ def build_lexicon_config(lexicon_provider_name: str, .. deprecated:: 2.7.0 Please use certbot.plugins.dns_common_lexicon.LexiconDNSAuthenticator instead. """ - config: Union[ConfigResolver, Dict[str, Any]] = {'provider_name': lexicon_provider_name} - config.update(lexicon_options) - if not ConfigResolver: + config_dict: Dict[str, Any] = {'provider_name': lexicon_provider_name} + config_dict.update(lexicon_options) + if ConfigResolver is None: # Lexicon 2.x - config.update(provider_options) + config_dict.update(provider_options) + return config_dict else: # Lexicon 3.x provider_config: Dict[str, Any] = {} provider_config.update(provider_options) - config[lexicon_provider_name] = provider_config - config = ConfigResolver().with_dict(config).with_env() - - return config + config_dict[lexicon_provider_name] = provider_config + return ConfigResolver().with_dict(config_dict).with_env() class LexiconDNSAuthenticator(dns_common.DNSAuthenticator): diff --git a/certbot/certbot/plugins/dns_test_common.py b/certbot/certbot/plugins/dns_test_common.py index 24580f506..1502e2d3d 100644 --- a/certbot/certbot/plugins/dns_test_common.py +++ b/certbot/certbot/plugins/dns_test_common.py @@ -1,7 +1,7 @@ """Base test class for DNS authenticators.""" from typing import Any from typing import Mapping -from typing import TYPE_CHECKING +from typing import Protocol from unittest import mock import configobj @@ -14,12 +14,6 @@ from certbot.plugins.dns_common import DNSAuthenticator from certbot.tests import acme_util from certbot.tests import util as test_util -if TYPE_CHECKING: - from typing_extensions import Protocol -else: - Protocol = object - - DOMAIN = 'example.com' KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) diff --git a/certbot/certbot/plugins/dns_test_common_lexicon.py b/certbot/certbot/plugins/dns_test_common_lexicon.py index f1de1b76e..27647d934 100644 --- a/certbot/certbot/plugins/dns_test_common_lexicon.py +++ b/certbot/certbot/plugins/dns_test_common_lexicon.py @@ -6,13 +6,14 @@ from typing import Any from typing import cast from typing import Generator from typing import List +from typing import Protocol from typing import Tuple -from typing import TYPE_CHECKING from unittest import mock from unittest.mock import MagicMock import warnings import josepy as jose +from requests import Response from requests.exceptions import HTTPError from requests.exceptions import RequestException @@ -27,18 +28,13 @@ with warnings.catch_warnings(): from certbot.plugins.dns_test_common import _AuthenticatorCallableTestCase from certbot.tests import util as test_util -if TYPE_CHECKING: # pragma: no cover - from typing_extensions import Protocol -else: - Protocol = object - DOMAIN = 'example.com' KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) DOMAIN_NOT_FOUND = Exception('No domain found') GENERIC_ERROR = RequestException -LOGIN_ERROR = HTTPError('400 Client Error: ...') -UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...') +LOGIN_ERROR = HTTPError('400 Client Error: ...', response=Response()) +UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...', response=Response()) class _AuthenticatorCallableLexiconTestCase(_AuthenticatorCallableTestCase, Protocol): diff --git a/certbot/setup.py b/certbot/setup.py index 2c86a1446..ddc3ffe83 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -70,8 +70,7 @@ test_extras = [ 'coverage', 'mypy', 'pip', - # Our pinned version of pylint requires Python >= 3.7.2. - 'pylint ; python_full_version >= "3.7.2"', + 'pylint', 'pytest', 'pytest-cov', 'pytest-xdist', @@ -85,9 +84,6 @@ test_extras = [ 'types-requests', 'types-setuptools', 'types-six', - # typing-extensions is required to import typing.Protocol and make the mypy checks - # pass (along with pylint about non-existent objects) on Python 3.7 - 'typing-extensions', 'wheel', ] @@ -103,7 +99,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', @@ -113,7 +109,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/letstest/setup.py b/letstest/setup.py index 60434431d..33938617f 100644 --- a/letstest/setup.py +++ b/letstest/setup.py @@ -9,14 +9,13 @@ setup( author='Certbot Project', author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/pytest.ini b/pytest.ini index ea038151c..c2bfe4da9 100644 --- a/pytest.ini +++ b/pytest.ini @@ -27,12 +27,9 @@ # is the latest version of that library. See # https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/1.0.2/setup.py#L69. # 6) Ignore DeprecationWarning from using pkg_resources API -# 7) Ignore our own PendingDeprecationWarning about Python 3.7 soon to be dropped. -# 8) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered +# 7) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered # when importing the pytz.tzinfo module # https://github.com/stub42/pytz/issues/105 -# 9) Boto3 is dropping support for Python 3.7 by end of 2023. Let's ignore the associated -# deprecation warning since we will also drop Python 3.7 soon. filterwarnings = error ignore:decodestring\(\) is a deprecated alias:DeprecationWarning:dns @@ -41,6 +38,4 @@ filterwarnings = ignore:update_symlinks is deprecated:PendingDeprecationWarning ignore:.*declare_namespace\(':DeprecationWarning ignore:pkg_resources is deprecated as an API:DeprecationWarning - ignore:Python 3.7 support will be dropped:PendingDeprecationWarning ignore:.*datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:pytz.tzinfo - ignore:Boto3 will no longer support Python 3.7 diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index 9cdff4f24..d667873d4 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -1,102 +1,98 @@ # This file was generated by tools/pinning/oldest/repin.sh and can be updated using # that script. -apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "3.8" -appdirs==1.4.4 ; python_version >= "3.7" and python_version < "3.8" -asn1crypto==0.24.0 ; python_version >= "3.7" and python_version < "3.8" -astroid==2.15.6 ; python_full_version >= "3.7.2" and python_version < "3.8" -beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "3.8" -boto3==1.15.15 ; python_version >= "3.7" and python_version < "3.8" -botocore==1.18.15 ; python_version >= "3.7" and python_version < "3.8" -cachetools==5.3.1 ; python_version >= "3.7" and python_version < "3.8" -certifi==2023.7.22 ; python_version >= "3.7" and python_version < "3.8" -cffi==1.11.5 ; python_version >= "3.7" and python_version < "3.8" -chardet==3.0.4 ; python_version >= "3.7" and python_version < "3.8" -cloudflare==1.5.1 ; python_version >= "3.7" and python_version < "3.8" -colorama==0.4.6 ; python_version < "3.8" and sys_platform == "win32" and python_version >= "3.7" -configargparse==1.5.3 ; python_version >= "3.7" and python_version < "3.8" -configobj==5.0.6 ; python_version >= "3.7" and python_version < "3.8" -coverage==7.2.7 ; python_version >= "3.7" and python_version < "3.8" -cryptography==3.2.1 ; python_version >= "3.7" and python_version < "3.8" -cython==0.29.36 ; python_version >= "3.7" and python_version < "3.8" -dill==0.3.7 ; python_full_version >= "3.7.2" and python_version < "3.8" -distlib==0.3.7 ; python_version >= "3.7" and python_version < "3.8" -distro==1.0.1 ; python_version >= "3.7" and python_version < "3.8" -dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "3.8" -dnspython==1.15.0 ; python_version >= "3.7" and python_version < "3.8" -exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.8" -execnet==2.0.2 ; python_version >= "3.7" and python_version < "3.8" -filelock==3.12.2 ; python_version >= "3.7" and python_version < "3.8" -funcsigs==0.4 ; python_version >= "3.7" and python_version < "3.8" -future==0.18.3 ; python_version >= "3.7" and python_version < "3.8" -google-api-python-client==1.6.5 ; python_version >= "3.7" and python_version < "3.8" -google-auth==2.16.0 ; python_version >= "3.7" and python_version < "3.8" -httplib2==0.9.2 ; python_version >= "3.7" and python_version < "3.8" -idna==2.6 ; python_version >= "3.7" and python_version < "3.8" -importlib-metadata==4.6.4 ; python_version >= "3.7" and python_version < "3.8" -importlib-resources==5.12.0 ; python_version >= "3.7" and python_version < "3.8" -iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "3.8" -ipaddress==1.0.16 ; python_version >= "3.7" and python_version < "3.8" -isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "3.8" -jmespath==0.10.0 ; python_version >= "3.7" and python_version < "3.8" -josepy==1.13.0 ; python_version >= "3.7" and python_version < "3.8" -lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -logger==1.4 ; python_version >= "3.7" and python_version < "3.8" -mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "3.8" -mypy==1.4.1 ; python_version >= "3.7" and python_version < "3.8" -ndg-httpsclient==0.3.2 ; python_version >= "3.7" and python_version < "3.8" -oauth2client==4.1.3 ; python_version >= "3.7" and python_version < "3.8" -packaging==23.1 ; python_version >= "3.7" and python_version < "3.8" -parsedatetime==2.4 ; python_version >= "3.7" and python_version < "3.8" -pbr==1.8.0 ; python_version >= "3.7" and python_version < "3.8" -pip==23.2.1 ; python_version >= "3.7" and python_version < "3.8" -platformdirs==3.10.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -pluggy==1.2.0 ; python_version >= "3.7" and python_version < "3.8" -ply==3.4 ; python_version >= "3.7" and python_version < "3.8" -py==1.11.0 ; python_version >= "3.7" and python_version < "3.8" -pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "3.8" -pyasn1==0.4.8 ; python_version >= "3.7" and python_version < "3.8" -pycparser==2.14 ; python_version >= "3.7" and python_version < "3.8" -pylint==2.17.5 ; python_full_version >= "3.7.2" and python_version < "3.8" -pyopenssl==17.5.0 ; python_version >= "3.7" and python_version < "3.8" -pyparsing==2.2.1 ; python_version >= "3.7" and python_version < "3.8" -pyrfc3339==1.0 ; python_version >= "3.7" and python_version < "3.8" -pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "3.8" -pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "3.8" -pytest==7.4.2 ; python_version >= "3.7" and python_version < "3.8" -python-augeas==0.5.0 ; python_version >= "3.7" and python_version < "3.8" -python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "3.8" -python-digitalocean==1.11 ; python_version >= "3.7" and python_version < "3.8" -pytz==2019.3 ; python_version >= "3.7" and python_version < "3.8" -pywin32==306 ; python_version >= "3.7" and python_version < "3.8" and sys_platform == "win32" -pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "3.8" -requests-file==1.5.1 ; python_version >= "3.7" and python_version < "3.8" -requests==2.20.0 ; python_version >= "3.7" and python_version < "3.8" -rsa==4.9 ; python_version >= "3.7" and python_version < "3.8" -s3transfer==0.3.7 ; python_version >= "3.7" and python_version < "3.8" -setuptools==41.6.0 ; python_version >= "3.7" and python_version < "3.8" -six==1.11.0 ; python_version >= "3.7" and python_version < "3.8" -soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "3.8" -tldextract==3.5.0 ; python_version >= "3.7" and python_version < "3.8" -tomli==2.0.1 ; python_version < "3.8" and python_version >= "3.7" -tomlkit==0.12.1 ; python_full_version >= "3.7.2" and python_version < "3.8" -tox==1.9.2 ; python_version >= "3.7" and python_version < "3.8" -typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.23.2 ; python_version >= "3.7" and python_version < "3.8" -types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "3.8" -types-pyopenssl==23.0.0.0 ; python_version >= "3.7" and python_version < "3.8" -types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "3.8" -types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "3.8" -types-pytz==2023.3.0.1 ; python_version >= "3.7" and python_version < "3.8" -types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "3.8" -types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "3.8" -types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "3.8" -types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "3.8" -types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "3.8" -typing-extensions==4.7.1 ; python_version < "3.8" and python_version >= "3.7" -uritemplate==3.0.1 ; python_version >= "3.7" and python_version < "3.8" -urllib3==1.24.2 ; python_version >= "3.7" and python_version < "3.8" -virtualenv==20.4.7 ; python_version >= "3.7" and python_version < "3.8" -wheel==0.33.6 ; python_version >= "3.7" and python_version < "3.8" -wrapt==1.15.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -zipp==3.15.0 ; python_version >= "3.7" and python_version < "3.8" +apacheconfig==0.3.2 ; python_version >= "3.8" and python_version < "3.9" +asn1crypto==0.24.0 ; python_version >= "3.8" and python_version < "3.9" +astroid==3.0.0 ; python_version >= "3.8" and python_version < "3.9" +beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "3.9" +boto3==1.15.15 ; python_version >= "3.8" and python_version < "3.9" +botocore==1.18.15 ; python_version >= "3.8" and python_version < "3.9" +cachetools==5.3.1 ; python_version >= "3.8" and python_version < "3.9" +certifi==2023.7.22 ; python_version >= "3.8" and python_version < "3.9" +cffi==1.12.3 ; python_version >= "3.8" and python_version < "3.9" +chardet==3.0.4 ; python_version >= "3.8" and python_version < "3.9" +cloudflare==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32" +configargparse==1.5.3 ; python_version >= "3.8" and python_version < "3.9" +configobj==5.0.6 ; python_version >= "3.8" and python_version < "3.9" +coverage==7.3.2 ; python_version >= "3.8" and python_version < "3.9" +cryptography==3.2.1 ; python_version >= "3.8" and python_version < "3.9" +cython==0.29.36 ; python_version >= "3.8" and python_version < "3.9" +dill==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +distlib==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +distro==1.0.1 ; python_version >= "3.8" and python_version < "3.9" +dns-lexicon==3.14.1 ; python_version >= "3.8" and python_version < "3.9" +dnspython==1.15.0 ; python_version >= "3.8" and python_version < "3.9" +exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.9" +execnet==2.0.2 ; python_version >= "3.8" and python_version < "3.9" +filelock==3.12.4 ; python_version >= "3.8" and python_version < "3.9" +funcsigs==0.4 ; python_version >= "3.8" and python_version < "3.9" +future==0.18.3 ; python_version >= "3.8" and python_version < "3.9" +google-api-python-client==1.6.5 ; python_version >= "3.8" and python_version < "3.9" +google-auth==2.16.0 ; python_version >= "3.8" and python_version < "3.9" +httplib2==0.9.2 ; python_version >= "3.8" and python_version < "3.9" +idna==2.6 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==4.6.4 ; python_version >= "3.8" and python_version < "3.9" +importlib-resources==6.1.0 ; python_version >= "3.8" and python_version < "3.9" +iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "3.9" +ipaddress==1.0.16 ; python_version >= "3.8" and python_version < "3.9" +isort==5.12.0 ; python_version >= "3.8" and python_version < "3.9" +jmespath==0.10.0 ; python_version >= "3.8" and python_version < "3.9" +josepy==1.13.0 ; python_version >= "3.8" and python_version < "3.9" +logger==1.4 ; python_version >= "3.8" and python_version < "3.9" +mccabe==0.7.0 ; python_version >= "3.8" and python_version < "3.9" +mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.9" +mypy==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +ndg-httpsclient==0.3.2 ; python_version >= "3.8" and python_version < "3.9" +oauth2client==4.1.3 ; python_version >= "3.8" and python_version < "3.9" +packaging==23.2 ; python_version >= "3.8" and python_version < "3.9" +parsedatetime==2.4 ; python_version >= "3.8" and python_version < "3.9" +pbr==1.8.0 ; python_version >= "3.8" and python_version < "3.9" +pip==23.2.1 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==3.11.0 ; python_version >= "3.8" and python_version < "3.9" +pluggy==1.3.0 ; python_version >= "3.8" and python_version < "3.9" +ply==3.4 ; python_version >= "3.8" and python_version < "3.9" +py==1.11.0 ; python_version >= "3.8" and python_version < "3.9" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "3.9" +pyasn1==0.4.8 ; python_version >= "3.8" and python_version < "3.9" +pycparser==2.14 ; python_version >= "3.8" and python_version < "3.9" +pylint==3.0.1 ; python_version >= "3.8" and python_version < "3.9" +pyopenssl==17.5.0 ; python_version >= "3.8" and python_version < "3.9" +pyparsing==2.2.1 ; python_version >= "3.8" and python_version < "3.9" +pyrfc3339==1.0 ; python_version >= "3.8" and python_version < "3.9" +pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "3.9" +pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "3.9" +pytest==7.4.2 ; python_version >= "3.8" and python_version < "3.9" +python-augeas==0.5.0 ; python_version >= "3.8" and python_version < "3.9" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "3.9" +python-digitalocean==1.11 ; python_version >= "3.8" and python_version < "3.9" +pytz==2019.3 ; python_version >= "3.8" and python_version < "3.9" +pywin32==306 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "3.9" +requests-file==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +requests==2.20.0 ; python_version >= "3.8" and python_version < "3.9" +rsa==4.9 ; python_version >= "3.8" and python_version < "3.9" +s3transfer==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +setuptools==41.6.0 ; python_version >= "3.8" and python_version < "3.9" +six==1.11.0 ; python_version >= "3.8" and python_version < "3.9" +soupsieve==2.5 ; python_version >= "3.8" and python_version < "3.9" +tldextract==3.6.0 ; python_version >= "3.8" and python_version < "3.9" +tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.9" +tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "3.9" +tox==1.9.2 ; python_version >= "3.8" and python_version < "3.9" +types-cryptography==3.3.23.2 ; python_version >= "3.8" and python_version < "3.9" +types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "3.9" +types-pyopenssl==23.0.0.0 ; python_version >= "3.8" and python_version < "3.9" +types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "3.9" +types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "3.9" +types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "3.9" +types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "3.9" +types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "3.9" +types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "3.9" +types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "3.9" +types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "3.9" +typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "3.9" +uritemplate==3.0.1 ; python_version >= "3.8" and python_version < "3.9" +urllib3==1.24.2 ; python_version >= "3.8" and python_version < "3.9" +virtualenv==20.24.5 ; python_version >= "3.8" and python_version < "3.9" +wheel==0.33.6 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.9" diff --git a/tools/pinning/current/pyproject.toml b/tools/pinning/current/pyproject.toml index 44d5dc9d1..2d908679c 100644 --- a/tools/pinning/current/pyproject.toml +++ b/tools/pinning/current/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Certbot Project"] license = "Apache License 2.0" [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" # Local dependencies # Any local packages that have dependencies on other local packages must be @@ -58,7 +58,7 @@ setuptools-rust = "*" # # If this pinning is removed, we may still need to add a lower bound for the # pylint version. See https://github.com/certbot/certbot/pull/9229. -pylint = { version="2.15.5", python = ">=3.7.2" } +pylint = "2.15.5" # Bug in poetry, where still installes yanked versions from pypi (source: https://github.com/python-poetry/poetry/issues/2453) # this version of cryptography introduced a security vulnrability. @@ -75,6 +75,12 @@ poetry = "<1.3.0" # https://github.com/certbot/certbot/issues/9606. setuptools = "<67.5.0" +# Branch 4.x of tox introduces backward incompatibility changes. The tox.ini +# file in the project must be adapted accordingly before moving out of the 3.x +# branch. Once done, the following constraint should become tox >= 4 to keep +# deterministic builds. +tox = "<4" + [tool.poetry.dev-dependencies] [build-system] diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index 58e763be3..302014ae5 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -10,7 +10,7 @@ license = "Apache License 2.0" [tool.poetry.dependencies] # The Python version here should be kept in sync with the one used in our # oldest tests in tox.ini. -python = "<3.8 >= 3.7" +python = "<3.9 >= 3.8" # Local dependencies # Any local packages that have dependencies on other local packages must be @@ -48,7 +48,7 @@ apacheconfig = "0.3.2" asn1crypto = "0.24.0" boto3 = "1.15.15" botocore = "1.18.15" -cffi = "1.11.5" +cffi = "1.12.3" chardet = "3.0.4" cloudflare = "1.5.1" configobj = "5.0.6" diff --git a/tools/requirements.txt b/tools/requirements.txt index be328117e..af906a4ba 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -5,182 +5,187 @@ # requirements.txt so that is scanned by GitHub. See # https://docs.github.com/en/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems # for more info. -alabaster==0.7.13 ; python_version >= "3.7" and python_version < "4.0" -apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "4.0" -appnope==0.1.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" -astroid==2.13.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -attrs==23.1.0 ; python_version >= "3.7" and python_version < "4.0" -azure-core==1.29.4 ; python_version >= "3.7" and python_version < "4.0" -azure-devops==7.1.0b3 ; python_version >= "3.7" and python_version < "4.0" -babel==2.13.0 ; python_version >= "3.7" and python_version < "4.0" -backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" -backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" -bcrypt==4.0.1 ; python_version >= "3.7" and python_version < "4.0" -beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "4.0" -bleach==6.0.0 ; python_version >= "3.7" and python_version < "4.0" -boto3==1.28.60 ; python_version >= "3.7" and python_version < "4.0" -botocore==1.31.60 ; python_version >= "3.7" and python_version < "4.0" -cachecontrol==0.12.14 ; python_version >= "3.7" and python_version < "4.0" -cachetools==5.3.1 ; python_version >= "3.7" and python_version < "4.0" -cachy==0.3.0 ; python_version >= "3.7" and python_version < "4.0" -certifi==2023.7.22 ; python_version >= "3.7" and python_version < "4.0" -cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" -charset-normalizer==3.3.0 ; python_version >= "3.7" and python_version < "4.0" -cleo==1.0.0a5 ; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.12.4 ; python_version >= "3.7" and python_version < "4.0" -colorama==0.4.6 ; python_version < "4.0" and sys_platform == "win32" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and platform_system == "Windows" -configargparse==1.7 ; python_version >= "3.7" and python_version < "4.0" -configobj==5.0.8 ; python_version >= "3.7" and python_version < "4.0" -coverage==7.2.7 ; python_version >= "3.7" and python_version < "4.0" -crashtest==0.3.1 ; python_version >= "3.7" and python_version < "4.0" -cryptography==41.0.4 ; python_version >= "3.7" and python_version < "4.0" -cython==0.29.36 ; python_version >= "3.7" and python_version < "4.0" -decorator==5.1.1 ; python_version >= "3.7" and python_version < "4.0" -deprecated==1.2.14 ; python_version >= "3.7" and python_version < "4.0" -dill==0.3.7 ; python_full_version >= "3.7.2" and python_version < "4.0" -distlib==0.3.7 ; python_version >= "3.7" and python_version < "4.0" -distro==1.8.0 ; python_version >= "3.7" and python_version < "4.0" -dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "4.0" -dnspython==2.3.0 ; python_version >= "3.7" and python_version < "4.0" -docutils==0.18.1 ; python_version >= "3.7" and python_version < "4.0" -dulwich==0.20.50 ; python_version >= "3.7" and python_version < "4.0" -exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.11" -execnet==2.0.2 ; python_version >= "3.7" and python_version < "4.0" -fabric==3.2.2 ; python_version >= "3.7" and python_version < "4.0" -filelock==3.12.2 ; python_version >= "3.7" and python_version < "4.0" -google-api-core==2.12.0 ; python_version >= "3.7" and python_version < "4.0" -google-api-python-client==2.102.0 ; python_version >= "3.7" and python_version < "4.0" -google-auth-httplib2==0.1.1 ; python_version >= "3.7" and python_version < "4.0" -google-auth==2.23.2 ; python_version >= "3.7" and python_version < "4.0" -googleapis-common-protos==1.60.0 ; python_version >= "3.7" and python_version < "4.0" -html5lib==1.1 ; python_version >= "3.7" and python_version < "4.0" -httplib2==0.22.0 ; python_version >= "3.7" and python_version < "4.0" -idna==3.4 ; python_version >= "3.7" and python_version < "4.0" -imagesize==1.4.1 ; python_version >= "3.7" and python_version < "4.0" -importlib-metadata==4.13.0 ; python_version >= "3.7" and python_version < "4.0" -importlib-resources==5.12.0 ; python_version >= "3.7" and python_version < "4.0" -iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -invoke==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -ipdb==0.13.13 ; python_version >= "3.7" and python_version < "4.0" -ipython==7.34.0 ; python_version >= "3.7" and python_version < "4.0" -isodate==0.6.1 ; python_version >= "3.7" and python_version < "4.0" -isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -jaraco-classes==3.2.3 ; python_version >= "3.7" and python_version < "4.0" -jedi==0.19.1 ; python_version >= "3.7" and python_version < "4.0" -jeepney==0.8.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -jinja2==3.1.2 ; python_version >= "3.7" and python_version < "4.0" -jmespath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" -josepy==1.13.0 ; python_version >= "3.7" and python_version < "4.0" -jsonlines==3.1.0 ; python_version >= "3.7" and python_version < "4.0" -jsonpickle==3.0.2 ; python_version >= "3.7" and python_version < "4.0" -jsonschema==4.17.3 ; python_version >= "3.7" and python_version < "4.0" -keyring==24.1.1 ; python_version >= "3.7" and python_version < "4.0" -lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "4.0" -lockfile==0.12.2 ; python_version >= "3.7" and python_version < "4.0" -markdown-it-py==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -markupsafe==2.1.3 ; python_version >= "3.7" and python_version < "4.0" -matplotlib-inline==0.1.6 ; python_version >= "3.7" and python_version < "4.0" -mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "4.0" -mdurl==0.1.2 ; python_version >= "3.7" and python_version < "4.0" -more-itertools==9.1.0 ; python_version >= "3.7" and python_version < "4.0" -msgpack==1.0.5 ; python_version >= "3.7" and python_version < "4.0" -msrest==0.7.1 ; python_version >= "3.7" and python_version < "4.0" -mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "4.0" -mypy==1.4.1 ; python_version >= "3.7" and python_version < "4.0" -oauthlib==3.2.2 ; python_version >= "3.7" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.7" and python_version < "4.0" -paramiko==3.3.1 ; python_version >= "3.7" and python_version < "4.0" -parsedatetime==2.6 ; python_version >= "3.7" and python_version < "4.0" -parso==0.8.3 ; python_version >= "3.7" and python_version < "4.0" -pexpect==4.8.0 ; python_version >= "3.7" and python_version < "4.0" -pickleshare==0.7.5 ; python_version >= "3.7" and python_version < "4.0" -pip==23.2.1 ; python_version >= "3.7" and python_version < "4.0" -pkginfo==1.9.6 ; python_version >= "3.7" and python_version < "4.0" -pkgutil-resolve-name==1.3.10 ; python_version >= "3.7" and python_version < "3.9" -platformdirs==2.6.2 ; python_version < "4.0" and python_version >= "3.7" -pluggy==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -ply==3.11 ; python_version >= "3.7" and python_version < "4.0" -poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" -poetry-plugin-export==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" -prompt-toolkit==3.0.39 ; python_version >= "3.7" and python_version < "4.0" -protobuf==4.24.4 ; python_version >= "3.7" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" -py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" -pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "4.0" -pyasn1==0.5.0 ; python_version >= "3.7" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0" -pygments==2.16.1 ; python_version >= "3.7" and python_version < "4.0" -pylev==1.4.0 ; python_version >= "3.7" and python_version < "4.0" -pylint==2.15.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -pynacl==1.5.0 ; python_version >= "3.7" and python_version < "4.0" -pynsist==2.7 ; python_version >= "3.7" and python_version < "4.0" -pyopenssl==23.2.0 ; python_version >= "3.7" and python_version < "4.0" -pyparsing==3.1.1 ; python_version >= "3.7" and python_version < "4.0" -pyrfc3339==1.1 ; python_version >= "3.7" and python_version < "4.0" -pyrsistent==0.19.3 ; python_version >= "3.7" and python_version < "4.0" -pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "4.0" -pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "4.0" -pytest==7.4.2 ; python_version >= "3.7" and python_version < "4.0" -python-augeas==1.1.0 ; python_version >= "3.7" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "4.0" -python-digitalocean==1.17.0 ; python_version >= "3.7" and python_version < "4.0" -pytz==2023.3.post1 ; python_version >= "3.7" and python_version < "4.0" -pywin32-ctypes==0.2.2 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -pywin32==306 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "4.0" -readme-renderer==37.3 ; python_version >= "3.7" and python_version < "4.0" -requests-download==0.1.2 ; python_version >= "3.7" and python_version < "4.0" -requests-file==1.5.1 ; python_version >= "3.7" and python_version < "4.0" -requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" -requests-toolbelt==0.9.1 ; python_version >= "3.7" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.7" and python_version < "4.0" -rfc3986==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -rich==13.6.0 ; python_version >= "3.7" and python_version < "4.0" -rsa==4.9 ; python_version >= "3.7" and python_version < "4" -s3transfer==0.7.0 ; python_version >= "3.7" and python_version < "4.0" -secretstorage==3.3.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -semantic-version==2.10.0 ; python_version >= "3.7" and python_version < "4.0" -setuptools-rust==1.7.0 ; python_version >= "3.7" and python_version < "4.0" -setuptools==67.4.0 ; python_version >= "3.7" and python_version < "4.0" -shellingham==1.5.3 ; python_version >= "3.7" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" -snowballstemmer==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "4.0" -sphinx-rtd-theme==1.3.0 ; python_version >= "3.7" and python_version < "4.0" -sphinx==5.3.0 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-applehelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-htmlhelp==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-jquery==4.1 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" -tldextract==3.6.0 ; python_version >= "3.7" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6" -tomlkit==0.12.1 ; python_version < "4.0" and python_version >= "3.7" -tox==3.28.0 ; python_version >= "3.7" and python_version < "4.0" -traitlets==5.9.0 ; python_version >= "3.7" and python_version < "4.0" -twine==4.0.2 ; python_version >= "3.7" and python_version < "4.0" -typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" -types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-pyopenssl==23.2.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "4.0" -types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "4.0" -types-pytz==2023.3.1.1 ; python_version >= "3.7" and python_version < "4.0" -types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "4.0" -types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "4.0" -types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "4.0" -types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "4.0" -typing-extensions==4.7.1 ; python_version >= "3.7" and python_version < "4.0" -uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" -urllib3==1.26.17 ; python_version >= "3.7" and python_version < "4.0" -virtualenv==20.21.1 ; python_version >= "3.7" and python_version < "4.0" -wcwidth==0.2.8 ; python_version >= "3.7" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" -wheel==0.41.2 ; python_version >= "3.7" and python_version < "4.0" -wrapt==1.15.0 ; python_version < "4.0" and python_version >= "3.7" -xattr==0.9.9 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" -yarg==0.1.9 ; python_version >= "3.7" and python_version < "4.0" -zipp==3.15.0 ; python_version >= "3.7" and python_version < "4.0" +alabaster==0.7.13 ; python_version >= "3.8" and python_version < "4.0" +apacheconfig==0.3.2 ; python_version >= "3.8" and python_version < "4.0" +appnope==0.1.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "darwin" +astroid==2.13.5 ; python_version >= "3.8" and python_version < "4.0" +asttokens==2.4.0 ; python_version >= "3.8" and python_version < "4.0" +attrs==23.1.0 ; python_version >= "3.8" and python_version < "4.0" +azure-core==1.29.4 ; python_version >= "3.8" and python_version < "4.0" +azure-devops==7.1.0b3 ; python_version >= "3.8" and python_version < "4.0" +babel==2.13.0 ; python_version >= "3.8" and python_version < "4.0" +backcall==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +bcrypt==4.0.1 ; python_version >= "3.8" and python_version < "4.0" +beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0" +boto3==1.28.62 ; python_version >= "3.8" and python_version < "4.0" +botocore==1.31.62 ; python_version >= "3.8" and python_version < "4.0" +cachecontrol==0.12.14 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.1 ; python_version >= "3.8" and python_version < "4.0" +cachy==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +certifi==2023.7.22 ; python_version >= "3.8" and python_version < "4.0" +cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +charset-normalizer==3.3.0 ; python_version >= "3.8" and python_version < "4.0" +cleo==1.0.0a5 ; python_version >= "3.8" and python_version < "4.0" +cloudflare==2.12.4 ; python_version >= "3.8" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" +configargparse==1.7 ; python_version >= "3.8" and python_version < "4.0" +configobj==5.0.8 ; python_version >= "3.8" and python_version < "4.0" +coverage==7.3.2 ; python_version >= "3.8" and python_version < "4.0" +crashtest==0.3.1 ; python_version >= "3.8" and python_version < "4.0" +cryptography==41.0.4 ; python_version >= "3.8" and python_version < "4.0" +cython==0.29.36 ; python_version >= "3.8" and python_version < "4.0" +decorator==5.1.1 ; python_version >= "3.8" and python_version < "4.0" +deprecated==1.2.14 ; python_version >= "3.8" and python_version < "4.0" +dill==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +distlib==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +distro==1.8.0 ; python_version >= "3.8" and python_version < "4.0" +dns-lexicon==3.15.0 ; python_version >= "3.8" and python_version < "4.0" +dnspython==2.4.2 ; python_version >= "3.8" and python_version < "4.0" +docutils==0.18.1 ; python_version >= "3.8" and python_version < "4.0" +dulwich==0.20.50 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.11" +execnet==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +executing==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +fabric==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +filelock==3.12.4 ; python_version >= "3.8" and python_version < "4.0" +google-api-core==2.12.0 ; python_version >= "3.8" and python_version < "4.0" +google-api-python-client==2.102.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth-httplib2==0.1.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.23.3 ; python_version >= "3.8" and python_version < "4.0" +googleapis-common-protos==1.60.0 ; python_version >= "3.8" and python_version < "4.0" +html5lib==1.1 ; python_version >= "3.8" and python_version < "4.0" +httplib2==0.22.0 ; python_version >= "3.8" and python_version < "4.0" +idna==3.4 ; python_version >= "3.8" and python_version < "4.0" +imagesize==1.4.1 ; python_version >= "3.8" and python_version < "4.0" +importlib-metadata==4.13.0 ; python_version >= "3.8" and python_version < "4.0" +importlib-resources==6.1.0 ; python_version >= "3.8" and python_version < "4.0" +iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +invoke==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +ipdb==0.13.13 ; python_version >= "3.8" and python_version < "4.0" +ipython==8.12.3 ; python_version >= "3.8" and python_version < "4.0" +isodate==0.6.1 ; python_version >= "3.8" and python_version < "4.0" +isort==5.12.0 ; python_version >= "3.8" and python_version < "4.0" +jaraco-classes==3.3.0 ; python_version >= "3.8" and python_version < "4.0" +jedi==0.19.1 ; python_version >= "3.8" and python_version < "4.0" +jeepney==0.8.0 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux" +jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0" +jmespath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" +josepy==1.13.0 ; python_version >= "3.8" and python_version < "4.0" +jsonlines==4.0.0 ; python_version >= "3.8" and python_version < "4.0" +jsonpickle==3.0.2 ; python_version >= "3.8" and python_version < "4.0" +jsonschema-specifications==2023.7.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.19.1 ; python_version >= "3.8" and python_version < "4.0" +keyring==24.2.0 ; python_version >= "3.8" and python_version < "4.0" +lazy-object-proxy==1.9.0 ; python_version >= "3.8" and python_version < "4.0" +lockfile==0.12.2 ; python_version >= "3.8" and python_version < "4.0" +markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4.0" +matplotlib-inline==0.1.6 ; python_version >= "3.8" and python_version < "4.0" +mccabe==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +more-itertools==10.1.0 ; python_version >= "3.8" and python_version < "4.0" +msgpack==1.0.7 ; python_version >= "3.8" and python_version < "4.0" +msrest==0.7.1 ; python_version >= "3.8" and python_version < "4.0" +mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" +mypy==1.5.1 ; python_version >= "3.8" and python_version < "4.0" +nh3==0.2.14 ; python_version >= "3.8" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +paramiko==3.3.1 ; python_version >= "3.8" and python_version < "4.0" +parsedatetime==2.6 ; python_version >= "3.8" and python_version < "4.0" +parso==0.8.3 ; python_version >= "3.8" and python_version < "4.0" +pexpect==4.8.0 ; python_version >= "3.8" and python_version < "4.0" +pickleshare==0.7.5 ; python_version >= "3.8" and python_version < "4.0" +pip==23.2.1 ; python_version >= "3.8" and python_version < "4.0" +pkginfo==1.9.6 ; python_version >= "3.8" and python_version < "4.0" +pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pluggy==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +ply==3.11 ; python_version >= "3.8" and python_version < "4.0" +poetry-core==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +poetry-plugin-export==1.2.0 ; python_version >= "3.8" and python_version < "4.0" +poetry==1.2.2 ; python_version >= "3.8" and python_version < "4.0" +prompt-toolkit==3.0.39 ; python_version >= "3.8" and python_version < "4.0" +protobuf==4.24.4 ; python_version >= "3.8" and python_version < "4.0" +ptyprocess==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +pure-eval==0.2.2 ; python_version >= "3.8" and python_version < "4.0" +py==1.11.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.5.0 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.16.1 ; python_version >= "3.8" and python_version < "4.0" +pylev==1.4.0 ; python_version >= "3.8" and python_version < "4.0" +pylint==2.15.5 ; python_version >= "3.8" and python_version < "4.0" +pynacl==1.5.0 ; python_version >= "3.8" and python_version < "4.0" +pynsist==2.7 ; python_version >= "3.8" and python_version < "4.0" +pyopenssl==23.2.0 ; python_version >= "3.8" and python_version < "4.0" +pyotp==2.9.0 ; python_version >= "3.8" and python_version < "4.0" +pyparsing==3.1.1 ; python_version >= "3.8" and python_version < "4.0" +pyrfc3339==1.1 ; python_version >= "3.8" and python_version < "4.0" +pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "4.0" +pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "4.0" +pytest==7.4.2 ; python_version >= "3.8" and python_version < "4.0" +python-augeas==1.1.0 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +python-digitalocean==1.17.0 ; python_version >= "3.8" and python_version < "4.0" +pytz==2023.3.post1 ; python_version >= "3.8" and python_version < "4.0" +pywin32-ctypes==0.2.2 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +readme-renderer==42.0 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.30.2 ; python_version >= "3.8" and python_version < "4.0" +requests-download==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +requests-file==1.5.1 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests-toolbelt==0.9.1 ; python_version >= "3.8" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rfc3986==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.6.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.10.4 ; python_version >= "3.8" and python_version < "4.0" +rsa==4.9 ; python_version >= "3.8" and python_version < "4" +s3transfer==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +secretstorage==3.3.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux" +semantic-version==2.10.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools-rust==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools==67.4.0 ; python_version >= "3.8" and python_version < "4.0" +shellingham==1.5.3 ; python_version >= "3.8" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +snowballstemmer==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +soupsieve==2.5 ; python_version >= "3.8" and python_version < "4.0" +sphinx-rtd-theme==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sphinx==7.1.2 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-jquery==4.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "4.0" +stack-data==0.6.3 ; python_version >= "3.8" and python_version < "4.0" +tldextract==3.6.0 ; python_version >= "3.8" and python_version < "4.0" +tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6" +tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "4.0" +tox==3.28.0 ; python_version >= "3.8" and python_version < "4.0" +traitlets==5.11.2 ; python_version >= "3.8" and python_version < "4.0" +twine==4.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-pyopenssl==23.2.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "4.0" +types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "4.0" +types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "4.0" +types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "4.0" +types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "4.0" +types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "4.0" +types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "4.0" +types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "4.0" +uritemplate==4.1.1 ; python_version >= "3.8" and python_version < "4.0" +urllib3==1.26.17 ; python_version < "4.0" and python_version >= "3.8" +virtualenv==20.21.1 ; python_version >= "3.8" and python_version < "4.0" +wcwidth==0.2.8 ; python_version >= "3.8" and python_version < "4.0" +webencodings==0.5.1 ; python_version >= "3.8" and python_version < "4.0" +wheel==0.41.2 ; python_version >= "3.8" and python_version < "4.0" +wrapt==1.15.0 ; python_version >= "3.8" and python_version < "4.0" +xattr==0.9.9 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "darwin" +yarg==0.1.9 ; python_version >= "3.8" and python_version < "4.0" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "4.0" diff --git a/tools/venv.py b/tools/venv.py index 244a13798..8a3650678 100755 --- a/tools/venv.py +++ b/tools/venv.py @@ -117,7 +117,7 @@ def _check_version(version_str): version = (int(search.group(1)), int(search.group(2))) - if version >= (3, 7): + if version >= (3, 8): return True print('Incompatible python version for Certbot found: {0}'.format(version_str)) diff --git a/tox.ini b/tox.ini index 302f56478..dc83a5d4e 100644 --- a/tox.ini +++ b/tox.ini @@ -56,10 +56,10 @@ commands = commands = {[testenv:py-win]commands} certbot-apache -[testenv:py3{,7,8,9,10,11}] +[testenv:py3{,8,9,10,11}] commands = {[testenv:py]commands} -[testenv:py3.{7,8,9,10,11}] +[testenv:py3.{8,9,10,11}] commands = {[testenv:py]commands} [testenv:oldest] @@ -69,7 +69,7 @@ commands = {[testenv:py]commands} # # This version should be kept in sync with the one declared in # tools/pinning/oldest/pyproject.toml. -basepython = python3.7 +basepython = python3.8 setenv = CERTBOT_OLDEST=1 commands = {[testenv:py]commands} diff --git a/windows-installer/setup.py b/windows-installer/setup.py index 05ac7f12a..e10c54b69 100644 --- a/windows-installer/setup.py +++ b/windows-installer/setup.py @@ -11,14 +11,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', From 11e17ef77b2d819d0ed3b32a59da4a71cca0fb2c Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Fri, 13 Oct 2023 12:02:01 -0700 Subject: [PATCH 15/29] helpful: fix handling of abbreviated ConfigArgparse arguments (#9796) * helpful: fix handling of abbreviated ConfigArgparse arguments ConfigArgparse allows for "abbreviated" arguments, i.e. just the prefix of an argument, but it doesn't set the argument sources in these cases. This commit checks for those cases and sets the sources appropriately. * failing to find an action raises an error instead of logging * Update changelog * Add handling for short arguments, fix equals sign handling These were silently being dropped before, possibly leading to instances of `NamespaceConfig.set_by_user()` returning false negatives. --- certbot/CHANGELOG.md | 3 +- certbot/certbot/_internal/cli/helpful.py | 60 ++++++++++++++++++--- certbot/certbot/_internal/tests/cli_test.py | 42 +++++++++++++++ 3 files changed, 96 insertions(+), 9 deletions(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 28a866731..92ceba3fb 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,7 +14,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed -* +* Fixed a bug where argument sources weren't correctly detected in abbreviated + arguments, short arguments, and some other circumstances More details about these changes can be found on our GitHub repo. diff --git a/certbot/certbot/_internal/cli/helpful.py b/certbot/certbot/_internal/cli/helpful.py index f42096ded..6fea1b131 100644 --- a/certbot/certbot/_internal/cli/helpful.py +++ b/certbot/certbot/_internal/cli/helpful.py @@ -187,10 +187,12 @@ class HelpfulArgumentParser: # 2. config files # 3. env vars (shouldn't be any) # 4. command line + def update_result(settings_dict: Dict[str, Tuple[configargparse.Action, str]], source: ArgumentSource) -> None: - actions = [action for _, (action, _) in settings_dict.items()] - result.update({ action.dest: source for action in actions}) + actions = [self._find_action_for_arg(arg) if action is None else action + for arg, (action, _) in settings_dict.items()] + result.update({ action.dest: source for action in actions }) # config file sources look like "config_file|" for source_key in source_to_settings_dict: @@ -203,17 +205,59 @@ class HelpfulArgumentParser: if 'command_line' in source_to_settings_dict: settings_dict: Dict[str, Tuple[None, List[str]]] settings_dict = source_to_settings_dict['command_line'] # type: ignore - (_, args) = settings_dict[''] - args = [arg for arg in args if arg.startswith('-')] + (_, unprocessed_args) = settings_dict[''] + args = [] + for arg in unprocessed_args: + # ignore non-arguments + if not arg.startswith('-'): + continue + + # special case for config file argument, which we don't have an action for + if arg in ['-c', '--config']: + result['config_dir'] = ArgumentSource.COMMAND_LINE + continue + + if '=' in arg: + arg = arg.split('=')[0] + + if arg.startswith('--'): + args.append(arg) + # for short args (ones that start with a single hyphen), handle + # the case of multiple short args together, e.g. "-tvm" + else: + for short_arg in arg[1:]: + args.append(f"-{short_arg}") + for arg in args: # find the action corresponding to this arg - for action in self.actions: - if arg in action.option_strings: - result[action.dest] = ArgumentSource.COMMAND_LINE - continue + action = self._find_action_for_arg(arg) + result[action.dest] = ArgumentSource.COMMAND_LINE return result + def _find_action_for_arg(self, arg: str) -> configargparse.Action: + # Finds a configargparse Action which matches the given arg, where arg + # can either be preceded by hyphens (as on the command line) or not (as + # in config files) + + # if the argument doesn't have leading hypens, prefix it so it can be + # compared directly w/ action option strings + if arg[0] != '-': + arg = '--' + arg + + # first, check for exact matches + for action in self.actions: + if arg in action.option_strings: + return action + + # now check for abbreviated (i.e. prefix) matches + for action in self.actions: + for option_string in action.option_strings: + if option_string.startswith(arg): + return action + + raise AssertionError(f"Action corresponding to argument {arg} is None") + def parse_args(self) -> NamespaceConfig: """Parses command line arguments and returns the result. diff --git a/certbot/certbot/_internal/tests/cli_test.py b/certbot/certbot/_internal/tests/cli_test.py index 446b2252f..e4505dbee 100644 --- a/certbot/certbot/_internal/tests/cli_test.py +++ b/certbot/certbot/_internal/tests/cli_test.py @@ -552,6 +552,48 @@ class ParseTest(unittest.TestCase): ]) assert_value_and_source(namespace, 'server', COMMAND_LINE_VALUE, ArgumentSource.COMMAND_LINE) + def test_abbreviated_arguments(self): + # Argparse's "allow_abbrev" option (which is True by default) allows + # for unambiguous partial arguments (e.g. "--preferred-chal dns" will be + # interepreted the same as "--preferred-challenges dns") + namespace = self.parse('--preferred-chal dns --no-dir') + assert_set_by_user_with_value(namespace, 'pref_challs', ['dns-01']) + assert_set_by_user_with_value(namespace, 'directory_hooks', False) + + with tempfile.NamedTemporaryFile() as tmp_config: + tmp_config.close() # close now because of compatibility issues on Windows + with open(tmp_config.name, 'w') as file_h: + file_h.write('preferred-chal = dns') + + namespace = self.parse([ + 'certonly', + '--config', tmp_config.name, + ]) + assert_set_by_user_with_value(namespace, 'pref_challs', ['dns-01']) + + @mock.patch('certbot._internal.hooks.validate_hooks') + def test_argument_with_equals(self, unsused_mock_validate_hooks): + namespace = self.parse('-d=example.com') + assert_set_by_user_with_value(namespace, 'domains', ['example.com']) + + # make sure it doesn't choke on equals signs being present in the argument value + plugins = disco.PluginsRegistry.find_all() + namespace = cli.prepare_and_parse_args(plugins, ['run', '--pre-hook="foo=bar"']) + assert_set_by_user_with_value(namespace, 'pre_hook', '"foo=bar"') + + def test_adjacent_short_args(self): + namespace = self.parse('-tv') + assert_set_by_user_with_value(namespace, 'text_mode', True) + assert_set_by_user_with_value(namespace, 'verbose_count', 1) + + namespace = self.parse('-tvvv') + assert_set_by_user_with_value(namespace, 'text_mode', True) + assert_set_by_user_with_value(namespace, 'verbose_count', 3) + + namespace = self.parse('-tvm foo@example.com') + assert_set_by_user_with_value(namespace, 'text_mode', True) + assert_set_by_user_with_value(namespace, 'verbose_count', 1) + assert_set_by_user_with_value(namespace, 'email', 'foo@example.com') if __name__ == '__main__': sys.exit(pytest.main(sys.argv[1:] + [__file__])) # pragma: no cover From a96fb4b6ce745cef62a9ae178d465d3e8a604067 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Mon, 16 Oct 2023 17:54:24 -0700 Subject: [PATCH 16/29] Fix finish_release.py (#9800) * response is value * rename vars --- tools/finish_release.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/finish_release.py b/tools/finish_release.py index 723f38004..9b90ad322 100755 --- a/tools/finish_release.py +++ b/tools/finish_release.py @@ -73,7 +73,7 @@ def parse_args(args): parser.add_argument('--css', type=str, required=True, help='hostname of code signing server') return parser.parse_args(args) - + def publish_windows(css): """SSH into CSS and trigger downloading Azure Pipeline assets, sign, and upload to Github @@ -83,7 +83,7 @@ def publish_windows(css): username = input("CSS username (usually EFF username): ") host = css command = "ssh -t {}@{} bash /opt/certbot-misc/css/venv.sh".format(username,host) - + print("SSH into CSS to trigger signing and uploading of Windows installer...") subprocess.run(command, check=True, universal_newlines=True, shell=True) @@ -182,16 +182,16 @@ def fetch_version_number(major_version=None): :type major_version: str or None :returns: version number - + """ # Create a connection to the azure org organization_url = 'https://dev.azure.com/certbot' connection = Connection(base_url=organization_url) - + # Find the build artifacts build_client = connection.clients.get_build_client() - get_builds_response = build_client.get_builds('certbot', definitions='3') - for build in get_builds_response.value: + builds = build_client.get_builds('certbot', definitions='3') + for build in builds: version = build_client.get_build('certbot', build.id).source_branch.split('v')[1] if major_version is None or version.split('.')[0] == major_version: return version @@ -206,7 +206,7 @@ def main(args): # Once the GitHub release has been published, trying to publish it # again fails. Publishing the snaps can be done multiple times though # so we do that first to make it easier to run the script again later - # if something goes wrong. + # if something goes wrong. promote_snaps(ALL_SNAPS, 'beta', version) publish_windows(css) From 5cf5f36f19ec7c3a984af302b2db6cc4b2cfca2e Mon Sep 17 00:00:00 2001 From: Adrien Ferrand Date: Wed, 18 Oct 2023 22:19:26 +0200 Subject: [PATCH 17/29] Update Lexicon requirements to stabilize certbot-dns-ovh behavior (#9802) * Update minimum Lexicon version required for certbot-dns-ovh * Add types * FIx mypy * Fix lint * Fix BOTH lint and mypy --- .../certbot_integration_tests/utils/misc.py | 8 ++++---- certbot-ci/setup.py | 2 +- certbot-dns-ovh/setup.py | 2 +- certbot/CHANGELOG.md | 1 + tools/oldest_constraints.txt | 7 ++++--- tools/pinning/oldest/pyproject.toml | 2 +- tools/requirements.txt | 16 ++++++++-------- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/certbot-ci/certbot_integration_tests/utils/misc.py b/certbot-ci/certbot_integration_tests/utils/misc.py index 8260ccf5e..dfeda4cda 100644 --- a/certbot-ci/certbot_integration_tests/utils/misc.py +++ b/certbot-ci/certbot_integration_tests/utils/misc.py @@ -52,10 +52,10 @@ def _suppress_x509_verification_warnings() -> None: urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) except ImportError: # Handle old versions of request with vendorized urllib3 - # pylint: disable=no-member - from requests.packages.urllib3.exceptions import InsecureRequestWarning - requests.packages.urllib3.disable_warnings( # type: ignore[attr-defined] - InsecureRequestWarning) + # pylint: disable=no-member,line-too-long + from requests.packages.urllib3.exceptions import InsecureRequestWarning # type: ignore[import-untyped] + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # type: ignore[attr-defined] + # pylint: enable=no-member,line-too-long def check_until_timeout(url: str, attempts: int = 30) -> None: diff --git a/certbot-ci/setup.py b/certbot-ci/setup.py index 2cb8308c1..81feeb7cf 100644 --- a/certbot-ci/setup.py +++ b/certbot-ci/setup.py @@ -21,7 +21,7 @@ install_requires = [ 'pytz>=2019.3', 'requests', 'setuptools', - 'types-python-dateutil' + 'types-python-dateutil', ] setup( diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index e4c615f3f..e3fe41d82 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -7,7 +7,7 @@ from setuptools import setup version = '2.8.0.dev0' install_requires = [ - 'dns-lexicon>=3.14.1', + 'dns-lexicon>=3.15.1', 'setuptools>=41.6.0', ] diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 92ceba3fb..900948fc6 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,6 +14,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed +* `certbot-dns-ovh` plugin now requires `lexicon>=3.15.1` to ensure a consistent behavior with OVH APIs. * Fixed a bug where argument sources weren't correctly detected in abbreviated arguments, short arguments, and some other circumstances diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index d667873d4..2f09901a1 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -20,7 +20,7 @@ cython==0.29.36 ; python_version >= "3.8" and python_version < "3.9" dill==0.3.7 ; python_version >= "3.8" and python_version < "3.9" distlib==0.3.7 ; python_version >= "3.8" and python_version < "3.9" distro==1.0.1 ; python_version >= "3.8" and python_version < "3.9" -dns-lexicon==3.14.1 ; python_version >= "3.8" and python_version < "3.9" +dns-lexicon==3.15.1 ; python_version >= "3.8" and python_version < "3.9" dnspython==1.15.0 ; python_version >= "3.8" and python_version < "3.9" exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.9" execnet==2.0.2 ; python_version >= "3.8" and python_version < "3.9" @@ -41,7 +41,7 @@ josepy==1.13.0 ; python_version >= "3.8" and python_version < "3.9" logger==1.4 ; python_version >= "3.8" and python_version < "3.9" mccabe==0.7.0 ; python_version >= "3.8" and python_version < "3.9" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.9" -mypy==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +mypy==1.6.0 ; python_version >= "3.8" and python_version < "3.9" ndg-httpsclient==0.3.2 ; python_version >= "3.8" and python_version < "3.9" oauth2client==4.1.3 ; python_version >= "3.8" and python_version < "3.9" packaging==23.2 ; python_version >= "3.8" and python_version < "3.9" @@ -57,6 +57,7 @@ pyasn1==0.4.8 ; python_version >= "3.8" and python_version < "3.9" pycparser==2.14 ; python_version >= "3.8" and python_version < "3.9" pylint==3.0.1 ; python_version >= "3.8" and python_version < "3.9" pyopenssl==17.5.0 ; python_version >= "3.8" and python_version < "3.9" +pyotp==2.9.0 ; python_version >= "3.8" and python_version < "3.9" pyparsing==2.2.1 ; python_version >= "3.8" and python_version < "3.9" pyrfc3339==1.0 ; python_version >= "3.8" and python_version < "3.9" pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "3.9" @@ -75,7 +76,7 @@ s3transfer==0.3.7 ; python_version >= "3.8" and python_version < "3.9" setuptools==41.6.0 ; python_version >= "3.8" and python_version < "3.9" six==1.11.0 ; python_version >= "3.8" and python_version < "3.9" soupsieve==2.5 ; python_version >= "3.8" and python_version < "3.9" -tldextract==3.6.0 ; python_version >= "3.8" and python_version < "3.9" +tldextract==5.0.0 ; python_version >= "3.8" and python_version < "3.9" tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.9" tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "3.9" tox==1.9.2 ; python_version >= "3.8" and python_version < "3.9" diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index 302014ae5..1a4d7d71f 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -54,7 +54,7 @@ cloudflare = "1.5.1" configobj = "5.0.6" cryptography = "3.2.1" distro = "1.0.1" -dns-lexicon = "3.14.1" +dns-lexicon = "3.15.1" dnspython = "1.15.0" funcsigs = "0.4" google-api-python-client = "1.6.5" diff --git a/tools/requirements.txt b/tools/requirements.txt index af906a4ba..1ed0ca0ee 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -17,8 +17,8 @@ babel==2.13.0 ; python_version >= "3.8" and python_version < "4.0" backcall==0.2.0 ; python_version >= "3.8" and python_version < "4.0" bcrypt==4.0.1 ; python_version >= "3.8" and python_version < "4.0" beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0" -boto3==1.28.62 ; python_version >= "3.8" and python_version < "4.0" -botocore==1.31.62 ; python_version >= "3.8" and python_version < "4.0" +boto3==1.28.63 ; python_version >= "3.8" and python_version < "4.0" +botocore==1.31.63 ; python_version >= "3.8" and python_version < "4.0" cachecontrol==0.12.14 ; python_version >= "3.8" and python_version < "4.0" cachetools==5.3.1 ; python_version >= "3.8" and python_version < "4.0" cachy==0.3.0 ; python_version >= "3.8" and python_version < "4.0" @@ -39,7 +39,7 @@ deprecated==1.2.14 ; python_version >= "3.8" and python_version < "4.0" dill==0.3.7 ; python_version >= "3.8" and python_version < "4.0" distlib==0.3.7 ; python_version >= "3.8" and python_version < "4.0" distro==1.8.0 ; python_version >= "3.8" and python_version < "4.0" -dns-lexicon==3.15.0 ; python_version >= "3.8" and python_version < "4.0" +dns-lexicon==3.15.1 ; python_version >= "3.8" and python_version < "4.0" dnspython==2.4.2 ; python_version >= "3.8" and python_version < "4.0" docutils==0.18.1 ; python_version >= "3.8" and python_version < "4.0" dulwich==0.20.50 ; python_version >= "3.8" and python_version < "4.0" @@ -49,10 +49,10 @@ executing==2.0.0 ; python_version >= "3.8" and python_version < "4.0" fabric==3.2.2 ; python_version >= "3.8" and python_version < "4.0" filelock==3.12.4 ; python_version >= "3.8" and python_version < "4.0" google-api-core==2.12.0 ; python_version >= "3.8" and python_version < "4.0" -google-api-python-client==2.102.0 ; python_version >= "3.8" and python_version < "4.0" +google-api-python-client==2.103.0 ; python_version >= "3.8" and python_version < "4.0" google-auth-httplib2==0.1.1 ; python_version >= "3.8" and python_version < "4.0" google-auth==2.23.3 ; python_version >= "3.8" and python_version < "4.0" -googleapis-common-protos==1.60.0 ; python_version >= "3.8" and python_version < "4.0" +googleapis-common-protos==1.61.0 ; python_version >= "3.8" and python_version < "4.0" html5lib==1.1 ; python_version >= "3.8" and python_version < "4.0" httplib2==0.22.0 ; python_version >= "3.8" and python_version < "4.0" idna==3.4 ; python_version >= "3.8" and python_version < "4.0" @@ -87,7 +87,7 @@ more-itertools==10.1.0 ; python_version >= "3.8" and python_version < "4.0" msgpack==1.0.7 ; python_version >= "3.8" and python_version < "4.0" msrest==0.7.1 ; python_version >= "3.8" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" -mypy==1.5.1 ; python_version >= "3.8" and python_version < "4.0" +mypy==1.6.0 ; python_version >= "3.8" and python_version < "4.0" nh3==0.2.14 ; python_version >= "3.8" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" @@ -141,7 +141,7 @@ requests-toolbelt==0.9.1 ; python_version >= "3.8" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" rfc3986==2.0.0 ; python_version >= "3.8" and python_version < "4.0" rich==13.6.0 ; python_version >= "3.8" and python_version < "4.0" -rpds-py==0.10.4 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.10.6 ; python_version >= "3.8" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4" s3transfer==0.7.0 ; python_version >= "3.8" and python_version < "4.0" secretstorage==3.3.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux" @@ -162,7 +162,7 @@ sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "4.0" sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "4.0" stack-data==0.6.3 ; python_version >= "3.8" and python_version < "4.0" -tldextract==3.6.0 ; python_version >= "3.8" and python_version < "4.0" +tldextract==5.0.0 ; python_version >= "3.8" and python_version < "4.0" tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6" tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "4.0" tox==3.28.0 ; python_version >= "3.8" and python_version < "4.0" From 6f7b5ab1cd900b9d2e7970902e832cf2e5f41d97 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 18 Oct 2023 14:32:07 -0700 Subject: [PATCH 18/29] simplify code (#9807) --- certbot-ci/certbot_integration_tests/utils/misc.py | 11 ++--------- certbot-ci/setup.py | 4 +++- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/certbot-ci/certbot_integration_tests/utils/misc.py b/certbot-ci/certbot_integration_tests/utils/misc.py index dfeda4cda..8ef59fe1b 100644 --- a/certbot-ci/certbot_integration_tests/utils/misc.py +++ b/certbot-ci/certbot_integration_tests/utils/misc.py @@ -47,15 +47,8 @@ ECDSA_KEY_TYPE = 'ecdsa' def _suppress_x509_verification_warnings() -> None: - try: - import urllib3 - urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - except ImportError: - # Handle old versions of request with vendorized urllib3 - # pylint: disable=no-member,line-too-long - from requests.packages.urllib3.exceptions import InsecureRequestWarning # type: ignore[import-untyped] - requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # type: ignore[attr-defined] - # pylint: enable=no-member,line-too-long + import urllib3 + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def check_until_timeout(url: str, attempts: int = 30) -> None: diff --git a/certbot-ci/setup.py b/certbot-ci/setup.py index 81feeb7cf..4fd64e258 100644 --- a/certbot-ci/setup.py +++ b/certbot-ci/setup.py @@ -19,7 +19,9 @@ install_requires = [ 'pywin32>=300 ; sys_platform == "win32"', 'pyyaml', 'pytz>=2019.3', - 'requests', + # requests unvendored its dependencies in version 2.16.0 and this code relies on that for + # calling `urllib3.disable_warnings`. + 'requests>=2.16.0', 'setuptools', 'types-python-dateutil', ] From 937eaef6219e0c87c804ccd2a9af74a0bacbfee7 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Thu, 19 Oct 2023 15:33:34 -0700 Subject: [PATCH 19/29] Update changelog for 2.7.2 release --- certbot/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 07ed9a140..81b3ab792 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,7 +2,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). -## 2.7.2 - master +## 2.7.2 - 2023-10-19 ### Fixed From a1b773cbdc1027214b2cb9dc46cfba66b0ae7af2 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Thu, 19 Oct 2023 15:34:18 -0700 Subject: [PATCH 20/29] Release 2.7.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 +- certbot/docs/cli-help.txt | 4 ++-- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index 2b51aaf16..fc149889c 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.1' +version = '2.7.2' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index d6c1a8845..f95fb16c5 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.1' +version = '2.7.2' 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 995645ef5..bb26ad545 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.1' +version = '2.7.2' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index d4f721747..eb6cabb3b 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.1' +version = '2.7.2' install_requires = [ 'cloudflare>=1.5.1', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index 07f108205..b51250bc5 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.1' +version = '2.7.2' 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 895b6871a..95c732297 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.1' +version = '2.7.2' 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 85bbbbe37..1d6aa5f1e 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index 0c7a419fd..207d96ff4 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index f2103916e..6fbd893c5 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.1' +version = '2.7.2' install_requires = [ 'google-api-python-client>=1.6.5', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 0ce400e6f..bb77c2f3f 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index c59bc168e..870e6d839 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 2c05e0cb1..2b231ba29 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 9b86b1f1d..e9d9e6f6d 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.15.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index 007bd0638..3013de126 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.1' +version = '2.7.2' install_requires = [ 'dnspython>=1.15.0', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index 6f6e040e8..97a227fb6 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.1' +version = '2.7.2' install_requires = [ 'boto3>=1.15.15', diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index b8f5660a6..b032f8f5d 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.1' +version = '2.7.2' install_requires = [ 'dns-lexicon>=3.14.1', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 4f9c2c24a..f7c0b7d68 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.1' +version = '2.7.2' 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 1dbc91774..9260092cf 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.1' +__version__ = '2.7.2' if sys.version_info[:2] == (3, 7): warnings.warn( diff --git a/certbot/docs/cli-help.txt b/certbot/docs/cli-help.txt index e79587128..a5d98954a 100644 --- a/certbot/docs/cli-help.txt +++ b/certbot/docs/cli-help.txt @@ -36,7 +36,7 @@ manage your account: --agree-tos Agree to the ACME server's Subscriber Agreement -m EMAIL Email address for important account notifications -optional arguments: +options: -h, --help show this help message and exit -c CONFIG_FILE, --config CONFIG_FILE path to config file (default: /etc/letsencrypt/cli.ini @@ -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.1 (certbot; + "". (default: CertbotACMEClient/2.7.2 (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 185c20c71b5f90df041b962070a7568e22341a28 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Thu, 19 Oct 2023 15:34:19 -0700 Subject: [PATCH 21/29] 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 81b3ab792..2364e99f0 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.2 - 2023-10-19 ### Fixed From 1863c661790ceb6dd47610693057c62c4d7c691f Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Thu, 19 Oct 2023 15:34:19 -0700 Subject: [PATCH 22/29] Bump version to 2.8.0 --- 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 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index fc149889c..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.2' +version = '2.8.0.dev0' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index f95fb16c5..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.2' +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 bb26ad545..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.2' +version = '2.8.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index eb6cabb3b..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.2' +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 b51250bc5..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.2' +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 95c732297..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.2' +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 1d6aa5f1e..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.2' +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 207d96ff4..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.2' +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 6fbd893c5..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.2' +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 bb77c2f3f..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.2' +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 870e6d839..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.2' +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 2b231ba29..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.2' +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 e9d9e6f6d..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.2' +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 3013de126..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.2' +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 97a227fb6..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.2' +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 b032f8f5d..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.2' +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 f7c0b7d68..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.2' +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 9260092cf..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.2' +__version__ = '2.8.0.dev0' if sys.version_info[:2] == (3, 7): warnings.warn( From 3ae9d7e03a9ac0514fd4f90135000990bf7ccad6 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Tue, 24 Oct 2023 08:26:00 -0700 Subject: [PATCH 23/29] helpful: Add an edge case for arguments w/ contained spaces (#9813) Fixes #9811 --- certbot/CHANGELOG.md | 2 +- certbot/certbot/_internal/cli/helpful.py | 2 ++ certbot/certbot/_internal/tests/cli_test.py | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index ba42ee45f..ef02517cf 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,7 +14,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed -* +* Fixed a bug where arguments with contained spaces weren't being handled correctly More details about these changes can be found on our GitHub repo. diff --git a/certbot/certbot/_internal/cli/helpful.py b/certbot/certbot/_internal/cli/helpful.py index 6fea1b131..2f3b4554c 100644 --- a/certbot/certbot/_internal/cli/helpful.py +++ b/certbot/certbot/_internal/cli/helpful.py @@ -219,6 +219,8 @@ class HelpfulArgumentParser: if '=' in arg: arg = arg.split('=')[0] + elif ' ' in arg: + arg = arg.split(' ')[0] if arg.startswith('--'): args.append(arg) diff --git a/certbot/certbot/_internal/tests/cli_test.py b/certbot/certbot/_internal/tests/cli_test.py index e4505dbee..629aa03b4 100644 --- a/certbot/certbot/_internal/tests/cli_test.py +++ b/certbot/certbot/_internal/tests/cli_test.py @@ -594,6 +594,13 @@ class ParseTest(unittest.TestCase): assert_set_by_user_with_value(namespace, 'text_mode', True) assert_set_by_user_with_value(namespace, 'verbose_count', 1) assert_set_by_user_with_value(namespace, 'email', 'foo@example.com') + + def test_arg_with_contained_spaces(self): + # This can happen if a user specifies an arg like "-d foo.com" enclosed + # in double quotes, or as its own line in a docker-compose.yml file (as + # in #9811) + namespace = self.parse(['certonly', '-d foo.com']) + assert_set_by_user_with_value(namespace, 'domains', ['foo.com']) if __name__ == '__main__': sys.exit(pytest.main(sys.argv[1:] + [__file__])) # pragma: no cover From d1577280ad36710e6ed6fc639e42883c59d5f23e Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 24 Oct 2023 12:27:19 -0700 Subject: [PATCH 24/29] fixes #9805 (#9816) --- certbot/CHANGELOG.md | 3 +++ certbot/certbot/_internal/renewal.py | 5 ++++- certbot/certbot/_internal/tests/renewal_test.py | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index ef02517cf..7b35d7b11 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -15,6 +15,9 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed * Fixed a bug where arguments with contained spaces weren't being handled correctly +* Fixed a bug that caused the ACME account to not be properly restored on + renewal causing problems in setups where the user had multiple accounts with + the same ACME server. More details about these changes can be found on our GitHub repo. diff --git a/certbot/certbot/_internal/renewal.py b/certbot/certbot/_internal/renewal.py index a33dd7ee5..62e31f865 100644 --- a/certbot/certbot/_internal/renewal.py +++ b/certbot/certbot/_internal/renewal.py @@ -194,6 +194,7 @@ def restore_required_config_elements(config: configuration.NamespaceConfig, """ + updated_values = {} required_items = itertools.chain( (("pref_challs", _restore_pref_challs),), zip(BOOL_CONFIG_ITEMS, itertools.repeat(_restore_bool)), @@ -202,7 +203,9 @@ def restore_required_config_elements(config: configuration.NamespaceConfig, for item_name, restore_func in required_items: if item_name in renewalparams and not config.set_by_user(item_name): value = restore_func(item_name, renewalparams[item_name]) - setattr(config, item_name, value) + updated_values[item_name] = value + for key, value in updated_values.items(): + setattr(config, key, value) def _remove_deprecated_config_elements(renewalparams: Mapping[str, Any]) -> Dict[str, Any]: diff --git a/certbot/certbot/_internal/tests/renewal_test.py b/certbot/certbot/_internal/tests/renewal_test.py index edc9eea35..239744692 100644 --- a/certbot/certbot/_internal/tests/renewal_test.py +++ b/certbot/certbot/_internal/tests/renewal_test.py @@ -253,6 +253,18 @@ class RestoreRequiredConfigElementsTest(test_util.ConfigTestCase): self._call(self.config, {'server': constants.V1_URI}) assert self.config.server == constants.CLI_DEFAULTS['server'] + def test_related_values(self): + # certbot.configuration.NamespaceConfig.set_by_user considers some values as related to each + # other and considers both set by the user if either is. This test ensures all renewal + # parameters are restored regardless of their restoration order or relation between values. + # See https://github.com/certbot/certbot/issues/9805 for more info. + renewalparams = { + 'server': 'https://example.org', + 'account': 'somehash', + } + self._call(self.config, renewalparams) + self.assertEqual(self.config.account, renewalparams['account']) + class DescribeResultsTest(unittest.TestCase): """Tests for certbot._internal.renewal._renew_describe_results.""" From d140a7df52af63de370ff97e590941c020042c28 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 24 Oct 2023 13:43:22 -0700 Subject: [PATCH 25/29] 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 3ed4d2ff2..de002dda7 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.3 - 2023-10-24 ### Fixed From e904bd4e291e61a5ae304b3f1741e5bb6e05ac95 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 24 Oct 2023 13:43:22 -0700 Subject: [PATCH 26/29] 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 85f6ef62f..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.3' +version = '2.8.0.dev0' install_requires = [ 'cryptography>=3.2.1', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 7e4fe1443..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.3' +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 d7e9a8713..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.3' +version = '2.8.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index 04fcf61d3..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.3' +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 390af42bc..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.3' +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 5e3eb6bb8..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.3' +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 e5a58e658..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.3' +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 5294895b3..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.3' +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 e328cb629..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.3' +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 47c108e85..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.3' +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 8cce68501..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.3' +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 b05b7bb66..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.3' +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 479337e8f..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.3' +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 7a2d66ba6..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.3' +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 d17793c9e..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.3' +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 289de7a58..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.3' +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 a0c9680d5..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.3' +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 a84a327fd..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.3' +__version__ = '2.8.0.dev0' if sys.version_info[:2] == (3, 7): warnings.warn( From cf4f07d17e22924f7d7d3f41a09136df22981765 Mon Sep 17 00:00:00 2001 From: Adrien Ferrand Date: Fri, 27 Oct 2023 19:04:40 +0200 Subject: [PATCH 27/29] 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 --- certbot/certbot/plugins/dns_common_lexicon.py | 4 ++++ 1 file changed, 4 insertions(+) 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 7bb85f844069cafbf1184d46f6e3c649fbfcc7d4 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Fri, 27 Oct 2023 15:04:11 -0700 Subject: [PATCH 28/29] add changelog entry for 9821 (#9822) --- certbot/CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index efcba9fc4..729f2146a 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,7 +14,9 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### 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. From c3c29afdca43cc1e17e33ba9d4e6120167f5112c Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 31 Oct 2023 16:28:16 -0700 Subject: [PATCH 29/29] Fix change detection on mutable values (#9829) * handle mutable values * add unit test * add changelog entry * fix typo --- 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 729f2146a..658fd2103 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,6 +14,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"