From 5503d123951b8251ac1954b1890b14d508a7bec2 Mon Sep 17 00:00:00 2001 From: Alex Zorin Date: Sun, 16 Apr 2023 10:42:15 +1000 Subject: [PATCH 1/3] types: CredentialsConfiguration.conf can return None --- .../_internal/dns_digitalocean.py | 3 ++- .../certbot_dns_dnsimple/_internal/dns_dnsimple.py | 3 ++- .../_internal/dns_dnsmadeeasy.py | 5 +++-- .../certbot_dns_gehirn/_internal/dns_gehirn.py | 5 +++-- .../certbot_dns_linode/_internal/dns_linode.py | 3 ++- .../certbot_dns_luadns/_internal/dns_luadns.py | 5 +++-- .../certbot_dns_nsone/_internal/dns_nsone.py | 3 ++- .../certbot_dns_ovh/_internal/dns_ovh.py | 9 +++++---- .../certbot_dns_rfc2136/_internal/dns_rfc2136.py | 13 +++++++------ .../_internal/dns_sakuracloud.py | 5 +++-- certbot/certbot/plugins/dns_common.py | 4 ++-- 11 files changed, 34 insertions(+), 24 deletions(-) diff --git a/certbot-dns-digitalocean/certbot_dns_digitalocean/_internal/dns_digitalocean.py b/certbot-dns-digitalocean/certbot_dns_digitalocean/_internal/dns_digitalocean.py index 0c0ab3faf..37fc215ed 100644 --- a/certbot-dns-digitalocean/certbot_dns_digitalocean/_internal/dns_digitalocean.py +++ b/certbot-dns-digitalocean/certbot_dns_digitalocean/_internal/dns_digitalocean.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional import digitalocean @@ -56,7 +57,7 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_digitalocean_client(self) -> "_DigitalOceanClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _DigitalOceanClient(self.credentials.conf('token')) + return _DigitalOceanClient(cast(str, self.credentials.conf('token'))) class _DigitalOceanClient: 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 0d89d4dc1..c361e9b07 100644 --- a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py +++ b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/dns_dnsimple.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import dnsimple @@ -58,7 +59,7 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_dnsimple_client(self) -> "_DNSimpleLexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _DNSimpleLexiconClient(self.credentials.conf('token'), self.ttl) + return _DNSimpleLexiconClient(cast(str, self.credentials.conf('token')), self.ttl) class _DNSimpleLexiconClient(dns_common_lexicon.LexiconClient): diff --git a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py index f089296b0..537851986 100644 --- a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py +++ b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import dnsmadeeasy @@ -62,8 +63,8 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_dnsmadeeasy_client(self) -> "_DNSMadeEasyLexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _DNSMadeEasyLexiconClient(self.credentials.conf('api-key'), - self.credentials.conf('secret-key'), + return _DNSMadeEasyLexiconClient(cast(str,self.credentials.conf('api-key')), + cast(str,self.credentials.conf('secret-key')), self.ttl) diff --git a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py index 799d02859..c5f33c4f9 100644 --- a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py +++ b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import gehirn @@ -64,8 +65,8 @@ class Authenticator(dns_common.DNSAuthenticator): if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") return _GehirnLexiconClient( - self.credentials.conf('api-token'), - self.credentials.conf('api-secret'), + cast(str,self.credentials.conf('api-token')), + cast(str,self.credentials.conf('api-secret')), self.ttl ) diff --git a/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py b/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py index 65dc01e9b..bc5e57c60 100644 --- a/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py +++ b/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py @@ -3,6 +3,7 @@ import logging import re from typing import Any from typing import Callable +from typing import cast from typing import Optional from typing import Union @@ -61,7 +62,7 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_linode_client(self) -> '_LinodeLexiconClient': if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - api_key = self.credentials.conf('key') + api_key = cast(str,self.credentials.conf('key')) api_version: Optional[Union[str, int]] = self.credentials.conf('version') if api_version == '': api_version = None diff --git a/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py b/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py index c99273561..6ac13e5c5 100644 --- a/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py +++ b/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import luadns @@ -59,8 +60,8 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_luadns_client(self) -> "_LuaDNSLexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _LuaDNSLexiconClient(self.credentials.conf('email'), - self.credentials.conf('token'), + return _LuaDNSLexiconClient(cast(str,self.credentials.conf('email')), + cast(str,self.credentials.conf('token')), self.ttl) diff --git a/certbot-dns-nsone/certbot_dns_nsone/_internal/dns_nsone.py b/certbot-dns-nsone/certbot_dns_nsone/_internal/dns_nsone.py index ebc7f5fef..b4d1e801f 100644 --- a/certbot-dns-nsone/certbot_dns_nsone/_internal/dns_nsone.py +++ b/certbot-dns-nsone/certbot_dns_nsone/_internal/dns_nsone.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import nsone @@ -58,7 +59,7 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_nsone_client(self) -> "_NS1LexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _NS1LexiconClient(self.credentials.conf('api-key'), self.ttl) + return _NS1LexiconClient(cast(str, self.credentials.conf('api-key')), self.ttl) class _NS1LexiconClient(dns_common_lexicon.LexiconClient): diff --git a/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py b/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py index 301410ca8..1dabd7b4c 100644 --- a/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py +++ b/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import ovh @@ -65,10 +66,10 @@ class Authenticator(dns_common.DNSAuthenticator): if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") return _OVHLexiconClient( - self.credentials.conf('endpoint'), - self.credentials.conf('application-key'), - self.credentials.conf('application-secret'), - self.credentials.conf('consumer-key'), + cast(str, self.credentials.conf('endpoint')), + cast(str,self.credentials.conf('application-key')), + cast(str,self.credentials.conf('application-secret')), + cast(str,self.credentials.conf('consumer-key')), self.ttl ) diff --git a/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py b/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py index d48307750..36079ddd0 100644 --- a/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py +++ b/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional import dns.flags @@ -59,7 +60,7 @@ class Authenticator(dns_common.DNSAuthenticator): 'RFC 2136 Dynamic Updates.' def _validate_credentials(self, credentials: CredentialsConfiguration) -> None: - server = credentials.conf('server') + server = cast(str, credentials.conf('server')) if not is_ipaddress(server): raise errors.PluginError("The configured target DNS server ({0}) is not a valid IPv4 " "or IPv6 address. A hostname is not allowed.".format(server)) @@ -89,11 +90,11 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_rfc2136_client(self) -> "_RFC2136Client": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _RFC2136Client(self.credentials.conf('server'), - int(self.credentials.conf('port') or self.PORT), - self.credentials.conf('name'), - self.credentials.conf('secret'), - self.ALGORITHMS.get(self.credentials.conf('algorithm'), + return _RFC2136Client(cast(str, self.credentials.conf('server')), + int(cast(str, self.credentials.conf('port')) or self.PORT), + cast(str, self.credentials.conf('name')), + cast(str, self.credentials.conf('secret')), + self.ALGORITHMS.get(self.credentials.conf('algorithm') or '', dns.tsig.HMAC_MD5)) diff --git a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/dns_sakuracloud.py b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/dns_sakuracloud.py index 4302a78d4..0100c0c9b 100644 --- a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/dns_sakuracloud.py +++ b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/dns_sakuracloud.py @@ -2,6 +2,7 @@ import logging from typing import Any from typing import Callable +from typing import cast from typing import Optional from lexicon.providers import sakuracloud @@ -64,8 +65,8 @@ class Authenticator(dns_common.DNSAuthenticator): if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") return _SakuraCloudLexiconClient( - self.credentials.conf('api-token'), - self.credentials.conf('api-secret'), + cast(str, self.credentials.conf('api-token')), + cast(str, self.credentials.conf('api-secret')), self.ttl ) diff --git a/certbot/certbot/plugins/dns_common.py b/certbot/certbot/plugins/dns_common.py index a8e6a5a4d..85ef8cabb 100644 --- a/certbot/certbot/plugins/dns_common.py +++ b/certbot/certbot/plugins/dns_common.py @@ -312,7 +312,7 @@ class CredentialsConfiguration: ) ) - def conf(self, var: str) -> str: + def conf(self, var: str) -> Optional[str]: """Find a configuration value for variable `var`, as transformed by `mapper`. :param str var: The variable to get. @@ -325,7 +325,7 @@ class CredentialsConfiguration: def _has(self, var: str) -> bool: return self.mapper(var) in self.confobj - def _get(self, var: str) -> str: + def _get(self, var: str) -> Optional[str]: return self.confobj.get(self.mapper(var)) From ef5f4cae042ec0c33c9dda32dcd602930ff1f763 Mon Sep 17 00:00:00 2001 From: Alex Zorin Date: Tue, 18 Apr 2023 08:13:28 +1000 Subject: [PATCH 2/3] fix cast formatting --- .../certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py | 4 ++-- .../certbot_dns_gehirn/_internal/dns_gehirn.py | 4 ++-- .../certbot_dns_linode/_internal/dns_linode.py | 2 +- .../certbot_dns_luadns/_internal/dns_luadns.py | 4 ++-- certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py index 537851986..b426d43b2 100644 --- a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py +++ b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/dns_dnsmadeeasy.py @@ -63,8 +63,8 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_dnsmadeeasy_client(self) -> "_DNSMadeEasyLexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _DNSMadeEasyLexiconClient(cast(str,self.credentials.conf('api-key')), - cast(str,self.credentials.conf('secret-key')), + return _DNSMadeEasyLexiconClient(cast(str, self.credentials.conf('api-key')), + cast(str, self.credentials.conf('secret-key')), self.ttl) diff --git a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py index c5f33c4f9..60a13d965 100644 --- a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py +++ b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/dns_gehirn.py @@ -65,8 +65,8 @@ class Authenticator(dns_common.DNSAuthenticator): if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") return _GehirnLexiconClient( - cast(str,self.credentials.conf('api-token')), - cast(str,self.credentials.conf('api-secret')), + cast(str, self.credentials.conf('api-token')), + cast(str, self.credentials.conf('api-secret')), self.ttl ) diff --git a/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py b/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py index bc5e57c60..2abc3a5c8 100644 --- a/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py +++ b/certbot-dns-linode/certbot_dns_linode/_internal/dns_linode.py @@ -62,7 +62,7 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_linode_client(self) -> '_LinodeLexiconClient': if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - api_key = cast(str,self.credentials.conf('key')) + api_key = cast(str, self.credentials.conf('key')) api_version: Optional[Union[str, int]] = self.credentials.conf('version') if api_version == '': api_version = None diff --git a/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py b/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py index 6ac13e5c5..684113b62 100644 --- a/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py +++ b/certbot-dns-luadns/certbot_dns_luadns/_internal/dns_luadns.py @@ -60,8 +60,8 @@ class Authenticator(dns_common.DNSAuthenticator): def _get_luadns_client(self) -> "_LuaDNSLexiconClient": if not self.credentials: # pragma: no cover raise errors.Error("Plugin has not been prepared.") - return _LuaDNSLexiconClient(cast(str,self.credentials.conf('email')), - cast(str,self.credentials.conf('token')), + return _LuaDNSLexiconClient(cast(str, self.credentials.conf('email')), + cast(str, self.credentials.conf('token')), self.ttl) diff --git a/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py b/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py index 1dabd7b4c..9d327180b 100644 --- a/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py +++ b/certbot-dns-ovh/certbot_dns_ovh/_internal/dns_ovh.py @@ -67,9 +67,9 @@ class Authenticator(dns_common.DNSAuthenticator): raise errors.Error("Plugin has not been prepared.") return _OVHLexiconClient( cast(str, self.credentials.conf('endpoint')), - cast(str,self.credentials.conf('application-key')), - cast(str,self.credentials.conf('application-secret')), - cast(str,self.credentials.conf('consumer-key')), + cast(str, self.credentials.conf('application-key')), + cast(str, self.credentials.conf('application-secret')), + cast(str, self.credentials.conf('consumer-key')), self.ttl ) From b9ec3155f765a6c14a45371614380b290c3ca7f6 Mon Sep 17 00:00:00 2001 From: Alex Zorin Date: Tue, 18 Apr 2023 08:14:11 +1000 Subject: [PATCH 3/3] amend rtype --- certbot/certbot/plugins/dns_common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/certbot/certbot/plugins/dns_common.py b/certbot/certbot/plugins/dns_common.py index 85ef8cabb..128024bec 100644 --- a/certbot/certbot/plugins/dns_common.py +++ b/certbot/certbot/plugins/dns_common.py @@ -316,8 +316,8 @@ class CredentialsConfiguration: """Find a configuration value for variable `var`, as transformed by `mapper`. :param str var: The variable to get. - :returns: The value of the variable. - :rtype: str + :returns: The value of the variable, if it exists. + :rtype: str or None """ return self._get(var)