Skip to content
This repository was archived by the owner on Jun 24, 2025. It is now read-only.

Commit 7c3aa01

Browse files
committed
修复:数据看板中的数据过滤异常的问题
1 parent 20bf457 commit 7c3aa01

5 files changed

Lines changed: 93 additions & 25 deletions

File tree

extender/src/main/java/burp/vaycore/common/filter/FilterRule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public ArrayList<Item> getItems() {
125125
}
126126

127127
public void addRule(int logic, int operate, String value) {
128-
if (this.items.size() > 0) {
128+
if (!this.items.isEmpty()) {
129129
if (logic <= 0) {
130130
throw new IllegalArgumentException("logic is 0");
131131
}

extender/src/main/java/burp/vaycore/common/filter/TableFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public boolean include(Entry<? extends T, ?> entry) {
3434
T model = entry.getModel();
3535
Integer rowIndex = (Integer) entry.getIdentifier();
3636
int columnIndex = rule.getColumnIndex();
37+
// 检测是否越界
38+
if (columnIndex < 0 || columnIndex >= model.getColumnCount() ||
39+
rowIndex < 0 || rowIndex >= model.getRowCount()) {
40+
return false;
41+
}
3742
Object valueObj = model.getValueAt(rowIndex, columnIndex);
3843
String value = valueObj == null ? "" : String.valueOf(valueObj);
3944
ArrayList<FilterRule.Item> items = rule.getItems();

extender/src/main/java/burp/vaycore/common/utils/ClassUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ private ClassUtils() {
2121

2222
public static Object getValueByFieldId(Object obj, int fieldId) {
2323
Field[] fields = obj.getClass().getDeclaredFields();
24-
if (fieldId >= fields.length) {
24+
if (fieldId < 0 || fieldId >= fields.length) {
2525
return "";
2626
}
2727
Field field = fields[fieldId];
@@ -35,7 +35,7 @@ public static Object getValueByFieldId(Object obj, int fieldId) {
3535

3636
public static String getNameByFieldId(Class<?> clz, int fieldId) {
3737
Field[] fields = clz.getDeclaredFields();
38-
if (fieldId >= fields.length) {
38+
if (fieldId < 0 || fieldId >= fields.length) {
3939
return null;
4040
}
4141
Field field = fields[fieldId];
@@ -44,7 +44,7 @@ public static String getNameByFieldId(Class<?> clz, int fieldId) {
4444

4545
public static Class<?> getTypeByFieldId(Class<?> clz, int fieldId) {
4646
Field[] fields = clz.getDeclaredFields();
47-
if (fieldId >= fields.length) {
47+
if (fieldId < 0 || fieldId >= fields.length) {
4848
return String.class;
4949
}
5050
Field field = fields[fieldId];

extender/src/main/java/burp/vaycore/onescan/manager/FpManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private static void loadConfig() {
7979
* 检测是否初始化
8080
*/
8181
private static void checkInit() {
82-
if (StringUtils.isEmpty(sFilePath) || !FileUtils.isFile(sFilePath) || sConfig == null) {
82+
if (StringUtils.isEmpty(sFilePath) || sConfig == null) {
8383
throw new IllegalArgumentException("FpManager no init.");
8484
}
8585
}
@@ -314,8 +314,8 @@ public static void removeColumnsItem(int index) {
314314
/**
315315
* 更新指纹字段
316316
*
317-
* @param index 下标
318-
* @param column 指纹字段实例
317+
* @param index 下标
318+
* @param column 指纹字段实例
319319
*/
320320
public static void setColumnsItem(int index, FpColumn column) {
321321
checkInit();

extender/src/main/java/burp/vaycore/onescan/ui/widget/TaskTable.java

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public class TaskTable extends JTable implements ActionListener {
5353
70, // Color
5454
};
5555

56+
private static Vector<String> sColumnNames;
57+
5658
private final TaskTableModel mTaskTableModel;
5759
private final TableRowSorter<TaskTableModel> mTableRowSorter;
5860
private ArrayList<TableFilter<AbstractTableModel>> mTableFilters = new ArrayList<>();
@@ -83,7 +85,10 @@ private Color defaultItemColor(int index, boolean isSelected) {
8385
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int rowIndex, int columnIndex) {
8486
Component c = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, rowIndex, columnIndex);
8587
TaskData data = getTaskData(rowIndex);
86-
String highlight = data.getHighlight();
88+
String highlight = "";
89+
if (data != null) {
90+
highlight = data.getHighlight();
91+
}
8792
Color bgColor = FpManager.findColorByName(highlight);
8893
Color fontColor = UIManager.getColor("Table.foreground");
8994
// 检测是否需要显示高亮颜色
@@ -112,6 +117,7 @@ public TaskTable() {
112117
setModel(mTaskTableModel);
113118
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
114119
mTableRowSorter = new TableRowSorter<>(mTaskTableModel);
120+
mTableRowSorter.setMaxSortKeys(1);
115121
setRowSorter(mTableRowSorter);
116122
// 不可拖动表头
117123
getTableHeader().setReorderingAllowed(false);
@@ -276,7 +282,23 @@ public void updateRowFilter() {
276282
if (mTempFilters != null && !mTempFilters.isEmpty()) {
277283
groupFilter.addAll(mTempFilters);
278284
}
279-
mTableRowSorter.setRowFilter(RowFilter.andFilter(groupFilter));
285+
// 检测过滤字段是否有效
286+
ArrayList<TableFilter<AbstractTableModel>> result = new ArrayList<>();
287+
for (TableFilter<AbstractTableModel> filter : groupFilter) {
288+
FilterRule rule = filter.getRule();
289+
// 规则为空检测
290+
if (rule == null || rule.getItems().isEmpty()) {
291+
continue;
292+
}
293+
int filterColumnIndex = rule.getColumnIndex();
294+
// 越界检测
295+
if (filterColumnIndex < 0 || filterColumnIndex >= getColumnCount()) {
296+
continue;
297+
}
298+
// 保留有效的过滤规则
299+
result.add(filter);
300+
}
301+
mTableRowSorter.setRowFilter(RowFilter.andFilter(result));
280302
}
281303

282304
/**
@@ -304,8 +326,11 @@ public void addTaskData(TaskData data) {
304326
* @return 任务数据
305327
*/
306328
private TaskData getTaskData(int rowIndex) {
307-
int index = convertRowIndexToModel(rowIndex);
308-
return mTaskTableModel.mData.get(index);
329+
if (rowIndex >= 0 && rowIndex < getRowCount()) {
330+
int index = convertRowIndexToModel(rowIndex);
331+
return mTaskTableModel.mData.get(index);
332+
}
333+
return null;
309334
}
310335

311336
@Override
@@ -369,6 +394,9 @@ private String fetchBodyDataByAction(String action, int[] selectedRows) {
369394
StringBuilder result = new StringBuilder();
370395
for (int index : selectedRows) {
371396
TaskData data = getTaskData(index);
397+
if (data == null) {
398+
continue;
399+
}
372400
byte[] bodyBytes = mOnTaskTableEventListener.getBodyByTaskData(data);
373401
String value;
374402
switch (action) {
@@ -419,7 +447,9 @@ private void doSendToRepeater(int[] selectedRows) {
419447
ArrayList<TaskData> newData = new ArrayList<>(selectedRows.length);
420448
for (int index : selectedRows) {
421449
TaskData data = getTaskData(index);
422-
newData.add(data);
450+
if (data != null) {
451+
newData.add(data);
452+
}
423453
}
424454
if (mOnTaskTableEventListener != null) {
425455
mOnTaskTableEventListener.onSendToRepeater(newData);
@@ -448,7 +478,9 @@ private void doRemoveItems(int[] selectedRows) {
448478
ArrayList<TaskData> removeList = new ArrayList<>();
449479
for (int index : selectedRows) {
450480
TaskData data = getTaskData(index);
451-
removeList.add(data);
481+
if (data != null) {
482+
removeList.add(data);
483+
}
452484
}
453485
mTaskTableModel.removeItems(removeList);
454486
}
@@ -463,6 +495,9 @@ private ArrayList<String> getSelectedHosts(int[] selectedRows) {
463495
ArrayList<String> hosts = new ArrayList<>();
464496
for (int index : selectedRows) {
465497
TaskData data = getTaskData(index);
498+
if (data == null) {
499+
continue;
500+
}
466501
try {
467502
String host = new URL(data.getHost()).getHost();
468503
if (!hosts.contains(host)) {
@@ -492,8 +527,9 @@ private void onTempFilterEvent(String action, int[] selectedRows) {
492527
}
493528
FilterRule rule = getTempFilterRuleByColumn(columnIndex);
494529
for (int index : selectedRows) {
495-
TaskData data = getTaskData(index);
496-
Object objValue = ClassUtils.getValueByFieldId(data, columnIndex);
530+
int rowIndex = convertRowIndexToModel(index);
531+
// 从 TableModel 里拿数据
532+
Object objValue = mTaskTableModel.getValueAt(rowIndex, columnIndex);
497533
String value = "";
498534
if (objValue != null) {
499535
value = String.valueOf(objValue);
@@ -633,6 +669,8 @@ public void refreshColumns() {
633669
if (mTaskTableModel == null) {
634670
return;
635671
}
672+
initColumnNames();
673+
updateRowFilter();
636674
mTaskTableModel.fireTableStructureChanged();
637675
initColorLevelSorter();
638676
initColumnWidth();
@@ -671,11 +709,22 @@ private static int getColorLevel(String colorName) {
671709
* @return 失败返回空列表
672710
*/
673711
public static Vector<String> getColumnNames() {
712+
if (sColumnNames != null) {
713+
return sColumnNames;
714+
}
715+
initColumnNames();
716+
return sColumnNames;
717+
}
718+
719+
/**
720+
* 初始化所有字段名
721+
*/
722+
private static void initColumnNames() {
674723
Vector<String> result = new Vector<>(Arrays.asList(TaskTableModel.PRE_COLUMN_NAMES));
675724
// 指纹字段名列表
676725
List<String> fpColumnNames = FpManager.getColumnNames();
677726
result.addAll(fpColumnNames);
678-
return result;
727+
sColumnNames = result;
679728
}
680729

681730
/**
@@ -789,7 +838,9 @@ public void clearAll() {
789838

790839
@Override
791840
public int getRowCount() {
792-
return mData.size();
841+
synchronized (this.mData) {
842+
return mData.size();
843+
}
793844
}
794845

795846
@Override
@@ -802,26 +853,38 @@ public String getColumnName(int column) {
802853
return getColumnNames().get(column);
803854
}
804855

856+
private TaskData getItemData(int rowIndex) {
857+
if (rowIndex < 0 || rowIndex >= getRowCount()) {
858+
return null;
859+
}
860+
synchronized (this.mData) {
861+
return mData.get(rowIndex);
862+
}
863+
}
864+
805865
@Override
806866
public Object getValueAt(int rowIndex, int columnIndex) {
807-
TaskData data = mData.get(rowIndex);
808-
if (columnIndex < PRE_COLUMN_NAMES.length) {
867+
TaskData data = getItemData(rowIndex);
868+
if (data == null) {
869+
return "";
870+
}
871+
// 预设列的数据
872+
if (columnIndex >= 0 && columnIndex < PRE_COLUMN_NAMES.length) {
809873
return ClassUtils.getValueByFieldId(data, columnIndex);
810874
}
811-
// 减去预设的列
875+
// 减去预设列的数据,开始填充指纹参数里的数据
812876
columnIndex = columnIndex - PRE_COLUMN_NAMES.length;
813877
Map<String, String> params = data.getParams();
814878
String key = FpManager.getColumnId(columnIndex);
815-
String value = "";
816-
if (params.containsKey(key)) {
817-
value = params.get(key);
879+
if (key != null && params.containsKey(key)) {
880+
return params.get(key);
818881
}
819-
return value;
882+
return "";
820883
}
821884

822885
@Override
823886
public Class<?> getColumnClass(int columnIndex) {
824-
if (columnIndex < PRE_COLUMN_NAMES.length) {
887+
if (columnIndex >= 0 && columnIndex < PRE_COLUMN_NAMES.length) {
825888
return ClassUtils.getTypeByFieldId(TaskData.class, columnIndex);
826889
}
827890
return String.class;

0 commit comments

Comments
 (0)