/*
 * Zed Attack Proxy (ZAP) and its related class files.
 *
 * ZAP is an HTTP/HTTPS proxy for assessing web application security.
 *
 * Copyright 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.security.InvalidParameterException;
import java.util.HashMap;
import java.util.Map;

import javax.script.ScriptContext;

public class ScriptVars {
	
	private static int MAX_KEY_SIZE = 30;
	private static int MAX_VALUE_SIZE = 1024;
	private static int MAX_SCRIPT_VARS = 20;
	private static int MAX_GLOBAL_VARS = 50;

	private static Map<String, String> globalVars = new HashMap<String, String>();
	private static Map<String, Map<String, String>> scriptVars = new HashMap<String, Map<String, String>>();
	
	/**
	 * Set a global variable which will be accessible by all scripts
	 * @param key
	 * @param value
	 */
	public static void setGlobalVar(String key, String value) {
		if (key == null || key.length() > MAX_KEY_SIZE) {
			throw new InvalidParameterException("Invalid key - must be non null and have a length less than " + MAX_KEY_SIZE);
		}

		if (value == null) {
			globalVars.remove(key);
		} else {
			if (value.length() > MAX_VALUE_SIZE) {
				throw new InvalidParameterException("Invalid value - must have a length less than " + MAX_VALUE_SIZE);
			}
			if (globalVars.size() > MAX_GLOBAL_VARS) {
				throw new InvalidParameterException("Maximum number of global variables reached: " + MAX_GLOBAL_VARS);
			}
			globalVars.put(key, value);
		}
	}
	
	/**
	 * Get a global variable which is be accessible to all scripts
	 * @param key
	 */
	public static String getGlobalVar(String key) {
		return globalVars.get(key);
	}

	/**
	 * Set a variable that is only accessible to this script.
	 * This method is only usable from scripting languages that provide access to the ScriptContext (like JavaScript)
	 * @param context
	 * @param key
	 * @param value
	 */
	public static void setScriptVar(ScriptContext context, String key, String value) {
		if (context == null) {
			throw new InvalidParameterException("Invalid context - must be non null");
		}
		if (key == null || key.length() > MAX_KEY_SIZE) {
			throw new InvalidParameterException("Invalid key - must be non null and have a length less than " + MAX_KEY_SIZE);
		}
		String scriptName = (String)context.getAttribute(ExtensionScript.SCRIPT_NAME_ATT);
		if (scriptName == null) {
			throw new InvalidParameterException("Failed to find script name");
		}
		Map<String, String> scVars = scriptVars.get(scriptName);
		if (scVars == null) {
			scVars = new HashMap<String, String>();
			scriptVars.put(scriptName, scVars);
		}
		
		if (value == null) {
			scVars.remove(key);
		} else {
			if (value.length() > MAX_VALUE_SIZE) {
				throw new InvalidParameterException("Invalid value - must have a length less than " + MAX_VALUE_SIZE);
			}
			if (scVars.size() > MAX_SCRIPT_VARS) {
				throw new InvalidParameterException("Maximum number of script variables reached: " + MAX_SCRIPT_VARS);
			}
			scVars.put(key, value);
		}
	}
	
	/**
	 * Get a variable that is only accessible from this script.
	 * This method is only usable from scripting languages that provide access to the ScriptContext (like JavaScript)
	 * @param context
	 * @param key
	 * @return
	 */
	public static String getScriptVar(ScriptContext context, String key) {
		if (context == null) {
			throw new InvalidParameterException("Invalid context - must be non null");
		}
		String scriptName = (String)context.getAttribute(ExtensionScript.SCRIPT_NAME_ATT);
		if (scriptName == null) {
			throw new InvalidParameterException("Failed to find script name");
		}
		Map<String, String> scVars = scriptVars.get(scriptName);
		if (scVars == null) {
			// No vars have been associated with this script
			return null;
		}
		
		return scVars.get(key);
	}

	static void clear() {
		globalVars.clear();
		scriptVars.clear();
	}
}

@@ -1005,16 +1005,21 @@
 _SIZE = 
+1024*
 1024;%0A%09p

Update ScriptVars.java