/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2012 The ZAP development team
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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.zaproxy.zap.extension.script;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.log4j.Logger;
import org.parosproxy.paros.common.AbstractParam;
public class ScriptParam extends AbstractParam {
private static final String SCRIPTS_BASE_KEY = "script";
private static final String PARAM_DEFAULT_SCRIPT = SCRIPTS_BASE_KEY + ".defaultScript";
private static final String PARAM_DEFAULT_DIR = SCRIPTS_BASE_KEY + ".defaultDir";
private static final String ALL_SCRIPTS_KEY = SCRIPTS_BASE_KEY + ".scripts";
private static final String SCRIPT_NAME_KEY = "name";
private static final String SCRIPT_DESC_KEY = "description";
private static final String SCRIPT_ENGINE_KEY = "engine";
private static final String SCRIPT_TYPE_KEY = "type";
private static final String SCRIPT_FILE_KEY = "file";
private static final String SCRIPT_ENABLED_KEY = "enabled";
private static final String SCRIPT_DIRS = "dirs";
private static final String SCRIPT_CONFIRM_REMOVE_DIR = "confRemdir";
private static final Logger logger = Logger.getLogger(ScriptParam.class);
private String defaultScript = null;
private String defaultDir = null;
private Set<ScriptWrapper> scripts;
private List<File> scriptDirs;
private boolean confirmRemoveDir = true;
public ScriptParam() {
}
@Override
protected void parse() {
defaultScript = getConfig().getString(PARAM_DEFAULT_SCRIPT, "");
defaultDir = getConfig().getString(PARAM_DEFAULT_DIR, "");
try {
List<HierarchicalConfiguration> fields = ((HierarchicalConfiguration) getConfig()).configurationsAt(ALL_SCRIPTS_KEY);
this.scripts = new HashSet<>(fields.size());
List<String> tempListNames = new ArrayList<>(fields.size());
for (HierarchicalConfiguration sub : fields) {
String name = sub.getString(SCRIPT_NAME_KEY, "");
try {
if (!"".equals(name) && !tempListNames.contains(name)) {
tempListNames.add(name);
File file = new File(sub.getString(SCRIPT_FILE_KEY));
if ( ! file.exists()) {
logger.error("Script '" + file.getAbsolutePath() + "' does not exist");
continue;
}
ScriptWrapper script = new ScriptWrapper(
sub.getString(SCRIPT_NAME_KEY),
sub.getString(SCRIPT_DESC_KEY),
sub.getString(SCRIPT_ENGINE_KEY),
sub.getString(SCRIPT_TYPE_KEY),
sub.getBoolean(SCRIPT_ENABLED_KEY),
file);
script.setLoadOnStart(true); // Because it was saved ;)
scripts.add(script);
}
} catch (Exception e) {
logger.error("Error while loading the script: " + name, e);
}
}
} catch (Exception e) {
logger.error("Error while loading the scripts: " + e.getMessage(), e);
}
try {
this.scriptDirs = new ArrayList<File>();
for (Object dirName : getConfig().getList(SCRIPT_DIRS)) {
File f = new File((String)dirName);
if (! f.exists() || ! f.isDirectory()) {
logger.error("Not a valid script directory: " + dirName);
} else {
scriptDirs.add(f);
}
}
} catch (Exception e) {
logger.error("Error while loading the script dirs: " + e.getMessage(), e);
}
confirmRemoveDir = getConfig().getBoolean(SCRIPT_CONFIRM_REMOVE_DIR, true);
}
public void addScript (ScriptWrapper script) {
this.scripts.add(script);
}
public void removeScript (ScriptWrapper script) {
this.scripts.remove(script);
}
public void saveScripts() {
((HierarchicalConfiguration) getConfig()).clearTree(ALL_SCRIPTS_KEY);
int i=0;
for (ScriptWrapper script : scripts) {
if (script.isLoadOnStart()) {
String elementBaseKey = ALL_SCRIPTS_KEY + "(" + i + ").";
getConfig().setProperty(elementBaseKey + SCRIPT_NAME_KEY, script.getName());
getConfig().setProperty(elementBaseKey + SCRIPT_DESC_KEY, script.getDescription());
getConfig().setProperty(elementBaseKey + SCRIPT_ENGINE_KEY, script.getEngineName());
getConfig().setProperty(elementBaseKey + SCRIPT_TYPE_KEY, script.getTypeName());
getConfig().setProperty(elementBaseKey + SCRIPT_ENABLED_KEY, Boolean.valueOf(script.isEnabled()));
getConfig().setProperty(elementBaseKey + SCRIPT_FILE_KEY, script.getFile().getAbsolutePath());
i++;
}
}
}
public Set<ScriptWrapper> getScripts() {
return scripts;
}
public void addScriptDir(File dir) {
this.scriptDirs.add(dir);
saveScriptDirs();
}
public void removeScriptDir(File dir) {
this.scriptDirs.remove(dir);
saveScriptDirs();
}
private void saveScriptDirs() {
getConfig().setProperty(SCRIPT_DIRS, this.scriptDirs);
}
public List<File> getScriptDirs() {
return scriptDirs;
}
public void setScriptDirs(List<File> scriptDirs) {
this.scriptDirs = scriptDirs;
saveScriptDirs();
}
public String getDefaultScript() {
return defaultScript;
}
public void setDefaultScript(String defaultScript) {
this.defaultScript = defaultScript;
getConfig().setProperty(PARAM_DEFAULT_SCRIPT, this.defaultScript);
}
public String getDefaultDir() {
return defaultDir;
}
public void setDefaultDir(String defaultDir) {
this.defaultDir = defaultDir;
getConfig().setProperty(PARAM_DEFAULT_DIR, this.defaultDir);
}
public void setConfirmRemoveDir(boolean confirmRemoveDir) {
this.confirmRemoveDir = confirmRemoveDir;
getConfig().setProperty(SCRIPT_CONFIRM_REMOVE_DIR, this.confirmRemoveDir);
}
public boolean isConfirmRemoveDir() {
return confirmRemoveDir;
}
}