mirror of
https://github.com/certbot/certbot.git
synced 2026-01-26 07:41:33 +03:00
acme.messages.Error: add mutability (#9546)
* acme.messages.Error: add mutability As of Python 3.11, an exception caught within a `with` statement will update the __traceback__ attribute. Because acme.messages.Error was immutable, this was causing a knock-on exception, causing certbot to exit abnormally. This commit hacks in mutability for acme.messages.Error Fixes #9539 * Add CHANGELOG entry
This commit is contained in:
@@ -123,6 +123,9 @@ class Error(jose.JSONObjectWithFields, errors.Error):
|
||||
|
||||
https://datatracker.ietf.org/doc/html/rfc7807
|
||||
|
||||
Note: Although Error inherits from JSONObjectWithFields, which is immutable,
|
||||
we add mutability for Error to comply with the Python exception API.
|
||||
|
||||
:ivar str typ:
|
||||
:ivar str title:
|
||||
:ivar str detail:
|
||||
@@ -185,6 +188,10 @@ class Error(jose.JSONObjectWithFields, errors.Error):
|
||||
return code
|
||||
return None
|
||||
|
||||
# Hack to allow mutability on Errors (see GH #9539)
|
||||
def __setattr__(self, name: str, value: Any) -> None:
|
||||
return object.__setattr__(self, name, value)
|
||||
|
||||
def __str__(self) -> str:
|
||||
result = b' :: '.join(
|
||||
part.encode('ascii', 'backslashreplace') for part in
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Tests for acme.messages."""
|
||||
from typing import Dict
|
||||
import unittest
|
||||
import contextlib
|
||||
from unittest import mock
|
||||
import warnings
|
||||
|
||||
@@ -91,6 +92,22 @@ class ErrorTest(unittest.TestCase):
|
||||
u"Problem for {1.identifier.value}: {1.typ} :: {1.description} :: {1.detail} :: {1.title}").format(
|
||||
self.error_with_subproblems, self.subproblem))
|
||||
|
||||
# this test is based on a minimal reproduction of a contextmanager/immutable
|
||||
# exception related error: https://github.com/python/cpython/issues/99856
|
||||
def test_with_context_manager(self):
|
||||
from acme.messages import Error
|
||||
|
||||
@contextlib.contextmanager
|
||||
def context():
|
||||
yield
|
||||
|
||||
try:
|
||||
with context():
|
||||
raise self.error_custom
|
||||
except Error as e:
|
||||
self.assertIsNotNone(self.error_custom.__traceback__)
|
||||
|
||||
|
||||
class ConstantTest(unittest.TestCase):
|
||||
"""Tests for acme.messages._Constant."""
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/).
|
||||
|
||||
### Fixed
|
||||
|
||||
*
|
||||
* Fixed a bug where Certbot would crash with `AttributeError: can't set attribute` on ACME server errors in Python 3.11. See [GH #9539](https://github.com/certbot/certbot/issues/9539).
|
||||
|
||||
More details about these changes can be found on our GitHub repo.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user