Compare commits

...

3 Commits
4.0.2 ... 4.0.5

Author SHA1 Message Date
chen
0c795af101 Version: 4.0.5 Update 2025-02-11 18:29:55 +08:00
gh0stkey
5977e82ca6 Version: 4.0.4 Update 2025-01-17 17:56:35 +08:00
gh0stkey
452f297f55 Version: 4.0.3 Update 2025-01-10 17:45:59 +08:00
3 changed files with 31 additions and 58 deletions

View File

@@ -20,7 +20,7 @@ public class HaE implements BurpExtension {
public void initialize(MontoyaApi api) { public void initialize(MontoyaApi api) {
// 设置扩展名称 // 设置扩展名称
api.extension().setName("HaE - Highlighter and Extractor"); api.extension().setName("HaE - Highlighter and Extractor");
String version = "4.0.2"; String version = "4.0.5";
// 加载扩展后输出的项目信息 // 加载扩展后输出的项目信息
Logging logging = api.logging(); Logging logging = api.logging();

View File

@@ -30,6 +30,7 @@ public class Datatable extends JPanel {
private final JTextField secondSearchField; private final JTextField secondSearchField;
private final TableRowSorter<DefaultTableModel> sorter; private final TableRowSorter<DefaultTableModel> sorter;
private final JCheckBox searchMode = new JCheckBox("Reverse search"); private final JCheckBox searchMode = new JCheckBox("Reverse search");
private final JCheckBox regexMode = new JCheckBox("Regex mode");
private final String tabName; private final String tabName;
private final JPanel footerPanel; private final JPanel footerPanel;
@@ -51,6 +52,8 @@ public class Datatable extends JPanel {
} }
private void initComponents(List<String> dataList) { private void initComponents(List<String> dataList) {
dataTable.setRowSorter(sorter);
// 设置ID排序 // 设置ID排序
sorter.setComparator(0, new Comparator<Integer>() { sorter.setComparator(0, new Comparator<Integer>() {
@Override @Override
@@ -107,7 +110,6 @@ public class Datatable extends JPanel {
JScrollPane scrollPane = new JScrollPane(dataTable); JScrollPane scrollPane = new JScrollPane(dataTable);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
dataTable.setRowSorter(sorter);
TableColumn idColumn = dataTable.getColumnModel().getColumn(0); TableColumn idColumn = dataTable.getColumnModel().getColumn(0);
idColumn.setPreferredWidth(50); idColumn.setPreferredWidth(50);
idColumn.setMaxWidth(100); idColumn.setMaxWidth(100);
@@ -118,10 +120,12 @@ public class Datatable extends JPanel {
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.X_AXIS)); optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.X_AXIS));
// Settings按钮 // Settings按钮
JPanel settingMenuPanel = new JPanel(new GridLayout(1, 1)); JPanel settingMenuPanel = new JPanel(new GridLayout(2, 1));
settingMenuPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); settingMenuPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
JPopupMenu settingMenu = new JPopupMenu(); JPopupMenu settingMenu = new JPopupMenu();
settingMenuPanel.add(searchMode); settingMenuPanel.add(searchMode);
settingMenuPanel.add(regexMode);
regexMode.setSelected(true);
searchMode.addItemListener(e -> performSearch()); searchMode.addItemListener(e -> performSearch());
settingMenu.add(settingMenuPanel); settingMenu.add(settingMenuPanel);
@@ -162,8 +166,8 @@ public class Datatable extends JPanel {
} }
private void performSearch() { private void performSearch() {
RowFilter<Object, Object> firstRowFilter = applyFirstSearchFilter(); RowFilter<Object, Object> firstRowFilter = getObjectObjectRowFilter(searchField, true);
RowFilter<Object, Object> secondRowFilter = applySecondFilter(); RowFilter<Object, Object> secondRowFilter = getObjectObjectRowFilter(secondSearchField, false);
if (searchField.getForeground().equals(Color.BLACK)) { if (searchField.getForeground().equals(Color.BLACK)) {
sorter.setRowFilter(firstRowFilter); sorter.setRowFilter(firstRowFilter);
if (secondSearchField.getForeground().equals(Color.BLACK)) { if (secondSearchField.getForeground().equals(Color.BLACK)) {
@@ -175,44 +179,29 @@ public class Datatable extends JPanel {
} }
} }
private RowFilter<Object, Object> applyFirstSearchFilter() { private RowFilter<Object, Object> getObjectObjectRowFilter(JTextField searchField, boolean firstFlag) {
return new RowFilter<Object, Object>() { return new RowFilter<Object, Object>() {
public boolean include(Entry<?, ?> entry) { public boolean include(Entry<?, ?> entry) {
String searchFieldTextText = searchField.getText(); String searchFieldTextText = searchField.getText();
searchFieldTextText = searchFieldTextText.toLowerCase();
String entryValue = ((String) entry.getValue(1)).toLowerCase();
boolean filterReturn = searchFieldTextText.isEmpty();
boolean firstFlagReturn = searchMode.isSelected() && firstFlag;
if (regexMode.isSelected()) {
Pattern pattern = null; Pattern pattern = null;
try { try {
pattern = Pattern.compile(searchFieldTextText, Pattern.CASE_INSENSITIVE); pattern = Pattern.compile(searchFieldTextText, Pattern.CASE_INSENSITIVE);
} catch (Exception ignored) { } catch (Exception ignored) {
} }
String entryValue = ((String) entry.getValue(1)).toLowerCase();
searchFieldTextText = searchFieldTextText.toLowerCase();
if (pattern != null) { if (pattern != null) {
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find() != searchMode.isSelected(); filterReturn = filterReturn || pattern.matcher(entryValue).find() != firstFlagReturn;
}
} else { } else {
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText) != searchMode.isSelected(); filterReturn = filterReturn || entryValue.contains(searchFieldTextText) != firstFlagReturn;
}
}
};
} }
private RowFilter<Object, Object> applySecondFilter() { return filterReturn;
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);
}
} }
}; };
} }
@@ -248,22 +237,6 @@ public class Datatable extends JPanel {
}); });
} }
private String getTableData(JTable table) {
StringBuilder selectData = new StringBuilder();
int rowCount = table.getRowCount();
for (int i = 0; i < rowCount; i++) {
selectData.append(table.getValueAt(i, 1).toString()).append("\r\n");
}
if (!selectData.isEmpty()) {
selectData.delete(selectData.length() - 2, selectData.length());
} else {
return "";
}
return selectData.toString();
}
public String getSelectedDataAtTable(JTable table) { public String getSelectedDataAtTable(JTable table) {
int[] selectRows = table.getSelectedRows(); int[] selectRows = table.getSelectedRows();
StringBuilder selectData = new StringBuilder(); StringBuilder selectData = new StringBuilder();

View File

@@ -24,10 +24,11 @@ public class DataManager {
persistence.extensionData().deleteChildObject(dataName); persistence.extensionData().deleteChildObject(dataName);
} }
persistence.extensionData().setChildObject(dataName, persistedObject); persistence.extensionData().setChildObject(dataName, persistedObject);
saveIndex(dataType, dataName); saveIndex(dataType, dataName);
} }
public void loadData(MessageTableModel messageTableModel) { public synchronized void loadData(MessageTableModel messageTableModel) {
// 1. 获取索引 // 1. 获取索引
PersistedList<String> dataIndex = persistence.extensionData().getStringList("data"); // 数据索引 PersistedList<String> dataIndex = persistence.extensionData().getStringList("data"); // 数据索引
PersistedList<String> messageIndex = persistence.extensionData().getStringList("message"); // 消息索引 PersistedList<String> messageIndex = persistence.extensionData().getStringList("message"); // 消息索引
@@ -42,7 +43,7 @@ public class DataManager {
if (indexList != null && !indexList.isEmpty()) { if (indexList != null && !indexList.isEmpty()) {
persistence.extensionData().deleteStringList(indexName); persistence.extensionData().deleteStringList(indexName);
} else { } else if (indexList == null) {
indexList = PersistedList.persistedStringList(); indexList = PersistedList.persistedStringList();
} }
@@ -55,14 +56,13 @@ public class DataManager {
private void loadHaEData(PersistedList<String> dataIndex) { private void loadHaEData(PersistedList<String> dataIndex) {
if (dataIndex != null && !dataIndex.isEmpty()) { if (dataIndex != null && !dataIndex.isEmpty()) {
dataIndex.parallelStream().forEach(index -> { dataIndex.forEach(index -> {
PersistedObject dataObj = persistence.extensionData().getChildObject(index); PersistedObject dataObj = persistence.extensionData().getChildObject(index);
try { try {
dataObj.stringListKeys().forEach(dataKey -> { dataObj.stringListKeys().forEach(dataKey -> {
RegularMatcher.putDataToGlobalMap(api, index, dataKey, dataObj.getStringList(dataKey).stream().toList(), false); RegularMatcher.putDataToGlobalMap(api, index, dataKey, dataObj.getStringList(dataKey).stream().toList(), false);
}); });
} catch (Exception e) { } catch (Exception ignored) {
api.logging().logToOutput("loadHaEData:" + e.getMessage());
} }
}); });
} }
@@ -70,7 +70,7 @@ public class DataManager {
private void loadMessageData(PersistedList<String> messageIndex, MessageTableModel messageTableModel) { private void loadMessageData(PersistedList<String> messageIndex, MessageTableModel messageTableModel) {
if (messageIndex != null && !messageIndex.isEmpty()) { if (messageIndex != null && !messageIndex.isEmpty()) {
messageIndex.parallelStream().forEach(index -> { messageIndex.forEach(index -> {
PersistedObject dataObj = persistence.extensionData().getChildObject(index); PersistedObject dataObj = persistence.extensionData().getChildObject(index);
if (dataObj != null) { if (dataObj != null) {
HttpRequestResponse messageInfo = dataObj.getHttpRequestResponse("messageInfo"); HttpRequestResponse messageInfo = dataObj.getHttpRequestResponse("messageInfo");