Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e08b930fb5 | ||
|
|
49647d68d0 | ||
|
|
1c63841140 | ||
|
|
105c506039 |
@@ -33,9 +33,9 @@ HaE目前的规则一共有6个字段,分别是规则名称、规则正则、
|
|||||||
|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Name | 规则名称,主要用于简短概括当前规则的作用。 |
|
| Name | 规则名称,主要用于简短概括当前规则的作用。 |
|
||||||
| Regex | 规则正则,主要用于填写正则表达式。在HaE中所需提取匹配的内容需要用`(`、`)`将正则表达式进行包裹。 |
|
| Regex | 规则正则,主要用于填写正则表达式。在HaE中所需提取匹配的内容需要用`(`、`)`将正则表达式进行包裹。 |
|
||||||
| Scope | 规则作用域,主要用于表示当前规则作用与HTTP报文的哪个部分。 |
|
| Scope | 规则作用域,主要用于表示当前规则作用于HTTP报文的哪个部分。 |
|
||||||
| Engine | 正则引擎,主要用于表示当前规则的正则表达式所使用的引擎。**DFA引擎**:对于文本串里的每一个字符只需扫描一次,速度快、特性少;**NFA引擎**:要翻来覆去标注字符、取消标注字符,速度慢,但是特性(如:分组、替换、分割)丰富。 |
|
| Engine | 正则引擎,主要用于表示当前规则的正则表达式所使用的引擎。**DFA引擎**:对于文本串里的每一个字符只需扫描一次,速度快、特性少;**NFA引擎**:要翻来覆去标注字符、取消标注字符,速度慢,但是特性(如:分组、替换、分割)丰富。 |
|
||||||
| Color | 规则匹配颜色,主要用于表示当前规则匹配到对应HTTP报文时所需标记的高亮颜色。 |
|
| Color | 规则匹配颜色,主要用于表示当前规则匹配到对应HTTP报文时所需标记的高亮颜色。在HaE中具备颜色升级算法,当出现相同颜色时会自动向上升级一个颜色进行标记。 |
|
||||||
| Sensitive | 规则敏感性,主要用于表示当前规则对于大小写字母是否敏感,敏感(`True`)则严格按照大小写要求匹配,不敏感(`False`)则反之。 |
|
| Sensitive | 规则敏感性,主要用于表示当前规则对于大小写字母是否敏感,敏感(`True`)则严格按照大小写要求匹配,不敏感(`False`)则反之。 |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
|||||||
|
|
||||||
new ConfigLoader();
|
new ConfigLoader();
|
||||||
|
|
||||||
String version = "2.5.9";
|
String version = "2.5.11";
|
||||||
callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version));
|
callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version));
|
||||||
|
|
||||||
// 定义输出
|
// 定义输出
|
||||||
@@ -128,6 +128,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
|||||||
private Map<String, String> extractRequestMap;
|
private Map<String, String> extractRequestMap;
|
||||||
private Map<String, String> extractResponseMap;
|
private Map<String, String> extractResponseMap;
|
||||||
private ArrayList<String> titleList = new ArrayList<>();
|
private ArrayList<String> titleList = new ArrayList<>();
|
||||||
|
private byte[] message;
|
||||||
|
|
||||||
public MarkInfoTab(IMessageEditorController controller, boolean editable) {
|
public MarkInfoTab(IMessageEditorController controller, boolean editable) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -151,6 +152,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled(byte[] content, boolean isRequest) {
|
public boolean isEnabled(byte[] content, boolean isRequest) {
|
||||||
|
this.message = content;
|
||||||
List<Map<String, String>> result = null;
|
List<Map<String, String>> result = null;
|
||||||
if (content.length != 0 && !helpers.bytesToString(content).equals("Loading...")) {
|
if (content.length != 0 && !helpers.bytesToString(content).equals("Loading...")) {
|
||||||
try {
|
try {
|
||||||
@@ -178,7 +180,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] getMessage() {
|
public byte[] getMessage() {
|
||||||
return null;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ public class Databoard extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
|
||||||
hostLabel = new JLabel();
|
hostLabel = new JLabel();
|
||||||
hostTextField = new JTextField();
|
hostTextField = new JTextField();
|
||||||
dataTabbedPane = new JTabbedPane(JTabbedPane.TOP);
|
dataTabbedPane = new JTabbedPane(JTabbedPane.TOP);
|
||||||
@@ -165,6 +164,7 @@ public class Databoard extends JPanel {
|
|||||||
populateTabbedPaneByHost(selectedHost);
|
populateTabbedPaneByHost(selectedHost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleKeyEvents(KeyEvent e) {
|
private void handleKeyEvents(KeyEvent e) {
|
||||||
isMatchHost = true;
|
isMatchHost = true;
|
||||||
int keyCode = e.getKeyCode();
|
int keyCode = e.getKeyCode();
|
||||||
@@ -313,17 +313,25 @@ public class Databoard extends JPanel {
|
|||||||
// 展示请求消息表单
|
// 展示请求消息表单
|
||||||
JSplitPane messageSplitPane = this.messagePanel.getPanel();
|
JSplitPane messageSplitPane = this.messagePanel.getPanel();
|
||||||
this.splitPane.setRightComponent(messageSplitPane);
|
this.splitPane.setRightComponent(messageSplitPane);
|
||||||
// 获取字段
|
|
||||||
table = this.messagePanel.getTable();
|
table = this.messagePanel.getTable();
|
||||||
|
|
||||||
// 设置对应字段宽度
|
this.splitPane.addComponentListener(new ComponentAdapter() {
|
||||||
TableColumnModel columnModel = table.getColumnModel();
|
@Override
|
||||||
TableColumn column = columnModel.getColumn(1);
|
public void componentResized(ComponentEvent e) {
|
||||||
column.setPreferredWidth(300);
|
splitPane.setDividerLocation(0.4);
|
||||||
column = columnModel.getColumn(2);
|
TableColumnModel columnModel = table.getColumnModel();
|
||||||
column.setPreferredWidth(300);
|
int totalWidth = (int) (getWidth() * 0.6);
|
||||||
|
columnModel.getColumn(0).setPreferredWidth((int) (totalWidth * 0.1));
|
||||||
|
columnModel.getColumn(1).setPreferredWidth((int) (totalWidth * 0.3));
|
||||||
|
columnModel.getColumn(2).setPreferredWidth((int) (totalWidth * 0.3));
|
||||||
|
columnModel.getColumn(3).setPreferredWidth((int) (totalWidth * 0.1));
|
||||||
|
columnModel.getColumn(4).setPreferredWidth((int) (totalWidth * 0.1));
|
||||||
|
columnModel.getColumn(5).setPreferredWidth((int) (totalWidth * 0.1));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
splitPane.setVisible(true);
|
splitPane.setVisible(true);
|
||||||
|
|
||||||
applyHostFilter(selectedHost);
|
applyHostFilter(selectedHost);
|
||||||
|
|
||||||
// 主动调用一次stateChanged,使得dataTabbedPane可以精准展示内容
|
// 主动调用一次stateChanged,使得dataTabbedPane可以精准展示内容
|
||||||
@@ -333,20 +341,6 @@ public class Databoard extends JPanel {
|
|||||||
|
|
||||||
hostTextField.setText(selectedHost);
|
hostTextField.setText(selectedHost);
|
||||||
|
|
||||||
ChangeListener changeListener = new ChangeListener() {
|
|
||||||
public void stateChanged(ChangeEvent e) {
|
|
||||||
JTabbedPane tabSource = (JTabbedPane) e.getSource();
|
|
||||||
int index = tabSource.getSelectedIndex();
|
|
||||||
if (index != -1) {
|
|
||||||
Component selectedComponent = tabSource.getComponentAt(index);
|
|
||||||
if (selectedComponent instanceof DatatablePanel) {
|
|
||||||
((DatatablePanel) selectedComponent).updatePageSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
dataTabbedPane.addChangeListener(changeListener);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,19 +7,16 @@ import java.awt.datatransfer.Clipboard;
|
|||||||
import java.awt.datatransfer.StringSelection;
|
import java.awt.datatransfer.StringSelection;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.AdjustmentEvent;
|
|
||||||
import java.awt.event.AdjustmentListener;
|
|
||||||
import java.awt.event.ComponentAdapter;
|
|
||||||
import java.awt.event.ComponentEvent;
|
|
||||||
import java.awt.event.FocusEvent;
|
import java.awt.event.FocusEvent;
|
||||||
import java.awt.event.FocusListener;
|
import java.awt.event.FocusListener;
|
||||||
|
import jregex.Pattern;
|
||||||
|
import jregex.REFlags;
|
||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
import java.awt.event.ItemListener;
|
import java.awt.event.ItemListener;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.Box;
|
import javax.swing.Box;
|
||||||
import javax.swing.BoxLayout;
|
import javax.swing.BoxLayout;
|
||||||
@@ -45,20 +42,11 @@ public class DatatablePanel extends JPanel {
|
|||||||
private final DefaultTableModel model;
|
private final DefaultTableModel model;
|
||||||
private final JTextField searchField;
|
private final JTextField searchField;
|
||||||
private TableRowSorter<DefaultTableModel> sorter;
|
private TableRowSorter<DefaultTableModel> sorter;
|
||||||
private int pageSize; // 动态计算的,每页显示多少条记录
|
|
||||||
private int currentPage; // 当前页码
|
|
||||||
private List<String> fullList; // 假设这是一个包含所有数据的列表
|
|
||||||
private JScrollPane scrollPane;
|
private JScrollPane scrollPane;
|
||||||
private String tableName;
|
private String tableName;
|
||||||
private final int SHOW_LENGTH = 5000;
|
|
||||||
private JCheckBox searchMode = new JCheckBox("Reverse search");
|
private JCheckBox searchMode = new JCheckBox("Reverse search");
|
||||||
private JCheckBox showMode = new JCheckBox("Show all data");
|
|
||||||
private boolean scrollFlag = true;
|
|
||||||
|
|
||||||
public DatatablePanel(String tableName, List<String> list) {
|
public DatatablePanel(String tableName, List<String> list) {
|
||||||
fullList = list;
|
|
||||||
currentPage = 0;
|
|
||||||
pageSize = 10;
|
|
||||||
this.tableName = tableName;
|
this.tableName = tableName;
|
||||||
|
|
||||||
String[] columnNames = {"#", "Information"};
|
String[] columnNames = {"#", "Information"};
|
||||||
@@ -77,6 +65,10 @@ public class DatatablePanel extends JPanel {
|
|||||||
TableColumn idColumn = table.getColumnModel().getColumn(0);
|
TableColumn idColumn = table.getColumnModel().getColumn(0);
|
||||||
idColumn.setMaxWidth(50);
|
idColumn.setMaxWidth(50);
|
||||||
|
|
||||||
|
for (String item : list) {
|
||||||
|
addRowToTable(model, new Object[]{item});
|
||||||
|
}
|
||||||
|
|
||||||
String defaultText = "Search";
|
String defaultText = "Search";
|
||||||
searchField = new JTextField(defaultText);
|
searchField = new JTextField(defaultText);
|
||||||
|
|
||||||
@@ -122,31 +114,6 @@ public class DatatablePanel extends JPanel {
|
|||||||
// 设置布局
|
// 设置布局
|
||||||
scrollPane = new JScrollPane(table);
|
scrollPane = new JScrollPane(table);
|
||||||
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
||||||
scrollPane.addComponentListener(new ComponentAdapter() {
|
|
||||||
@Override
|
|
||||||
public void componentResized(ComponentEvent e) {
|
|
||||||
updatePageSize();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 添加滚动监听器,以加载更多数据
|
|
||||||
AdjustmentListener scrollListener = new AdjustmentListener() {
|
|
||||||
@Override
|
|
||||||
public void adjustmentValueChanged(AdjustmentEvent e) {
|
|
||||||
if (fullList.size() > SHOW_LENGTH) {
|
|
||||||
if (!e.getValueIsAdjusting() && !scrollPane.getVerticalScrollBar().getValueIsAdjusting()) {
|
|
||||||
if (scrollPane.getVerticalScrollBar().getValue() == scrollPane.getVerticalScrollBar().getMaximum() - scrollPane.getVerticalScrollBar().getVisibleAmount()) {
|
|
||||||
if ((currentPage + 1) * pageSize < fullList.size()) {
|
|
||||||
currentPage++;
|
|
||||||
loadPageData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
scrollPane.getVerticalScrollBar().addAdjustmentListener(scrollListener);
|
|
||||||
|
|
||||||
searchMode.addItemListener(new ItemListener() {
|
searchMode.addItemListener(new ItemListener() {
|
||||||
public void itemStateChanged(ItemEvent e) {
|
public void itemStateChanged(ItemEvent e) {
|
||||||
@@ -154,18 +121,6 @@ public class DatatablePanel extends JPanel {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
showMode.addItemListener(new ItemListener() {
|
|
||||||
@Override
|
|
||||||
public void itemStateChanged(ItemEvent e) {
|
|
||||||
model.setRowCount(0);
|
|
||||||
if (e.getStateChange() == ItemEvent.SELECTED) {
|
|
||||||
scrollFlag = false;
|
|
||||||
loadPageData();
|
|
||||||
showMode.setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setLayout(new BorderLayout(0, 5));
|
setLayout(new BorderLayout(0, 5));
|
||||||
|
|
||||||
JPanel optionsPanel = new JPanel();
|
JPanel optionsPanel = new JPanel();
|
||||||
@@ -173,11 +128,10 @@ public class DatatablePanel extends JPanel {
|
|||||||
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.X_AXIS));
|
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.X_AXIS));
|
||||||
|
|
||||||
// 新增复选框要在这修改rows
|
// 新增复选框要在这修改rows
|
||||||
JPanel menuPanel = new JPanel(new GridLayout(2, 1));
|
JPanel menuPanel = new JPanel(new GridLayout(1, 1));
|
||||||
menuPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
|
menuPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
|
||||||
JPopupMenu menu = new JPopupMenu();
|
JPopupMenu menu = new JPopupMenu();
|
||||||
menuPanel.add(searchMode);
|
menuPanel.add(searchMode);
|
||||||
menuPanel.add(showMode);
|
|
||||||
menu.add(menuPanel);
|
menu.add(menuPanel);
|
||||||
|
|
||||||
JButton settingsButton = new JButton("Settings");
|
JButton settingsButton = new JButton("Settings");
|
||||||
@@ -196,56 +150,6 @@ public class DatatablePanel extends JPanel {
|
|||||||
|
|
||||||
add(scrollPane, BorderLayout.CENTER);
|
add(scrollPane, BorderLayout.CENTER);
|
||||||
add(optionsPanel, BorderLayout.SOUTH);
|
add(optionsPanel, BorderLayout.SOUTH);
|
||||||
|
|
||||||
loadPageData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void performSearch() {
|
|
||||||
// 检查文本字段的字体颜色是否为黑色,表示可以进行搜索
|
|
||||||
if (searchField.getForeground().equals(Color.BLACK)) {
|
|
||||||
// 获取搜索文本
|
|
||||||
String searchText = searchField.getText();
|
|
||||||
|
|
||||||
// 创建行过滤器
|
|
||||||
RowFilter<DefaultTableModel, Object> rowFilter;
|
|
||||||
|
|
||||||
// 检查搜索模式是否为选中状态
|
|
||||||
if (searchMode.isSelected()) {
|
|
||||||
// 反向搜索:创建一个过滤器以排除与正则表达式匹配的行
|
|
||||||
rowFilter = new RowFilter<DefaultTableModel, Object>() {
|
|
||||||
public boolean include(Entry<? extends DefaultTableModel, ? extends Object> entry) {
|
|
||||||
// 对每一行的第二列进行判断(假设第二列的索引是1)
|
|
||||||
String value = (String) entry.getValue(1);
|
|
||||||
// 如果该列的值不包含搜索文本,则返回true,否则返回false
|
|
||||||
return searchText.isEmpty() ? true : !value.toLowerCase().contains(searchText.toLowerCase());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
// 正向搜索:创建一个过滤器以包含与正则表达式匹配的行
|
|
||||||
rowFilter = RowFilter.regexFilter("(?i)" + Pattern.quote(searchText), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置过滤器到排序器
|
|
||||||
sorter.setRowFilter(rowFilter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 加载指定页的数据
|
|
||||||
private void loadPageData() {
|
|
||||||
if (fullList.size() > SHOW_LENGTH && scrollFlag) {
|
|
||||||
int start = currentPage * pageSize;
|
|
||||||
int end = Math.min((currentPage + 1) * pageSize, fullList.size());
|
|
||||||
int lastRow = model.getRowCount();
|
|
||||||
start = Math.max(start, lastRow);
|
|
||||||
|
|
||||||
for (int i = start; i < end; i++) {
|
|
||||||
addRowToTable(model, new Object[]{fullList.get(i)});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (String item : fullList) {
|
|
||||||
addRowToTable(model, new Object[]{item});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addRowToTable(DefaultTableModel model, Object[] data) {
|
private static void addRowToTable(DefaultTableModel model, Object[] data) {
|
||||||
@@ -258,21 +162,28 @@ public class DatatablePanel extends JPanel {
|
|||||||
model.addRow(rowData); // 添加行
|
model.addRow(rowData); // 添加行
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePageSize() {
|
private void performSearch() {
|
||||||
if (fullList.size() > SHOW_LENGTH && isShowing()) {
|
if (searchField.getForeground().equals(Color.BLACK)) {
|
||||||
int oldPageSize = pageSize;
|
RowFilter<Object, Object> rowFilter = new RowFilter<Object, Object>() {
|
||||||
pageSize = getDynamicSize();
|
public boolean include(Entry<?, ?> entry) {
|
||||||
if (oldPageSize != pageSize) {
|
String searchFieldTextText = searchField.getText();
|
||||||
currentPage = 0;
|
Pattern pattern = null;
|
||||||
loadPageData();
|
try {
|
||||||
}
|
pattern = new Pattern(searchFieldTextText, REFlags.IGNORE_CASE);
|
||||||
}
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getDynamicSize() {
|
String entryValue = ((String) entry.getValue(1)).toLowerCase();
|
||||||
int visibleHeight = scrollPane.getViewport().getViewRect().height;
|
searchFieldTextText = searchFieldTextText.toLowerCase();
|
||||||
int rowHeight = table.getRowHeight();
|
if (pattern != null) {
|
||||||
return Math.max(1, visibleHeight / rowHeight + 5);
|
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find() != searchMode.isSelected();
|
||||||
|
} else {
|
||||||
|
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText) != searchMode.isSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
sorter.setRowFilter(rowFilter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTableListener(MessagePanel messagePanel) {
|
public void setTableListener(MessagePanel messagePanel) {
|
||||||
@@ -312,13 +223,16 @@ public class DatatablePanel extends JPanel {
|
|||||||
for (int row : selectRows) {
|
for (int row : selectRows) {
|
||||||
selectData.append(table.getValueAt(row, 1).toString()).append("\n");
|
selectData.append(table.getValueAt(row, 1).toString()).append("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 便于单行复制,去除最后一个换行符
|
// 便于单行复制,去除最后一个换行符
|
||||||
String revData = selectData.reverse().toString().replaceFirst("\n", "");
|
if (selectData.length() > 0){
|
||||||
StringBuilder retData = new StringBuilder(revData).reverse();
|
selectData.deleteCharAt(selectData.length() - 1);
|
||||||
return retData.toString();
|
}
|
||||||
|
|
||||||
|
return selectData.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public JTable getTable() {
|
public JTable getTable() {
|
||||||
return this.table;
|
return this.table;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,7 +44,7 @@ public class MessagePanel extends AbstractTableModel implements IMessageEditorCo
|
|||||||
private final List<LogEntry> filteredLog = new ArrayList<LogEntry>();
|
private final List<LogEntry> filteredLog = new ArrayList<LogEntry>();
|
||||||
private IHttpRequestResponse currentlyDisplayedItem;
|
private IHttpRequestResponse currentlyDisplayedItem;
|
||||||
private final IExtensionHelpers helpers;
|
private final IExtensionHelpers helpers;
|
||||||
private Table logTable;
|
private final Table logTable;
|
||||||
|
|
||||||
public MessagePanel(IBurpExtenderCallbacks callbacks, IExtensionHelpers helpers) {
|
public MessagePanel(IBurpExtenderCallbacks callbacks, IExtensionHelpers helpers) {
|
||||||
this.callbacks = callbacks;
|
this.callbacks = callbacks;
|
||||||
@@ -66,6 +66,7 @@ public class MessagePanel extends AbstractTableModel implements IMessageEditorCo
|
|||||||
return age1.compareTo(age2);
|
return age1.compareTo(age2);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Color字段根据颜色顺序进行排序
|
// Color字段根据颜色顺序进行排序
|
||||||
sorter.setComparator(5, new Comparator<String>() {
|
sorter.setComparator(5, new Comparator<String>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user