/* * WebScarab.java * * Created on 06 February 2006, 04:59 * * To change this template, choose Tools | Options and locate the template under * the Source Creation and Management node. Right-click the template and choose * Open. You can then make changes to the template in the Source Editor. */ package org.owasp.webscarab; import java.awt.Toolkit; import java.io.File; import java.io.IOException; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import no.geosoft.cc.ui.SplashScreen; import org.owasp.webscarab.model.ConversationID; import org.owasp.webscarab.model.HttpUrl; import org.owasp.webscarab.model.Preferences; import org.owasp.webscarab.plugin.Framework; import org.owasp.webscarab.plugin.compare.Compare; import org.owasp.webscarab.plugin.compare.swing.ComparePanel; import org.owasp.webscarab.plugin.extensions.Extensions; import org.owasp.webscarab.plugin.extensions.swing.ExtensionsPanel; import org.owasp.webscarab.plugin.fragments.Fragments; import org.owasp.webscarab.plugin.fragments.swing.FragmentsPanel; import org.owasp.webscarab.plugin.fuzz.Fuzzer; import org.owasp.webscarab.plugin.fuzz.swing.FuzzerPanel; import org.owasp.webscarab.plugin.identity.Identity; import org.owasp.webscarab.plugin.identity.swing.IdentityPanel; import org.owasp.webscarab.plugin.manualrequest.ManualRequest; import org.owasp.webscarab.plugin.manualrequest.swing.ManualRequestPanel; import org.owasp.webscarab.plugin.openid.OpenId; import org.owasp.webscarab.plugin.openid.OpenIdProxy; import org.owasp.webscarab.plugin.openid.swing.OpenIdPanel; import org.owasp.webscarab.plugin.proxy.BeanShell; import org.owasp.webscarab.plugin.proxy.BrowserCache; import org.owasp.webscarab.plugin.proxy.CookieTracker; import org.owasp.webscarab.plugin.proxy.ListenerSpec; import org.owasp.webscarab.plugin.proxy.ManualEdit; import org.owasp.webscarab.plugin.proxy.Proxy; import org.owasp.webscarab.plugin.proxy.ProxyUI; import org.owasp.webscarab.plugin.proxy.RevealHidden; import org.owasp.webscarab.plugin.proxy.swing.BeanShellPanel; import org.owasp.webscarab.plugin.proxy.swing.ManualEditPanel; import org.owasp.webscarab.plugin.proxy.swing.MiscPanel; import org.owasp.webscarab.plugin.proxy.swing.ProxyPanel; import org.owasp.webscarab.plugin.saml.Saml; import org.owasp.webscarab.plugin.saml.SamlProxy; import org.owasp.webscarab.plugin.saml.swing.SamlPanel; import org.owasp.webscarab.plugin.scripted.Scripted; import org.owasp.webscarab.plugin.scripted.swing.ScriptedPanel; import org.owasp.webscarab.plugin.search.Search; import org.owasp.webscarab.plugin.search.swing.SearchPanel; import org.owasp.webscarab.plugin.sessionid.SessionIDAnalysis; import org.owasp.webscarab.plugin.sessionid.swing.SessionIDPanel; import org.owasp.webscarab.plugin.spider.Spider; import org.owasp.webscarab.plugin.spider.swing.SpiderPanel; import org.owasp.webscarab.plugin.wsfed.WSFederation; import org.owasp.webscarab.plugin.wsfed.swing.WSFederationPanel; import org.owasp.webscarab.plugin.xsscrlf.XSSCRLF; import org.owasp.webscarab.plugin.xsscrlf.swing.XSSCRLFPanel; import org.owasp.webscarab.ui.swing.Lite; import org.owasp.webscarab.ui.swing.UIFramework; import org.owasp.webscarab.ui.swing.WebScarabUI; import org.owasp.webscarab.util.TextFormatter; import org.owasp.webscarab.util.swing.ExceptionHandler; import org.owasp.webscarab.util.swing.TextComponentContextMenu; /** * * @author rdawes */ public class WebScarab { /** Creates a new instance of WebScarab */ private WebScarab() { } /* This class exists purely to ensure that the * program version information is properly loaded at run-time * * It may eventually become a dispatcher for different versions * of user interfaces */ public static void main(String[] args) { try { System.setProperty("sun.awt.exception.handler", ExceptionHandler.class.getName()); final SplashScreen splash = new SplashScreen("/org/owasp/webscarab/webscarab_logo.gif"); splash.open(10000); initLogging(); try { Preferences.loadPreferences(null); } catch (IOException ioe) { System.err.println("Error loading preferences: " + ioe); System.exit(1); } // Provide default Copy/Paste/etc actions on text components Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TextComponentContextMenu()); Framework framework = new Framework(); boolean lite = Boolean.valueOf(Preferences.getPreference("WebScarab.lite", "false")).booleanValue(); File t = null; if (args != null && args.length == 1) { t = new File(args[0]); } final File session = t; final WebScarabUI ui; if (! lite) { UIFramework uif = new UIFramework(framework); loadAllPlugins(framework, uif); ui = uif; } else { Lite uif = new Lite(framework); loadLitePlugins(framework, uif); ui = uif; } try { ExceptionHandler.setParentComponent(ui.getFrame()); SwingUtilities.invokeAndWait(new Runnable() { public void run() { JFrame frame = ui.getFrame(); frame.setVisible(true); frame.toFront(); frame.requestFocus(); splash.close(); if (session != null && session.isDirectory()) ui.loadSession(session); else ui.createTemporarySession(); } }); ui.run(); } catch (Exception e) { System.err.println("Error loading GUI: " + e.getMessage()); e.printStackTrace(); System.exit(1); } } catch (Throwable t) { t.printStackTrace(); JOptionPane.showMessageDialog(null, t, "Error!", JOptionPane.ERROR_MESSAGE); } try { Preferences.savePreferences(); } catch (IOException ioe) { System.err.println("Could not save preferences: " + ioe); } System.exit(0); } private static void initLogging() { Logger logger = Logger.getLogger("org.owasp.webscarab"); logger.setUseParentHandlers(false); Handler ch = new ConsoleHandler(); ch.setFormatter(new TextFormatter()); logger.setLevel(Level.ALL); logger.addHandler(ch); // Preferences are not initialized yet, therefore use system properties String consoleLogLevel = System.getProperty("WebScarab.ConsoleLogLevel", "FINE"); try { ch.setLevel(Level.parse(consoleLogLevel)); } catch (IllegalArgumentException ex) { ch.setLevel(Level.FINE); logger.warning("Unrecognized console log level " + consoleLogLevel); } } public static void loadAllPlugins(Framework framework, WebScarabUI uif) { Proxy proxy = new Proxy(framework); framework.addPlugin(proxy); ProxyPanel proxyPanel = new ProxyPanel(proxy); uif.addPlugin(proxyPanel); ManualEdit me = new ManualEdit(); proxy.addPlugin(me); proxyPanel.addPlugin(new ManualEditPanel(me)); BeanShell bs = new BeanShell(framework); proxy.addPlugin(bs); proxyPanel.addPlugin(new BeanShellPanel(bs)); RevealHidden rh = new RevealHidden(); proxy.addPlugin(rh); BrowserCache bc = new BrowserCache(); proxy.addPlugin(bc); CookieTracker ct = new CookieTracker(framework); proxy.addPlugin(ct); proxyPanel.addPlugin(new MiscPanel(rh, bc, ct)); SamlProxy samlProxy = new SamlProxy(); proxy.addPlugin(samlProxy); OpenIdProxy openIdProxy = new OpenIdProxy(); proxy.addPlugin(openIdProxy); ManualRequest manualRequest = new ManualRequest(framework); framework.addPlugin(manualRequest); uif.addPlugin(new ManualRequestPanel(manualRequest)); Spider spider = new Spider(framework); framework.addPlugin(spider); uif.addPlugin(new SpiderPanel(spider)); Extensions extensions = new Extensions(framework); framework.addPlugin(extensions); uif.addPlugin(new ExtensionsPanel(extensions)); XSSCRLF xsscrlf = new XSSCRLF(framework); framework.addPlugin(xsscrlf); uif.addPlugin(new XSSCRLFPanel(xsscrlf)); SessionIDAnalysis sessionIDAnalysis = new SessionIDAnalysis(framework); framework.addPlugin(sessionIDAnalysis); uif.addPlugin(new SessionIDPanel(sessionIDAnalysis)); Scripted scripted = new Scripted(framework); framework.addPlugin(scripted); uif.addPlugin(new ScriptedPanel(scripted)); Fragments fragments = new Fragments(framework); framework.addPlugin(fragments); uif.addPlugin(new FragmentsPanel(fragments)); Fuzzer fuzzer = new Fuzzer(framework); framework.addPlugin(fuzzer); FuzzerPanel fuzzerPanel = new FuzzerPanel(fuzzer); uif.addPlugin(fuzzerPanel); Compare compare = new Compare(framework); framework.addPlugin(compare); ComparePanel comparePanel = new ComparePanel(compare); uif.addPlugin(comparePanel); Search search = new Search(framework); framework.addPlugin(search); SearchPanel searchPanel = new SearchPanel(search); uif.addPlugin(searchPanel); Saml saml = new Saml(framework, samlProxy); framework.addPlugin(saml); SamlPanel samlPanel = new SamlPanel(saml); uif.addPlugin(samlPanel); OpenId openId = new OpenId(framework, openIdProxy); framework.addPlugin(openId); OpenIdPanel openIdPanel = new OpenIdPanel(openId); uif.addPlugin(openIdPanel); WSFederation wsFed = new WSFederation(framework); framework.addPlugin(wsFed); WSFederationPanel wsFedPanel = new WSFederationPanel(wsFed); uif.addPlugin(wsFedPanel); Identity identity = new Identity(framework); framework.addPlugin(identity); IdentityPanel identityPanel = new IdentityPanel(identity); uif.addPlugin(identityPanel); } public static void loadLitePlugins(Framework framework, Lite uif) { Proxy proxy = new Proxy(framework); framework.addPlugin(proxy); ManualEdit me = new ManualEdit(); proxy.addPlugin(me); proxy.setUI(new LiteProxyUI(uif)); uif.addPanel("Intercept", new ManualEditPanel(me)); RevealHidden rh = new RevealHidden(); proxy.addPlugin(rh); uif.setRevealHidden(rh); SessionIDAnalysis sessionIDAnalysis = new SessionIDAnalysis(framework); framework.addPlugin(sessionIDAnalysis); uif.addPluginEnhancements(new SessionIDPanel(sessionIDAnalysis)); Fragments fragments = new Fragments(framework); framework.addPlugin(fragments); uif.addPluginEnhancements(new FragmentsPanel(fragments)); } private static class LiteProxyUI implements ProxyUI { private WebScarabUI lite; public LiteProxyUI(WebScarabUI lite) { this.lite = lite; } public void aborted(ConversationID id, String reason) { } public void proxyAdded(ListenerSpec spec) { } public void proxyRemoved(ListenerSpec spec) { } public void proxyStarted(ListenerSpec spec) { } public void proxyStartError(final ListenerSpec spec, final IOException ioe) { if (SwingUtilities.isEventDispatchThread()) { JOptionPane.showMessageDialog(lite.getFrame(), new String[] {"Error starting proxy listener: ", spec.toString(), ioe.toString()}, "Error", JOptionPane.ERROR_MESSAGE); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { proxyStartError(spec, ioe); } }); } } public void proxyStopped(ListenerSpec spec) { } public void received(ConversationID id, String status) { } public void requested(ConversationID id, String method, HttpUrl url) { } public String getPluginName() { return "Proxy"; } public void setEnabled(boolean enabled) { } } }