diff --git a/src/allmydata/test/web/test_root.py b/src/allmydata/test/web/test_root.py index 60deae09e..85b8e484c 100644 --- a/src/allmydata/test/web/test_root.py +++ b/src/allmydata/test/web/test_root.py @@ -9,10 +9,16 @@ from ...util.connection_status import ConnectionStatus from allmydata.web.root import URIHandler from allmydata.web.common import WebError +from hypothesis import given +from hypothesis.strategies import text + +# remove nevow imports when we use twisted.web.Site instead of nevow +# for the base. from nevow.inevow import IRequest from zope.interface import directlyProvides + class FakeRoot(Root): def __init__(self): pass @@ -40,14 +46,19 @@ class FakeField(object): class RenderSlashUri(unittest.TestCase): """ - Ensure that URI's starting with /uri?uri= only accept valid + Ensure that URIs starting with /uri?uri= only accept valid capabilities """ def setUp(self): self.request = DummyRequest("/uri") self.request.fields = {} - self.request.prePathURL = lambda: "http://127.0.0.1.99999/{}".format("/".join(self.request.prepath)) + + def prepathURL(): + return "http://127.0.0.1.99999/{}".format( + "/".join(self.request.prepath) + ) + self.request.prePathURL = prepathURL directlyProvides(self.request, IRequest) self.client = Mock() self.res = URIHandler(self.client) @@ -56,19 +67,33 @@ class RenderSlashUri(unittest.TestCase): """ A valid capbility does not result in error """ - self.request.fields["uri"] = FakeField( - value=( - "URI:CHK:nt2xxmrccp7sursd6yh2thhcky:" - "mukesarwdjxiyqsjinbfiiro6q7kgmmekocxfjcngh23oxwyxtzq:2:5:5874882" - ) - ) + self.request.args[b"uri"] = [( + b"URI:CHK:nt2xxmrccp7sursd6yh2thhcky:" + b"mukesarwdjxiyqsjinbfiiro6q7kgmmekocxfjcngh23oxwyxtzq:2:5:5874882" + )] self.res.render_GET(self.request) def test_invalid(self): """ A (trivially) invalid capbility is an error """ - self.request.fields["uri"] = FakeField(value="not a capability") + self.request.args[b"uri"] = [b"not a capability"] + with self.assertRaises(WebError): + self.res.render_GET(self.request) + + @given( + text() + ) + def test_hypothesis_error_caps(self, cap): + """ + Let hypothesis try a bunch of invalid capabilities + """ + # existing code insists capabilities are type "str" .. which + # sounds like it'll definitely be wrong for python3? (what + # does twisted.web produce for stuff in 'fields' or the + # equivalent for a plain Request? also maybe I should use that + # already?) + self.request.args[b"uri"] = [cap.encode('utf8')] with self.assertRaises(WebError): self.res.render_GET(self.request) diff --git a/src/allmydata/web/root.py b/src/allmydata/web/root.py index bc0c70daf..c638c64e3 100644 --- a/src/allmydata/web/root.py +++ b/src/allmydata/web/root.py @@ -57,7 +57,7 @@ class URIHandler(resource.Resource, object): "GET /uri/" with any other query args preserved. New code should use "/uri/" """ - uri_arg = get_arg(req, "uri", None) + uri_arg = req.args.get(b"uri", [None])[0] if uri_arg is None: raise WebError("GET /uri requires uri=")