/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.security.interceptors;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.exolab.castor.jdo.Database;
import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentControllerProxy;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionControllerProxy;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionControllerProxy;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.management.InterceptionPointVO;
import org.infoglue.cms.entities.management.InterceptorVO;
import org.infoglue.cms.entities.structure.SiteNodeVersion;
import org.infoglue.cms.entities.structure.SiteNodeVersionVO;
import org.infoglue.cms.exception.AccessConstraintException;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.AccessConstraintExceptionBuffer;
import com.opensymphony.workflow.Workflow;
import com.opensymphony.workflow.basic.BasicWorkflow;
import com.opensymphony.workflow.loader.WorkflowDescriptor;
/**
* This interceptor is used to handle integration of the external workflow engine OSWorkflow.
*
* @author Mattias Bogeblad
*/
public class InfoGlueOSWorkflowInterceptor implements InfoGlueInterceptor
{
private final static Logger logger = Logger.getLogger(InfoGlueOSWorkflowInterceptor.class.getName());
/**
* This method will be called when a interceptionPoint is reached.
*
* @param interceptionPoint
* @param extradata
* @throws ConstraintException
* @throws SystemException
*/
public void intercept(InfoGluePrincipal infoGluePrincipal, InterceptionPointVO interceptionPointVO, Map extradata) throws ConstraintException, SystemException, Exception
{
intercept(infoGluePrincipal, interceptionPointVO, extradata, true);
}
public void intercept(InfoGluePrincipal infoGluePrincipal, InterceptionPointVO interceptionPointVO, Map extradata, boolean allowCreatorAccess) throws ConstraintException, SystemException, Exception
{
logger.info("interceptionPointVO:" + interceptionPointVO.getName());
AccessConstraintExceptionBuffer ceb = new AccessConstraintExceptionBuffer();
try
{
Workflow workflowInit = new BasicWorkflow(infoGluePrincipal.getName());
long id = workflowInit.initialize("MattiasWF", 1, new HashMap());
logger.info("Workflow initialized....");
logger.info("id:" + id);
logger.info("name:" + workflowInit.getWorkflowName(id));
Workflow workflow = workflowInit; //new BasicWorkflow(infoGluePrincipal.getName());
int[] actions = workflow.getAvailableActions(id, null);
logger.info("actions:" + actions.length);
WorkflowDescriptor wd = workflow.getWorkflowDescriptor(workflow.getWorkflowName(id));
for (int i = 0; i < actions.length; i++)
{
int availableActionId = actions[i];
String name = wd.getAction(availableActionId).getName();
logger.info("Action:" + availableActionId + ":" + name);
//workflow.doAction(id, availableActionId, Collections.EMPTY_MAP);
}
Map map = new HashMap();
map.put("userName", "Mattias");
workflow.doAction(id, 1, map);
actions = workflow.getAvailableActions(id, null);
logger.info("actions:" + actions.length);
wd = workflow.getWorkflowDescriptor(workflow.getWorkflowName(id));
for (int i = 0; i < actions.length; i++)
{
int availableActionId = actions[i];
String name = wd.getAction(availableActionId).getName();
logger.info("Action:" + availableActionId + ":" + name);
//workflow.doAction(id, availableActionId, Collections.EMPTY_MAP);
}
//workflow.doAction(id, 2, Collections.EMPTY_MAP);
//workflow.doAction(id, 3, Collections.EMPTY_MAP);
//workflow.doAction(id, 1, Collections.EMPTY_MAP);
//workflow.doAction(id, 2, Collections.EMPTY_MAP);
/*
WorkflowQuery queryLeft = new WorkflowQuery(WorkflowQuery.OWNER, WorkflowQuery.CURRENT, WorkflowQuery.EQUALS, infoGluePrincipal.getName());
WorkflowQuery queryRight = new WorkflowQuery(WorkflowQuery.STATUS, WorkflowQuery.CURRENT, WorkflowQuery.EQUALS, "Underway");
WorkflowQuery query = new WorkflowQuery(queryLeft, WorkflowQuery.AND, queryRight);
List workflows = workflow.query(query);
for (Iterator iterator = workflows.iterator(); iterator.hasNext();) {
Long wfId = (Long) iterator.next();
logger.info(wfId);
}
*/
}
catch(Throwable t)
{
t.printStackTrace();
}
if(interceptionPointVO.getName().equalsIgnoreCase("Content.Read"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Write"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Create"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Delete"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Move"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.CreateVersion"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.SubmitToPublish"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.ChangeAccessRights"))
{
Integer contentId = (Integer)extradata.get("contentId");
ContentVO contentVO = ContentControllerProxy.getController().getContentVOWithId(contentId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Read"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Write"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Delete"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.Read"))
{
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.Write"))
{
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.CreateSiteNode"))
{
Integer parentSiteNodeId = (Integer)extradata.get("siteNodeId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(parentSiteNodeId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.DeleteSiteNode"))
{
Integer siteNodeId = (Integer)extradata.get("siteNodeId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.MoveSiteNode"))
{
Integer siteNodeId = (Integer)extradata.get("siteNodeId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.SubmitToPublish"))
{
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId);
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.ChangeAccessRights"))
{
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId);
}
ceb.throwIfNotEmpty();
}
/**
* This method will be called when a interceptionPoint is reached and it handle it within a transaction.
*
* @param interceptionPoint
* @param extradata
* @throws ConstraintException
* @throws SystemException
*/
public void intercept(InfoGluePrincipal infoGluePrincipal, InterceptionPointVO interceptionPointVO, Map extradata, Database db) throws ConstraintException, SystemException, Exception
{
intercept(infoGluePrincipal, interceptionPointVO, extradata, true, db);
}
public void intercept(InfoGluePrincipal infoGluePrincipal, InterceptionPointVO interceptionPointVO, Map extradata, boolean allowCreatorAccess, Database db) throws ConstraintException, SystemException, Exception
{
logger.info("interceptionPointVO:" + interceptionPointVO.getName());
AccessConstraintExceptionBuffer ceb = new AccessConstraintExceptionBuffer();
/*
if(interceptionPointVO.getName().equalsIgnoreCase("Content.Read"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.Read", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1000"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Write"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.Write", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1001"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Create"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.Create", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1002"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Delete"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.Delete", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1003"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.Move"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.Move", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1004"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.SubmitToPublish"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.SubmitToPublish", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1005"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.ChangeAccessRights"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.ChangeAccessRights", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1006"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Read"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
if(!contentVersionVO.getVersionModifier().equalsIgnoreCase(infoGluePrincipal.getName()))
{
if(ContentVersionControllerProxy.getController().getIsContentProtected(contentVersionVO.getContentId()) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "ContentVersion.Read", contentVersionId.toString()))
ceb.add(new AccessConstraintException("ContentVersion.contentVersionId", "1000"));
}
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Write"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
if(!contentVersionVO.getVersionModifier().equalsIgnoreCase(infoGluePrincipal.getName()))
{
if(ContentVersionControllerProxy.getController().getIsContentProtected(contentVersionVO.getContentId()) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "ContentVersion.Write", contentVersionId.toString()))
ceb.add(new AccessConstraintException("ContentVersion.contentVersionId", "1001"));
}
}
else if(interceptionPointVO.getName().equalsIgnoreCase("ContentVersion.Delete"))
{
Integer contentVersionId = (Integer)extradata.get("contentVersionId");
ContentVersionVO contentVersionVO = ContentVersionControllerProxy.getController().getContentVersionVOWithId(contentVersionId);
if(!contentVersionVO.getVersionModifier().equalsIgnoreCase(infoGluePrincipal.getName()))
{
if(ContentVersionControllerProxy.getController().getIsContentProtected(contentVersionVO.getContentId()) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "ContentVersion.Delete", contentVersionId.toString()))
ceb.add(new AccessConstraintException("ContentVersion.contentVersionId", "1003"));
}
}
else if(interceptionPointVO.getName().equalsIgnoreCase("Content.CreateVersion"))
{
Integer contentId = (Integer)extradata.get("contentId");
if(ContentVersionControllerProxy.getController().getIsContentProtected(contentId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "Content.CreateVersion", contentId.toString()))
ceb.add(new AccessConstraintException("Content.contentId", "1002"));
}
else if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.Read"))
{
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId);
if(!siteNodeVersionVO.getVersionModifier().equalsIgnoreCase(infoGluePrincipal.getName()))
{
if(SiteNodeVersionControllerProxy.getSiteNodeVersionControllerProxy().getIsSiteNodeVersionProtected(siteNodeVersionId) && !AccessRightController.getController().getIsPrincipalAuthorized(infoGluePrincipal, "SiteNodeVersion.Read", siteNodeVersionId.toString()))
ceb.add(new AccessConstraintException("SiteNodeVersion.siteNodeVersionId", "1000"));
}
}
else*/ if(interceptionPointVO.getName().equalsIgnoreCase("SiteNodeVersion.Write"))
{
logger.info("******************************************************");
logger.info("SiteNodeVersion.ChangeAccessRights");
Integer siteNodeVersionId = (Integer)extradata.get("siteNodeVersionId");
SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionId, db);
logger.info("VersionModifier:" + siteNodeVersion.getVersionModifier());
logger.info("infoGluePrincipal:" + infoGluePrincipal.getName());
if(!siteNodeVersion.getVersionModifier().equalsIgnoreCase(infoGluePrincipal.getName()))
{
Integer protectedSiteNodeVersionId = SiteNodeVersionControllerProxy.getSiteNodeVersionControllerProxy().getProtectedSiteNodeVersionId(siteNodeVersionId, db);
if(protectedSiteNodeVersionId != null && !AccessRightController.getController().getIsPrincipalAuthorized(db, infoGluePrincipal, "SiteNodeVersion.Write", siteNodeVersionId.toString()))
ceb.add(new AccessConstraintException("SiteNodeVersion.siteNodeVersionId", "1001"));
}
}
ceb.throwIfNotEmpty();
}
public void setInterceptorVO(InterceptorVO vo)
{
//Dont need it for now
}
}