package org.openedit.entermedia.modules;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.Data;
import org.openedit.data.Searcher;
import org.openedit.entermedia.MediaArchive;
import com.openedit.OpenEditException;
import com.openedit.WebPageRequest;
import com.openedit.config.Configuration;
import com.openedit.config.XMLConfiguration;
import com.openedit.hittracker.HitTracker;
import com.openedit.page.Page;
import com.openedit.page.PageProperty;
import com.openedit.page.PageSettings;
import com.openedit.page.Permission;
import com.openedit.users.Group;
import com.openedit.util.strainer.BooleanFilter;
import com.openedit.util.strainer.Filter;
import com.openedit.util.strainer.FilterReader;
import com.openedit.util.strainer.GroupFilter;
import com.openedit.util.strainer.OrFilter;
public class PermissionModule extends BaseMediaModule
{
private static final Log log = LogFactory.getLog(PermissionModule.class);
public Permission loadPermission(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
if(path == null){
}
String name = inReq.getRequestParameter("id");
if( name == null)
{
name = inReq.getRequestParameter("name");
}
if( name != null)
{
PageSettings settings = getPageManager().getPageSettingsManager().getPageSettings(path);
Permission permission = loadOrCreatePermission(settings,path,name);
inReq.putPageValue("editPath", path);
inReq.putPageValue("permission", permission);
return permission;
}
return null;
}
private Permission loadOrCreatePermission(PageSettings inSettings, String path, String inName)
{
Permission permission = inSettings.getPermission(inName, true);
if( permission == null || !permission.getPath().equals(path))
{
Permission per = new Permission();
per.setName(inName);
if( permission != null && permission.getRootFilter() != null)
{
FilterReader reader = (FilterReader) getModuleManager().getBean("filterReader");
per.setRootFilter(permission.getRootFilter().copy(reader, inName));
}
else
{
}
per.setPath(path);
permission = per;
}
return permission;
}
public void loadPermissions(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
if( path == null )
{
path = inReq.findValue("editPath");
}
//System.out.println(path);
PageSettings settings = getPageManager().getPageSettingsManager().getPageSettings(path);
List localPermissions = settings.getFieldPermissions();
List parentPermissions = settings.getPermissions(false);
List combined = new ArrayList();
if( localPermissions != null)
{
Collections.sort(localPermissions);
combined.addAll(localPermissions);
}
Collections.sort(parentPermissions);
combined.addAll(parentPermissions);
//inReq.putPageValue("permissions", localPermissions);
inReq.putPageValue("permissions", combined);
inReq.putPageValue("settings", settings);
inReq.putPageValue("editPath", path);
}
private void resetValues(Filter inFilter)
{
if (inFilter instanceof BooleanFilter)
{
inFilter.setValue("false");
}
if (inFilter.getFilters() != null)
{
for (int i = 0; i < inFilter.getFilters().length; i++)
{
resetValues(inFilter.getFilters()[i]);
}
}
}
/**
* This saves a bunch of stuff all at once
* @param inReq
* @throws Exception
*/
public void savePermissions(WebPageRequest inReq) throws Exception
{
Permission permission = loadPermission(inReq);
if( permission == null)
{
return;
}
resetValues(permission.getRootFilter());
for (Iterator iterator = inReq.getParameterMap().keySet().iterator(); iterator.hasNext();)
{
String key = (String ) iterator.next();
if( key.startsWith("condition"))
{
int start = "condition.".length();
String traverse = key.substring(start,key.indexOf('.', start+1));
String[] tree = traverse.split("/");
int[] list = makeInts(tree);
Filter target = permission.findCondition(list);
String value = inReq.getRequestParameter(key);
if( key.endsWith(".value"))
{
target.setValue(value);
}
else if( key.endsWith(".name"))
{
target.setProperty("name", value);
}
else if( key.endsWith(".property"))
{
target.setProperty("property",value);
}
String fieldroot = "condition." + traverse + ".field";
String[] fields = inReq.getRequestParameters(fieldroot);
if(fields != null){
for (String string : fields) {
String extra = inReq.getRequestParameter("condition." + traverse + "." + string + ".value");
if(extra != null){
target.setProperty(string, extra);
}
}
}
//String fields = inReq.getRequestParameter(condtion.)
//TODO: Handle special filters
}
}
savePermission(permission);
}
protected void savePermission(Permission permission) throws OpenEditException
{
String path = permission.getPath();
Page page = getPageManager().getPage(path,true);
page.getPageSettings().addPermission(permission);
getPageManager().saveSettings(page);
getPageManager().clearCache();
}
public void removeCondition(WebPageRequest inReq) throws Exception
{
String traverse = inReq.getRequestParameter("traverse");
if( traverse != null)
{
Permission permission = loadPermission(inReq);
if( permission != null)
{
String[] tree = traverse.split("/");
if (tree.length > 1)
{
int[] list = makeInts(tree);
Filter parent = permission.findConditionParent(list);
if( parent == null)
{
return;
}
int target = list[list.length-1];
if( target > parent.getFilters().length)
{
return;
}
Filter node = parent.getFilters()[target];
parent.removeFilter(node);
}
else
{
permission.setRootFilter(null);
}
}
savePermission(permission);
}
}
public void addPermission(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
String name = inReq.getRequestParameter("name");
Permission permission = new Permission();
permission.setName(name);
if (path != null)
{
permission.setPath(path);
savePermission(permission);
}
inReq.putPageValue("selectedpermission", permission);
inReq.putPageValue("permission", permission);
loadPermissions(inReq);
}
public void removePermission(WebPageRequest inReq) throws Exception
{
//String path = inReq.getRequestParameter("editPath");
Permission permission = loadPermission(inReq);
if ( permission != null)
{
Page page = getPageManager().getPage(permission.getPath(),true);
PageSettings settings = page.getPageSettings();
settings.removePermission(permission);
getPageManager().saveSettings(page);
getPageManager().clearCache(page);
}
}
public void resetPermission(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
Permission permission = loadPermission(inReq);
Page page = getPageManager().getPage(path,true);
page.getPageSettings().removePermission(permission);//may not be in here
getPageManager().saveSettings(page);
getPageManager().clearCache(page);
}
public void addGroup(WebPageRequest inReq) throws Exception
{
String type = inReq.getRequestParameter("addgroup");
if( type != null)
{
Permission permission = loadPermission(inReq);
if( type.equals("false"))
{
BooleanFilter nope = new BooleanFilter();
nope.setTrue(false);
permission.setRootFilter(nope);
}
else if( type.equals("true"))
{
BooleanFilter yup = new BooleanFilter();
yup.setTrue(true);
permission.setRootFilter(yup);
}
else if( type.equals("xml"))
{
return;
}
else if ( type.startsWith("group."))
{
Filter root = permission.getRootFilter();
if(!(root instanceof OrFilter))
{
root = new OrFilter();
permission.setRootFilter(root);
}
GroupFilter gf = new GroupFilter();
String groupid = type.substring("group.".length());
gf.setGroupId(groupid);
root.addFilter(gf);
}
else if ( type.startsWith("settingsgroup."))
{
Filter root = permission.getRootFilter();
if(!(root instanceof OrFilter))
{
root = new OrFilter();
permission.setRootFilter(root);
}
GroupFilter gf = new GroupFilter();
String groupid = type.substring("settingsgroup.".length());
gf.setGroupId(type);
root.addFilter(gf);
}
savePermission(permission);
}
}
public void addCondition(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
String name = inReq.getRequestParameter("name");
String traverse = inReq.getRequestParameter("traverse");
String type = inReq.getRequestParameter("conditiontype");
String id = null;
Data conditiondetail = getMediaArchive(inReq).getData("conditiontypes" , type);
if(conditiondetail != null && conditiondetail.get("type") != null){
id=type;
type = conditiondetail.get("type");
}
FilterReader reader = (FilterReader)getModuleManager().getBean("filterReader");
if( name != null)
{
Permission permission = loadPermission(inReq);
if( permission != null)
{
Configuration config = new XMLConfiguration();
config.addChild(new XMLConfiguration(type));
Filter newFilter = reader.readFilterCollection(config, name);
if (permission.getRootFilter() == null)
{
permission.setRootFilter(newFilter);
}
else if( traverse != null && traverse.length() > 0)
{
String[] tree = traverse.split("/");
int[] list = makeInts(tree);
Filter parent = permission.findCondition(list);
parent.addFilter(newFilter);
}
else
{
permission.getRootFilter().addFilter(newFilter);
}
if("action".equals(type)){
String action = conditiondetail.get("method");
newFilter.setProperty("name", action);
newFilter.setProperty("conditiontype",id );
}
Page page = getPageManager().getPage(path,true);
page.getPageSettings().setProperty("encoding","UTF-8");
page.getPageSettings().addPermission(permission);
getPageManager().saveSettings(page);
getPageManager().clearCache(page);
}
}
}
private int[] makeInts(String[] tree)
{
int[] list = new int[tree.length];
for (int i = 0; i < list.length; i++)
{
list[i] = Integer.parseInt(tree[i]);
}
return list;
}
public void loadPageProperties(WebPageRequest inReq) throws Exception
{
String path = inReq.getRequestParameter("editPath");
if( path == null)
{
log.error("editPath is required");
return;
}
PageSettings settings = getPageManager().getPageSettingsManager().getPageSettings(path);
List pageproperties = new ArrayList();
List props = settings.getAllProperties();
for (Iterator iterator = props.iterator(); iterator.hasNext();)
{
PageProperty property = (PageProperty) iterator.next();
if( property.getValue() != null )
{
if( property.getValue().equals("true") || property.getValue().equals("false") )
{
pageproperties.add( property );
}
}
}
inReq.putPageValue("pageproperties", pageproperties );
}
public void loadPermissionsByType(WebPageRequest inReq)
{
String catalogid = inReq.findValue("catalogid");
if( catalogid == null )
{
catalogid = inReq.findValue("applicationid");
}
String searchtype = inReq.findValue("permissiontype");
//we are going to load a searcher and a list of permissions
HitTracker hits = getSearcherManager().getList(catalogid, searchtype);
inReq.putPageValue("permissions", hits);
//this will get shown with edit button
String permissionpath = inReq.findValue("editPath");
if( permissionpath == null)
{
permissionpath = "/" + catalogid + "/_site.xconf";
}
Page page = getPageManager().getPage(permissionpath,true);
inReq.putPageValue("settingspage", page);
}
public void loadPermissionForEdit(WebPageRequest inReq)
{
String catalogid = inReq.findValue("catalogid");
if( catalogid == null )
{
catalogid = inReq.findValue("applicationid");
}
if(catalogid== null)
{
return;
}
//String group = inReq.getRequestParameter("groupid");
//List grouppermissions = new ArrayList();
String searchtype = inReq.findValue("permissiontype");
Searcher permsearcher = getSearcherManager().getSearcher(catalogid, searchtype);
String id = inReq.getRequestParameter("id");
if(searchtype != null && id != null){
Data data = (Data)permsearcher.searchById(id);
inReq.putPageValue("permdata", data);
}
String permissionpath = inReq.findValue("editPath");
if( permissionpath == null)
{
permissionpath = "/" + catalogid + "/_site.xconf";
}
Page page = getPageManager().getPage(permissionpath);
Permission perm = loadOrCreatePermission(page.getPageSettings(),permissionpath,id);
inReq.putPageValue("permission", perm);
HitTracker groups = getUserManager().getGroups();
Boolean simple = Boolean.TRUE;
String usexml = inReq.getRequestParameter("addgroup");
if( "xml".equals(usexml))
{
simple = Boolean.FALSE;
}
else
{
List selgroups = new ArrayList();
if( perm != null)
{
Filter top = perm.getRootFilter();
if( top != null)
{
if( top instanceof OrFilter)
{
Filter[] filters = top.getFilters();
if( filters != null)
{
for (int j = 0; j < filters.length; j++)
{
if( filters[j] instanceof GroupFilter)
{
String gid = ((GroupFilter)filters[j]).getGroupId();
Data group = (Group)getUserManager().getGroup(gid);
if( group != null)
{
selgroups.add(group);
}
}
else
{
simple = Boolean.FALSE;
}
}
}
}
else if( !(top instanceof BooleanFilter))
{
simple = Boolean.FALSE;
}
}
}
inReq.putPageValue("selgroups", selgroups );
groups.removeAll(selgroups);
}
inReq.putPageValue("issimple", String.valueOf(simple ));
inReq.putPageValue("editPath", page);
inReq.putPageValue("allgroups", groups );
}
}