From 31bf0dfc7a84955ed61c0726feb15f69abc57064 Mon Sep 17 00:00:00 2001 From: Romain Dorgueil Date: Sat, 1 Jun 2019 09:50:54 +0200 Subject: [PATCH] Do not allow to provide absolute paths as filesystem will join it silently (fixes #211). --- bonobo/nodes/io/base.py | 46 +++++++++++----------------------- tests/nodes/io/test_io_base.py | 12 +++++++++ 2 files changed, 26 insertions(+), 32 deletions(-) create mode 100644 tests/nodes/io/test_io_base.py diff --git a/bonobo/nodes/io/base.py b/bonobo/nodes/io/base.py index 26d84ef..37f8e53 100644 --- a/bonobo/nodes/io/base.py +++ b/bonobo/nodes/io/base.py @@ -1,6 +1,15 @@ from bonobo.config import Configurable, ContextProcessor, Option, Service +def filesystem_path(path: str): + if path.startswith("/"): + raise ValueError( + "File path should not be absolute. If you really need to provide absolute paths, then you must pass a " + "filesystem instance that is bound to your filesystem root and provide a relative path from there." + ) + return str(path) + + class FileHandler(Configurable): """Abstract component factory for file-related components. @@ -13,39 +22,12 @@ class FileHandler(Configurable): """ path = Option( - str, - required=True, - positional=True, - __doc__=""" - Path to use within the provided filesystem. - """, - ) # type: str - eol = Option( - str, - default="\n", - __doc__=""" - Character to use as line separator. - """, - ) # type: str - mode = Option( - str, - __doc__=""" - What mode to use for open() call. - """, - ) # type: str - encoding = Option( - str, - default="utf-8", - __doc__=""" - Encoding. - """, - ) # type: str - fs = Service( - "fs", - __doc__=""" - The filesystem instance to use. - """, + filesystem_path, required=True, positional=True, __doc__="Path to use within the provided filesystem." ) # type: str + eol = Option(str, default="\n", __doc__="Character to use as line separator.") # type: str + mode = Option(str, __doc__="What mode to use for open() call.") # type: str + encoding = Option(str, default="utf-8", __doc__="Encoding.") # type: str + fs = Service("fs", __doc__="The filesystem instance to use.") # type: str @ContextProcessor def file(self, context, *, fs): diff --git a/tests/nodes/io/test_io_base.py b/tests/nodes/io/test_io_base.py new file mode 100644 index 0000000..c75325b --- /dev/null +++ b/tests/nodes/io/test_io_base.py @@ -0,0 +1,12 @@ +import pytest + +from bonobo.nodes.io.base import filesystem_path + + +def test_filesystem_path_absolute(): + with pytest.raises(ValueError): + filesystem_path("/this/is/absolute") + + +def test_filesystem_path_relative(): + assert filesystem_path("this/is/relative") == "this/is/relative"