/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* 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.extension.stdmenus;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.control.Control;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.extension.ExtensionHook;
import org.parosproxy.paros.extension.ExtensionLoader;
import org.parosproxy.paros.extension.history.ExtensionHistory;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.view.View;
import org.zaproxy.zap.extension.ascan.ExtensionActiveScan;
import org.zaproxy.zap.model.Context;
import org.zaproxy.zap.utils.DisplayUtils;
import org.zaproxy.zap.view.ContextExportDialog;
import org.zaproxy.zap.view.popup.PopupMenuItemContextDataDriven;
import org.zaproxy.zap.view.popup.PopupMenuItemContextExclude;
import org.zaproxy.zap.view.popup.PopupMenuItemContextInclude;
public class ExtensionStdMenus extends ExtensionAdaptor implements ClipboardOwner {
public static final String NAME = "ExtensionStandardMenus";
private PopupCopyMenu popupCopyMenu = null;
private PopupPasteMenu popupPaste = null;
private PopupMenuActiveScanCustom popupMenuActiveScanCustom = null;
private PopupExcludeFromProxyMenu popupExcludeFromProxyMenu = null;
private PopupExcludeFromScanMenu popupExcludeFromScanMenu = null;
private PopupExcludeFromSpiderMenu popupExcludeFromSpiderMenu = null;
private PopupMenuResendMessage popupMenuResendMessage = null;
private PopupMenuShowInHistory popupMenuShowInHistory = null;
private PopupMenuShowInSites popupMenuShowInSites = null;
private PopupMenuOpenUrlInBrowser popupMenuOpenUrlInBrowser = null;
private PopupMenuItemContextInclude popupContextIncludeMenu = null;
private PopupMenuItemContextExclude popupContextExcludeMenu = null;
private PopupMenuItemContextDataDriven popupContextDataDrivenMenu = null;
private PopupMenuCopyUrls popupMenuCopyUrls = null;
private PopupContextTreeMenu popupContextTreeMenuInScope = null;
private PopupContextTreeMenu popupContextTreeMenuOutScope = null;
private PopupContextTreeMenu popupContextTreeMenuDelete = null;
private PopupContextTreeMenu popupContextTreeMenuExport;
// Still being developed
// private PopupMenuShowResponseInBrowser popupMenuShowResponseInBrowser = null;
private PopupMenuAlert popupMenuAlert = null;
private static Logger log = Logger.getLogger(ExtensionStdMenus.class);
public ExtensionStdMenus() {
super();
initialize();
}
private void initialize() {
this.setName(NAME);
this.setOrder(31);
}
@Override
public void hook(ExtensionHook extensionHook) {
super.hook(extensionHook);
if (getView() != null) {
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuCopy());
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuPaste());
final ExtensionLoader extensionLoader = Control.getSingleton().getExtensionLoader();
boolean isExtensionHistoryEnabled = extensionLoader.isExtensionEnabled(ExtensionHistory.NAME);
boolean isExtensionActiveScanEnabled = extensionLoader.isExtensionEnabled(ExtensionActiveScan.NAME);
// Be careful when changing the menu indexes (and order above) - its easy to get unexpected
// results!
extensionHook.getHookMenu().addPopupMenuItem(getPopupExcludeFromProxyMenu(0));
if (isExtensionActiveScanEnabled) {
extensionHook.getHookMenu().addPopupMenuItem(getPopupExcludeFromScanMenu(0));
}
extensionHook.getHookMenu().addPopupMenuItem(getPopupExcludeFromSpiderMenu(0));
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextIncludeMenu(1));
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextExcludeMenu(2));
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextDataDrivenMenu(2)); // TODO ??
if (isExtensionActiveScanEnabled) {
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuActiveScanCustom(3));
}
if (isExtensionHistoryEnabled) {
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuResendMessage(4));
}
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuAlert(5));
if (isExtensionHistoryEnabled) {
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuShowInHistory(6)); // Both are index 6
}
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuShowInSites(6)); // on purpose ;)
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuOpenUrlInBrowser(7));
extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuCopyUrls(8));
// extensionHook.getHookMenu().addPopupMenuItem(getPopupMenuShowResponseInBrowser(7));
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextTreeMenuInScope());
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextTreeMenuOutScope());
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextTreeMenuDelete());
extensionHook.getHookMenu().addPopupMenuItem(getPopupContextTreeMenuExport());
}
}
private PopupContextTreeMenu getPopupContextTreeMenuInScope() {
if (popupContextTreeMenuInScope == null) {
popupContextTreeMenuInScope = new PopupContextTreeMenu() {
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabledForContext(int contextId) {
Context ctx = Model.getSingleton().getSession().getContext(contextId);
return ctx != null && ! ctx.isInScope();
}
};
popupContextTreeMenuInScope.setText(Constant.messages.getString("context.inscope.popup"));
popupContextTreeMenuInScope.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
Context ctx = Model.getSingleton().getSession().getContext(popupContextTreeMenuOutScope.getContextId());
ctx.setInScope(true);
Model.getSingleton().getSession().saveContext(ctx);
}
});
}
return popupContextTreeMenuInScope;
}
private PopupContextTreeMenu getPopupContextTreeMenuOutScope() {
if (popupContextTreeMenuOutScope == null) {
popupContextTreeMenuOutScope = new PopupContextTreeMenu() {
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabledForContext(int contextId) {
Context ctx = Model.getSingleton().getSession().getContext(contextId);
return ctx != null && ctx.isInScope();
}
};
popupContextTreeMenuOutScope.setText(Constant.messages.getString("context.outscope.popup"));
popupContextTreeMenuOutScope.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
Context ctx = Model.getSingleton().getSession().getContext(popupContextTreeMenuOutScope.getContextId());
ctx.setInScope(false);
Model.getSingleton().getSession().saveContext(ctx);
}
});
}
return popupContextTreeMenuOutScope;
}
private PopupContextTreeMenu getPopupContextTreeMenuDelete() {
if (popupContextTreeMenuDelete == null) {
popupContextTreeMenuDelete = new PopupContextTreeMenu();
popupContextTreeMenuDelete.setText(Constant.messages.getString("context.delete.popup"));
popupContextTreeMenuDelete.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
Context ctx = Model.getSingleton().getSession().getContext(popupContextTreeMenuOutScope.getContextId());
if (View.getSingleton().showConfirmDialog(Constant.messages.getString("context.delete.warning"))
== JOptionPane.OK_OPTION) {
Model.getSingleton().getSession().deleteContext(ctx);
}
}
});
}
return popupContextTreeMenuDelete;
}
private PopupContextTreeMenu getPopupContextTreeMenuExport() {
if (popupContextTreeMenuExport == null) {
popupContextTreeMenuExport = new PopupContextTreeMenu();
popupContextTreeMenuExport.setText(Constant.messages.getString("menu.file.context.export"));
popupContextTreeMenuExport.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(
ExtensionStdMenus.class.getResource("/resource/icon/fugue/application-blue-export.png"))));
popupContextTreeMenuExport.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
Context context = Model.getSingleton().getSession().getContext(popupContextTreeMenuExport.getContextId());
ContextExportDialog exportDialog = new ContextExportDialog(View.getSingleton().getMainFrame());
exportDialog.setSelectedContext(context);
exportDialog.setVisible(true);
}
});
}
return popupContextTreeMenuExport;
}
private PopupCopyMenu getPopupMenuCopy() {
if (popupCopyMenu== null) {
popupCopyMenu = new PopupCopyMenu();
popupCopyMenu.setText(Constant.messages.getString("copy.copy.popup"));
popupCopyMenu.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
setClipboardContents(popupCopyMenu.getLastInvoker().getSelectedText());
}
});
}
return popupCopyMenu;
}
private PopupPasteMenu getPopupMenuPaste() {
if (popupPaste == null) {
popupPaste = new PopupPasteMenu();
popupPaste.setText(Constant.messages.getString("paste.paste.popup"));
popupPaste.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
popupPaste.getLastInvoker().setText(popupPaste.getLastInvoker().getText() + getClipboardContents());
}
});
}
return popupPaste;
}
private String getClipboardContents() {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable contents = clipboard.getContents(null);
if (contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
return (String) contents.getTransferData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException | IOException e) {
log.error("Unable to get data from clipboard");
}
}
return "";
}
private void setClipboardContents (String str) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents( new StringSelection(str), this );
}
@Override
public void lostOwnership(Clipboard arg0, Transferable arg1) {
// Ignore
}
private PopupMenuActiveScanCustom getPopupMenuActiveScanCustom(int menuIndex) {
if (popupMenuActiveScanCustom == null) {
popupMenuActiveScanCustom = new PopupMenuActiveScanCustom(Constant.messages.getString("ascan.custom.popup"));
}
return popupMenuActiveScanCustom;
}
private PopupMenuOpenUrlInBrowser getPopupMenuOpenUrlInBrowser(int menuIndex) {
if (popupMenuOpenUrlInBrowser == null) {
popupMenuOpenUrlInBrowser = new PopupMenuOpenUrlInBrowser(
Constant.messages.getString("history.browser.popup"));
popupMenuOpenUrlInBrowser.setMenuIndex(menuIndex);
}
return popupMenuOpenUrlInBrowser;
}
private PopupMenuCopyUrls getPopupMenuCopyUrls(int menuIndex) {
if (popupMenuCopyUrls == null) {
popupMenuCopyUrls = new PopupMenuCopyUrls(
Constant.messages.getString("stdexts.copyurls.popup"));
popupMenuCopyUrls.setMenuIndex(menuIndex);
}
return popupMenuCopyUrls;
}
/*
* private PopupMenuShowResponseInBrowser getPopupMenuShowResponseInBrowser(int menuIndex) { if
* (popupMenuShowResponseInBrowser == null) { // TODO! popupMenuShowResponseInBrowser = new
* PopupMenuShowResponseInBrowser(Constant.messages.getString("history.showresponse.popup"));
* popupMenuShowResponseInBrowser.setMenuIndex(menuIndex); } return popupMenuShowResponseInBrowser; }
*/
private PopupExcludeFromProxyMenu getPopupExcludeFromProxyMenu(int menuIndex) {
if (popupExcludeFromProxyMenu == null) {
popupExcludeFromProxyMenu = new PopupExcludeFromProxyMenu();
popupExcludeFromProxyMenu.setMenuIndex(menuIndex);
}
return popupExcludeFromProxyMenu;
}
private PopupExcludeFromScanMenu getPopupExcludeFromScanMenu(int menuIndex) {
if (popupExcludeFromScanMenu == null) {
popupExcludeFromScanMenu = new PopupExcludeFromScanMenu();
popupExcludeFromScanMenu.setMenuIndex(menuIndex);
}
return popupExcludeFromScanMenu;
}
private PopupExcludeFromSpiderMenu getPopupExcludeFromSpiderMenu(int menuIndex) {
if (popupExcludeFromSpiderMenu == null) {
popupExcludeFromSpiderMenu = new PopupExcludeFromSpiderMenu();
popupExcludeFromSpiderMenu.setMenuIndex(menuIndex);
}
return popupExcludeFromSpiderMenu;
}
private PopupMenuResendMessage getPopupMenuResendMessage(int menuIndex) {
if (popupMenuResendMessage == null) {
popupMenuResendMessage = new PopupMenuResendMessage(
Constant.messages.getString("history.resend.popup"),
(ExtensionHistory) Control.getSingleton().getExtensionLoader().getExtension(ExtensionHistory.NAME));
popupMenuResendMessage.setMenuIndex(menuIndex);
}
return popupMenuResendMessage;
}
private PopupMenuShowInSites getPopupMenuShowInSites(int menuIndex) {
if (popupMenuShowInSites == null) {
popupMenuShowInSites = new PopupMenuShowInSites(Constant.messages.getString("sites.showinsites.popup"));
popupMenuShowInSites.setMenuIndex(menuIndex);
}
return popupMenuShowInSites;
}
private PopupMenuShowInHistory getPopupMenuShowInHistory(int menuIndex) {
if (popupMenuShowInHistory == null) {
popupMenuShowInHistory = new PopupMenuShowInHistory(
Constant.messages.getString("history.showinhistory.popup"),
(ExtensionHistory) Control.getSingleton().getExtensionLoader().getExtension(ExtensionHistory.NAME));
popupMenuShowInHistory.setMenuIndex(menuIndex);
}
return popupMenuShowInHistory;
}
private PopupMenuAlert getPopupMenuAlert(int menuIndex) {
if (popupMenuAlert == null) {
popupMenuAlert = new PopupMenuAlert(Constant.messages.getString("history.alert.popup"));
popupMenuAlert.setMenuIndex(menuIndex);
}
return popupMenuAlert;
}
private PopupMenuItemContextInclude getPopupContextIncludeMenu(int menuIndex) {
if (popupContextIncludeMenu == null) {
popupContextIncludeMenu = new PopupMenuItemContextInclude();
popupContextIncludeMenu.setParentMenuIndex(menuIndex);
}
return popupContextIncludeMenu;
}
private PopupMenuItemContextExclude getPopupContextExcludeMenu(int menuIndex) {
if (popupContextExcludeMenu == null) {
popupContextExcludeMenu = new PopupMenuItemContextExclude();
popupContextExcludeMenu.setParentMenuIndex(menuIndex);
}
return popupContextExcludeMenu;
}
private PopupMenuItemContextDataDriven getPopupContextDataDrivenMenu(int menuIndex) {
if (popupContextDataDrivenMenu == null) {
popupContextDataDrivenMenu = new PopupMenuItemContextDataDriven();
popupContextDataDrivenMenu.setParentMenuIndex(menuIndex);
}
return popupContextDataDrivenMenu;
}
@Override
public String getAuthor() {
return Constant.ZAP_TEAM;
}
@Override
public String getDescription() {
return Constant.messages.getString("stdexts.desc");
}
@Override
public URL getURL() {
try {
return new URL(Constant.ZAP_HOMEPAGE);
} catch (MalformedURLException e) {
return null;
}
}
/**
* No database tables used, so all supported
*/
@Override
public boolean supportsDb(String type) {
return true;
}
}