/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/authz/integrated/AuthzQueriesFacade.java $
* $Id: AuthzQueriesFacade.java 106521 2012-04-04 08:14:42Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.tool.assessment.facade.authz.integrated;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ResourceBundle;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.sakaiproject.authz.api.AuthzGroup;
import org.sakaiproject.authz.cover.AuthzGroupService;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentBaseData;
import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData;
import org.sakaiproject.tool.assessment.facade.AgentFacade;
import org.sakaiproject.tool.assessment.facade.AuthzQueriesFacadeAPI;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* <p>Description: Facade for AuthZ queries, standalone version.
* <p>Sakai Project Copyright (c) 2005</p>
* <p>@todo use resources in AuthzResource.</p>
* @author cwen
* @author Rachel Gollub <rgollub@stanford.edu>
* @author Ed Smiley <esmiley@stanford.edu> split integrated, standlaone.
*/
public class AuthzQueriesFacade
extends HibernateDaoSupport implements AuthzQueriesFacadeAPI
{
private final static org.apache.log4j.Logger LOG =
org.apache.log4j.Logger.getLogger(AuthzQueriesFacade.class);
// stores sql strings
private static ResourceBundle res = ResourceBundle.getBundle(
"org.sakaiproject.tool.assessment.facade.authz.resource.AuthzResource");
// can convert these to use the resource bundle....
private final static String HQL_QUERY_CHECK_AUTHZ =
"select from " +
"org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData as data" +
" where data.agentIdString = :agentId and data.functionId = :functionId" +
" and data.qualifierId = :qualifierId";
private final static String HQL_QUERY_BY_AGENT_FUNC =
"select from org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData " +
"as item where item.agentIdString = :agentId and item.functionId = :functionId";
private final static String HQL_QUERY_ASSESS_BY_AGENT_FUNC = "select asset from " +
"org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentBaseData as asset, " +
"org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData as authz " +
"where asset.assessmentBaseId=authz.qualifierId and " +
"authz.agentIdString = :agentId and authz.functionId = :functionId";
public boolean hasPrivilege(String functionName)
{
String context = ToolManager.getCurrentPlacement().getContext();
boolean privilege = SecurityService.unlock(functionName, "/site/"+context);
return privilege;
}
// this method is added by daisyf on 02/22/05
public boolean isAuthorized(final String agentId,
final String functionId, final String qualifierId)
{
final String query = "select a from AuthorizationData a where a.functionId=? and a.qualifierId=?";
final HibernateCallback hcb = new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.createQuery(query);
q.setString(0, functionId);
q.setString(1, qualifierId);
return q.list();
};
};
List authorizationList = getHibernateTemplate().executeFind(hcb);
// List authorizationList = getHibernateTemplate().find(query,
// new Object[] { functionId, qualifierId },
// new org.hibernate.type.Type[] { Hibernate.STRING, Hibernate.STRING });
String currentSiteId = null;
if (ToolManager.getCurrentPlacement() != null)
currentSiteId =ToolManager.getCurrentPlacement().getContext();
if (currentSiteId == null)
return false; // user don't login via any site if they are using published url
//System.out.println("**** currentSiteId"+currentSiteId);
String currentAgentId = UserDirectoryService.getCurrentUser().getId();
for (int i=0; i<authorizationList.size(); i++){
AuthorizationData a = (AuthorizationData) authorizationList.get(i);
String siteId = a.getAgentIdString();
if (("AUTHENTICATED_USERS").equals(siteId) && (currentAgentId!=null)){
return true;
}
else if (("ANONYMOUS_USERS").equals(siteId)){
return true;
}
else if(currentSiteId.equals(siteId))
{
return true;
}
}
return false;
}
// this appears to be unused, it is also dangerous, as it is not in the API
public boolean checkAuthorization(final String agentId,
final String functionId, final String qualifierId)
{
/* if (agentId == null || functionId == null || qualifierId == null)
{
throw new IllegalArgumentException("Null Argument");
}*/
if (functionId == null || qualifierId == null)
{
throw new IllegalArgumentException("Null Argument");
}
final String queryAgentId = ToolManager.getCurrentPlacement().getContext();
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query query = session.createQuery(HQL_QUERY_CHECK_AUTHZ);
//query.setString("agentId", agentId);
if(agentId == null)
query.setString("agentId", queryAgentId);
else
query.setString("agentId", agentId);
query.setString("functionId", functionId);
query.setString("qualifierId", qualifierId);
return query.uniqueResult();
//return query.list();
}
};
Object result = (AuthorizationData)getHibernateTemplate().execute(hcb);
if(result != null)
return true;
else
return false;
}
public AuthorizationData createAuthorization(
String agentId, String functionId,
String qualifierId)
{
if (agentId == null || functionId == null || qualifierId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
AuthorizationData ad = new AuthorizationData();
Calendar cal = Calendar.getInstance();
Date lastModifiedDate = cal.getTime();
ad.setAgentIdString(agentId);
ad.setFunctionId(functionId);
ad.setQualifierId(qualifierId);
ad.setLastModifiedBy(UserDirectoryService.getCurrentUser().getId());
ad.setLastModifiedDate(lastModifiedDate);
getHibernateTemplate().save(ad);
return ad;
}
}
// this appears to be unused, it is also dangerous, as it is not in the API
public ArrayList getAssessments(final String agentId, final String functionId)
{
ArrayList returnList = new ArrayList();
if (agentId == null || functionId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query query = session.createQuery(HQL_QUERY_BY_AGENT_FUNC);
query.setString("agentId", agentId);
query.setString("functionId", functionId);
return query.list();
}
};
List result = (List)getHibernateTemplate().execute(hcb);
for (int i=0; i<result.size();i++){
AuthorizationData ad = (AuthorizationData) result.get(i);
returnList.add(ad);
}
}
return returnList;
}
// this appears to be unused, it is also dangerous, as it is not in the API
public ArrayList getAssessmentsByAgentAndFunction(final String agentId, final String functionId)
{
ArrayList returnList = new ArrayList();
if (agentId == null || functionId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query query = session.createQuery(HQL_QUERY_ASSESS_BY_AGENT_FUNC);
query.setString("agentId", agentId);
query.setString("functionId", functionId);
return query.list();
}
};
List result = (List)getHibernateTemplate().execute(hcb);
for(int i=0; i<result.size(); i++)
{
AssessmentBaseData ad = (AssessmentBaseData)result.get(i);
returnList.add(ad);
}
}
return returnList;
}
public void removeAuthorizationByQualifier(String qualifierId, boolean isPublishedAssessment) {
String query="select a from AuthorizationData a where a.qualifierId="+qualifierId;
String clause="";
if (isPublishedAssessment){
clause = " and (a.functionId='OWN_PUBLISHED_ASSESSMENT'"+
" or a.functionId='TAKE_PUBLISHED_ASSESSMENT'"+
" or a.functionId='VIEW_PUBLISHED_ASSESSMENT_FEEDBACK'"+
" or a.functionId='GRADE_PUBLISHED_ASSESSMENT'"+
" or a.functionId='VIEW_PUBLISHED_ASSESSMENT')";
}
else{
clause = " and a.functionId='EDIT_ASSESSMENT'";
}
List l = getHibernateTemplate().find(query+clause);
getHibernateTemplate().deleteAll(l);
}
/**
* Removes an authorization for a specified qualifier and function
* added by gopalrc - Nov 2007
* @param qualifierId
* @param functionId
*/
public void removeAuthorizationByQualifierAndFunction(String qualifierId, String functionId) {
String query="select a from AuthorizationData a where a.qualifierId=? and a.functionId=?";
List l = getHibernateTemplate().find(query, new String[]{qualifierId, functionId});
getHibernateTemplate().deleteAll(l);
}
/**
* Removes an authorization for a specified agent, qualifier and function
* TODO: This should be optimized into a single SQL call for a set of agents (groups)
* added by gopalrc - Nov 2007
* @param agentId
* @param qualifierId
*/
public void removeAuthorizationByAgentQualifierAndFunction(String agentId, String qualifierId, String functionId) {
String query="select a from AuthorizationData a where a.qualifierId=? and a.agentIdString=? and a.functionId=?";
List l = getHibernateTemplate().find(query, new String[]{qualifierId, agentId, functionId,});
if (l != null && l.size() > 0) {
getHibernateTemplate().deleteAll(l);
}
}
/** This returns a HashMap containing (String a.qualiferId, AuthorizationData a)
* agentId is a site for now but can be a user
*/
public HashMap getAuthorizationToViewAssessments(String agentId) {
HashMap h = new HashMap();
List l = getAuthorizationByAgentAndFunction(agentId, "VIEW_PUBLISHED_ASSESSMENT");
for (int i=0; i<l.size();i++){
AuthorizationData a = (AuthorizationData) l.get(i);
h.put(a.getQualifierId(), a);
}
return h;
}
public List getAuthorizationByAgentAndFunction(String agentId, String functionId) {
String query = "select a from AuthorizationData a where a.agentIdString=? and a.functionId=?";
//System.out.println("query="+query);
return getHibernateTemplate().find(query, new String[]{agentId, functionId});
}
public List getAuthorizationByFunctionAndQualifier(String functionId, String qualifierId) {
return getHibernateTemplate().find(
"select a from AuthorizationData a where a.functionId=?"+
" and a.qualifierId=?",new String[]{functionId,qualifierId});
}
public boolean checkMembership(String siteId) {
boolean isMember = false;
try{
String realmName = "/site/" + siteId;
AuthzGroup siteAuthzGroup = AuthzGroupService.getAuthzGroup(realmName);
if (siteAuthzGroup.getUserRole(AgentFacade.getAgentString()) != null)
isMember = true;
}
catch(Exception e)
{
e.printStackTrace();
}
return isMember;
}
}