/*
*
* Paros and its related class files.
*
* Paros is an HTTP/HTTPS proxy for assessing web application security.
* Copyright (C) 2003-2004 Chinotec Technologies Company
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the Clarified Artistic License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Clarified Artistic License for more details.
*
* You should have received a copy of the Clarified Artistic License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// ZAP: 2012/04/14 Changed the method initParam to discard all edits.
// ZAP: 2012/04/25 Added @Override annotation to all appropriate methods.
// ZAP: 2012/12/18 Issue 441: Dont access view in daemon mode
// ZAP: 2013/01/04 Added field txtSslTunnelingPorts below txtTimeoutInSecs.
// ZAP: 2013/01/30 Issue 478: Allow to choose to send ZAP's managed cookies on
// a single Cookie request header and set it as the default
// ZAP: 2013/12/13 Issue 939: ZAP should accept SSL connections on non-standard ports automatically
// ZAP: 2014/03/23 Issue 416: Normalise how multiple related options are managed throughout ZAP
// and enhance the usability of some options
// ZAP: 2014/03/23 Issue 968: Allow to choose the enabled SSL/TLS protocols
// ZAP: 2015/02/10 Issue 1528: Support user defined font size
// ZAP: 2015/08/07 Issue 1768: Update to use a more recent default user agent
// ZAP: 2016/03/08 Issue 646: Outgoing proxy password as JPasswordField (pips) instead of ZapTextField
// ZAP: 2016/03/18 Add checkbox to allow showing of the password
// ZAP: 2016/08/08 Issue 2742: Allow for override/customization of Java's "networkaddress.cache.ttl" value
package org.parosproxy.paros.extension.option;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.SortOrder;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.model.OptionsParam;
import org.parosproxy.paros.network.ConnectionParam;
import org.parosproxy.paros.view.AbstractParamPanel;
import org.parosproxy.paros.view.View;
import org.zaproxy.zap.model.CommonUserAgents;
import org.zaproxy.zap.network.DomainMatcher;
import org.zaproxy.zap.utils.FontUtils;
import org.zaproxy.zap.utils.ZapNumberSpinner;
import org.zaproxy.zap.utils.ZapPortNumberSpinner;
import org.zaproxy.zap.utils.ZapTextField;
import org.zaproxy.zap.view.AbstractMultipleOptionsTablePanel;
import org.zaproxy.zap.view.LayoutHelper;
import org.zaproxy.zap.view.ProxyDialog;
public class OptionsConnectionPanel extends AbstractParamPanel {
// ZAP: i18n
private static final long serialVersionUID = 1L;
private JCheckBox chkUseProxyChain = null;
private JPanel jPanel = null;
private JPanel panelProxyAuth = null;
//private OptionsParam optionsParam = null;
private JPanel panelProxyChain = null;
private ZapTextField txtProxyChainName = null;
// ZAP: Do not allow invalid port numbers
private ZapPortNumberSpinner spinnerProxyChainPort = null;
private ZapTextField txtProxyChainRealm = null;
private ZapTextField txtProxyChainUserName = null;
private JPasswordField txtProxyChainPassword = null;
private JCheckBox chkShowPassword = null;
private JCheckBox chkProxyChainAuth = null;
// ZAP: Added prompt option and timeout in secs
private JCheckBox chkProxyChainPrompt = null;
private ZapTextField txtTimeoutInSecs = null;
private JPanel panelGeneral = null;
private JCheckBox checkBoxSingleCookieRequestHeader;
private JComboBox<String> commonUserAgents = null;
private ZapTextField defaultUserAgent = null;
private JPanel dnsPanel;
private ZapNumberSpinner dnsTtlSuccessfulQueriesNumberSpinner;
private SecurityProtocolsPanel securityProtocolsPanel;
private ProxyExcludedDomainsMultipleOptionsPanel proxyExcludedDomainsPanel;
private ProxyExcludedDomainsTableModel proxyExcludedDomainsTableModel;
public OptionsConnectionPanel() {
super();
initialize();
}
/**
* This method initializes chkShowPassword
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkShowPassword() {
if (chkShowPassword == null) {
chkShowPassword = new JCheckBox();
chkShowPassword.setText(Constant.messages.getString("conn.options.proxy.auth.showpass"));
chkShowPassword.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
if (chkShowPassword.isSelected()) {
txtProxyChainPassword.setEchoChar((char) 0);
} else {
txtProxyChainPassword.setEchoChar('*');
}
}
});
}
return chkShowPassword;
}
/**
* This method initializes chkUseProxyChain
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkUseProxyChain() {
if (chkUseProxyChain == null) {
chkUseProxyChain = new JCheckBox();
chkUseProxyChain.setText(Constant.messages.getString("conn.options.useProxy"));
chkUseProxyChain.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
setProxyChainEnabled(chkUseProxyChain.isSelected());
}
});
}
return chkUseProxyChain;
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
java.awt.GridBagConstraints gridBagConstraints71 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints61 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints51 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints41 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints15 = new GridBagConstraints();
javax.swing.JLabel jLabel7 = new JLabel();
javax.swing.JLabel jLabel6 = new JLabel();
javax.swing.JLabel jLabel5 = new JLabel();
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
jLabel5.setText(Constant.messages.getString("conn.options.proxy.address"));
jLabel6.setText(Constant.messages.getString("conn.options.proxy.port"));
jLabel7.setText(Constant.messages.getString("conn.options.proxy.skipAddresses"));
gridBagConstraints15.gridx = 0;
gridBagConstraints15.gridy = 0;
gridBagConstraints15.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints15.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints15.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints15.gridwidth = 2;
gridBagConstraints15.weightx = 1.0D;
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 1;
gridBagConstraints2.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints2.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints2.weightx = 0.5D;
gridBagConstraints3.gridx = 1;
gridBagConstraints3.gridy = 1;
gridBagConstraints3.weightx = 0.5D;
gridBagConstraints3.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints3.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints3.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints3.ipadx = 50;
gridBagConstraints41.gridx = 0;
gridBagConstraints41.gridy = 2;
gridBagConstraints41.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints41.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints41.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints41.weightx = 0.5D;
gridBagConstraints51.gridx = 1;
gridBagConstraints51.gridy = 2;
gridBagConstraints51.weightx = 0.5D;
gridBagConstraints51.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints51.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints51.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints51.ipadx = 50;
gridBagConstraints61.gridx = 0;
gridBagConstraints61.gridy = 3;
gridBagConstraints61.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints61.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints61.weightx = 1.0D;
gridBagConstraints61.gridwidth = 2;
gridBagConstraints61.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints71.gridx = 0;
gridBagConstraints71.gridy = 4;
gridBagConstraints71.weightx = 1.0D;
gridBagConstraints71.weighty = 0.2D;
gridBagConstraints71.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints71.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints71.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints71.gridwidth = 2;
gridBagConstraints71.ipady = 20;
jPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
Constant.messages.getString("conn.options.proxy.useProxyChain"),
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,
FontUtils.getFont(FontUtils.Size.standard), java.awt.Color.black));
jPanel.add(getChkUseProxyChain(), gridBagConstraints15);
jPanel.add(jLabel5, gridBagConstraints2);
jPanel.add(getTxtProxyChainName(), gridBagConstraints3);
jPanel.add(jLabel6, gridBagConstraints41);
jPanel.add(getTxtProxyChainPort(), gridBagConstraints51);
jPanel.add(jLabel7, gridBagConstraints61);
jPanel.add(getProxyExcludedDomainsPanel(), gridBagConstraints71);
}
return jPanel;
}
/**
* This method initializes panelProxyAuth
*
* @return javax.swing.JPanel
*/
private JPanel getPanelProxyAuth() {
if (panelProxyAuth == null) {
java.awt.GridBagConstraints gridBagConstraints82 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints72 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints62 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints52 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints42 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints31 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints21 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints16 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints17 = new GridBagConstraints();
javax.swing.JLabel jLabel11 = new JLabel();
javax.swing.JLabel jLabel10 = new JLabel();
javax.swing.JLabel jLabel9 = new JLabel();
panelProxyAuth = new JPanel();
panelProxyAuth.setLayout(new GridBagLayout());
jLabel9.setText(Constant.messages.getString("conn.options.proxy.auth.realm"));
jLabel10.setText(Constant.messages.getString("conn.options.proxy.auth.username"));
jLabel11.setText(Constant.messages.getString("conn.options.proxy.auth.password"));
panelProxyAuth.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
Constant.messages.getString("conn.options.proxy.auth.auth"),
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,
FontUtils.getFont(FontUtils.Size.standard), java.awt.Color.black));
gridBagConstraints16.gridx = 0;
gridBagConstraints16.gridy = 0;
gridBagConstraints16.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints16.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints16.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints16.gridwidth = 2;
gridBagConstraints16.weightx = 1.0D;
gridBagConstraints17.gridx = 0;
gridBagConstraints17.gridy = 1;
gridBagConstraints17.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints17.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints17.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints17.gridwidth = 2;
gridBagConstraints17.weightx = 1.0D;
gridBagConstraints21.gridx = 0;
gridBagConstraints21.gridy = 2;
gridBagConstraints21.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints21.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints21.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints21.weightx = 0.5D;
gridBagConstraints31.gridx = 1;
gridBagConstraints31.gridy = 2;
gridBagConstraints31.weightx = 0.5D;
gridBagConstraints31.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints31.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints31.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints31.ipadx = 50;
gridBagConstraints42.gridx = 0;
gridBagConstraints42.gridy = 3;
gridBagConstraints42.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints42.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints42.weightx = 0.5D;
gridBagConstraints42.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints52.gridx = 1;
gridBagConstraints52.gridy = 3;
gridBagConstraints52.weightx = 0.5D;
gridBagConstraints52.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints52.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints52.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints52.ipadx = 50;
gridBagConstraints62.gridx = 0;
gridBagConstraints62.gridy = 4;
gridBagConstraints62.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints62.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints62.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints62.weightx = 0.5D;
gridBagConstraints72.gridx = 1;
gridBagConstraints72.gridy = 4;
gridBagConstraints72.weightx = 0.5D;
gridBagConstraints72.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints72.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints72.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints72.ipadx = 50;
gridBagConstraints82.gridx = 1;
gridBagConstraints82.gridy = 5;
gridBagConstraints82.weightx = 0.5D;
gridBagConstraints82.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints82.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints82.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints82.ipadx = 50;
panelProxyAuth.add(getChkProxyChainAuth(), gridBagConstraints16);
panelProxyAuth.add(getChkProxyChainPrompt(), gridBagConstraints17);
panelProxyAuth.add(jLabel9, gridBagConstraints21);
panelProxyAuth.add(getTxtProxyChainRealm(), gridBagConstraints31);
panelProxyAuth.add(jLabel10, gridBagConstraints42);
panelProxyAuth.add(getTxtProxyChainUserName(), gridBagConstraints52);
panelProxyAuth.add(jLabel11, gridBagConstraints62);
panelProxyAuth.add(getTxtProxyChainPassword(), gridBagConstraints72);
panelProxyAuth.add(getChkShowPassword(), gridBagConstraints82);
}
return panelProxyAuth;
}
/**
* This method initializes panelProxyChain
*
* @return javax.swing.JPanel
*/
private JPanel getPanelProxyChain() {
if (panelProxyChain == null) {
panelProxyChain = new JPanel(new BorderLayout());
panelProxyChain.setName("ProxyChain");
JPanel innerPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.insets = new java.awt.Insets(2,2,2,2);
gbc.anchor = java.awt.GridBagConstraints.NORTHWEST;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0D;
innerPanel.add(getPanelGeneral(), gbc);
innerPanel.add(getDnsPanel(), gbc);
innerPanel.add(getSecurityProtocolsPanel(), gbc);
innerPanel.add(getJPanel(), gbc);
innerPanel.add(getPanelProxyAuth(), gbc);
JScrollPane scrollPane = new JScrollPane(innerPanel);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
panelProxyChain.add(scrollPane, BorderLayout.CENTER);
}
return panelProxyChain;
}
private JPanel getDnsPanel() {
if (dnsPanel == null) {
dnsPanel = new JPanel();
dnsPanel.setBorder(
javax.swing.BorderFactory.createTitledBorder(
null,
Constant.messages.getString("conn.options.dns.title"),
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,
FontUtils.getFont(FontUtils.Size.standard),
Color.black));
GroupLayout layout = new GroupLayout(dnsPanel);
dnsPanel.setLayout(layout);
layout.setAutoCreateGaps(true);
JLabel valueLabel = new JLabel(Constant.messages.getString("conn.options.dns.ttlSuccessfulQueries.label"));
valueLabel.setToolTipText(Constant.messages.getString("conn.options.dns.ttlSuccessfulQueries.toolTip"));
valueLabel.setLabelFor(getDnsTtlSuccessfulQueriesNumberSpinner());
layout.setHorizontalGroup(layout.createSequentialGroup()
.addComponent(valueLabel)
.addComponent(getDnsTtlSuccessfulQueriesNumberSpinner()));
layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(valueLabel)
.addComponent(getDnsTtlSuccessfulQueriesNumberSpinner()));
}
return dnsPanel;
}
private ZapNumberSpinner getDnsTtlSuccessfulQueriesNumberSpinner() {
if (dnsTtlSuccessfulQueriesNumberSpinner == null) {
dnsTtlSuccessfulQueriesNumberSpinner = new ZapNumberSpinner(
-1,
ConnectionParam.DNS_DEFAULT_TTL_SUCCESSFUL_QUERIES,
Integer.MAX_VALUE);
}
return dnsTtlSuccessfulQueriesNumberSpinner;
}
/**
* This method initializes txtProxyChainName
*
* @return org.zaproxy.zap.utils.ZapTextField
*/
private ZapTextField getTxtProxyChainName() {
if (txtProxyChainName == null) {
txtProxyChainName = new ZapTextField();
}
return txtProxyChainName;
}
/**
* This method initializes spinnerProxyChainPort
*
* @return ZapPortNumberSpinner
*/
private ZapPortNumberSpinner getTxtProxyChainPort() {
if (spinnerProxyChainPort == null) {
// ZAP: Do not allow invalid port numbers
spinnerProxyChainPort = new ZapPortNumberSpinner(8080);
}
return spinnerProxyChainPort;
}
private JComboBox<String> getCommonUserAgents() {
if (commonUserAgents == null) {
commonUserAgents = new JComboBox<String>(CommonUserAgents.getNames());
if (commonUserAgents.getItemCount() == 0) {
commonUserAgents.setEnabled(false);
} else {
commonUserAgents.addItem("");
commonUserAgents.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String item = (String) commonUserAgents.getSelectedItem();
String ua = CommonUserAgents.getStringFromName(item);
if (ua != null) {
getDefaultUserAgent().setText(ua);
}
}});
}
}
return commonUserAgents;
}
private ZapTextField getDefaultUserAgent() {
if (defaultUserAgent == null) {
defaultUserAgent = new ZapTextField();
defaultUserAgent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setUaFromString();
}
});
defaultUserAgent.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
setUaFromString();
}});
}
return defaultUserAgent;
}
private void setUaFromString() {
String name = CommonUserAgents.getNameFromString(getDefaultUserAgent().getText());
if (name != null) {
getCommonUserAgents().setSelectedItem(name);
} else {
getCommonUserAgents().setSelectedItem("");
}
}
/**
* This method initializes this
*/
private void initialize() {
this.setLayout(new CardLayout());
this.setName(Constant.messages.getString("conn.options.title"));
this.add(getPanelProxyChain(), getPanelProxyChain().getName());
}
@Override
public void initParam(Object obj) {
OptionsParam optionsParam = (OptionsParam) obj;
ConnectionParam connectionParam = optionsParam.getConnectionParam();
this.txtTimeoutInSecs.setText(Integer.toString(connectionParam.getTimeoutInSecs()));
txtTimeoutInSecs.discardAllEdits();
checkBoxSingleCookieRequestHeader.setSelected(connectionParam.isSingleCookieRequestHeader());
getProxyExcludedDomainsTableModel().setExcludedDomains(connectionParam.getProxyExcludedDomains());
getProxyExcludedDomainsPanel().setRemoveWithoutConfirmation(!connectionParam.isConfirmRemoveProxyExcludedDomain());
chkUseProxyChain.setSelected(connectionParam.isUseProxyChain());
// set Proxy Chain parameters
txtProxyChainName.setText(connectionParam.getProxyChainName());
txtProxyChainName.discardAllEdits();
// ZAP: Do not allow invalid port numbers
spinnerProxyChainPort.setValue(connectionParam.getProxyChainPort());
chkProxyChainAuth.setSelected(connectionParam.isUseProxyChainAuth());
txtProxyChainRealm.setText(connectionParam.getProxyChainRealm());
txtProxyChainRealm.discardAllEdits();
txtProxyChainUserName.setText(connectionParam.getProxyChainUserName());
txtProxyChainUserName.discardAllEdits();
chkProxyChainPrompt.setSelected(connectionParam.isProxyChainPrompt());
chkShowPassword.setSelected(false);//Default don't show (everytime)
txtProxyChainPassword.setEchoChar('*');//Default mask (everytime)
setProxyChainEnabled(connectionParam.isUseProxyChain());
if (!connectionParam.isProxyChainPrompt()) {
txtProxyChainPassword.setText(connectionParam.getProxyChainPassword());
}
dnsTtlSuccessfulQueriesNumberSpinner.setValue(connectionParam.getDnsTtlSuccessfulQueries());
securityProtocolsPanel.setSecurityProtocolsEnabled(connectionParam.getSecurityProtocolsEnabled());
defaultUserAgent.setText(connectionParam.getDefaultUserAgent());
setUaFromString();
}
private void setProxyChainEnabled(boolean isEnabled) {
txtProxyChainName.setEnabled(isEnabled);
spinnerProxyChainPort.setEnabled(isEnabled);
getProxyExcludedDomainsPanel().setComponentEnabled(isEnabled);
chkProxyChainAuth.setEnabled(isEnabled);
setProxyChainAuthEnabled(isEnabled && chkProxyChainAuth.isSelected());
Color color = Color.WHITE;
if (!isEnabled) {
color = panelProxyChain.getBackground();
}
txtProxyChainName.setBackground(color);
spinnerProxyChainPort.setBackground(color);
}
private void setProxyChainAuthEnabled(boolean isEnabled) {
txtProxyChainRealm.setEnabled(isEnabled);
txtProxyChainUserName.setEnabled(isEnabled);
txtProxyChainPassword.setEnabled(isEnabled);
// ZAP: Added prompt option
chkProxyChainPrompt.setEnabled(isEnabled);
chkShowPassword.setEnabled(isEnabled);
if (chkProxyChainPrompt.isSelected()) {
setProxyChainPromptEnabled(true);
}
Color color = Color.WHITE;
if (!isEnabled) {
// ZAP: Added prompt option
color = panelProxyChain.getBackground();
}
txtProxyChainRealm.setBackground(color);
txtProxyChainUserName.setBackground(color);
txtProxyChainPassword.setBackground(color);
}
private void setProxyChainPromptEnabled(boolean isEnabled) {
txtProxyChainPassword.setEnabled(!isEnabled);
chkShowPassword.setEnabled(!isEnabled);
Color color = Color.WHITE;
if (isEnabled) {
txtProxyChainPassword.setText("");
color = panelProxyChain.getBackground();
}
txtProxyChainPassword.setBackground(color);
}
@Override
public void validateParam(Object obj) throws Exception {
try {
Integer.parseInt(txtTimeoutInSecs.getText());
} catch (NumberFormatException nfe) {
txtTimeoutInSecs.requestFocus();
throw new Exception(Constant.messages.getString("conn.options.timeout.invalid"));
}
if (chkUseProxyChain.isSelected()) {
// ZAP: empty proxy name validation
if(txtProxyChainName.getText().isEmpty()) {
txtProxyChainName.requestFocus();
throw new Exception(Constant.messages.getString("conn.options.proxy.address.empty"));
}
if (chkProxyChainAuth.isSelected() && !chkProxyChainPrompt.isSelected()
&& txtProxyChainUserName.getText().isEmpty()) {
txtProxyChainUserName.requestFocus();
throw new Exception(Constant.messages.getString("conn.options.proxy.username.empty"));
}
}
securityProtocolsPanel.validateSecurityProtocols();
}
@Override
public void saveParam(Object obj) throws Exception {
OptionsParam optionsParam = (OptionsParam) obj;
ConnectionParam connectionParam = optionsParam.getConnectionParam();
int timeout;
try {
timeout = Integer.parseInt(txtTimeoutInSecs.getText());
} catch (NumberFormatException nfe) {
txtTimeoutInSecs.requestFocus();
throw new Exception(Constant.messages.getString("conn.options.timeout.invalid"));
}
connectionParam.setProxyChainName(txtProxyChainName.getText());
// ZAP: Do not allow invalid port numbers
connectionParam.setProxyChainPort(spinnerProxyChainPort.getValue());
connectionParam.setProxyExcludedDomains(getProxyExcludedDomainsTableModel().getElements());
connectionParam.setConfirmRemoveProxyExcludedDomain(!getProxyExcludedDomainsPanel().isRemoveWithoutConfirmation());
connectionParam.setProxyChainRealm(txtProxyChainRealm.getText());
connectionParam.setProxyChainUserName(txtProxyChainUserName.getText());
connectionParam.setProxyChainPrompt(chkProxyChainPrompt.isSelected());
// ZAP: Added prompt option
if (chkUseProxyChain.isSelected() && chkProxyChainAuth.isSelected() && chkProxyChainPrompt.isSelected()) {
if (View.isInitialised()) {
// And prompt now
ProxyDialog dialog = new ProxyDialog(View.getSingleton().getMainFrame(), true);
dialog.init(Model.getSingleton().getOptionsParam());
dialog.setVisible(true);
}
} else {
connectionParam.setProxyChainPassword(new String(txtProxyChainPassword.getPassword()));
}
connectionParam.setTimeoutInSecs(timeout);
connectionParam.setSingleCookieRequestHeader(checkBoxSingleCookieRequestHeader.isSelected());
connectionParam.setUseProxyChain(chkUseProxyChain.isSelected());
connectionParam.setUseProxyChainAuth(chkProxyChainAuth.isSelected());
connectionParam.setDnsTtlSuccessfulQueries(dnsTtlSuccessfulQueriesNumberSpinner.getValue());
connectionParam.setSecurityProtocolsEnabled(securityProtocolsPanel.getSelectedProtocols());
connectionParam.setDefaultUserAgent(defaultUserAgent.getText());
}
/**
* This method initializes txtProxyChainRealm
*
* @return org.zaproxy.zap.utils.ZapTextField
*/
private ZapTextField getTxtProxyChainRealm() {
if (txtProxyChainRealm == null) {
txtProxyChainRealm = new ZapTextField();
}
return txtProxyChainRealm;
}
/**
* This method initializes txtProxyChainUserName
*
* @return org.zaproxy.zap.utils.ZapTextField
*/
private ZapTextField getTxtProxyChainUserName() {
if (txtProxyChainUserName == null) {
txtProxyChainUserName = new ZapTextField();
}
return txtProxyChainUserName;
}
/**
* This method initializes txtProxyChainPassword
*
* @return org.zaproxy.zap.utils.ZapTextField
*/
private JPasswordField getTxtProxyChainPassword() {
if (txtProxyChainPassword == null) {
txtProxyChainPassword = new JPasswordField();
}
return txtProxyChainPassword;
}
/**
* This method initializes chkProxyChainAuth
*
* @return javax.swing.JCheckBox
*/
private JCheckBox getChkProxyChainAuth() {
if (chkProxyChainAuth == null) {
chkProxyChainAuth = new JCheckBox();
chkProxyChainAuth.setText(Constant.messages.getString("conn.options.proxy.auth.required"));
chkProxyChainAuth.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
setProxyChainAuthEnabled(chkProxyChainAuth.isSelected());
}
});
}
return chkProxyChainAuth;
}
private JCheckBox getChkProxyChainPrompt() {
if (chkProxyChainPrompt == null) {
chkProxyChainPrompt = new JCheckBox();
chkProxyChainPrompt.setText(Constant.messages.getString("conn.options.proxy.auth.prompt"));
chkProxyChainPrompt.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
setProxyChainPromptEnabled(chkProxyChainPrompt.isSelected());
}
});
}
return chkProxyChainPrompt;
}
private JPanel getPanelGeneral() {
if (panelGeneral == null) {
java.awt.GridBagConstraints gridBagConstraints01 = new GridBagConstraints();
java.awt.GridBagConstraints gridBagConstraints00 = new GridBagConstraints();
javax.swing.JLabel jLabel = new JLabel();
panelGeneral = new JPanel();
panelGeneral.setLayout(new GridBagLayout());
jLabel.setText(Constant.messages.getString("conn.options.timeout"));
jLabel.setLabelFor(getTxtTimeoutInSecs());
panelGeneral.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
Constant.messages.getString("conn.options.general"),
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,
FontUtils.getFont(FontUtils.Size.standard), java.awt.Color.black));
gridBagConstraints00.gridx = 0;
gridBagConstraints00.gridy = 0;
gridBagConstraints00.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints00.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints00.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints00.weightx = 0.5D;
gridBagConstraints01.gridx = 1;
gridBagConstraints01.gridy = 0;
gridBagConstraints01.weightx = 0.5D;
gridBagConstraints01.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints01.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints01.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints01.ipadx = 50;
panelGeneral.add(jLabel, gridBagConstraints00);
panelGeneral.add(getTxtTimeoutInSecs(), gridBagConstraints01);
java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints();
gbc.gridy = 3;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.insets = new java.awt.Insets(2,2,2,2);
gbc.anchor = java.awt.GridBagConstraints.WEST;
JLabel uaLabel = new JLabel(Constant.messages.getString("conn.options.defaultUserAgent"));
uaLabel.setLabelFor(this.getDefaultUserAgent());
panelGeneral.add(uaLabel, LayoutHelper.getGBC(0, 1, 1,0.5D));
panelGeneral.add(this.getCommonUserAgents(),
LayoutHelper.getGBC(1, 1, 1, 0.5D, new Insets(2,2,2,2)));
panelGeneral.add(this.getDefaultUserAgent(),
LayoutHelper.getGBC(0, 2, 2, 1.0D, new Insets(2,2,2,2)));
panelGeneral.add(getCheckBoxSingleCookeRequestHeader(), gbc);
}
return panelGeneral;
}
private SecurityProtocolsPanel getSecurityProtocolsPanel() {
if (securityProtocolsPanel == null) {
securityProtocolsPanel = new SecurityProtocolsPanel();
}
return securityProtocolsPanel;
}
private ZapTextField getTxtTimeoutInSecs() {
if (txtTimeoutInSecs == null) {
txtTimeoutInSecs = new ZapTextField();
}
return txtTimeoutInSecs;
}
private JCheckBox getCheckBoxSingleCookeRequestHeader() {
if (checkBoxSingleCookieRequestHeader == null) {
checkBoxSingleCookieRequestHeader = new JCheckBox(Constant.messages.getString("conn.options.singleCookieRequestHeader"));
}
return checkBoxSingleCookieRequestHeader;
}
private ProxyExcludedDomainsMultipleOptionsPanel getProxyExcludedDomainsPanel() {
if (proxyExcludedDomainsPanel == null) {
proxyExcludedDomainsPanel = new ProxyExcludedDomainsMultipleOptionsPanel(getProxyExcludedDomainsTableModel());
}
return proxyExcludedDomainsPanel;
}
private ProxyExcludedDomainsTableModel getProxyExcludedDomainsTableModel() {
if (proxyExcludedDomainsTableModel == null) {
proxyExcludedDomainsTableModel = new ProxyExcludedDomainsTableModel();
}
return proxyExcludedDomainsTableModel;
}
@Override
public String getHelpIndex() {
// ZAP: added help index
return "ui.dialogs.options.connection";
}
private static class ProxyExcludedDomainsMultipleOptionsPanel extends
AbstractMultipleOptionsTablePanel<DomainMatcher> {
private static final long serialVersionUID = 2332044353650231701L;
private static final String REMOVE_DIALOG_TITLE = Constant.messages.getString("conn.options.proxy.excluded.domain.dialog.remove.title");
private static final String REMOVE_DIALOG_TEXT = Constant.messages.getString("conn.options.proxy.excluded.domain.dialog.remove.text");
private static final String REMOVE_DIALOG_CONFIRM_BUTTON_LABEL = Constant.messages.getString("conn.options.proxy.excluded.domain.dialog.remove.button.confirm");
private static final String REMOVE_DIALOG_CANCEL_BUTTON_LABEL = Constant.messages.getString("conn.options.proxy.excluded.domain.dialog.remove.button.cancel");
private static final String REMOVE_DIALOG_CHECKBOX_LABEL = Constant.messages.getString("conn.options.proxy.excluded.domain.dialog.remove.checkbox.label");
private DialogAddProxyExcludedDomain addDialog = null;
private DialogModifyProxyExcludedDomain modifyDialog = null;
public ProxyExcludedDomainsMultipleOptionsPanel(ProxyExcludedDomainsTableModel model) {
super(model);
getTable().setVisibleRowCount(5);
getTable().setSortOrder(2, SortOrder.ASCENDING);
}
@Override
public DomainMatcher showAddDialogue() {
if (addDialog == null) {
addDialog = new DialogAddProxyExcludedDomain(View.getSingleton().getOptionsDialog(null));
addDialog.pack();
}
addDialog.setVisible(true);
DomainMatcher hostAuthentication = addDialog.getProxyExcludedDomain();
addDialog.clear();
return hostAuthentication;
}
@Override
public DomainMatcher showModifyDialogue(DomainMatcher e) {
if (modifyDialog == null) {
modifyDialog = new DialogModifyProxyExcludedDomain(View.getSingleton().getOptionsDialog(null));
modifyDialog.pack();
}
modifyDialog.setProxyExcludedDomain(e);
modifyDialog.setVisible(true);
DomainMatcher excludedDomain = modifyDialog.getProxyExcludedDomain();
modifyDialog.clear();
if (!excludedDomain.equals(e)) {
return excludedDomain;
}
return null;
}
@Override
public boolean showRemoveDialogue(DomainMatcher e) {
JCheckBox removeWithoutConfirmationCheckBox = new JCheckBox(REMOVE_DIALOG_CHECKBOX_LABEL);
Object[] messages = { REMOVE_DIALOG_TEXT, " ", removeWithoutConfirmationCheckBox };
int option = JOptionPane.showOptionDialog(
View.getSingleton().getMainFrame(),
messages,
REMOVE_DIALOG_TITLE,
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
new String[] { REMOVE_DIALOG_CONFIRM_BUTTON_LABEL, REMOVE_DIALOG_CANCEL_BUTTON_LABEL },
null);
if (option == JOptionPane.OK_OPTION) {
setRemoveWithoutConfirmation(removeWithoutConfirmationCheckBox.isSelected());
return true;
}
return false;
}
}
} // @jve:decl-index=0:visual-constraint="10,10"