Package org.parosproxy.paros.extension.spider

Source Code of org.parosproxy.paros.extension.spider.ExtensionSpider

/*
*
* Paros and its related class files.
*
* Paros is an HTTP/HTTPS proxy for assessing web application security.
* Copyright (C) 2003-2004 Chinotec Technologies Company
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the Clarified Artistic License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* Clarified Artistic License for more details.
*
* You should have received a copy of the Clarified Artistic License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
package org.parosproxy.paros.extension.spider;

import java.awt.EventQueue;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.JMenuItem;
import javax.swing.JTree;

import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.URIException;
import org.parosproxy.paros.core.spider.Spider;
import org.parosproxy.paros.core.spider.SpiderListener;
import org.parosproxy.paros.core.spider.SpiderParam;
import org.parosproxy.paros.extension.CommandLineArgument;
import org.parosproxy.paros.extension.CommandLineListener;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.extension.ExtensionHook;
import org.parosproxy.paros.extension.ExtensionHookMenu;
import org.parosproxy.paros.extension.SessionChangedListener;
import org.parosproxy.paros.model.HistoryReference;
import org.parosproxy.paros.model.Session;
import org.parosproxy.paros.model.SiteMap;
import org.parosproxy.paros.model.SiteNode;
import org.parosproxy.paros.network.HttpMessage;
/**
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class ExtensionSpider extends ExtensionAdaptor implements SpiderListener, SessionChangedListener, CommandLineListener {
   
    private static final int ARG_SPIDER_IDX = 0;
    private static final int ARG_URL_IDX = 1;
  private JMenuItem menuItemSpider = null//  @jve:decl-index=0:
  private SpiderDialog dialog = null//  @jve:decl-index=0:
  private Spider spider = null;
  private SiteMap siteTree = null;
  private SiteNode startNode = null;
 
 
  private PopupMenuSpider popupMenuSpider = null//  @jve:decl-index=0:visual-constraint="161,133"
  private SpiderPanel spiderPanel = null;
  private OptionsSpiderPanel optionsSpiderPanel = null;
  private SpiderParam spiderParam = null;   //  @jve:decl-index=0:
  private CommandLineArgument[] arguments = new CommandLineArgument[2];
 
    /**
     *
     */
    public ExtensionSpider() {
        super();
     initialize();
    }

    /**
     * @param name
     */
    public ExtensionSpider(String name) {
        super(name);
    }

  /**
   * This method initializes this
   *
   * @return void
   */
  private void initialize() {
        this.setName("ExtensionSpider");
     
  }
  /**
   * This method initializes menuItemSpider 
   *  
   * @return javax.swing.JMenuItem 
   */   
  JMenuItem getMenuItemSpider() {
    if (menuItemSpider == null) {
      menuItemSpider = new JMenuItem();
      menuItemSpider.setText("Spider...");
      menuItemSpider.addActionListener(new java.awt.event.ActionListener() {

        public void actionPerformed(java.awt.event.ActionEvent e) {
            JTree siteTree = getView().getSiteTreePanel().getTreeSite();
                SiteNode node = (SiteNode) siteTree.getLastSelectedPathComponent();
                HttpMessage msg = null;
                if (node == null) {
                    getView().showWarningDialog("You need to visit the website via a browser first and select a URL/folder/node in the 'Sites' panel displayed.");
                    return;
                }
                  setStartNode(node);
                  if (node.isRoot()) {
                      showDialog("All sites will be crawled");
                  } else {
                        try {
                            msg = node.getHistoryReference().getHttpMessage();
                        } catch (Exception e1) {
                            return;
                        }
                        String tmp = msg.getRequestHeader().getURI().toString();
                        showDialog(tmp);
                  }
                 
                 
        }
      });

    }
    return menuItemSpider;
  }
 
  public void hook(ExtensionHook extensionHook) {
      super.hook(extensionHook);
      if (getView() != null) {
          extensionHook.getHookMenu().addAnalyseMenuItem(getMenuItemSpider());
            extensionHook.getHookMenu().addAnalyseMenuItem(extensionHook.getHookMenu().getMenuSeparator());

            extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuSpider());
          extensionHook.getHookView().addStatusPanel(getSpiderPanel());
          extensionHook.getHookView().addOptionPanel(getOptionsSpiderPanel());
      }
        extensionHook.addSessionListener(this);
        extensionHook.addOptionsParamSet(getSpiderParam());

       
        extensionHook.addCommandLine(getCommandLineArguments());
       
  }
 
  public void startSpider() {
        siteTree = getModel().getSession().getSiteTree();

      if (startNode == null) {
          startNode = (SiteNode) siteTree.getRoot();
      }
        startSpider(startNode);

  }
 
  private void startSpider(SiteNode startNode) {

      if (spider == null) {
          try {
                getModel().getDb().getTableHistory().deleteHistoryType(getModel().getSession().getSessionId(), HistoryReference.TYPE_SPIDER_SEED);
              getModel().getDb().getTableHistory().deleteHistoryType(getModel().getSession().getSessionId(), HistoryReference.TYPE_SPIDER_VISITED);

          } catch (SQLException e) {
                e.printStackTrace();
            }
         
          spider = new Spider(getSpiderParam(), getModel().getOptionsParam().getConnectionParam(), getModel());
          spider.addSpiderListener(this);

          inOrderSeed(spider, startNode);

      }
     
      getSpiderPanel().setTabFocus();

    try {
      spider.start();
       
        } catch (NullPointerException e1) {
            e1.printStackTrace();
        }
  }
 
  private void inOrderSeed(Spider spider, SiteNode node) {

      try {
          if (!node.isRoot()) {
              HttpMessage msg = node.getHistoryReference().getHttpMessage();
              if (msg != null) {
                  if (!msg.getResponseHeader().isImage()) {
                      spider.addSeed(msg);
                  }
              }
          }
      } catch (Exception e) {
          e.printStackTrace();
      }
     
      if (!node.isLeaf()) {
          for (int i=0; i<node.getChildCount(); i++) {
              try {
                  inOrderSeed(spider, (SiteNode) node.getChildAt(i));
              } catch (Exception e) {}
          }
      }
  }
 
  public void spiderComplete() {

        try {
            getModel().getDb().getTableHistory().deleteHistoryType(getModel().getSession().getSessionId(), HistoryReference.TYPE_SPIDER_SEED);
          getModel().getDb().getTableHistory().deleteHistoryType(getModel().getSession().getSessionId(), HistoryReference.TYPE_SPIDER_VISITED);

        } catch (SQLException e) {
            e.printStackTrace();
        }

      if (getView() != null) {
          getMenuItemSpider().setEnabled(true);
          getPopupMenuSpider().setEnabled(true);

      }

      try {
          Thread.sleep(3000);
      } catch (Exception e) {}
     
      if (getView() != null && dialog != null) {
          if (EventQueue.isDispatchThread()) {
              dialog.dispose();
              return;
          }
          try {
              EventQueue.invokeAndWait(new Runnable() {
                  public void run() {
                      dialog.dispose();
                  }
              });
          } catch (Exception e) {
          }
      }
  }
 
  public void foundURI(HttpMessage msg, boolean isSkip) {
      if (getView() != null) {
          if (isSkip) {
              getSpiderPanel().appendFoundButSkip(msg.getRequestHeader().getURI().toString() + "\n");
          } else {
              getSpiderPanel().appendFound(msg.getRequestHeader().getURI().toString() + "\n");
          }
        }
  }
 
  public void readURI(HttpMessage msg) {

      SiteMap siteTree = getModel().getSession().getSiteTree();

      // record into sitemap if not exist
    HttpMessage existing = siteTree.pollPath(msg);

//    always add to tree   
//    if (existing != null) {
//        return;
//    }
   
    HistoryReference historyRef = null;
        try {
            historyRef = new HistoryReference(getModel().getSession(), HistoryReference.TYPE_SPIDER, msg);
        } catch (Exception e) {}
        siteTree.addPath(historyRef, msg);

       
  }

    public Spider getSpider() {
      return spider;
  }
 
  public void spiderProgress(final URI uri, final int percentageComplete, final int numberCrawled, final int numberToCrawl) {
      String uriString= "";
     
      if (dialog != null) {
          if (EventQueue.isDispatchThread()) {
              dialog.getTxtNumCrawled().setText(Integer.toString(numberCrawled));
              dialog.getTxtOutstandingCrawl().setText(Integer.toString(numberToCrawl));

              dialog.getProgressBar().setValue(percentageComplete);
              uriString = "";
              if (uri != null) {
                  uriString = uri.toString();
              }
              dialog.getTxtDisplay().setText(uriString);
              //dialog.getTxtDisplay().setCaretPosition(0);
             
              return;
          }
          try {
              EventQueue.invokeAndWait(new Runnable() {
                  public void run() {
                      String uriString = "";
                    dialog.getTxtNumCrawled().setText(Integer.toString(numberCrawled));
                    dialog.getTxtOutstandingCrawl().setText(Integer.toString(numberToCrawl));

                    dialog.getProgressBar().setValue(percentageComplete);
                    if (uri != null) {
                        uriString = uri.toString();
                    }
                    dialog.getTxtDisplay().setText(uriString);
                    //dialog.getTxtDisplay().setCaretPosition(0);
                   
                  }
              });
          } catch (Exception e) {
          }
         
      }

     
  }
    /**
     * @return Returns the startNode.
     */
    public SiteNode getStartNode() {
        return startNode;
    }
    /**
     * @param startNode The startNode to set.
     */
    public void setStartNode(SiteNode startNode) {
        this.startNode = startNode;
    }
   
    void showDialog(String msg) {
    dialog = new SpiderDialog(getView().getMainFrame(), false);
    dialog.setPlugin(ExtensionSpider.this);
    dialog.setVisible(true);
    dialog.getTxtDisplay().setText(msg);
    spider = null;

    }
   
  /**
   * This method initializes popupMenuSpider 
   *  
   * @return com.proofsecure.paros.plugin.Spider.PopupMenuSpider 
   */   
  PopupMenuSpider getPopupMenuSpider() {
    if (popupMenuSpider == null) {
      popupMenuSpider = new PopupMenuSpider();


      popupMenuSpider.setExtension(this);
    }
    return popupMenuSpider;
  }
 
  void clear() {
      spider = null;
      System.gc();
  }
 
  /**
   * This method initializes spiderPanel 
   *  
   * @return org.parosproxy.paros.extension.spider.SpiderPanel 
   */   
  private SpiderPanel getSpiderPanel() {
    if (spiderPanel == null) {
      spiderPanel = new SpiderPanel();
    }
    return spiderPanel;
  }

    /* (non-Javadoc)
     * @see org.parosproxy.paros.extension.SessionChangedListener#sessionChanged(org.parosproxy.paros.model.Session)
     */
    public void sessionChanged(Session session) {
        getSpiderPanel().clear();
       
    }


  /**
   * This method initializes optionsSpiderPanel 
   *  
   * @return org.parosproxy.paros.extension.spider.OptionsSpiderPanel 
   */   
  private OptionsSpiderPanel getOptionsSpiderPanel() {
    if (optionsSpiderPanel == null) {
      optionsSpiderPanel = new OptionsSpiderPanel();
    }
    return optionsSpiderPanel;
  }
  /**
   * This method initializes spiderParam 
   *  
   * @return org.parosproxy.paros.core.spider.SpiderParam 
   */   
  private SpiderParam getSpiderParam() {
    if (spiderParam == null) {
      spiderParam = new SpiderParam();
    }
    return spiderParam;
  }

    /* (non-Javadoc)
     * @see org.parosproxy.paros.extension.CommandLineListener#execute(org.parosproxy.paros.extension.CommandLineArgument[])
     */
    public void execute(CommandLineArgument[] args) {
        String uri = null;

        if (!arguments[ARG_URL_IDX].isEnabled() && (arguments[ARG_SPIDER_IDX].isEnabled())) {
            return;
        }
       
        spider = new Spider(getSpiderParam(), getModel().getOptionsParam().getConnectionParam(), getModel());
        spider.addSpiderListener(this);

        if (arguments[ARG_URL_IDX].isEnabled()) {
            Vector v = arguments[ARG_URL_IDX].getArguments();
            for (int i=0; i<v.size(); i++) {
                uri = (String) v.get(i);
                try {
                    System.out.println("Adding seed " + uri);
                    spider.addSeed(new URI(uri, true));
                } catch (URIException e) {
                    e.printStackTrace();
                }
            }
        }
       
        if (arguments[ARG_SPIDER_IDX].isEnabled()) {
            System.out.println("Starting spider...");
            spider.start();
        }

        while (!spider.isStop()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
        System.out.println("Spider completed.");

    }

    private CommandLineArgument[] getCommandLineArguments() {
        arguments[ARG_SPIDER_IDX] = new CommandLineArgument("-spider", 0, null, "", "-spider : run spider.  See other parameters");
        arguments[ARG_URL_IDX] = new CommandLineArgument("-seed", -1, "https{0,1}://\\S+", "Seed should be a URL", "-seed {URL1} {URL2} ... : Add seeds to the spider for crawling.");
        return arguments;
    }

  }  //  @jve:decl-index=0:
TOP

Related Classes of org.parosproxy.paros.extension.spider.ExtensionSpider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.