Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions addOns/wappalyzer/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -175,14 +170,15 @@ public void hook(ExtensionHook extensionHook) {
super.hook(extensionHook);

extensionHook.addSessionListener(this);
extensionHook.addSiteMapListener(this);

if (hasView()) {
@SuppressWarnings("unused")
ExtensionHookView pv = extensionHook.getHookView();
extensionHook.getHookView().addStatusPanel(getTechPanel());
extensionHook.getHookMenu().addPopupMenuItem(this.getPopupMenuEvidence());
extensionHook.getHookView().addOptionPanel(new TechOptionsPanel());

extensionHook.addSiteMapListener(getTechPanel());
}

extensionHook.addApiImplementor(new TechApi(this));
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -76,9 +80,12 @@ public class TechPanel extends AbstractPanel {
private TechTableModel techModel = new TechTableModel();

private TableExportButton<JXTable> exportButton = null;
private ZapToggleButton linkWithSitesTreeButton = null;
private ZapToggleButton enableButton = null;
private JButton optionsButton;

private boolean linkWithSitesTreeSelection;

private static final Icon TRANSPARENT_ICON =
new Icon() {

Expand Down Expand Up @@ -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());

Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ <H2>The Technology Tab</H2>
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.
<p>
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.
<p>
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.
<p>
The toolbar also includes:
<ul>
<li>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.</li>
<ul>
<li>A button (with a gear icon) which will open the add-on's Options panel when clicked.</li>
</ul>

<H2>Reporting</H2>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.