/*
* Adito
*
* Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.adito.tunnels.forms;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.util.LabelValueBean;
import com.adito.boot.HostService;
import com.adito.boot.PropertyList;
import com.adito.boot.Util;
import com.adito.input.MultiSelectSelectionModel;
import com.adito.input.validators.HostnameOrIPAddressWithReplacementsValidator;
import com.adito.input.validators.IPV4AddressValidator;
import com.adito.policyframework.Resource;
import com.adito.policyframework.forms.AbstractFavoriteResourceForm;
import com.adito.security.SessionInfo;
import com.adito.security.User;
import com.adito.tunnels.TransportType;
import com.adito.tunnels.Tunnel;
/**
* Implementation of {@link AbstractFavoriteResourceForm} suitable for editing
* an <i>SSL Tunnel</i>.
*/
public class TunnelForm extends AbstractFavoriteResourceForm {
static Log log = LogFactory.getLog(TunnelForm.class);
// Private instance variables
private String selectedTab = "details";
private String sourceInterface;
private String sourcePort;
private String destinationHost;
private String destinationPort;
private int tunnelType;
private String transport;
private boolean autoStart;
/*
* (non-Javadoc)
*
* @see com.adito.policyframework.forms.AbstractResourceForm#validate(org.apache.struts.action.ActionMapping,
* javax.servlet.http.HttpServletRequest)
*/
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errs = super.validate(mapping, request);
if (isCommiting()) {
if (!Util.isNullOrTrimmedBlank(sourceInterface)) {
/**
* For remote tunnels, the listening interface must be a valid
* IP address of a network interface on this server
*/
if (getTunnelType() == TransportType.REMOTE_TUNNEL_ID) {
if (!sourceInterface.trim().equals("0.0.0.0") && !sourceInterface.trim().equals("127.0.0.2"))
try {
InetAddress addr = InetAddress.getByName(sourceInterface);
NetworkInterface nif = NetworkInterface.getByInetAddress(addr);
if (nif == null) {
throw new Exception();
}
} catch (Exception e) {
errs.add(Globals.ERROR_KEY, new ActionMessage(
"tunnelWizard.tunnelDetails.error.invalidRemoteSourceInterface"));
}
} else {
/**
* For local tunnels, we do not know what will be a valid IP
* address until the client is running so all we can do is
* validate that it looks like an IP address
*/
if (!IPV4AddressValidator.isIpAddressExpressionValid(sourceInterface)) {
errs.add(Globals.ERROR_KEY, new ActionMessage(
"tunnelWizard.tunnelDetails.error.invalidLocalSourceInterface"));
}
}
}
try {
int port = Integer.valueOf(sourcePort).intValue();
if (port < 0 || port > 65535) {
throw new IllegalArgumentException();
}
} catch (Exception e) {
errs.add(Globals.ERROR_KEY, new ActionMessage("tunnelWizard.tunnelDetails.error.sourcePortNotInteger"));
}
try {
int port = Integer.valueOf(destinationPort).intValue();
if (port < 1 || port > 65535) {
throw new IllegalArgumentException();
}
Integer.valueOf(destinationPort).intValue();
} catch (Exception e) {
errs.add(Globals.ERROR_KEY, new ActionMessage("tunnelWizard.tunnelDetails.error.destinationPortNotInteger"));
}
if (Util.isNullOrTrimmedBlank(destinationHost)) {
errs.add(Globals.ERROR_KEY, new ActionMessage("tunnelWizard.tunnelDetails.error.noDestinationHost"));
} else {
if (!HostnameOrIPAddressWithReplacementsValidator.isValidAsHostOrIp(destinationHost)) {
errs.add(Globals.ERROR_KEY, new ActionMessage("tunnelWizard.tunnelDetails.error.invalidHost"));
}
}
if (getResourceName().equalsIgnoreCase("default")
&& (!getEditing() || (getEditing() && !getResource().getResourceName().equalsIgnoreCase("default")))) {
errs.add(Globals.ERROR_KEY, new ActionMessage("error.createNetworkPlace.cantUseNameDefault"));
setResourceName("");
}
}
return errs;
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#getTabCount()
*/
public int getTabCount() {
return getNavigationContext() == SessionInfo.MANAGEMENT_CONSOLE_CONTEXT ? 3 : 2;
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#getTabName(int)
*/
public String getTabName(int idx) {
switch (idx) {
case 0:
return "details";
case 1:
return "other";
default:
return "policies";
}
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#getTabTitle(int)
*/
public String getTabTitle(int idx) {
// Get from resources
return null;
}
/*
* (non-Javadoc)
*
* @see com.adito.policyframework.forms.AbstractFavoriteResourceForm#initialise(javax.servlet.http.HttpServletRequest,
* com.adito.policyframework.Resource, boolean,
* com.adito.input.MultiSelectSelectionModel,
* com.adito.boot.PropertyList, com.adito.security.User,
* boolean)
*/
public void initialise(HttpServletRequest request, Resource resource, boolean editing, MultiSelectSelectionModel policyModel,
PropertyList selectedPolicies, User owner, boolean assignOnly) throws Exception {
super.initialise(request, resource, editing, policyModel, selectedPolicies, owner, assignOnly);
Tunnel tunnel = (Tunnel) resource;
sourcePort = String.valueOf(tunnel.getSourcePort());
destinationHost = tunnel.getDestination().getHost();
destinationPort = String.valueOf(tunnel.getDestination().getPort());
tunnelType = tunnel.getType();
transport = tunnel.getTransport();
autoStart = tunnel.isAutoStart();
sourceInterface = tunnel.getSourceInterface();
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#getSelectedTab()
*/
public String getSelectedTab() {
return selectedTab;
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#setSelectedTab(java.lang.String)
*/
public void setSelectedTab(String selectedTab) {
this.selectedTab = selectedTab;
}
/*
* (non-Javadoc)
*
* @see com.adito.policyframework.forms.AbstractResourceForm#applyToResource()
*/
public void applyToResource() throws Exception {
Tunnel tunnel = (Tunnel) getResource();
tunnel.setType(getTunnelType());
tunnel.setAutoStart(isAutoStart());
tunnel.setTransport(getTransport());
tunnel.setSourcePort(Integer.parseInt(getSourcePort()));
tunnel.setDestination(new HostService(getDestinationHost(), Integer.parseInt(getDestinationPort())));
tunnel.setSourceInterface(getSourceInterface());
}
/**
* Get the source port
*
* @return source port
*/
public String getSourcePort() {
return sourcePort;
}
/**
* Set the source port
*
* @param sourcePort source port
*/
public void setSourcePort(String sourcePort) {
this.sourcePort = sourcePort;
}
/**
* Get the source interface
*
* @return source interface
*/
public String getSourceInterface() {
return sourceInterface;
}
/**
* Set the source interface
*
* @param sourceInterface source interface
*/
public void setSourceInterface(String sourceInterface) {
this.sourceInterface = sourceInterface;
}
/**
* Get whether the tunnel should auto-start
*
* @return auto start
*/
public boolean isAutoStart() {
return autoStart;
}
/**
* Set whether the tunnel shhould auto-start
*
* @param autoStart auto start
*/
public void setAutoStart(boolean autoStart) {
this.autoStart = autoStart;
}
/**
* Get the destination hostname or IP address
*
* @return destination hostname or IP address
*/
public String getDestinationHost() {
return destinationHost;
}
/**
* Set the destination hostname or IP address
*
* @param destinationHost destination hostname or IP address
*/
public void setDestinationHost(String destinationHost) {
this.destinationHost = destinationHost;
}
/**
* Get the destination port
*
* @return destination port
*/
public String getDestinationPort() {
return destinationPort;
}
/**
* Set the destination port.
*
* @param destinationPort destination port
*/
public void setDestinationPort(String destinationPort) {
this.destinationPort = destinationPort;
}
/**
* Get the tunnel type. This may be one of
* {@link TransportType#REMOTE_TUNNEL_ID} or
* {@link TransportType#LOCAL_TUNNEL_ID}.
*
* @return tunnel type
*/
public int getTunnelType() {
return tunnelType;
}
/**
* Set the tunnel type. This may be one of
* {@link TransportType#REMOTE_TUNNEL_ID} or
* {@link TransportType#LOCAL_TUNNEL_ID}.
*
* @param tunnelType tunnel type
*/
public void setTunnelType(int tunnelType) {
this.tunnelType = tunnelType;
}
/**
* Set the tunnel trasport. This may be one of
* {@link TransportType#TCP_TUNNEL} or {@link TransportType#UDP_TUNNEL}.
*
* @param transport transport type
*/
public void setTransport(String transport) {
this.transport = transport;
}
/**
* Get the tunnel trasport. This may be one of
* {@link TransportType#TCP_TUNNEL} or {@link TransportType#UDP_TUNNEL}.
*
* @return transport type
*/
public String getTransport() {
return transport;
}
/**
* Get a list of available tunnel types as {@link LabelValueBean} objects.
*
* @return tunnel types
*/
public List getTunnelTypeList() {
return TransportType.TYPES;
}
/**
* Get a list of available tunnel transports as {@link LabelValueBean}
* objects.
*
* @return tunnel types
*/
public List getTransportList() {
return TransportType.TRANSPORTS;
}
/**
* Get the tunnel type as a string
*
* @return tunnel type string
*/
public String getTunnelTypeString() {
return ((LabelValueBean) getTunnelTypeList().get(getTunnelType())).getLabel();
}
/*
* (non-Javadoc)
*
* @see com.adito.policyframework.forms.AbstractFavoriteResourceForm#reset(org.apache.struts.action.ActionMapping,
* javax.servlet.http.HttpServletRequest)
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset(mapping, request);
this.sourceInterface = "127.0.0.1";
this.autoStart = false;
}
/*
* (non-Javadoc)
*
* @see com.adito.tabs.TabModel#getTabBundle(int)
*/
public String getTabBundle(int idx) {
return null;
}
}