//*****************************************************************************
//*
//* (c) Copyright 2002. Glub Tech, Incorporated. All Rights Reserved.
//*
//* $Id: FTPSession.java 37 2009-05-11 22:46:15Z gary $
//*
//*****************************************************************************
package com.glub.secureftp.client.framework;
import com.glub.secureftp.bean.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
public class FTPSession {
public static final short NO_SECURITY = 0;
public static final short EXPLICIT_SSL = 1;
public static final short IMPLICIT_SSL = 2;
private String userName = null;
private String password = null;
private String account = null;
private String hostName = null;
private int port = Constants.DEF_IMPLICIT_SSL_PORT;
private File localDir = null;
private String pwd = "";
private boolean interactiveOn = true;
private boolean globOn = true;
private boolean beepWhenDone = true;
private boolean debugOn = false;
private boolean showProgress = true;
private boolean reportVerbose = true;
private boolean isSecure = false;
private boolean canRestartTransfer = true;
private FTP ftpBean = null;
private short securityMode = IMPLICIT_SSL;
private boolean maskPass = true;
private OutputStream outputStream = System.out;
private boolean supportsMDTM = true;
private boolean supportsSIZE = true;
private boolean testForREST = true;
private boolean supportsREST = false;
private boolean useProxy = false;
private boolean useCCC = false;
private FTPAbortableTransfer listAbort = null;
private boolean isTransferringData = false;
private long lastCommandSent = 0L;
private File keyStoreFile = null;
private SSLCertificateHandler certHandler = null;
private SSLCertificate currentCertificate = null;
private Container remoteUI = null;
public FTPSession() {
this( null, null, null, null, 0, false, null );
}
public FTPSession( String userName, String password, String account,
String hostName, int port, boolean isSecure,
SSLCertificateHandler certHandler ) {
setUserName( userName );
setPassword( password );
setAccount( account );
setHostName( hostName );
setPort( port );
setIsSecure( isSecure );
setCertHandler( certHandler );
setOutputStream( System.out );
try {
File startDir = new File(System.getProperty("user.dir"));
// this should never happen!!!
if (!startDir.exists() || !startDir.isDirectory())
return;
setLocalDir( new File(startDir.getCanonicalPath()) );
} catch ( Exception e ) {}
initKeyStoreFile();
}
public FTPSession ( FTPSession session ) {
setUserName( session.getUserName() );
setPassword( session.getPassword() );
setAccount( session.getAccount() );
setHostName( session.getHostName() );
setPort( session.getPort() );
setIsSecure( session.isSecure() );
setCertHandler( session.getCertHandler() );
setOutputStream( session.getOutputStream() );
try {
setLocalDir( session.getLocalDir() );
} catch ( Exception e ) {}
setWorkingDir( session.getWorkingDir() );
setInteractiveOn( session.isInteractiveOn() );
setGlobOn( session.isGlobOn() );
setBeepWhenDone( session.getBeepWhenDone() );
setDebugOn( session.isDebugOn() );
setShowProgress( session.showProgress() );
setReportVerbose( session.reportVerbose() );
setSecurityMode( session.getSecurityMode() );
setTransferRestartable( session.canRestartTransfer() );
setMaskPass( session.maskPass() );
setFTPBean( session.getFTPBean() );
setRemoteUI( session.getRemoteUI() );
initKeyStoreFile();
}
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append( "Hostname => " + getHostName() );
buffer.append( ", Username => " + getUserName() );
buffer.append( ", Password => **********" );
buffer.append( ", Account => " + getAccount() );
buffer.append( ", Port => " + getPort() );
buffer.append( ", Security Mode => " + getSecurityMode() );
buffer.append( ", Is Secure => " + isSecure() );
buffer.append( ", Local Dir => " + localDir.getAbsolutePath() );
buffer.append( ", Current Working Dir => " + getWorkingDir() );
return buffer.toString();
}
public void clearSession() {
setHostName(null);
setPort(0);
setUserName(null);
setPassword(null);
setAccount(null);
setIsSecure(false);
setCurrentCertificate(null);
setSecurityMode(IMPLICIT_SSL);
}
public boolean isTransferringData() { return isTransferringData; }
public void setTransferringData( boolean transferring ) {
isTransferringData = transferring;
}
public long getLastCommandSent() { return lastCommandSent; }
public void setLastCommandSent( long now ) { lastCommandSent = now; }
public String getUserName() { return userName; }
public void setUserName( String userName ) {
if ( null != userName ) {
userName = userName.trim();
}
this.userName = userName;
}
public String getPassword() { return password; }
public void setPassword( String password ) { this.password = password; }
public String getAccount() { return account; }
public void setAccount( String account ) { this.account = account; }
public String getHostName() { return hostName; }
public void setHostName( String hostName ) {
if ( null != hostName ) {
hostName = hostName.trim();
}
this.hostName = hostName;
}
public int getPort() { return port; }
public void setPort( int port ) { this.port = port; }
public SSLCertificate getCurrentCertificate() {
if ( null == currentCertificate ) {
Socket socket = getFTPBean().getControlSocket();
if ( socket instanceof SSLSocket ) {
javax.net.ssl.SSLSession session = ((SSLSocket)socket).getSession();
try {
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate)session.getPeerCertificates()[0];
currentCertificate = new SSLCertificate( cert );
}
catch ( Exception e ) {
currentCertificate = new SSLCertificate( null );
}
}
}
return currentCertificate;
}
public void setCurrentCertificate(SSLCertificate cert) {
currentCertificate = cert;
}
public File getKeyStoreFile() { return keyStoreFile; }
public void initKeyStoreFile() {
String home = (String) System.getProperty("user.home") +
File.separator + ".secureftp";
File dir = new File(home);
if (! dir.isAbsolute())
dir = new File( (String) System.getProperty("user.dir") +
File.separator + home );
if (! dir.isDirectory()) {
if (! dir.mkdirs()) {
return;
}
}
keyStoreFile = new File( dir, "cert.key" );
}
public File getLocalDir() { return localDir; }
public void setLocalDir( File localDir ) throws FileNotFoundException {
if ( null == localDir ) {
// it's ok, just disable downloading
}
else if ( !localDir.isDirectory() )
throw new FileNotFoundException(localDir + " is not a directory");
else if ( !localDir.exists() )
throw new FileNotFoundException(localDir + " does not exist");
this.localDir = localDir;
}
public void setLocalDir( String localDirStr ) throws FileNotFoundException {
setLocalDir( new File(localDirStr) );
}
public String getWorkingDir() { return pwd; }
public void setWorkingDir( String workingDir ) { pwd = workingDir; }
public boolean isInteractiveOn() { return interactiveOn; }
public void setInteractiveOn( boolean interactiveOn ) {
this.interactiveOn = interactiveOn;
}
public boolean isGlobOn() { return globOn; }
public void setGlobOn( boolean globOn ) {
this.globOn = globOn;
}
public boolean getBeepWhenDone() { return beepWhenDone; }
public void setBeepWhenDone( boolean beepWhenDone ) {
this.beepWhenDone = beepWhenDone;
}
public boolean isDebugOn() { return debugOn; }
public void setDebugOn( boolean debugOn ) { this.debugOn = debugOn; }
public boolean isConnected() {
boolean isConnected = false;
if ( getFTPBean() != null ) {
isConnected = getFTPBean().isConnected();
}
if ( !isConnected ) {
//setIsSecure(false);
clearSession();
}
return isConnected;
}
public boolean isLoggedIn() {
boolean isLoggedIn = false;
if ( getFTPBean() != null ) {
isLoggedIn = getFTPBean().isLoggedIn();
}
return isLoggedIn;
}
public boolean showProgress() { return showProgress; }
public void setShowProgress( boolean showProgress ) {
this.showProgress = showProgress;
}
public boolean reportVerbose() { return reportVerbose; }
public void setReportVerbose( boolean reportVerbose ) {
this.reportVerbose = reportVerbose;
}
public boolean isSecure() { return isSecure; }
public void setIsSecure( boolean isSecure ) {
this.isSecure = isSecure;
}
public short getSecurityMode() { return securityMode; }
public void setSecurityMode( short securityMode ) {
this.securityMode = securityMode;
}
public boolean canRestartTransfer() { return canRestartTransfer; }
public void setTransferRestartable( boolean canRestart ) {
canRestartTransfer = canRestart;
}
public OutputStream getOutputStream() { return outputStream; }
public void setOutputStream( OutputStream outputStream ) {
this.outputStream = outputStream;
}
public PrintStream getPrintStream() {
PrintStream ps = null;
if ( System.out == getOutputStream() || !reportVerbose() ) {
ps = System.out;
}
else {
ps = new PrintStream( getOutputStream() );
}
return ps;
}
public boolean maskPass() { return maskPass; }
public void setMaskPass( boolean maskPass ) { this.maskPass = maskPass; }
public FTP getFTPBean() { return ftpBean; }
public void setFTPBean( FTP ftpBean ) {
this.ftpBean = ftpBean;
}
public SSLCertificateHandler getCertHandler() {
return certHandler;
}
public void setCertHandler( SSLCertificateHandler certHandler ) {
this.certHandler = certHandler;
}
public Container getRemoteUI() { return remoteUI; }
public void setRemoteUI( Container remoteUI ) { this.remoteUI = remoteUI; }
public boolean supportsMDTM() { return supportsMDTM; }
public void setSupportsMDTM( boolean supports ) { supportsMDTM = supports; }
public boolean supportsSIZE() { return supportsSIZE; }
public void setSupportsSIZE( boolean supports ) { supportsSIZE = supports; }
public boolean testForREST() { return testForREST; }
public void setTestForREST( boolean test ) { testForREST = test; }
public boolean supportsREST() { return supportsREST; }
public void setSupportsREST( boolean supports ) { supportsREST = supports; }
public boolean usesProxy() { return useProxy; }
public void setUseProxy( boolean useProxy ) { this.useProxy = useProxy; }
public boolean useCCC() { return useCCC; }
public void setUseCCC( boolean useCCC ) { this.useCCC = useCCC; }
public FTPAbortableTransfer getAbortableListTransfer() { return listAbort; }
public void setAbortableListTransfer( FTPAbortableTransfer abort ) {
listAbort = abort;
}
}