-
-
Notifications
You must be signed in to change notification settings - Fork 33.3k
gh-94172: Remove keyfile, certfile and check_hostname parameters #94173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -713,28 +713,12 @@ class FTP_TLS(FTP): | |
| '221 Goodbye.' | ||
| >>> | ||
| ''' | ||
| ssl_version = ssl.PROTOCOL_TLS_CLIENT | ||
|
|
||
| def __init__(self, host='', user='', passwd='', acct='', | ||
| keyfile=None, certfile=None, context=None, | ||
|
||
| timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, *, | ||
| encoding='utf-8'): | ||
| if context is not None and keyfile is not None: | ||
| raise ValueError("context and keyfile arguments are mutually " | ||
| "exclusive") | ||
| if context is not None and certfile is not None: | ||
| raise ValueError("context and certfile arguments are mutually " | ||
| "exclusive") | ||
| if keyfile is not None or certfile is not None: | ||
| import warnings | ||
| warnings.warn("keyfile and certfile are deprecated, use a " | ||
| "custom context instead", DeprecationWarning, 2) | ||
| self.keyfile = keyfile | ||
| self.certfile = certfile | ||
| *, context=None, timeout=_GLOBAL_DEFAULT_TIMEOUT, | ||
| source_address=None, encoding='utf-8'): | ||
| if context is None: | ||
| context = ssl._create_stdlib_context(self.ssl_version, | ||
| certfile=certfile, | ||
| keyfile=keyfile) | ||
| context = ssl._create_stdlib_context() | ||
| self.context = context | ||
| self._prot_p = False | ||
| super().__init__(host, user, passwd, acct, | ||
|
|
@@ -749,7 +733,7 @@ def auth(self): | |
| '''Set up secure control connection by using TLS/SSL.''' | ||
| if isinstance(self.sock, ssl.SSLSocket): | ||
| raise ValueError("Already using TLS") | ||
| if self.ssl_version >= ssl.PROTOCOL_TLS: | ||
|
||
| if self.context.protocol >= ssl.PROTOCOL_TLS: | ||
| resp = self.voidcmd('AUTH TLS') | ||
| else: | ||
| resp = self.voidcmd('AUTH SSL') | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1285,40 +1285,23 @@ class IMAP4_SSL(IMAP4): | |
|
|
||
| """IMAP4 client class over SSL connection | ||
|
|
||
| Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout=None]]]]]]) | ||
| Instantiate with: IMAP4_SSL([host[, port[, ssl_context[, timeout=None]]]]) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line is completely redundant, because the output of pydoc already contains the constructor signature. The same in other classes in this module, and maybe in other modules. I would prefer to remove this line and edit the following parameters descriptions, and do it before merging this PR to make backporting easier. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This PR is already big enough. If you want to enhance the documentation, please change it in a separated change. I don't see how updating this doc is a pre-requirement to remove the two parameters. |
||
|
|
||
| host - host's name (default: localhost); | ||
| port - port number (default: standard IMAP4 SSL port); | ||
| keyfile - PEM formatted file that contains your private key (default: None); | ||
| certfile - PEM formatted certificate chain file (default: None); | ||
| ssl_context - a SSLContext object that contains your certificate chain | ||
| and private key (default: None) | ||
| Note: if ssl_context is provided, then parameters keyfile or | ||
| certfile should not be set otherwise ValueError is raised. | ||
| timeout - socket timeout (default: None) If timeout is not given or is None, | ||
| the global default socket timeout is used | ||
|
|
||
| for more documentation see the docstring of the parent class IMAP4. | ||
| """ | ||
|
|
||
|
|
||
| def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, | ||
| certfile=None, ssl_context=None, timeout=None): | ||
| if ssl_context is not None and keyfile is not None: | ||
| raise ValueError("ssl_context and keyfile arguments are mutually " | ||
| "exclusive") | ||
| if ssl_context is not None and certfile is not None: | ||
| raise ValueError("ssl_context and certfile arguments are mutually " | ||
| "exclusive") | ||
| if keyfile is not None or certfile is not None: | ||
| import warnings | ||
| warnings.warn("keyfile and certfile are deprecated, use a " | ||
| "custom ssl_context instead", DeprecationWarning, 2) | ||
| self.keyfile = keyfile | ||
| self.certfile = certfile | ||
| def __init__(self, host='', port=IMAP4_SSL_PORT, | ||
| *, ssl_context=None, timeout=None): | ||
| if ssl_context is None: | ||
| ssl_context = ssl._create_stdlib_context(certfile=certfile, | ||
| keyfile=keyfile) | ||
| ssl_context = ssl._create_stdlib_context() | ||
| self.ssl_context = ssl_context | ||
| IMAP4.__init__(self, host, port, timeout) | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is it removed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you provide a SSLContext, you get different protocol than
FTP_TLS.ssl_version. This removal is not required, it's more to make the API consistent with the other modified modules: the SSLContext constructor is the only place setting default parameter values. Do you prefer to keep it?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do not know whether it is documented, but it specifies the default protocol if you do not provide an SSLContext. The user can override it in FTP_TLS or subclasses.
Who added this attribute? Ask him.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All protocols except PROTOCOL_TLS, TLS_CLIENT, and TLS_SERVER are deprecated anyways because OpenSSL is going to remove them eventually.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tiran: Do you see a reason to keep ssl_version to specify a different "ssl version" when context parameter is omitted?
The practical problem is more that applications relying on this feature may not notice that overriden ssl_version are now ignored silently.
Note: I hate mentions of "ssl", since SSL no longer exists, it was replaced with TLS, but the Python module is still called "ssl"... as OpenSSL ;-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is no reason to keep the variable here.
ssl.PROTOCOL_TLS_CLIENTis the only correct and fully supported value. In 3.13 I will remove all the other protocols. Onlyssl.PROTOCOL_TLS_CLIENTandssl.PROTOCOL_TLS_SERVERwill stay.