/*
* $Id: PolicyPreferences.java,v 1.3 2002/09/16 08:05:06 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.server;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Enumeration;
import java.security.Permissions;
import java.security.Permission;
import anvil.java.security.JavaPermission;
/**
* class PolicyPreferences
*
* @author: Jani Lehtim�ki
*/
public class PolicyPreferences extends Preferences
{
private Permissions _permissions = new Permissions();
private Permissions _localPermissions = new Permissions();
public PolicyPreferences(Zone parent)
{
super(parent);
parent.getDomain().enablePolicy();
}
protected void addPermission(Permissions permissions, String values)
{
String[] args = parseValues(values);
if (args.length > 0) {
Permission perm = null;
try {
perm = createPermission(args);
} catch (Throwable t) {
throw new ConfigurationError("Couldn't set permission '"+args[0]+"', reason: "+t);
}
if (perm == null) {
throw new ConfigurationError("Invalid number of arguments for permission '"+args[0]+"'");
}
permissions.add(perm);
}
}
public Permissions getPermissions()
{
return _permissions;
}
public Permissions getLocalPermissions()
{
return _localPermissions;
}
public int getType()
{
return POLICY;
}
public String[] getAdditionalPreferenceNames()
{
return new String[0];
}
public Object getPreference(String name)
{
return null;
}
public boolean setPreference(String name, String value)
{
if (name.equalsIgnoreCase("permission")) {
addPermission(_permissions, value);
} else if (name.equalsIgnoreCase("localpermission")) {
addPermission(_localPermissions, value);
} else {
return false;
}
return true;
}
public static final Permission createPermission(String[] args)
throws Throwable
{
Permission perm = null;
String name = args[0];
int n = args.length;
if (name.equals("file")) {
if (n >= 3) {
perm = new java.io.FilePermission(args[1], args[2]);
}
} else if (name.equals("socket")) {
if (n >= 3) {
perm = new java.net.SocketPermission(args[1], args[2]);
}
} else if (name.equals("java")) {
perm = new JavaPermission(args[1]);
} else if (name.equals("runtime")) {
if (n > 2) {
perm = new anvil.core.RuntimePermission(args[1], args[2]);
} else {
perm = new anvil.core.RuntimePermission(args[1]);
}
} else if (name.equals("import")) {
perm = new anvil.script.ImportPermission(args[1]);
} else if (name.equals("pool")) {
perm = new anvil.database.ConnectionPoolPermission(args[1]);
} else if (name.equals("realm")) {
perm = new RealmPermission(args[1]);
} else if (name.equals("namespace")) {
if (n > 2) {
perm = new NamespacePermission(args[1], args[2]);
} else {
perm = new NamespacePermission(args[1]);
}
} else if (name.equals("tool")) {
if (n > 2) {
perm = new anvil.core.ToolPermission(args[1], args[2]);
} else {
perm = new anvil.core.ToolPermission(args[1]);
}
} else if (name.equals("property")) {
perm = new java.util.PropertyPermission(args[1], args[2]);
} else if (name.equals("all")) {
perm = new java.security.AllPermission();
} else {
Class cls = Class.forName(name);
n--;
Class[] params = new Class[n];
for(int i=0; i<params.length; i++) {
params[i] = String.class;
}
Constructor ctor = cls.getDeclaredConstructor(params);
if (ctor != null) {
String[] s = new String[n];
System.arraycopy(args, 1, s, 0, n);
perm = (Permission)ctor.newInstance(s);
}
}
return perm;
}
}