Skip to content

Commit

Permalink
Version: 3.3.3 Update
Browse files Browse the repository at this point in the history
  • Loading branch information
gh0stkey committed Sep 19, 2024
1 parent 5b6bdbe commit ae8cb2f
Show file tree
Hide file tree
Showing 8 changed files with 421 additions and 359 deletions.
2 changes: 2 additions & 0 deletions src/main/java/hae/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ public class Config {

public static String status = "404";

public static String size = "0";

public static String boundary = "\n\t\n";

public static String[] scope = new String[]{
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/hae/HaE.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class HaE implements BurpExtension {
@Override
public void initialize(MontoyaApi api) {
// 设置扩展名称
String version = "3.3.2";
String version = "3.3.3";
api.extension().setName(String.format("HaE (%s) - Highlighter and Extractor", version));

// 加载扩展后输出的项目信息
Expand All @@ -30,7 +30,7 @@ public void initialize(MontoyaApi api) {
// 配置文件加载
ConfigLoader configLoader = new ConfigLoader(api);

MessageTableModel messageTableModel = new MessageTableModel(api);
MessageTableModel messageTableModel = new MessageTableModel(api, configLoader);

// 注册Tab页(用于查询数据)
api.userInterface().registerSuiteTab("HaE", new Main(api, configLoader, messageTableModel));
Expand Down
32 changes: 24 additions & 8 deletions src/main/java/hae/component/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ private void initComponents() {
constraints.gridx = 1;
JTabbedPane configTabbedPanel = new JTabbedPane();

String[] settingMode = new String[]{"Exclude suffix", "Block host", "Exclude status"};
String[] settingMode = new String[]{"Exclude suffix", "Block host", "Exclude status", "Limit size"};
JPanel settingPanel = createConfigTablePanel(settingMode, "Setting");
JPanel scopePanel = getScopePanel();
JScrollPane scopeScrollPane = new JScrollPane(scopePanel);
Expand Down Expand Up @@ -153,6 +153,13 @@ public void tableChanged(TableModelEvent e) {
configLoader.setExcludeStatus(values);
}
}

if (selected.equals("Limit size")) {
if (!values.equals(configLoader.getExcludeStatus()) && !values.isEmpty()) {
String[] limit = values.split("\\|");
configLoader.setLimitSize(limit[limit.length - 1]);
}
}
}
};
}
Expand All @@ -175,6 +182,10 @@ public void actionPerformed(ActionEvent e) {
if (selected.equals("Exclude status")) {
addDataToTable(configLoader.getExcludeStatus().replaceAll("\\|", "\r\n"), model);
}

if (selected.equals("Limit size")) {
addDataToTable(configLoader.getLimitSize(), model);
}
}
};
}
Expand Down Expand Up @@ -279,13 +290,13 @@ private JPanel createConfigTablePanel(String[] mode, String type) {
settingPanel.add(inputPanel, BorderLayout.CENTER);


addButton.addActionListener(e -> addActionPerformed(e, model, addTextField));
addButton.addActionListener(e -> addActionPerformed(e, model, addTextField, setTypeComboBox.getSelectedItem().toString()));

addTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
addActionPerformed(null, model, addTextField);
addActionPerformed(null, model, addTextField, setTypeComboBox.getSelectedItem().toString());
}
}
});
Expand All @@ -294,7 +305,9 @@ public void keyPressed(KeyEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
try {
String data = (String) clipboard.getData(DataFlavor.stringFlavor);

if (setTypeComboBox.getSelectedItem().toString().equals("Limit size")) {
model.setRowCount(0);
}
if (data != null && !data.isEmpty()) {
addDataToTable(data, model);
}
Expand Down Expand Up @@ -385,13 +398,16 @@ public void updateScope(JCheckBox checkBox) {
configLoader.setScope(String.join("|", HaEScope));
}

private void addActionPerformed(ActionEvent e, DefaultTableModel model, JTextField addTextField) {
private void addActionPerformed(ActionEvent e, DefaultTableModel model, JTextField addTextField, String comboBoxSelected) {
String addTextFieldText = addTextField.getText();
if (!addTextFieldText.equals(defaultText)) {
if (addTextField.getForeground().equals(Color.BLACK)) {
if (comboBoxSelected.equals("Limit size")) {
model.setRowCount(0);
}
addDataToTable(addTextFieldText, model);
addTextField.setText("");
addTextField.requestFocusInWindow();
}
addTextField.setText("");
addTextField.requestFocusInWindow();
}

private void onlineUpdateActionPerformed(ActionEvent e) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/hae/component/board/Databoard.java
Original file line number Diff line number Diff line change
Expand Up @@ -419,8 +419,8 @@ private JScrollPane generateTaskStatusPane(List<Object[]> dataList) {
JTable taskStatusTable = new JTable(taskStatusTableModel);

for (Object[] data : dataList) {
int rowCount = taskStatusTable.getRowCount();
int id = rowCount > 0 ? (Integer) taskStatusTable.getValueAt(rowCount - 1, 0) + 1 : 1;
int rowCount = taskStatusTableModel.getRowCount();
int id = rowCount > 0 ? (Integer) taskStatusTableModel.getValueAt(rowCount - 1, 0) + 1 : 1;
Object[] rowData = new Object[data.length + 1];
rowData[0] = id;
System.arraycopy(data, 0, rowData, 1, data.length);
Expand Down
63 changes: 23 additions & 40 deletions src/main/java/hae/component/board/message/MessageTableModel.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package hae.component.board.message;

import burp.api.montoya.MontoyaApi;
import burp.api.montoya.core.ByteArray;
import burp.api.montoya.http.message.HttpHeader;
import burp.api.montoya.http.message.HttpRequestResponse;
import burp.api.montoya.http.message.requests.HttpRequest;
Expand All @@ -11,6 +10,7 @@
import burp.api.montoya.ui.editor.HttpResponseEditor;
import hae.Config;
import hae.cache.CachePool;
import hae.utils.ConfigLoader;
import hae.utils.project.FileProcessor;
import hae.utils.string.HashCalculator;
import hae.utils.string.StringProcessor;
Expand All @@ -23,22 +23,26 @@
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

import static burp.api.montoya.ui.editor.EditorOptions.READ_ONLY;

public class MessageTableModel extends AbstractTableModel {
private final MontoyaApi api;
private final ConfigLoader configLoader;
private final MessageTable messageTable;
private final JSplitPane splitPane;
private final LinkedList<MessageEntry> log = new LinkedList<>();
private final LinkedList<MessageEntry> filteredLog;
private SwingWorker<Void, Void> currentWorker;

public MessageTableModel(MontoyaApi api) {
public MessageTableModel(MontoyaApi api, ConfigLoader configLoader) {
this.filteredLog = new LinkedList<>();
this.api = api;
this.configLoader = configLoader;

JTabbedPane messageTab = new JTabbedPane();
UserInterface userInterface = api.userInterface();
Expand Down Expand Up @@ -435,7 +439,7 @@ public String getColumnName(int columnIndex) {

public class MessageTable extends JTable {
private MessageEntry messageEntry;
private SwingWorker<ByteArray[], Void> currentWorker;
private final ExecutorService executorService;
private int lastSelectedIndex = -1;
private final HttpRequestEditor requestEditor;
private final HttpResponseEditor responseEditor;
Expand All @@ -444,52 +448,31 @@ public MessageTable(TableModel messageTableModel, HttpRequestEditor requestEdito
super(messageTableModel);
this.requestEditor = requestEditor;
this.responseEditor = responseEditor;
this.executorService = Executors.newSingleThreadExecutor();
}

@Override
public void changeSelection(int row, int col, boolean toggle, boolean extend) {
super.changeSelection(row, col, toggle, extend);

if (currentWorker != null && !currentWorker.isDone()) {
currentWorker.cancel(true);
int selectedIndex = convertRowIndexToModel(row);
if (lastSelectedIndex != selectedIndex) {
lastSelectedIndex = selectedIndex;
executorService.execute(this::getSelectedMessage);
}
}

currentWorker = new SwingWorker<>() {
@Override
protected ByteArray[] doInBackground() {
int selectedIndex = convertRowIndexToModel(row);
if (lastSelectedIndex != selectedIndex) {
lastSelectedIndex = selectedIndex;
messageEntry = filteredLog.get(selectedIndex);

HttpRequestResponse httpRequestResponse = messageEntry.getRequestResponse();

ByteArray requestByte = httpRequestResponse.request().toByteArray();
ByteArray responseByte = httpRequestResponse.response().toByteArray();

ByteArray[] httpByteArray = new ByteArray[2];
httpByteArray[0] = requestByte;
httpByteArray[1] = responseByte;
return httpByteArray;
}

return null;
}
private void getSelectedMessage() {
messageEntry = filteredLog.get(lastSelectedIndex);

@Override
protected void done() {
try {
ByteArray[] retByteArray = get();
if (retByteArray != null) {
requestEditor.setRequest(HttpRequest.httpRequest(messageEntry.getRequestResponse().httpService(), retByteArray[0]));
responseEditor.setResponse(HttpResponse.httpResponse(retByteArray[1]));
}
} catch (Exception ignored) {
}
}
};
HttpRequestResponse httpRequestResponse = messageEntry.getRequestResponse();

currentWorker.execute();
requestEditor.setRequest(HttpRequest.httpRequest(messageEntry.getRequestResponse().httpService(), httpRequestResponse.request().toByteArray()));
int responseSizeWithMb = httpRequestResponse.response().toString().length() / 1024 / 1024;
if ((responseSizeWithMb < Integer.parseInt(configLoader.getLimitSize())) || configLoader.getLimitSize().equals("0")) {
responseEditor.setResponse(httpRequestResponse.response());
} else {
responseEditor.setResponse(HttpResponse.httpResponse("Exceeds length limit."));
}
}
}
}
100 changes: 76 additions & 24 deletions src/main/java/hae/component/board/table/Datatable.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
Expand All @@ -34,6 +35,7 @@ public class Datatable extends JPanel {
private final JTable dataTable;
private final DefaultTableModel dataTableModel;
private final JTextField searchField;
private final JTextField secondSearchField;
private final TableRowSorter<DefaultTableModel> sorter;
private final JCheckBox searchMode = new JCheckBox("Reverse search");
private final String tabName;
Expand All @@ -52,7 +54,8 @@ public Datatable(MontoyaApi api, ConfigLoader configLoader, String tabName, List

this.dataTable = new JTable(dataTableModel);
this.sorter = new TableRowSorter<>(dataTableModel);
this.searchField = new JTextField();
this.searchField = new JTextField(10);
this.secondSearchField = new JTextField(10);
this.aiEmpoweredMenu = new JPopupMenu();
this.footerPanel = new JPanel(new BorderLayout(0, 5));

Expand Down Expand Up @@ -80,11 +83,7 @@ public int compare(Integer s1, Integer s2) {
}
}

// 设置灰色默认文本
String searchText = "Search";
UIEnhancer.setTextFieldPlaceholder(searchField, searchText);

// 监听输入框内容输入、更新、删除
UIEnhancer.setTextFieldPlaceholder(searchField, "Search");
searchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
Expand All @@ -103,6 +102,25 @@ public void changedUpdate(DocumentEvent e) {

});

UIEnhancer.setTextFieldPlaceholder(secondSearchField, "Second search");
secondSearchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
performSearch();
}

@Override
public void removeUpdate(DocumentEvent e) {
performSearch();
}

@Override
public void changedUpdate(DocumentEvent e) {
performSearch();
}

});

// 设置布局
JScrollPane scrollPane = new JScrollPane(dataTable);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
Expand Down Expand Up @@ -162,6 +180,8 @@ public void popupMenuCanceled(PopupMenuEvent e) {
optionsPanel.add(Box.createHorizontalStrut(5));
optionsPanel.add(searchField);
optionsPanel.add(Box.createHorizontalStrut(5));
optionsPanel.add(secondSearchField);
optionsPanel.add(Box.createHorizontalStrut(5));
optionsPanel.add(aiEmpoweredButton);

footerPanel.setBorder(BorderFactory.createEmptyBorder(2, 3, 5, 3));
Expand Down Expand Up @@ -252,27 +272,59 @@ protected void done() {
}

private void performSearch() {
RowFilter<Object, Object> firstRowFilter = applyFirstSearchFilter();
RowFilter<Object, Object> secondRowFilter = applySecondFilter();
if (searchField.getForeground().equals(Color.BLACK)) {
RowFilter<Object, Object> rowFilter = new RowFilter<Object, Object>() {
public boolean include(Entry<?, ?> entry) {
String searchFieldTextText = searchField.getText();
Pattern pattern = null;
try {
pattern = Pattern.compile(searchFieldTextText, Pattern.CASE_INSENSITIVE);
} catch (Exception ignored) {
}
sorter.setRowFilter(firstRowFilter);
if (secondSearchField.getForeground().equals(Color.BLACK)) {
List<RowFilter<Object, Object>> filters = new ArrayList<>();
filters.add(firstRowFilter);
filters.add(secondRowFilter);
sorter.setRowFilter(RowFilter.andFilter(filters));
}
}
}

String entryValue = ((String) entry.getValue(1)).toLowerCase();
searchFieldTextText = searchFieldTextText.toLowerCase();
if (pattern != null) {
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find() != searchMode.isSelected();
} else {
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText) != searchMode.isSelected();
}
private RowFilter<Object, Object> applyFirstSearchFilter() {
return new RowFilter<Object, Object>() {
public boolean include(Entry<?, ?> entry) {
String searchFieldTextText = searchField.getText();
Pattern pattern = null;
try {
pattern = Pattern.compile(searchFieldTextText, Pattern.CASE_INSENSITIVE);
} catch (Exception ignored) {
}
};
sorter.setRowFilter(rowFilter);
}

String entryValue = ((String) entry.getValue(1)).toLowerCase();
searchFieldTextText = searchFieldTextText.toLowerCase();
if (pattern != null) {
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find() != searchMode.isSelected();
} else {
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText) != searchMode.isSelected();
}
}
};
}

private RowFilter<Object, Object> applySecondFilter() {
return new RowFilter<Object, Object>() {
public boolean include(Entry<?, ?> entry) {
String searchFieldTextText = secondSearchField.getText();
Pattern pattern = null;
try {
pattern = Pattern.compile(searchFieldTextText, Pattern.CASE_INSENSITIVE);
} catch (Exception ignored) {
}

String entryValue = ((String) entry.getValue(1)).toLowerCase();
searchFieldTextText = searchFieldTextText.toLowerCase();
if (pattern != null) {
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find();
} else {
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText);
}
}
};
}

public void setTableListener(MessageTableModel messagePanel) {
Expand Down
Loading

0 comments on commit ae8cb2f

Please sign in to comment.