/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.permissions.query; import org.apache.jena.permissions.Factory; import org.apache.jena.permissions.MockSecurityEvaluator; import org.apache.jena.permissions.model.SecuredModel; import org.apache.jena.permissions.query.SecuredQueryEngineFactory; import java.util.Set; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.tdb.TDB; import org.apache.jena.tdb.TDBFactory; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class DataSetTest { private Dataset dataset; private Model baseModel; private MockSecurityEvaluator eval; private SecuredModel dftModel; @BeforeClass public static void setupFactory() { SecuredQueryEngineFactory.register(); } @AfterClass public static void teardownFactory() { SecuredQueryEngineFactory.unregister(); } public void setup() { DatasetGraph dsg = TDBFactory.createDatasetGraph(); dsg.getContext().set(TDB.symUnionDefaultGraph, true); Dataset myDataset = DatasetFactory.wrap(dsg); baseModel = myDataset.getNamedModel("http://example.com/baseModel"); baseModel = QueryEngineTest.populateModel(baseModel); dftModel = Factory.getInstance(eval, "http://example.com/securedModel", baseModel); dataset = DatasetFactory.create(); dataset.setDefaultModel(dftModel); } @Test public void testOpenQueryType() { eval = new MockSecurityEvaluator(true, true, true, true, true, true); setup(); try { final String query = "prefix fn: <http://www.w3.org/2005/xpath-functions#> " + " SELECT ?foo ?bar WHERE " + " { ?foo a <http://example.com/class> ; " + "?bar [] ." + " } "; final QueryExecution qexec = QueryExecutionFactory.create(query, dataset); try { final ResultSet results = qexec.execSelect(); int count = 0; for (; results.hasNext();) { count++; results.nextSolution(); } Assert.assertEquals(8, count); } finally { qexec.close(); } } finally { dataset.close(); } } @Test public void testRestrictedQueryType() { eval = new MockSecurityEvaluator(true, true, true, true, true, true) { @Override public boolean evaluate(final Object principal, final Action action, final Node graphIRI, final Triple triple) { if (triple.getSubject().isURI() && triple.getSubject().getURI().equals("http://example.com/resource/1")) { return false; } return super.evaluate(principal, action, graphIRI, triple); } @Override public boolean evaluateAny(Object principal, Set<Action> action, Node graphIRI, Triple triple) { if (triple.getSubject().isURI() && triple.getSubject().getURI().equals("http://example.com/resource/1")) { return false; } return super.evaluateAny(principal, action, graphIRI, triple); } }; setup(); try { final String query = "prefix fn: <http://www.w3.org/2005/xpath-functions#> " + " SELECT ?foo ?bar WHERE " + " { ?foo a <http://example.com/class> ; " + "?bar [] ." + " } "; final QueryExecution qexec = QueryExecutionFactory.create(query, dataset); try { final ResultSet results = qexec.execSelect(); int count = 0; for (; results.hasNext();) { count++; results.nextSolution(); } Assert.assertEquals(4, count); } finally { qexec.close(); } } finally { dataset.close(); } } @Test public void testSelectAllType() { eval = new MockSecurityEvaluator(true, true, true, true, true, true) { @Override public boolean evaluate(final Object principal, final Action action, final Node graphIRI, final Triple triple) { if (triple.getSubject().isURI() && triple.getSubject().getURI().equals("http://example.com/resource/1")) { return false; } return super.evaluate(principal, action, graphIRI, triple); } @Override public boolean evaluateAny(Object principal, Set<Action> action, Node graphIRI, Triple triple) { if (triple.getSubject().isURI() && triple.getSubject().getURI().equals("http://example.com/resource/1")) { return false; } return super.evaluateAny(principal, action, graphIRI, triple); } }; setup(); try { String query = "SELECT ?s ?p ?o WHERE " + " { ?s ?p ?o } "; QueryExecution qexec = QueryExecutionFactory.create(query, dataset); try { final ResultSet results = qexec.execSelect(); int count = 0; for (; results.hasNext();) { count++; results.nextSolution(); } // 2x 3 values + type triple Assert.assertEquals(8, count); } finally { qexec.close(); } query = "SELECT ?g ?s ?p ?o WHERE " + " { GRAPH ?g {?s ?p ?o } }"; qexec = QueryExecutionFactory.create(query, dataset); try { final ResultSet results = qexec.execSelect(); int count = 0; for (; results.hasNext();) { count++; results.nextSolution(); } // 2x 3 values + type triple // all are in the base graph so no named graphs Assert.assertEquals(0, count); } finally { qexec.close(); } } finally { dataset.close(); } } }