Ejemplo n.º 1
0
  /** Execute command. */
  public void execute(
      final FtpIoSession session, final FtpServerContext context, final FtpRequest request)
      throws IOException, FtpException {

    try {

      // reset state variables
      session.resetState();

      // parse argument
      ListArgument parsedArg = ListArgumentParser.parse(request.getArgument());

      // checl that the directory or file exists
      FtpFile file = session.getFileSystemView().getFile(parsedArg.getFile());

      if (!file.doesExist()) {
        LOG.debug("Listing on a non-existing file");
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN,
                "LIST",
                null));
        return;
      }

      // 24-10-2007 - added check if PORT or PASV is issued, see
      // https://issues.apache.org/jira/browse/FTPSERVER-110
      DataConnectionFactory connFactory = session.getDataConnection();
      if (connFactory instanceof IODataConnectionFactory) {
        InetAddress address = ((IODataConnectionFactory) connFactory).getInetAddress();
        if (address == null) {
          session.write(
              new DefaultFtpReply(
                  FtpReply.REPLY_503_BAD_SEQUENCE_OF_COMMANDS,
                  "PORT or PASV must be issued first"));
          return;
        }
      }

      // get data connection
      session.write(
          LocalizedFtpReply.translate(
              session, request, context, FtpReply.REPLY_150_FILE_STATUS_OKAY, "LIST", null));

      DataConnection dataConnection;
      try {
        dataConnection = session.getDataConnection().openConnection();
      } catch (Exception e) {
        LOG.debug("Exception getting the output data stream", e);
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_425_CANT_OPEN_DATA_CONNECTION,
                "LIST",
                null));
        return;
      }

      // transfer listing data
      boolean failure = false;

      try {
        dataConnection.transferToClient(
            session.getFtpletSession(),
            directoryLister.listFiles(parsedArg, session.getFileSystemView(), LIST_FILE_FORMATER));
      } catch (SocketException ex) {
        LOG.debug("Socket exception during list transfer", ex);
        failure = true;
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED,
                "LIST",
                null));
      } catch (IOException ex) {
        LOG.debug("IOException during list transfer", ex);
        failure = true;
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN,
                "LIST",
                null));
      } catch (IllegalArgumentException e) {
        LOG.debug("Illegal list syntax: " + request.getArgument(), e);
        // if listing syntax error - send message
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
                "LIST",
                null));
      }

      // if data transfer ok - send transfer complete message
      if (!failure) {
        session.write(
            LocalizedFtpReply.translate(
                session,
                request,
                context,
                FtpReply.REPLY_226_CLOSING_DATA_CONNECTION,
                "LIST",
                null));
      }
    } finally {
      session.getDataConnection().closeDataConnection();
    }
  }