package scotty; import java.awt.GraphicsEnvironment; import org.apache.log4j.Logger; import org.owasp.webscarab.httpclient.HTTPClientFactory; import org.owasp.webscarab.model.Preferences; import org.owasp.webscarab.plugin.CredentialManager; import org.owasp.webscarab.plugin.CredentialManagerUI; import org.owasp.webscarab.plugin.Framework; import org.owasp.webscarab.plugin.proxy.ListenerSpec; import org.owasp.webscarab.plugin.proxy.Proxy; import org.owasp.webscarab.plugin.proxy.ProxyPlugin; import org.owasp.webscarab.ui.swing.CredentialRequestDialog; import scotty.crypto.KeyManager; import scotty.plugin.NopProxyPlugin; import scotty.plugin.TransformingProxyPlugin; import scotty.transformer.RequestTransformer; import scotty.transformer.ResponseTransformer; import scotty.transformer.cleartext.ClearTextRequestTransformer; import scotty.transformer.cleartext.ClearTextResponseTransformer; import scotty.transformer.impl.DefaultRequestTransformer; import scotty.transformer.impl.DefaultResponseTransformer; import scotty.ui.SystrayIndicatorProxyPlugin; import scotty.ui.SystrayManager; import scotty.util.Messages; /** * scotty TODO doc * * @author flo * */ public class Scotty { private static Logger log = Logger.getLogger(Scotty.class); /** * Key Manager for RSA Key Access */ private KeyManager keyManager = KeyManager.getInstance(); /** * WebScarab framework. */ private Framework framework; /** * Manages systray access. */ private SystrayManager systray = new SystrayManager(); /** * Textmessages used in scotty. */ private Messages msgs = new Messages(); /** * Use gateway - if false, scotty acts transparent as proxy. */ private boolean useGateway = true; /** * Use encryption - if false, scotty will not encrypt requests */ private boolean disableEncryption = false; /** * gateway to use. */ private String gatewayUrl; /** * Local port of scotty. */ private String localPort; /** * Local address, scotty binds to. */ private String localAddr = "127.0.0.1"; public void init() throws Exception { systray.setTooltip(msgs.scotty() + " " + gatewayUrl); framework = new Framework(); if (GraphicsEnvironment.isHeadless()) { log.warn("In headless mode, so the credentials of a intermediate proxy can't be fetched at runtime, currently"); Preferences .setPreference("WebScarab.promptForCredentials", "false"); } else { Preferences.setPreference("WebScarab.promptForCredentials", "true"); CredentialManager cm = framework.getCredentialManager(); CredentialManagerUI credentialRequestDialog = new CredentialRequestDialog( null, true, cm); cm.setUI(credentialRequestDialog); } loadMainPlugin(framework); Thread.currentThread().join(); } /** * Loads the main plugin {@link TransformingProxyPlugin}. Starts the local * proxy server. * * @param framework * WebScarab Framework. */ public void loadMainPlugin(Framework framework) { Proxy proxy = new Proxy(framework); framework.addPlugin(proxy); ProxyPlugin proxyPlugin = createProxyPlugin(useGateway, disableEncryption, keyManager, gatewayUrl); proxy.addPlugin(proxyPlugin); ProxyPlugin indicator = new SystrayIndicatorProxyPlugin(systray); proxy.addPlugin(indicator); for (ListenerSpec spec : proxy.getProxies()) { proxy.addListener(spec); } log.info("launching: " + (useGateway ? "Using gateway: " + gatewayUrl : " Using no gateway") + ", encryption: " + (disableEncryption ? "No" : "Yes") + ", local proxy listening on: " + localAddr + ":" + localPort); } public ProxyPlugin createProxyPlugin(boolean useGateway, boolean disableEncryption, KeyManager keyManager, String gatewayUrl) { ProxyPlugin cp = null; if (useGateway) { RequestTransformer requestTransformer = createRequestTransformer( disableEncryption, keyManager); ResponseTransformer responseTransformer = createResponseTransformer( disableEncryption, keyManager); cp = new TransformingProxyPlugin(requestTransformer, responseTransformer, gatewayUrl); } else { cp = new NopProxyPlugin(); } return cp; } public RequestTransformer createRequestTransformer( boolean disableEncryption, KeyManager keyManager) { if (disableEncryption) { return new ClearTextRequestTransformer(); } return new DefaultRequestTransformer(keyManager); } public ResponseTransformer createResponseTransformer( boolean disableEncryption, KeyManager keyManager) { if (disableEncryption) { return new ClearTextResponseTransformer(); } return new DefaultResponseTransformer(keyManager); } public void setHttpProxy(String host, Integer port) { HTTPClientFactory factory = HTTPClientFactory.getInstance(); factory.setHttpProxy(host, Integer.valueOf(port)); Preferences.setPreference("WebScarab.httpProxy", host + ":" + port); log.info("Using HTTP Proxy: " + host + ":" + port); } public void setHttpsProxy(String host, Integer port) { HTTPClientFactory factory = HTTPClientFactory.getInstance(); factory.setHttpsProxy(host, Integer.valueOf(port)); Preferences.setPreference("WebScarab.httpsProxy", host + ":" + port); log.info("Using HTTPS Proxy: " + host + ":" + port); } public void stop() { framework.stopPlugins(); } public KeyManager getKeyManager() { return keyManager; } public void setKeyManager(KeyManager keyManager) { this.keyManager = keyManager; } public boolean isUseGateway() { return useGateway; } public void setUseGateway(boolean useGateway) { this.useGateway = useGateway; } public boolean isDisableEncryption() { return disableEncryption; } public void setDisableEncryption(boolean disableEncryption) { this.disableEncryption = disableEncryption; } public String getGatewayUrl() { return gatewayUrl; } public void setGatewayUrl(String gatewayUrl) { this.gatewayUrl = gatewayUrl; } public String getLocalPort() { return localPort; } public void setLocalPort(String localPort) { this.localPort = localPort; Preferences.setPreference("Proxy.listeners", localAddr + ":" + localPort); } public String getLocalAddr() { return localAddr; } public void setLocalAddr(String localAddr) { this.localAddr = localAddr; Preferences.setPreference("Proxy.listeners", localAddr + ":" + localPort); } }