/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file author is Christian Foltin
* It is modified by Volker Boerchers in 2011.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even 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, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.plugin.script;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.freeplane.core.resources.ResourceController;
/**
* @author Volker Boerchers
*/
public class ScriptingPermissions {
final Map<String, Boolean> permissions = new LinkedHashMap<String, Boolean>();
public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING = "execute_scripts_without_asking";
public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION = "execute_scripts_without_file_restriction";
public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION = "execute_scripts_without_write_restriction";
public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION = "execute_scripts_without_exec_restriction";
public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION = "execute_scripts_without_network_restriction";
public static final String RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED = "signed_script_are_trusted";
public static final String RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING = "script_user_key_name_for_signing";
public static final String[] PERMISSION_NAMES = { //
RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING //
, RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION //
, RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION //
, RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION //
, RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION //
, RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED //
};
private static ScriptingPermissions formulaPermissions;
private static ScriptingPermissions permissiveScriptingPermissions;
public ScriptingPermissions() {
// by default nothing is allowed
for (String permissionName : PERMISSION_NAMES) {
set(permissionName, false);
}
}
public ScriptingPermissions(Properties properties) {
for (String permissionName : PERMISSION_NAMES) {
final Object value = properties.get(permissionName);
if (value != null) {
final String valueString = value.toString();
if(! "".equals(valueString))
set(permissionName, Boolean.parseBoolean(valueString));
}
}
}
public boolean get(String permissionName) {
final Boolean savedValue = permissions.get(permissionName);
return savedValue != null && savedValue.booleanValue();
}
private void set(String permissionName, boolean value) {
permissions.put(permissionName, value);
}
void restorePermissions() {
for (String permissionName : PERMISSION_NAMES) {
restore(permissionName);
}
}
private void restore(final String permissionName) {
final Boolean savedValue = permissions.get(permissionName);
if (savedValue != null)
ResourceController.getResourceController().setProperty(permissionName, savedValue);
else
ResourceController.getResourceController().setProperty(permissionName, "");
}
ScriptingSecurityManager getScriptingSecurityManager() {
boolean readPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION);
boolean writePerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION);
boolean networkPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION);
boolean execPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION);
return new ScriptingSecurityManager(readPerm, writePerm, networkPerm, execPerm);
}
/** this method is called only if the formula plugin is active and so formula evaluation is allowed. */
public static ScriptingPermissions getFormulaPermissions() {
if (formulaPermissions == null) {
formulaPermissions = new ScriptingPermissions();
formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
// the classpath is set by the user - this forces us to loose the permissions a bit (if the user permits it)
if (ScriptingEngine.getClasspath() != null) {
formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, ResourceController
.getResourceController().getBooleanProperty(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION));
}
}
return formulaPermissions;
}
ScriptingSecurityManager getPermissiveScriptingSecurityManager() {
return new ScriptingSecurityManager(true, true, true, true);
}
public static ScriptingPermissions getPermissiveScriptingPermissions() {
if (permissiveScriptingPermissions == null) {
permissiveScriptingPermissions = new ScriptingPermissions();
permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, true);
permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION, true);
permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION, true);
permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION, true);
}
return permissiveScriptingPermissions;
}
boolean isExecuteSignedScriptsWithoutRestriction() {
return get(RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED);
}
public boolean executeScriptsWithoutAsking() {
return get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING);
}
public static List<String> getPermissionNames() {
return Arrays.asList(PERMISSION_NAMES);
}
}