/* * Copyright 1999-2006 University of Chicago * * 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.dcache.ftp.client; import org.dcache.ftp.client.exception.ClientException; /** * Represents parameters of an FTP session between a client and a server. */ public class GridFTPSession extends Session { /** * Indicates Extended Block Mode for data transfer. Used with * {@link GridFTPClient#setMode(int) GridFTPClient.setMode()}. */ public static final int MODE_EBLOCK = 3; /** * server in extended passive mode */ public static final int SERVER_EPAS = 3; /** * server in extended active mode */ public static final int SERVER_EACT = 4; /** * Indicates that the data channel will carry the raw data of the file * transfer, with no security applied. Used with * {@link GridFTPClient#setDataChannelProtection(int) * setDataChannelProtection()}. */ public static final int PROTECTION_CLEAR = 1; /** * Indicates that the data will be integrity protected. Used with * {@link GridFTPClient#setDataChannelProtection(int) * setDataChannelProtection()}. */ public static final int PROTECTION_SAFE = 2; /** * Indicates that the data will be confidentiality protected (Currently, not * support by GridFTP servers). Used with * {@link GridFTPClient#setDataChannelProtection(int) * setDataChannelProtection()}. */ public static final int PROTECTION_CONFIDENTIAL = 3; /** * Indicates that the data will be integrity and confidentiality protected. * Used with {@link GridFTPClient#setDataChannelProtection(int) * setDataChannelProtection()}. */ public static final int PROTECTION_PRIVATE = 4; /* default in gridftp - not in gsiftp */ public DataChannelAuthentication dataChannelAuthentication = DataChannelAuthentication.SELF; public int dataChannelProtection = PROTECTION_CLEAR; public int parallel = 1; /** * This concerns local server. if in SERVER_EPAS mode, the server listener * socket list is stored here. If in SERVER_PASV mode, the server listener * sockets is stored in serverAddress variable. */ public HostPortList serverAddressList = null; /** * Sets maxWait to twice the time of DEFAULT_MAX_WAIT */ public GridFTPSession() { maxWait = 2 * DEFAULT_MAX_WAIT; } /** * In addition to the inherited functionality, this method also (1) checks * if extended active / passive server modes are set correctly, (2) checks * if Mode E is needed, and if so, checks whether it has been set. If not, * ClientException is thrown. */ @Override public void matches(Session other) throws ClientException { compareTransferParams(other); compareServerMode(other); if (needsGridFTP() && transferMode != MODE_EBLOCK) { throw new ClientException(ClientException.BAD_MODE, "Extended block mode necessary"); } if (other instanceof GridFTPSession && ((GridFTPSession) other).needsGridFTP() && transferMode != MODE_EBLOCK) { throw new ClientException(ClientException.BAD_MODE, "Extended block mode necessary"); } } // called by inherited matches() method @Override protected void compareServerMode(Session other) throws ClientException { if (transferMode != MODE_EBLOCK) { super.compareServerMode(other); } else { if (serverMode == SERVER_DEFAULT && other.serverMode == SERVER_DEFAULT) { // this is OK } else { // active and passive side had already been set; // make sure that it has been done correctly. // in mode E, source must be active and dest passive if (!((serverMode == SERVER_EACT && other.serverMode == SERVER_EPAS) || (serverMode == SERVER_EPAS && other.serverMode == SERVER_EACT) || (serverMode == SERVER_ACTIVE && other.serverMode == SERVER_PASSIVE) || (serverMode == SERVER_PASSIVE && other.serverMode == SERVER_ACTIVE))) { throw new ClientException(ClientException.BAD_SERVER_MODE, "One server must be active" + " and other must be passive"); } } } } // compareServerMode /** * @return true if this session requires GridFTP extensions; false if it * only requires vanilla FTP. */ public boolean needsGridFTP() { return (parallel > 1 || transferMode == MODE_EBLOCK || (serverMode == GridFTPSession.SERVER_EPAS || serverMode == GridFTPSession.SERVER_EACT)); } }