Skip to content

Commit 67b5101

Browse files
author
James Leigh
authored
Merge pull request #839 from jamesrdf/issues/#780-validate-iri
Fix #780: Validate IRI by default when parsing RDF files
2 parents f1da7ae + 24b28cf commit 67b5101

429 files changed

Lines changed: 540 additions & 51 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class RDFJSONParserCustomTest {
2424
public void testSupportedSettings()
2525
throws Exception
2626
{
27-
assertEquals(17, Rio.createParser(RDFFormat.RDFJSON).getSupportedSettings().size());
27+
assertEquals(18, Rio.createParser(RDFFormat.RDFJSON).getSupportedSettings().size());
2828
}
2929

3030
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,6 @@ public void testParseCommentAtStart()
223223
public void testSupportedSettings()
224224
throws Exception
225225
{
226-
assertEquals(21, Rio.createParser(RDFFormat.RDFXML).getSupportedSettings().size());
226+
assertEquals(22, Rio.createParser(RDFFormat.RDFXML).getSupportedSettings().size());
227227
}
228228
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public void testBadPname02()
226226
public void testSupportedSettings()
227227
throws Exception
228228
{
229-
assertEquals(12, Rio.createParser(RDFFormat.TRIG).getSupportedSettings().size());
229+
assertEquals(13, Rio.createParser(RDFFormat.TRIG).getSupportedSettings().size());
230230
}
231231

232232
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/turtle/CustomTurtleParserTest.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,25 @@
77
*******************************************************************************/
88
package org.eclipse.rdf4j.rio.turtle;
99

10-
import static org.junit.Assert.*;
10+
import static org.junit.Assert.assertEquals;
11+
import static org.junit.Assert.assertFalse;
12+
import static org.junit.Assert.assertTrue;
13+
import static org.junit.Assert.fail;
1114

1215
import java.io.StringReader;
1316
import java.io.StringWriter;
1417
import java.util.Collections;
18+
import java.util.function.Consumer;
1519

1620
import org.eclipse.rdf4j.model.IRI;
1721
import org.eclipse.rdf4j.model.Literal;
1822
import org.eclipse.rdf4j.model.Model;
1923
import org.eclipse.rdf4j.model.Namespace;
24+
import org.eclipse.rdf4j.model.Value;
2025
import org.eclipse.rdf4j.model.ValueFactory;
2126
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
2227
import org.eclipse.rdf4j.model.impl.NamespaceImpl;
28+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2329
import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
2430
import org.eclipse.rdf4j.model.util.Models;
2531
import org.eclipse.rdf4j.model.vocabulary.RDF;
@@ -206,7 +212,7 @@ public void testLiteralWithNewlines()
206212
public void testSupportedSettings()
207213
throws Exception
208214
{
209-
assertEquals(12, parser.getSupportedSettings().size());
215+
assertEquals(13, parser.getSupportedSettings().size());
210216
}
211217

212218
@Test
@@ -507,4 +513,24 @@ public void testParsingNamespacesWithOverride()
507513
assertTrue(model.contains(vf.createIRI("urn:a"), vf.createIRI("urn:not_skos:broader"),
508514
vf.createIRI("urn:b")));
509515
}
516+
517+
@Test
518+
public void test780IRISpace()
519+
throws Exception
520+
{
521+
String ttl = "_:b25978837 a <http://purl.bioontology.org/ontology/UATC/\\u0020SERINE\\u0020\\u0020> .";
522+
try {
523+
Rio.parse(new StringReader(ttl), "", RDFFormat.TURTLE);
524+
fail();
525+
}
526+
catch (RDFParseException e) {
527+
// Invalid IRI
528+
}
529+
Model model = Rio.parse(new StringReader(ttl), "", RDFFormat.TURTLE,
530+
new ParserConfig().set(BasicParserSettings.VERIFY_URI_SYNTAX, false),
531+
SimpleValueFactory.getInstance(), new ParseErrorLogger());
532+
assertEquals(1, model.size());
533+
model.filter(null, RDF.TYPE, null).objects().forEach(obj -> assertEquals(
534+
"http://purl.bioontology.org/ontology/UATC/%20SERINE%20%20", obj.stringValue()));
535+
}
510536
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleParserTest.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
*******************************************************************************/
88
package org.eclipse.rdf4j.rio.turtle;
99

