Skip to content

Commit 1defd39

Browse files
authored
Merge pull request zaproxy#2344 from kingthorin/wapp-able
wappalyzer: Add Enable/Disable Toggle
2 parents c285279 + 3a818ea commit 1defd39

8 files changed

Lines changed: 64 additions & 54 deletions

File tree

addOns/wappalyzer/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
77
### Changed
88
- Update minimum ZAP version to 2.9.0.
99

10+
### Added
11+
- The Wappalyzer toolbar now has a toggle button to allow users to enable/disable the passive scanner simply from the GUI (Issue 5846).
12+
1013
## [17] - 2020-03-06
1114

1215
### Changed

addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/ExtensionWappalyzer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ public void init() {
110110
passiveScanner = new WappalyzerPassiveScanner(this);
111111
}
112112

113+
WappalyzerPassiveScanner getPassiveScanner() {
114+
return passiveScanner;
115+
}
116+
113117
@Override
114118
public void hook(ExtensionHook extensionHook) {
115119
super.hook(extensionHook);

addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/TechPanel.java

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@
2121

2222
import java.awt.CardLayout;
2323
import java.awt.Component;
24+
import java.awt.Dimension;
2425
import java.awt.Graphics;
2526
import java.awt.GridBagConstraints;
2627
import java.awt.Toolkit;
28+
import java.awt.event.ItemEvent;
2729
import java.awt.event.KeyEvent;
30+
import javax.swing.Box;
2831
import javax.swing.Icon;
32+
import javax.swing.ImageIcon;
2933
import javax.swing.JComboBox;
3034
import javax.swing.JLabel;
3135
import javax.swing.JPanel;
@@ -43,6 +47,7 @@
4347
import org.parosproxy.paros.view.View;
4448
import org.zaproxy.zap.utils.SortedComboBoxModel;
4549
import org.zaproxy.zap.utils.TableExportButton;
50+
import org.zaproxy.zap.view.ZapToggleButton;
4651

4752
public class TechPanel extends AbstractPanel {
4853

@@ -63,6 +68,7 @@ public class TechPanel extends AbstractPanel {
6368
private TechTableModel techModel = new TechTableModel();
6469

6570
private TableExportButton<JXTable> exportButton = null;
71+
private ZapToggleButton enableButton = null;
6672

6773
private static final Icon TRANSPARENT_ICON =
6874
new Icon() {
@@ -147,57 +153,20 @@ private javax.swing.JToolBar getPanelToolbar() {
147153
if (panelToolbar == null) {
148154

149155
panelToolbar = new javax.swing.JToolBar();
150-
panelToolbar.setLayout(new java.awt.GridBagLayout());
151156
panelToolbar.setEnabled(true);
152157
panelToolbar.setFloatable(false);
153158
panelToolbar.setRollover(true);
154159
panelToolbar.setPreferredSize(new java.awt.Dimension(800, 30));
155160
panelToolbar.setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 12));
156161
panelToolbar.setName("WappTechToolbar");
157162

158-
GridBagConstraints gridBagConstraints0 = new GridBagConstraints();
159-
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
160-
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
161-
GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
162-
GridBagConstraints gridBagConstraintsx = new GridBagConstraints();
163-
164-
gridBagConstraints0.gridx = 0;
165-
gridBagConstraints0.gridy = 0;
166-
gridBagConstraints0.insets = new java.awt.Insets(0, 0, 0, 0);
167-
gridBagConstraints0.anchor = java.awt.GridBagConstraints.WEST;
168-
169-
gridBagConstraints1.gridx = 1;
170-
gridBagConstraints1.gridy = 0;
171-
gridBagConstraints1.insets = new java.awt.Insets(0, 0, 0, 0);
172-
gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST;
173-
174-
gridBagConstraints2.gridx = 2;
175-
gridBagConstraints2.gridy = 0;
176-
gridBagConstraints2.insets = new java.awt.Insets(0, 0, 0, 0);
177-
gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST;
178-
179-
gridBagConstraints3.gridx = 3;
180-
gridBagConstraints3.gridy = 0;
181-
gridBagConstraints3.insets = new java.awt.Insets(0, 0, 0, 0);
182-
gridBagConstraints3.anchor = java.awt.GridBagConstraints.WEST;
183-
184-
gridBagConstraintsx.gridx = 3;
185-
gridBagConstraintsx.gridy = 0;
186-
gridBagConstraintsx.weightx = 1.0;
187-
gridBagConstraintsx.weighty = 1.0;
188-
gridBagConstraintsx.insets = new java.awt.Insets(0, 0, 0, 0);
189-
gridBagConstraintsx.anchor = java.awt.GridBagConstraints.EAST;
190-
gridBagConstraintsx.fill = java.awt.GridBagConstraints.HORIZONTAL;
191-
192-
JLabel t1 = new JLabel();
193-
194163
panelToolbar.add(
195-
new JLabel(Constant.messages.getString("wappalyzer.toolbar.site.label")),
196-
gridBagConstraints1);
197-
panelToolbar.add(getSiteSelect(), gridBagConstraints2);
198-
panelToolbar.add(getExportButton(), gridBagConstraints3);
164+
new JLabel(Constant.messages.getString("wappalyzer.toolbar.site.label")));
165+
panelToolbar.add(getSiteSelect());
166+
panelToolbar.add(getExportButton());
167+
panelToolbar.add(getEnableToggleButton());
199168

200-
panelToolbar.add(t1, gridBagConstraintsx);
169+
panelToolbar.add(Box.createHorizontalGlue());
201170
}
202171
return panelToolbar;
203172
}
@@ -270,6 +239,7 @@ private JComboBox<String> getSiteSelect() {
270239
if (siteSelect == null) {
271240
siteSelect = new JComboBox<>(siteModel);
272241
siteSelect.addItem(Constant.messages.getString("params.toolbar.site.select"));
242+
siteSelect.setPreferredSize(new Dimension(250, 22));
273243
siteSelect.setSelectedIndex(0);
274244

275245
siteSelect.addActionListener(
@@ -343,4 +313,40 @@ private TableExportButton<JXTable> getExportButton() {
343313
}
344314
return exportButton;
345315
}
316+
317+
private ZapToggleButton getEnableToggleButton() {
318+
if (enableButton == null) {
319+
enableButton =
320+
new ZapToggleButton(
321+
Constant.messages.getString("wappalyzer.toolbar.toggle.state.enabled"),
322+
true);
323+
enableButton.setIcon(
324+
new ImageIcon(
325+
TechPanel.class.getResource(
326+
ExtensionWappalyzer.RESOURCE + "/off.png")));
327+
enableButton.setToolTipText(
328+
Constant.messages.getString(
329+
"wappalyzer.toolbar.toggle.state.disabled.tooltip"));
330+
enableButton.setSelectedIcon(
331+
new ImageIcon(
332+
TechPanel.class.getResource(ExtensionWappalyzer.RESOURCE + "/on.png")));
333+
enableButton.setSelectedToolTipText(
334+
Constant.messages.getString("wappalyzer.toolbar.toggle.state.enabled.tooltip"));
335+
enableButton.addItemListener(
336+
event -> {
337+
if (event.getStateChange() == ItemEvent.SELECTED) {
338+
enableButton.setText(
339+
Constant.messages.getString(
340+
"wappalyzer.toolbar.toggle.state.enabled"));
341+
extension.getPassiveScanner().setEnabled(true);
342+
} else {
343+
enableButton.setText(
344+
Constant.messages.getString(
345+
"wappalyzer.toolbar.toggle.state.disabled"));
346+
extension.getPassiveScanner().setEnabled(false);
347+
}
348+
});
349+
}
350+
return enableButton;
351+
}
346352
}

addOns/wappalyzer/src/main/java/org/zaproxy/zap/extension/wappalyzer/WappalyzerPassiveScanner.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import net.htmlparser.jericho.Source;
2929
import org.apache.log4j.Logger;
3030
import org.parosproxy.paros.Constant;
31-
import org.parosproxy.paros.core.scanner.Plugin.AlertThreshold;
3231
import org.parosproxy.paros.model.HistoryReference;
3332
import org.parosproxy.paros.model.SiteNode;
3433
import org.parosproxy.paros.network.HttpMessage;
@@ -43,6 +42,7 @@ public class WappalyzerPassiveScanner implements PassiveScanner {
4342
private Set<String> visitedSiteIdentifiers = new HashSet<>();
4443
private ApplicationMatch appMatch;
4544
private Application currentApp;
45+
private volatile boolean enabled = true;
4646

4747
public WappalyzerPassiveScanner(WappalyzerApplicationHolder applicationHolder) {
4848
super();
@@ -206,20 +206,12 @@ public void setParent(PassiveScanThread parent) {
206206

207207
@Override
208208
public boolean isEnabled() {
209-
return true;
209+
return enabled;
210210
}
211211

212212
@Override
213213
public void setEnabled(boolean enabled) {
214-
// Does not apply.
215-
}
216-
217-
public AlertThreshold getAlertThreshold() {
218-
return AlertThreshold.MEDIUM;
219-
}
220-
221-
public void setAlertThresholdl(AlertThreshold level) {
222-
// Does not apply.
214+
this.enabled = enabled;
223215
}
224216

225217
@Override

addOns/wappalyzer/src/main/javahelp/org/zaproxy/zap/extension/wappalyzer/resources/help/contents/wappalyzer.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ <H2>The Technology Tab</H2>
2121
the menu will not be displayed.
2222
<p>
2323
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
24-
table information currently being displayed.
24+
table information currently being displayed. There is also a toggle button which allows users to easily Enable/Disable the Wappalyzer
25+
passive scanner.
2526

2627
<H2>External Links</H2>
2728
<table>

addOns/wappalyzer/src/main/resources/org/zaproxy/zap/extension/wappalyzer/resources/Messages.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ wappalyzer.table.header.website = Website
2323

2424
wappalyzer.toolbar.site.label = Site:
2525
wappalyzer.toolbar.site.select = -- Select Site --
26+
wappalyzer.toolbar.toggle.state.enabled=Enabled
27+
wappalyzer.toolbar.toggle.state.enabled.tooltip=Click to Disable Wappalyzer
28+
wappalyzer.toolbar.toggle.state.disabled=Disabled
29+
wappalyzer.toolbar.toggle.state.disabled.tooltip=Click to Enable Wappalyzer
2630

2731
wappalyzer.category.cms = CMS
2832
wappalyzer.category.message-boards = Message-boards
560 Bytes
Loading
542 Bytes
Loading

0 commit comments

Comments
 (0)