/* * Sakuli - Testing and Monitoring-Tool for Websites and common UIs. * * Copyright 2013 - 2015 the original author or authors. * * 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.sakuli.datamodel.properties; import org.sakuli.starter.helper.SahiProxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.io.File; import java.io.FileNotFoundException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; /** * @author tschneck Date: 14.05.14 */ @Component @SuppressWarnings("unused") public class SahiProxyProperties extends AbstractProperties { public static final String PROXY_HOME_FOLDER = "sahi.proxy.homePath"; public static final String PROXY_CONFIG_FOLDER = "sahi.proxy.configurationPath"; public static final String PROXY_PORT = "sahi.proxy.port"; /** * Mapping between sakuli.properties {@link #PROXY_PORT} and sahi orignal property key in 'userdata.properties'. */ public static final String SAHI_PROPERTY_PROXY_PORT_MAPPING = "proxy.port"; public static final String MAX_CONNECT_TRIES = "sahi.proxy.maxConnectTries"; public static final String RECONNECT_SECONDS = "sahi.proxy.reconnectSeconds"; public static final String REQUEST_DELAY_MS = "sahi.proxy.onSikuliInput.delayPerKey"; public static final String REQUEST_DELAY_REFRESH_MS = "sahi.proxy.onSikuliInput.delayBeforeInput"; public static final String DEFAULT_PROXY_PORT = "9999"; public static final String DEFAULT_RECONNECT_SECONDS = "1"; public static final String DEFAULT_MAX_CONNECT_TRIES = "25"; public static final String SAHI_PROPERTY_FILE_APPENDER = File.separator + "config" + File.separator + "userdata.properties"; public static final String SAHI_LOG_PROPERTY_FILE_APPENDER = File.separator + "config" + File.separator + "log.properties"; public static final String SAHI_REQUEST_DELAY_ACTIVE_VAR = "sakuli-delay-active"; public static final String SAHI_REQUEST_DELAY_TIME_VAR = "sakuli-delay-time"; public static final String SAHI_JS_INJECT_CODE_FILENAME = "inject.js"; public static final String SAHI_JS_INJECT_CODE_FILENAME_APPENDER = File.separator + "internal" + File.separator + SAHI_JS_INJECT_CODE_FILENAME; public static final String SAHI_JS_INJECT_CONFIG_FILE_APPENDER = File.separator + "config" + File.separator + "inject_top.txt"; public static final String SAHI_JS_INJECT_TARGET_FOLDER_APPENDER = File.separator + "htdocs" + File.separator + "spr" + File.separator + "sakuli"; public static final String SAHI_JS_INJECT_TARGET_FILE_APPENDER = SAHI_JS_INJECT_TARGET_FOLDER_APPENDER + File.separator + SAHI_JS_INJECT_CODE_FILENAME; public static final String SAHI_LOG_DIR = "logs.dir"; public static final String HTTP_PROXY_ENABLED = "ext.http.proxy.enable"; public static final String HTTP_PROXY_HOST = "ext.http.proxy.host"; public static final String HTTP_PROXY_PORT = "ext.http.proxy.port"; public static final String HTTP_PROXY_AUTH_ENABLED = "ext.http.proxy.auth.enable"; public static final String HTTP_PROXY_AUTH_NAME = "ext.http.proxy.auth.name"; public static final String HTTP_PROXY_AUTH_PASSWORD = "ext.http.proxy.auth.password"; public static final String HTTPS_PROXY_ENABLED = "ext.https.proxy.enable"; public static final String HTTPS_PROXY_HOST = "ext.https.proxy.host"; public static final String HTTPS_PROXY_PORT = "ext.https.proxy.port"; public static final String HTTPS_PROXY_AUTH_ENABLED = "ext.https.proxy.auth.enable"; public static final String HTTPS_PROXY_AUTH_NAME = "ext.https.proxy.auth.name"; public static final String HTTPS_PROXY_AUTH_PASSWORD = "ext.https.proxy.auth.password"; public static final String HTTP_HTTPS_BYBASS_HOSTS = "ext.http.both.proxy.bypass_hosts"; public static final String SSL_CLIENT_KEYSTORE = "ssl.client.keystore.type"; public static final String SSL_CLIENT_CERT_PATH = "ssl.client.cert.path"; public static final String SSL_CLIENT_CERT_PASSWORD = "ssl.client.cert.password"; public static final List<String> userdataPropertyNames = Arrays.asList(SAHI_LOG_DIR, HTTP_PROXY_ENABLED, HTTP_PROXY_HOST, HTTP_PROXY_PORT, HTTP_PROXY_AUTH_ENABLED, HTTP_PROXY_AUTH_NAME, HTTP_PROXY_AUTH_PASSWORD, HTTPS_PROXY_ENABLED, HTTPS_PROXY_HOST, HTTPS_PROXY_PORT, HTTPS_PROXY_AUTH_ENABLED, HTTPS_PROXY_AUTH_NAME, HTTPS_PROXY_AUTH_PASSWORD, HTTP_HTTPS_BYBASS_HOSTS, SSL_CLIENT_KEYSTORE, SSL_CLIENT_CERT_PATH, SSL_CLIENT_CERT_PASSWORD ); public static final String SAHI_HANLDER = "handlers"; public static final String SAHI_LOG_CONSOLE_HANLDER_LEVEL = "java.util.logging.ConsoleHandler.level"; public static final String SAHI_LOG_FILE_HANDLER = "java.util.logging.FileHandler.level"; public static final String SAHI_LOG_CONSOLE_HANDLER_FORMATTER = "java.util.logging.ConsoleHandler.formatter"; public static final String SAHI_LOG_FILE_HANDLER_FORMATTER = "java.util.logging.FileHandler.formatter"; public static final String SAHI_LOG_FILE_HANDLER_LIMIT = "java.util.logging.FileHandler.limit"; public static final String SAHI_LOG_FILE_HANDLER_COUNT = "java.util.logging.FileHandler.count"; public static final String SAHI_LOG_FILE_HANDLER_PATERN = "java.util.logging.FileHandler.pattern"; public static final List<String> logPropertyNames = Arrays.asList(SAHI_HANLDER, SAHI_LOG_CONSOLE_HANLDER_LEVEL, SAHI_LOG_FILE_HANDLER, SAHI_LOG_CONSOLE_HANDLER_FORMATTER, SAHI_LOG_FILE_HANDLER_FORMATTER, SAHI_LOG_FILE_HANDLER_LIMIT, SAHI_LOG_FILE_HANDLER_COUNT, SAHI_LOG_FILE_HANDLER_PATERN); public static final Logger LOGGER = LoggerFactory.getLogger(SahiProxyProperties.class); @Value("${" + PROXY_HOME_FOLDER + "}") private String sahiHomeFolderPropertyValue; private Path sahiHomeFolder; @Value("${" + PROXY_CONFIG_FOLDER + "}") private String sahiConfigFolderPropertyValue; private Path sahiConfigFolder; @Value("${" + PROXY_PORT + ":" + DEFAULT_PROXY_PORT + "}") private Integer proxyPort; @Value("${" + RECONNECT_SECONDS + ":" + DEFAULT_RECONNECT_SECONDS + "}") private Integer reconnectSeconds; @Value("${" + MAX_CONNECT_TRIES + ":" + DEFAULT_MAX_CONNECT_TRIES + "}") private Integer maxConnectTries; /** * Specifies the default delay for one event, which should be used to prevent blocking Request during sikuli based * actions in a sahi controlled proxy */ @Value("${" + REQUEST_DELAY_MS + ":}") private Integer requestDelayMs; @Value("${" + REQUEST_DELAY_REFRESH_MS + ":500}") private Integer requestDelayRefreshMs; @Autowired private SakuliProperties sakuliProperties; @Autowired private TestSuiteProperties testSuiteProperties; private Path sahiJSInjectConfigFile; private Path sahiJSInjectSourceFile; private Path sahiJSInjectTargetFile; @PostConstruct public void initFolders() throws FileNotFoundException { sahiHomeFolder = Paths.get(sahiHomeFolderPropertyValue).normalize().toAbsolutePath(); sahiConfigFolder = Paths.get(sahiConfigFolderPropertyValue).normalize().toAbsolutePath(); if (!testSuiteProperties.isUiTest()) { checkFolders(sahiHomeFolder, sahiConfigFolder); loadSahiInjectFiles(); } } /** * Loads the paths for all custom Sahi inject files, which will be needed for {@link * SahiProxy#injectCustomJavaScriptFiles()} * * @throws FileNotFoundException */ protected void loadSahiInjectFiles() throws FileNotFoundException { sahiJSInjectConfigFile = Paths.get(sahiHomeFolder.toString() + SAHI_JS_INJECT_CONFIG_FILE_APPENDER); sahiJSInjectSourceFile = Paths.get(sakuliProperties.getJsLibFolder() + SAHI_JS_INJECT_CODE_FILENAME_APPENDER); checkFiles(sahiJSInjectConfigFile, sahiJSInjectSourceFile); //don't check files and folders => will be created during runtime sahiJSInjectTargetFile = Paths.get(sahiHomeFolder.toString() + SAHI_JS_INJECT_TARGET_FILE_APPENDER); } public String getSahiHomeFolderPropertyValue() { return sahiHomeFolderPropertyValue; } public void setSahiHomeFolderPropertyValue(String sahiHomeFolderPropertyValue) { this.sahiHomeFolderPropertyValue = sahiHomeFolderPropertyValue; } public String getSahiConfigFolderPropertyValue() { return sahiConfigFolderPropertyValue; } public void setSahiConfigFolderPropertyValue(String sahiConfigFolderPropertyValue) { this.sahiConfigFolderPropertyValue = sahiConfigFolderPropertyValue; } public Path getSahiHomeFolder() { return sahiHomeFolder; } public void setSahiHomeFolder(Path sahiHomeFolder) { this.sahiHomeFolder = sahiHomeFolder; } public Path getSahiConfigFolder() { return sahiConfigFolder; } public void setSahiConfigFolder(Path sahiConfigFolder) { this.sahiConfigFolder = sahiConfigFolder; } public Integer getProxyPort() { return proxyPort; } public void setProxyPort(Integer proxyPort) { this.proxyPort = proxyPort; } public Integer getReconnectSeconds() { return reconnectSeconds; } public void setReconnectSeconds(Integer reconnectSeconds) { this.reconnectSeconds = reconnectSeconds; } public Integer getMaxConnectTries() { return maxConnectTries; } public void setMaxConnectTries(Integer maxConnectTries) { this.maxConnectTries = maxConnectTries; } public Path getSahiJSInjectConfigFile() { return sahiJSInjectConfigFile; } public void setSahiJSInjectConfigFile(Path sahiJSInjectConfigFile) { this.sahiJSInjectConfigFile = sahiJSInjectConfigFile; } public Path getSahiJSInjectSourceFile() { return sahiJSInjectSourceFile; } public void setSahiJSInjectSourceFile(Path sahiJSInjectSourceFile) { this.sahiJSInjectSourceFile = sahiJSInjectSourceFile; } public Path getSahiJSInjectTargetFile() { return sahiJSInjectTargetFile; } public void setSahiJSInjectTargetFile(Path sahiJSInjectTargetFile) { this.sahiJSInjectTargetFile = sahiJSInjectTargetFile; } public Integer getRequestDelayMs() { return requestDelayMs; } public void setRequestDelayMs(Integer requestDelayMs) { this.requestDelayMs = requestDelayMs; } public boolean isRequestDelayActive() { return requestDelayMs != null && requestDelayMs > 0; } public Integer getRequestDelayRefreshMs() { return requestDelayRefreshMs; } public void setRequestDelayRefreshMs(Integer requestDelayRefreshMs) { this.requestDelayRefreshMs = requestDelayRefreshMs; } }