/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2013 The ZAP Development Team
*
* 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.users;
import java.awt.Dialog;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.zaproxy.zap.authentication.AbstractCredentialsOptionsPanel;
import org.zaproxy.zap.authentication.AuthenticationCredentials;
import org.zaproxy.zap.authentication.AuthenticationMethodType;
import org.zaproxy.zap.model.Context;
import org.zaproxy.zap.users.User;
import org.zaproxy.zap.utils.ZapTextField;
import org.zaproxy.zap.view.AbstractFormDialog;
import org.zaproxy.zap.view.LayoutHelper;
/**
* The Dialog for adding and configuring a new {@link User}.
*/
public class DialogAddUser extends AbstractFormDialog {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -7210879426146833234L;
/** The Constant logger. */
protected static final Logger log = Logger.getLogger(DialogAddUser.class);
private static final String DIALOG_TITLE = Constant.messages.getString("users.dialog.add.title");
private static final String CONFIRM_BUTTON_LABEL = Constant.messages
.getString("users.dialog.add.button.confirm");
private JPanel fieldsPanel;
private AbstractCredentialsOptionsPanel<?> credentialsPanel;
private ZapTextField nameTextField;
protected AuthenticationCredentials configuredCredentials;
private JCheckBox enabledCheckBox;
protected Context workingContext;
protected User user;
/**
* Instantiates a new dialog add user.
*
* @param owner the owner
* @param extension the extension
* @param context the context
*/
public DialogAddUser(Dialog owner, ExtensionUserManagement extension) {
super(owner, DIALOG_TITLE);
}
/**
* Instantiates a new dialog add user.
*
* @param owner the owner
* @param extension the extension
* @param title the title
* @param context the context
*/
public DialogAddUser(Dialog owner, ExtensionUserManagement extension, String title) {
super(owner, title);
}
/**
* Sets the context on which the Dialog is working.
*
* @param context the new working context
*/
public void setWorkingContext(Context context) {
this.workingContext = context;
}
@Override
protected void init() {
if (this.workingContext == null)
throw new IllegalStateException(
"A working Context should be set before setting the 'Add Dialog' visible.");
getEnabledCheckBox().setSelected(true);
// Initialize the credentials that will be configured
configuredCredentials = workingContext.getAuthenticationMethod().createAuthenticationCredentials();
initializeCredentialsConfigPanel();
}
/**
* Initialize credentials config panel.
*/
protected void initializeCredentialsConfigPanel() {
// Initialize the credentials config panel
AuthenticationMethodType type = workingContext.getAuthenticationMethod().getType();
if (type.hasCredentialsOptionsPanel()) {
credentialsPanel = type.buildCredentialsOptionsPanel(configuredCredentials, workingContext);
fieldsPanel.add(credentialsPanel, LayoutHelper.getGBC(0, 3, 2, 1, new Insets(4, 8, 2, 4)));
fieldsPanel.revalidate();
this.pack();
}
}
public void clear() {
this.user = null;
this.workingContext = null;
// Remove previous config panel
if (credentialsPanel != null)
getFieldsPanel().remove(credentialsPanel);
}
@Override
protected boolean validateFields() {
return credentialsPanel.validateFields();
}
@Override
protected void performAction() {
if(this.user!=null)
this.user = new User(workingContext.getIndex(), getNameTextField().getText(), this.user.getId());
else
this.user = new User(workingContext.getIndex(), getNameTextField().getText());
this.user.setEnabled(getEnabledCheckBox().isSelected());
// Make sure the credentials panel saves its changes first
credentialsPanel.saveCredentials();
this.user.setAuthenticationCredentials(credentialsPanel.getCredentials());
}
@Override
protected void clearFields() {
this.nameTextField.setText("");
this.enabledCheckBox.setSelected(true);
this.setConfirmButtonEnabled(false);
}
/**
* Gets the user defined in the dialog, if any.
*
* @return the user, if correctly built or null, otherwise
*/
public User getUser() {
return user;
}
@Override
protected JPanel getFieldsPanel() {
if (fieldsPanel == null) {
fieldsPanel = new JPanel();
fieldsPanel.setLayout(new GridBagLayout());
fieldsPanel.setName("DialogAddUser");
Insets insets = new Insets(4, 8, 2, 4);
JLabel nameLabel = new JLabel(
Constant.messages.getString("users.dialog.add.field.label.name"));
JLabel enabledLabel = new JLabel(
Constant.messages.getString("users.dialog.add.field.label.enabled"));
fieldsPanel.add(nameLabel, LayoutHelper.getGBC(0, 0, 1, 0.5D, insets));
fieldsPanel.add(getNameTextField(), LayoutHelper.getGBC(1, 0, 1, 0.5D, insets));
fieldsPanel.add(enabledLabel, LayoutHelper.getGBC(0, 1, 1, 0.5D, insets));
fieldsPanel.add(getEnabledCheckBox(), LayoutHelper.getGBC(1, 1, 1, 0.5D, insets));
fieldsPanel.add(new JSeparator(), LayoutHelper.getGBC(0, 2, 2, 0.5D, insets));
}
return fieldsPanel;
}
protected ZapTextField getNameTextField() {
if (nameTextField == null) {
nameTextField = new ZapTextField(25);
nameTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
checkValidAndEnableConfirmButton();
}
@Override
public void insertUpdate(DocumentEvent e) {
checkValidAndEnableConfirmButton();
}
@Override
public void changedUpdate(DocumentEvent e) {
checkValidAndEnableConfirmButton();
}
});
}
return nameTextField;
}
protected JCheckBox getEnabledCheckBox() {
if (enabledCheckBox == null) {
enabledCheckBox = new JCheckBox();
}
return enabledCheckBox;
}
/**
* Checks if the fields of the dialog are valid and enable confirm button, if everything is
* valid.
*/
private void checkValidAndEnableConfirmButton() {
setConfirmButtonEnabled(getNameTextField().getDocument().getLength() > 0);
}
@Override
protected String getConfirmButtonLabel() {
return CONFIRM_BUTTON_LABEL;
}
}