From 72f6a4b9ba25c3627dbff44a2768f4f49f0ae222 Mon Sep 17 00:00:00 2001 From: Joris Hartog Date: Fri, 3 Dec 2021 15:01:18 +0100 Subject: Fix #1359: check for attribute using hasattr This commit fixes a bug where setting an existing, read-only property of a BaseRequest object does not raise an AttributeError. Fixes #1359 --- bottle.py | 2 +- test/test_environ.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bottle.py b/bottle.py index b8a79f1..fe32e63 100755 --- a/bottle.py +++ b/bottle.py @@ -1594,7 +1594,7 @@ class BaseRequest(object): def __setattr__(self, name, value): if name == 'environ': return object.__setattr__(self, name, value) key = 'bottle.request.ext.%s' % name - if key in self.environ: + if hasattr(self, name): raise AttributeError("Attribute already defined: %s" % name) self.environ[key] = value diff --git a/test/test_environ.py b/test/test_environ.py index 908b9d8..d367448 100755 --- a/test/test_environ.py +++ b/test/test_environ.py @@ -462,6 +462,9 @@ class TestRequest(unittest.TestCase): # Attributes are read-only once set. self.assertRaises(AttributeError, setattr, r, 'foo', 'x') + # Properties raise AttributeError. + self.assertRaises(AttributeError, setattr, r, 'body', 'x') + # Unknown attributes raise AttributeError. self.assertRaises(AttributeError, getattr, r, 'somevalue') -- cgit v1.2.1