package cn.jcenterhome.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPSClient;
public class FtpUtil {
private static final int JC_FTPClientYES = 1;
private static final int JC_FTPClientNO = -1;
private static final int JC_FTPClientException = -2;
private FTPClient fc;
public int sftp_connect(HttpServletRequest request) {
Map<String, Object> setting = (Map<String, Object>) request.getAttribute("globalSetting");
int ftpssl = Common.intval(setting.get("ftpssl") + "");
String ftphost = setting.get("ftphost") + "";
int ftpport = Common.intval(setting.get("ftpport") + "");
String ftpuser = setting.get("ftpuser") + "";
String ftppassword = setting.get("ftppassword") + "";
int ftppasv = Common.intval(setting.get("ftppasv") + "");
String ftpdir = setting.get("ftpdir") + "";
int ftptimeout = Common.intval(setting.get("ftptimeout") + "");
if (ftpssl > 0) {
try {
fc = new FTPSClient();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return JC_FTPClientException;
}
}else{
fc = new FTPClient();
}
try {
fc.setConnectTimeout(20000);
InetAddress inetAddress = InetAddress.getByName(ftphost);
fc.connect(inetAddress, ftpport);
if (fc.login(ftpuser, ftppassword)) {
if (ftppasv > 0) {
fc.pasv();
}
if (ftptimeout > 0) {
fc.setDataTimeout(ftptimeout);
}
if (fc.changeWorkingDirectory(ftpdir)) {
return JC_FTPClientYES;
} else {
FileHelper.writeLog(request, "FTP", "CHDIR " + ftpdir + " ERROR.");
try {
fc.disconnect();
fc = null;
} catch (Exception e1) {
}
return JC_FTPClientNO;
}
} else {
FileHelper.writeLog(request, "FTP", "530 NOT LOGGED IN.");
try {
fc.disconnect();
fc = null;
} catch (Exception e1) {
}
return JC_FTPClientNO;
}
} catch (Exception e) {
FileHelper.writeLog(request, "FTP", "COULDN'T CONNECT TO " + ftphost + ":" + ftpport + ".");
e.printStackTrace();
if (fc != null) {
try {
fc.disconnect();
fc = null;
} catch (Exception e1) {
}
}
return JC_FTPClientException;
}
}
public void sftp_close() {
if (fc != null) {
try {
fc.disconnect();
} catch (IOException e) {
e.printStackTrace();
} finally {
fc = null;
}
}
}
public boolean sftp_delete(HttpServletRequest request, String deletPath) {
try {
if (fc != null) {
deletPath = wipespecial(deletPath);
fc.deleteFile(deletPath);
return true;
} else {
if (sftp_connect(request) > 1) {
return sftp_delete(request, deletPath);
} else {
return false;
}
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private String wipespecial(String str) {
str = str.replace("..", "").replace("\n", "").replace("\r", "");
return str;
}
public boolean ftpUpload(HttpServletRequest request, String source, String destination) {
Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal");
if (
sftp_connect(request) < 0) {
return false;
}
String[] dirs = null;
String[] temporaryDirs = destination.split("/");
if(temporaryDirs.length > 1){
if(temporaryDirs[0].equals("")){
temporaryDirs[0] = "/";
}
if(temporaryDirs[0].equals(".")){
temporaryDirs[0] = "/";
int dirsL = temporaryDirs.length - 2;
dirs = new String[dirsL];
System.arraycopy(temporaryDirs, 1, dirs, 0, dirsL);
}else{
int dirsL = temporaryDirs.length - 1;
dirs = new String[dirsL];
System.arraycopy(temporaryDirs, 0, dirs, 0, dirsL);
}
destination = temporaryDirs[temporaryDirs.length-1];
}else{
dirs = new String[0];
}
for(String dir : dirs){
if (!sftp_chdir(dir)) {
if (!sftp_mkdir(dir)) {
FileHelper.writeLog(request, "FTP", "MKDIR '" + dir + "' ERROR.");
return false;
}
if (!sftp_chmod("0777", dir)) {
sftp_site("'CHMOD 0777 " + dir + "'");
}
if (!sftp_chdir(dir)) {
FileHelper.writeLog(request, "FTP", "CHDIR '" + dir + "' ERROR");
return false;
}
sftp_put("index.htm", JavaCenterHome.jchRoot + "./data/index.htm", FTP.BINARY_FILE_TYPE, 0);
}
}
if (sftp_put(destination, source, FTP.BINARY_FILE_TYPE, 0)) {
File file = new File(source + ".thumb.jpg");
if (file.exists()) {
if (sftp_put(destination + ".thumb.jpg", source + ".thumb.jpg", FTP.BINARY_FILE_TYPE, 0)) {
file.delete();
new File(source).delete();
sftp_close();
return true;
} else {
sftp_delete(request, destination);
}
} else {
new File(source).delete();
sftp_close();
return true;
}
}
FileHelper.writeLog(request, "FTP", "Upload '" + source + "' To '" + destination + "' error.");
return false;
}
public boolean sftp_put(String remoteFile, String localFile, int mode, int startPos) {
remoteFile = wipespecial(remoteFile);
localFile = wipespecial(localFile);
InputStream inputStream = null;
boolean flag = false;
try {
inputStream = new FileInputStream(localFile);
if (startPos > 0) {
inputStream.skip(startPos - 1);
}
fc.setFileType(mode);
flag = fc.storeFile(remoteFile, inputStream);
} catch (IOException e) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
return flag;
}
public boolean sftp_chmod(String mode, String filename) {
int mod = Common.intval(mode);
filename = wipespecial(filename);
return sftp_site("CHMOD " + mod + " " + filename);
}
public boolean sftp_site(String cmd) {
boolean flag = false;
cmd = wipespecial(cmd);
try {
flag = fc.sendSiteCommand(cmd);
} catch (IOException e) {
}
return flag;
}
public boolean sftp_mkdir(String directory) {
directory = wipespecial(directory);
try {
return fc.makeDirectory(directory);
} catch (IOException e) {
return false;
}
}
public boolean sftp_chdir(String directory) {
directory = wipespecial(directory);
try {
return fc.changeWorkingDirectory(directory);
} catch (IOException e) {
return false;
}
}
}