Skip to content

Commit

Permalink
Implemented export spreadsheet
Browse files Browse the repository at this point in the history
  • Loading branch information
moloch-- committed Oct 14, 2020
1 parent 0c8b83b commit a7a3c70
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 34 deletions.
57 changes: 45 additions & 12 deletions src/burp/MultiplayerExporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,40 +34,66 @@
*/
public class MultiplayerExporter {

private final MultiplayerLogger logger;
private final Multiplayer multiplayer;
private final IBurpExtenderCallbacks callbacks;
public static final List<String> defaultExportedColumns = new ArrayList<String>(Arrays.asList(
Method, Protocol, Host, Path, Port, StatusCode, Comment, DateTime
));

public MultiplayerExporter(Multiplayer multiplayer, IBurpExtenderCallbacks callbacks) {
public MultiplayerExporter(Multiplayer multiplayer, MultiplayerLogger logger) {
this.multiplayer = multiplayer;
this.callbacks = callbacks;
this.logger = logger;
}

public Boolean ExportXLSX(String filepath) {
public Boolean exportXLSX(String filePath) {
return this.exportXLSX(filePath, defaultExportedColumns);
}

public Boolean exportXLSX(String filePath, List<String> exportColumns) {

Workbook workbook = new XSSFWorkbook();

Sheet allSheet = workbook.createSheet("All");
Integer allRowCursor = 0;
// HashMap<String, Sheet> sheetMap = new HashMap();
// HashMap<String, Integer> rowCursors = new HashMap();
Integer allRowCursor = 1;

HashMap<String, Sheet> sheetMap = new HashMap();
HashMap<String, Integer> rowCursors = new HashMap();
List<String> hostColumns = new ArrayList<>(exportColumns);
if (hostColumns.contains(Host)) {
hostColumns.remove(Host);
}

HashMap<String, MultiplayerRequestResponse> snapshot = multiplayer.history.snapshot();


writeHeaders(allSheet, exportColumns);
for (String key : snapshot.keySet()) {
MultiplayerRequestResponse reqResp = snapshot.get(key);
Row allRow = allSheet.createRow(allRowCursor++);
writeRow(allRow, defaultExportedColumns, reqResp);
writeRow(allRow, exportColumns, reqResp);

if (!sheetMap.containsKey(reqResp.getHost())) {
Sheet sheet = workbook.createSheet(reqResp.getHost());
writeHeaders(sheet, hostColumns);
sheetMap.put(reqResp.getHost(), sheet);
rowCursors.put(reqResp.getHost(), 1);
}

Sheet sheet = sheetMap.get(reqResp.getHost());
int rowCursor = rowCursors.get(reqResp.getHost());
Row row = sheet.createRow(rowCursor);
rowCursors.put(reqResp.getHost(), ++rowCursor);
writeRow(row, hostColumns, reqResp);
}

// Write to disk
try (OutputStream fileOut = new FileOutputStream(filepath)) {
try (OutputStream fileOut = new FileOutputStream(filePath)) {
workbook.write(fileOut);
return true;
} catch (FileNotFoundException err) {
callbacks.printError(err.toString());
logger.error(err);
} catch (IOException err) {
callbacks.printError(err.toString());
logger.error(err);
}
return false;
}
Expand All @@ -79,7 +105,7 @@ private void writeRow(Row row, List<String> exportedColumns, MultiplayerRequestR
if (value == null) {
return;
}
callbacks.printOutput(String.format("Export: %s", value.getClass().getSimpleName()));
logger.debug("Export: %s", value.getClass().getSimpleName());
switch (value.getClass().getSimpleName()) {
case "String":
cell.setCellValue((String) value);
Expand All @@ -90,4 +116,11 @@ private void writeRow(Row row, List<String> exportedColumns, MultiplayerRequestR
}
});
}

private void writeHeaders(Sheet sheet, List<String> columnNames) {
Row row = sheet.createRow(0);
for (int index = 0; index < columnNames.size(); ++index) {
row.createCell(index).setCellValue(columnNames.get(index));
}
}
}
13 changes: 11 additions & 2 deletions src/burp/MultiplayerLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/
package burp;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand All @@ -23,8 +25,8 @@ public class MultiplayerLogger {
DEBUG, INFO, WARN, ERROR
));
public final IBurpExtenderCallbacks callbacks;
private String currentLevel = DEBUG;
private String currentLevel = INFO;

public MultiplayerLogger(IBurpExtenderCallbacks callbacks) {
this.callbacks = callbacks;
}
Expand Down Expand Up @@ -61,4 +63,11 @@ public void error(String format, Object ... args) {
callbacks.printError(String.format(format, args));
}

public void error(Exception err) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
err.printStackTrace(pw);
callbacks.printError(sw.toString());
}

}
6 changes: 1 addition & 5 deletions src/burp/gui/ConnectionPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,7 @@ private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN
this.triggerOnConnection();
}
} catch (Exception err) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
err.printStackTrace(pw);
logger.error(sw.toString());

