From 8368b5a3a2bef5de74ed27623265059ac03d48d7 Mon Sep 17 00:00:00 2001 From: kingthorin Date: Sat, 6 Sep 2025 08:34:09 -0400 Subject: [PATCH] tech detection: Add link with sites tree button Signed-off-by: kingthorin --- addOns/wappalyzer/CHANGELOG.md | 3 ++ .../wappalyzer/ExtensionWappalyzer.java | 20 ++----- .../zap/extension/wappalyzer/TechPanel.java | 50 +++++++++++++++++- .../resources/help/contents/wappalyzer.html | 7 ++- .../wappalyzer/resources/Messages.properties | 3 ++ .../wappalyzer/resources/earth-colour.png | Bin 0 -> 748 bytes .../wappalyzer/resources/earth-grey.png | Bin 0 -> 792 bytes 7 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/earth-colour.png create mode 100644 addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/earth-grey.png diff --git a/addOns/wappalyzer/CHANGELOG.md b/addOns/wappalyzer/CHANGELOG.md index 361646fb04d..8c073e6488d 100644 --- a/addOns/wappalyzer/CHANGELOG.md +++ b/addOns/wappalyzer/CHANGELOG.md @@ -8,6 +8,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Icon sizing in the Technology table when a transparent placeholder needs to be used. +### Changed +- The Tech Detection panel toolbar now includes a toggle button to link it's displayed content to the Sites Tree selection. + ## [21.48.0] - 2025-09-02 ### Changed - Updated with enthec upstream icon and pattern changes. diff --git a/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/ExtensionWappalyzer.java b/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/ExtensionWappalyzer.java index 1e6115a345f..30b54cfc272 100644 --- a/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/ExtensionWappalyzer.java +++ b/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/ExtensionWappalyzer.java @@ -56,14 +56,9 @@ import org.zaproxy.zap.extension.search.ExtensionSearch; import org.zaproxy.zap.utils.ThreadUtils; import org.zaproxy.zap.view.ScanPanel; -import org.zaproxy.zap.view.SiteMapListener; -import org.zaproxy.zap.view.SiteMapTreeCellRenderer; public class ExtensionWappalyzer extends ExtensionAdaptor - implements SessionChangedListener, - SiteMapListener, - ApplicationHolder, - ExampleAlertProvider { + implements SessionChangedListener, ApplicationHolder, ExampleAlertProvider { public static final String NAME = "ExtensionWappalyzer"; @@ -175,7 +170,6 @@ public void hook(ExtensionHook extensionHook) { super.hook(extensionHook); extensionHook.addSessionListener(this); - extensionHook.addSiteMapListener(this); if (hasView()) { @SuppressWarnings("unused") @@ -183,6 +177,8 @@ public void hook(ExtensionHook extensionHook) { extensionHook.getHookView().addStatusPanel(getTechPanel()); extensionHook.getHookMenu().addPopupMenuItem(this.getPopupMenuEvidence()); extensionHook.getHookView().addOptionPanel(new TechOptionsPanel()); + + extensionHook.addSiteMapListener(getTechPanel()); } extensionHook.addApiImplementor(new TechApi(this)); @@ -365,16 +361,6 @@ public void search(Pattern p, ExtensionSearch.Type type) { } } - @Override - public void nodeSelected(SiteNode node) { - // Event from SiteMapListenner - this.getTechPanel().siteSelected(normalizeSite(node.getHistoryReference().getURI())); - } - - @Override - public void onReturnNodeRendererComponent( - SiteMapTreeCellRenderer arg0, boolean arg1, SiteNode arg2) {} - @Override public void sessionAboutToChange(Session arg0) { // Ignore diff --git a/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/TechPanel.java b/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/TechPanel.java index 1e1ed896a42..ed66fac2c94 100644 --- a/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/TechPanel.java +++ b/addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/TechPanel.java @@ -39,6 +39,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; @@ -50,14 +51,17 @@ import org.parosproxy.paros.Constant; import org.parosproxy.paros.control.Control; import org.parosproxy.paros.extension.AbstractPanel; +import org.parosproxy.paros.model.SiteNode; import org.parosproxy.paros.view.View; import org.zaproxy.zap.utils.DisplayUtils; import org.zaproxy.zap.utils.SortedComboBoxModel; import org.zaproxy.zap.utils.TableExportButton; +import org.zaproxy.zap.view.SiteMapListener; +import org.zaproxy.zap.view.SiteMapTreeCellRenderer; import org.zaproxy.zap.view.ZapToggleButton; @SuppressWarnings("serial") -public class TechPanel extends AbstractPanel { +public class TechPanel extends AbstractPanel implements SiteMapListener { private static final long serialVersionUID = 1L; @@ -76,9 +80,12 @@ public class TechPanel extends AbstractPanel { private TechTableModel techModel = new TechTableModel(); private TableExportButton exportButton = null; + private ZapToggleButton linkWithSitesTreeButton = null; private ZapToggleButton enableButton = null; private JButton optionsButton; + private boolean linkWithSitesTreeSelection; + private static final Icon TRANSPARENT_ICON = new Icon() { @@ -167,6 +174,7 @@ private JToolBar getPanelToolbar() { panelToolbar.add( new JLabel(Constant.messages.getString("wappalyzer.toolbar.site.label"))); panelToolbar.add(getSiteSelect()); + panelToolbar.add(getLinkWithSitesTreeButton()); panelToolbar.add(getExportButton()); panelToolbar.add(getEnableToggleButton()); @@ -386,4 +394,44 @@ private JButton getOptionsButton() { } return optionsButton; } + + private JToggleButton getLinkWithSitesTreeButton() { + if (linkWithSitesTreeButton == null) { + linkWithSitesTreeButton = new ZapToggleButton(); + linkWithSitesTreeButton.setIcon( + new ImageIcon( + TechPanel.class.getResource( + ExtensionWappalyzer.RESOURCE + "/earth-grey.png"))); + linkWithSitesTreeButton.setToolTipText( + Constant.messages.getString( + "wappalyzer.toolbar.toggle.site.link.disabled.tooltip")); + linkWithSitesTreeButton.setSelectedIcon( + new ImageIcon( + TechPanel.class.getResource( + ExtensionWappalyzer.RESOURCE + "/earth-colour.png"))); + linkWithSitesTreeButton.setSelectedToolTipText( + Constant.messages.getString( + "wappalyzer.toolbar.toggle.site.link.enabled.tooltip")); + DisplayUtils.scaleIcon(linkWithSitesTreeButton); + + linkWithSitesTreeButton.addActionListener( + e -> linkWithSitesTreeSelection = linkWithSitesTreeButton.isSelected()); + linkWithSitesTreeButton.setSelected(true); + } + return linkWithSitesTreeButton; + } + + @Override + public void nodeSelected(SiteNode node) { + // Event from SiteMapListenner + if (linkWithSitesTreeSelection) { + siteSelected(ExtensionWappalyzer.normalizeSite(node.getHistoryReference().getURI())); + } + } + + @Override + public void onReturnNodeRendererComponent( + SiteMapTreeCellRenderer component, boolean leaf, SiteNode value) { + // Nothing to do + } } diff --git a/addOns/wappalyzer/src/main/javahelp/org/zaproxy/zap/extension/wappalyzer/resources/help/contents/wappalyzer.html b/addOns/wappalyzer/src/main/javahelp/org/zaproxy/zap/extension/wappalyzer/resources/help/contents/wappalyzer.html index 0442f4d8d66..a5a061362bc 100644 --- a/addOns/wappalyzer/src/main/javahelp/org/zaproxy/zap/extension/wappalyzer/resources/help/contents/wappalyzer.html +++ b/addOns/wappalyzer/src/main/javahelp/org/zaproxy/zap/extension/wappalyzer/resources/help/contents/wappalyzer.html @@ -22,13 +22,16 @@

