////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2009-2014 Denim Group, Ltd.
//
// The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is ThreadFix.
//
// The Initial Developer of the Original Code is Denim Group, Ltd.
// Portions created by Denim Group, Ltd. are Copyright (C)
// Denim Group, Ltd. All Rights Reserved.
//
// Contributor(s): Denim Group, Ltd.
//
////////////////////////////////////////////////////////////////////////
package burp;
import burp.custombutton.EndpointsButton;
import burp.custombutton.ExportButton;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: stran
* Date: 12/30/13
* Time: 2:28 PM
* To change this template use File | Settings | File Templates.
*/
public class BurpExtender extends AbstractTableModel implements IBurpExtender, ITab, IHttpListener, IMessageEditorController
{
private IBurpExtenderCallbacks callbacks;
private IExtensionHelpers helpers;
private JRootPane rootPane;
private final List<LogEntry> log = new ArrayList<LogEntry>();
private IHttpRequestResponse currentlyDisplayedItem;
private JButton b1, b2;
//
// implement IBurpExtender
//
@Override
public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks)
{
// keep a reference to our callbacks object
this.callbacks = callbacks;
// obtain an extension helpers object
helpers = callbacks.getHelpers();
// set our extension name
callbacks.setExtensionName("ThreadFix plugin");
// create UI
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
b1 = new EndpointsButton(getUiComponent(), callbacks);
b2 = new ExportButton(getUiComponent(), callbacks);
b1.setLocation(10,10);
b1.setSize(200,30);
b2.setLocation(10,50);
b2.setSize(200,30);
// main pane
rootPane = new JRootPane();
rootPane.getContentPane().setLayout(null);
rootPane.getContentPane().add(b1);
rootPane.getContentPane().add(b2);
// customize our UI components
callbacks.customizeUiComponent(rootPane);
callbacks.customizeUiComponent(b1);
callbacks.customizeUiComponent(b2);
// add the custom tab to Burp's UI
callbacks.addSuiteTab(BurpExtender.this);
// register ourselves as an HTTP listener
callbacks.registerHttpListener(BurpExtender.this);
}
});
}
//
// implement ITab
//
@Override
public String getTabCaption()
{
return "ThreadFix";
}
@Override
public Component getUiComponent()
{
return rootPane;
}
//
// implement IHttpListener
//
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)
{
// only process responses
if (!messageIsRequest)
{
// create a new log entry with the message details
synchronized(log)
{
int row = log.size();
log.add(new LogEntry(toolFlag, callbacks.saveBuffersToTempFiles(messageInfo),
helpers.analyzeRequest(messageInfo).getUrl()));
fireTableRowsInserted(row, row);
}
}
}
//
// extend AbstractTableModel
//
@Override
public int getRowCount()
{
return log.size();
}
@Override
public int getColumnCount()
{
return 2;
}
@Override
public String getColumnName(int columnIndex)
{
switch (columnIndex)
{
case 0:
return "Tool";
case 1:
return "URL";
default:
return "";
}
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
return String.class;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
LogEntry logEntry = log.get(rowIndex);
switch (columnIndex)
{
case 0:
return callbacks.getToolName(logEntry.tool);
case 1:
return logEntry.url.toString();
default:
return "";
}
}
//
// implement IMessageEditorController
// this allows our request/response viewers to obtain details about the messages being displayed
//
@Override
public byte[] getRequest()
{
return currentlyDisplayedItem.getRequest();
}
@Override
public byte[] getResponse()
{
return currentlyDisplayedItem.getResponse();
}
@Override
public IHttpService getHttpService()
{
return currentlyDisplayedItem.getHttpService();
}
//
// class to hold details of each log entry
//
private static class LogEntry
{
final int tool;
final IHttpRequestResponsePersisted requestResponse;
final URL url;
LogEntry(int tool, IHttpRequestResponsePersisted requestResponse, URL url)
{
this.tool = tool;
this.requestResponse = requestResponse;
this.url = url;
}
}
}