10-
import junit.framework.Test;
11-
1210
import org.eclipse.rdf4j.rio.RDFParser;
13-
import org.eclipse.rdf4j.rio.helpers.TurtleParserSettings;
1411
import org.eclipse.rdf4j.rio.ntriples.NTriplesParser;
15-
import org.eclipse.rdf4j.rio.turtle.TurtleParser;
16-
import org.eclipse.rdf4j.rio.turtle.TurtleParserTestCase;
12+
13+
import junit.framework.Test;
1714

1815
/**
1916
* JUnit test for the Turtle parser that uses the tests that are available

core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ public Collection<RioSetting<?>> getSupportedSettings() {
198198
// Supported in RDFParserBase.resolveURI
199199
result.add(BasicParserSettings.VERIFY_RELATIVE_URIS);
200200

201+
// Supported in createURI
202+
result.add(BasicParserSettings.VERIFY_URI_SYNTAX);
203+
201204
// Supported in RDFParserBase.createBNode(String)
202205
result.add(BasicParserSettings.PRESERVE_BNODE_IDS);
203206

@@ -295,12 +298,12 @@ public DatatypeHandling datatypeHandling() {
295298
}
296299

297300
/**
298-
* Parses and normalizes the supplied URI-string and sets it as the base URI for resolving relative URIs.
301+
* Parses the supplied URI-string and sets it as the base URI for resolving relative URIs.
299302
*/
300303
protected void setBaseURI(String uriSpec) {
301-
// Store normalized base URI
304+
// Store base URI
302305
if (this.baseURI == null || !this.baseURI.toString().equals(uriSpec)) {
303-
this.baseURI = ParsedIRI.create(uriSpec).normalize();
306+
this.baseURI = ParsedIRI.create(uriSpec);
304307
}
305308
}
306309

@@ -376,7 +379,15 @@ protected IRI resolveURI(String uriSpec)
376379
throws RDFParseException
377380
{
378381
// Resolve relative URIs against base URI
379-
ParsedIRI uri = ParsedIRI.create(uriSpec);
382+
ParsedIRI uri;
383+
try {
384+
uri = new ParsedIRI(uriSpec);
385+
}
386+
catch (URISyntaxException e) {
387+
reportError("Invalid IRI '" + uriSpec,
388+
BasicParserSettings.VERIFY_URI_SYNTAX);
389+
uri = ParsedIRI.create(uriSpec);
390+
}
380391

381392
if (!uri.isAbsolute()) {
382393
if (baseURI == null) {
@@ -403,6 +414,15 @@ protected IRI resolveURI(String uriSpec)
403414
protected IRI createURI(String uri)
404415
throws RDFParseException
405416
{
417+
if (getParserConfig().get(BasicParserSettings.VERIFY_URI_SYNTAX)) {
418+
try {
419+
new ParsedIRI(uri);
420+
}
421+
catch (URISyntaxException e) {
422+
reportError(e.getMessage(),
423+
BasicParserSettings.VERIFY_URI_SYNTAX);
424+
}
425+
}
406426
try {
407427
return valueFactory.createIRI(uri);
408428
}

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/nquads/AbstractNQuadsParserUnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ public void assertHandler(int expected) {
709709
public void testSupportedSettings()
710710
throws Exception
711711
{
712-
assertEquals(12, parser.getSupportedSettings().size());
712+
assertEquals(13, parser.getSupportedSettings().size());
713713
}
714714

715715
protected abstract RDFParser createRDFParser();

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/ntriples/AbstractNTriplesParserUnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public void testBlankNodeIdentifiersRDF11()
380380
public void testSupportedSettings()
381381
throws Exception
382382
{
383-
assertEquals(12, createRDFParser().getSupportedSettings().size());
383+
assertEquals(13, createRDFParser().getSupportedSettings().size());
384384
}
385385

386386
@Test

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParserTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public abstract class TurtleParserTestCase {
4444
/**
4545
* Base directory for W3C Turtle tests
4646
*/
47-
private static String TEST_W3C_FILE_BASE_PATH = "/testcases/turtle/tests-ttl-w3c-20131121/";
47+
private static String TEST_W3C_FILE_BASE_PATH = "/testcases/turtle/tests-ttl-w3c-20170126/";
4848

4949
private static String TEST_W3C_MANIFEST_URL = TEST_W3C_FILE_BASE_PATH + "manifest.ttl";
5050

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
<:_about> <http://purl.org/dc/terms/creator> <http://example.org/anna> .
2-
<:_anna> <http://xmlns.com/foaf/0.1/name> "Anna" .
1+
_:about <http://purl.org/dc/terms/creator> <http://example.org/anna> .
2+
_:anna <http://xmlns.com/foaf/0.1/name> "Anna" .

0 commit comments

Comments
 (0)