/*******************************************************************************
* Copyright (c) 2011, 2016 Eurotech and/or its affiliates
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eurotech
*******************************************************************************/
package org.eclipse.kura.web.client.firewall;
import org.eclipse.kura.web.client.messages.Messages;
import org.eclipse.kura.web.client.util.TextFieldValidator;
import org.eclipse.kura.web.client.util.TextFieldValidator.FieldType;
import org.eclipse.kura.web.shared.model.GwtFirewallOpenPortEntry;
import org.eclipse.kura.web.shared.model.GwtNetProtocol;
import org.eclipse.kura.web.shared.model.GwtSession;
import com.allen_sauer.gwt.log.client.Log;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.LabelField;
import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Element;
public class OpenPortForm extends Window {
private static final Messages MSGS = GWT.create(Messages.class);
private static final int LABEL_WIDTH_FORM = 190;
//private GwtSession m_currentSession;
private GwtFirewallOpenPortEntry m_newOpenPortEntry;
private GwtFirewallOpenPortEntry m_existingOpenPortEntry;
private FormPanel m_formPanel;
private Status m_status;
private TextField<String> m_permittedInterfaceName;
private TextField<String> m_unpermittedInterfaceName;
private boolean m_isCanceled;
public OpenPortForm(GwtSession session) {
//m_currentSession = session;
m_existingOpenPortEntry = null;
setModal(true);
setSize(600, 500);
setLayout(new FitLayout());
setResizable(false);
String heading = MSGS.firewallOpenPortFormNew();
setHeading(heading);
}
public OpenPortForm(GwtSession session, GwtFirewallOpenPortEntry existingEntry) {
this(session);
m_existingOpenPortEntry = existingEntry;
if (m_existingOpenPortEntry != null) {
setHeading(MSGS.firewallOpenPortFormUpdate(m_existingOpenPortEntry.getPortRange()));
}
}
public GwtFirewallOpenPortEntry getNewOpenPortEntry() {
return m_newOpenPortEntry;
}
public GwtFirewallOpenPortEntry getExistingOpenPortEntry() {
return m_existingOpenPortEntry;
}
public boolean isCanceled() {
return m_isCanceled;
}
protected void onRender(Element parent, int index) {
super.onRender(parent, index);
setId("firewall-open-port-form-wrapper");
FormData formData = new FormData("-30");
m_formPanel = new FormPanel();
m_formPanel.setFrame(false);
m_formPanel.setBodyBorder(true);
m_formPanel.setHeaderVisible(false);
m_formPanel.setScrollMode(Scroll.AUTOY);
m_formPanel.setLayout(new FlowLayout());
FieldSet fieldSet = new FieldSet();
fieldSet.setHeading(MSGS.firewallOpenPortFormInformation());
FormLayout layoutAccount = new FormLayout();
layoutAccount.setLabelWidth(LABEL_WIDTH_FORM);
fieldSet.setLayout(layoutAccount);
//
// port (or range of ports) to be opened for inbound connections
//
final LabelField portLabel = new LabelField();
portLabel.setName("portLabel");
portLabel.setFieldLabel(MSGS.firewallOpenPortFormPort());
portLabel.setLabelSeparator(":");
fieldSet.add(portLabel, formData);
final TextField<String> portField = new TextField<String>();
portField.setAllowBlank(false);
portField.setName("port");
portField.setFieldLabel(MSGS.firewallOpenPortFormPort());
portField.setValidator(new TextFieldValidator(portField, FieldType.PORT_RANGE));
portField.setToolTip(MSGS.firewallOpenPortFormPortToolTip());
fieldSet.add(portField, formData);
//
// protocol
//
final LabelField protocolLabel = new LabelField();
protocolLabel.setName("protocolLabel");
protocolLabel.setFieldLabel(MSGS.firewallOpenPortFormProtocol());
protocolLabel.setLabelSeparator(":");
fieldSet.add(protocolLabel, formData);
final SimpleComboBox<String> protocolCombo = new SimpleComboBox<String>();
protocolCombo.setName("protocolCombo");
protocolCombo.setFieldLabel(MSGS.firewallOpenPortFormProtocol());
protocolCombo.setEditable(false);
protocolCombo.setTypeAhead(true);
protocolCombo.setTriggerAction(TriggerAction.ALL);
for (GwtNetProtocol protocol : GwtNetProtocol.values()) {
protocolCombo.add(protocol.name());
}
protocolCombo.setSimpleValue(GwtNetProtocol.tcp.name());
protocolCombo.setToolTip(MSGS.firewallOpenPortFormProtocolToolTip());
fieldSet.add(protocolCombo, formData);
//
// permitted network
//
final TextField<String> permittedNetworkField = new TextField<String>();
permittedNetworkField.setAllowBlank(true);
permittedNetworkField.setName("permittedNetwork");
permittedNetworkField.setFieldLabel(MSGS.firewallOpenPortFormPermittedNetwork());
permittedNetworkField.setValidator(new TextFieldValidator(permittedNetworkField, FieldType.NETWORK));
permittedNetworkField.setToolTip(MSGS.firewallOpenPortFormPermittedNetworkToolTip());
fieldSet.add(permittedNetworkField, formData);
//
// permitted network interface
//
m_permittedInterfaceName = new TextField<String>();
m_permittedInterfaceName.setAllowBlank(true);
m_permittedInterfaceName.setName("permittedInterfaceName");
m_permittedInterfaceName.setFieldLabel(MSGS.firewallOpenPortFormPermittedInterfaceName());
m_permittedInterfaceName.setValidator(new TextFieldValidator(m_permittedInterfaceName, FieldType.ALPHANUMERIC));
m_permittedInterfaceName.setToolTip(MSGS.firewallOpenPortFormPermittedInterfaceToolTip());
m_permittedInterfaceName.addListener(Events.Change, new Listener<FieldEvent>() {
public void handleEvent(FieldEvent be) {
if (be.getValue() != null) {
m_unpermittedInterfaceName.disable();
}
else {
m_unpermittedInterfaceName.enable();
}
}
});
fieldSet.add(m_permittedInterfaceName, formData);
//
// unpermitted network interface
//
m_unpermittedInterfaceName = new TextField<String>();
m_unpermittedInterfaceName.setAllowBlank(true);
m_unpermittedInterfaceName.setName("unpermittedInterfaceName");
m_unpermittedInterfaceName.setFieldLabel(MSGS.firewallOpenPortFormUnpermittedInterfaceName());
m_unpermittedInterfaceName.setValidator(new TextFieldValidator(m_unpermittedInterfaceName, FieldType.ALPHANUMERIC));
m_unpermittedInterfaceName.setToolTip(MSGS.firewallOpenPortFormUnpermittedInterfaceToolTip());
m_unpermittedInterfaceName.addListener(Events.Change, new Listener<FieldEvent>() {
public void handleEvent(FieldEvent be) {
if (be.getValue() != null) {
m_permittedInterfaceName.disable();
}
else {
m_permittedInterfaceName.enable();
}
}
});
fieldSet.add(m_unpermittedInterfaceName, formData);
//
// permitted MAC
//
final TextField<String> permittedMacField = new TextField<String>();
permittedMacField.setAllowBlank(true);
permittedMacField.setName("permittedMac");
permittedMacField.setFieldLabel(MSGS.firewallOpenPortFormPermittedMac());
permittedMacField.setValidator(new TextFieldValidator(permittedMacField, FieldType.MAC_ADDRESS));
permittedMacField.setToolTip(MSGS.firewallOpenPortFormPermittedMacAddress());
fieldSet.add(permittedMacField, formData);
//
// source port range
//
final TextField<String> sourcePortRangeField = new TextField<String>();
sourcePortRangeField.setAllowBlank(true);
sourcePortRangeField.setName("sourcePortRange");
sourcePortRangeField.setFieldLabel(MSGS.firewallOpenPortFormSourcePortRange());
sourcePortRangeField.setValidator(new TextFieldValidator(sourcePortRangeField, FieldType.PORT_RANGE));
sourcePortRangeField.setToolTip(MSGS.firewallOpenPortFormSourcePortRangeToolTip());
fieldSet.add(sourcePortRangeField, formData);
//add the fieldSet to the panel
m_formPanel.add(fieldSet);
//disable the labels
portLabel.setVisible(false);
protocolLabel.setVisible(false);
m_status = new Status();
m_status.setBusy(MSGS.waitMsg());
m_status.hide();
m_status.setAutoWidth(true);
m_formPanel.setButtonAlign(HorizontalAlignment.LEFT);
m_formPanel.getButtonBar().add(m_status);
m_formPanel.getButtonBar().add(new FillToolItem());
m_formPanel.addButton(new Button(MSGS.submitButton(), new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
// make sure all visible fields are valid before performing the action
for (Field<?> field : m_formPanel.getFields()) {
if (field.isVisible() && !field.isValid()) {
return;
}
}
Log.debug("Open port fields are visible and valid...");
//we need to add a new row to the open ports table
if(m_existingOpenPortEntry == null) {
//create a new entry
m_newOpenPortEntry = new GwtFirewallOpenPortEntry();
m_newOpenPortEntry.setPortRange(portField.getValue());
m_newOpenPortEntry.setProtocol(protocolCombo.getValue().getValue());
if(permittedNetworkField.getValue() != null) {
m_newOpenPortEntry.setPermittedNetwork(permittedNetworkField.getValue());
}
else {
m_newOpenPortEntry.setPermittedNetwork("0.0.0.0/0");
}
if(m_permittedInterfaceName.getValue() != null) {
m_newOpenPortEntry.setPermittedInterfaceName(m_permittedInterfaceName.getValue());
}
if(m_unpermittedInterfaceName.getValue() != null) {
m_newOpenPortEntry.setUnpermittedInterfaceName(m_unpermittedInterfaceName.getValue());
}
if(permittedMacField.getValue() != null) {
m_newOpenPortEntry.setPermittedMAC(permittedMacField.getValue());
}
if(sourcePortRangeField.getValue() != null) {
m_newOpenPortEntry.setSourcePortRange(sourcePortRangeField.getValue());
}
} else {
//update the current entry
m_existingOpenPortEntry = new GwtFirewallOpenPortEntry();
m_existingOpenPortEntry.setPortRange(portField.getValue());
m_existingOpenPortEntry.setProtocol(protocolCombo.getValue().getValue());
if(permittedNetworkField.getValue() != null) {
m_existingOpenPortEntry.setPermittedNetwork(permittedNetworkField.getValue());
}
else {
m_existingOpenPortEntry.setPermittedNetwork("0.0.0.0/0");
}
if(m_permittedInterfaceName.getValue() != null) {
m_existingOpenPortEntry.setPermittedInterfaceName(m_permittedInterfaceName.getValue());
}
if(m_unpermittedInterfaceName.getValue() != null) {
m_existingOpenPortEntry.setUnpermittedInterfaceName(m_unpermittedInterfaceName.getValue());
}
if(permittedMacField.getValue() != null) {
m_existingOpenPortEntry.setPermittedMAC(permittedMacField.getValue());
}
if(sourcePortRangeField.getValue() != null) {
m_existingOpenPortEntry.setSourcePortRange(sourcePortRangeField.getValue());
}
}
m_isCanceled = false;
hide();
}
}));
m_formPanel.addButton(new Button(MSGS.cancelButton(), new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
m_isCanceled = true;
hide();
}
}));
m_formPanel.setButtonAlign(HorizontalAlignment.CENTER);
// populate if necessary
if (m_existingOpenPortEntry != null) {
portLabel.setValue(m_existingOpenPortEntry.getPortRange());
portField.setValue(m_existingOpenPortEntry.getPortRange());
portField.setOriginalValue(m_existingOpenPortEntry.getPortRange());
protocolLabel.setValue(m_existingOpenPortEntry.getProtocol());
protocolCombo.setSimpleValue(m_existingOpenPortEntry.getProtocol());
permittedNetworkField.setValue(m_existingOpenPortEntry.getPermittedNetwork());
permittedNetworkField.setOriginalValue(m_existingOpenPortEntry.getPermittedNetwork());
m_permittedInterfaceName.setValue(m_existingOpenPortEntry.getPermittedInterfaceName());
m_permittedInterfaceName.setOriginalValue(m_existingOpenPortEntry.getPermittedInterfaceName());
m_unpermittedInterfaceName.setValue(m_existingOpenPortEntry.getUnpermittedInterfaceName());
m_unpermittedInterfaceName.setOriginalValue(m_existingOpenPortEntry.getUnpermittedInterfaceName());
permittedMacField.setValue(m_existingOpenPortEntry.getPermittedMAC());
permittedMacField.setOriginalValue(m_existingOpenPortEntry.getPermittedMAC());
sourcePortRangeField.setValue(m_existingOpenPortEntry.getSourcePortRange());
sourcePortRangeField.setOriginalValue(m_existingOpenPortEntry.getSourcePortRange());
}
add(m_formPanel);
}
}