NIHVIVO-2299 Remove old unused policies: JenaNetidPolicy and SparqlPolicy
This commit is contained in:
parent
d83382ab73
commit
095ec6d9a7
6 changed files with 0 additions and 1079 deletions
|
@ -1,428 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.policy;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContextEvent;
|
|
||||||
import javax.servlet.ServletContextListener;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.query.Query;
|
|
||||||
import com.hp.hpl.jena.query.QueryExecution;
|
|
||||||
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
|
||||||
import com.hp.hpl.jena.query.QueryFactory;
|
|
||||||
import com.hp.hpl.jena.query.QuerySolutionMap;
|
|
||||||
import com.hp.hpl.jena.rdf.model.Model;
|
|
||||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
|
||||||
import com.thoughtworks.xstream.XStream;
|
|
||||||
import com.thoughtworks.xstream.io.xml.DomDriver;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.ActiveIdentifierBundleFactories;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.Identifier;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.SelfEditingIdentifierFactory;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.SelfEditingIdentifierFactory.NetId;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.DefaultInconclusivePolicy;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.resource.AddResource;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.resource.DropResource;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This policy looks for a netid in the IdentifierBundle and will use that netid
|
|
||||||
* as a anchor in SPARQL queries. These queries are intended to specify the relations
|
|
||||||
* that allow authorization.
|
|
||||||
*
|
|
||||||
* We could use things other than SPARQL. Other possibilities:
|
|
||||||
* Some java driven code that worked with the the jena Model
|
|
||||||
* Fresnel Selector Language (FSL)
|
|
||||||
* SWRL?
|
|
||||||
*
|
|
||||||
* example of how to set up the xml:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
<edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
||||||
<name>Example Policy</name>
|
|
||||||
<prefixes>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
|
||||||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
|
|
||||||
PREFIX vivoa: <http://vivo.library.cornell.edu/abox#>
|
|
||||||
PREFIX vivo: <http://vivo.library.cornell.edu/ns/0.1#>
|
|
||||||
PREFIX vitro: <http://lowe.mannlib.cornell.edu/ns/vitro/0.1/vitro.owl#>
|
|
||||||
</prefixes>
|
|
||||||
<actionToQueryStr>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.DropDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.DropObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AddObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AddDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
</actionToQueryStr>
|
|
||||||
</edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
||||||
</code>
|
|
||||||
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class JenaNetidPolicy extends DefaultInconclusivePolicy implements PolicyIface {
|
|
||||||
|
|
||||||
|
|
||||||
protected transient Model model = ModelFactory.createDefaultModel();
|
|
||||||
private transient HashMap<String,Query> queryStrToQuery = new HashMap<String,Query>();
|
|
||||||
|
|
||||||
/** human readable name for this policy */
|
|
||||||
protected String name="Unnamed Policy";
|
|
||||||
|
|
||||||
/** prefixes for SPARQL queries. */
|
|
||||||
protected String prefixes = DEFAULT_PREFIXES;
|
|
||||||
|
|
||||||
/** Specifies the type of Authorization returned when the SPARQL query succeeds. This allows us to
|
|
||||||
* create a JenaNetidPolicy that returns UNAUTHORIZED when the some set of conditions are meet. */
|
|
||||||
protected Authorization authForSuccessfulQuery = Authorization.AUTHORIZED;
|
|
||||||
|
|
||||||
/** The SPARQL queries. They should all be of the type ASK and
|
|
||||||
* they should all have the variable ?netid */
|
|
||||||
protected HashMap<String,List<String>> actionToQueryStr = new HashMap<String,List<String>>();
|
|
||||||
|
|
||||||
/* *************************** Constructors ******************************* */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See JenaNetidPolicy.setupDefault() for the sparql queries that will
|
|
||||||
* be used by the default JenaNetidPolicy.
|
|
||||||
*/
|
|
||||||
public JenaNetidPolicy(Model model){
|
|
||||||
if( model == null ){
|
|
||||||
this.model = ModelFactory.createDefaultModel();
|
|
||||||
}else{
|
|
||||||
this.model = model;
|
|
||||||
}
|
|
||||||
setupDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads sparql statements for policy from a JSON text file.
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
* @param sparqlStmts
|
|
||||||
*/
|
|
||||||
public JenaNetidPolicy(Model model, InputStream policySpec){
|
|
||||||
this(model, policySpec, Authorization.AUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Load xml policy files with this.getClass().getResourceAsStream()
|
|
||||||
* Notice that / is the path seperator and strings that lack
|
|
||||||
* a leading slash are relative to the package of the this.getClass().
|
|
||||||
*/
|
|
||||||
public JenaNetidPolicy(Model model, String resource){
|
|
||||||
this(model, JenaNetidPolicy.class.getResourceAsStream(resource));
|
|
||||||
}
|
|
||||||
|
|
||||||
public JenaNetidPolicy(Model model, InputStream policySpec, Authorization authForSuccessfulQuery){
|
|
||||||
this.authForSuccessfulQuery = authForSuccessfulQuery;
|
|
||||||
XStream x = new XStream(new DomDriver());
|
|
||||||
//XStream x = new XStream();
|
|
||||||
JenaNetidPolicy jnip =(JenaNetidPolicy) x.fromXML( policySpec );
|
|
||||||
this.actionToQueryStr = jnip.actionToQueryStr;
|
|
||||||
this.prefixes = jnip.prefixes;
|
|
||||||
this.name = jnip.name;
|
|
||||||
this.model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* *********************** Methods ************************************ */
|
|
||||||
@Override
|
|
||||||
public PolicyDecision isAuthorized(IdentifierBundle whoToAuth,
|
|
||||||
RequestedAction whatToAuth) {
|
|
||||||
BasicPolicyDecision pd = new BasicPolicyDecision(Authorization.INCONCLUSIVE,"not yet set");
|
|
||||||
if( whoToAuth == null )
|
|
||||||
return pd.setMessage("whoToAuth was null");
|
|
||||||
if(whatToAuth == null)
|
|
||||||
return pd.setMessage("whatToAuth was null");
|
|
||||||
|
|
||||||
String netid = getNetid(whoToAuth);
|
|
||||||
if (netid == null)
|
|
||||||
return pd.setMessage("Unable to get netid from IdBundle");
|
|
||||||
|
|
||||||
if (whatToAuth instanceof AddResource) {
|
|
||||||
return visit(whoToAuth, (AddResource) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropResource) {
|
|
||||||
return visit(whoToAuth, (DropResource) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof AddObjectPropStmt) {
|
|
||||||
return visit(whoToAuth, (AddObjectPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropObjectPropStmt) {
|
|
||||||
return visit(whoToAuth, (DropObjectPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof AddDataPropStmt) {
|
|
||||||
return visit(whoToAuth, (AddDataPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropDataPropStmt) {
|
|
||||||
return visit(whoToAuth, (DropDataPropStmt) whatToAuth);
|
|
||||||
} else {
|
|
||||||
return UNAUTH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ************************* visit methods ************************** */
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddResource action) {
|
|
||||||
log.debug("doing AddResource");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getSubjectUri() ));
|
|
||||||
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropResource action) {
|
|
||||||
log.debug("doing DropResource");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getSubjectUri() ));
|
|
||||||
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddObjectPropStmt action) {
|
|
||||||
log.debug("doing AddObjectPropStmt in visit()");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getUriOfSubject() )) ;
|
|
||||||
parameters.add("object", model.createResource( action.getUriOfObject() )) ;
|
|
||||||
parameters.add("predicate", model.createResource( action.getUriOfPredicate() )) ;
|
|
||||||
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropObjectPropStmt action) {
|
|
||||||
log.debug("doing DropObjectPropStmt");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getUriOfSubject() )) ;
|
|
||||||
parameters.add("object", model.createResource( action.getUriOfObject() )) ;
|
|
||||||
parameters.add("predicate", model.createResource( action.getUriOfPredicate() )) ;
|
|
||||||
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddDataPropStmt action) {
|
|
||||||
log.debug("doing AddDataPropStmt");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getSubjectUri() )) ;
|
|
||||||
parameters.add("predicate", model.createResource( action.getPredicateUri() )) ;
|
|
||||||
parameters.add("literalValue", model.createLiteral(action.getData() ));
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropDataPropStmt action) {
|
|
||||||
log.debug("doing DropDataPropStmt");
|
|
||||||
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(action.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queries found for action" + action.getClass().getName());
|
|
||||||
|
|
||||||
QuerySolutionMap parameters = new QuerySolutionMap();
|
|
||||||
parameters.add("netid", model.createLiteral( getNetid(ids) ));
|
|
||||||
parameters.add("subject",model.createResource( action.getSubjectUri() )) ;
|
|
||||||
parameters.add("predicate", model.createResource( action.getPredicateUri() )) ;
|
|
||||||
parameters.add("literalValue", model.createLiteral(action.data() )); // caution: will always do untyped things
|
|
||||||
return doQueries(queryStrs,parameters,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ******************************** utilities ****************************** */
|
|
||||||
private PolicyDecision doQueries(List<String>queryStrs, QuerySolutionMap parameters, RequestedAction action){
|
|
||||||
SparqlPolicyDecision pd = new SparqlPolicyDecision(Authorization.INCONCLUSIVE,"");
|
|
||||||
for(String quStr : queryStrs){
|
|
||||||
|
|
||||||
Query query = getQueryForQueryStr(quStr);
|
|
||||||
pd.setQuery(query);
|
|
||||||
QueryExecution qexec = QueryExecutionFactory.create(query, model, parameters);
|
|
||||||
pd.setQexec(qexec);
|
|
||||||
|
|
||||||
boolean pathFound = qexec.execAsk();
|
|
||||||
if( pathFound ){
|
|
||||||
pd.setAuthorized(authForSuccessfulQuery);
|
|
||||||
pd.setMessage(action.getClass().getName() + " permited by " + quStr);
|
|
||||||
if( log.isDebugEnabled()){
|
|
||||||
log.debug(action.getClass().getName() + " permited by " + quStr);
|
|
||||||
log.debug(query);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if( log.isDebugEnabled()){
|
|
||||||
log.debug(action.getClass().getName() + " no results for " + query);
|
|
||||||
log.debug(query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Query getQueryForQueryStr(String queryStr){
|
|
||||||
Query q = queryStrToQuery.get(queryStr);
|
|
||||||
if( q == null ){
|
|
||||||
q = QueryFactory.create(prefixes + queryStr);
|
|
||||||
queryStrToQuery.put(queryStr, q);
|
|
||||||
}
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getNetid(IdentifierBundle whoToAuth) {
|
|
||||||
String netidStr = null;
|
|
||||||
for(Identifier id : whoToAuth){
|
|
||||||
if (id instanceof NetId) {
|
|
||||||
NetId netid = (NetId) id;
|
|
||||||
netidStr = netid.getValue();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( log.isDebugEnabled() )
|
|
||||||
log.debug("netid was " + (netidStr!=null?netidStr:"null") );
|
|
||||||
return netidStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An inner class used to setup everything that's needed for
|
|
||||||
* a JenaNetidPolicy. This setups the JenaNetidPolicy and a
|
|
||||||
* SelfEditingIdentifierFactory.
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static class ContextSetup implements ServletContextListener {
|
|
||||||
@Override
|
|
||||||
public void contextInitialized(ServletContextEvent sce) {
|
|
||||||
try{
|
|
||||||
log.trace("Setting up JenaNetidPolicy");
|
|
||||||
|
|
||||||
Model model = (Model) sce.getServletContext().getAttribute("jenaOntModel");
|
|
||||||
if( model == null ){
|
|
||||||
log.error("could not get jenaOntModel from JenaBaseDao, JenaNetidPolicy will not work");
|
|
||||||
}
|
|
||||||
|
|
||||||
ServletPolicyList.addPolicy(sce.getServletContext(), new JenaNetidPolicy(model));
|
|
||||||
|
|
||||||
ActiveIdentifierBundleFactories.addFactory(sce, new SelfEditingIdentifierFactory());
|
|
||||||
}catch(Exception e){
|
|
||||||
log.error("could not create AuthorizationFactory: " + e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void contextDestroyed(ServletContextEvent sce) { /*nothing*/ }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupDefault(){
|
|
||||||
// --- AddObjectPropStmt ---
|
|
||||||
// may have 4 parameters: netid, object, predicate, and subject.
|
|
||||||
ArrayList <String> queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( AddObjectPropStmt.class.getName(), queries);
|
|
||||||
// --- DropObjectPropStmt ---
|
|
||||||
queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( DropObjectPropStmt.class.getName(), queries);
|
|
||||||
|
|
||||||
// --- DropDataPropStmt ---
|
|
||||||
queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( DropDataPropStmt.class.getName(), queries);
|
|
||||||
// --- AddDataPropStmt ---
|
|
||||||
queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( AddDataPropStmt.class.getName(), queries);
|
|
||||||
|
|
||||||
// --- DropResource ---
|
|
||||||
queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( DropObjectPropStmt.class.getName(), queries);
|
|
||||||
// --- AddResource ---
|
|
||||||
queries = new ArrayList<String>();
|
|
||||||
queries.add( "ASK WHERE { ?subject vitro:netid ?netid }");
|
|
||||||
queries.add( "ASK WHERE { ?object vitro:netid ?netid }");
|
|
||||||
actionToQueryStr.put( DropObjectPropStmt.class.getName(), queries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static String netIdPropUri = VitroVocabulary.vitroURI+ "netid";
|
|
||||||
private static final Log log = LogFactory.getLog(JenaNetidPolicy.class.getName());
|
|
||||||
public final static String DEFAULT_PREFIXES =
|
|
||||||
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"+
|
|
||||||
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"+
|
|
||||||
"PREFIX vivoa: <http://vivo.library.cornell.edu/abox#>\n"+
|
|
||||||
"PREFIX vivo: <http://vivo.library.cornell.edu/ns/0.1#>\n"+
|
|
||||||
"PREFIX vitro: <"+ VitroVocabulary.vitroURI+">\n";
|
|
||||||
|
|
||||||
private final PolicyDecision UNAUTH = new BasicPolicyDecision(
|
|
||||||
Authorization.UNAUTHORIZED,
|
|
||||||
"JenaNetidPolicy doesn't authorize admin or onto editing actions");
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,264 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.policy;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.query.Query;
|
|
||||||
import com.hp.hpl.jena.query.QueryExecution;
|
|
||||||
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
|
||||||
import com.hp.hpl.jena.query.QueryFactory;
|
|
||||||
import com.hp.hpl.jena.query.QuerySolutionMap;
|
|
||||||
import com.hp.hpl.jena.rdf.model.Model;
|
|
||||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
|
||||||
import com.thoughtworks.xstream.XStream;
|
|
||||||
import com.thoughtworks.xstream.io.xml.DomDriver;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.DefaultInconclusivePolicy;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.admin.UploadFile;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.EditDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.EditObjPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.resource.AddResource;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.resource.DropResource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This policy maps strings in the IdentifierBundle to a QuerySolutioinMap in order
|
|
||||||
* to bind identifiers with unbound variables in SPARQL queries.
|
|
||||||
* These queries are intended to specify the relations that allow authorization.
|
|
||||||
* If the query return no rows will be interpreted as unauthorized and a
|
|
||||||
* query returning one or more rows will be interpreted as authorized.
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class SparqlPolicy extends DefaultInconclusivePolicy implements PolicyIface{
|
|
||||||
protected Model model = ModelFactory.createDefaultModel();
|
|
||||||
private HashMap<String,Query> queryStrToQuery = new HashMap<String,Query>();
|
|
||||||
|
|
||||||
/** human readable name for this policy */
|
|
||||||
protected String name="Unnamed Policy";
|
|
||||||
|
|
||||||
/** prefixes for SPARQL queries. */
|
|
||||||
protected String prefixes = "";
|
|
||||||
|
|
||||||
/** The SPARQL queries. They should all be of the type ASK */
|
|
||||||
protected HashMap<String,List<String>> actionToQueryStr = new HashMap<String,List<String>>();
|
|
||||||
|
|
||||||
/** Function to transform identifiers into a QuerySolutionMap */
|
|
||||||
private Ids2QueryBindings binder;
|
|
||||||
|
|
||||||
private String resource = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load XML policy files with this.getClass().getResourceAsStream()
|
|
||||||
* Notice that / is the path separator and strings that lack
|
|
||||||
* a leading slash are relative to the package of the this.getClass().
|
|
||||||
*/
|
|
||||||
public SparqlPolicy(Model model, Ids2QueryBindings binder, String resource){
|
|
||||||
if( model == null )
|
|
||||||
throw new IllegalArgumentException("model must not be null.");
|
|
||||||
if( binder == null )
|
|
||||||
throw new IllegalArgumentException("binder must not be null.");
|
|
||||||
if( resource == null )
|
|
||||||
throw new IllegalArgumentException("resource must not be null.");
|
|
||||||
|
|
||||||
this.model = model;
|
|
||||||
this.binder = binder;
|
|
||||||
this.resource = resource;
|
|
||||||
loadPolicy();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadPolicy(){
|
|
||||||
InputStream policySpec = SparqlPolicy.class.getResourceAsStream(resource);
|
|
||||||
XStream x = new XStream(new DomDriver());
|
|
||||||
SparqlPolicy jnip =(SparqlPolicy) x.fromXML( policySpec );
|
|
||||||
this.actionToQueryStr = jnip.actionToQueryStr;
|
|
||||||
this.prefixes = jnip.prefixes;
|
|
||||||
this.name = jnip.name;
|
|
||||||
try{
|
|
||||||
policySpec.close();
|
|
||||||
}catch(Throwable th){/*ignore it?*/}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* *********************** Methods ************************************ */
|
|
||||||
@Override
|
|
||||||
public PolicyDecision isAuthorized(IdentifierBundle whoToAuth,
|
|
||||||
RequestedAction whatToAuth) {
|
|
||||||
if( whoToAuth == null )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,"whoToAuth was null");
|
|
||||||
if(whatToAuth == null)
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,"whatToAuth was null");
|
|
||||||
List<String> queryStrs = actionToQueryStr.get(whatToAuth.getClass().getName());
|
|
||||||
if( queryStrs == null || queryStrs.size() ==0 )
|
|
||||||
return new BasicPolicyDecision(Authorization.INCONCLUSIVE,
|
|
||||||
"no queryies found for action" + whatToAuth.getClass().getName());
|
|
||||||
|
|
||||||
if (whatToAuth instanceof AddObjectPropStmt) {
|
|
||||||
return visit(whoToAuth, (AddObjectPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropResource) {
|
|
||||||
return visit(whoToAuth, (DropResource) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropDataPropStmt) {
|
|
||||||
return visit(whoToAuth, (DropDataPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof DropObjectPropStmt) {
|
|
||||||
return visit(whoToAuth, (DropObjectPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof AddResource) {
|
|
||||||
return visit(whoToAuth, (AddResource) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof AddDataPropStmt) {
|
|
||||||
return visit(whoToAuth, (AddDataPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof UploadFile) {
|
|
||||||
return visit(whoToAuth, (UploadFile) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof EditDataPropStmt) {
|
|
||||||
return visit(whoToAuth, (EditDataPropStmt) whatToAuth);
|
|
||||||
} else if (whatToAuth instanceof EditObjPropStmt) {
|
|
||||||
return visit(whoToAuth, (EditObjPropStmt) whatToAuth);
|
|
||||||
} else {
|
|
||||||
return UNAUTH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision doQueries(List<String>queryStrs, IdentifierBundle ids, RequestedAction action){
|
|
||||||
SparqlPolicyDecision pd = new SparqlPolicyDecision(Authorization.INCONCLUSIVE,"");
|
|
||||||
List<QuerySolutionMap> bindings = binder.makeScopeBinding(ids, action);
|
|
||||||
for( QuerySolutionMap scope: bindings ){
|
|
||||||
for(String quStr : queryStrs){
|
|
||||||
Query query = getQueryForQueryStr(quStr);
|
|
||||||
pd.setQuery(query);
|
|
||||||
QueryExecution qexec = QueryExecutionFactory.create(query, model, scope);
|
|
||||||
pd.setQexec(qexec);
|
|
||||||
boolean pathFound = qexec.execAsk();
|
|
||||||
if( pathFound ){
|
|
||||||
pd.setAuthorized(Authorization.AUTHORIZED);
|
|
||||||
pd.setMessage(action.getClass().getName() + " permited by " + quStr);
|
|
||||||
if( log.isDebugEnabled()){
|
|
||||||
log.debug(action.getClass().getName() + " permited by " + quStr);
|
|
||||||
log.debug(query);
|
|
||||||
}
|
|
||||||
return pd;
|
|
||||||
} else {
|
|
||||||
if( log.isDebugEnabled()){
|
|
||||||
log.debug(action.getClass().getName() + " no results for " + query);
|
|
||||||
log.debug(query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Query getQueryForQueryStr(String queryStr){
|
|
||||||
//memoize queries
|
|
||||||
Query q = queryStrToQuery.get(queryStr);
|
|
||||||
if( q == null ){
|
|
||||||
q = QueryFactory.create(prefixes + queryStr);
|
|
||||||
queryStrToQuery.put(queryStr, q);
|
|
||||||
}
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ***************** Visit methods ********************** */
|
|
||||||
private final String pkg = "edu.cornell.mannlib.vitro.webapp.auth.requestedAction.";
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddObjectPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"AddObjectPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropResource action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"DropResource"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropDataPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"DropDataPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, DropObjectPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"DropObjectPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddResource action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"AddResource"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, AddDataPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"AddDataPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, UploadFile action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"UploadFile"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, EditDataPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"EditDataPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyDecision visit(IdentifierBundle ids, EditObjPropStmt action) {
|
|
||||||
return doQueries(actionToQueryStr.get(pkg +"EditObjPropStmt"),ids,action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Log log = LogFactory.getLog(SparqlPolicy.class.getName());
|
|
||||||
|
|
||||||
private final PolicyDecision UNAUTH = new BasicPolicyDecision(
|
|
||||||
Authorization.UNAUTHORIZED,
|
|
||||||
name + " SparqlPolicy doesn't authorize admin or onto editing actions");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* example of how to set up the xml:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
|
|
||||||
<edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
||||||
<name>Example Policy</name>
|
|
||||||
<prefixes>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
|
||||||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
|
|
||||||
PREFIX vivoa: <http://vivo.library.cornell.edu/abox#>
|
|
||||||
PREFIX vivo: <http://vivo.library.cornell.edu/ns/0.1#>
|
|
||||||
PREFIX vitro: <http://lowe.mannlib.cornell.edu/ns/vitro/0.1/vitro.owl#>
|
|
||||||
</prefixes>
|
|
||||||
<actionToQueryStr>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.DropDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.DropObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AddObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AddDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
</actionToQueryStr>
|
|
||||||
</edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
||||||
|
|
||||||
</code>
|
|
||||||
*/
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.policy;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.query.Query;
|
|
||||||
import com.hp.hpl.jena.query.QueryExecution;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extends the BasicPolicyDecision with additional debugging information about the
|
|
||||||
* sparql queries that were run to create the decision.
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class SparqlPolicyDecision extends BasicPolicyDecision {
|
|
||||||
Query query = null;
|
|
||||||
QueryExecution qexec = null;
|
|
||||||
|
|
||||||
public SparqlPolicyDecision(Authorization authorized, String message) {
|
|
||||||
super(authorized, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public QueryExecution getQexec() {
|
|
||||||
return qexec;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQexec(QueryExecution qexec) {
|
|
||||||
this.qexec = qexec;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query getQuery() {
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQuery(Query query) {
|
|
||||||
this.query = query;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDebuggingInfo() {
|
|
||||||
String msg = "";
|
|
||||||
if( super.getDebuggingInfo() != null && super.getDebuggingInfo().length() > 0)
|
|
||||||
msg = super.getDebuggingInfo() + '\n';
|
|
||||||
|
|
||||||
if( query != null )
|
|
||||||
msg= msg + "query: \n" + query.toString() + '\n';
|
|
||||||
else
|
|
||||||
msg = msg + " query was null \n";
|
|
||||||
|
|
||||||
if( qexec != null )
|
|
||||||
msg = msg + "query exec: \n" + qexec.toString();
|
|
||||||
else
|
|
||||||
msg = msg + " query exec was null \n";
|
|
||||||
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.policy.setup;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContextEvent;
|
|
||||||
import javax.servlet.ServletContextListener;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.ontology.OntModel;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.ActiveIdentifierBundleFactories;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.SelfEditingIdentifierFactory;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class used to setup a JenaNetidPolicy using the default.
|
|
||||||
* This setups the JenaNetidPolicy and a SelfEditingIdentifierFactory.
|
|
||||||
*
|
|
||||||
* See JenaNetidPolicy.setupDefault() for the sparql queries that will
|
|
||||||
* be used by the default JenaNetidPolicy.
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class JenaNetidPolicySetup implements ServletContextListener {
|
|
||||||
|
|
||||||
private static final Log log = LogFactory.getLog(JenaNetidPolicySetup.class.getName());
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contextInitialized(ServletContextEvent sce) {
|
|
||||||
try{
|
|
||||||
log.debug("Setting up JenaNetidPolicy");
|
|
||||||
|
|
||||||
JenaNetidPolicy jnip = new JenaNetidPolicy((OntModel) sce.getServletContext().getAttribute("jenaOntModel"));
|
|
||||||
ServletPolicyList.addPolicy(sce.getServletContext(), jnip);
|
|
||||||
|
|
||||||
SelfEditingIdentifierFactory niif =new SelfEditingIdentifierFactory();
|
|
||||||
ActiveIdentifierBundleFactories.addFactory(sce, niif);
|
|
||||||
|
|
||||||
}catch(Exception e){
|
|
||||||
log.error("could not create AuthorizationFactory: " + e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contextDestroyed(ServletContextEvent sce) {
|
|
||||||
/*nothing*/
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,228 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.policy;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
import org.apache.log4j.Level;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.ontology.OntModel;
|
|
||||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
|
||||||
import com.hp.hpl.jena.rdf.model.Model;
|
|
||||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
|
||||||
import com.hp.hpl.jena.rdf.model.impl.RDFDefaultErrorHandler;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.ArrayIdentifierBundle;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.SelfEditingIdentifierFactory;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropStmt;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple test of JenaNetidPolicyTest that uses the ExamplePolicy.xml
|
|
||||||
* It expects that the model will have the resource
|
|
||||||
* <http://vivo.library.cornell.edu/abox#entity11821> will have
|
|
||||||
* the datatype property vitro:netid of "bdc34".
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class JenaNetidPolicyTest extends AbstractTestClass {
|
|
||||||
static transient JenaNetidPolicy jniPolicy;
|
|
||||||
static transient JenaNetidPolicy unAuthPolicy;
|
|
||||||
static transient Model model;
|
|
||||||
static IdentifierBundle idb;
|
|
||||||
|
|
||||||
static String onts[] ={
|
|
||||||
"/testontologies/smallVivo-20070809.owl",
|
|
||||||
"/testontologies/vitro1.owl",
|
|
||||||
"/testontologies/vivo-users.owl"
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Loading files with this.getClass().getResourceAsStream()
|
|
||||||
* Notice that / is the path seperator and strings that lack
|
|
||||||
* a leading slash are relative to the package of the this.getClass().
|
|
||||||
*/
|
|
||||||
@BeforeClass
|
|
||||||
public static void setUpForClass() throws Exception {
|
|
||||||
// Suppress warnings from creating default model.
|
|
||||||
setLoggerLevel(RDFDefaultErrorHandler.class, Level.OFF);
|
|
||||||
model = ModelFactory.createDefaultModel();
|
|
||||||
|
|
||||||
for( String ont : onts){
|
|
||||||
InputStream in = JenaNetidPolicyTest.class.getResourceAsStream(ont);
|
|
||||||
model.read(in,null);
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
OntModel ontModel = ModelFactory.createOntologyModel(ONT_MODEL_SPEC,model);
|
|
||||||
ontModel.prepare();
|
|
||||||
|
|
||||||
InputStream in = JenaNetidPolicyTest.class.getResourceAsStream("resources/examplePolicy.xml");
|
|
||||||
jniPolicy = new JenaNetidPolicy(model,in);
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
in = JenaNetidPolicyTest.class.getResourceAsStream("resources/examplePolicy.xml");
|
|
||||||
unAuthPolicy = new JenaNetidPolicy(model,in, Authorization.UNAUTHORIZED);
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
idb = new ArrayIdentifierBundle();
|
|
||||||
idb.add(new SelfEditingIdentifierFactory.NetId("bdc34"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testOfSetupFromXml(){
|
|
||||||
assertNotNull(model);
|
|
||||||
JenaNetidPolicy j = jniPolicy;
|
|
||||||
assertNotNull(j);
|
|
||||||
assertNotNull(j.model);
|
|
||||||
assertNotNull(j.prefixes);
|
|
||||||
assertNotNull( j.actionToQueryStr );
|
|
||||||
assertNotNull(j.name);
|
|
||||||
assertEquals(j.name, "Example Policy");
|
|
||||||
assertTrue(j.prefixes.length() > 0);
|
|
||||||
assertTrue( j.actionToQueryStr.size() > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testAddDataProps(){
|
|
||||||
RequestedAction act; PolicyDecision pd;
|
|
||||||
|
|
||||||
act = new AddDataPropStmt(
|
|
||||||
"http://some.non.existing.resource",
|
|
||||||
"http://some.non.existing.dataproperty",
|
|
||||||
"bogus value", null, null);
|
|
||||||
pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testAddDataProps2(){
|
|
||||||
RequestedAction act; PolicyDecision pd;
|
|
||||||
|
|
||||||
act = new AddDataPropStmt(
|
|
||||||
"http://vivo.library.cornell.edu/abox#entity11821",
|
|
||||||
"vitro:description",
|
|
||||||
"a description of some kind.", null, null);
|
|
||||||
pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue("authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.AUTHORIZED);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testDropDataProps1(){
|
|
||||||
RequestedAction act; PolicyDecision pd;
|
|
||||||
|
|
||||||
DataPropertyStatementImpl dp = new DataPropertyStatementImpl();
|
|
||||||
dp.setIndividualURI("http://vivo.library.cornell.edu/abox#entity11821");
|
|
||||||
dp.setData("a description of some kind.");
|
|
||||||
dp.setDatapropURI("vitro:description");
|
|
||||||
act = new DropDataPropStmt( dp );
|
|
||||||
|
|
||||||
pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue("authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.AUTHORIZED);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testDropDataProps2(){
|
|
||||||
RequestedAction act; PolicyDecision pd;
|
|
||||||
|
|
||||||
DataPropertyStatementImpl dp = new DataPropertyStatementImpl();
|
|
||||||
dp.setIndividualURI("http://mannlib.cornell.edu/non.existing.resource");
|
|
||||||
dp.setData("a description of some kind.");
|
|
||||||
dp.setDatapropURI("vitro:description");
|
|
||||||
act = new DropDataPropStmt( dp );
|
|
||||||
|
|
||||||
pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue("authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void testObjectProps(){
|
|
||||||
RequestedAction act = new AddObjectPropStmt(
|
|
||||||
"http://vivo.library.cornell.edu/abox#entity11821",
|
|
||||||
"vitro:headOf",
|
|
||||||
"http://vivo.library.cornell.edu/abox#entity1");
|
|
||||||
PolicyDecision pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue("authorization was " + pd.getAuthorized(),
|
|
||||||
pd.getAuthorized() == Authorization.AUTHORIZED);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.UNAUTHORIZED);
|
|
||||||
|
|
||||||
act = new AddObjectPropStmt(
|
|
||||||
"http://vivo.library.cornell.edu/abox#entity123",
|
|
||||||
"vitro:headOf",
|
|
||||||
"http://vivo.library.cornell.edu/abox#entity1");
|
|
||||||
pd = jniPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue("authorization was " + pd.getAuthorized(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
|
|
||||||
pd = unAuthPolicy.isAuthorized(idb, act);
|
|
||||||
assertNotNull(pd);
|
|
||||||
assertTrue( "authorization was " + pd.getAuthorized() +
|
|
||||||
'\n' + pd.getDebuggingInfo(),
|
|
||||||
pd.getAuthorized() == Authorization.INCONCLUSIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static String ONTOLOGY_ADDR = "http://caruso.mannlib.cornell.edu/xml/rdf/smallVivo-20070809.owl";
|
|
||||||
// static String VITRO_ADDR = "http://ivy.mannlib.cornell.edu/ontologies/vitro/vitro1.owl";
|
|
||||||
// static String USERS_ADDR = "http://ivy.mannlib.cornell.edu/ontologies/vivo/vivo-users.owl";
|
|
||||||
//String ONTOLOGY_ADDR = "http://lowe.mannlib.cornell.edu/ontologies/fao/geopolitical_Ontology_v_0_2.owl";
|
|
||||||
//String ONTOLOGY_ADDR = "http://lowe.mannlib.cornell.edu/ontologies/fao/languagecode.owl";
|
|
||||||
//String ONTOLOGY_ADDR = "http://localhost/~bjl23/ontologies/VitroFacultyReporting.0.2.owl";
|
|
||||||
|
|
||||||
static OntModelSpec ONT_MODEL_SPEC = OntModelSpec.OWL_DL_MEM; // no additional entailment reasoning
|
|
||||||
//OntModelSpec ONT_MODEL_SPEC = OntModelSpec.OWL_MEM_MICRO_RULE_INF; // some additional OWL entailment reasoning
|
|
||||||
//OntModelSpec ONT_MODEL_SPEC = OntModelSpec.RDFS_MEM_RDFS_INF;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
<edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
||||||
|
|
||||||
<!-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
|
||||||
|
|
||||||
<name>Example Policy</name>
|
|
||||||
<prefixes>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
|
||||||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
|
|
||||||
PREFIX vivoa: <http://vivo.library.cornell.edu/abox#>
|
|
||||||
PREFIX vivo: <http://vivo.library.cornell.edu/ns/0.1#>
|
|
||||||
PREFIX vitro: <http://lowe.mannlib.cornell.edu/ns/vitro/0.1/vitro.owl#>
|
|
||||||
</prefixes>
|
|
||||||
|
|
||||||
<actionToQueryStr>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
<string>ASK WHERE { ?object vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<string>edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropStmt</string>
|
|
||||||
<list>
|
|
||||||
<string>ASK WHERE { ?subject vitro:netid ?netid }</string>
|
|
||||||
</list>
|
|
||||||
</entry>
|
|
||||||
|
|
||||||
</actionToQueryStr>
|
|
||||||
</edu.cornell.mannlib.vitro.webapp.auth.policy.JenaNetidPolicy>
|
|
Loading…
Add table
Reference in a new issue