| /* |
| * 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; |
| } |
| |
| StringBuilder sb = new StringBuilder(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; |
| } |
| |
| } |