client/ftpd/src/se/lu/thep/coreftpd/ftp_server/FTPNewConnection.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic, Olle Mansson
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25 //  Xerver Free Web Server
741 10 Oct 06 olle 26 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 27 //
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 30 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 31 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 32 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 33 //
741 10 Oct 06 olle 34 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 35 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 36 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 37 //  GNU General Public License for more details.
741 10 Oct 06 olle 38 //
741 10 Oct 06 olle 39 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 40 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 41 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 42 //
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //  #############################################################
741 10 Oct 06 olle 45 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 46 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 47 //  ##                                                         ##
741 10 Oct 06 olle 48 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 49 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 50 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 51 //  ##                                                         ##
741 10 Oct 06 olle 52 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 53 //  #############################################################
1652 22 May 07 gregory 54 package se.lu.thep.coreftpd.ftp_server;
741 10 Oct 06 olle 55
1676 25 May 07 olle 56 import org.proteios.core.Application;
790 23 Oct 06 olle 57 import org.proteios.core.DbControl;
790 23 Oct 06 olle 58 import org.proteios.core.Directory;
1656 22 May 07 gregory 59 import org.proteios.core.ItemFactory;
790 23 Oct 06 olle 60 import org.proteios.core.Path.Type;
1676 25 May 07 olle 61 import org.proteios.core.SessionControl;
791 23 Oct 06 olle 62 import se.lu.thep.coreftpd.common.DataInputStreamWithReadLine;
791 23 Oct 06 olle 63 import se.lu.thep.coreftpd.common.MyString;
741 10 Oct 06 olle 64 import java.io.BufferedInputStream;
741 10 Oct 06 olle 65 import java.io.BufferedOutputStream;
741 10 Oct 06 olle 66 import java.io.DataOutputStream;
741 10 Oct 06 olle 67 import java.io.File;
741 10 Oct 06 olle 68 import java.net.Socket;
741 10 Oct 06 olle 69
741 10 Oct 06 olle 70 /**
1652 22 May 07 gregory 71  * <B>About this class:</B> <BR>
1652 22 May 07 gregory 72  * For each user that connects to the server, one <CODE>FTPNewConnection</CODE>
1652 22 May 07 gregory 73  * will be created. <BR>
741 10 Oct 06 olle 74  * This is the most important class for the FTP server.
1652 22 May 07 gregory 75  * 
741 10 Oct 06 olle 76  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 77  * @version 1.0
741 10 Oct 06 olle 78  */
1656 22 May 07 gregory 79 final public class FTPNewConnection
1656 22 May 07 gregory 80     extends Thread
1656 22 May 07 gregory 81 {
1652 22 May 07 gregory 82   // Global vars
1052 08 Dec 06 olle 83   public static final char coreSeparatorChar = '/';
1052 08 Dec 06 olle 84   public static final String coreSeparator = "/";
1652 22 May 07 gregory 85   private static final boolean b_showErrors = false;
1652 22 May 07 gregory 86   private boolean b_binaryFlag = false;
1652 22 May 07 gregory 87   private boolean isAlive = true;
741 10 Oct 06 olle 88   private FTPDataConnection FTPDC_dataConnection;
741 10 Oct 06 olle 89   private Socket so_userConnection;
741 10 Oct 06 olle 90   private DataOutputStream bos;
1220 18 Feb 07 gregory 91   private String s_userName;
741 10 Oct 06 olle 92   private DataInputStreamWithReadLine bis;
1652 22 May 07 gregory 93   // private BufferedReader bis;
1652 22 May 07 gregory 94   // File f_currentFolder;
1652 22 May 07 gregory 95   private String s_root = null;
1652 22 May 07 gregory 96   // private String s_currentRelativePath=File.separator; // ="\\";
1652 22 May 07 gregory 97   private String s_currentRelativePath = coreSeparator;
1652 22 May 07 gregory 98   // private String s_lastCommand=""; //Shall be a nonexisting command. Shall
1652 22 May 07 gregory 99   // not be null!
1652 22 May 07 gregory 100   private File f_fileToRenameWithRNFR = null;
741 10 Oct 06 olle 101   private int i_startPosition;
1652 22 May 07 gregory 102   private int i_permissionLevel = NO_PERMISSIONS;
1652 22 May 07 gregory 103   private FileAccess fa_permissions = null;
741 10 Oct 06 olle 104   private UserData ud_userdata;
1652 22 May 07 gregory 105   private String[] as_aliasesName;
1652 22 May 07 gregory 106   private String[] as_aliasesPath;
741 10 Oct 06 olle 107   private String s_usersIPNumber;
1652 22 May 07 gregory 108   private long l_timeForLastCommand = System.currentTimeMillis();
1652 22 May 07 gregory 109   private int i_countNOOP = 0;
741 10 Oct 06 olle 110   private boolean b_isLocalConnection;
4047 01 Dec 10 olle 111   private boolean textBasedFTPClientType = false;
931 16 Nov 06 olle 112   /*
1656 22 May 07 gregory 113    * Instance variables not in original Xerver code. Show removed files flag.
1656 22 May 07 gregory 114    * Instance variable controlling whether core files and directories with
1656 22 May 07 gregory 115    * their "removed" flag set to 'true' should be shown in directory lists.
931 16 Nov 06 olle 116    */
1676 25 May 07 olle 117   private SessionControl sc = null;
931 16 Nov 06 olle 118   private boolean b_showingRemovedFiles = false;
3469 02 Nov 09 olle 119   private boolean inSharedProjectsFolder = false;
3469 02 Nov 09 olle 120   private boolean temporarilyInSharedProjectsFolder = false;
1652 22 May 07 gregory 121   public static boolean b_guestAccountExists = true;
1652 22 May 07 gregory 122   private static final int i_timeForClientToTakeDataConnedtion = 5000; // Wait
3469 02 Nov 09 olle 123   public static final String sharedProjectsFolderName = "_Shared_Projects";
1656 22 May 07 gregory 124   // 2
1656 22 May 07 gregory 125   // secs
1656 22 May 07 gregory 126   // for
1656 22 May 07 gregory 127   // client
1656 22 May 07 gregory 128   // to
1656 22 May 07 gregory 129   // take
1656 22 May 07 gregory 130   // the
1656 22 May 07 gregory 131   // data
1656 22 May 07 gregory 132   // connection
1656 22 May 07 gregory 133   // direct
1656 22 May 07 gregory 134   // after
1656 22 May 07 gregory 135   // a
1656 22 May 07 gregory 136   // command
1656 22 May 07 gregory 137   // when
1656 22 May 07 gregory 138   // the
1656 22 May 07 gregory 139   // data
1656 22 May 07 gregory 140   // connection
1656 22 May 07 gregory 141   // is
1656 22 May 07 gregory 142   // going
1656 22 May 07 gregory 143   // to
1656 22 May 07 gregory 144   // be
1656 22 May 07 gregory 145   // used.
741 10 Oct 06 olle 146   public static String s_serverOuterIP;
741 10 Oct 06 olle 147   public static String s_serverLocalIP;
741 10 Oct 06 olle 148   public static int i_maxTimeToIdle;
741 10 Oct 06 olle 149   public static int i_maxNumberOfNOOP;
1652 22 May 07 gregory 150   private final static int SHOW_ONLY_ALIASES = 0;
1652 22 May 07 gregory 151   private final static int SHOW_NO_ALIASES = 1;
1652 22 May 07 gregory 152   private final static int SHOW_ALIASES_AND_DIRS = 2;
1652 22 May 07 gregory 153   private final static int NO_PERMISSIONS = -1;
1652 22 May 07 gregory 154   private final static int PASSWORD_ACCEPTED = 5;
1652 22 May 07 gregory 155   public static int i_howToShowAlias = SHOW_ALIASES_AND_DIRS;
1652 22 May 07 gregory 156   public static boolean b_showAllCommands = false;
790 23 Oct 06 olle 157   /**
1652 22 May 07 gregory 158    * Logger used. Used to log specific events. Not in original Xerver code.
790 23 Oct 06 olle 159    */
790 23 Oct 06 olle 160   private static final org.apache.log4j.Logger log = org.apache.log4j.LogManager
1656 22 May 07 gregory 161     .getLogger("se.lu.thep.coreftpd.ftp_server");
741 10 Oct 06 olle 162
1656 22 May 07 gregory 163
931 16 Nov 06 olle 164   /**
1676 25 May 07 olle 165    * Get the SessionControl object.
1676 25 May 07 olle 166    * 
1676 25 May 07 olle 167    * @return the SessionControl object
1676 25 May 07 olle 168    */
2142 16 Oct 07 gregory 169   public SessionControl getSessionControl()
2142 16 Oct 07 gregory 170   {
1676 25 May 07 olle 171     return this.sc;
1676 25 May 07 olle 172   }
1676 25 May 07 olle 173
1676 25 May 07 olle 174
1676 25 May 07 olle 175   /**
1676 25 May 07 olle 176    * Set the SessionControl object.
1676 25 May 07 olle 177    * 
1676 25 May 07 olle 178    * @param sc the SessionControl object to set.
1676 25 May 07 olle 179    */
2142 16 Oct 07 gregory 180   public void setSessionControl(SessionControl sc)
2142 16 Oct 07 gregory 181   {
1676 25 May 07 olle 182     this.sc = sc;
1676 25 May 07 olle 183   }
1676 25 May 07 olle 184
1676 25 May 07 olle 185
1676 25 May 07 olle 186   /**
1652 22 May 07 gregory 187    * Get flag to show removed core files. Not in original Xerver code.
931 16 Nov 06 olle 188    * 
1652 22 May 07 gregory 189    * @return b_showingRemovedFiles boolean flag indicating if removed core
1652 22 May 07 gregory 190    *         files are shown.
931 16 Nov 06 olle 191    */
1656 22 May 07 gregory 192   public boolean isShowingRemovedFiles()
1656 22 May 07 gregory 193   {
931 16 Nov 06 olle 194     return this.b_showingRemovedFiles;
931 16 Nov 06 olle 195   }
931 16 Nov 06 olle 196
1656 22 May 07 gregory 197
931 16 Nov 06 olle 198   /**
1652 22 May 07 gregory 199    * Set flag to show removed core files. Not in original Xerver code.
931 16 Nov 06 olle 200    * 
1656 22 May 07 gregory 201    * @param b_showingRemovedFiles boolean flag indicating if removed core
1656 22 May 07 gregory 202    *        files are shown.
931 16 Nov 06 olle 203    */
1656 22 May 07 gregory 204   public void setShowingRemovedFiles(boolean b_showingRemovedFiles)
1656 22 May 07 gregory 205   {
931 16 Nov 06 olle 206     this.b_showingRemovedFiles = b_showingRemovedFiles;
931 16 Nov 06 olle 207   }
931 16 Nov 06 olle 208
1656 22 May 07 gregory 209
931 16 Nov 06 olle 210   /**
1652 22 May 07 gregory 211    * Get mode of showing removed files. Not in original Xerver code.
931 16 Nov 06 olle 212    * 
931 16 Nov 06 olle 213    * @return String Mode of showing removed files, "on" or "off".
931 16 Nov 06 olle 214    */
1656 22 May 07 gregory 215   public String getShowingRemovedFilesMode()
1656 22 May 07 gregory 216   {
931 16 Nov 06 olle 217     String showingRemovedFilesMode = new String("off");
1656 22 May 07 gregory 218     if (isShowingRemovedFiles())
1656 22 May 07 gregory 219     {
931 16 Nov 06 olle 220       showingRemovedFilesMode = "on";
931 16 Nov 06 olle 221     }
931 16 Nov 06 olle 222     return showingRemovedFilesMode;
931 16 Nov 06 olle 223   }
931 16 Nov 06 olle 224
1656 22 May 07 gregory 225
3469 02 Nov 09 olle 226   /**
3469 02 Nov 09 olle 227    * Get inSharedProjectsFolder flag.
3469 02 Nov 09 olle 228    * 
3469 02 Nov 09 olle 229    * @return boolean True if in shared projects folder, else false.
3469 02 Nov 09 olle 230    */
3469 02 Nov 09 olle 231   public boolean isInSharedProjectsFolder()
3469 02 Nov 09 olle 232   {
3469 02 Nov 09 olle 233     return this.inSharedProjectsFolder;
3469 02 Nov 09 olle 234   }
3469 02 Nov 09 olle 235
3469 02 Nov 09 olle 236
3469 02 Nov 09 olle 237   /**
3469 02 Nov 09 olle 238    * Set inSharedProjectsFolder flag.
3469 02 Nov 09 olle 239    * 
3469 02 Nov 09 olle 240    * @param inSharedProjectsFolder The inSharedProjectsFolder flag to set.
3469 02 Nov 09 olle 241    */
3469 02 Nov 09 olle 242   public void setInSharedProjectsFolder(boolean inSharedProjectsFolder)
3469 02 Nov 09 olle 243   {
3469 02 Nov 09 olle 244     this.inSharedProjectsFolder = inSharedProjectsFolder;
3469 02 Nov 09 olle 245   }
3469 02 Nov 09 olle 246
3469 02 Nov 09 olle 247
3469 02 Nov 09 olle 248   /**
3469 02 Nov 09 olle 249    * Get temporarilyInSharedProjectsFolder flag.
3469 02 Nov 09 olle 250    * 
3469 02 Nov 09 olle 251    * @return boolean True if temporarily in shared projects folder, else false.
3469 02 Nov 09 olle 252    */
3469 02 Nov 09 olle 253   public boolean isTemporarilyInSharedProjectsFolder()
3469 02 Nov 09 olle 254   {
3469 02 Nov 09 olle 255     return this.temporarilyInSharedProjectsFolder;
3469 02 Nov 09 olle 256   }
3469 02 Nov 09 olle 257
3469 02 Nov 09 olle 258
3469 02 Nov 09 olle 259   /**
3469 02 Nov 09 olle 260    * Set temporarilyInSharedProjectsFolder flag.
3469 02 Nov 09 olle 261    * 
3469 02 Nov 09 olle 262    * @param temporarilyInSharedProjectsFolder The temporarilyInSharedProjectsFolder flag to set.
3469 02 Nov 09 olle 263    */
3469 02 Nov 09 olle 264   public void setTemporarilyInSharedProjectsFolder(boolean temporarilyInSharedProjectsFolder)
3469 02 Nov 09 olle 265   {
3469 02 Nov 09 olle 266     this.temporarilyInSharedProjectsFolder = temporarilyInSharedProjectsFolder;
3469 02 Nov 09 olle 267   }
3469 02 Nov 09 olle 268
3469 02 Nov 09 olle 269
4047 01 Dec 10 olle 270   /**
4047 01 Dec 10 olle 271    * Get flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 272    * 
4047 01 Dec 10 olle 273    * @return textBasedFTPClientType boolean Flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 274    */
4047 01 Dec 10 olle 275   public boolean isTextBasedFTPClientType()
4047 01 Dec 10 olle 276   {
4047 01 Dec 10 olle 277     return this.textBasedFTPClientType;
4047 01 Dec 10 olle 278   }
4047 01 Dec 10 olle 279   
4047 01 Dec 10 olle 280
4047 01 Dec 10 olle 281   /**
4047 01 Dec 10 olle 282    * Set flag indicating a text-based FTP client type.
4047 01 Dec 10 olle 283    * 
4047 01 Dec 10 olle 284    * @param textBasedFTPClientType boolean Flag to set indicating a text-based FTP client type.
4047 01 Dec 10 olle 285    */
4047 01 Dec 10 olle 286   public void setTextBasedFTPClientType(boolean textBasedFTPClientType)
4047 01 Dec 10 olle 287   {
4047 01 Dec 10 olle 288     this.textBasedFTPClientType = textBasedFTPClientType;
4047 01 Dec 10 olle 289   }
4047 01 Dec 10 olle 290
4047 01 Dec 10 olle 291   
1656 22 May 07 gregory 292   public FTPNewConnection(Socket argUserConnection)
1656 22 May 07 gregory 293   {
1652 22 May 07 gregory 294     so_userConnection = argUserConnection;
741 10 Oct 06 olle 295     initVarsBeforeRun();
741 10 Oct 06 olle 296   }
741 10 Oct 06 olle 297
1656 22 May 07 gregory 298
2386 14 Nov 07 gregory 299   @Override
1656 22 May 07 gregory 300   public void run()
1656 22 May 07 gregory 301   {
1656 22 May 07 gregory 302     try
1656 22 May 07 gregory 303     {
741 10 Oct 06 olle 304       initVarsAfterRun();
741 10 Oct 06 olle 305       sendWelcomeMessage();
1652 22 May 07 gregory 306       // getUserInfo();
741 10 Oct 06 olle 307       readRequestes();
1656 22 May 07 gregory 308     }
1656 22 May 07 gregory 309     catch (Exception e)
1656 22 May 07 gregory 310     {
1652 22 May 07 gregory 311       showError(e);
1652 22 May 07 gregory 312     }
741 10 Oct 06 olle 313   }
741 10 Oct 06 olle 314
1656 22 May 07 gregory 315
1656 22 May 07 gregory 316   private void initVarsBeforeRun()
1656 22 May 07 gregory 317   {
1656 22 May 07 gregory 318     try
1656 22 May 07 gregory 319     {
1652 22 May 07 gregory 320       b_isLocalConnection = so_userConnection.getInetAddress()
1656 22 May 07 gregory 321         .isLinkLocalAddress() || // Ex. 169.254.100.254
1656 22 May 07 gregory 322       so_userConnection.getInetAddress().isLoopbackAddress() || // Ex.
1656 22 May 07 gregory 323       // 127.0.0.1
1656 22 May 07 gregory 324       so_userConnection.getInetAddress().isSiteLocalAddress(); // Ex.
1656 22 May 07 gregory 325       // 192.168.0.100
1652 22 May 07 gregory 326       s_usersIPNumber = so_userConnection.getInetAddress()
1656 22 May 07 gregory 327         .getHostAddress();
1676 25 May 07 olle 328       SessionControl newSc = Application.newSessionControl(
1676 25 May 07 olle 329         "org.proteios.default", "ftp", null);
1676 25 May 07 olle 330       setSessionControl(newSc);
1656 22 May 07 gregory 331     }
1656 22 May 07 gregory 332     catch (Exception e)
1656 22 May 07 gregory 333     {
1652 22 May 07 gregory 334       showError(e);
1652 22 May 07 gregory 335     }
741 10 Oct 06 olle 336   }
741 10 Oct 06 olle 337
1656 22 May 07 gregory 338
1656 22 May 07 gregory 339   private void initVarsAfterRun()
1656 22 May 07 gregory 340       throws Exception
1656 22 May 07 gregory 341   {
1652 22 May 07 gregory 342     bos = new DataOutputStream(new BufferedOutputStream(so_userConnection
1656 22 May 07 gregory 343       .getOutputStream()));
1652 22 May 07 gregory 344     bis = new DataInputStreamWithReadLine(new BufferedInputStream(
1656 22 May 07 gregory 345       so_userConnection.getInputStream()));
1652 22 May 07 gregory 346     // bis=new BufferedReader(new
1652 22 May 07 gregory 347     // InputStreamReader(so_userConnection.getInputStream()));
741 10 Oct 06 olle 348   }
741 10 Oct 06 olle 349
1656 22 May 07 gregory 350
1656 22 May 07 gregory 351   private void readRequestes()
1656 22 May 07 gregory 352       throws Exception
1656 22 May 07 gregory 353   {
741 10 Oct 06 olle 354     String cmd;
741 10 Oct 06 olle 355     int cmdIndexOf;
1656 22 May 07 gregory 356     while (isAlive && FTPServer.isAlive)
1656 22 May 07 gregory 357     {
1652 22 May 07 gregory 358       cmd = bis.myReadLine(512);
1652 22 May 07 gregory 359       // cmd=bis.readLine();
1656 22 May 07 gregory 360       if (!cmd.equals(""))
1656 22 May 07 gregory 361       {
1652 22 May 07 gregory 362         cmd = cmd.trim();
1652 22 May 07 gregory 363         cmdIndexOf = cmd.indexOf(" ");
1652 22 May 07 gregory 364         if (cmdIndexOf != -1) // Argument exists
741 10 Oct 06 olle 365         {
1652 22 May 07 gregory 366           doCommand(cmd.substring(0, cmdIndexOf), cmd
1656 22 May 07 gregory 367             .substring(cmdIndexOf + 1));
1656 22 May 07 gregory 368         }
1656 22 May 07 gregory 369         else
1656 22 May 07 gregory 370         {
741 10 Oct 06 olle 371           doCommand(cmd, null);
741 10 Oct 06 olle 372         }
1656 22 May 07 gregory 373       }
1656 22 May 07 gregory 374       else if (disconnectBecauseIdleTime())
1656 22 May 07 gregory 375       {
741 10 Oct 06 olle 376         sendResponse("221 Bye. You have been idle for a long time now.\r\n");
1656 22 May 07 gregory 377       }
1656 22 May 07 gregory 378       else
1656 22 May 07 gregory 379       {
741 10 Oct 06 olle 380         yield();
741 10 Oct 06 olle 381         sleep(250);
741 10 Oct 06 olle 382       }
741 10 Oct 06 olle 383     }
741 10 Oct 06 olle 384     so_userConnection.close();
741 10 Oct 06 olle 385   }
741 10 Oct 06 olle 386
1656 22 May 07 gregory 387
1656 22 May 07 gregory 388   private boolean disconnectBecauseIdleTime()
1656 22 May 07 gregory 389       throws Exception
1656 22 May 07 gregory 390   {
1652 22 May 07 gregory 391     if ((i_maxTimeToIdle != 0 && l_timeForLastCommand + i_maxTimeToIdle <= System
1656 22 May 07 gregory 392       .currentTimeMillis()) || (i_maxNumberOfNOOP != 0 && i_countNOOP >= i_maxNumberOfNOOP))
1656 22 May 07 gregory 393     {
1652 22 May 07 gregory 394       isAlive = false;
741 10 Oct 06 olle 395       return true;
741 10 Oct 06 olle 396     }
741 10 Oct 06 olle 397     return false;
741 10 Oct 06 olle 398   }
741 10 Oct 06 olle 399
1656 22 May 07 gregory 400
1656 22 May 07 gregory 401   private void sendWelcomeMessage()
1656 22 May 07 gregory 402       throws Exception
1656 22 May 07 gregory 403   {
798 24 Oct 06 olle 404     // *** Debug Info
798 24 Oct 06 olle 405     log.info("FTPNewConnection::sendWelcomeMessage(): Start");
1652 22 May 07 gregory 406     // sendResponse("220-Welcome to Xerver Free FTP Server
1652 22 May 07 gregory 407     // "+FTPServerController.getVersionString()+".\r\n");
1656 22 May 07 gregory 408     sendResponse("220-Welcome to Proteios FTP Server, based on Xerver Free FTP Server " + FTPServerController
1656 22 May 07 gregory 409       .getVersionString() + ".\r\n");
1652 22 May 07 gregory 410     sendResponse("220-\r\n");
1652 22 May 07 gregory 411     sendResponse("220-You can login below now.\r\n");
1652 22 May 07 gregory 412     sendResponse("220 Features: .\r\n");
741 10 Oct 06 olle 413   }
741 10 Oct 06 olle 414
1656 22 May 07 gregory 415
1656 22 May 07 gregory 416   private void doCommand(String cmd, String args)
1656 22 May 07 gregory 417   {
931 16 Nov 06 olle 418     // *** Debug Info
1652 22 May 07 gregory 419     log
1656 22 May 07 gregory 420       .info("FTPNewConnection::doCommand(): ---------------------------------");
1656 22 May 07 gregory 421     if (cmd.toUpperCase().equals("PASS"))
1656 22 May 07 gregory 422     {
1656 22 May 07 gregory 423       log
1656 22 May 07 gregory 424         .info("FTPNewConnection::doCommand(): Start - cmd = \"" + cmd + "\" args = \"<password>\"");
931 16 Nov 06 olle 425     }
1656 22 May 07 gregory 426     else
1656 22 May 07 gregory 427     {
1656 22 May 07 gregory 428       log
1656 22 May 07 gregory 429         .info("FTPNewConnection::doCommand(): Start - cmd = \"" + cmd + "\" args = \"" + args + "\"");
1656 22 May 07 gregory 430     }
1652 22 May 07 gregory 431     // System.out.print("Command: ");
1652 22 May 07 gregory 432     // System.out.println("-"+cmd+"-"+args+"-");
741 10 Oct 06 olle 433     String s_response;
1652 22 May 07 gregory 434     cmd = cmd.toUpperCase();
1656 22 May 07 gregory 435     if (b_showAllCommands)
1656 22 May 07 gregory 436     {
1652 22 May 07 gregory 437       if (args == null)
741 10 Oct 06 olle 438         System.out.println(cmd);
741 10 Oct 06 olle 439       else
1652 22 May 07 gregory 440         System.out.println(cmd + " " + args);
741 10 Oct 06 olle 441     }
1652 22 May 07 gregory 442     s_response = "500 Syntax error, command unrecognized.";
1652 22 May 07 gregory 443     l_timeForLastCommand = System.currentTimeMillis();// This shall happen
1656 22 May 07 gregory 444     // only if we don't
1656 22 May 07 gregory 445     // make a NOOP. If
1656 22 May 07 gregory 446     // we make a NOOP we
1656 22 May 07 gregory 447     // don't update
1656 22 May 07 gregory 448     // l_timeForLastCommand.
741 10 Oct 06 olle 449     if (cmd.equals("NOOP"))
1652 22 May 07 gregory 450       s_response = command_NOOP(args);
1656 22 May 07 gregory 451     else
1656 22 May 07 gregory 452     {
1652 22 May 07 gregory 453       i_countNOOP = 0;
741 10 Oct 06 olle 454       if (cmd.equals("USER"))
1652 22 May 07 gregory 455         s_response = command_USER(args);
741 10 Oct 06 olle 456       else if (cmd.equals("PASS"))
1652 22 May 07 gregory 457         s_response = command_PASS(args);
741 10 Oct 06 olle 458       else if (cmd.equals("HELP"))
1652 22 May 07 gregory 459         s_response = command_HELP(args);
741 10 Oct 06 olle 460       else if (cmd.equals("QUIT"))
1652 22 May 07 gregory 461         s_response = command_QUIT(args);
1656 22 May 07 gregory 462       else if (i_permissionLevel == PASSWORD_ACCEPTED)
1656 22 May 07 gregory 463       {
1652 22 May 07 gregory 464         s_response = "500 Syntax error, command unrecognized.";
741 10 Oct 06 olle 465         if (cmd.equals("CWD") || cmd.equals("XCWD"))
1652 22 May 07 gregory 466           s_response = command_CWD(args);
741 10 Oct 06 olle 467         else if (cmd.equals("PWD") || cmd.equals("XPWD"))
1652 22 May 07 gregory 468           s_response = command_PWD(args);
741 10 Oct 06 olle 469         else if (cmd.equals("CDUP") || cmd.equals("XCUP"))
1652 22 May 07 gregory 470           s_response = command_CDUP(args);
741 10 Oct 06 olle 471         else if (cmd.equals("SYST"))
1652 22 May 07 gregory 472           s_response = command_SYST(args);
741 10 Oct 06 olle 473         else if (cmd.equals("STAT"))
1652 22 May 07 gregory 474           s_response = command_STAT(args);
741 10 Oct 06 olle 475         else if (cmd.equals("STRU"))
1652 22 May 07 gregory 476           s_response = command_STRU(args);
741 10 Oct 06 olle 477         else if (cmd.equals("MODE"))
1652 22 May 07 gregory 478           s_response = command_MODE(args);
741 10 Oct 06 olle 479         else if (cmd.equals("TYPE"))
1652 22 May 07 gregory 480           s_response = command_TYPE(args);
741 10 Oct 06 olle 481         else if (cmd.equals("REST"))
1652 22 May 07 gregory 482           s_response = command_REST(args);
741 10 Oct 06 olle 483         else if (cmd.equals("PASV"))
1652 22 May 07 gregory 484           s_response = command_PASV(args);
741 10 Oct 06 olle 485         else if (cmd.equals("PORT"))
1652 22 May 07 gregory 486           s_response = command_PORT(args);
741 10 Oct 06 olle 487         else if (cmd.equals("LIST"))
1652 22 May 07 gregory 488           s_response = command_LIST(args);
741 10 Oct 06 olle 489         else if (cmd.equals("RETR"))
1652 22 May 07 gregory 490           s_response = command_RETR(args);
741 10 Oct 06 olle 491         else if (cmd.equals("STOR"))
1652 22 May 07 gregory 492           s_response = command_STOR(args);
741 10 Oct 06 olle 493         else if (cmd.equals("ALLO"))
1652 22 May 07 gregory 494           s_response = command_ALLO(args);
741 10 Oct 06 olle 495         else if (cmd.equals("MKD") || cmd.equals("XMKD"))
1652 22 May 07 gregory 496           s_response = command_MKD(args);
741 10 Oct 06 olle 497         else if (cmd.equals("RMD") || cmd.equals("XRMD"))
1652 22 May 07 gregory 498           s_response = command_RMD(args);
741 10 Oct 06 olle 499         else if (cmd.equals("DELE"))
1652 22 May 07 gregory 500           s_response = command_DELE(args);
741 10 Oct 06 olle 501         else if (cmd.equals("RNFR"))
1652 22 May 07 gregory 502           s_response = command_RNFR(args);
741 10 Oct 06 olle 503         else if (cmd.equals("RNTO"))
1652 22 May 07 gregory 504           s_response = command_RNTO(args);
741 10 Oct 06 olle 505         else if (cmd.equals("SIZE"))
1652 22 May 07 gregory 506           s_response = command_SIZE(args);
1656 22 May 07 gregory 507       }
1656 22 May 07 gregory 508       else
1656 22 May 07 gregory 509       {
1652 22 May 07 gregory 510         if (// The first names in this list are allowed without login
1656 22 May 07 gregory 511         // (for example USER and PASS), so we don't have to check
1656 22 May 07 gregory 512         // these
1652 22 May 07 gregory 513         // cmd.equals("USER") ||
1652 22 May 07 gregory 514         // cmd.equals("PASS") ||
1652 22 May 07 gregory 515         // cmd.equals("HELP") ||
1652 22 May 07 gregory 516         // cmd.equals("QUIT") ||
1652 22 May 07 gregory 517         // cmd.equals("NOOP") ||
1656 22 May 07 gregory 518         cmd.equals("CWD") || cmd.equals("XCWD") || cmd.equals("PWD") || cmd
1656 22 May 07 gregory 519           .equals("XPWD") || cmd.equals("CDUP") || cmd.equals("XCUP") || cmd
1656 22 May 07 gregory 520           .equals("MKD") || cmd.equals("XMKD") || cmd.equals("RMD") || cmd
1656 22 May 07 gregory 521           .equals("XRMD") || cmd.equals("SYST") || cmd.equals("STAT") || cmd
1656 22 May 07 gregory 522           .equals("STRU") || cmd.equals("MODE") || cmd.equals("TYPE") || cmd
1656 22 May 07 gregory 523           .equals("REST") || cmd.equals("PASV") || cmd.equals("PORT") || cmd
1656 22 May 07 gregory 524           .equals("LIST") || cmd.equals("RETR") || cmd.equals("STOR") || cmd
1656 22 May 07 gregory 525           .equals("ALLO") || cmd.equals("DELE") || cmd.equals("RNFR") || cmd
1656 22 May 07 gregory 526           .equals("RNTO") || cmd.equals("SIZE"))
1656 22 May 07 gregory 527         {
1652 22 May 07 gregory 528           s_response = "530 Please login with USER and PASS first.";
1652 22 May 07 gregory 529         }
741 10 Oct 06 olle 530       }
741 10 Oct 06 olle 531     }
1656 22 May 07 gregory 532     log
1656 22 May 07 gregory 533       .info("FTPNewConnection::doCommand(): response = \"" + s_response + "\"");
1652 22 May 07 gregory 534     sendResponse(s_response + "\r\n");
1652 22 May 07 gregory 535     // s_lastCommand=cmd;
741 10 Oct 06 olle 536   }
741 10 Oct 06 olle 537
1656 22 May 07 gregory 538
1656 22 May 07 gregory 539   private void sendResponse(String response)
1656 22 May 07 gregory 540   {
1656 22 May 07 gregory 541     try
1656 22 May 07 gregory 542     {
1656 22 May 07 gregory 543       if (b_showAllCommands)
1656 22 May 07 gregory 544       {
1656 22 May 07 gregory 545         if (response.indexOf("\n") != response.lastIndexOf("\n"))
1656 22 May 07 gregory 546         {
1652 22 May 07 gregory 547           String tmpStr = MyString.searchAndReplace(response, "\r\n",
1656 22 May 07 gregory 548             "\r\n\t");
1656 22 May 07 gregory 549           System.out.print("\t" + tmpStr.substring(0,
1656 22 May 07 gregory 550             tmpStr.length() - 1));
1656 22 May 07 gregory 551         }
1656 22 May 07 gregory 552         else
1652 22 May 07 gregory 553           System.out.print("\t" + response);
741 10 Oct 06 olle 554       }
741 10 Oct 06 olle 555       bos.writeBytes(response);
741 10 Oct 06 olle 556       bos.flush();
1656 22 May 07 gregory 557     }
1656 22 May 07 gregory 558     catch (Exception e)
1656 22 May 07 gregory 559     {
1652 22 May 07 gregory 560       showError(e);
1652 22 May 07 gregory 561     }
741 10 Oct 06 olle 562   }
741 10 Oct 06 olle 563
1656 22 May 07 gregory 564
1656 22 May 07 gregory 565   private void showError(Exception e)
1656 22 May 07 gregory 566   {
1656 22 May 07 gregory 567     if (b_showErrors)
1656 22 May 07 gregory 568     {
741 10 Oct 06 olle 569       System.out.println("Error: " + e);
741 10 Oct 06 olle 570       e.printStackTrace();
741 10 Oct 06 olle 571     }
741 10 Oct 06 olle 572   }
741 10 Oct 06 olle 573
1656 22 May 07 gregory 574
2386 14 Nov 07 gregory 575   @Override
3112 17 Feb 09 gregory 576   @SuppressWarnings("deprecation")
1656 22 May 07 gregory 577   public void destroy()
1656 22 May 07 gregory 578   {
1656 22 May 07 gregory 579     try
1656 22 May 07 gregory 580     {
1652 22 May 07 gregory 581       isAlive = false;
741 10 Oct 06 olle 582       so_userConnection.close();
1656 22 May 07 gregory 583     }
1656 22 May 07 gregory 584     catch (Exception e)
1656 22 May 07 gregory 585     {
1652 22 May 07 gregory 586       showError(e);
1652 22 May 07 gregory 587     }
741 10 Oct 06 olle 588   }
741 10 Oct 06 olle 589
1656 22 May 07 gregory 590
938 20 Nov 06 olle 591   /**
1656 22 May 07 gregory 592    * Javadoc not in original Xerver code. Original use: PATH _must_ have / or \
1656 22 May 07 gregory 593    * according to the demands of the local file system. If path ends with
1656 22 May 07 gregory 594    * File.separatorChar, the latter is removed. Modified functionality, not in
1656 22 May 07 gregory 595    * original Xerver code: Argument path will be converted to web syntax
1656 22 May 07 gregory 596    * separation '/'. If path ends with '/', the latter is removed. Original
1656 22 May 07 gregory 597    * use: PATH _must_ have / or \ according to the demands of the local file
1656 22 May 07 gregory 598    * system. If path ends with File.separatorChar, the latter is removed.
1652 22 May 07 gregory 599    * Modified functionality, not in original Xerver code: Argument path will
1652 22 May 07 gregory 600    * be converted to web syntax separation '/'. If path ends with '/', the
1652 22 May 07 gregory 601    * latter is removed.
938 20 Nov 06 olle 602    * 
1656 22 May 07 gregory 603    * @param path String path, possibly expressed with other separator than
1656 22 May 07 gregory 604    *        system
938 20 Nov 06 olle 605    * @return returnPath String folder name without last slash
938 20 Nov 06 olle 606    */
1656 22 May 07 gregory 607   private String folderNameWithoutLastSlash(String path)
1656 22 May 07 gregory 608   {
1652 22 May 07 gregory 609     // if (path.endsWith(File.separator))
1652 22 May 07 gregory 610     // return path.substring(0,path.length()-1);
1652 22 May 07 gregory 611     // else
1652 22 May 07 gregory 612     // return path;
938 20 Nov 06 olle 613     /*
938 20 Nov 06 olle 614      * Convert to web syntax separation '/'.
938 20 Nov 06 olle 615      */
1052 08 Dec 06 olle 616     path.replace(File.separatorChar, coreSeparatorChar);
1052 08 Dec 06 olle 617     if (path.endsWith(coreSeparator))
1652 22 May 07 gregory 618       return path.substring(0, path.length() - 1);
2418 22 Nov 07 gregory 619     return path;
741 10 Oct 06 olle 620   }
741 10 Oct 06 olle 621
1656 22 May 07 gregory 622
1652 22 May 07 gregory 623   //
938 20 Nov 06 olle 624   /**
1656 22 May 07 gregory 625    * Javadoc not in original Xerver code. Original use: PATH _must_ have / or \
1656 22 May 07 gregory 626    * according to the demands of the local file system. If path does not end
1656 22 May 07 gregory 627    * with File.separatorChar, the latter is added. Modified functionality, not
1656 22 May 07 gregory 628    * in original Xerver code: Argument path will be converted to web syntax
1656 22 May 07 gregory 629    * separation '/'. If path does not end with '/', the latter is appended.
1652 22 May 07 gregory 630    * Original use: PATH _must_ have / or \ according to the demands of the
1652 22 May 07 gregory 631    * local file system. If path does not end with File.separatorChar, the
1656 22 May 07 gregory 632    * latter is added. Modified functionality, not in original Xerver code:
1656 22 May 07 gregory 633    * Argument path will be converted to web syntax separation '/'. If path
1656 22 May 07 gregory 634    * does not end with '/', the latter is appended.
938 20 Nov 06 olle 635    * 
1656 22 May 07 gregory 636    * @param path String path, possibly expressed with other separator than
1656 22 May 07 gregory 637    *        system
938 20 Nov 06 olle 638    * @return returnPath String folder name with slash at end
938 20 Nov 06 olle 639    */
1656 22 May 07 gregory 640   private String makeSlashAtEnd(String path)
1656 22 May 07 gregory 641   {
1652 22 May 07 gregory 642     // if (path.endsWith(File.separator))
1652 22 May 07 gregory 643     // return path;
1652 22 May 07 gregory 644     // else
1652 22 May 07 gregory 645     // return path+File.separator;
938 20 Nov 06 olle 646     /*
938 20 Nov 06 olle 647      * Convert to web syntax separation '/'.
938 20 Nov 06 olle 648      */
1052 08 Dec 06 olle 649     path.replace(File.separatorChar, coreSeparatorChar);
1052 08 Dec 06 olle 650     if (path.endsWith(coreSeparator))
741 10 Oct 06 olle 651       return path;
2418 22 Nov 07 gregory 652     return path + coreSeparator;
741 10 Oct 06 olle 653   }
741 10 Oct 06 olle 654
1656 22 May 07 gregory 655
741 10 Oct 06 olle 656   /**
1652 22 May 07 gregory 657    * Set accessor method for s_currentRelativePath, not part of the original
1652 22 May 07 gregory 658    * Xerver code. Sets the instance variable s_currentRelativePath to
1652 22 May 07 gregory 659    * specified value.
1652 22 May 07 gregory 660    * 
1656 22 May 07 gregory 661    * @param s_currentRelativePath String the path to set s_currentRelativePath
1656 22 May 07 gregory 662    *        to.
1652 22 May 07 gregory 663    */
1652 22 May 07 gregory 664   // private void setS_currentRelativePath(String s_currentRelativePath)
1652 22 May 07 gregory 665   // {
1652 22 May 07 gregory 666   // if (s_currentRelativePath != null)
1652 22 May 07 gregory 667   // {
1652 22 May 07 gregory 668   // this.s_currentRelativePath = s_currentRelativePath;
1652 22 May 07 gregory 669   // }
1652 22 May 07 gregory 670   // }
790 23 Oct 06 olle 671   /**
1656 22 May 07 gregory 672    * Set accessor method for s_currentRelativePath, not part of the original
1656 22 May 07 gregory 673    * Xerver code. Sets the instance variable s_currentRelativePath to
1656 22 May 07 gregory 674    * specified value. The USER command is sent to begin the login process.
1656 22 May 07 gregory 675    * Argument username should be a valid user name on the system, or
1656 22 May 07 gregory 676    * "anonymous" to initiate an anonymous login. If no argument username is
1656 22 May 07 gregory 677    * given, default "guest" is used.
741 10 Oct 06 olle 678    * 
1656 22 May 07 gregory 679    * @param argUsername String with login user name.
741 10 Oct 06 olle 680    * @return String with success or error message.
741 10 Oct 06 olle 681    */
1656 22 May 07 gregory 682   private String command_USER(String argUsername)
1656 22 May 07 gregory 683   {
1652 22 May 07 gregory 684     if (argUsername == null)
1652 22 May 07 gregory 685       argUsername = "guest";
1652 22 May 07 gregory 686     // Start removing all permissions for the user since a new USER has been
1652 22 May 07 gregory 687     // given
1652 22 May 07 gregory 688     i_permissionLevel = NO_PERMISSIONS;
1652 22 May 07 gregory 689     fa_permissions = null;
1652 22 May 07 gregory 690     s_userName = argUsername;
741 10 Oct 06 olle 691     return "331 User name okay, need password.";
741 10 Oct 06 olle 692   }
741 10 Oct 06 olle 693
1656 22 May 07 gregory 694
741 10 Oct 06 olle 695   /**
1656 22 May 07 gregory 696    * PASS - Password (password) The PASS command is sent to complete the login
1656 22 May 07 gregory 697    * process, and follows the USER command. Argument password should be the
1656 22 May 07 gregory 698    * valid password for the username on the system. The PASS command is sent
1656 22 May 07 gregory 699    * to complete the login process, and follows the USER command. Argument
1656 22 May 07 gregory 700    * password should be the valid password for the username on the system.
741 10 Oct 06 olle 701    * 
1656 22 May 07 gregory 702    * @param argPassword String with login password.
741 10 Oct 06 olle 703    * @return String with success or error message.
741 10 Oct 06 olle 704    */
1656 22 May 07 gregory 705   private String command_PASS(String argPassword)
1656 22 May 07 gregory 706   {
1652 22 May 07 gregory 707     if (argPassword == null)
1652 22 May 07 gregory 708       argPassword = "";
790 23 Oct 06 olle 709     // *** Debug Info
1652 22 May 07 gregory 710     // log.info("FTPNewConnection::command_PASS(): Start - s_userName = \""
1652 22 May 07 gregory 711     // + s_userName + "\" argPassword = \"" + argPassword + "\"");
1656 22 May 07 gregory 712     log
1656 22 May 07 gregory 713       .info("FTPNewConnection::command_PASS(): Start - s_userName = \"" + s_userName + "\"");
790 23 Oct 06 olle 714     // *** Debug Info
1652 22 May 07 gregory 715     log
2142 16 Oct 07 gregory 716       .info("FTPNewConnection::command_PASS(): getSessionControl().getId() = " + getSessionControl()
2142 16 Oct 07 gregory 717         .getId());
2142 16 Oct 07 gregory 718     fa_permissions = new FileAccess(s_userName, argPassword,
2142 16 Oct 07 gregory 719       getSessionControl());
1656 22 May 07 gregory 720     if (fa_permissions.userAndPassOK() && !s_userName
1656 22 May 07 gregory 721       .equalsIgnoreCase("guest"))
1656 22 May 07 gregory 722     {
1652 22 May 07 gregory 723       ud_userdata = fa_permissions.getUserData();
1652 22 May 07 gregory 724       i_permissionLevel = PASSWORD_ACCEPTED;
741 10 Oct 06 olle 725       setAliasesAndRoot(fa_permissions);
741 10 Oct 06 olle 726       return "230 User logged in, proceed.";
1656 22 May 07 gregory 727     }
2418 22 Nov 07 gregory 728     if (b_guestAccountExists)
1656 22 May 07 gregory 729     {
2418 22 Nov 07 gregory 730       fa_permissions = new FileAccess("guest", "", getSessionControl()); // Login
2418 22 Nov 07 gregory 731                                         // as
2418 22 Nov 07 gregory 732       // guest
2418 22 Nov 07 gregory 733       ud_userdata = fa_permissions.getUserData();
2418 22 Nov 07 gregory 734       i_permissionLevel = PASSWORD_ACCEPTED;
2418 22 Nov 07 gregory 735       setAliasesAndRoot(fa_permissions);
2418 22 Nov 07 gregory 736       return "230 User logged in as guest, proceed.";
741 10 Oct 06 olle 737     }
2418 22 Nov 07 gregory 738     fa_permissions = null;
2418 22 Nov 07 gregory 739     return "530 Not logged in.";
741 10 Oct 06 olle 740   }
741 10 Oct 06 olle 741
1656 22 May 07 gregory 742
1656 22 May 07 gregory 743   private void setAliasesAndRoot(FileAccess fa_permissions)
1656 22 May 07 gregory 744   {
790 23 Oct 06 olle 745     // *** Debug Info
790 23 Oct 06 olle 746     log.info("FTPNewConnection::setAliasesAndRoot(): Start");
1652 22 May 07 gregory 747     s_root = ud_userdata.getRoot();
1656 22 May 07 gregory 748     log
1656 22 May 07 gregory 749       .info("FTPNewConnection::setAliasesAndRoot(): s_root = \"" + s_root + "\"");
1652 22 May 07 gregory 750     as_aliasesName = ud_userdata.getAliasesName();
1652 22 May 07 gregory 751     as_aliasesPath = ud_userdata.getAliasesPath();
741 10 Oct 06 olle 752   }
741 10 Oct 06 olle 753
1656 22 May 07 gregory 754
741 10 Oct 06 olle 755   /**
1656 22 May 07 gregory 756    * RNFR - Rename From (filename) The RNFR command is used to specify the
1656 22 May 07 gregory 757    * file to be renamed, and is to be followed by an RNTO (Rename To) command
1656 22 May 07 gregory 758    * that specifies the new filename.
741 10 Oct 06 olle 759    * 
1656 22 May 07 gregory 760    * @param argFile String with name of file to be renamed.
741 10 Oct 06 olle 761    * @return String with filename or error message.
741 10 Oct 06 olle 762    */
1656 22 May 07 gregory 763   private String command_RNFR(String argFile)
1656 22 May 07 gregory 764   {
931 16 Nov 06 olle 765     // *** Debug Info
1656 22 May 07 gregory 766     log
1656 22 May 07 gregory 767       .info("FTPNewConnection::command_RNFR(): Start - argFile = \"" + argFile + "\"");
741 10 Oct 06 olle 768     /*
1652 22 May 07 gregory 769      * Make sure to set this to null here so that after command_RNFR has
1652 22 May 07 gregory 770      * been called we shall either (1) have f_fileToRenameWithRNFR=null or
1652 22 May 07 gregory 771      * (2) f_fileToRenameWithRNFR="a correct file that might be renamed" (if
1652 22 May 07 gregory 772      * we didn't made this we might end up with running this function and
1652 22 May 07 gregory 773      * get a 550 error but still have f_fileToRenameWithRNFR= "some old
1652 22 May 07 gregory 774      * value from last time this function was executed successfully").
741 10 Oct 06 olle 775      */
1652 22 May 07 gregory 776     f_fileToRenameWithRNFR = null;
1652 22 May 07 gregory 777     if (argFile == null)
741 10 Oct 06 olle 778       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 779     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 780     if (!fa_permissions.writePermissionOK(s_file))
1656 22 May 07 gregory 781     {
741 10 Oct 06 olle 782       if (fa_permissions.createPermissionOK(s_file))
1656 22 May 07 gregory 783         return "550-Requested action not taken. Permission denied.\r\n" + "550 You are not allowed to move files or folders from this directory.";
2418 22 Nov 07 gregory 784       return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 785     }
1656 22 May 07 gregory 786     else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 787     {
741 10 Oct 06 olle 788       return "550 Requested action not taken. File or folder does not exists.";
1656 22 May 07 gregory 789     }
1656 22 May 07 gregory 790     else
1656 22 May 07 gregory 791     {
1652 22 May 07 gregory 792       f_fileToRenameWithRNFR = new File(s_file);
1656 22 May 07 gregory 793       return "350 " + makeSlashForResponse(argFile) + " exists, ready for destination name.";
741 10 Oct 06 olle 794     }
741 10 Oct 06 olle 795   }
741 10 Oct 06 olle 796
1656 22 May 07 gregory 797
741 10 Oct 06 olle 798   /**
1656 22 May 07 gregory 799    * RNTO - Rename To (filename) The RNTO command is used to specify the new
1656 22 May 07 gregory 800    * filename, and is to be preceded by an RNFR (Rename From) command that
1656 22 May 07 gregory 801    * specifies the file to be renamed. The RNTO command is used to specify the
1656 22 May 07 gregory 802    * new filename, and is to be preceded by an RNFR (Rename From) command that
1656 22 May 07 gregory 803    * specifies the file to be renamed.
741 10 Oct 06 olle 804    * 
1656 22 May 07 gregory 805    * @param argFile String with new name of file.
741 10 Oct 06 olle 806    * @return String with new filename or error message.
741 10 Oct 06 olle 807    */
1656 22 May 07 gregory 808   private String command_RNTO(String argFile)
1656 22 May 07 gregory 809   {
790 23 Oct 06 olle 810     // *** Debug Info
1656 22 May 07 gregory 811     log
1656 22 May 07 gregory 812       .info("FTPNewConnection::command_RNTO(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 813     if (argFile == null)
741 10 Oct 06 olle 814       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 815     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 816     if (f_fileToRenameWithRNFR == null)
1656 22 May 07 gregory 817     {
741 10 Oct 06 olle 818       return "503 Bad sequence of commands. Please first try to give a valid RNFR command.";
1656 22 May 07 gregory 819     }
2418 22 Nov 07 gregory 820     if (!fa_permissions.writePermissionOK(s_file) && fa_permissions
2418 22 Nov 07 gregory 821       .isNotAllowedToCreateNewFile(s_file))
2418 22 Nov 07 gregory 822     {
2418 22 Nov 07 gregory 823       if (fa_permissions.createPermissionOK(s_file))
2418 22 Nov 07 gregory 824         return "550-Requested action not taken. Permission denied.\r\n" + "550-A file with the same name does already exists in this directory,\r\n" + "550 and you do not have permission to overwrite it.";
2418 22 Nov 07 gregory 825       return "550 Requested action not taken. Permission denied.";
2418 22 Nov 07 gregory 826     }
2418 22 Nov 07 gregory 827     /*
2418 22 Nov 07 gregory 828      * If we don't want that RNTO shall give an "file already exists"-error,
2418 22 Nov 07 gregory 829      * but only overwrite the file, comment the following "else
2418 22 Nov 07 gregory 830      * if"-statement...
2418 22 Nov 07 gregory 831      */
2418 22 Nov 07 gregory 832     else if (fa_permissions.fileExists(s_file))
2418 22 Nov 07 gregory 833     {
2418 22 Nov 07 gregory 834       return "553 Requested action not taken. File or folder does already exists.";
2418 22 Nov 07 gregory 835     }
1656 22 May 07 gregory 836     else
1656 22 May 07 gregory 837     {
2418 22 Nov 07 gregory 838       try
1656 22 May 07 gregory 839       {
2418 22 Nov 07 gregory 840         if (f_fileToRenameWithRNFR.renameTo(new File(s_file))) // If
2418 22 Nov 07 gregory 841         // [file
2418 22 Nov 07 gregory 842         // renamed
2418 22 Nov 07 gregory 843         // successfully]
2418 22 Nov 07 gregory 844         // then...
2418 22 Nov 07 gregory 845         {
2418 22 Nov 07 gregory 846           return "250 File was successfully renamed to " + makeSlashForResponse(argFile) + ".";
2418 22 Nov 07 gregory 847         }
2418 22 Nov 07 gregory 848         return "450 An error occured while trying to rename file to \"" + makeSlashForResponse(argFile) + "\".\r\n";
741 10 Oct 06 olle 849       }
2418 22 Nov 07 gregory 850       catch (Exception e)
1656 22 May 07 gregory 851       {
2418 22 Nov 07 gregory 852         return "450-An error occured while trying to rename file to \"" + makeSlashForResponse(argFile) + "\".\r\n" + "450 The error message was: " + e;
1656 22 May 07 gregory 853       }
741 10 Oct 06 olle 854     }
741 10 Oct 06 olle 855   }
741 10 Oct 06 olle 856
1656 22 May 07 gregory 857
741 10 Oct 06 olle 858   /**
741 10 Oct 06 olle 859    * DELE - Delete (remote filename)
741 10 Oct 06 olle 860    * 
1656 22 May 07 gregory 861    * @param argFile String with name of remote file to be deleted.
741 10 Oct 06 olle 862    * @return String with filename or error message.
741 10 Oct 06 olle 863    */
1656 22 May 07 gregory 864   private String command_DELE(String argFile)
1656 22 May 07 gregory 865   {
790 23 Oct 06 olle 866     // *** Debug Info
1656 22 May 07 gregory 867     log
1656 22 May 07 gregory 868       .info("FTPNewConnection::command_DELE(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 869     if (argFile == null)
741 10 Oct 06 olle 870       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 871     String s_file = makeRealFilePath(argFile);
1652 22 May 07 gregory 872     log
1656 22 May 07 gregory 873       .info("FTPNewConnection::command_DELE(): s_file = \"" + s_file + "\"");
1652 22 May 07 gregory 874     log
1656 22 May 07 gregory 875       .info("FTPNewConnection::command_DELE(): fa_permissions.coreDirExists(" + s_file + ") = " + fa_permissions
1656 22 May 07 gregory 876         .coreDirExists(s_file));
1656 22 May 07 gregory 877     log
1656 22 May 07 gregory 878       .info("FTPNewConnection::command_DELE(): fa_permissions.corFileExists(" + s_file + ") = " + fa_permissions
1656 22 May 07 gregory 879         .coreFileExists(s_file, isShowingRemovedFiles()));
1656 22 May 07 gregory 880     if (!fa_permissions.writePermissionOK(s_file))
1656 22 May 07 gregory 881     {
1652 22 May 07 gregory 882       boolean b_isAllowedToCreateNewDir = fa_permissions
1656 22 May 07 gregory 883         .createPermissionOK(s_file);
741 10 Oct 06 olle 884       if (b_isAllowedToCreateNewDir)
1656 22 May 07 gregory 885         return "550-Requested action not taken. Permission denied.\r\n" + "550 You are not allowed to delete files in this directory.";
2418 22 Nov 07 gregory 886       return "550 Requested action not taken. Permission denied.";
741 10 Oct 06 olle 887     }
1652 22 May 07 gregory 888     // else if (!fa_permissions.fileExists(s_file))
1652 22 May 07 gregory 889     else if (!fa_permissions
1656 22 May 07 gregory 890       .coreFileExists(s_file, isShowingRemovedFiles()))
1656 22 May 07 gregory 891     {
741 10 Oct 06 olle 892       return "550 Requested action not taken. File or folder does not exists.";
1656 22 May 07 gregory 893     }
1656 22 May 07 gregory 894     else
1656 22 May 07 gregory 895     {
1656 22 May 07 gregory 896       try
1656 22 May 07 gregory 897       {
1652 22 May 07 gregory 898         // File theFile=new File(s_file);
1652 22 May 07 gregory 899         // if (!theFile.isDirectory())
1656 22 May 07 gregory 900         if (!fa_permissions.coreDirExists(s_file))
1656 22 May 07 gregory 901         {
1652 22 May 07 gregory 902           // theFile.delete();
1652 22 May 07 gregory 903           // return "250 "+makeSlashForResponse(argFile)+" was
1652 22 May 07 gregory 904           // successfully deleted.";
931 16 Nov 06 olle 905           /*
931 16 Nov 06 olle 906            * Get core file corresponding to path.
931 16 Nov 06 olle 907            */
1676 25 May 07 olle 908           DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 909           ItemFactory factory = new ItemFactory(dc);
1652 22 May 07 gregory 910           org.proteios.core.Path coreFilePath = new org.proteios.core.Path(
1656 22 May 07 gregory 911             s_file, Type.FILE);
1656 22 May 07 gregory 912           org.proteios.core.File coreFile = factory.getByPath(
1656 22 May 07 gregory 913             coreFilePath, false);
931 16 Nov 06 olle 914           boolean removedFlagOld = coreFile.isRemoved();
1652 22 May 07 gregory 915           log
1656 22 May 07 gregory 916             .info("FTPNewConnection::command_DELE(): removedFlagOld = " + removedFlagOld);
931 16 Nov 06 olle 917           /*
931 16 Nov 06 olle 918            * Try to remove/unremove core file.
931 16 Nov 06 olle 919            */
1656 22 May 07 gregory 920           try
1656 22 May 07 gregory 921           {
931 16 Nov 06 olle 922             /*
931 16 Nov 06 olle 923              * Toggle "isRemoved" flag for file.
931 16 Nov 06 olle 924              */
931 16 Nov 06 olle 925             coreFile.setRemoved(!coreFile.isRemoved());
1652 22 May 07 gregory 926             // dc.saveItem(coreFile);
1652 22 May 07 gregory 927             log
1656 22 May 07 gregory 928               .info("FTPNewConnection::command_DELE(): Before dc.commit(), coreFile.isRemoved() = " + coreFile
1656 22 May 07 gregory 929                 .isRemoved());
931 16 Nov 06 olle 930             dc.commit();
1652 22 May 07 gregory 931             log
1656 22 May 07 gregory 932               .info("FTPNewConnection::command_DELE(): After dc.commit(), coreFile.isRemoved() = " + coreFile
1656 22 May 07 gregory 933                 .isRemoved());
931 16 Nov 06 olle 934             /*
931 16 Nov 06 olle 935              * If no exceptions, file is OK.
931 16 Nov 06 olle 936              */
1652 22 May 07 gregory 937             // return "250 "+makeSlashForResponse(argFile)+" was
1652 22 May 07 gregory 938             // successfully deleted.";
1656 22 May 07 gregory 939             if (coreFile.isRemoved())
1656 22 May 07 gregory 940             {
1656 22 May 07 gregory 941               return "250 " + makeSlashForResponse(argFile) + " was successfully deleted.";
931 16 Nov 06 olle 942             }
2418 22 Nov 07 gregory 943             return "250 " + makeSlashForResponse(argFile) + " was successfully undeleted.";
1656 22 May 07 gregory 944           }
1656 22 May 07 gregory 945           catch (Exception e)
1656 22 May 07 gregory 946           {
1656 22 May 07 gregory 947             if (!removedFlagOld)
1656 22 May 07 gregory 948             {
931 16 Nov 06 olle 949               /*
931 16 Nov 06 olle 950                * File not removed initially.
931 16 Nov 06 olle 951                */
1656 22 May 07 gregory 952               if (!coreFile.isRemoved())
1656 22 May 07 gregory 953               {
1656 22 May 07 gregory 954                 return "550-" + makeSlashForResponse(argFile) + " could not be deleted: " + e;
931 16 Nov 06 olle 955               }
2418 22 Nov 07 gregory 956               return "550-" + makeSlashForResponse(argFile) + " could not be deleted without errors: " + e;
1656 22 May 07 gregory 957             }
2418 22 Nov 07 gregory 958             /*
2418 22 Nov 07 gregory 959              * File removed initially.
2418 22 Nov 07 gregory 960              */
2418 22 Nov 07 gregory 961             if (!coreFile.isRemoved())
1656 22 May 07 gregory 962             {
2418 22 Nov 07 gregory 963               return "550-" + makeSlashForResponse(argFile) + " could not be undeleted without errors: " + e;
931 16 Nov 06 olle 964             }
2418 22 Nov 07 gregory 965             return "550-" + makeSlashForResponse(argFile) + " could not be undeleted: " + e;
931 16 Nov 06 olle 966           }
741 10 Oct 06 olle 967         }
2418 22 Nov 07 gregory 968         return "550 " + makeSlashForResponse(argFile) + " exists, but is a directory.";
741 10 Oct 06 olle 969       }
1656 22 May 07 gregory 970       catch (Exception e)
1656 22 May 07 gregory 971       {
1656 22 May 07 gregory 972         return "450-An error occured while trying to delete \"" + makeSlashForResponse(argFile) + "\".\r\n" + "450 The error message was: " + e;
1656 22 May 07 gregory 973       }
741 10 Oct 06 olle 974     }
741 10 Oct 06 olle 975   }
741 10 Oct 06 olle 976
1656 22 May 07 gregory 977
741 10 Oct 06 olle 978   /**
741 10 Oct 06 olle 979    * RMD - Remove Directory (remote directory)
741 10 Oct 06 olle 980    * 
1656 22 May 07 gregory 981    * @param argFile String with name of remote directory to be removed.
741 10 Oct 06 olle 982    * @return String with directory name or error message.
741 10 Oct 06 olle 983    */
1656 22 May 07 gregory 984   private String command_RMD(String argFile)
1656 22 May 07 gregory 985   {
790 23 Oct 06 olle 986     // *** Debug Info
1656 22 May 07 gregory 987     log
1656 22 May 07 gregory 988       .info("FTPNewConnection::command_RMD(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 989     if (argFile == null)
741 10 Oct 06 olle 990       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 991     String s_file = makeRealFilePath(argFile);
1652 22 May 07 gregory 992     log
1656 22 May 07 gregory 993       .info("FTPNewConnection::command_RMD(): s_file = \"" + s_file + "\"");
1656 22 May 07 gregory 994     if (!fa_permissions.writePermissionOK(s_file))
1656 22 May 07 gregory 995     {
1652 22 May 07 gregory 996       boolean b_isAllowedToCreateNewDir = fa_permissions
1656 22 May 07 gregory 997         .createPermissionOK(s_file);
741 10 Oct 06 olle 998       if (b_isAllowedToCreateNewDir)
1656 22 May 07 gregory 999         return "550-Requested action not taken. Permission denied.\r\n" + "550 You are not allowed to delete folders in this directory.";
2418 22 Nov 07 gregory 1000       return "550 Requested action not taken. Permission denied.";
741 10 Oct 06 olle 1001     }
1652 22 May 07 gregory 1002     // else if (!fa_permissions.coreFileExists(s_file))
1656 22 May 07 gregory 1003     else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1004     {
741 10 Oct 06 olle 1005       return "550 Requested action not taken. File or folder does not exists.";
1656 22 May 07 gregory 1006     }
1656 22 May 07 gregory 1007     else
1656 22 May 07 gregory 1008     {
1656 22 May 07 gregory 1009       try
1656 22 May 07 gregory 1010       {
1652 22 May 07 gregory 1011         // File theFile=new File(s_file);
1652 22 May 07 gregory 1012         // if (theFile.isDirectory())
1652 22 May 07 gregory 1013         // {
1652 22 May 07 gregory 1014         // if (theFile.delete())
1652 22 May 07 gregory 1015         // return "250 "+makeSlashForResponse(argFile)+" was
1652 22 May 07 gregory 1016         // successfully deleted.";
1652 22 May 07 gregory 1017         // else
1652 22 May 07 gregory 1018         // return "550-"+makeSlashForResponse(argFile)+" could not be
1652 22 May 07 gregory 1019         // deleted.\r\n"+
1652 22 May 07 gregory 1020         // "550 Make sure you have permissions to delete the folder and
1652 22 May 07 gregory 1021         // that the folder is empty.";
1652 22 May 07 gregory 1022         // }
1652 22 May 07 gregory 1023         // else
1652 22 May 07 gregory 1024         // {
1652 22 May 07 gregory 1025         // return "550 "+makeSlashForResponse(argFile)+" exists, but is
1652 22 May 07 gregory 1026         // not a directory.";
1652 22 May 07 gregory 1027         // }
2142 16 Oct 07 gregory 1028         // boolean pathIsValidCoreDirectory = MyLS.isValidCoreDirectory(
2142 16 Oct 07 gregory 1029         // s_file, isShowingRemovedFiles());
4047 01 Dec 10 olle 1030         MyLS myLS = new MyLS(s_file, getSessionControl(), isTextBasedFTPClientType());
1676 25 May 07 olle 1031         boolean pathIsValidCoreDirectory = myLS.isValidCoreDirectory(
1656 22 May 07 gregory 1032           s_file, isShowingRemovedFiles());
1652 22 May 07 gregory 1033         log
1656 22 May 07 gregory 1034           .info("FTPNewConnection::command_RMD(): pathIsValidCoreDirectory = " + pathIsValidCoreDirectory);
1656 22 May 07 gregory 1035         if (pathIsValidCoreDirectory)
1656 22 May 07 gregory 1036         {
931 16 Nov 06 olle 1037           /*
931 16 Nov 06 olle 1038            * Get core directory corresponding to path.
931 16 Nov 06 olle 1039            */
1676 25 May 07 olle 1040           DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1041           ItemFactory factory = new ItemFactory(dc);
1652 22 May 07 gregory 1042           org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 1043             s_file, Type.DIRECTORY);
1656 22 May 07 gregory 1044           org.proteios.core.Directory coreDir = factory
1656 22 May 07 gregory 1045             .getByPath(coreDirPath);
931 16 Nov 06 olle 1046           boolean removedFlagOld = coreDir.isRemoved();
1652 22 May 07 gregory 1047           log
1656 22 May 07 gregory 1048             .info("FTPNewConnection::command_RMD(): removedFlagOld = " + removedFlagOld);
931 16 Nov 06 olle 1049           /*
931 16 Nov 06 olle 1050            * Try to remove/unremove core directory.
931 16 Nov 06 olle 1051            */
1656 22 May 07 gregory 1052           try
1656 22 May 07 gregory 1053           {
931 16 Nov 06 olle 1054             /*
931 16 Nov 06 olle 1055              * Toggle "isRemoved" flag for directory.
931 16 Nov 06 olle 1056              */
931 16 Nov 06 olle 1057             coreDir.setRemoved(!coreDir.isRemoved());
1652 22 May 07 gregory 1058             // dc.saveItem(coreDir);
1652 22 May 07 gregory 1059             log
1656 22 May 07 gregory 1060               .info("FTPNewConnection::command_RMD(): Before dc.commit(), coreDir.isRemoved() = " + coreDir
1656 22 May 07 gregory 1061                 .isRemoved());
931 16 Nov 06 olle 1062             dc.commit();
1652 22 May 07 gregory 1063             log
1656 22 May 07 gregory 1064               .info("FTPNewConnection::command_RMD(): After dc.commit(), coreDir.isRemoved() = " + coreDir
1656 22 May 07 gregory 1065                 .isRemoved());
931 16 Nov 06 olle 1066             /*
931 16 Nov 06 olle 1067              * If no exceptions, directory is OK.
931 16 Nov 06 olle 1068              */
1652 22 May 07 gregory 1069             // return "250 "+makeSlashForResponse(argFile)+" was
1652 22 May 07 gregory 1070             // successfully deleted.";
1656 22 May 07 gregory 1071             if (coreDir.isRemoved())
1656 22 May 07 gregory 1072             {
1656 22 May 07 gregory 1073               return "250 " + makeSlashForResponse(argFile) + " was successfully deleted.";
931 16 Nov 06 olle 1074             }
2418 22 Nov 07 gregory 1075             return "250 " + makeSlashForResponse(argFile) + " was successfully undeleted.";
1656 22 May 07 gregory 1076           }
1656 22 May 07 gregory 1077           catch (Exception e)
1656 22 May 07 gregory 1078           {
1656 22 May 07 gregory 1079             if (!removedFlagOld)
1656 22 May 07 gregory 1080             {
931 16 Nov 06 olle 1081               /*
931 16 Nov 06 olle 1082                * Directory not removed initially.
931 16 Nov 06 olle 1083                */
1656 22 May 07 gregory 1084               if (!coreDir.isRemoved())
1656 22 May 07 gregory 1085               {
1656 22 May 07 gregory 1086                 return "550-" + makeSlashForResponse(argFile) + " could not be deleted.\r\n" + "550 Make sure you have permissions to delete the folder and that the folder is empty: " + e;
931 16 Nov 06 olle 1087               }
2418 22 Nov 07 gregory 1088               return "550-" + makeSlashForResponse(argFile) + " could not be deleted without errors.\r\n" + "550 Make sure you have permissions to delete the folder and that the folder is empty: " + e;
1656 22 May 07 gregory 1089             }
2418 22 Nov 07 gregory 1090             /*
2418 22 Nov 07 gregory 1091              * Directory removed initially.
2418 22 Nov 07 gregory 1092              */
2418 22 Nov 07 gregory 1093             if (!coreDir.isRemoved())
1656 22 May 07 gregory 1094             {
2418 22 Nov 07 gregory 1095               return "550-" + makeSlashForResponse(argFile) + " could not be undeleted without errors.\r\n" + "550 Make sure you have permissions to delete the folder and that the folder is empty: " + e;
931 16 Nov 06 olle 1096             }
2418 22 Nov 07 gregory 1097             return "550-" + makeSlashForResponse(argFile) + " could not be undeleted.\r\n" + "550 Make sure you have permissions to undelete the folder and that the folder is empty: " + e;
931 16 Nov 06 olle 1098           }
741 10 Oct 06 olle 1099         }
2418 22 Nov 07 gregory 1100         return "550 " + makeSlashForResponse(s_file) + ": No such directory";
741 10 Oct 06 olle 1101       }
1656 22 May 07 gregory 1102       catch (Exception e)
1656 22 May 07 gregory 1103       {
1656 22 May 07 gregory 1104         return "450-An error occured while trying to delete \"" + makeSlashForResponse(argFile) + "\".\r\n" + "450 The error message was: " + e;
1656 22 May 07 gregory 1105       }
741 10 Oct 06 olle 1106     }
741 10 Oct 06 olle 1107   }
741 10 Oct 06 olle 1108
1656 22 May 07 gregory 1109
741 10 Oct 06 olle 1110   /**
741 10 Oct 06 olle 1111    * MKD - Make Directory (remote directory)
741 10 Oct 06 olle 1112    * 
1656 22 May 07 gregory 1113    * @param argFile String with name of remote directory to be created.
741 10 Oct 06 olle 1114    * @return String with directory name or error message.
741 10 Oct 06 olle 1115    */
1656 22 May 07 gregory 1116   private String command_MKD(String argFile)
1656 22 May 07 gregory 1117   {
790 23 Oct 06 olle 1118     // *** Debug Info
1656 22 May 07 gregory 1119     log
1656 22 May 07 gregory 1120       .info("FTPNewConnection::command_MKD(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1121     if (argFile == null)
741 10 Oct 06 olle 1122       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 1123     String s_file = makeRealFilePath(argFile);
1652 22 May 07 gregory 1124     log
1656 22 May 07 gregory 1125       .info("FTPNewConnection::command_MKD(): s_file = \"" + s_file + "\"");
1656 22 May 07 gregory 1126     if (!fa_permissions.writePermissionOK(s_file) && fa_permissions
1656 22 May 07 gregory 1127       .isNotAllowedToCreateNewFile(s_file))
1656 22 May 07 gregory 1128     {
741 10 Oct 06 olle 1129       if (fa_permissions.createPermissionOK(s_file))
1656 22 May 07 gregory 1130         return "550-Requested action not taken. Permission denied.\r\n" + "550-A folder with the same name does already exists in this directory,\r\n" + "550 and you do not have permission to overwrite it.";
2418 22 Nov 07 gregory 1131       return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1132     }
1656 22 May 07 gregory 1133     else if (fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1134     {
795 24 Oct 06 olle 1135       return "550 Requested action not taken. File or folder with this name does already exists.";
1656 22 May 07 gregory 1136     }
1656 22 May 07 gregory 1137     else
1656 22 May 07 gregory 1138     {
794 23 Oct 06 olle 1139       String argPath = makeRealFilePath(s_currentRelativePath);
1656 22 May 07 gregory 1140       log
1656 22 May 07 gregory 1141         .info("FTPNewConnection::command_MKD(): argPath = \"" + argPath + "\"");
1652 22 May 07 gregory 1142       String absPath = makeAbsolutePath(argPath);
1656 22 May 07 gregory 1143       log
1656 22 May 07 gregory 1144         .info("FTPNewConnection::command_MKD(): absPath = \"" + absPath + "\"");
1652 22 May 07 gregory 1145       // File tmpFolder;
1652 22 May 07 gregory 1146       // tmpFolder=new File(s_newPath);
1652 22 May 07 gregory 1147       // if (tmpFolder.isDirectory())
1652 22 May 07 gregory 1148       String parentPath = makeSlashAtEnd(absPath);
1656 22 May 07 gregory 1149       log
1656 22 May 07 gregory 1150         .info("FTPNewConnection::command_MKD(): parentPath = \"" + parentPath + "\"");
1652 22 May 07 gregory 1151       org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 1152         parentPath, Type.DIRECTORY);
1676 25 May 07 olle 1153       DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1154       ItemFactory factory = new ItemFactory(dc);
1656 22 May 07 gregory 1155       try
1656 22 May 07 gregory 1156       {
1652 22 May 07 gregory 1157         // boolean result=(new File(s_file)).mkdir();
1652 22 May 07 gregory 1158         // if (result)
1652 22 May 07 gregory 1159         // {
1652 22 May 07 gregory 1160         // return "257 \""+makeSlashForResponse(argFile)+"\"";
1652 22 May 07 gregory 1161         // }
1652 22 May 07 gregory 1162         // else
1652 22 May 07 gregory 1163         // {
1652 22 May 07 gregory 1164         // return "550-Server could not create directory.\r\n"+
1652 22 May 07 gregory 1165         // "550-The reason might be that the directory name is
1652 22 May 07 gregory 1166         // illegal\r\n"+
1652 22 May 07 gregory 1167         // "550 or that the server doesn't have write permissions to
1652 22 May 07 gregory 1168         // this folder.";
1652 22 May 07 gregory 1169         // }
1656 22 May 07 gregory 1170         Directory coreDir = factory.getByPath(coreDirPath);
1656 22 May 07 gregory 1171         Directory newDir = factory.create(Directory.class);
1656 22 May 07 gregory 1172         newDir.setParent(coreDir);
1705 31 May 07 olle 1173         newDir.setProjectKey(coreDir.getProjectKey());
794 23 Oct 06 olle 1174         newDir.setName(argFile);
1652 22 May 07 gregory 1175         log
1656 22 May 07 gregory 1176           .info("FTPNewConnection::command_MKD(): newDir.getName() = \"" + newDir
1656 22 May 07 gregory 1177             .getName() + "\"");
794 23 Oct 06 olle 1178         dc.saveItem(newDir);
794 23 Oct 06 olle 1179         dc.commit();
794 23 Oct 06 olle 1180         /*
794 23 Oct 06 olle 1181          * If no exceptions, directory is OK.
794 23 Oct 06 olle 1182          */
1652 22 May 07 gregory 1183         return "257 \"" + makeSlashForResponse(argFile) + "\"";
741 10 Oct 06 olle 1184       }
1656 22 May 07 gregory 1185       catch (Exception e)
1656 22 May 07 gregory 1186       {
1656 22 May 07 gregory 1187         return "450-An error occured while trying to create \"" + makeSlashForResponse(argFile) + "\".\r\n" + "450 The error message was: " + e;
1656 22 May 07 gregory 1188       }
741 10 Oct 06 olle 1189     }
741 10 Oct 06 olle 1190   }
741 10 Oct 06 olle 1191
1656 22 May 07 gregory 1192
741 10 Oct 06 olle 1193   /**
1652 22 May 07 gregory 1194    * ALLO - Allocate storage space to receive a file (size [R
1652 22 May 07 gregory 1195    * max-record-size])
741 10 Oct 06 olle 1196    * 
1656 22 May 07 gregory 1197    * @param arg String with storage size to allocate, and optional
1656 22 May 07 gregory 1198    *        max-record-size.
741 10 Oct 06 olle 1199    * @return String with command implementation message
741 10 Oct 06 olle 1200    */
1656 22 May 07 gregory 1201   private String command_ALLO(String arg)
1656 22 May 07 gregory 1202   {
790 23 Oct 06 olle 1203     // *** Debug Info
1656 22 May 07 gregory 1204     log
1656 22 May 07 gregory 1205       .info("FTPNewConnection::command_ALLO(): Start - arg = \"" + arg + "\"");
741 10 Oct 06 olle 1206     return "202 Command not implemented, superfluous at this site.";
741 10 Oct 06 olle 1207   }
741 10 Oct 06 olle 1208
1656 22 May 07 gregory 1209
741 10 Oct 06 olle 1210   /**
1656 22 May 07 gregory 1211    * STOR - Store (remote filename) Begins transmission of file to the remote
1656 22 May 07 gregory 1212    * system. Must be preceded by a PORT or PASV command to indicate where to
1656 22 May 07 gregory 1213    * accept data from. Begins transmission of file to the remote system. Must
1656 22 May 07 gregory 1214    * be preceded by a PORT or PASV command to indicate where to accept data
1656 22 May 07 gregory 1215    * from.
741 10 Oct 06 olle 1216    * 
1656 22 May 07 gregory 1217    * @param argFile String with name of file to be stored on remote system.
741 10 Oct 06 olle 1218    * @return String with filename or error message.
741 10 Oct 06 olle 1219    */
1656 22 May 07 gregory 1220   private String command_STOR(String argFile)
1656 22 May 07 gregory 1221   {
790 23 Oct 06 olle 1222     // *** Debug Info
1656 22 May 07 gregory 1223     log
1656 22 May 07 gregory 1224       .info("FTPNewConnection::command_STOR(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1225     if (argFile == null)
741 10 Oct 06 olle 1226       return "504 Command not implemented for an empty parameter.";
1685 28 May 07 olle 1227     /*
1688 28 May 07 olle 1228      * Remove any directory part in absolute path.
1685 28 May 07 olle 1229      */
2142 16 Oct 07 gregory 1230     // if (argFile.contains((CharSequence) coreSeparator))
1688 28 May 07 olle 1231     if (argFile.startsWith(coreSeparator))
1685 28 May 07 olle 1232     {
1685 28 May 07 olle 1233       argFile = argFile.substring(argFile.lastIndexOf(coreSeparator) + 1);
1685 28 May 07 olle 1234     }
1685 28 May 07 olle 1235     log
1685 28 May 07 olle 1236       .info("FTPNewConnection::command_STOR(): (1) argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1237     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 1238     if (FTPDC_dataConnection != null)
1656 22 May 07 gregory 1239     {
2142 16 Oct 07 gregory 1240       log
2142 16 Oct 07 gregory 1241         .debug("FTPNewConnection::command_STOR(): fa_permissions.writePermissionOK(" + s_file + ") = " + fa_permissions
2142 16 Oct 07 gregory 1242           .writePermissionOK(s_file));
2142 16 Oct 07 gregory 1243       log
2142 16 Oct 07 gregory 1244         .debug("FTPNewConnection::command_STOR(): fa_permissions.isNotAllowedToCreateNewFile(" + s_file + ") = " + fa_permissions
2142 16 Oct 07 gregory 1245           .isNotAllowedToCreateNewFile(s_file));
1656 22 May 07 gregory 1246       if (!fa_permissions.writePermissionOK(s_file) && fa_permissions
1656 22 May 07 gregory 1247         .isNotAllowedToCreateNewFile(s_file))
1656 22 May 07 gregory 1248       {
2142 16 Oct 07 gregory 1249         log
2142 16 Oct 07 gregory 1250           .debug("FTPNewConnection::command_STOR(): fa_permissions.createPermissionOK(" + s_file + ") = " + fa_permissions
2142 16 Oct 07 gregory 1251             .createPermissionOK(s_file));
741 10 Oct 06 olle 1252         if (fa_permissions.createPermissionOK(s_file))
1656 22 May 07 gregory 1253           return "550-Requested action not taken. Permission denied.\r\n" + "550 You are not allowed to modify or delete files that already exists.";
2418 22 Nov 07 gregory 1254         return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1255       }
2418 22 Nov 07 gregory 1256       try
1656 22 May 07 gregory 1257       {
2418 22 Nov 07 gregory 1258         if (FTPDC_dataConnection
2418 22 Nov 07 gregory 1259           .waitForDataConnectionToBeTaken(i_timeForClientToTakeDataConnedtion)) // Wait
2418 22 Nov 07 gregory 1260         // 2
2418 22 Nov 07 gregory 1261         // secs
2418 22 Nov 07 gregory 1262         // for
2418 22 Nov 07 gregory 1263         // client
2418 22 Nov 07 gregory 1264         // to
2418 22 Nov 07 gregory 1265         // take
2418 22 Nov 07 gregory 1266         // data
2418 22 Nov 07 gregory 1267         // connection
2418 22 Nov 07 gregory 1268         // (true
2418 22 Nov 07 gregory 1269         // if
2418 22 Nov 07 gregory 1270         // taken,
2418 22 Nov 07 gregory 1271         // false
2418 22 Nov 07 gregory 1272         // if
2418 22 Nov 07 gregory 1273         // not
2418 22 Nov 07 gregory 1274         // taken)
1656 22 May 07 gregory 1275         {
2418 22 Nov 07 gregory 1276           sendResponse("150 Starting binary file transfer.\r\n");
2418 22 Nov 07 gregory 1277           FTPDC_dataConnection.writeFile(s_file, false); // False=do
2418 22 Nov 07 gregory 1278           // not
2418 22 Nov 07 gregory 1279           // append
1656 22 May 07 gregory 1280           // to
2418 22 Nov 07 gregory 1281           // file,
2418 22 Nov 07 gregory 1282           // instead
2418 22 Nov 07 gregory 1283           // replace
2418 22 Nov 07 gregory 1284           // file
2418 22 Nov 07 gregory 1285           FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1286           return "226 Closing data connection; requested file action successful.";
1656 22 May 07 gregory 1287         }
2418 22 Nov 07 gregory 1288         // I don't know if this is really a good response, as we
2418 22 Nov 07 gregory 1289         // don't close the connection... It's just that the
2418 22 Nov 07 gregory 1290         // client has not taken the data connection we have
2418 22 Nov 07 gregory 1291         // opened.
2418 22 Nov 07 gregory 1292         return "426 Connection trouble, closed; transfer aborted. (Client did not take the data connection)";
2418 22 Nov 07 gregory 1293       }
2418 22 Nov 07 gregory 1294       catch (Exception e)
2418 22 Nov 07 gregory 1295       {
2418 22 Nov 07 gregory 1296         if (FTPDC_dataConnection.portNumberOccupiedWithPORT())
1656 22 May 07 gregory 1297         {
2418 22 Nov 07 gregory 1298           return "425-Xerver was not allowed to use port " + FTPDataConnection.i_dataPortNr + ".\r\n" + "425-Port may already be in use.\r\n" + "425 Transfer aborted.";
741 10 Oct 06 olle 1299         }
2418 22 Nov 07 gregory 1300         FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1301         return "426 Connection trouble, closed; transfer aborted.";
741 10 Oct 06 olle 1302       }
1656 22 May 07 gregory 1303     }
2418 22 Nov 07 gregory 1304     return "425 Can't open data connection"; // This response (425)
2418 22 Nov 07 gregory 1305 // shall not be given
2418 22 Nov 07 gregory 1306 // after a PASV,
2418 22 Nov 07 gregory 1307 // however, I have no
2418 22 Nov 07 gregory 1308 // idea what else to put
2418 22 Nov 07 gregory 1309 // here... Change this?
741 10 Oct 06 olle 1310   }
741 10 Oct 06 olle 1311
1656 22 May 07 gregory 1312
741 10 Oct 06 olle 1313   /**
1656 22 May 07 gregory 1314    * APPE - Append data to remote file (remote filename) Appends data to file
1656 22 May 07 gregory 1315    * to the remote system. The remote file is created, if it does not exist.
1656 22 May 07 gregory 1316    * Must be preceded by a PORT or PASV command to indicate where to accept
1656 22 May 07 gregory 1317    * data from. Appends data to file to the remote system. The remote file is
1656 22 May 07 gregory 1318    * created, if it does not exist. Must be preceded by a PORT or PASV command
1656 22 May 07 gregory 1319    * to indicate where to accept data from.
741 10 Oct 06 olle 1320    * 
1656 22 May 07 gregory 1321    * @param argFile String with name of file on remote system to append data
1656 22 May 07 gregory 1322    *        to.
741 10 Oct 06 olle 1323    * @return String with filename or error message.
741 10 Oct 06 olle 1324    */
1220 18 Feb 07 gregory 1325   @SuppressWarnings("unused")
1652 22 May 07 gregory 1326   private String command_APPE(String argFile) // Like STOR, but appends data
1656 22 May 07 gregory 1327   // to end of file
741 10 Oct 06 olle 1328   {
790 23 Oct 06 olle 1329     // *** Debug Info
1656 22 May 07 gregory 1330     log
1656 22 May 07 gregory 1331       .info("FTPNewConnection::command_APPE(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1332     if (argFile == null)
741 10 Oct 06 olle 1333       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 1334     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 1335     if (FTPDC_dataConnection != null)
1656 22 May 07 gregory 1336     {
1656 22 May 07 gregory 1337       if (!fa_permissions.writePermissionOK(s_file))
1656 22 May 07 gregory 1338       {
741 10 Oct 06 olle 1339         return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1340       }
1656 22 May 07 gregory 1341       else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1342       {
741 10 Oct 06 olle 1343         return "550 Requested action not taken. File does not exists.";
1656 22 May 07 gregory 1344       }
1656 22 May 07 gregory 1345       else
1656 22 May 07 gregory 1346       {
1656 22 May 07 gregory 1347         try
1656 22 May 07 gregory 1348         {
1652 22 May 07 gregory 1349           if (FTPDC_dataConnection
1656 22 May 07 gregory 1350             .waitForDataConnectionToBeTaken(i_timeForClientToTakeDataConnedtion)) // Wait
1656 22 May 07 gregory 1351           // 2
1656 22 May 07 gregory 1352           // secs
1656 22 May 07 gregory 1353           // for
1656 22 May 07 gregory 1354           // client
1656 22 May 07 gregory 1355           // to
1656 22 May 07 gregory 1356           // take
1656 22 May 07 gregory 1357           // data
1656 22 May 07 gregory 1358           // connection
1656 22 May 07 gregory 1359           // (true
1656 22 May 07 gregory 1360           // if
1656 22 May 07 gregory 1361           // taken,
1656 22 May 07 gregory 1362           // false
1656 22 May 07 gregory 1363           // if
1656 22 May 07 gregory 1364           // not
1656 22 May 07 gregory 1365           // taken)
741 10 Oct 06 olle 1366           {
741 10 Oct 06 olle 1367             sendResponse("150 Starting binary file transfer.\r\n");
1652 22 May 07 gregory 1368             FTPDC_dataConnection.writeFile(s_file, true); // True=yes
1656 22 May 07 gregory 1369             // append
1656 22 May 07 gregory 1370             // to
1656 22 May 07 gregory 1371             // file
741 10 Oct 06 olle 1372             FTPDC_dataConnection.killConnection();
741 10 Oct 06 olle 1373             return "226 Closing data connection; requested file action successful.";
1656 22 May 07 gregory 1374           }
2418 22 Nov 07 gregory 1375           // I don't know if this is really a good response, as we
2418 22 Nov 07 gregory 1376           // don't close the connection... It's just that the
2418 22 Nov 07 gregory 1377           // client has not taken the data connection we have
2418 22 Nov 07 gregory 1378           // opened.
2418 22 Nov 07 gregory 1379           return "426 Connection trouble, closed; transfer aborted. (Client did not take the data connection)";
1656 22 May 07 gregory 1380         }
1656 22 May 07 gregory 1381         catch (Exception e)
1656 22 May 07 gregory 1382         {
1656 22 May 07 gregory 1383           if (FTPDC_dataConnection.portNumberOccupiedWithPORT())
1656 22 May 07 gregory 1384           {
1656 22 May 07 gregory 1385             return "425-Xerver was not allowed to use port " + FTPDataConnection.i_dataPortNr + ".\r\n" + "425-Port may already be in use.\r\n" + "425 Transfer aborted.";
1656 22 May 07 gregory 1386           }
2418 22 Nov 07 gregory 1387           FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1388           return "426 Connection trouble, closed; transfer aborted.";
741 10 Oct 06 olle 1389         }
741 10 Oct 06 olle 1390       }
1656 22 May 07 gregory 1391     }
2418 22 Nov 07 gregory 1392     return "425 Can't open data connection"; // This response (425)
2418 22 Nov 07 gregory 1393 // shall not be given
2418 22 Nov 07 gregory 1394 // after a PASV,
2418 22 Nov 07 gregory 1395 // however, I have no
2418 22 Nov 07 gregory 1396 // idea what else to put
2418 22 Nov 07 gregory 1397 // here... Change this?
741 10 Oct 06 olle 1398   }
741 10 Oct 06 olle 1399
1656 22 May 07 gregory 1400
741 10 Oct 06 olle 1401   /**
1656 22 May 07 gregory 1402    * RETR - Retrieve (remote filename) Begins transmission of file from the
1656 22 May 07 gregory 1403    * remote system. Must be preceded by a PORT or PASV command to indicate
1656 22 May 07 gregory 1404    * where to accept data from. Begins transmission of file from the remote
1656 22 May 07 gregory 1405    * system. Must be preceded by a PORT or PASV command to indicate where to
1656 22 May 07 gregory 1406    * accept data from.
741 10 Oct 06 olle 1407    * 
1656 22 May 07 gregory 1408    * @param argFile String with name of file on remote system.
741 10 Oct 06 olle 1409    * @return String with filename or error message.
741 10 Oct 06 olle 1410    */
1656 22 May 07 gregory 1411   private String command_RETR(String argFile)
1656 22 May 07 gregory 1412   {
790 23 Oct 06 olle 1413     // *** Debug Info
1656 22 May 07 gregory 1414     log
1656 22 May 07 gregory 1415       .info("FTPNewConnection::command_RETR(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1416     if (argFile == null)
741 10 Oct 06 olle 1417       return "504 Command not implemented for an empty parameter.";
1649 21 May 07 olle 1418     /*
1649 21 May 07 olle 1419      * If argfile ends with coreSeparator, return list.
1649 21 May 07 olle 1420      */
1656 22 May 07 gregory 1421     if (argFile.endsWith(coreSeparator))
1656 22 May 07 gregory 1422     {
1652 22 May 07 gregory 1423       // return "550 Requested action not taken. "+argFile+" is a folder,
1652 22 May 07 gregory 1424       // not a file.";
1649 21 May 07 olle 1425       return command_LIST(argFile);
1649 21 May 07 olle 1426     }
1649 21 May 07 olle 1427     /*
1649 21 May 07 olle 1428      * Remove any directory part in path.
1649 21 May 07 olle 1429      */
2418 22 Nov 07 gregory 1430     if (argFile.contains(coreSeparator))
1656 22 May 07 gregory 1431     {
1649 21 May 07 olle 1432       argFile = argFile.substring(argFile.lastIndexOf(coreSeparator) + 1);
1649 21 May 07 olle 1433     }
1656 22 May 07 gregory 1434     log
1656 22 May 07 gregory 1435       .info("FTPNewConnection::command_RETR(): (1) argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1436     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 1437     log
1656 22 May 07 gregory 1438       .info("FTPNewConnection::command_RETR(): s_file = \"" + s_file + "\"");
1656 22 May 07 gregory 1439     if (FTPDC_dataConnection != null)
1656 22 May 07 gregory 1440     {
1652 22 May 07 gregory 1441       // File f_theFile=new File(s_file);
1652 22 May 07 gregory 1442       org.proteios.core.File coreFile = null;
1676 25 May 07 olle 1443       DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1444       ItemFactory factory = new ItemFactory(dc);
1652 22 May 07 gregory 1445       org.proteios.core.Path coreFilePath = new org.proteios.core.Path(
1656 22 May 07 gregory 1446         s_file, Type.FILE);
1656 22 May 07 gregory 1447       try
1656 22 May 07 gregory 1448       {
1656 22 May 07 gregory 1449         coreFile = factory.getByPath(coreFilePath, false);
1656 22 May 07 gregory 1450       }
1656 22 May 07 gregory 1451       catch (Exception e)
1656 22 May 07 gregory 1452       {
1649 21 May 07 olle 1453         /*
1652 22 May 07 gregory 1454          * Firefox for example asks for the content of a file when it
1652 22 May 07 gregory 1455          * want to do a directory listing.
1649 21 May 07 olle 1456          */
1652 22 May 07 gregory 1457         log
1656 22 May 07 gregory 1458           .info("FTPNewConnection::command_RETR(): Exception when trying to get coreFile from path: " + e);
1656 22 May 07 gregory 1459         return "550 Requested action not taken.  " + argFile + " might not be a file.";
741 10 Oct 06 olle 1460       }
1656 22 May 07 gregory 1461       if (!fa_permissions.readPermissionOK(s_file))
1656 22 May 07 gregory 1462       {
1652 22 May 07 gregory 1463         log
1656 22 May 07 gregory 1464           .info("FTPNewConnection::command_RETR(): fa_permissions.readPermissionOK(s_file) = " + fa_permissions
1656 22 May 07 gregory 1465             .readPermissionOK(s_file));
741 10 Oct 06 olle 1466         return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1467       }
1656 22 May 07 gregory 1468       else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1469       {
1652 22 May 07 gregory 1470         log
1656 22 May 07 gregory 1471           .info("FTPNewConnection::command_RETR(): fa_permissions.readPermissionOK(s_file) = " + fa_permissions
1656 22 May 07 gregory 1472             .readPermissionOK(s_file));
1652 22 May 07 gregory 1473         log
1656 22 May 07 gregory 1474           .info("FTPNewConnection::command_RETR(): fa_permissions.fileExists(s_file) = " + fa_permissions
1656 22 May 07 gregory 1475             .fileExists(s_file));
741 10 Oct 06 olle 1476         return "550 Requested action not taken. File does not exists.";
1656 22 May 07 gregory 1477       }
1656 22 May 07 gregory 1478       else
1656 22 May 07 gregory 1479       {
1652 22 May 07 gregory 1480         log
1656 22 May 07 gregory 1481           .info("FTPNewConnection::command_RETR(): fa_permissions.readPermissionOK(s_file) = " + fa_permissions
1656 22 May 07 gregory 1482             .readPermissionOK(s_file));
1652 22 May 07 gregory 1483         log
1656 22 May 07 gregory 1484           .info("FTPNewConnection::command_RETR(): fa_permissions.fileExists(s_file) = " + fa_permissions
1656 22 May 07 gregory 1485             .fileExists(s_file));
1656 22 May 07 gregory 1486         try
1656 22 May 07 gregory 1487         {
790 23 Oct 06 olle 1488           /*
1652 22 May 07 gregory 1489            * Wait 2 secs for client to take data connection (true if
1652 22 May 07 gregory 1490            * taken, false if not taken)
790 23 Oct 06 olle 1491            */
1652 22 May 07 gregory 1492           if (FTPDC_dataConnection
1656 22 May 07 gregory 1493             .waitForDataConnectionToBeTaken(i_timeForClientToTakeDataConnedtion))
1656 22 May 07 gregory 1494           {
1656 22 May 07 gregory 1495             if (b_binaryFlag)
1656 22 May 07 gregory 1496             {
741 10 Oct 06 olle 1497               sendResponse("150 Starting binary file transfer.\r\n");
1652 22 May 07 gregory 1498               FTPDC_dataConnection.sendFileContentBinary(s_file,
1656 22 May 07 gregory 1499                 i_startPosition);
1652 22 May 07 gregory 1500               i_startPosition = 0;
1656 22 May 07 gregory 1501             }
1656 22 May 07 gregory 1502             else
1656 22 May 07 gregory 1503             {
741 10 Oct 06 olle 1504               sendResponse("150 Starting ASCII file transfer.\r\n");
741 10 Oct 06 olle 1505               FTPDC_dataConnection.sendFileContentASCII(s_file);
1652 22 May 07 gregory 1506               i_startPosition = 0;
741 10 Oct 06 olle 1507             }
741 10 Oct 06 olle 1508             FTPDC_dataConnection.killConnection();
741 10 Oct 06 olle 1509             return "226 Closing data connection; requested file action successful.";
1656 22 May 07 gregory 1510           }
2418 22 Nov 07 gregory 1511           // I don't know if this is really a good response, as we
2418 22 Nov 07 gregory 1512           // don't close the connection... It's just that the
2418 22 Nov 07 gregory 1513           // client has not taken the data connection we have
2418 22 Nov 07 gregory 1514           // opened.
2418 22 Nov 07 gregory 1515           return "426 Connection trouble, closed; transfer aborted. (Client did not take the data connection)";
1656 22 May 07 gregory 1516         }
1656 22 May 07 gregory 1517         catch (Exception e)
1656 22 May 07 gregory 1518         {
1656 22 May 07 gregory 1519           if (FTPDC_dataConnection.portNumberOccupiedWithPORT())
1656 22 May 07 gregory 1520           {
1656 22 May 07 gregory 1521             return "425-Xerver was not allowed to use port " + FTPDataConnection.i_dataPortNr + ".\r\n" + "425-Port may already be in use.\r\n" + "425 Transfer aborted.";
1656 22 May 07 gregory 1522           }
2418 22 Nov 07 gregory 1523           FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1524           return "426 Connection trouble, closed; transfer aborted.";
741 10 Oct 06 olle 1525         }
741 10 Oct 06 olle 1526       }
1656 22 May 07 gregory 1527     }
2418 22 Nov 07 gregory 1528     return "425 Can't open data connection"; // This response (425)
2418 22 Nov 07 gregory 1529 // shall not be given
2418 22 Nov 07 gregory 1530 // after a PASV,
2418 22 Nov 07 gregory 1531 // however, I have no
2418 22 Nov 07 gregory 1532 // idea what else to put
2418 22 Nov 07 gregory 1533 // here... Change this?
741 10 Oct 06 olle 1534   }
741 10 Oct 06 olle 1535
1656 22 May 07 gregory 1536
741 10 Oct 06 olle 1537   /**
1656 22 May 07 gregory 1538    * SIZE - Size of remote file (remote filename) Returns the size of the
1656 22 May 07 gregory 1539    * remote file as a decimal number. Returns the size of the remote file as a
1656 22 May 07 gregory 1540    * decimal number.
741 10 Oct 06 olle 1541    * 
1656 22 May 07 gregory 1542    * @param argFile String with name of file on remote system.
741 10 Oct 06 olle 1543    * @return String with file size as decimal number or error message.
741 10 Oct 06 olle 1544    */
1656 22 May 07 gregory 1545   private String command_SIZE(String argFile)
1656 22 May 07 gregory 1546   {
790 23 Oct 06 olle 1547     // *** Debug Info
1656 22 May 07 gregory 1548     log
1656 22 May 07 gregory 1549       .info("FTPNewConnection::command_SIZE(): Start - argFile = \"" + argFile + "\"");
1652 22 May 07 gregory 1550     if (argFile == null)
741 10 Oct 06 olle 1551       return "504 Command not implemented for an empty parameter.";
1649 21 May 07 olle 1552     /*
1649 21 May 07 olle 1553      * If argfile ends with coreSeparator, return error message.
1649 21 May 07 olle 1554      */
1656 22 May 07 gregory 1555     if (argFile.endsWith(coreSeparator))
1656 22 May 07 gregory 1556     {
1656 22 May 07 gregory 1557       return "550 Requested action not taken. " + argFile + " is a folder, not a file.";
1649 21 May 07 olle 1558     }
1652 22 May 07 gregory 1559     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 1560     log
1656 22 May 07 gregory 1561       .info("FTPNewConnection::command_SIZE(): s_file = \"" + s_file + "\"");
1652 22 May 07 gregory 1562     org.proteios.core.File coreFile = null;
1676 25 May 07 olle 1563     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1564     ItemFactory factory = new ItemFactory(dc);
1652 22 May 07 gregory 1565     org.proteios.core.Path coreFilePath = new org.proteios.core.Path(
1656 22 May 07 gregory 1566       s_file, Type.FILE);
1656 22 May 07 gregory 1567     try
1656 22 May 07 gregory 1568     {
1656 22 May 07 gregory 1569       coreFile = factory.getByPath(coreFilePath, false);
1656 22 May 07 gregory 1570     }
1656 22 May 07 gregory 1571     catch (Exception e)
1656 22 May 07 gregory 1572     {
1652 22 May 07 gregory 1573       log
1656 22 May 07 gregory 1574         .info("FTPNewConnection::command_SIZE(): Exception when trying to get coreFile from path: " + e);
1656 22 May 07 gregory 1575       return "550 Requested action not taken.  " + argFile + " might not be a file.";
790 23 Oct 06 olle 1576     }
1652 22 May 07 gregory 1577     log
1656 22 May 07 gregory 1578       .info("FTPNewConnection::command_SIZE(): (orig) coreFile.getName() = \"" + coreFile
1656 22 May 07 gregory 1579         .getName() + "\"");
790 23 Oct 06 olle 1580     /*
790 23 Oct 06 olle 1581      * Get size in bytes for cor file.
790 23 Oct 06 olle 1582      */
1656 22 May 07 gregory 1583     if (coreFile != null)
1656 22 May 07 gregory 1584     {
2444 10 Dec 07 gregory 1585       long size_long = coreFile.getSizeInBytes();
1656 22 May 07 gregory 1586       log
1656 22 May 07 gregory 1587         .info("FTPNewConnection::command_SIZE(): coreFile.getBytes() = " + coreFile
2444 10 Dec 07 gregory 1588           .getSizeInBytes());
790 23 Oct 06 olle 1589       String size_str = Long.toString(size_long);
1652 22 May 07 gregory 1590       return "213 " + size_str;
790 23 Oct 06 olle 1591     }
1656 22 May 07 gregory 1592     if (!fa_permissions.listPermissionOK(s_file))
1656 22 May 07 gregory 1593     {
741 10 Oct 06 olle 1594       return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1595     }
1656 22 May 07 gregory 1596     else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1597     {
741 10 Oct 06 olle 1598       return "550 Requested action not taken. File or folder does not exists.";
1656 22 May 07 gregory 1599     }
1656 22 May 07 gregory 1600     else
1656 22 May 07 gregory 1601     {
1652 22 May 07 gregory 1602       File tmpFile = new File(s_file);
741 10 Oct 06 olle 1603       if (!tmpFile.isDirectory())
1652 22 May 07 gregory 1604         return "213 " + tmpFile.length();
2418 22 Nov 07 gregory 1605       return "550 Requested action not taken. " + makeSlashForResponse(makeAbsolutePath(argFile)) + " is a folder, not a file.";
741 10 Oct 06 olle 1606     }
741 10 Oct 06 olle 1607   }
741 10 Oct 06 olle 1608
1656 22 May 07 gregory 1609
1656 22 May 07 gregory 1610   private String subCommand_listFile(String argFile)
1656 22 May 07 gregory 1611   {
790 23 Oct 06 olle 1612     // *** Debug Info
1652 22 May 07 gregory 1613     log
3469 02 Nov 09 olle 1614       .info("FTPNewConnection::subCommand_listFile(): Start - argFile = \"" + argFile + "\" isTemporarilyInSharedProjectsFolder() = " + isTemporarilyInSharedProjectsFolder());
3469 02 Nov 09 olle 1615     // Check if in shared projects folder
3469 02 Nov 09 olle 1616     if (isTemporarilyInSharedProjectsFolder())
3469 02 Nov 09 olle 1617     {
3469 02 Nov 09 olle 1618       log
3469 02 Nov 09 olle 1619         .info("FTPNewConnection::subCommand_listFile(): Already in shared projects folder argFile = \"" + argFile + "\"");
3469 02 Nov 09 olle 1620     }
3469 02 Nov 09 olle 1621     else
3469 02 Nov 09 olle 1622     {
3469 02 Nov 09 olle 1623       log
3469 02 Nov 09 olle 1624         .info("FTPNewConnection::subCommand_listFile(): Not already in shared projects folder argFile = \"" + argFile + "\"");
3469 02 Nov 09 olle 1625     }
1652 22 May 07 gregory 1626     if (argFile == null)
741 10 Oct 06 olle 1627       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 1628     String s_file = makeRealFilePath(argFile);
1656 22 May 07 gregory 1629     log
1656 22 May 07 gregory 1630       .info("FTPNewConnection::subCommand_listFile(): s_file = \"" + s_file + "\"");
1656 22 May 07 gregory 1631     if (FTPDC_dataConnection != null)
1656 22 May 07 gregory 1632     {
1656 22 May 07 gregory 1633       try
1656 22 May 07 gregory 1634       {
1656 22 May 07 gregory 1635         if (!fa_permissions.listPermissionOK(s_file))
1656 22 May 07 gregory 1636         {
741 10 Oct 06 olle 1637           return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1638         }
1656 22 May 07 gregory 1639         else if (!fa_permissions.fileExists(s_file))
1656 22 May 07 gregory 1640         {
741 10 Oct 06 olle 1641           return "550 Requested action not taken. File or folder does not exists.";
1656 22 May 07 gregory 1642         }
1656 22 May 07 gregory 1643         else if (FTPDC_dataConnection
1656 22 May 07 gregory 1644           .waitForDataConnectionToBeTaken(i_timeForClientToTakeDataConnedtion)) // Wait
1656 22 May 07 gregory 1645         // 2
1656 22 May 07 gregory 1646         // secs
1656 22 May 07 gregory 1647         // for
1656 22 May 07 gregory 1648         // client
1656 22 May 07 gregory 1649         // to
1656 22 May 07 gregory 1650         // take
1656 22 May 07 gregory 1651         // data
1656 22 May 07 gregory 1652         // connection
1656 22 May 07 gregory 1653         // (true
1656 22 May 07 gregory 1654         // if
1656 22 May 07 gregory 1655         // taken,
1656 22 May 07 gregory 1656         // false
1656 22 May 07 gregory 1657         // if
1656 22 May 07 gregory 1658         // not
1656 22 May 07 gregory 1659         // taken)
741 10 Oct 06 olle 1660         {
741 10 Oct 06 olle 1661           sendResponse("150 Starting ASCII transfer for file listing.\r\n");
3469 02 Nov 09 olle 1662           FTPDC_dataConnection.setInSharedProjectsFolder(isTemporarilyInSharedProjectsFolder());
1652 22 May 07 gregory 1663           FTPDC_dataConnection.sendFileInfo(s_file,
1656 22 May 07 gregory 1664             isShowingRemovedFiles());
3469 02 Nov 09 olle 1665           FTPDC_dataConnection.setInSharedProjectsFolder(false);
741 10 Oct 06 olle 1666           FTPDC_dataConnection.killConnection();
741 10 Oct 06 olle 1667           return "226 Closing data connection; requested file action successful.";
1656 22 May 07 gregory 1668         }
1656 22 May 07 gregory 1669         else
1656 22 May 07 gregory 1670         {
1652 22 May 07 gregory 1671           // I don't know if this is really a good response, as we
1652 22 May 07 gregory 1672           // don't close the connection... It's just that the client
1652 22 May 07 gregory 1673           // has not taken the data connection we have opened.
741 10 Oct 06 olle 1674           return "426 Connection trouble, closed; transfer aborted. (Client did not take the data connection)";
741 10 Oct 06 olle 1675         }
1656 22 May 07 gregory 1676       }
1656 22 May 07 gregory 1677       catch (Exception e)
1656 22 May 07 gregory 1678       {
1656 22 May 07 gregory 1679         if (FTPDC_dataConnection.portNumberOccupiedWithPORT())
1656 22 May 07 gregory 1680         {
1656 22 May 07 gregory 1681           return "425-Xerver was not allowed to use port " + FTPDataConnection.i_dataPortNr + ".\r\n" + "425-Port may already be in use.\r\n" + "425 Transfer aborted.";
1656 22 May 07 gregory 1682         }
2418 22 Nov 07 gregory 1683         FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1684         return "426 Connection trouble, closed; transfer aborted.";
741 10 Oct 06 olle 1685       }
1656 22 May 07 gregory 1686     }
2418 22 Nov 07 gregory 1687     return "425 Can't open data connection"; // This response (425)
2418 22 Nov 07 gregory 1688 // shall not be given
2418 22 Nov 07 gregory 1689 // after a PASV,
2418 22 Nov 07 gregory 1690 // however, I have no
2418 22 Nov 07 gregory 1691 // idea what else to put
2418 22 Nov 07 gregory 1692 // here... Change this?
741 10 Oct 06 olle 1693   }
741 10 Oct 06 olle 1694
1656 22 May 07 gregory 1695
1656 22 May 07 gregory 1696   private String subCommand_listDir()
1656 22 May 07 gregory 1697   {
790 23 Oct 06 olle 1698     // *** Debug Info
3469 02 Nov 09 olle 1699     log.info("FTPNewConnection::subCommand_listDir(): Start - isTemporarilyInSharedProjectsFolder() = " + isTemporarilyInSharedProjectsFolder());
1656 22 May 07 gregory 1700     if (FTPDC_dataConnection != null)
1656 22 May 07 gregory 1701     {
1656 22 May 07 gregory 1702       try
1656 22 May 07 gregory 1703       {
1652 22 May 07 gregory 1704         log
1656 22 May 07 gregory 1705           .info("FTPNewConnection::subCommand_listDir(): s_currentRelativePath = \"" + s_currentRelativePath + "\"");
1652 22 May 07 gregory 1706         String s_listThisFolder = makeRealFilePath(s_currentRelativePath);
1652 22 May 07 gregory 1707         log
1656 22 May 07 gregory 1708           .info("FTPNewConnection::subCommand_listDir(): s_listThisFolder = \"" + s_listThisFolder + "\"");
3469 02 Nov 09 olle 1709         //
1656 22 May 07 gregory 1710         if (!fa_permissions.listPermissionOK(s_listThisFolder))
1656 22 May 07 gregory 1711         {
741 10 Oct 06 olle 1712           return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 1713         }
1656 22 May 07 gregory 1714         else if (!fa_permissions.fileExists(s_listThisFolder))
1656 22 May 07 gregory 1715         {
741 10 Oct 06 olle 1716           return "550 Requested action not taken. Folder does not exists.";
1656 22 May 07 gregory 1717         }
1656 22 May 07 gregory 1718         else if (FTPDC_dataConnection
1656 22 May 07 gregory 1719           .waitForDataConnectionToBeTaken(i_timeForClientToTakeDataConnedtion)) // Wait
1656 22 May 07 gregory 1720         // 2
1656 22 May 07 gregory 1721         // secs
1656 22 May 07 gregory 1722         // for
1656 22 May 07 gregory 1723         // client
1656 22 May 07 gregory 1724         // to
1656 22 May 07 gregory 1725         // take
1656 22 May 07 gregory 1726         // data
1656 22 May 07 gregory 1727         // connection
1656 22 May 07 gregory 1728         // (true
1656 22 May 07 gregory 1729         // if
1656 22 May 07 gregory 1730         // taken,
1656 22 May 07 gregory 1731         // false
1656 22 May 07 gregory 1732         // if
1656 22 May 07 gregory 1733         // not
1656 22 May 07 gregory 1734         // taken)
741 10 Oct 06 olle 1735         {
3469 02 Nov 09 olle 1736           FTPDC_dataConnection.setInSharedProjectsFolder(isTemporarilyInSharedProjectsFolder());
3469 02 Nov 09 olle 1737           //
741 10 Oct 06 olle 1738           sendResponse("150 Starting ASCII transfer for file listing.\r\n");
1652 22 May 07 gregory 1739           // if (s_currentRelativePath.equals(File.separator))
1652 22 May 07 gregory 1740           // //Aliases can only be listed (but might not be listed)
1652 22 May 07 gregory 1741           // when we are at root...
1652 22 May 07 gregory 1742           if (s_currentRelativePath.equals(coreSeparator)) // Aliases
1656 22 May 07 gregory 1743           // can
1656 22 May 07 gregory 1744           // only
1656 22 May 07 gregory 1745           // be
1656 22 May 07 gregory 1746           // listed
1656 22 May 07 gregory 1747           // (but
1656 22 May 07 gregory 1748           // might
1656 22 May 07 gregory 1749           // not
1656 22 May 07 gregory 1750           // be
1656 22 May 07 gregory 1751           // listed)
1656 22 May 07 gregory 1752           // when
1656 22 May 07 gregory 1753           // we
1656 22 May 07 gregory 1754           // are
1656 22 May 07 gregory 1755           // at
1656 22 May 07 gregory 1756           // root...
741 10 Oct 06 olle 1757           {
1652 22 May 07 gregory 1758             // HERE WE MAKE SURE THAT WE LIST ALIASES IF WE ARE IN
1652 22 May 07 gregory 1759             // ROOT AND WE SHALL SHOW ALISES
1652 22 May 07 gregory 1760             if (i_howToShowAlias == SHOW_NO_ALIASES)
1652 22 May 07 gregory 1761               FTPDC_dataConnection.sendListing(s_listThisFolder,
1656 22 May 07 gregory 1762                 isShowingRemovedFiles());
1652 22 May 07 gregory 1763             else if (i_howToShowAlias == SHOW_ONLY_ALIASES)
1652 22 May 07 gregory 1764               FTPDC_dataConnection
1656 22 May 07 gregory 1765                 .sendAliaslisting(as_aliasesName);
1656 22 May 07 gregory 1766             else
1656 22 May 07 gregory 1767             // if (i_howToShowAlias==SHOW_ALIASES_AND_DIRS)
741 10 Oct 06 olle 1768             {
1652 22 May 07 gregory 1769               FTPDC_dataConnection.sendListing(s_listThisFolder,
1656 22 May 07 gregory 1770                 isShowingRemovedFiles());
1652 22 May 07 gregory 1771               FTPDC_dataConnection
1656 22 May 07 gregory 1772                 .sendAliaslisting(as_aliasesName);
741 10 Oct 06 olle 1773             }
1656 22 May 07 gregory 1774           }
1656 22 May 07 gregory 1775           else
1656 22 May 07 gregory 1776           {
1652 22 May 07 gregory 1777             FTPDC_dataConnection.sendListing(s_listThisFolder,
1656 22 May 07 gregory 1778               isShowingRemovedFiles());
741 10 Oct 06 olle 1779           }
3469 02 Nov 09 olle 1780           FTPDC_dataConnection.setInSharedProjectsFolder(false);
741 10 Oct 06 olle 1781           FTPDC_dataConnection.killConnection();
741 10 Oct 06 olle 1782           return "226 Closing data connection; requested file action successful.";
1656 22 May 07 gregory 1783         }
1656 22 May 07 gregory 1784         else
1656 22 May 07 gregory 1785         {
1652 22 May 07 gregory 1786           // I don't know if this is really a good response, as we
1652 22 May 07 gregory 1787           // don't close the connection... It's just that the client
1652 22 May 07 gregory 1788           // has not taken the data connection we have opened.
3469 02 Nov 09 olle 1789           FTPDC_dataConnection.setInSharedProjectsFolder(false);
741 10 Oct 06 olle 1790           return "426 Connection trouble, closed; transfer aborted. (Client did not take the data connection)";
741 10 Oct 06 olle 1791         }
1656 22 May 07 gregory 1792       }
1656 22 May 07 gregory 1793       catch (Exception e)
1656 22 May 07 gregory 1794       {
1656 22 May 07 gregory 1795         if (FTPDC_dataConnection.portNumberOccupiedWithPORT())
1656 22 May 07 gregory 1796         {
1656 22 May 07 gregory 1797           return "425-Xerver was not allowed to use port " + FTPDataConnection.i_dataPortNr + ".\r\n" + "425-Port may already be in use.\r\n" + "425 Transfer aborted.";
1656 22 May 07 gregory 1798         }
2418 22 Nov 07 gregory 1799         FTPDC_dataConnection.killConnection();
2418 22 Nov 07 gregory 1800         return "426 Connection trouble, closed; transfer aborted.";
741 10 Oct 06 olle 1801       }
1656 22 May 07 gregory 1802     }
2418 22 Nov 07 gregory 1803     return "425 Can't open data connection"; // This response (425)
2418 22 Nov 07 gregory 1804 // shall not be given
2418 22 Nov 07 gregory 1805 // after a PASV,
2418 22 Nov 07 gregory 1806 // however, I have no
2418 22 Nov 07 gregory 1807 // idea what else to put
2418 22 Nov 07 gregory 1808 // here... Change this?
741 10 Oct 06 olle 1809   }
741 10 Oct 06 olle 1810
1656 22 May 07 gregory 1811
741 10 Oct 06 olle 1812   /**
1656 22 May 07 gregory 1813    * LIST - List remote file/directory ([remote file-specification]) For
1656 22 May 07 gregory 1814    * remote file-specification referring to a file, sends information about
1656 22 May 07 gregory 1815    * the file. For remote file-specification referring to a directory, sends
1656 22 May 07 gregory 1816    * information about each file in the directory. Optional argument [remote
1656 22 May 07 gregory 1817    * file-specification] defaults to the current directory. Must be preceded
1656 22 May 07 gregory 1818    * by a PORT or PASV command. For remote file-specification referring to a
1656 22 May 07 gregory 1819    * file, sends information about the file. For remote file-specification
1656 22 May 07 gregory 1820    * referring to a directory, sends information about each file in the
1656 22 May 07 gregory 1821    * directory. Optional argument [remote file-specification] defaults to the
1656 22 May 07 gregory 1822    * current directory. Must be preceded by a PORT or PASV command.
741 10 Oct 06 olle 1823    * 
1656 22 May 07 gregory 1824    * @param argFile String with name of file/directory on remote system.
741 10 Oct 06 olle 1825    * @return String with information on file/directory or error message.
741 10 Oct 06 olle 1826    */
1656 22 May 07 gregory 1827   private String command_LIST(String argFile)
1656 22 May 07 gregory 1828   {
790 23 Oct 06 olle 1829     // *** Debug Info
1656 22 May 07 gregory 1830     log
3469 02 Nov 09 olle 1831       .info("FTPNewConnection::command_LIST(): Start - argFile = \"" + argFile + "\" isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 1832     // Check if in shared projects folder
3469 02 Nov 09 olle 1833     if (isInSharedProjectsFolder())
3469 02 Nov 09 olle 1834     {
3469 02 Nov 09 olle 1835       log
3469 02 Nov 09 olle 1836         .info("FTPNewConnection::command_LIST(): Already in shared projects folder argFile = \"" + argFile + "\"");
3469 02 Nov 09 olle 1837     }
3469 02 Nov 09 olle 1838     else
3469 02 Nov 09 olle 1839     {
3469 02 Nov 09 olle 1840       log
3469 02 Nov 09 olle 1841         .info("FTPNewConnection::command_LIST(): Not already in shared projects folder argFile = \"" + argFile + "\"");
3469 02 Nov 09 olle 1842     }
3469 02 Nov 09 olle 1843     // Set initial value of temporarilyInSharedProjectsFolder to that of inSharedProjectsFolder
3469 02 Nov 09 olle 1844     setTemporarilyInSharedProjectsFolder(isInSharedProjectsFolder());
3469 02 Nov 09 olle 1845     // Check if path corresponds to shared projects folder
3469 02 Nov 09 olle 1846     if (pathIsSharedProjectsFolder(argFile))
3469 02 Nov 09 olle 1847     {
3469 02 Nov 09 olle 1848       setTemporarilyInSharedProjectsFolder(true);
3469 02 Nov 09 olle 1849       argFile = fetchSharedProjectsFolderRoot(argFile);
3469 02 Nov 09 olle 1850     }
3469 02 Nov 09 olle 1851     log
3469 02 Nov 09 olle 1852       .info("FTPNewConnection::command_LIST(): argFile = \"" + argFile + "\" isTemporarilyInSharedProjectsFolder = " + isTemporarilyInSharedProjectsFolder());
3469 02 Nov 09 olle 1853     String result;
1652 22 May 07 gregory 1854     if (argFile == null) // List a directory
741 10 Oct 06 olle 1855     {
3469 02 Nov 09 olle 1856       //return subCommand_listDir();
3469 02 Nov 09 olle 1857       result = subCommand_listDir();
1656 22 May 07 gregory 1858     }
1656 22 May 07 gregory 1859     else if (argFile.charAt(0) == '-') // For example "-aL"
741 10 Oct 06 olle 1860     {
3469 02 Nov 09 olle 1861       //return subCommand_listDir();
3469 02 Nov 09 olle 1862       result = subCommand_listDir();
1656 22 May 07 gregory 1863     }
1656 22 May 07 gregory 1864     else
1656 22 May 07 gregory 1865     // Show info on a file
741 10 Oct 06 olle 1866     {
3469 02 Nov 09 olle 1867       //return subCommand_listFile(argFile);
3469 02 Nov 09 olle 1868       result = subCommand_listFile(argFile);
741 10 Oct 06 olle 1869     }
3469 02 Nov 09 olle 1870     setTemporarilyInSharedProjectsFolder(false);
3469 02 Nov 09 olle 1871     return result;
741 10 Oct 06 olle 1872   }
741 10 Oct 06 olle 1873
1656 22 May 07 gregory 1874
741 10 Oct 06 olle 1875   /**
1656 22 May 07 gregory 1876    * PASV - Passive mode In passive mode, the server waits for the client to
1656 22 May 07 gregory 1877    * connect to it on a specific port. The port is specified as
1656 22 May 07 gregory 1878    * (a1,a2,a3,a4,p1,p2), where a1.a2.a3.a4 is the IP address and p1*256+p2 is
1656 22 May 07 gregory 1879    * the port number. In passive mode, the server waits for the client to
1656 22 May 07 gregory 1880    * connect to it on a specific port. The port is specified as
1656 22 May 07 gregory 1881    * (a1,a2,a3,a4,p1,p2), where a1.a2.a3.a4 is the IP address and p1*256+p2 is
1656 22 May 07 gregory 1882    * the port number.
741 10 Oct 06 olle 1883    * 
1656 22 May 07 gregory 1884    * @param dummy String (unused).
1652 22 May 07 gregory 1885    * @return String with address of the port the server is listening on, or
1652 22 May 07 gregory 1886    *         error message.
741 10 Oct 06 olle 1887    */
1656 22 May 07 gregory 1888   private String command_PASV(String dummy)
1656 22 May 07 gregory 1889   {
790 23 Oct 06 olle 1890     // *** Debug Info
1656 22 May 07 gregory 1891     log
1656 22 May 07 gregory 1892       .info("FTPNewConnection::command_PASV(): Start - dummy = \"" + dummy + "\"");
1656 22 May 07 gregory 1893     try
1656 22 May 07 gregory 1894     {
1652 22 May 07 gregory 1895       if (FTPDC_dataConnection != null)
1652 22 May 07 gregory 1896         FTPDC_dataConnection.stopListenToPort(); // If a transfer
1656 22 May 07 gregory 1897       // already is
1656 22 May 07 gregory 1898       // established, just
1656 22 May 07 gregory 1899       // kill it (this is
1656 22 May 07 gregory 1900       // what PASV is
1656 22 May 07 gregory 1901       // supposed to do)
1652 22 May 07 gregory 1902       FTPDC_dataConnection = new FTPDataConnection();
1676 25 May 07 olle 1903       FTPDC_dataConnection.setSessionControl(getSessionControl());
4047 01 Dec 10 olle 1904       FTPDC_dataConnection.setTextBasedFTPClientType(isTextBasedFTPClientType());
741 10 Oct 06 olle 1905       FTPDC_dataConnection.start();
1652 22 May 07 gregory 1906       int portNr = FTPDC_dataConnection.getPortNr();
1656 22 May 07 gregory 1907       if (b_isLocalConnection)
1656 22 May 07 gregory 1908       {
1656 22 May 07 gregory 1909         return "227 Entering passive mode (" + s_serverLocalIP + "," + portNr / 256 + "," + portNr % 256 + ").";
741 10 Oct 06 olle 1910       }
2418 22 Nov 07 gregory 1911       return "227 Entering passive mode (" + s_serverOuterIP + "," + portNr / 256 + "," + portNr % 256 + ").";
1656 22 May 07 gregory 1912     }
1656 22 May 07 gregory 1913     catch (Exception e)
1656 22 May 07 gregory 1914     {
1652 22 May 07 gregory 1915       showError(e);
1652 22 May 07 gregory 1916     }
1652 22 May 07 gregory 1917     return "425 Can't open data connection"; // This response (425) shall
1656 22 May 07 gregory 1918     // not be given after a
1656 22 May 07 gregory 1919     // PASV, however, I have no
1656 22 May 07 gregory 1920     // idea what else to put
1656 22 May 07 gregory 1921     // here... Change this?
741 10 Oct 06 olle 1922   }
741 10 Oct 06 olle 1923
1656 22 May 07 gregory 1924
741 10 Oct 06 olle 1925   /**
1656 22 May 07 gregory 1926    * PORT - Port to connect to in active mode (IPandPort) In active mode, the
1656 22 May 07 gregory 1927    * server connects to a specific client port. The port is specified as
1656 22 May 07 gregory 1928    * "a1,a2,a3,a4,p1,p2", where a1.a2.a3.a4 is the IP address and p1*256+p2 is
1656 22 May 07 gregory 1929    * the port number. In active mode, the server connects to a specific client
1656 22 May 07 gregory 1930    * port. The port is specified as "a1,a2,a3,a4,p1,p2", where a1.a2.a3.a4 is
1656 22 May 07 gregory 1931    * the IP address and p1*256+p2 is the port number.
741 10 Oct 06 olle 1932    * 
1656 22 May 07 gregory 1933    * @param IPandPort String with IP address and port number to connect to.
741 10 Oct 06 olle 1934    * @return String with success or error message.
741 10 Oct 06 olle 1935    */
1656 22 May 07 gregory 1936   private String command_PORT(String IPandPort)
1656 22 May 07 gregory 1937   {
790 23 Oct 06 olle 1938     // *** Debug Info
1656 22 May 07 gregory 1939     log
1656 22 May 07 gregory 1940       .info("FTPNewConnection::command_PORT(): Start - IPandPort = \"" + IPandPort + "\"");
1652 22 May 07 gregory 1941     if (IPandPort == null)
741 10 Oct 06 olle 1942       return "504 Command not implemented for an empty parameter.";
1656 22 May 07 gregory 1943     try
1656 22 May 07 gregory 1944     {
1652 22 May 07 gregory 1945       if (FTPDC_dataConnection != null)
1652 22 May 07 gregory 1946         FTPDC_dataConnection.stopListenToPort(); // If a transfer
1656 22 May 07 gregory 1947       // already is
1656 22 May 07 gregory 1948       // established, just
1656 22 May 07 gregory 1949       // kill it (this is
1656 22 May 07 gregory 1950       // what PASV is
1656 22 May 07 gregory 1951       // suppsoed to do)
1652 22 May 07 gregory 1952       // NOW MAKE IPandPort="1,2,3,4,a,b" ==> portNr=256*a+b and
1652 22 May 07 gregory 1953       // newIP="1.2.3.4"
741 10 Oct 06 olle 1954       String newIP, tmpPortString;
741 10 Oct 06 olle 1955       int portNr, tmpIndexOf;
1652 22 May 07 gregory 1956       newIP = IPandPort;
1652 22 May 07 gregory 1957       tmpIndexOf = newIP.lastIndexOf(',');
1652 22 May 07 gregory 1958       tmpPortString = newIP.substring(tmpIndexOf + 1); // tmpPortString="b"
1652 22 May 07 gregory 1959       newIP = newIP.substring(0, tmpIndexOf); // "1,2,3,4,a,b" ==>
1656 22 May 07 gregory 1960       // "1,2,3,4,a"
1652 22 May 07 gregory 1961       portNr = Integer.parseInt(tmpPortString); // portNr=b
1652 22 May 07 gregory 1962       tmpIndexOf = newIP.lastIndexOf(',');
1652 22 May 07 gregory 1963       tmpPortString = newIP.substring(tmpIndexOf + 1); // tmpPortString="a"
1652 22 May 07 gregory 1964       newIP = newIP.substring(0, tmpIndexOf); // "1,2,3,4,a" ==> "1,2,3,4"
1652 22 May 07 gregory 1965       portNr += 256 * Integer.parseInt(tmpPortString); // portNr=b+256*a
1652 22 May 07 gregory 1966       newIP = newIP.replace(',', '.');
1656 22 May 07 gregory 1967       if (s_usersIPNumber.equals(newIP) || s_usersIPNumber
1656 22 May 07 gregory 1968         .equals("127.0.0.1")) // IF [user wants
1656 22 May 07 gregory 1969       // connect to
1656 22 May 07 gregory 1970       // himself] OR [User
1656 22 May 07 gregory 1971       // is sitting at
1656 22 May 07 gregory 1972       // server], then
1656 22 May 07 gregory 1973       // accept the
1656 22 May 07 gregory 1974       // PORT-command
741 10 Oct 06 olle 1975       {
1652 22 May 07 gregory 1976         FTPDC_dataConnection = new FTPDataConnection(newIP, portNr);
1676 25 May 07 olle 1977         FTPDC_dataConnection.setSessionControl(getSessionControl());
4047 01 Dec 10 olle 1978         FTPDC_dataConnection.setTextBasedFTPClientType(isTextBasedFTPClientType());
741 10 Oct 06 olle 1979         FTPDC_dataConnection.start();
741 10 Oct 06 olle 1980         return "200 Port command successful.";
741 10 Oct 06 olle 1981       }
2418 22 Nov 07 gregory 1982       return "500 I won't open a connection to " + newIP + " (only to " + s_usersIPNumber + ")";
1656 22 May 07 gregory 1983     }
1656 22 May 07 gregory 1984     catch (Exception e)
1656 22 May 07 gregory 1985     {
1652 22 May 07 gregory 1986       showError(e);
1652 22 May 07 gregory 1987     }
1652 22 May 07 gregory 1988     return "425 Can't open data connection"; // This response (425) shall
1656 22 May 07 gregory 1989     // not be given after a
1656 22 May 07 gregory 1990     // PASV, however, I have no
1656 22 May 07 gregory 1991     // idea what else to put
1656 22 May 07 gregory 1992     // here... Change this?
741 10 Oct 06 olle 1993   }
741 10 Oct 06 olle 1994
1656 22 May 07 gregory 1995
741 10 Oct 06 olle 1996   /**
1652 22 May 07 gregory 1997    * TYPE - Type of file to be transferred (type-character
1656 22 May 07 gregory 1998    * [second-type-character]) First argument type-character can in general be
1656 22 May 07 gregory 1999    * one of: * A - ASCII text * E - EBCDIC text (not implemented in this
1656 22 May 07 gregory 2000    * method) * I - Image (binary data) * L - Local format
1656 22 May 07 gregory 2001    * (second-type-character specifies number of bits/byte, my not be omitted)
741 10 Oct 06 olle 2002    * For A and E, the optional second-type-character specifies how to
1652 22 May 07 gregory 2003    * interpret the text: * N - Non-print (default) * T - Telnet format control (<CR>,
1652 22 May 07 gregory 2004    * <FF>, etc.) * C - ASA Carriage Control
1652 22 May 07 gregory 2005    * 
1656 22 May 07 gregory 2006    * @param arg String with type information character(s).
741 10 Oct 06 olle 2007    * @return String with success or error message.
741 10 Oct 06 olle 2008    */
1656 22 May 07 gregory 2009   private String command_TYPE(String arg)
1656 22 May 07 gregory 2010   {
790 23 Oct 06 olle 2011     // *** Debug Info
1656 22 May 07 gregory 2012     log
1656 22 May 07 gregory 2013       .info("FTPNewConnection::command_TYPE(): Start - arg = \"" + arg + "\"");
1652 22 May 07 gregory 2014     if (arg == null)
741 10 Oct 06 olle 2015       return "504 Command not implemented for an empty parameter.";
1652 22 May 07 gregory 2016     arg = arg.toUpperCase();
1656 22 May 07 gregory 2017     if (arg.equals("A") || arg.equals("A N"))
1656 22 May 07 gregory 2018     {
1652 22 May 07 gregory 2019       b_binaryFlag = false;
741 10 Oct 06 olle 2020       return "200 Binary flag is unset (turned off).";
1656 22 May 07 gregory 2021     }
1656 22 May 07 gregory 2022     else if (arg.equals("I") || arg.equals("L 8"))
1656 22 May 07 gregory 2023     {
1652 22 May 07 gregory 2024       b_binaryFlag = true;
741 10 Oct 06 olle 2025       return "200 Binary flag is set (turned on).";
1656 22 May 07 gregory 2026     }
1656 22 May 07 gregory 2027     else
1656 22 May 07 gregory 2028     {
741 10 Oct 06 olle 2029       return "504 Command not implemented for that parameter.";
741 10 Oct 06 olle 2030     }
741 10 Oct 06 olle 2031   }
741 10 Oct 06 olle 2032
1656 22 May 07 gregory 2033
741 10 Oct 06 olle 2034   /**
1656 22 May 07 gregory 2035    * REST - Restart (position) Sets starting point of file transmission
1656 22 May 07 gregory 2036    * (useful when resuming interrupted file transfers). Must be preceded by a
1656 22 May 07 gregory 2037    * PORT or PASV command toindicate where to accept data from. Must
1656 22 May 07 gregory 2038    * immediately precede a RETR or STOR data transfer commend. The position
1656 22 May 07 gregory 2039    * value is a decimal number for non-structured files. Sets starting point
1656 22 May 07 gregory 2040    * of file transmission (useful when resuming interrupted file transfers).
1656 22 May 07 gregory 2041    * Must be preceded by a PORT or PASV command toindicate where to accept
1656 22 May 07 gregory 2042    * data from. Must immediately precede a RETR or STOR data transfer commend.
1656 22 May 07 gregory 2043    * The position value is a decimal number for non-structured files.
741 10 Oct 06 olle 2044    * 
1656 22 May 07 gregory 2045    * @param startPosValue String with decimal position value.
741 10 Oct 06 olle 2046    * @return String with success or error message.
741 10 Oct 06 olle 2047    */
1656 22 May 07 gregory 2048   private String command_REST(String startPosValue)
1656 22 May 07 gregory 2049   {
790 23 Oct 06 olle 2050     // *** Debug Info
1656 22 May 07 gregory 2051     log
1656 22 May 07 gregory 2052       .info("FTPNewConnection::command_REST(): Start - startPosValue = \"" + startPosValue + "\"");
1656 22 May 07 gregory 2053     try
1656 22 May 07 gregory 2054     {
1652 22 May 07 gregory 2055       i_startPosition = Integer.parseInt(startPosValue);
1652 22 May 07 gregory 2056       if (i_startPosition < 0)
741 10 Oct 06 olle 2057         return "501 Syntax error in parameters or arguments";
741 10 Oct 06 olle 2058       if (b_binaryFlag)
1652 22 May 07 gregory 2059         return "350 Restarting at " + i_startPosition + ".";
2418 22 Nov 07 gregory 2060       return "350 Restarting at " + i_startPosition + ". But we're in ASCII mode.";
1656 22 May 07 gregory 2061     }
1656 22 May 07 gregory 2062     catch (Exception e) // java.lang.NumberFormatException: For input
1656 22 May 07 gregory 2063     // string: "noString"
741 10 Oct 06 olle 2064     {
741 10 Oct 06 olle 2065       return "501 Syntax error in parameters or arguments";
741 10 Oct 06 olle 2066     }
741 10 Oct 06 olle 2067   }
741 10 Oct 06 olle 2068
1656 22 May 07 gregory 2069
741 10 Oct 06 olle 2070   /**
1656 22 May 07 gregory 2071    * STRU - Structure of file to be transferred (structure-character) Argument
1656 22 May 07 gregory 2072    * structure-character can in general be one of: * F - File, no structure
1656 22 May 07 gregory 2073    * (default) * R - Record structure (not implemented in this method) * P -
1656 22 May 07 gregory 2074    * Page structure (not implemented in this method) Argument
1656 22 May 07 gregory 2075    * structure-character can in general be one of: * F - File, no structure
1656 22 May 07 gregory 2076    * (default) * R - Record structure (not implemented in this method) * P -
1656 22 May 07 gregory 2077    * Page structure (not implemented in this method)
741 10 Oct 06 olle 2078    * 
1656 22 May 07 gregory 2079    * @param dummy String with structure information character.
741 10 Oct 06 olle 2080    * @return String with success or error message.
741 10 Oct 06 olle 2081    */
1656 22 May 07 gregory 2082   private String command_STRU(String dummy)
1656 22 May 07 gregory 2083   {
790 23 Oct 06 olle 2084     // *** Debug Info
1656 22 May 07 gregory 2085     log
1656 22 May 07 gregory 2086       .info("FTPNewConnection::command_STRU(): Start - dummy = \"" + dummy + "\"");
1652 22 May 07 gregory 2087     if (dummy != null && dummy.equalsIgnoreCase("F"))
741 10 Oct 06 olle 2088       return "200 STRU is obsolete.";
2418 22 Nov 07 gregory 2089     return "504 STRU is obsolete, but I can accept a F as parameter.";
741 10 Oct 06 olle 2090   }
741 10 Oct 06 olle 2091
1656 22 May 07 gregory 2092
741 10 Oct 06 olle 2093   /**
1656 22 May 07 gregory 2094    * MODE - Mode of transfer (mode-character) Argument mode-character can in
1656 22 May 07 gregory 2095    * general be one of: * S - Stream (default) * B - Block (not implemented in
1656 22 May 07 gregory 2096    * this method) * C - Compressed (not implemented in this method) Argument
1656 22 May 07 gregory 2097    * mode-character can in general be one of: * S - Stream (default) * B -
1656 22 May 07 gregory 2098    * Block (not implemented in this method) * C - Compressed (not implemented
1656 22 May 07 gregory 2099    * in this method)
741 10 Oct 06 olle 2100    * 
1656 22 May 07 gregory 2101    * @param dummy String with mode information character.
741 10 Oct 06 olle 2102    * @return String with success or error message.
741 10 Oct 06 olle 2103    */
1656 22 May 07 gregory 2104   private String command_MODE(String dummy)
1656 22 May 07 gregory 2105   {
790 23 Oct 06 olle 2106     // *** Debug Info
1656 22 May 07 gregory 2107     log
1656 22 May 07 gregory 2108       .info("FTPNewConnection::command_MODE(): Start - dummy = \"" + dummy + "\"");
1652 22 May 07 gregory 2109     if (dummy != null && dummy.equalsIgnoreCase("S"))
741 10 Oct 06 olle 2110       return "200 MODE is obsolete.";
2418 22 Nov 07 gregory 2111     return "504 MODE is obsolete, but I can accept a S as parameter.";
741 10 Oct 06 olle 2112   }
741 10 Oct 06 olle 2113
1656 22 May 07 gregory 2114
741 10 Oct 06 olle 2115   /**
741 10 Oct 06 olle 2116    * HELP - Help ([command])
741 10 Oct 06 olle 2117    * 
1656 22 May 07 gregory 2118    * @param verb String with command to get help on (not used).
741 10 Oct 06 olle 2119    * @return String with list of supported commands.
741 10 Oct 06 olle 2120    */
1656 22 May 07 gregory 2121   private String command_HELP(String verb)
1656 22 May 07 gregory 2122   {
790 23 Oct 06 olle 2123     // *** Debug Info
1656 22 May 07 gregory 2124     log
1656 22 May 07 gregory 2125       .info("FTPNewConnection::command_HELP(): Start - verb = \"" + verb + "\"");
1656 22 May 07 gregory 2126     return "214-Supported commands:\r\n" + "214-USER PASS HELP QUIT CWD XCWD\r\n" + "214-PWD XPWD CDUP XCUP MKD XMKD\r\n" + "214-RMD XRMD SYST STAT NOOP STRU\r\n" + "214-MODE TYPE REST PASV PORT LIST\r\n" + "214-RETR STOR ALLO DELE RNFR RNTO SIZE\r\n" + "214-\r\n" + "214 [End of Help].";
741 10 Oct 06 olle 2127   }
741 10 Oct 06 olle 2128
1656 22 May 07 gregory 2129
741 10 Oct 06 olle 2130   /**
741 10 Oct 06 olle 2131    * NOOP - No Operation
741 10 Oct 06 olle 2132    * 
1656 22 May 07 gregory 2133    * @param dummy String with argument (not used).
741 10 Oct 06 olle 2134    * @return String with result message.
741 10 Oct 06 olle 2135    */
1656 22 May 07 gregory 2136   private String command_NOOP(String dummy)
1656 22 May 07 gregory 2137   {
790 23 Oct 06 olle 2138     // *** Debug Info
1656 22 May 07 gregory 2139     log
1656 22 May 07 gregory 2140       .info("FTPNewConnection::command_NOOP(): Start - dummy = \"" + dummy + "\"");
741 10 Oct 06 olle 2141     i_countNOOP++;
1656 22 May 07 gregory 2142     try
1656 22 May 07 gregory 2143     {
741 10 Oct 06 olle 2144       /*
1652 22 May 07 gregory 2145        * Note: This MIGHT (if we have "been idle" too long) write a
1652 22 May 07 gregory 2146        * "Bye"-response and then close the connection, so Xerver will try
1652 22 May 07 gregory 2147        * to write "200 NOOP command successful." to a closed Socket later.
741 10 Oct 06 olle 2148        */
1656 22 May 07 gregory 2149       if (disconnectBecauseIdleTime())
1656 22 May 07 gregory 2150       {
741 10 Oct 06 olle 2151         return "221 Bye. You have been idle for a long time now.";
741 10 Oct 06 olle 2152       }
741 10 Oct 06 olle 2153     }
1656 22 May 07 gregory 2154     catch (Exception e)
1656 22 May 07 gregory 2155     {}
741 10 Oct 06 olle 2156     return "200 NOOP command successful.";
741 10 Oct 06 olle 2157   }
741 10 Oct 06 olle 2158
1656 22 May 07 gregory 2159
741 10 Oct 06 olle 2160   /**
1656 22 May 07 gregory 2161    * SYST - System information Returns a string identifying the system, the
1656 22 May 07 gregory 2162    * string "Type:", and the default transfer type, as set by the TYPE
1656 22 May 07 gregory 2163    * command. Example: UNIX Type: L8 This method simply returns a hard-coded
1656 22 May 07 gregory 2164    * string with system information, and therefore needs to be adapted to the
1656 22 May 07 gregory 2165    * system it is implemented on. Returns a string identifying the system, the
1656 22 May 07 gregory 2166    * string "Type:", and the default transfer type, as set by the TYPE
1656 22 May 07 gregory 2167    * command. Example: UNIX Type: L8 This method simply returns a hard-coded
1656 22 May 07 gregory 2168    * string with system information, and therefore needs to be adapted to the
1656 22 May 07 gregory 2169    * system it is implemented on.
741 10 Oct 06 olle 2170    * 
1656 22 May 07 gregory 2171    * @param dummy String with argument (not used).
741 10 Oct 06 olle 2172    * @return String with system information.
741 10 Oct 06 olle 2173    */
1656 22 May 07 gregory 2174   private String command_SYST(String dummy)
1656 22 May 07 gregory 2175   {
790 23 Oct 06 olle 2176     // *** Debug Info
1656 22 May 07 gregory 2177     log
1656 22 May 07 gregory 2178       .info("FTPNewConnection::command_SYST(): Start - dummy = \"" + dummy + "\"");
4047 01 Dec 10 olle 2179     // Set flag indicating text-based FTP client type to true,
4047 01 Dec 10 olle 2180     // as this type of client seems to call the SYST command.
4047 01 Dec 10 olle 2181     setTextBasedFTPClientType(true);
1656 22 May 07 gregory 2182     if (File.separator.equals("/"))
1656 22 May 07 gregory 2183     {
1652 22 May 07 gregory 2184       log
1656 22 May 07 gregory 2185         .info("FTPNewConnection::command_SYST(): return \"215 UNIX Type: L8\"");
798 24 Oct 06 olle 2186       return "215 UNIX Type: L8";
1656 22 May 07 gregory 2187     }
2418 22 Nov 07 gregory 2188     log
2418 22 Nov 07 gregory 2189       .info("FTPNewConnection::command_SYST(): return \"215 Windows_NT version 5.0\"");
2418 22 Nov 07 gregory 2190     return "215 Windows_NT version 5.0";
741 10 Oct 06 olle 2191   }
741 10 Oct 06 olle 2192
1656 22 May 07 gregory 2193
741 10 Oct 06 olle 2194   /**
1656 22 May 07 gregory 2195    * STAT - Status information ([remote file-specification]) If invoked
1656 22 May 07 gregory 2196    * without argument, returns general status information on the FTP server
1656 22 May 07 gregory 2197    * process. With a file-specification argument, acts like the LIST command,
1656 22 May 07 gregory 2198    * except that the information is sent over the control connection, so no
1656 22 May 07 gregory 2199    * PORT or PASV command is required: General expected output is: For remote
1656 22 May 07 gregory 2200    * file-specification referring to a file, sends information about the file.
1656 22 May 07 gregory 2201    * For remote file-specification referring to a directory, sends information
1656 22 May 07 gregory 2202    * about each file in the directory. This method only accepts subCommand
1656 22 May 07 gregory 2203    * argument starting with a hyphen '-', and then ignores characters that
1656 22 May 07 gregory 2204    * follow.
1652 22 May 07 gregory 2205    * 
1656 22 May 07 gregory 2206    * @param subCommand String with name of file/directory on remote system.
741 10 Oct 06 olle 2207    * @return String with information on file/directory or error message.
741 10 Oct 06 olle 2208    */
1656 22 May 07 gregory 2209   private String command_STAT(String subCommand)
1656 22 May 07 gregory 2210   {
790 23 Oct 06 olle 2211     // *** Debug Info
1656 22 May 07 gregory 2212     log
1656 22 May 07 gregory 2213       .info("FTPNewConnection::command_STAT(): Start - subCommand = \"" + subCommand + "\"");
1656 22 May 07 gregory 2214     if (subCommand == null)
1656 22 May 07 gregory 2215     {
931 16 Nov 06 olle 2216       log.info("FTPNewConnection::command_STAT(): subCommand==null");
1652 22 May 07 gregory 2217       // More information about the status of the server shall be given...
1652 22 May 07 gregory 2218       // return "211 This server is running Xerver Free FTP Server
1652 22 May 07 gregory 2219       // "+FTPServerController.getVersionString()+".";
1656 22 May 07 gregory 2220       return "211 This server is running Proteios FTP Server, based on Xerver Free FTP Server " + FTPServerController
1656 22 May 07 gregory 2221         .getVersionString() + ".";
1656 22 May 07 gregory 2222     }
1656 22 May 07 gregory 2223     else if (subCommand.equals("--showing_removed_files"))
1656 22 May 07 gregory 2224     {
931 16 Nov 06 olle 2225       /*
931 16 Nov 06 olle 2226        * New functionality not in original Xerver code.
931 16 Nov 06 olle 2227        */
1652 22 May 07 gregory 2228       log
1656 22 May 07 gregory 2229         .info("FTPNewConnection::command_STAT(): subCommand.equals(\"--showing_removed_files\")");
1656 22 May 07 gregory 2230       return "211 Showing removed files mode is " + getShowingRemovedFilesMode() + ".";
1656 22 May 07 gregory 2231     }
1656 22 May 07 gregory 2232     else if (subCommand.equals("--showing_removed_files=on"))
1656 22 May 07 gregory 2233     {
931 16 Nov 06 olle 2234       /*
931 16 Nov 06 olle 2235        * New functionality not in original Xerver code.
931 16 Nov 06 olle 2236        */
1652 22 May 07 gregory 2237       log
1656 22 May 07 gregory 2238         .info("FTPNewConnection::command_STAT(): subCommand.equals(\"--showing_removed_files=on\")");
931 16 Nov 06 olle 2239       setShowingRemovedFiles(true);
1656 22 May 07 gregory 2240       return "211 Showing removed files mode is set to " + getShowingRemovedFilesMode() + ".";
1656 22 May 07 gregory 2241     }
1656 22 May 07 gregory 2242     else if (subCommand.equals("--showing_removed_files=off"))
1656 22 May 07 gregory 2243     {
931 16 Nov 06 olle 2244       /*
931 16 Nov 06 olle 2245        * New functionality not in original Xerver code.
931 16 Nov 06 olle 2246        */
1652 22 May 07 gregory 2247       log
1656 22 May 07 gregory 2248         .info("FTPNewConnection::command_STAT(): subCommand.equals(\"--showing_removed_files=off\")");
931 16 Nov 06 olle 2249       setShowingRemovedFiles(false);
1656 22 May 07 gregory 2250       return "211 Showing removed files mode is set to " + getShowingRemovedFilesMode() + ".";
1656 22 May 07 gregory 2251     }
1656 22 May 07 gregory 2252     else if (subCommand.charAt(0) == '-')
1656 22 May 07 gregory 2253     {
1652 22 May 07 gregory 2254       log
1656 22 May 07 gregory 2255         .info("FTPNewConnection::command_STAT(): subCommand.charAt(0)=='-'");
1656 22 May 07 gregory 2256       try
1656 22 May 07 gregory 2257       {
1652 22 May 07 gregory 2258         if (!fa_permissions
1656 22 May 07 gregory 2259           .listPermissionOK(makeRealFilePath(s_currentRelativePath)))
1656 22 May 07 gregory 2260         {
741 10 Oct 06 olle 2261           return "550 Requested action not taken. Permission denied.";
1656 22 May 07 gregory 2262         }
1656 22 May 07 gregory 2263         else if (!fa_permissions
1656 22 May 07 gregory 2264           .fileExists(makeRealFilePath(s_currentRelativePath)))
1656 22 May 07 gregory 2265         {
741 10 Oct 06 olle 2266           return "550 Requested action not taken. Folder does not exists.";
1656 22 May 07 gregory 2267         }
1656 22 May 07 gregory 2268         else
1656 22 May 07 gregory 2269         {
1652 22 May 07 gregory 2270           // if (s_currentRelativePath.equals(File.separator))
1652 22 May 07 gregory 2271           // //Aliases can only be listed (but might not be listed)
1652 22 May 07 gregory 2272           // when we are at root...
1652 22 May 07 gregory 2273           if (s_currentRelativePath.equals(coreSeparator)) // Aliases
1656 22 May 07 gregory 2274           // can
1656 22 May 07 gregory 2275           // only
1656 22 May 07 gregory 2276           // be
1656 22 May 07 gregory 2277           // listed
1656 22 May 07 gregory 2278           // (but
1656 22 May 07 gregory 2279           // might
1656 22 May 07 gregory 2280           // not
1656 22 May 07 gregory 2281           // be
1656 22 May 07 gregory 2282           // listed)
1656 22 May 07 gregory 2283           // when
1656 22 May 07 gregory 2284           // we
1656 22 May 07 gregory 2285           // are
1656 22 May 07 gregory 2286           // at
1656 22 May 07 gregory 2287           // root...
741 10 Oct 06 olle 2288           {
1652 22 May 07 gregory 2289             // HERE WE MAKE SURE THAT WE LIST ALIASES IF WE ARE IN
1652 22 May 07 gregory 2290             // ROOT AND WE SHALL SHOW ALISES
1656 22 May 07 gregory 2291             if (i_howToShowAlias == SHOW_NO_ALIASES)
1656 22 May 07 gregory 2292             {
1652 22 May 07 gregory 2293               // (new
1652 22 May 07 gregory 2294               // MyLS(makeRealFilePath(s_currentRelativePath))).sendListingAsResponseFormat(bos);
2142 16 Oct 07 gregory 2295               (new MyLS(makeRealFilePath(s_currentRelativePath),
4047 01 Dec 10 olle 2296                 getSessionControl(), isTextBasedFTPClientType()))
1656 22 May 07 gregory 2297                 .sendListingAsResponseFormat(bos,
1656 22 May 07 gregory 2298                   isShowingRemovedFiles());
1656 22 May 07 gregory 2299             }
1656 22 May 07 gregory 2300             else if (i_howToShowAlias == SHOW_ONLY_ALIASES)
1656 22 May 07 gregory 2301             {
1652 22 May 07 gregory 2302               MyLS.sendAliaslistingAsResponseFormat(bos,
1656 22 May 07 gregory 2303                 as_aliasesName);
1656 22 May 07 gregory 2304             }
1656 22 May 07 gregory 2305             else
1656 22 May 07 gregory 2306             // if (i_howToShowAlias==SHOW_ALIASES_AND_DIRS)
931 16 Nov 06 olle 2307             {
1652 22 May 07 gregory 2308               // (new
1652 22 May 07 gregory 2309               // MyLS(makeRealFilePath(s_currentRelativePath))).sendListingAsResponseFormat(bos);
2142 16 Oct 07 gregory 2310               (new MyLS(makeRealFilePath(s_currentRelativePath),
4047 01 Dec 10 olle 2311                 getSessionControl(), isTextBasedFTPClientType()))
1656 22 May 07 gregory 2312                 .sendListingAsResponseFormat(bos,
1656 22 May 07 gregory 2313                   isShowingRemovedFiles());
1652 22 May 07 gregory 2314               MyLS.sendAliaslistingAsResponseFormat(bos,
1656 22 May 07 gregory 2315                 as_aliasesName);
931 16 Nov 06 olle 2316             }
1656 22 May 07 gregory 2317           }
1656 22 May 07 gregory 2318           else
1656 22 May 07 gregory 2319           {
1652 22 May 07 gregory 2320             // (new
1652 22 May 07 gregory 2321             // MyLS(makeRealFilePath(s_currentRelativePath))).sendListingAsResponseFormat(bos);
2142 16 Oct 07 gregory 2322             (new MyLS(makeRealFilePath(s_currentRelativePath),
4047 01 Dec 10 olle 2323               getSessionControl(), isTextBasedFTPClientType())).sendListingAsResponseFormat(
2142 16 Oct 07 gregory 2324               bos, isShowingRemovedFiles());
741 10 Oct 06 olle 2325           }
741 10 Oct 06 olle 2326           return "213 Directory listing done!";
741 10 Oct 06 olle 2327         }
741 10 Oct 06 olle 2328       }
1656 22 May 07 gregory 2329       catch (Exception e)
1656 22 May 07 gregory 2330       {
1656 22 May 07 gregory 2331         return "213-Directory listing failed!" + "213 The reason for the failure is: " + e;
1656 22 May 07 gregory 2332       }
1656 22 May 07 gregory 2333     }
1656 22 May 07 gregory 2334     else
1656 22 May 07 gregory 2335     {
1652 22 May 07 gregory 2336       log
1656 22 May 07 gregory 2337         .info("FTPNewConnection::command_STAT(): subCommand does not equal any predefined string.");
1652 22 May 07 gregory 2338       // return "211 This server is running Xerver Free FTP Server
1652 22 May 07 gregory 2339       // "+FTPServerController.getVersionString()+".";
1656 22 May 07 gregory 2340       return "211 This server is running Proteios FTP Server, based on Xerver Free FTP Server " + FTPServerController
1656 22 May 07 gregory 2341         .getVersionString() + ".";
741 10 Oct 06 olle 2342     }
741 10 Oct 06 olle 2343   }
741 10 Oct 06 olle 2344
1656 22 May 07 gregory 2345
741 10 Oct 06 olle 2346   /**
741 10 Oct 06 olle 2347    * QUIT - Quit command connection
741 10 Oct 06 olle 2348    * 
1656 22 May 07 gregory 2349    * @param dummy String with argument (not used).
741 10 Oct 06 olle 2350    * @return String with result (good-bye) message.
741 10 Oct 06 olle 2351    */
1656 22 May 07 gregory 2352   private String command_QUIT(String dummy)
1656 22 May 07 gregory 2353   {
790 23 Oct 06 olle 2354     // *** Debug Info
1656 22 May 07 gregory 2355     log
1656 22 May 07 gregory 2356       .info("FTPNewConnection::command_QUIT(): Start - dummy = \"" + dummy + "\"");
931 16 Nov 06 olle 2357     /*
931 16 Nov 06 olle 2358      * Log out from Proteios
931 16 Nov 06 olle 2359      */
1656 22 May 07 gregory 2360     try
1656 22 May 07 gregory 2361     {
1676 25 May 07 olle 2362       getSessionControl().logout();
1656 22 May 07 gregory 2363     }
1656 22 May 07 gregory 2364     catch (Exception e)
1656 22 May 07 gregory 2365     {
1652 22 May 07 gregory 2366       log
1656 22 May 07 gregory 2367         .warn("FTPNewConnection::command_QUIT(): Error when trying to log out: " + e);
931 16 Nov 06 olle 2368     }
1652 22 May 07 gregory 2369     isAlive = false;
741 10 Oct 06 olle 2370     return "221 Bye.";
741 10 Oct 06 olle 2371   }
741 10 Oct 06 olle 2372
1656 22 May 07 gregory 2373
741 10 Oct 06 olle 2374   /**
741 10 Oct 06 olle 2375    * PWD - Print Working Directory
741 10 Oct 06 olle 2376    * 
1656 22 May 07 gregory 2377    * @param dummy String with argument (not used).
741 10 Oct 06 olle 2378    * @return String with working directory.
741 10 Oct 06 olle 2379    */
1656 22 May 07 gregory 2380   private String command_PWD(String dummy)
1656 22 May 07 gregory 2381   {
790 23 Oct 06 olle 2382     // *** Debug Info
1652 22 May 07 gregory 2383     log
1656 22 May 07 gregory 2384       .info("FTPNewConnection::command_PWD(): Start - dummy = \"" + dummy + "\"");
1652 22 May 07 gregory 2385     log
1656 22 May 07 gregory 2386       .info("FTPNewConnection::command_PWD(): s_currentRelativePath = \"" + s_currentRelativePath + "\"");
1652 22 May 07 gregory 2387     log
1656 22 May 07 gregory 2388       .info("FTPNewConnection::command_PWD(): makeSlashForResponse(s_currentRelativePath) = \"" + makeSlashForResponse(s_currentRelativePath) + "\"");
1652 22 May 07 gregory 2389     log
1656 22 May 07 gregory 2390       .info("FTPNewConnection::command_PWD(): s_root = \"" + s_root + "\"");
1656 22 May 07 gregory 2391     log
1656 22 May 07 gregory 2392       .info("FTPNewConnection::command_PWD(): makeAbsolutePath(s_currentRelativePath) = \"" + makeAbsolutePath(s_currentRelativePath) + "\"");
1656 22 May 07 gregory 2393     log
1656 22 May 07 gregory 2394       .info("FTPNewConnection::command_PWD(): makeRealFilePath(s_currentRelativePath) = \"" + makeRealFilePath(s_currentRelativePath) + "\"");
1652 22 May 07 gregory 2395     // return "257 \""+makeSlashForResponse(s_currentRelativePath)+"\"";
1652 22 May 07 gregory 2396     return "257 \"" + makeRealFilePath(s_currentRelativePath) + "\"";
741 10 Oct 06 olle 2397   }
741 10 Oct 06 olle 2398
1656 22 May 07 gregory 2399
741 10 Oct 06 olle 2400   /**
1656 22 May 07 gregory 2401    * CDUP - Change Directory Up Changes working directory to the parent
1656 22 May 07 gregory 2402    * directory of the current working directory, i.e. moves one step up in the
1656 22 May 07 gregory 2403    * directroy tree structure.
1652 22 May 07 gregory 2404    * 
1656 22 May 07 gregory 2405    * @param dummy String with argument (not used).
741 10 Oct 06 olle 2406    * @return String with result message from invoked CWD command.
741 10 Oct 06 olle 2407    */
1656 22 May 07 gregory 2408   private String command_CDUP(String dummy)
1656 22 May 07 gregory 2409   {
790 23 Oct 06 olle 2410     // *** Debug Info
1656 22 May 07 gregory 2411     log
1656 22 May 07 gregory 2412       .info("FTPNewConnection::command_CDUP(): Start - dummy = \"" + dummy + "\"");
1656 22 May 07 gregory 2413     log
1656 22 May 07 gregory 2414       .info("FTPNewConnection::command_CDUP(): s_currentRelativePath = \"" + s_currentRelativePath + "\"");
1652 22 May 07 gregory 2415     // if (!s_currentRelativePath.equals(File.separator))
1652 22 May 07 gregory 2416     // return
1652 22 May 07 gregory 2417     // command_CWD(s_currentRelativePath.substring(0,s_currentRelativePath.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 2418     // s_currentRelativePath.length()-2)+1));
1652 22 May 07 gregory 2419     // else
1652 22 May 07 gregory 2420     // return command_CWD(File.separator);
1656 22 May 07 gregory 2421     if (!s_currentRelativePath.equals(coreSeparator))
1656 22 May 07 gregory 2422     {
1652 22 May 07 gregory 2423       return command_CWD(s_currentRelativePath.substring(0,
1656 22 May 07 gregory 2424         s_currentRelativePath.lastIndexOf(coreSeparatorChar,
1656 22 May 07 gregory 2425           s_currentRelativePath.length() - 2) + 1));
1656 22 May 07 gregory 2426     }
2418 22 Nov 07 gregory 2427     return command_CWD(coreSeparator);
741 10 Oct 06 olle 2428   }
741 10 Oct 06 olle 2429
1656 22 May 07 gregory 2430
741 10 Oct 06 olle 2431   /**
1656 22 May 07 gregory 2432    * CWD - Change Working Directory (remote-directory) Changes working
1656 22 May 07 gregory 2433    * directory to the given directory on the remote host.
1652 22 May 07 gregory 2434    * 
1656 22 May 07 gregory 2435    * @param argPath String with path to new working directory.
741 10 Oct 06 olle 2436    * @return String with result or error message.
741 10 Oct 06 olle 2437    */
1656 22 May 07 gregory 2438   private String command_CWD(String argPath)
1656 22 May 07 gregory 2439   {
790 23 Oct 06 olle 2440     // *** Debug Info
1656 22 May 07 gregory 2441     log
3469 02 Nov 09 olle 2442       .info("FTPNewConnection::command_CWD(): Start - argPath = \"" + argPath + "\" isInSharedProjectsFolder() = " + isInSharedProjectsFolder());
1652 22 May 07 gregory 2443     if (argPath == null)
741 10 Oct 06 olle 2444       return "504 Command not implemented for an empty parameter.";
3469 02 Nov 09 olle 2445     // Store input argPath as we may need it later if in shared projects folder
3469 02 Nov 09 olle 2446     String inputArgPath = new String(argPath);
3469 02 Nov 09 olle 2447     // Check if in shared projects folder
3469 02 Nov 09 olle 2448     if (isInSharedProjectsFolder())
3469 02 Nov 09 olle 2449     {
3469 02 Nov 09 olle 2450       log
3469 02 Nov 09 olle 2451         .info("FTPNewConnection::command_CWD(): Already in shared projects folder argPath = \"" + argPath + "\"");
3469 02 Nov 09 olle 2452     }
3469 02 Nov 09 olle 2453     else
3469 02 Nov 09 olle 2454     {
3469 02 Nov 09 olle 2455       log
3469 02 Nov 09 olle 2456         .info("FTPNewConnection::command_CWD(): Not already in shared projects folder argPath = \"" + argPath + "\"");
3469 02 Nov 09 olle 2457     }      
3469 02 Nov 09 olle 2458     // Check if path corresponds to shared projects folder
3469 02 Nov 09 olle 2459     if (pathIsSharedProjectsFolder(argPath))
3469 02 Nov 09 olle 2460     {
3469 02 Nov 09 olle 2461       setInSharedProjectsFolder(true);
3469 02 Nov 09 olle 2462       argPath = fetchSharedProjectsFolderRoot(argPath);
3469 02 Nov 09 olle 2463       String s_newPath = makeSlashAtEnd(argPath);
3469 02 Nov 09 olle 2464       s_currentRelativePath = new String(s_newPath);
3469 02 Nov 09 olle 2465       // Path is valid
3469 02 Nov 09 olle 2466       log
3469 02 Nov 09 olle 2467         .info("FTPNewConnection::command_CWD(): (0) argPath = \"" + argPath + "\" s_newPath = \"" + s_newPath + "\" s_currentRelativePath = \"" + s_currentRelativePath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 2468       return "250 Present working directory is now " + makeSlashForResponse(s_currentRelativePath);
3469 02 Nov 09 olle 2469     }
3469 02 Nov 09 olle 2470     log
3469 02 Nov 09 olle 2471       .info("FTPNewConnection::command_CWD(): argPath = \"" + argPath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 2472     // Check if path contains shared projects folder
3469 02 Nov 09 olle 2473     if (pathContainsSharedProjectsFolder(argPath))
3469 02 Nov 09 olle 2474     {
3469 02 Nov 09 olle 2475       setInSharedProjectsFolder(true);
3469 02 Nov 09 olle 2476     }
3469 02 Nov 09 olle 2477     log
3469 02 Nov 09 olle 2478       .info("FTPNewConnection::command_CWD(): argPath = \"" + argPath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3459 23 Oct 09 olle 2479     //
3459 23 Oct 09 olle 2480     // Use unmodified path if potential absolute core path
3459 23 Oct 09 olle 2481     boolean useUnmodified = pathIsPotentialAbsoluteCorePath(argPath);
3459 23 Oct 09 olle 2482     log.info("FTPNewConnection::command_CWD(): argPath = \"" + argPath + "\" useUnmodified = " + useUnmodified);
1649 21 May 07 olle 2483     /*
1649 21 May 07 olle 2484      * If argPath starts with coreSeparator, adjust to home directory.
1649 21 May 07 olle 2485      */
3459 23 Oct 09 olle 2486     if (argPath.startsWith(coreSeparator) && !useUnmodified)
1656 22 May 07 gregory 2487     {
1649 21 May 07 olle 2488       String s_root2 = new String(s_root);
1656 22 May 07 gregory 2489       if (s_root2.endsWith(coreSeparator))
1656 22 May 07 gregory 2490       {
1652 22 May 07 gregory 2491         s_root2 = s_root2.substring(0, s_root2.length() - 1);
1649 21 May 07 olle 2492       }
1656 22 May 07 gregory 2493       log
1656 22 May 07 gregory 2494         .info("FTPNewConnection::command_CWD(): s_root = \"" + s_root + "\" s_root2 = \"" + s_root2 + "\"");
1656 22 May 07 gregory 2495       if (argPath.startsWith(s_root2))
1656 22 May 07 gregory 2496       {
1649 21 May 07 olle 2497         argPath = argPath.substring(s_root2.length());
1649 21 May 07 olle 2498       }
1649 21 May 07 olle 2499     }
1656 22 May 07 gregory 2500     log
1656 22 May 07 gregory 2501       .info("FTPNewConnection::command_CWD(): (a) argPath = \"" + argPath + "\"");
1656 22 May 07 gregory 2502     if (argPath.equals(""))
1656 22 May 07 gregory 2503     {
1649 21 May 07 olle 2504       argPath = new String(coreSeparator);
1649 21 May 07 olle 2505     }
1656 22 May 07 gregory 2506     log
1656 22 May 07 gregory 2507       .info("FTPNewConnection::command_CWD(): (b) argPath = \"" + argPath + "\"");
1652 22 May 07 gregory 2508     String absPath = makeAbsolutePath(argPath);
1656 22 May 07 gregory 2509     log
1656 22 May 07 gregory 2510       .info("FTPNewConnection::command_CWD(): absPath = \"" + absPath + "\"");
1652 22 May 07 gregory 2511     String s_newPath = makeRealFilePath(absPath);
1656 22 May 07 gregory 2512     log
1656 22 May 07 gregory 2513       .info("FTPNewConnection::command_CWD(): (1) s_newPath = \"" + s_newPath + "\"");
790 23 Oct 06 olle 2514     /*
1652 22 May 07 gregory 2515      * NOTE: We must have this line, otherwise when someone would try to
1652 22 May 07 gregory 2516      * list "c:/dir/dir2" the listing would succeed or fail depending on
1652 22 May 07 gregory 2517      * what permission are set for "c:/dir/", but we want the listing to be
1652 22 May 07 gregory 2518      * allowed/denied depending on what access we have on "c:/dir/dir2/", so
1652 22 May 07 gregory 2519      * we must change "c:/dir/dir2" to "c:/dir/dir2/".
790 23 Oct 06 olle 2520      */
1652 22 May 07 gregory 2521     s_newPath = makeSlashAtEnd(s_newPath);
1656 22 May 07 gregory 2522     log
1656 22 May 07 gregory 2523       .info("FTPNewConnection::command_CWD(): (2) s_newPath = \"" + s_newPath + "\"");
1652 22 May 07 gregory 2524     // File tmpFolder;
1652 22 May 07 gregory 2525     // tmpFolder=new File(s_newPath);
1652 22 May 07 gregory 2526     // if (tmpFolder.isDirectory())
2142 16 Oct 07 gregory 2527     // boolean pathIsValidCoreDirectory =
2142 16 Oct 07 gregory 2528     // MyLS.isValidCoreDirectory(s_newPath);
4047 01 Dec 10 olle 2529     MyLS myLS = new MyLS(s_newPath, getSessionControl(), isTextBasedFTPClientType());
3464 26 Oct 09 olle 2530     boolean pathIsValidCoreDirectory = false;
3464 26 Oct 09 olle 2531     if (myLS != null)
3464 26 Oct 09 olle 2532     {
3464 26 Oct 09 olle 2533       pathIsValidCoreDirectory = myLS.isValidCoreDirectory(s_newPath);
3464 26 Oct 09 olle 2534     }
1656 22 May 07 gregory 2535     log
3464 26 Oct 09 olle 2536       .info("FTPNewConnection::command_CWD(): s_newPath = \"" + s_newPath + "\" pathIsValidCoreDirectory = " + pathIsValidCoreDirectory);
1656 22 May 07 gregory 2537     if (pathIsValidCoreDirectory)
1656 22 May 07 gregory 2538     {
3464 26 Oct 09 olle 2539       s_currentRelativePath = new String(s_newPath);
3469 02 Nov 09 olle 2540       // Path is valid, so if we were in shared projects folder, we now leave
3469 02 Nov 09 olle 2541       setInSharedProjectsFolder(false);
1652 22 May 07 gregory 2542       log
3469 02 Nov 09 olle 2543         .info("FTPNewConnection::command_CWD(): (2) absPath = \"" + absPath + "\" s_newPath = \"" + s_newPath + "\" s_currentRelativePath = \"" + s_currentRelativePath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
1656 22 May 07 gregory 2544       return "250 Present working directory is now " + makeSlashForResponse(s_currentRelativePath);
741 10 Oct 06 olle 2545     }
3469 02 Nov 09 olle 2546     else if (isInSharedProjectsFolder())
3469 02 Nov 09 olle 2547     {
3469 02 Nov 09 olle 2548       String sharedProjectsDirPath = null;
3469 02 Nov 09 olle 2549       if (myLS != null)
3469 02 Nov 09 olle 2550       {
3469 02 Nov 09 olle 2551         sharedProjectsDirPath = myLS.fetchSharedProjectsDirectoryPath(inputArgPath);
3469 02 Nov 09 olle 2552       }
3469 02 Nov 09 olle 2553       log.info("FTPNewConnection::command_CWD(): (2) inputArgPath = \"" + inputArgPath + "\" sharedProjectsDirPath = \"" + sharedProjectsDirPath + "\" s_currentRelativePath = \"" + s_currentRelativePath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 2554       if (sharedProjectsDirPath != null && myLS != null)
3469 02 Nov 09 olle 2555       {
3469 02 Nov 09 olle 2556         pathIsValidCoreDirectory = myLS.isValidCoreDirectory(sharedProjectsDirPath);
3469 02 Nov 09 olle 2557       }
3469 02 Nov 09 olle 2558       log.info("FTPNewConnection::command_CWD(): (2) inputArgPath = \"" + inputArgPath + "\" sharedProjectsDirPath = \"" + sharedProjectsDirPath + "\" pathIsValidCoreDirectory = " + pathIsValidCoreDirectory + " s_currentRelativePath = \"" + s_currentRelativePath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 2559       if (pathIsValidCoreDirectory)
3469 02 Nov 09 olle 2560       {
3469 02 Nov 09 olle 2561         s_newPath = makeSlashAtEnd(sharedProjectsDirPath);
3469 02 Nov 09 olle 2562         s_currentRelativePath = new String(s_newPath);
3469 02 Nov 09 olle 2563         // Path is valid, we leave shared projects folder
3469 02 Nov 09 olle 2564         setInSharedProjectsFolder(false);
3469 02 Nov 09 olle 2565         log.info("FTPNewConnection::command_CWD(): (2) inputArgPath = \"" + inputArgPath + "\" sharedProjectsDirPath = \"" + sharedProjectsDirPath + "\" pathIsValidCoreDirectory = " + pathIsValidCoreDirectory + " s_currentRelativePath = \"" + s_currentRelativePath + "\" isInSharedProjectsFolder = " + isInSharedProjectsFolder());
3469 02 Nov 09 olle 2566         return "250 Present working directory is now " + makeSlashForResponse(s_currentRelativePath);
3469 02 Nov 09 olle 2567       }
3469 02 Nov 09 olle 2568     }
2418 22 Nov 07 gregory 2569     return "550 " + makeSlashForResponse(absPath) + ": No such directory";
741 10 Oct 06 olle 2570   }
741 10 Oct 06 olle 2571
1656 22 May 07 gregory 2572
938 20 Nov 06 olle 2573   /**
3464 26 Oct 09 olle 2574    * Checks if a directory name corresponds to a shared
3464 26 Oct 09 olle 2575    * directory for an input project directory, and if so,
3464 26 Oct 09 olle 2576    * returns the absolute core path of the shared directory, else null.
3464 26 Oct 09 olle 2577    * Method not in the original Xerver code.
3464 26 Oct 09 olle 2578    * 
3464 26 Oct 09 olle 2579    * @param mixedSharedDirPath String Mixed path where top-most directory is shared to directory in parent path.
3464 26 Oct 09 olle 2580    * @return String Return the absolute core path of a shared directory.
3464 26 Oct 09 olle 2581    */
3464 26 Oct 09 olle 2582   private String fetchSharedDirectoryAbsoluteCorePath(String mixedSharedDirPath)
3464 26 Oct 09 olle 2583   {
3464 26 Oct 09 olle 2584     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: mixedSharedDirPath = \"" + mixedSharedDirPath + "\"");
3464 26 Oct 09 olle 2585     // Separate parent directory path part
3464 26 Oct 09 olle 2586     String parentDirPath = null;
3464 26 Oct 09 olle 2587     String dirName = null;
3464 26 Oct 09 olle 2588     String tmpStr = new String(mixedSharedDirPath);
3464 26 Oct 09 olle 2589     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: tmpStr = \"" + tmpStr + "\"");
3464 26 Oct 09 olle 2590     // Remove ending core separator, if any
3464 26 Oct 09 olle 2591     if (tmpStr.endsWith(coreSeparator))
3464 26 Oct 09 olle 2592     {
3464 26 Oct 09 olle 2593       tmpStr = tmpStr.substring(0, tmpStr.length() - 1);
3464 26 Oct 09 olle 2594     }
3464 26 Oct 09 olle 2595     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: tmpStr = \"" + tmpStr + "\"");
3464 26 Oct 09 olle 2596     // Separate parent directory path from pure directory name
3464 26 Oct 09 olle 2597     int index = tmpStr.lastIndexOf(coreSeparator);
3464 26 Oct 09 olle 2598     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: index for last coreSeparator = \"" + index + "\"");
3464 26 Oct 09 olle 2599     if (index >= 0)
3464 26 Oct 09 olle 2600     {
3464 26 Oct 09 olle 2601       parentDirPath = tmpStr.substring(0, index + coreSeparator.length());
3464 26 Oct 09 olle 2602       dirName = tmpStr.substring(index + coreSeparator.length());
3464 26 Oct 09 olle 2603     }
3464 26 Oct 09 olle 2604     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: parentDirPath = \"" + parentDirPath + "\"");
3464 26 Oct 09 olle 2605     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: dirName = \"" + dirName + "\"");
3464 26 Oct 09 olle 2606     //
3464 26 Oct 09 olle 2607     String sharedDirectoryAbsoluteCorePath = null;
4047 01 Dec 10 olle 2608     MyLS myLS = new MyLS(parentDirPath, getSessionControl(), isTextBasedFTPClientType());
3464 26 Oct 09 olle 2609     if (myLS != null)
3464 26 Oct 09 olle 2610     {
3464 26 Oct 09 olle 2611       sharedDirectoryAbsoluteCorePath = myLS.fetchSharedDirectoryAbsoluteCorePath(parentDirPath, dirName);
3464 26 Oct 09 olle 2612     }
3464 26 Oct 09 olle 2613     log.info("FTPNewConnection::fetchSharedDirectoryAbsoluteCorePath: sharedDirectoryAbsoluteCorePath = " + sharedDirectoryAbsoluteCorePath);
3464 26 Oct 09 olle 2614     return sharedDirectoryAbsoluteCorePath;
3464 26 Oct 09 olle 2615   }
3464 26 Oct 09 olle 2616
3464 26 Oct 09 olle 2617
3464 26 Oct 09 olle 2618   /**
1656 22 May 07 gregory 2619    * Javadoc not in original Xerver code. Examples of original use
1656 22 May 07 gregory 2620    * (File.separatorChar = '\', s_currentRelativePath = "scur\): "" -> "scur\"
1656 22 May 07 gregory 2621    * "blah/blaah" -> "scur\blah\blaah" "/blah/blaah" -> "\blah\blaah"
1656 22 May 07 gregory 2622    * Redirections using '.' and '..' will be expanded as far as possible.
1652 22 May 07 gregory 2623    * Modified functionality, not in original Xerver code: Paths will be
1652 22 May 07 gregory 2624    * converted to web syntax separation '/' before return.
938 20 Nov 06 olle 2625    * 
1656 22 May 07 gregory 2626    * @param path String path, possibly expressed with other separator than
1656 22 May 07 gregory 2627    *        system
938 20 Nov 06 olle 2628    * @return returnPath String absolute path
938 20 Nov 06 olle 2629    */
1656 22 May 07 gregory 2630   private String makeAbsolutePath(String path)
1656 22 May 07 gregory 2631   {
1656 22 May 07 gregory 2632     if (path.length() == 0)
1656 22 May 07 gregory 2633     {
1652 22 May 07 gregory 2634       // return s_currentRelativePath;
1652 22 May 07 gregory 2635       return s_currentRelativePath.replace(File.separatorChar,
1656 22 May 07 gregory 2636         coreSeparatorChar);
938 20 Nov 06 olle 2637     }
1652 22 May 07 gregory 2638     // if (File.separatorChar=='\\')
1652 22 May 07 gregory 2639     // path=path.replace('/',File.separatorChar);
1652 22 May 07 gregory 2640     // else
1652 22 May 07 gregory 2641     // path=path.replace('\\',File.separatorChar);
938 20 Nov 06 olle 2642     /*
938 20 Nov 06 olle 2643      * Convert path to web syntax separation '/'.
938 20 Nov 06 olle 2644      */
1052 08 Dec 06 olle 2645     path = path.replace(File.separatorChar, coreSeparatorChar);
1652 22 May 07 gregory 2646     // if (path.charAt(0)==File.separatorChar)
1652 22 May 07 gregory 2647     // path=MyString.makeCanonicalPath(path);
1652 22 May 07 gregory 2648     // else
1652 22 May 07 gregory 2649     // path=MyString.makeCanonicalPath(s_currentRelativePath+path);
1652 22 May 07 gregory 2650     if (path.charAt(0) == coreSeparatorChar)
3464 26 Oct 09 olle 2651     {
1652 22 May 07 gregory 2652       path = MyString.makeCanonicalPath(path);
3464 26 Oct 09 olle 2653     }
741 10 Oct 06 olle 2654     else
3464 26 Oct 09 olle 2655     {
1652 22 May 07 gregory 2656       path = MyString.makeCanonicalPath(s_currentRelativePath + path);
3464 26 Oct 09 olle 2657     }
1652 22 May 07 gregory 2658     // if (path.startsWith(".."+File.separator) ||
1652 22 May 07 gregory 2659     // path.startsWith(File.separator+".."+File.separator) ||
1652 22 May 07 gregory 2660     // path.equals(".."))
1656 22 May 07 gregory 2661     if (path.startsWith(".." + coreSeparator) || path
1656 22 May 07 gregory 2662       .startsWith(coreSeparator + ".." + coreSeparator) || path
1656 22 May 07 gregory 2663       .equals(".."))
1656 22 May 07 gregory 2664     {
1652 22 May 07 gregory 2665       // return File.separator;
1052 08 Dec 06 olle 2666       return coreSeparator;
1656 22 May 07 gregory 2667     }
2418 22 Nov 07 gregory 2668     /*
2418 22 Nov 07 gregory 2669      * This will only occur if we try to come to a folder "below" / (for
2418 22 Nov 07 gregory 2670      * example: "/root/../../secret/" (which will evaluate to
2418 22 Nov 07 gregory 2671      * "../secret/")).
2418 22 Nov 07 gregory 2672      */
2418 22 Nov 07 gregory 2673     // return path;
2418 22 Nov 07 gregory 2674     return path.replace(File.separatorChar, coreSeparatorChar);
741 10 Oct 06 olle 2675   }
741 10 Oct 06 olle 2676
1656 22 May 07 gregory 2677
938 20 Nov 06 olle 2678   /**
1656 22 May 07 gregory 2679    * Javadoc not in original Xerver code. Examples of original use
1656 22 May 07 gregory 2680    * (File.separatorChar = '\', s_currentRelativePath = "scur\): "" -> "scur\"
1656 22 May 07 gregory 2681    * "blah/blaah" -> "scur\blah\blaah" "/blah/blaah" -> "\blah\blaah"
1656 22 May 07 gregory 2682    * Redirections using '.' and '..' will be expanded as far as possible.
1652 22 May 07 gregory 2683    * Modified functionality, not in original Xerver code: Paths will be
1652 22 May 07 gregory 2684    * converted to web syntax separation '/' before return.
938 20 Nov 06 olle 2685    * 
1656 22 May 07 gregory 2686    * @param argFile String file path, possibly expressed with other separator
1656 22 May 07 gregory 2687    *        than system
938 20 Nov 06 olle 2688    * @return returnPath String real path
938 20 Nov 06 olle 2689    */
1656 22 May 07 gregory 2690   private String makeRealFilePath(String argFile)
1656 22 May 07 gregory 2691   {
790 23 Oct 06 olle 2692     // *** Debug Info
1656 22 May 07 gregory 2693     log
1656 22 May 07 gregory 2694       .info("FTPNewConnection::makeRealFilePath(): Start - argFile = \"" + argFile + "\"");
1656 22 May 07 gregory 2695     log
1656 22 May 07 gregory 2696       .info("FTPNewConnection::makeRealFilePath(): s_root = \"" + s_root + "\"");
3459 23 Oct 09 olle 2697     //
1649 21 May 07 olle 2698     boolean isAbsPath = argFile.startsWith(coreSeparator);
938 20 Nov 06 olle 2699     /*
1652 22 May 07 gregory 2700      * Format: "/" or "/bla" or "/* /bla" or "/* /bla/" (* = anything)
938 20 Nov 06 olle 2701      */
1652 22 May 07 gregory 2702     String absPath = makeAbsolutePath(argFile);
1656 22 May 07 gregory 2703     log
1656 22 May 07 gregory 2704       .info("FTPNewConnection::makeRealFilePath(): absPath = \"" + absPath + "\"");
3464 26 Oct 09 olle 2705     //
3464 26 Oct 09 olle 2706     // Check if potential absolute core path
3464 26 Oct 09 olle 2707     boolean isPotentialAbsoluteCorePath = pathIsPotentialAbsoluteCorePath(absPath);
3464 26 Oct 09 olle 2708     log.info("FTPNewConnection::makeRealFilePath(): absPath = \"" + absPath + "\" isPotentialAbsoluteCorePath = " + isPotentialAbsoluteCorePath);
3464 26 Oct 09 olle 2709     if (isPotentialAbsoluteCorePath)
3464 26 Oct 09 olle 2710     {
3464 26 Oct 09 olle 2711       // Check if path is core directory path
4047 01 Dec 10 olle 2712       MyLS myLS = new MyLS(absPath, getSessionControl(), isTextBasedFTPClientType());
3464 26 Oct 09 olle 2713       boolean pathIsValidCoreDirectory = false;
3464 26 Oct 09 olle 2714       boolean pathIsValidCoreFile = false;
3464 26 Oct 09 olle 2715       if (myLS != null)
3464 26 Oct 09 olle 2716       {
3464 26 Oct 09 olle 2717         pathIsValidCoreDirectory = myLS.isValidCoreDirectory(absPath);
3464 26 Oct 09 olle 2718         pathIsValidCoreFile = myLS.isValidCoreFile(absPath);
3464 26 Oct 09 olle 2719       }
3464 26 Oct 09 olle 2720       log.info("FTPNewConnection::makeRealFilePath(): absPath = \"" + absPath + "\" pathIsValidCoreDirectory = " + pathIsValidCoreDirectory + " pathIsValidCoreFile = " + pathIsValidCoreFile);
3464 26 Oct 09 olle 2721       if (pathIsValidCoreDirectory)
3464 26 Oct 09 olle 2722       {
3464 26 Oct 09 olle 2723         log.info("FTPNewConnection::makeRealFilePath(): return " + absPath);
3464 26 Oct 09 olle 2724         return absPath;
3464 26 Oct 09 olle 2725       }
3464 26 Oct 09 olle 2726       else if (pathIsValidCoreFile)
3464 26 Oct 09 olle 2727       {
3464 26 Oct 09 olle 2728         log.info("FTPNewConnection::makeRealFilePath(): return " + absPath);
3464 26 Oct 09 olle 2729         return absPath;
3464 26 Oct 09 olle 2730       }
3464 26 Oct 09 olle 2731       else
3464 26 Oct 09 olle 2732       {
3464 26 Oct 09 olle 2733         // Current path not valid, check if shared directory
3464 26 Oct 09 olle 2734         String sharedDirectoryAbsoluteCorePath = fetchSharedDirectoryAbsoluteCorePath(absPath);
3464 26 Oct 09 olle 2735         log.info("FTPNewConnection::makeRealFilePath(): sharedDirectoryAbsoluteCorePath = " + sharedDirectoryAbsoluteCorePath);
3464 26 Oct 09 olle 2736         if (sharedDirectoryAbsoluteCorePath != null)
3464 26 Oct 09 olle 2737         {
3464 26 Oct 09 olle 2738           log.info("FTPNewConnection::makeRealFilePath(): return " + sharedDirectoryAbsoluteCorePath);
3464 26 Oct 09 olle 2739           return sharedDirectoryAbsoluteCorePath;
3464 26 Oct 09 olle 2740         }
3464 26 Oct 09 olle 2741       }
3464 26 Oct 09 olle 2742     }
1652 22 May 07 gregory 2743     String absPathWithoutFirstSlash = absPath.substring(1);
1652 22 May 07 gregory 2744     log
1656 22 May 07 gregory 2745       .info("FTPNewConnection::makeRealFilePath(): absPathWithoutFirstSlash = \"" + absPathWithoutFirstSlash + "\"");
938 20 Nov 06 olle 2746     /*
938 20 Nov 06 olle 2747      * The path is "/"
938 20 Nov 06 olle 2748      */
1656 22 May 07 gregory 2749     if (absPathWithoutFirstSlash.length() == 0)
1656 22 May 07 gregory 2750     {
1656 22 May 07 gregory 2751       log
1656 22 May 07 gregory 2752         .info("FTPNewConnection::makeRealFilePath(): return \"" + folderNameWithoutLastSlash(s_root) + absPath + "\"");
1652 22 May 07 gregory 2753       return folderNameWithoutLastSlash(s_root) + absPath;
1656 22 May 07 gregory 2754     }
2418 22 Nov 07 gregory 2755     String s_aliasRoot;
2418 22 Nov 07 gregory 2756     // int
2418 22 Nov 07 gregory 2757     // lengthOfAlias=absPathWithoutFirstSlash.indexOf(File.separatorChar);
2418 22 Nov 07 gregory 2758     int lengthOfAlias = absPathWithoutFirstSlash
2418 22 Nov 07 gregory 2759       .indexOf(coreSeparatorChar);
2418 22 Nov 07 gregory 2760     /*
2418 22 Nov 07 gregory 2761      * Path is "/bla" (but we don't know if "bla" is an alias or not).
2418 22 Nov 07 gregory 2762      */
2418 22 Nov 07 gregory 2763     if (lengthOfAlias == -1)
2418 22 Nov 07 gregory 2764     {
2418 22 Nov 07 gregory 2765       lengthOfAlias = absPathWithoutFirstSlash.length();
2418 22 Nov 07 gregory 2766       s_aliasRoot = getRealPathFromAliasName(absPathWithoutFirstSlash);
2418 22 Nov 07 gregory 2767     }
1656 22 May 07 gregory 2768     else
1656 22 May 07 gregory 2769     {
2418 22 Nov 07 gregory 2770       s_aliasRoot = getRealPathFromAliasName(absPathWithoutFirstSlash
2418 22 Nov 07 gregory 2771         .substring(0, lengthOfAlias));
2418 22 Nov 07 gregory 2772     }
2418 22 Nov 07 gregory 2773     log
2418 22 Nov 07 gregory 2774       .info("FTPNewConnection::makeRealFilePath(): s_aliasRoot = \"" + s_aliasRoot + "\"");
2418 22 Nov 07 gregory 2775     /*
2418 22 Nov 07 gregory 2776      * alias exists and lengthOfAlias is the alias length
2418 22 Nov 07 gregory 2777      */
2418 22 Nov 07 gregory 2778     if (s_aliasRoot != null)
2418 22 Nov 07 gregory 2779     {
938 20 Nov 06 olle 2780       /*
2418 22 Nov 07 gregory 2781        * if (!isAbsPath) {
2418 22 Nov 07 gregory 2782        * log.info("FTPNewConnection::makeRealFilePath(): return \"" +
2418 22 Nov 07 gregory 2783        * folderNameWithoutLastSlash(s_aliasRoot)+absPath.substring(lengthOfAlias+1) +
2418 22 Nov 07 gregory 2784        * "\""); return
2418 22 Nov 07 gregory 2785        * folderNameWithoutLastSlash(s_aliasRoot)+absPath.substring(lengthOfAlias+1); }
2418 22 Nov 07 gregory 2786        * else { log.info("FTPNewConnection::makeRealFilePath(): return
2418 22 Nov 07 gregory 2787        * \"" + coreSeparator+absPath.substring(lengthOfAlias+1) +
2418 22 Nov 07 gregory 2788        * "\""); return
2418 22 Nov 07 gregory 2789        * coreSeparator+absPath.substring(lengthOfAlias+1); }
938 20 Nov 06 olle 2790        */
1656 22 May 07 gregory 2791       log
2418 22 Nov 07 gregory 2792         .info("FTPNewConnection::makeRealFilePath(): return \"" + folderNameWithoutLastSlash(s_aliasRoot) + absPath
2418 22 Nov 07 gregory 2793           .substring(lengthOfAlias + 1) + "\"");
2418 22 Nov 07 gregory 2794       return folderNameWithoutLastSlash(s_aliasRoot) + absPath
2418 22 Nov 07 gregory 2795         .substring(lengthOfAlias + 1);
741 10 Oct 06 olle 2796     }
2418 22 Nov 07 gregory 2797     // alias does NOT exists and lengthOfAlias is a dummy value
2418 22 Nov 07 gregory 2798     /*
2418 22 Nov 07 gregory 2799      * if (!isAbsPath) {
2418 22 Nov 07 gregory 2800      * log.info("FTPNewConnection::makeRealFilePath(): return \"" +
2418 22 Nov 07 gregory 2801      * folderNameWithoutLastSlash(s_root)+absPath + "\""); return
2418 22 Nov 07 gregory 2802      * folderNameWithoutLastSlash(s_root)+absPath; } else {
2418 22 Nov 07 gregory 2803      * log.info("FTPNewConnection::makeRealFilePath(): return \"" +
2418 22 Nov 07 gregory 2804      * coreSeparator+absPath + "\""); return coreSeparator+absPath; }
2418 22 Nov 07 gregory 2805      */
3464 26 Oct 09 olle 2806     // Only add root path prefix if none exists
3464 26 Oct 09 olle 2807     if (!isPotentialAbsoluteCorePath)
3464 26 Oct 09 olle 2808     {
3464 26 Oct 09 olle 2809       absPath = folderNameWithoutLastSlash(s_root) + absPath;
3464 26 Oct 09 olle 2810     }
3464 26 Oct 09 olle 2811     //
3464 26 Oct 09 olle 2812     // Check if potential absolute core path
3464 26 Oct 09 olle 2813     isPotentialAbsoluteCorePath = pathIsPotentialAbsoluteCorePath(absPath);
3464 26 Oct 09 olle 2814     log.info("FTPNewConnection::makeRealFilePath(): absPath = \"" + absPath + "\" isPotentialAbsoluteCorePath = " + isPotentialAbsoluteCorePath);
3464 26 Oct 09 olle 2815     if (isPotentialAbsoluteCorePath)
3464 26 Oct 09 olle 2816     {
3464 26 Oct 09 olle 2817       // Check if path is core directory path
4047 01 Dec 10 olle 2818       MyLS myLS = new MyLS(absPath, getSessionControl(), isTextBasedFTPClientType());
3464 26 Oct 09 olle 2819       boolean pathIsValidCoreDirectory = false;
3464 26 Oct 09 olle 2820       if (myLS != null)
3464 26 Oct 09 olle 2821       {
3464 26 Oct 09 olle 2822         pathIsValidCoreDirectory = myLS.isValidCoreDirectory(absPath);
3464 26 Oct 09 olle 2823       }
3464 26 Oct 09 olle 2824       log.info("FTPNewConnection::makeRealFilePath(): pathIsValidCoreDirectory = " + pathIsValidCoreDirectory);
3464 26 Oct 09 olle 2825       if (pathIsValidCoreDirectory)
3464 26 Oct 09 olle 2826       {
3464 26 Oct 09 olle 2827         log.info("FTPNewConnection::makeRealFilePath(): return " + absPath);
3464 26 Oct 09 olle 2828         return absPath;
3464 26 Oct 09 olle 2829       }
3464 26 Oct 09 olle 2830       else
3464 26 Oct 09 olle 2831       {
3464 26 Oct 09 olle 2832         // Current path not valid, check if shared directory
3464 26 Oct 09 olle 2833         String sharedDirectoryAbsoluteCorePath = fetchSharedDirectoryAbsoluteCorePath(absPath);
3464 26 Oct 09 olle 2834         log.info("FTPNewConnection::makeRealFilePath(): sharedDirectoryAbsoluteCorePath = " + sharedDirectoryAbsoluteCorePath);
3464 26 Oct 09 olle 2835         if (sharedDirectoryAbsoluteCorePath != null)
3464 26 Oct 09 olle 2836         {
3464 26 Oct 09 olle 2837           log.info("FTPNewConnection::makeRealFilePath(): return " + sharedDirectoryAbsoluteCorePath);
3464 26 Oct 09 olle 2838           return sharedDirectoryAbsoluteCorePath;
3464 26 Oct 09 olle 2839         }
3464 26 Oct 09 olle 2840       }
3464 26 Oct 09 olle 2841     }
3464 26 Oct 09 olle 2842     log.info("FTPNewConnection::makeRealFilePath(): return " + absPath);
3464 26 Oct 09 olle 2843     return absPath;
741 10 Oct 06 olle 2844   }
741 10 Oct 06 olle 2845
1656 22 May 07 gregory 2846
1656 22 May 07 gregory 2847   private String getRealPathFromAliasName(String alias)
1656 22 May 07 gregory 2848   {
1656 22 May 07 gregory 2849     for (int i = 0; i < as_aliasesName.length; i++)
1656 22 May 07 gregory 2850     {
1656 22 May 07 gregory 2851       if (as_aliasesName[i].equals(alias))
1656 22 May 07 gregory 2852       {
741 10 Oct 06 olle 2853         return as_aliasesPath[i];
741 10 Oct 06 olle 2854       }
741 10 Oct 06 olle 2855     }
741 10 Oct 06 olle 2856     return null;
741 10 Oct 06 olle 2857   }
741 10 Oct 06 olle 2858
1656 22 May 07 gregory 2859
1652 22 May 07 gregory 2860   // Don't send "\myfolder\dir\" to the client, but send "/myfolder/dir/"
1656 22 May 07 gregory 2861   private String makeSlashForResponse(String path)
1656 22 May 07 gregory 2862   {
1652 22 May 07 gregory 2863     return path.replace('\\', '/');
1652 22 May 07 gregory 2864   }
741 10 Oct 06 olle 2865
1656 22 May 07 gregory 2866
741 10 Oct 06 olle 2867   /*
1652 22 May 07 gregory 2868    * private String removeAliasFromAbsolutePath(String path) //
1652 22 May 07 gregory 2869    * "/aliasname/dir1/dir2/" ==> "/dir1/dir2/" ...or...
1652 22 May 07 gregory 2870    * "\aliasname\dir1\dir2\" ==> "\dir1\dir2\" { return
1652 22 May 07 gregory 2871    * path.substring(path.indexOf(File.separatorChar)); }
1652 22 May 07 gregory 2872    */
1656 22 May 07 gregory 2873   public String getRemoteIP()
1656 22 May 07 gregory 2874   {
741 10 Oct 06 olle 2875     return s_usersIPNumber;
741 10 Oct 06 olle 2876   }
3459 23 Oct 09 olle 2877
3459 23 Oct 09 olle 2878
3459 23 Oct 09 olle 2879   /**
3459 23 Oct 09 olle 2880    * Checks if a path is a potential absolute core path,
3459 23 Oct 09 olle 2881    * by checking the start of the path. Note that there
3459 23 Oct 09 olle 2882    * is no guarantee that the path actually exists on the
3459 23 Oct 09 olle 2883    * used system.
3459 23 Oct 09 olle 2884    * 
3459 23 Oct 09 olle 2885    * @param argPath String Path to check.
3459 23 Oct 09 olle 2886    * @return boolean Returns true if the path is a potential absolute core path, else false.
3459 23 Oct 09 olle 2887    */
3459 23 Oct 09 olle 2888   private boolean pathIsPotentialAbsoluteCorePath(String argPath)
3459 23 Oct 09 olle 2889   {
3459 23 Oct 09 olle 2890     // Check if path starts with "/home/"
3459 23 Oct 09 olle 2891     boolean potentialCorePath = false;
3459 23 Oct 09 olle 2892     String startTestStr = coreSeparator + "home" + coreSeparator;
3459 23 Oct 09 olle 2893     if (argPath.startsWith(startTestStr))
3459 23 Oct 09 olle 2894     {
3459 23 Oct 09 olle 2895       potentialCorePath = true;
3459 23 Oct 09 olle 2896     }
3459 23 Oct 09 olle 2897     return potentialCorePath;
3459 23 Oct 09 olle 2898   }
3469 02 Nov 09 olle 2899
3469 02 Nov 09 olle 2900
3469 02 Nov 09 olle 2901   /**
3469 02 Nov 09 olle 2902    * Convenience method that checks if path
3469 02 Nov 09 olle 2903    * corresponds to shared projects folder.
3469 02 Nov 09 olle 2904    * Method not part of original Xerver code.
3469 02 Nov 09 olle 2905    * 
3469 02 Nov 09 olle 2906    * @param path String The path string to check.
3469 02 Nov 09 olle 2907    * return boolean True if path corresponds to shared projects folder, else false.
3469 02 Nov 09 olle 2908    */
3469 02 Nov 09 olle 2909   private boolean pathIsSharedProjectsFolder(String path)
3469 02 Nov 09 olle 2910   {
3469 02 Nov 09 olle 2911     log.info("FTPNewConnection::pathIsSharedProjectsFolder(): path = \"" + path + "\"");
3469 02 Nov 09 olle 2912     boolean result = false;
3469 02 Nov 09 olle 2913     if (path != null && !path.equals(""))
3469 02 Nov 09 olle 2914     {
3469 02 Nov 09 olle 2915       String tmpPath = new String(path);
3469 02 Nov 09 olle 2916       // Remove ending core separator
3469 02 Nov 09 olle 2917       if (path.endsWith(coreSeparator))
3469 02 Nov 09 olle 2918       {
3469 02 Nov 09 olle 2919         tmpPath = tmpPath.substring(0, tmpPath.length() - 1);
3469 02 Nov 09 olle 2920       }
3469 02 Nov 09 olle 2921       log.info("FTPNewConnection::pathIsSharedProjectsFolder(): tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 2922       if (tmpPath.endsWith(sharedProjectsFolderName))
3469 02 Nov 09 olle 2923       {
3469 02 Nov 09 olle 2924         result = true;
3469 02 Nov 09 olle 2925       }
3469 02 Nov 09 olle 2926     }
3469 02 Nov 09 olle 2927     log.info("FTPNewConnection::pathIsSharedProjectsFolder(): result = " + result);
3469 02 Nov 09 olle 2928     return result;
3469 02 Nov 09 olle 2929   }
3469 02 Nov 09 olle 2930
3469 02 Nov 09 olle 2931
3469 02 Nov 09 olle 2932   /**
3469 02 Nov 09 olle 2933    * Convenience method that checks if path
3469 02 Nov 09 olle 2934    * contains shared projects folder.
3469 02 Nov 09 olle 2935    * Method not part of original Xerver code.
3469 02 Nov 09 olle 2936    * 
3469 02 Nov 09 olle 2937    * @param path String The path string to check.
3469 02 Nov 09 olle 2938    * return boolean True if path contains shared projects folder, else false.
3469 02 Nov 09 olle 2939    */
3469 02 Nov 09 olle 2940   private boolean pathContainsSharedProjectsFolder(String path)
3469 02 Nov 09 olle 2941   {
3469 02 Nov 09 olle 2942     log.info("FTPNewConnection::pathContainsSharedProjectsFolder(): path = \"" + path + "\"");
3469 02 Nov 09 olle 2943     boolean result = false;
3469 02 Nov 09 olle 2944     if (path != null && !path.equals(""))
3469 02 Nov 09 olle 2945     {
3469 02 Nov 09 olle 2946       int index = path.indexOf(sharedProjectsFolderName);
3469 02 Nov 09 olle 2947       if (index >= 0)
3469 02 Nov 09 olle 2948       {
3469 02 Nov 09 olle 2949         result = true;
3469 02 Nov 09 olle 2950       }
3469 02 Nov 09 olle 2951     }
3469 02 Nov 09 olle 2952     log.info("FTPNewConnection::pathContainsSharedProjectsFolder(): result = " + result);
3469 02 Nov 09 olle 2953     return result;
3469 02 Nov 09 olle 2954   }
3469 02 Nov 09 olle 2955
3469 02 Nov 09 olle 2956
3469 02 Nov 09 olle 2957   /**
3469 02 Nov 09 olle 2958    * Convenience method that fetches the root
3469 02 Nov 09 olle 2959    * directory of shared projects folder.
3469 02 Nov 09 olle 2960    * Method not part of original Xerver code.
3469 02 Nov 09 olle 2961    * 
3469 02 Nov 09 olle 2962    * @param path String The path string to process.
3469 02 Nov 09 olle 2963    * return String The root directory of shared projects folder.
3469 02 Nov 09 olle 2964    */
3469 02 Nov 09 olle 2965   private String fetchSharedProjectsFolderRoot(String path)
3469 02 Nov 09 olle 2966   {
3469 02 Nov 09 olle 2967     log.info("FTPNewConnection::fetchSharedProjectsFolderRoot(): path = \"" + path + "\"");
3469 02 Nov 09 olle 2968     if (!pathIsSharedProjectsFolder(path))
3469 02 Nov 09 olle 2969     {
3469 02 Nov 09 olle 2970       return path;
3469 02 Nov 09 olle 2971     }
3469 02 Nov 09 olle 2972     String rootPath = new String(path);
3469 02 Nov 09 olle 2973     if (path != null && !path.equals(""))
3469 02 Nov 09 olle 2974     {
3469 02 Nov 09 olle 2975       String tmpPath = new String(path);
3469 02 Nov 09 olle 2976       // Remove ending core separator
3469 02 Nov 09 olle 2977       if (path.endsWith(coreSeparator))
3469 02 Nov 09 olle 2978       {
3469 02 Nov 09 olle 2979         tmpPath = tmpPath.substring(0, tmpPath.length() - 1);
3469 02 Nov 09 olle 2980       }
3469 02 Nov 09 olle 2981       log.info("FTPNewConnection::fetchSharedProjectsFolderRoot(): tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 2982       // Remove ending shared projects folder name
3469 02 Nov 09 olle 2983       if (tmpPath.endsWith(sharedProjectsFolderName))
3469 02 Nov 09 olle 2984       {
3469 02 Nov 09 olle 2985         tmpPath = tmpPath.substring(0, tmpPath.length() - sharedProjectsFolderName.length());
3469 02 Nov 09 olle 2986       }
3469 02 Nov 09 olle 2987       log.info("FTPNewConnection::fetchSharedProjectsFolderRoot(): tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 2988       if (tmpPath.equals(""))
3469 02 Nov 09 olle 2989       {
3469 02 Nov 09 olle 2990         tmpPath = new String(coreSeparator);
3469 02 Nov 09 olle 2991       }
3469 02 Nov 09 olle 2992       log.info("FTPNewConnection::fetchSharedProjectsFolderRoot(): tmpPath = \"" + tmpPath + "\"");
3469 02 Nov 09 olle 2993       //
3469 02 Nov 09 olle 2994       rootPath = tmpPath;
3469 02 Nov 09 olle 2995     }
3469 02 Nov 09 olle 2996     log.info("FTPNewConnection::fetchSharedProjectsFolderRoot(): rootPath = \"" + rootPath + "\"");
3469 02 Nov 09 olle 2997     return rootPath;
3469 02 Nov 09 olle 2998   }
741 10 Oct 06 olle 2999 }