diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java index 596676c..d5cab99 100644 --- a/src/main/java/burp/BurpExtender.java +++ b/src/main/java/burp/BurpExtender.java @@ -3,12 +3,10 @@ package burp; import burp.config.ConfigLoader; import burp.core.processor.ColorProcessor; import burp.core.processor.MessageProcessor; +import burp.core.utils.StringHelper; import burp.ui.MainUI; import burp.ui.board.DatatablePanel; import burp.ui.board.MessagePanel; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.net.URL; import java.util.*; import javax.swing.*; import java.awt.*; @@ -38,7 +36,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito new ConfigLoader(); - String version = "2.5.8"; + String version = "2.5.9"; callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); // 定义输出 @@ -74,43 +72,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito @Override public Component getUiComponent() { - JTabbedPane HaETabbedPane = new JTabbedPane(); - HaETabbedPane.addTab("", getImageIcon(false), main); - HaETabbedPane.addTab(" Highlighter and Extractor - Empower ethical hacker for efficient operations ", null); - HaETabbedPane.setEnabledAt(1, false); - HaETabbedPane.addPropertyChangeListener("background", new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent e) { - boolean isDarkBg = isDarkBg(); - HaETabbedPane.setIconAt(0, getImageIcon(isDarkBg)); - } - - private boolean isDarkBg() { - Color bg = HaETabbedPane.getBackground(); - int r = bg.getRed(); - int g = bg.getGreen(); - int b = bg.getBlue(); - int avg = (r + g + b) / 3; - - return avg < 128; - } - }); - return HaETabbedPane; - } - - private ImageIcon getImageIcon(boolean isDark) { - ClassLoader classLoader = getClass().getClassLoader(); - URL imageURL; - if (isDark) { - imageURL = classLoader.getResource("logo.png"); - } else { - imageURL = classLoader.getResource("logo_black.png"); - } - ImageIcon originalIcon = new ImageIcon(imageURL); - Image originalImage = originalIcon.getImage(); - Image scaledImage = originalImage.getScaledInstance(30, 20, Image.SCALE_FAST); - ImageIcon scaledIcon = new ImageIcon(scaledImage); - return scaledIcon; + return main; } /** @@ -145,7 +107,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito String addComment = String.join(", ", result.get(1).get("comment")); String allComment = !Objects.equals(originalComment, "") ? String.format("%s, %s", originalComment, addComment) : addComment; - String resComment = mergeComment(allComment); + String resComment = StringHelper.mergeComment(allComment); messageInfo.setComment(resComment); messagePanel.add(messageInfo, resComment, resColor); @@ -158,39 +120,6 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito } } - private String mergeComment(String comment) { - if (!comment.contains(",")) { - return comment; - } - - Map itemCounts = new HashMap<>(); - String[] items = comment.split(", "); - - for (String item : items) { - if (item.contains("(") && item.contains(")")) { - int openParenIndex = item.lastIndexOf("("); - int closeParenIndex = item.lastIndexOf(")"); - String itemName = item.substring(0, openParenIndex).trim(); - int count = Integer.parseInt(item.substring(openParenIndex + 1, closeParenIndex).trim()); - itemCounts.put(itemName, itemCounts.getOrDefault(itemName, 0) + count); - } else { - itemCounts.put(item, 0); - } - } - - StringBuilder mergedItems = new StringBuilder(); - - for (Map.Entry entry : itemCounts.entrySet()) { - String itemName = entry.getKey(); - int count = entry.getValue(); - if (count != 0) { - mergedItems.append(itemName).append(" (").append(count).append("), "); - } - } - - return mergedItems.substring(0, mergedItems.length() - 2); - } - class MarkInfoTab implements IMessageEditorTab { private final JTabbedPane jTabbedPane = new JTabbedPane(); private DatatablePanel dataPanel; @@ -223,27 +152,27 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito @Override public boolean isEnabled(byte[] content, boolean isRequest) { List> result = null; - - try { - if (isRequest) { - result = messageProcessor.processRequestMessage(helpers, content, "", false); - } else { - result = messageProcessor.processResponseMessage(helpers, content, "", false); + if (content.length != 0 && !helpers.bytesToString(content).equals("Loading...")) { + try { + if (isRequest) { + result = messageProcessor.processRequestMessage(helpers, content, "", false); + } else { + result = messageProcessor.processResponseMessage(helpers, content, "", false); + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); - } - if (result != null && !result.isEmpty()) { - Map dataMap = result.get(0); - if (isRequest) { - extractRequestMap = dataMap; - } else { - extractResponseMap = dataMap; + if (result != null && !result.isEmpty()) { + Map dataMap = result.get(0); + if (isRequest) { + extractRequestMap = dataMap; + } else { + extractResponseMap = dataMap; + } + return true; } - return true; } - return false; } diff --git a/src/main/java/burp/config/ConfigEntry.java b/src/main/java/burp/config/ConfigEntry.java index 29e1f4a..c63cb85 100644 --- a/src/main/java/burp/config/ConfigEntry.java +++ b/src/main/java/burp/config/ConfigEntry.java @@ -3,6 +3,7 @@ package burp.config; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class ConfigEntry { public static String excludeSuffix = "3g2|3gp|7z|aac|abw|aif|aifc|aiff|apk|arc|au|avi|azw|bat|bin|bmp|bz|bz2|cmd|cmx|cod|com|csh|css|csv|dll|doc|docx|ear|eot|epub|exe|flac|flv|gif|gz|ico|ics|ief|jar|jfif|jpe|jpeg|jpg|less|m3u|mid|midi|mjs|mkv|mov|mp2|mp3|mp4|mpa|mpe|mpeg|mpg|mpkg|mpp|mpv2|odp|ods|odt|oga|ogg|ogv|ogx|otf|pbm|pdf|pgm|png|pnm|ppm|ppt|pptx|ra|ram|rar|ras|rgb|rmi|rtf|scss|sh|snd|svg|swf|tar|tif|tiff|ttf|vsd|war|wav|weba|webm|webp|wmv|woff|woff2|xbm|xls|xlsx|xpm|xul|xwd|zip"; @@ -38,5 +39,5 @@ public class ConfigEntry { public static Map globalRules = null; - public static Map>> globalDataMap = new HashMap<>(); + public static ConcurrentHashMap>> globalDataMap = new ConcurrentHashMap<>(); } \ No newline at end of file diff --git a/src/main/java/burp/core/processor/DataProcessingUnit.java b/src/main/java/burp/core/processor/DataProcessingUnit.java index 38e805c..618fed1 100644 --- a/src/main/java/burp/core/processor/DataProcessingUnit.java +++ b/src/main/java/burp/core/processor/DataProcessingUnit.java @@ -1,5 +1,6 @@ package burp.core.processor; +import burp.BurpExtender; import burp.core.GlobalCachePool; import burp.core.utils.HashCalculator; import burp.core.utils.MatchTool; @@ -13,6 +14,7 @@ import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import jregex.Matcher; import jregex.Pattern; @@ -93,31 +95,37 @@ public class DataProcessingUnit { break; } - if ("nfa".equals(engine)) { - Pattern pattern; - // 判断规则是否大小写敏感 - if (sensitive) { - pattern = new Pattern(regex); - } else { - pattern = new Pattern(regex, Pattern.IGNORE_CASE); - } + try { + if ("nfa".equals(engine)) { + Pattern pattern; + // 判断规则是否大小写敏感 + if (sensitive) { + pattern = new Pattern(regex); + } else { + pattern = new Pattern(regex, Pattern.IGNORE_CASE); + } - Matcher matcher = pattern.matcher(matchContent); - while (matcher.find()) { - // 添加匹配数据至list - // 强制用户使用()包裹正则 - result.add(matcher.group(1)); - } - } else { - RegExp regexp = new RegExp(regex); - Automaton auto = regexp.toAutomaton(); - RunAutomaton runAuto = new RunAutomaton(auto, true); - AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent); - while (autoMatcher.find()) { - // 添加匹配数据至list - // 强制用户使用()包裹正则 - result.add(autoMatcher.group()); + Matcher matcher = pattern.matcher(matchContent); + while (matcher.find()) { + // 添加匹配数据至list + // 强制用户使用()包裹正则 + result.add(matcher.group(1)); + } + } else { + RegExp regexp = new RegExp(regex); + Automaton auto = regexp.toAutomaton(); + RunAutomaton runAuto = new RunAutomaton(auto, true); + AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent); + while (autoMatcher.find()) { + // 添加匹配数据至list + // 强制用户使用()包裹正则 + result.add(autoMatcher.group()); + } } + } catch (Exception e) { + BurpExtender.stdout.println(String.format("[x] Error Info:\nName: %s\nRegex: %s", name, regex)); + e.printStackTrace(); + continue; } // 去除重复内容 @@ -135,7 +143,7 @@ public class DataProcessingUnit { if (!Objects.equals(host, "") && host != null) { List dataList = Arrays.asList(dataStr.split("\n")); if (ConfigEntry.globalDataMap.containsKey(host)) { - Map> gRuleMap = new HashMap<>(ConfigEntry.globalDataMap.get(host)); + ConcurrentHashMap> gRuleMap = new ConcurrentHashMap<>(ConfigEntry.globalDataMap.get(host)); if (gRuleMap.containsKey(name)) { // gDataList为不可变列表,因此需要重新创建一个列表以便于使用addAll方法 List gDataList = gRuleMap.get(name); diff --git a/src/main/java/burp/core/processor/MessageProcessor.java b/src/main/java/burp/core/processor/MessageProcessor.java index d5c057d..84c50f8 100644 --- a/src/main/java/burp/core/processor/MessageProcessor.java +++ b/src/main/java/burp/core/processor/MessageProcessor.java @@ -23,9 +23,29 @@ public class MessageProcessor { List> reqObj = processRequestMessage(helpers, requestByte, host, actionFlag); List> resObj = processResponseMessage(helpers, responseByte, host, actionFlag); + List> mergedList = new ArrayList<>(); - List> mergedList = new ArrayList<>(reqObj); - mergedList.addAll(resObj); + if (reqObj != null && !reqObj.isEmpty()) { + if (resObj != null && !resObj.isEmpty()) { + List colorList = new ArrayList<>(); + + colorList.add(reqObj.get(0).get("color")); + colorList.add(resObj.get(0).get("color")); + Map colorMap = new HashMap<>(); + colorMap.put("color", colorProcessor.retrieveFinalColor(colorProcessor.retrieveColorIndices(colorList))); + + Map commentMap = new HashMap<>(); + String commentList = String.format("%s, %s", reqObj.get(1).get("comment"), resObj.get(1).get("comment")); + commentMap.put("comment", commentList); + + mergedList.add(0, colorMap); + mergedList.add(1, commentMap); + } else { + mergedList = new ArrayList<>(reqObj); + } + } else if (resObj != null && !resObj.isEmpty()){ + mergedList = new ArrayList<>(resObj); + } return mergedList; } diff --git a/src/main/java/burp/core/utils/StringHelper.java b/src/main/java/burp/core/utils/StringHelper.java index 0e640be..8a2bb25 100644 --- a/src/main/java/burp/core/utils/StringHelper.java +++ b/src/main/java/burp/core/utils/StringHelper.java @@ -1,5 +1,8 @@ package burp.core.utils; +import java.util.HashMap; +import java.util.Map; + public class StringHelper { public static String replaceFirstOccurrence(String original, String find, String replace) { int index = original.indexOf(find); @@ -27,4 +30,37 @@ public class StringHelper { // 如果patternIndex为-1,表示pattern字符串已经完全匹配 return patternIndex == -1; } + + public static String mergeComment(String comment) { + if (!comment.contains(",")) { + return comment; + } + + Map itemCounts = new HashMap<>(); + String[] items = comment.split(", "); + + for (String item : items) { + if (item.contains("(") && item.contains(")")) { + int openParenIndex = item.lastIndexOf("("); + int closeParenIndex = item.lastIndexOf(")"); + String itemName = item.substring(0, openParenIndex).trim(); + int count = Integer.parseInt(item.substring(openParenIndex + 1, closeParenIndex).trim()); + itemCounts.put(itemName, itemCounts.getOrDefault(itemName, 0) + count); + } else { + itemCounts.put(item, 0); + } + } + + StringBuilder mergedItems = new StringBuilder(); + + for (Map.Entry entry : itemCounts.entrySet()) { + String itemName = entry.getKey(); + int count = entry.getValue(); + if (count != 0) { + mergedItems.append(itemName).append(" (").append(count).append("), "); + } + } + + return mergedItems.substring(0, mergedItems.length() - 2); + } } diff --git a/src/main/java/burp/ui/MainUI.java b/src/main/java/burp/ui/MainUI.java index fae6f08..b1d293b 100644 --- a/src/main/java/burp/ui/MainUI.java +++ b/src/main/java/burp/ui/MainUI.java @@ -6,6 +6,9 @@ import burp.rule.RuleProcessor; import burp.ui.board.Databoard; import burp.ui.board.MessagePanel; import burp.ui.rule.RulePane; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.net.URL; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -134,7 +137,31 @@ public class MainUI extends JPanel { mainTabbedPane.addTab("Config", rulePanel); mainTabbedPane.addTab("Databoard", this.databoardPanel); } - add(mainTabbedPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, + + // 新增Logo + JTabbedPane HaETabbedPane = new JTabbedPane(); + HaETabbedPane.addTab("", getImageIcon(false), mainTabbedPane); + HaETabbedPane.addTab(" Highlighter and Extractor - Empower ethical hacker for efficient operations ", null); + HaETabbedPane.setEnabledAt(1, false); + HaETabbedPane.addPropertyChangeListener("background", new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent e) { + boolean isDarkBg = isDarkBg(); + HaETabbedPane.setIconAt(0, getImageIcon(isDarkBg)); + } + + private boolean isDarkBg() { + Color bg = HaETabbedPane.getBackground(); + int r = bg.getRed(); + int g = bg.getGreen(); + int b = bg.getBlue(); + int avg = (r + g + b) / 3; + + return avg < 128; + } + }); + + add(HaETabbedPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); @@ -153,6 +180,21 @@ public class MainUI extends JPanel { tabMenu.add(deleteMenuItem); } + private ImageIcon getImageIcon(boolean isDark) { + ClassLoader classLoader = getClass().getClassLoader(); + URL imageURL; + if (isDark) { + imageURL = classLoader.getResource("logo.png"); + } else { + imageURL = classLoader.getResource("logo_black.png"); + } + ImageIcon originalIcon = new ImageIcon(imageURL); + Image originalImage = originalIcon.getImage(); + Image scaledImage = originalImage.getScaledInstance(30, 20, Image.SCALE_FAST); + ImageIcon scaledIcon = new ImageIcon(scaledImage); + return scaledIcon; + } + private JTabbedPane ruleTabbedPane; private JTextField rulesPathTextField; private JTextField excludeSuffixTextField; diff --git a/src/main/java/burp/ui/board/Databoard.java b/src/main/java/burp/ui/board/Databoard.java index 1ece01c..d73c26b 100644 --- a/src/main/java/burp/ui/board/Databoard.java +++ b/src/main/java/burp/ui/board/Databoard.java @@ -5,8 +5,8 @@ import burp.core.utils.StringHelper; import burp.ui.board.MessagePanel.Table; import java.util.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import java.util.concurrent.ConcurrentHashMap; +import javax.swing.event.*; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; @@ -15,8 +15,6 @@ import java.awt.*; import java.awt.event.*; import java.util.List; import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; /** * @author LinChen && EvilChen @@ -48,7 +46,6 @@ public class Databoard extends JPanel { } }; - public Databoard(MessagePanel messagePanel) { this.messagePanel = messagePanel; initComponents(); @@ -94,42 +91,25 @@ public class Databoard extends JPanel { //---- hostLabel ---- hostLabel.setText("Host:"); - add(hostLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, - GridBagConstraints.CENTER, GridBagConstraints.BOTH, + add(hostLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 5, 5), 0, 0)); - add(hostTextField, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, - GridBagConstraints.CENTER, GridBagConstraints.BOTH, + add(hostTextField, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 5, 5), 0, 0)); clearButton.setText("Clear"); clearButton.addActionListener(this::clearActionPerformed); - add(clearButton, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, - GridBagConstraints.CENTER, GridBagConstraints.BOTH, + add(clearButton, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(8, 0, 5, 5), 0, 0)); + + hostComboBox.setMaximumRowCount(5); + add(hostComboBox, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 5, 5), 0, 0)); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setVisible(false); - - add(splitPane, new GridBagConstraints(1, 1, 3, 2, 0.0, 0.0, + add(splitPane, new GridBagConstraints(1, 1, 3, 3, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 5, 5), 0, 0)); - hostTextField.setLayout(new BorderLayout()); - hostTextField.add(hostComboBox, BorderLayout.SOUTH); - hostComboBox.setMaximumRowCount(5); - hostComboBox.setPreferredSize(new Dimension(super.getPreferredSize().width, 0)); - - // 由于主题切换造成的UI组件重绘,而自定义组件没有正确地与之同步,因此需要事件监听来进行同步 - UIManager.addPropertyChangeListener(evt -> { - if ("lookAndFeel".equals(evt.getPropertyName())) { - SwingUtilities.invokeLater(() -> { - hostTextField.remove(hostComboBox); - hostTextField.add(hostComboBox, BorderLayout.SOUTH); - hostTextField.revalidate(); - hostTextField.repaint(); - }); - } - }); - setAutoMatch(); } @@ -156,22 +136,19 @@ public class Databoard extends JPanel { hostTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { - update(e); + filterComboBoxList(); } @Override public void removeUpdate(DocumentEvent e) { - update(e); + filterComboBoxList(); } @Override public void changedUpdate(DocumentEvent e) { - update(e); - } - - public void update(DocumentEvent e) { filterComboBoxList(); } + }); } @@ -188,7 +165,6 @@ public class Databoard extends JPanel { populateTabbedPaneByHost(selectedHost); } } - private void handleKeyEvents(KeyEvent e) { isMatchHost = true; int keyCode = e.getKeyCode(); @@ -197,14 +173,14 @@ public class Databoard extends JPanel { e.setKeyCode(KeyEvent.VK_ENTER); } - if (Arrays.asList(KeyEvent.VK_ENTER, KeyEvent.VK_UP, KeyEvent.VK_DOWN).contains(keyCode)) { - e.setSource(hostComboBox); + if (Arrays.asList(KeyEvent.VK_DOWN, KeyEvent.VK_UP).contains(keyCode)) { hostComboBox.dispatchEvent(e); - if (keyCode == KeyEvent.VK_ENTER) { - updateTextFieldFromComboBox(); - hostComboBox.setPopupVisible(false); - e.consume(); - } + } + + if (keyCode == KeyEvent.VK_ENTER) { + isMatchHost = false; + handleComboBoxAction(null); + hostComboBox.setPopupVisible(false); } if (keyCode == KeyEvent.VK_ESCAPE) { @@ -214,15 +190,6 @@ public class Databoard extends JPanel { isMatchHost = false; } - private void updateTextFieldFromComboBox() { - Object selectedItem = hostComboBox.getSelectedItem(); - if (selectedItem != null) { - String selectedHost = selectedItem.toString(); - hostTextField.setText(selectedHost); - populateTabbedPaneByHost(selectedHost); - } - } - private void filterComboBoxList() { isMatchHost = true; comboBoxModel.removeAllElements(); @@ -249,24 +216,28 @@ public class Databoard extends JPanel { private void applyHostFilter(String filterText) { TableRowSorter sorter = (TableRowSorter) table.getRowSorter(); - if (filterText.contains("*.")) { - filterText = StringHelper.replaceFirstOccurrence(filterText, "*.", ""); - } else if (filterText.contains("*")) { - filterText = ""; + String cleanedText = StringHelper.replaceFirstOccurrence(filterText, "*.", ""); + + if (cleanedText.contains("*")) { + cleanedText = ""; } - RowFilter filter = RowFilter.regexFilter(filterText, 1); + RowFilter filter = RowFilter.regexFilter(cleanedText, 1); sorter.setRowFilter(filter); - filterText = filterText.isEmpty() ? "*" : filterText; messagePanel.applyHostFilter(filterText); } private void populateTabbedPaneByHost(String selectedHost) { if (!Objects.equals(selectedHost, "")) { - Map>> dataMap = ConfigEntry.globalDataMap; + ConcurrentHashMap>> dataMap = ConfigEntry.globalDataMap; Map> selectedDataMap; + dataTabbedPane.removeAll(); + dataTabbedPane.setPreferredSize(new Dimension(500,0)); + dataTabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + splitPane.setLeftComponent(dataTabbedPane); + if (selectedHost.contains("*")) { // 通配符数据 selectedDataMap = new HashMap<>(); @@ -291,14 +262,8 @@ public class Databoard extends JPanel { selectedDataMap = dataMap.get(selectedHost); } - dataTabbedPane.removeAll(); - - dataTabbedPane.setPreferredSize(new Dimension(500,0)); - dataTabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - splitPane.setLeftComponent(dataTabbedPane); - if (selectedHost.equals("**")) { - for (Map.Entry>> entry : dataMap.entrySet()) { + for (ConcurrentHashMap.Entry>> entry : dataMap.entrySet()) { JTabbedPane newTabbedPane = new JTabbedPane(); newTabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); @@ -384,4 +349,4 @@ public class Databoard extends JPanel { dataTabbedPane.addChangeListener(changeListener); } } -} +} \ No newline at end of file diff --git a/src/main/java/burp/ui/board/MessagePanel.java b/src/main/java/burp/ui/board/MessagePanel.java index 728dc22..714817b 100644 --- a/src/main/java/burp/ui/board/MessagePanel.java +++ b/src/main/java/burp/ui/board/MessagePanel.java @@ -182,9 +182,13 @@ public class MessagePanel extends AbstractTableModel implements IMessageEditorCo public void applyHostFilter(String filterText) { filteredLog.clear(); fireTableDataChanged(); + String cleanedText = StringHelper.replaceFirstOccurrence(filterText, "*.", ""); + for (LogEntry entry : log) { String host = entry.getUrl().getHost(); - if (StringHelper.matchFromEnd(host, filterText) || filterText.contains("*")) { + if (filterText.contains("*.") && StringHelper.matchFromEnd(host, cleanedText)) { + filteredLog.add(entry); + } else if (host.equals(filterText) || filterText.contains("*")) { filteredLog.add(entry); } }