/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you 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.apache.ftpserver.impl; | |
import java.net.InetAddress; | |
import java.net.InetSocketAddress; | |
import java.net.SocketAddress; | |
import org.apache.ftpserver.ftplet.FileSystemView; | |
import org.apache.ftpserver.ftplet.FtpRequest; | |
import org.apache.ftpserver.ftplet.FtpStatistics; | |
import org.apache.ftpserver.message.MessageResource; | |
import org.apache.ftpserver.util.DateUtils; | |
/** | |
* A utility class for returning translated messages. The utility method, | |
* <code>translateMessage</code> also expands any variables in the message. | |
* | |
* @author <a href="http://mina.apache.org">Apache MINA Project</a> | |
* | |
*/ | |
public class FtpReplyTranslator { | |
public static final String CLIENT_ACCESS_TIME = "client.access.time"; | |
public static final String CLIENT_CON_TIME = "client.con.time"; | |
public static final String CLIENT_DIR = "client.dir"; | |
public static final String CLIENT_HOME = "client.home"; | |
public static final String CLIENT_IP = "client.ip"; | |
public static final String CLIENT_LOGIN_NAME = "client.login.name"; | |
public static final String CLIENT_LOGIN_TIME = "client.login.time"; | |
public static final String OUTPUT_CODE = "output.code"; | |
public static final String OUTPUT_MSG = "output.msg"; | |
public static final String REQUEST_ARG = "request.arg"; | |
public static final String REQUEST_CMD = "request.cmd"; | |
public static final String REQUEST_LINE = "request.line"; | |
// /////////////////////// All Server Vatiables ///////////////////////// | |
public static final String SERVER_IP = "server.ip"; | |
public static final String SERVER_PORT = "server.port"; | |
public static final String STAT_CON_CURR = "stat.con.curr"; | |
public static final String STAT_CON_TOTAL = "stat.con.total"; | |
public static final String STAT_DIR_CREATE_COUNT = "stat.dir.create.count"; | |
public static final String STAT_DIR_DELETE_COUNT = "stat.dir.delete.count"; | |
public static final String STAT_FILE_DELETE_COUNT = "stat.file.delete.count"; | |
public static final String STAT_FILE_DOWNLOAD_BYTES = "stat.file.download.bytes"; | |
public static final String STAT_FILE_DOWNLOAD_COUNT = "stat.file.download.count"; | |
public static final String STAT_FILE_UPLOAD_BYTES = "stat.file.upload.bytes"; | |
public static final String STAT_FILE_UPLOAD_COUNT = "stat.file.upload.count"; | |
public static final String STAT_LOGIN_ANON_CURR = "stat.login.anon.curr"; | |
public static final String STAT_LOGIN_ANON_TOTAL = "stat.login.anon.total"; | |
public static final String STAT_LOGIN_CURR = "stat.login.curr"; | |
public static final String STAT_LOGIN_TOTAL = "stat.login.total"; | |
public static final String STAT_START_TIME = "stat.start.time"; | |
/** | |
* Returns the translated message. | |
* | |
* @param session | |
* the FTP session for which a reply is to be sent | |
* @param request | |
* the FTP request object | |
* @param context | |
* the FTP server context | |
* @param code | |
* the reply code | |
* @param subId | |
* the ID of the sub message | |
* @param basicMsg | |
* the basic message | |
* @return the translated message | |
*/ | |
public static String translateMessage(FtpIoSession session, | |
FtpRequest request, FtpServerContext context, int code, String subId, | |
String basicMsg) { | |
MessageResource resource = context.getMessageResource(); | |
String lang = session.getLanguage(); | |
String msg = null; | |
if (resource != null) { | |
msg = resource.getMessage(code, subId, lang); | |
} | |
if (msg == null) { | |
msg = ""; | |
} | |
msg = replaceVariables(session, request, context, code, basicMsg, msg); | |
return msg; | |
} | |
/** | |
* Replace server variables. | |
*/ | |
private static String replaceVariables(FtpIoSession session, | |
FtpRequest request, FtpServerContext context, int code, | |
String basicMsg, String str) { | |
int startIndex = 0; | |
int openIndex = str.indexOf('{', startIndex); | |
if (openIndex == -1) { | |
return str; | |
} | |
int closeIndex = str.indexOf('}', startIndex); | |
if ((closeIndex == -1) || (openIndex > closeIndex)) { | |
return str; | |
} | |
StringBuffer sb = new StringBuffer(128); | |
sb.append(str.substring(startIndex, openIndex)); | |
while (true) { | |
String varName = str.substring(openIndex + 1, closeIndex); | |
sb.append(getVariableValue(session, request, context, code, | |
basicMsg, varName)); | |
startIndex = closeIndex + 1; | |
openIndex = str.indexOf('{', startIndex); | |
if (openIndex == -1) { | |
sb.append(str.substring(startIndex)); | |
break; | |
} | |
closeIndex = str.indexOf('}', startIndex); | |
if ((closeIndex == -1) || (openIndex > closeIndex)) { | |
sb.append(str.substring(startIndex)); | |
break; | |
} | |
sb.append(str.substring(startIndex, openIndex)); | |
} | |
return sb.toString(); | |
} | |
/** | |
* Get the variable value. | |
*/ | |
private static String getVariableValue(FtpIoSession session, | |
FtpRequest request, FtpServerContext context, int code, | |
String basicMsg, String varName) { | |
String varVal = null; | |
// all output variables | |
if (varName.startsWith("output.")) { | |
varVal = getOutputVariableValue(session, code, basicMsg, varName); | |
} | |
// all server variables | |
else if (varName.startsWith("server.")) { | |
varVal = getServerVariableValue(session, varName); | |
} | |
// all request variables | |
else if (varName.startsWith("request.")) { | |
varVal = getRequestVariableValue(session, request, varName); | |
} | |
// all statistical variables | |
else if (varName.startsWith("stat.")) { | |
varVal = getStatisticalVariableValue(session, context, varName); | |
} | |
// all client variables | |
else if (varName.startsWith("client.")) { | |
varVal = getClientVariableValue(session, varName); | |
} | |
if (varVal == null) { | |
varVal = ""; | |
} | |
return varVal; | |
} | |
/** | |
* Get client variable value. | |
*/ | |
private static String getClientVariableValue(FtpIoSession session, | |
String varName) { | |
String varVal = null; | |
// client ip | |
if (varName.equals(CLIENT_IP)) { | |
if (session.getRemoteAddress() instanceof InetSocketAddress) { | |
InetSocketAddress remoteSocketAddress = (InetSocketAddress) session.getRemoteAddress(); | |
varVal = remoteSocketAddress.getAddress().getHostAddress(); | |
} | |
} | |
// client connection time | |
else if (varName.equals(CLIENT_CON_TIME)) { | |
varVal = DateUtils.getISO8601Date(session.getCreationTime()); | |
} | |
// client login name | |
else if (varName.equals(CLIENT_LOGIN_NAME)) { | |
if (session.getUser() != null) { | |
varVal = session.getUser().getName(); | |
} | |
} | |
// client login time | |
else if (varName.equals(CLIENT_LOGIN_TIME)) { | |
varVal = DateUtils.getISO8601Date(session.getLoginTime().getTime()); | |
} | |
// client last access time | |
else if (varName.equals(CLIENT_ACCESS_TIME)) { | |
varVal = DateUtils.getISO8601Date(session.getLastAccessTime().getTime()); | |
} | |
// client home | |
else if (varName.equals(CLIENT_HOME)) { | |
varVal = session.getUser().getHomeDirectory(); | |
} | |
// client directory | |
else if (varName.equals(CLIENT_DIR)) { | |
FileSystemView fsView = session.getFileSystemView(); | |
if (fsView != null) { | |
try { | |
varVal = fsView.getWorkingDirectory().getAbsolutePath(); | |
} | |
catch (Exception ex) { | |
varVal = ""; | |
} | |
} | |
} | |
return varVal; | |
} | |
/** | |
* Get output variable value. | |
*/ | |
private static String getOutputVariableValue(FtpIoSession session, | |
int code, String basicMsg, String varName) { | |
String varVal = null; | |
// output code | |
if (varName.equals(OUTPUT_CODE)) { | |
varVal = String.valueOf(code); | |
} | |
// output message | |
else if (varName.equals(OUTPUT_MSG)) { | |
varVal = basicMsg; | |
} | |
return varVal; | |
} | |
/** | |
* Get request variable value. | |
*/ | |
private static String getRequestVariableValue(FtpIoSession session, | |
FtpRequest request, String varName) { | |
String varVal = null; | |
if (request == null) { | |
return ""; | |
} | |
// request line | |
if (varName.equals(REQUEST_LINE)) { | |
varVal = request.getRequestLine(); | |
} | |
// request command | |
else if (varName.equals(REQUEST_CMD)) { | |
varVal = request.getCommand(); | |
} | |
// request argument | |
else if (varName.equals(REQUEST_ARG)) { | |
varVal = request.getArgument(); | |
} | |
return varVal; | |
} | |
/** | |
* Get server variable value. | |
*/ | |
private static String getServerVariableValue(FtpIoSession session, | |
String varName) { | |
String varVal = null; | |
SocketAddress localSocketAddress = session.getLocalAddress(); | |
if (localSocketAddress instanceof InetSocketAddress) { | |
InetSocketAddress localInetSocketAddress = (InetSocketAddress) localSocketAddress; | |
// server address | |
if (varName.equals(SERVER_IP)) { | |
InetAddress addr = localInetSocketAddress.getAddress(); | |
if (addr != null) { | |
varVal = addr.getHostAddress(); | |
} | |
} | |
// server port | |
else if (varName.equals(SERVER_PORT)) { | |
varVal = String.valueOf(localInetSocketAddress.getPort()); | |
} | |
} | |
return varVal; | |
} | |
/** | |
* Get statistical connection variable value. | |
*/ | |
private static String getStatisticalConnectionVariableValue( | |
FtpIoSession session, FtpServerContext context, String varName) { | |
String varVal = null; | |
FtpStatistics stat = context.getFtpStatistics(); | |
// total connection number | |
if (varName.equals(STAT_CON_TOTAL)) { | |
varVal = String.valueOf(stat.getTotalConnectionNumber()); | |
} | |
// current connection number | |
else if (varName.equals(STAT_CON_CURR)) { | |
varVal = String.valueOf(stat.getCurrentConnectionNumber()); | |
} | |
return varVal; | |
} | |
/** | |
* Get statistical directory variable value. | |
*/ | |
private static String getStatisticalDirectoryVariableValue( | |
FtpIoSession session, FtpServerContext context, String varName) { | |
String varVal = null; | |
FtpStatistics stat = context.getFtpStatistics(); | |
// total directory created | |
if (varName.equals(STAT_DIR_CREATE_COUNT)) { | |
varVal = String.valueOf(stat.getTotalDirectoryCreated()); | |
} | |
// total directory removed | |
else if (varName.equals(STAT_DIR_DELETE_COUNT)) { | |
varVal = String.valueOf(stat.getTotalDirectoryRemoved()); | |
} | |
return varVal; | |
} | |
/** | |
* Get statistical file variable value. | |
*/ | |
private static String getStatisticalFileVariableValue(FtpIoSession session, | |
FtpServerContext context, String varName) { | |
String varVal = null; | |
FtpStatistics stat = context.getFtpStatistics(); | |
// total number of file upload | |
if (varName.equals(STAT_FILE_UPLOAD_COUNT)) { | |
varVal = String.valueOf(stat.getTotalUploadNumber()); | |
} | |
// total bytes uploaded | |
else if (varName.equals(STAT_FILE_UPLOAD_BYTES)) { | |
varVal = String.valueOf(stat.getTotalUploadSize()); | |
} | |
// total number of file download | |
else if (varName.equals(STAT_FILE_DOWNLOAD_COUNT)) { | |
varVal = String.valueOf(stat.getTotalDownloadNumber()); | |
} | |
// total bytes downloaded | |
else if (varName.equals(STAT_FILE_DOWNLOAD_BYTES)) { | |
varVal = String.valueOf(stat.getTotalDownloadSize()); | |
} | |
// total number of files deleted | |
else if (varName.equals(STAT_FILE_DELETE_COUNT)) { | |
varVal = String.valueOf(stat.getTotalDeleteNumber()); | |
} | |
return varVal; | |
} | |
/** | |
* Get statistical login variable value. | |
*/ | |
private static String getStatisticalLoginVariableValue( | |
FtpIoSession session, FtpServerContext context, String varName) { | |
String varVal = null; | |
FtpStatistics stat = context.getFtpStatistics(); | |
// total login number | |
if (varName.equals(STAT_LOGIN_TOTAL)) { | |
varVal = String.valueOf(stat.getTotalLoginNumber()); | |
} | |
// current login number | |
else if (varName.equals(STAT_LOGIN_CURR)) { | |
varVal = String.valueOf(stat.getCurrentLoginNumber()); | |
} | |
// total anonymous login number | |
else if (varName.equals(STAT_LOGIN_ANON_TOTAL)) { | |
varVal = String.valueOf(stat.getTotalAnonymousLoginNumber()); | |
} | |
// current anonymous login number | |
else if (varName.equals(STAT_LOGIN_ANON_CURR)) { | |
varVal = String.valueOf(stat.getCurrentAnonymousLoginNumber()); | |
} | |
return varVal; | |
} | |
/** | |
* Get statistical variable value. | |
*/ | |
private static String getStatisticalVariableValue(FtpIoSession session, | |
FtpServerContext context, String varName) { | |
String varVal = null; | |
FtpStatistics stat = context.getFtpStatistics(); | |
// server start time | |
if (varName.equals(STAT_START_TIME)) { | |
varVal = DateUtils.getISO8601Date(stat.getStartTime().getTime()); | |
} | |
// connection statistical variables | |
else if (varName.startsWith("stat.con")) { | |
varVal = getStatisticalConnectionVariableValue(session, context, | |
varName); | |
} | |
// login statistical variables | |
else if (varName.startsWith("stat.login.")) { | |
varVal = getStatisticalLoginVariableValue(session, context, varName); | |
} | |
// file statistical variable | |
else if (varName.startsWith("stat.file")) { | |
varVal = getStatisticalFileVariableValue(session, context, varName); | |
} | |
// directory statistical variable | |
else if (varName.startsWith("stat.dir.")) { | |
varVal = getStatisticalDirectoryVariableValue(session, context, | |
varName); | |
} | |
return varVal; | |
} | |
} |