From 3bddb26a7007d2936a087281904cfb562d0cb855 Mon Sep 17 00:00:00 2001 From: Andrew Elgert Date: Tue, 18 Jun 2019 17:39:18 -0400 Subject: [PATCH 1/2] Handle Invalid Characters in Path * Added exception when a character in the path is not valid on Synapse * Added test verifying that invalid paths throw exceptions --- .../data_adapters/synapse/exceptions.py | 3 +++ .../data_adapters/synapse/synapse_adapter.py | 18 ++++++++++++++++-- .../synapse/test_synapse_adapter.py | 12 ++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/kitools/data_adapters/synapse/exceptions.py diff --git a/src/kitools/data_adapters/synapse/exceptions.py b/src/kitools/data_adapters/synapse/exceptions.py new file mode 100644 index 0000000..b87ca10 --- /dev/null +++ b/src/kitools/data_adapters/synapse/exceptions.py @@ -0,0 +1,3 @@ + +class InvalidNameError(ValueError): + pass \ No newline at end of file diff --git a/src/kitools/data_adapters/synapse/synapse_adapter.py b/src/kitools/data_adapters/synapse/synapse_adapter.py index dbfc1c6..4d73527 100644 --- a/src/kitools/data_adapters/synapse/synapse_adapter.py +++ b/src/kitools/data_adapters/synapse/synapse_adapter.py @@ -13,9 +13,11 @@ # limitations under the License. import os +import re import synapseclient from ..base_adapter import BaseAdapter from .synapse_remote_entity import SynapseRemoteEntity +from .exceptions import InvalidNameError from ...data_uri import DataUri from ...sys_path import SysPath from ...env import Env @@ -30,6 +32,7 @@ class SynapseAdapter(BaseAdapter): """ DATA_URI_SCHEME = 'syn' + VALID_NAME_REGEX = re.compile(r'^[A-Za-z0-9_\-\.\+\(\)]*$') _client = None @classmethod @@ -226,6 +229,17 @@ def _data_push(self, ki_project_resource, syn_parent): sys_path = SysPath(ki_project_resource.abs_path, rel_start=kiproject.local_path) syn_entity = None + # check for valid characters in string + for rel_part in sys_path.rel_parts: + if not re.match(self.VALID_NAME_REGEX, rel_part): + # TODO: Add logging statement + message = ( + "Invalid character(s) found in path part '{part}' (from full path '{full}'). " + "Paths may only contain letters, numbers, spaces, underscores, hypens, periods, plus signs, and parentheses. " + "Please correct the filename and update any instances in kiproject.json." + ).format(part=rel_part, full=sys_path.abs_path) + raise InvalidNameError(message) + if sys_path.is_dir: # Find or create the folder in Synapse. syn_entity = self._find_or_create_syn_folder(syn_parent, sys_path.basename) @@ -234,8 +248,8 @@ def _data_push(self, ki_project_resource, syn_parent): self._push_children(ki_project_resource.root_resource or ki_project_resource, syn_entity, sys_path.abs_path) else: # Upload the file - syn_entity = SynapseAdapter.client().store(synapseclient.File(path=sys_path.abs_path, parent=syn_parent), - forceVersion=False) + syn_file = synapseclient.File(path=sys_path.abs_path, parent=syn_parent) + syn_entity = SynapseAdapter.client().store(syn_file,forceVersion=False) has_changes = False diff --git a/tests/kitools/data_adapters/synapse/test_synapse_adapter.py b/tests/kitools/data_adapters/synapse/test_synapse_adapter.py index 8f4eded..2a903d6 100644 --- a/tests/kitools/data_adapters/synapse/test_synapse_adapter.py +++ b/tests/kitools/data_adapters/synapse/test_synapse_adapter.py @@ -16,8 +16,12 @@ import os import responses from src.kitools.data_adapters import SynapseAdapter +from src.kitools.data_adapters.synapse.exceptions import InvalidNameError +from src.kitools.ki_project_resource import KiProjectResource import synapseclient +from ...test_ki_project import kiproject + def test_name(): assert SynapseAdapter().name() == 'Synapse' @@ -47,4 +51,12 @@ def test_connected(): rsps.replace(responses.GET, 'https://repo-prod.prod.sagebase.org/repo/v1/userProfile', status=418) assert SynapseAdapter().connected() is False + +@pytest.mark.xfail(raises=InvalidNameError) +def test_it_fails_with_invalid_filename(tmp_path, kiproject): + f = tmp_path / 'il^egal.dat' + f.write_text(u'\x00') + kiproject_resource = KiProjectResource(kiproject, local_path=str(f)) + SynapseAdapter().data_push(ki_project_resource=kiproject_resource) + # TODO: add remaining tests. From 250e37d970d83dae26ae77cfb90eaaa0bf2d9cd9 Mon Sep 17 00:00:00 2001 From: Andrew Elgert Date: Tue, 18 Jun 2019 17:48:29 -0400 Subject: [PATCH 2/2] Updated regex to allow spaces --- src/kitools/data_adapters/synapse/synapse_adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitools/data_adapters/synapse/synapse_adapter.py b/src/kitools/data_adapters/synapse/synapse_adapter.py index 4d73527..fd6e974 100644 --- a/src/kitools/data_adapters/synapse/synapse_adapter.py +++ b/src/kitools/data_adapters/synapse/synapse_adapter.py @@ -32,7 +32,7 @@ class SynapseAdapter(BaseAdapter): """ DATA_URI_SCHEME = 'syn' - VALID_NAME_REGEX = re.compile(r'^[A-Za-z0-9_\-\.\+\(\)]*$') + VALID_NAME_REGEX = re.compile(r'^[A-Za-z0-9_\-\.\+\(\) ]*$') _client = None @classmethod