The Technology Tab

Selecting a regex will switch to the 'Search' tab and search through the history for that regex. Note: If multiple rows are selected the menu will not be displayed.

-Beside the site selection drop down is an Export button which can be used to export a CSV (comma separated values) file based on the +Beside the site selection drop down is a button (with a Globe icon) which controls whether or not the Technology tab's display is linked to the selection in the Sites Tree. +

+Next is an Export button which can be used to export a CSV (comma separated values) file based on the table information currently being displayed.

The toolbar also includes:

  • An enable/disable toggle button which controls whether the technology detection passive scan rule is functioning or not. This enabled state is persisted between ZAP sessions.
  • -
      +
    • A button (with a gear icon) which will open the add-on's Options panel when clicked.
    • +

    Reporting

    diff --git a/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/Messages.properties b/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/Messages.properties index e8c83d19a55..7383df2d633 100644 --- a/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/Messages.properties +++ b/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/Messages.properties @@ -84,6 +84,9 @@ wappalyzer.toolbar.options.name = Options wappalyzer.toolbar.site.label = Site: wappalyzer.toolbar.site.select = -- Select Site -- +wappalyzer.toolbar.toggle.site.link.disabled.tooltip = Click to Link with Sites Tree Selection +wappalyzer.toolbar.toggle.site.link.enabled.tooltip = Click to Disable Linking with Sites Tree Selection + wappalyzer.toolbar.toggle.state.disabled = Disabled wappalyzer.toolbar.toggle.state.disabled.tooltip = Click to Enable Technology Detection wappalyzer.toolbar.toggle.state.enabled = Enabled diff --git a/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/earth-colour.png b/addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/earth-colour.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5c2c095995b0f5b495e790d5422895f2a48d73 GIT binary patch literal 748 zcmV=Ei>q`M?s_4#FwCi zP{tOqN)p+F`3H0`bk}XVKW^;qzgy=!=tX<=!0(>#eE0YLzH`3s98IIqz-fj+pCRAS zabGushvCVc$b@aa;~Dv6hK~%>468@PnZ6ll$*9$8e8J{nm&>)n=8;>)m$r_MR@`lj zlHX>rSVkB%aLC~?G`K*uTE)QEf#KfX-pODvh`!=$IP}*z!KS%_d)hJNayd90jy9c6 zN1S1bQ3WcMO1Ir^fA9DE;ZD7RrP_7kobB4H*xTEK*=z>mfz|CT#i#f<*Xy}$Fc{F%($YpTs(|Uo!~Sx)jPHgQSZsViJf49pXRy7! z&+#e$9B#K8*=!cYVi8885scrj3TPAU(v975+6l@%zwz06AO7qF*4JeY^2c^!C@2Mv zCZUOZ(upFP3tglNr_%|q*Nalm0=|fY*x1;HxcC%v^K)2RUxQLmIEZ^(Ae2t0c_vww z!Ri64)ymiTd>(aK#D#C;$oenB=kp zgH?vnt*xy|lld|>H~->x`5j8O5@*$*>a%pnqk_%;|CnfK ePWzny2`~WEMQ6BRq)B1`0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*t_ z4ihV9qob7o00NjvL_t(I%cYY)NF!+&#($9*5JM(vvP?+Kpn?IxA{Y!7>MjN=>qXlI zYq{>4m1Vi&;EL;AxLPbMM3)nS|F9K{u!_58kbpa*#=vL>zi;L0sH{?zR%Lq(qge#Tsb^EWNK=P zY&HvkuItRs&T@Bm$I#Hwt4JiW^8Lg2Mc?;-0y3X7BZgu8y|c4Ju~?+9ukXd3sZ@%a zn;YWsIEG;m1i>Gf&zX@nKnO8ksZ_f2`8<(G1jli>zrSw-&d$#0>goa@8jaG^)ALFQ zG2aGgnl>k;WN&YeqoX6PudlIf8_Tk=EQ|H^btWbza2$t+hX-P@7*fi)whJ8{9r^L` zaSjd+kW#X-u|YPQWq5d)Cxuv+)mGHm*@+M$|Kf@9cpNDuxm=Egg$1OPY;A2}nkKrg zv%S5|>FFu1>*BgDQpy)D95)&bgb-X_UQ(%4NG6jAA!s(6v|26t`}=VmhjO{h)zuY3 zh~qXuDYaRz*BKZXpjxfsc^qnLZNo6AR;yfG zT%c(hp->1ZCE;+GXf#SJ79$#s;<~Qw`~GSh@a@~16VLOOYqc7hrg46L&gkeU>2#WO zI*qRDB$G*6troRf4W-ob*VkW9+Ab)i=h(Ie zx3~7=