All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.com.softplan.security.zap.api.authentication.CasAuthenticationScriptLoader Maven / Gradle / Ivy

package br.com.softplan.security.zap.api.authentication;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.softplan.security.zap.api.exception.ZapClientException;
import br.com.softplan.security.zap.commons.ZapInfo;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ApiResponse;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ApiResponseElement;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ApiResponseList;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ApiResponseSet;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ClientApi;
import br.com.softplan.security.zap.zaproxy.clientapi.core.ClientApiException;

/**
 * Class responsible to load the CAS authentication script to ZAP.
 * 
 * @author pdsec
 */
public class CasAuthenticationScriptLoader {

	private static final Logger LOGGER = LoggerFactory.getLogger(CasAuthenticationScriptLoader.class);
	
	private static final String JAVASCRIPT_ENGINE_IDENTIFIER = "ECMAScript";
	private static final String JAVASCRIPT_FILE_EXTENSION = ".js";
	
	private static final String SCRIPT_TYPE = "authentication";
	private static final String CAS_AUTH_SCRIPT_DESCRIPTION = "CAS authentication script";
	public  static final String CAS_AUTH_SCRIPT_NAME = "cas-auth";
	public  static final String CAS_AUTH_SCRIPT_FILE_NAME = CAS_AUTH_SCRIPT_NAME + JAVASCRIPT_FILE_EXTENSION;
	public  static final String CAS_AUTH_SCRIPT_RELATIVE_PATH = "/scripts/cas-auth.js";
	public  static final String CAS_AUTH_SCRIPT_DEFAULT_DOCKER_PATH = "/zap/scripts/";
	
	private String casAuthScriptPath = CasAuthenticationHandler.class.getResource(CAS_AUTH_SCRIPT_RELATIVE_PATH).getPath();
	private File casAuthScriptTempFile;
	
	private ClientApi api;
	private String apiKey;
	private final boolean isZapRunningOnDocker;
	
	public CasAuthenticationScriptLoader(ClientApi api, ZapInfo zapInfo) {
		this.api = api;
		this.apiKey = zapInfo.getApiKey();
		this.isZapRunningOnDocker = zapInfo.shouldRunWithDocker();
	}

	public void loadScript() {
		try {
			clearPreviouslyLoadedCasAuthScript();
			
			String scriptEngine = pickAvailableJavaScriptEngine();
			if (isZapRunningOnDocker) {
				casAuthScriptPath = CAS_AUTH_SCRIPT_DEFAULT_DOCKER_PATH + CAS_AUTH_SCRIPT_FILE_NAME;
			} else if (scriptFileIsNotAccessible()) {
				casAuthScriptPath = getCasAuthScriptTempFile().getAbsolutePath();
			}
			
			LOGGER.debug("Loading CAS authentication script from file: {}.", casAuthScriptPath);
			ApiResponse response = api.script.load(
					apiKey, CAS_AUTH_SCRIPT_NAME, SCRIPT_TYPE, scriptEngine, casAuthScriptPath, CAS_AUTH_SCRIPT_DESCRIPTION);
			AbstractAuthenticationHandler.validateResponse(response, "Load CAS authentication script");
			
		} catch (ClientApiException | IOException e) {
			LOGGER.error("Error loading CAS authentication script.", e);
			throw new ZapClientException(e);
		}
	}
	
	private void clearPreviouslyLoadedCasAuthScript() {
		try {
			ApiResponseList listScriptsResponse = (ApiResponseList) api.script.listScripts();
			for (ApiResponse script : listScriptsResponse.getItems()) {
				if (((ApiResponseSet) script).getAttribute("name").equals(CAS_AUTH_SCRIPT_NAME)) {
					ApiResponse response = api.script.remove(apiKey, CAS_AUTH_SCRIPT_NAME);
					AbstractAuthenticationHandler.validateResponse(response, "Clear previously loaded authentication script");
				}
			}
		} catch (ClientApiException e) {
			LOGGER.error("Error clearing previously loaded authentication script.", e);
			throw new ZapClientException(e);
		}
	}
	
	private String pickAvailableJavaScriptEngine() throws ClientApiException {
		ApiResponseList response = (ApiResponseList) api.script.listEngines();
		for (ApiResponse engine : response.getItems()) {
			String engineName = ((ApiResponseElement) engine).getValue();
			if (isJavaScriptEngine(engineName)) {
				return engineName;
			}
		}
		return null;
	}

	private boolean isJavaScriptEngine(String engineName) {
		return engineName.contains(JAVASCRIPT_ENGINE_IDENTIFIER);
	}
	
	private boolean scriptFileIsNotAccessible() {
		return !new File(casAuthScriptPath).exists();
	}

	private File getCasAuthScriptTempFile() throws IOException {
		if (casAuthScriptTempFile == null) {
			casAuthScriptTempFile = createCasAuthScriptTempFile();
		}
		return casAuthScriptTempFile;
	}

	public File createCasAuthScriptTempFile() throws IOException {
		File tempFile = File.createTempFile(CAS_AUTH_SCRIPT_NAME, JAVASCRIPT_FILE_EXTENSION);
		tempFile.deleteOnExit();

		InputStream casAuthScriptInputStream = CasAuthenticationHandler.class.getResourceAsStream(CAS_AUTH_SCRIPT_RELATIVE_PATH);
		try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
			IOUtils.copy(casAuthScriptInputStream, fileOutputStream);
		}
		return tempFile;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy