aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Baumgartner <dev@igsor.net>2023-03-02 15:29:12 +0100
committerMatthias Baumgartner <dev@igsor.net>2023-03-02 15:29:12 +0100
commitb66ed641d5cbb4cb83f4a571223e4d65d80ed05c (patch)
treecf52e778f611e7520bd92b99df22b6bf69e552ec
parent2e07f33314c238e42bfadc5f39805f93ffbc622e (diff)
downloadbsfs-b66ed641d5cbb4cb83f4a571223e4d65d80ed05c.tar.gz
bsfs-b66ed641d5cbb4cb83f4a571223e4d65d80ed05c.tar.bz2
bsfs-b66ed641d5cbb4cb83f4a571223e4d65d80ed05c.zip
check non-serializable URIs in the sparql store
-rw-r--r--bsfs/triple_store/sparql/parse_filter.py2
-rw-r--r--bsfs/triple_store/sparql/sparql.py6
-rw-r--r--test/triple_store/sparql/test_parse_filter.py2
-rw-r--r--test/triple_store/sparql/test_sparql.py6
4 files changed, 16 insertions, 0 deletions
diff --git a/bsfs/triple_store/sparql/parse_filter.py b/bsfs/triple_store/sparql/parse_filter.py
index ff22de2..8959b2c 100644
--- a/bsfs/triple_store/sparql/parse_filter.py
+++ b/bsfs/triple_store/sparql/parse_filter.py
@@ -267,6 +267,8 @@ class Filter():
"""
if not isinstance(node_type, bsc.Node):
raise errors.BackendError(f'expected Node, found {node_type}')
+ if not rdflib.term._is_valid_uri(node.value): # pylint: disable=protected-access
+ raise errors.BackendError(f'<{node.value}> is not a serializable uri')
return f'VALUES {head} {{ <{node.value}> }}'
def _equals(self, node_type: bsc.Vertex, node: ast.filter.Equals, head: str) -> str:
diff --git a/bsfs/triple_store/sparql/sparql.py b/bsfs/triple_store/sparql/sparql.py
index 5890bcc..bd98f46 100644
--- a/bsfs/triple_store/sparql/sparql.py
+++ b/bsfs/triple_store/sparql/sparql.py
@@ -284,6 +284,9 @@ class SparqlStore(base.TripleStoreBase):
raise errors.ConsistencyError(f'{node_type} is not defined in the schema')
# check and create guids
for guid in guids:
+ # check convert to rdflib.URIRef
+ if not rdflib.term._is_valid_uri(guid): # pylint: disable=protected-access
+ raise ValueError(guids)
subject = rdflib.URIRef(guid)
# check node existence
if (subject, rdflib.RDF.type, None) in self._graph:
@@ -324,6 +327,9 @@ class SparqlStore(base.TripleStoreBase):
# check guids
# FIXME: Fail or skip inexistent nodes?
guids = set(guids)
+ invalid = {guid for guid in guids if not rdflib.term._is_valid_uri(guid)} # pylint: disable=protected-access
+ if len(invalid) > 0:
+ raise ValueError(invalid)
inconsistent = {guid for guid in guids if not self._has_type(guid, node_type)}
if len(inconsistent) > 0:
raise errors.InstanceError(inconsistent)
diff --git a/test/triple_store/sparql/test_parse_filter.py b/test/triple_store/sparql/test_parse_filter.py
index 8a9940e..6db9224 100644
--- a/test/triple_store/sparql/test_parse_filter.py
+++ b/test/triple_store/sparql/test_parse_filter.py
@@ -157,6 +157,8 @@ class TestParseFilter(unittest.TestCase):
def test_is(self):
# _is requires a node
self.assertRaises(errors.BackendError, self.parser._is, self.schema.literal(ns.bsfs.Literal), ast.filter.Is('http://example.com/entity#1234'), '?ent')
+ # _is requires a serializable guid
+ self.assertRaises(errors.BackendError, self.parser._is, self.schema.node(ns.bsfs.Entity), ast.filter.Is('http://example.com/entity#foo and bar'), '?ent')
# a single Is statement
q = self.parser(self.schema.node(ns.bsfs.Entity), ast.filter.Is('http://example.com/entity#1234'))
self.assertSetEqual({str(guid) for guid, in q(self.graph)},
diff --git a/test/triple_store/sparql/test_sparql.py b/test/triple_store/sparql/test_sparql.py
index b1d99ac..d880082 100644
--- a/test/triple_store/sparql/test_sparql.py
+++ b/test/triple_store/sparql/test_sparql.py
@@ -678,6 +678,9 @@ class TestSparqlStore(unittest.TestCase):
self.assertRaises(errors.ConsistencyError, store.create, self.schema.node(ns.bsfs.Entity).child(ns.bsfs.invalid), {
URI('http://example.com/me/entity#1234'), URI('http://example.com/me/entity#4321')})
+ # guid must be valid
+ self.assertRaises(ValueError, store.create, self.schema.node(ns.bsfs.Entity), {URI('http://example.com/me/foo and bar')})
+
# can create some nodes
ent_type = store.schema.node(ns.bsfs.Entity)
store.create(ent_type, {URI('http://example.com/me/entity#1234'), URI('http://example.com/me/entity#4321')})
@@ -766,6 +769,9 @@ class TestSparqlStore(unittest.TestCase):
# invalid predicate is not permitted
self.assertRaises(errors.ConsistencyError, store.set, ent_type, ent_ids, p_invalid, {'http://example.com/me/tag#1234'})
+ # invalid guid is not permitted
+ self.assertRaises(ValueError, store.set, ent_type, {URI('http://example.com/me/foo and bar')}, p_filesize, {1234})
+
# predicate must match node_type
self.assertRaises(errors.ConsistencyError, store.set, tag_type, tag_ids, p_filesize, {1234})