/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright 2010 psiinon@gmail.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.zaproxy.zap.view; import java.awt.Component; import java.util.ArrayList; import java.util.List; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import org.apache.log4j.Logger; import org.parosproxy.paros.control.Control; import org.parosproxy.paros.control.Control.Mode; import org.parosproxy.paros.core.scanner.Alert; import org.parosproxy.paros.extension.ExtensionPopupMenuItem; import org.parosproxy.paros.model.HistoryReference; import org.parosproxy.paros.model.Model; import org.parosproxy.paros.model.Session; import org.parosproxy.paros.model.SiteNode; import org.zaproxy.zap.extension.alert.AlertNode; import org.zaproxy.zap.extension.ascan.ActiveScanPanel; import org.zaproxy.zap.extension.search.SearchPanel; import org.zaproxy.zap.view.popup.PopupMenuItemHistoryReferenceContainer; import org.zaproxy.zap.view.table.HistoryReferencesTable; /** * @deprecated (2.3.0) Superseded by {@link PopupMenuItemHistoryReferenceContainer}. It will be removed in a future release. */ @Deprecated public abstract class PopupMenuHistoryReference extends ExtensionPopupMenuItem { public static enum Invoker {sites, history, alerts, ascan, search, fuzz, bruteforce, hreftable}; private static final long serialVersionUID = 1L; private JTree treeInvoker = null; private HistoryReferencesTable hrefsTableInvoker = null; private HistoryReferencesTable hrefTableInvoker = null; private Invoker lastInvoker = null; private boolean multiSelect = false; private static final Logger log = Logger.getLogger(PopupMenuHistoryReference.class); /** * @param label */ public PopupMenuHistoryReference(String label) { this(label, false); } /** * @param label */ public PopupMenuHistoryReference(String label, boolean multiSelect) { super(label); this.setText(label); this.multiSelect = multiSelect; this.initialize(); } /** * Returns the last invoker. * * @return the last invoker. */ protected Invoker getLastInvoker() { return lastInvoker; } /** * This method initializes this */ protected void initialize() { this.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { log.debug("actionPerformed " + lastInvoker.name() + " " + e.getActionCommand()); try { if (multiSelect) { performActions(getSelectedHistoryReferences()); } else { HistoryReference ref = getSelectedHistoryReference(); if (ref != null) { try { performAction(ref); } catch (Exception e1) { log.error(e1.getMessage(), e1); } } else { log.error("PopupMenuHistoryReference invoker " + lastInvoker + " failed to get history ref"); } } } catch (Exception e2) { log.error(e2.getMessage(), e2); } } }); } private HistoryReference getSelectedHistoryReference() { HistoryReference ref = null; try { switch (lastInvoker) { case sites: SiteNode sNode = (SiteNode) treeInvoker.getLastSelectedPathComponent(); ref = sNode.getHistoryReference(); break; case ascan: case history: case bruteforce: case search: case fuzz: ref = hrefsTableInvoker.getSelectedHistoryReference(); break; case alerts: AlertNode aNode = (AlertNode) treeInvoker.getLastSelectedPathComponent(); if (aNode.getUserObject() != null) { Alert alert = aNode.getUserObject(); ref = alert.getHistoryRef(); } break; case hreftable: ref = hrefTableInvoker.getSelectedHistoryReference(); break; } } catch (Exception e2) { log.error(e2.getMessage(), e2); } return ref; } private List<HistoryReference> getSelectedHistoryReferences() { List <HistoryReference> refs = new ArrayList<>(); TreePath[] treePaths = null; try { switch (lastInvoker) { case sites: treePaths = treeInvoker.getSelectionPaths(); if (treePaths != null) { for (TreePath path : treePaths) { SiteNode node = (SiteNode) path.getLastPathComponent(); refs.add(node.getHistoryReference()); } } break; case ascan: case history: case bruteforce: case fuzz: case search: refs = hrefsTableInvoker.getSelectedHistoryReferences(); break; case alerts: // Only support single items AlertNode aNode = (AlertNode) treeInvoker.getLastSelectedPathComponent(); if (aNode.getUserObject() != null) { Alert alert = aNode.getUserObject(); refs.add(alert.getHistoryRef()); } break; case hreftable: refs = hrefTableInvoker.getSelectedHistoryReferences(); break; } } catch (Exception e2) { log.error(e2.getMessage(), e2); } return refs; } @Override public boolean isEnableForComponent(Component invoker) { boolean display = false; if (invoker.getName() == null) { return false; } if (invoker.getName().equals("History Table")) { this.lastInvoker = Invoker.history; this.hrefsTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker instanceof JTree && invoker.getName().equals("treeSite")) { this.lastInvoker = Invoker.sites; this.treeInvoker = (JTree) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker.getName().equals("treeAlert")) { this.lastInvoker = Invoker.alerts; this.treeInvoker = (JTree) invoker; JTree tree = (JTree) invoker; if (tree.getLastSelectedPathComponent() != null) { if (tree.getSelectionCount() > 1) { // Note - the Alerts tree only supports single selections this.setEnabled(false); } else { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (!node.isRoot() && node.getUserObject() != null) { this.setEnabled(isEnabledForHistoryReference(getSelectedHistoryReferences().get(0))); } else { this.setEnabled(false); } } } display = true; } else if (invoker.getName().equals(SearchPanel.HTTP_MESSAGE_CONTAINER_NAME)) { this.lastInvoker = Invoker.search; this.hrefsTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker.getName().equals(ActiveScanPanel.MESSAGE_CONTAINER_NAME)) { this.lastInvoker = Invoker.ascan; this.hrefsTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker.getName().equals("HttpFuzzerResultsContentPanel")) { this.lastInvoker = Invoker.fuzz; this.hrefsTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker.getName().equals("ForcedBrowseMessageContainer")) { this.lastInvoker = Invoker.bruteforce; this.hrefsTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else if (invoker instanceof HistoryReferencesTable) { this.lastInvoker = Invoker.hreftable; this.hrefTableInvoker = (HistoryReferencesTable) invoker; this.setEnabled(isEnabledForHistoryReferences(getSelectedHistoryReferences())); display = true; } else { // Only enable this while testing /* log.debug("Popup " + this.getName() + " not enabled for panel " + invoker.getName() + " class " + invoker.getClass().getName()); */ } if (display) { if (this.isEnabled() && ! this.isSafe() && Control.getSingleton().getMode().equals(Mode.protect)) { boolean inScope = true; Session session = Model.getSingleton().getSession(); for (HistoryReference href : getSelectedHistoryReferences()) { if ( ! session.isInScope(href)) { inScope = false; break; } } if (!inScope) { // Not safe and not in scope while in protected mode this.setEnabled(false); } } return this.isEnableForInvoker(lastInvoker); } return false; } public boolean isEnabledForHistoryReferences (List<HistoryReference> hrefs) { // Can Override if required if (hrefs.size() == 0) { return false; } else if (hrefs.size() > 1 && ! multiSelect) { return false; } for (HistoryReference href : hrefs) { if (! this.isEnabledForHistoryReference(href)) { return false; } } return true; } public boolean isEnabledForHistoryReference (HistoryReference href) { // Can Override if required return href != null && href.getHistoryType() != HistoryReference.TYPE_TEMPORARY; } public void performActions (List<HistoryReference> hrefs) throws Exception { // Can Override if required for (HistoryReference href : hrefs) { this.performAction(href); } } public abstract void performAction (HistoryReference href) throws Exception; public abstract boolean isEnableForInvoker(Invoker invoker); }