logger.error(err);
JOptionPane.showMessageDialog(this,
String.format("Failed to connect.\n%s", err),
"Conncection Error",
Expand Down
8 changes: 4 additions & 4 deletions src/burp/gui/InScopePane.form
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="stateProgressBar" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="jButton1" min="-2" max="-2" attributes="0"/>
<Component id="exportSpreadsheetButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
Expand All @@ -46,7 +46,7 @@
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="-2" pref="12" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="exportSpreadsheetButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="newStateCheckBox" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="filtersLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="inProgressStateCheckBox" alignment="3" min="-2" max="-2" attributes="0"/>
Expand Down Expand Up @@ -111,12 +111,12 @@
</Container>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="jButton1">
<Component class="javax.swing.JButton" name="exportSpreadsheetButton">
<Properties>
<Property name="text" type="java.lang.String" value="Export Spreadsheet"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exportSpreadsheetButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JCheckBox" name="newStateCheckBox">
Expand Down
36 changes: 26 additions & 10 deletions src/burp/gui/InScopePane.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import burp.HTTPMessageEditor;
import burp.IBurpExtenderCallbacks;
import burp.Multiplayer;
import burp.MultiplayerExporter;
import burp.MultiplayerLogger;
import burp.MultiplayerRequestResponse;
import java.awt.Color;
Expand All @@ -17,11 +18,14 @@
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.RowFilter;
import javax.swing.RowFilter.Entry;
Expand Down Expand Up @@ -421,7 +425,7 @@ public Component prepareRenderer(TableCellRenderer renderer, int row, int column
}
};
bottomTabbedPane = new javax.swing.JTabbedPane();
jButton1 = new javax.swing.JButton();
exportSpreadsheetButton = new javax.swing.JButton();
newStateCheckBox = new javax.swing.JCheckBox();
filtersLabel = new javax.swing.JLabel();
inProgressStateCheckBox = new javax.swing.JCheckBox();
Expand All @@ -445,10 +449,10 @@ public Component prepareRenderer(TableCellRenderer renderer, int row, int column
parentSplitPane.setTopComponent(inScopeTablePane);
parentSplitPane.setRightComponent(bottomTabbedPane);

jButton1.setText("Export Spreadsheet");
jButton1.addActionListener(new java.awt.event.ActionListener() {
exportSpreadsheetButton.setText("Export Spreadsheet");
exportSpreadsheetButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
exportSpreadsheetButtonActionPerformed(evt);
}
});

Expand Down Expand Up @@ -514,15 +518,15 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(stateProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton1)
.addComponent(exportSpreadsheetButton)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(exportSpreadsheetButton)
.addComponent(newStateCheckBox)
.addComponent(filtersLabel)
.addComponent(inProgressStateCheckBox)
Expand Down Expand Up @@ -556,20 +560,32 @@ private void blockedStateCheckBoxActionPerformed(java.awt.event.ActionEvent evt)
refresh();
}//GEN-LAST:event_blockedStateCheckBoxActionPerformed

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jButton1ActionPerformed
private void exportSpreadsheetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportSpreadsheetButtonActionPerformed
MultiplayerExporter exporter = new MultiplayerExporter(multiplayer, logger);
JFrame parentFrame = new JFrame();
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Save spreadsheet to ...");
int userSelection = fileChooser.showSaveDialog(parentFrame);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
String filePath = fileToSave.getAbsolutePath();
if (!filePath.endsWith(".xlsx")) {
filePath = String.format("%s.xlsx", filePath);
}
exporter.exportXLSX(filePath);
}
}//GEN-LAST:event_exportSpreadsheetButtonActionPerformed


// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox blockedStateCheckBox;
private javax.swing.JTabbedPane bottomTabbedPane;
private javax.swing.JCheckBox doneStateCheckBox;
private javax.swing.JButton exportSpreadsheetButton;
private javax.swing.JLabel filtersLabel;
private javax.swing.JCheckBox inProgressStateCheckBox;
private javax.swing.JTable inScopeTable;
private javax.swing.JScrollPane inScopeTablePane;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JCheckBox newStateCheckBox;
private javax.swing.JSplitPane parentSplitPane;
Expand Down
2 changes: 1 addition & 1 deletion src/burp/gui/MainPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public MainPanel(Multiplayer multiplayer, MultiplayerLogger logger) {

OptionsPane optionsPane = new OptionsPane(multiplayer, logger);
this.mainTabbedPane.addTab("Options", optionsPane);
callbacks.printOutput("Main panel initialized");
logger.debug("Main panel initialized");
}

/**
Expand Down

0 comments on commit a7a3c70

Please sign in to comment.