741 |
10 Oct 06 |
olle |
1 |
/* |
1652 |
22 May 07 |
gregory |
$Id$ |
741 |
10 Oct 06 |
olle |
3 |
|
1916 |
31 Aug 07 |
jari |
Copyright (C) 2006 Olle Mansson |
1916 |
31 Aug 07 |
jari |
Copyright (C) 2007 Gregory Vincic, Olle Mansson |
741 |
10 Oct 06 |
olle |
6 |
|
1652 |
22 May 07 |
gregory |
This file is part of Proteios. |
1652 |
22 May 07 |
gregory |
Available at http://www.proteios.org/ |
741 |
10 Oct 06 |
olle |
9 |
|
1652 |
22 May 07 |
gregory |
Proteios is free software; you can redistribute it and/or modify it |
1652 |
22 May 07 |
gregory |
under the terms of the GNU General Public License as published by |
1652 |
22 May 07 |
gregory |
the Free Software Foundation; either version 2 of the License, or |
1652 |
22 May 07 |
gregory |
(at your option) any later version. |
741 |
10 Oct 06 |
olle |
14 |
|
1652 |
22 May 07 |
gregory |
Proteios is distributed in the hope that it will be useful, but |
1652 |
22 May 07 |
gregory |
WITHOUT ANY WARRANTY; without even the implied warranty of |
1652 |
22 May 07 |
gregory |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1652 |
22 May 07 |
gregory |
General Public License for more details. |
741 |
10 Oct 06 |
olle |
19 |
|
1652 |
22 May 07 |
gregory |
You should have received a copy of the GNU General Public License |
1652 |
22 May 07 |
gregory |
along with this program; if not, write to the Free Software |
1652 |
22 May 07 |
gregory |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
1652 |
22 May 07 |
gregory |
02111-1307, USA. |
1652 |
22 May 07 |
gregory |
24 |
*/ |
741 |
10 Oct 06 |
olle |
// Xerver Free Web Server |
741 |
10 Oct 06 |
olle |
// Copyright (C) 2002-2005 Omid Rouhani |
741 |
10 Oct 06 |
olle |
27 |
// |
741 |
10 Oct 06 |
olle |
28 |
// |
741 |
10 Oct 06 |
olle |
// This program is free software; you can redistribute it and/or |
741 |
10 Oct 06 |
olle |
// modify it under the terms of the GNU General Public License |
741 |
10 Oct 06 |
olle |
// as published by the Free Software Foundation; either version 2 |
741 |
10 Oct 06 |
olle |
// of the License, or (at your option) any later version. |
741 |
10 Oct 06 |
olle |
33 |
// |
741 |
10 Oct 06 |
olle |
// This program is distributed in the hope that it will be useful, |
741 |
10 Oct 06 |
olle |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
741 |
10 Oct 06 |
olle |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
741 |
10 Oct 06 |
olle |
// GNU General Public License for more details. |
741 |
10 Oct 06 |
olle |
38 |
// |
741 |
10 Oct 06 |
olle |
// You should have received a copy of the GNU General Public License |
741 |
10 Oct 06 |
olle |
// along with this program; if not, write to the Free Software |
741 |
10 Oct 06 |
olle |
// 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 |
// ## YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT: ## |
741 |
10 Oct 06 |
olle |
// ## HTTP://WWW.JAVASCRIPT.NU/XERVER/ ## |
741 |
10 Oct 06 |
olle |
47 |
// ## ## |
741 |
10 Oct 06 |
olle |
// ## IF YOUR SOFTWARE IS NOT RELEASED UNDER THE ## |
741 |
10 Oct 06 |
olle |
// ## GNU GENERAL PUBLIC LICENSE (GPL), ## |
741 |
10 Oct 06 |
olle |
// ## PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!! ## |
741 |
10 Oct 06 |
olle |
51 |
// ## ## |
741 |
10 Oct 06 |
olle |
// ## 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 |
* <B>About this class:</B> <BR> |
1652 |
22 May 07 |
gregory |
* For each user that connects to the server, one <CODE>FTPNewConnection</CODE> |
1652 |
22 May 07 |
gregory |
* will be created. <BR> |
741 |
10 Oct 06 |
olle |
* This is the most important class for the FTP server. |
1652 |
22 May 07 |
gregory |
75 |
* |
741 |
10 Oct 06 |
olle |
* @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a> |
741 |
10 Oct 06 |
olle |
* @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 |
// 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 |
// private BufferedReader bis; |
1652 |
22 May 07 |
gregory |
// File f_currentFolder; |
1652 |
22 May 07 |
gregory |
95 |
private String s_root = null; |
1652 |
22 May 07 |
gregory |
// private String s_currentRelativePath=File.separator; // ="\\"; |
1652 |
22 May 07 |
gregory |
97 |
private String s_currentRelativePath = coreSeparator; |
1652 |
22 May 07 |
gregory |
// private String s_lastCommand=""; //Shall be a nonexisting command. Shall |
1652 |
22 May 07 |
gregory |
// 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 |
* Instance variables not in original Xerver code. Show removed files flag. |
1656 |
22 May 07 |
gregory |
* Instance variable controlling whether core files and directories with |
1656 |
22 May 07 |
gregory |
* 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 |
// 2 |
1656 |
22 May 07 |
gregory |
// secs |
1656 |
22 May 07 |
gregory |
// for |
1656 |
22 May 07 |
gregory |
// client |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// take |
1656 |
22 May 07 |
gregory |
// the |
1656 |
22 May 07 |
gregory |
// data |
1656 |
22 May 07 |
gregory |
// connection |
1656 |
22 May 07 |
gregory |
// direct |
1656 |
22 May 07 |
gregory |
// after |
1656 |
22 May 07 |
gregory |
// a |
1656 |
22 May 07 |
gregory |
// command |
1656 |
22 May 07 |
gregory |
// when |
1656 |
22 May 07 |
gregory |
// the |
1656 |
22 May 07 |
gregory |
// data |
1656 |
22 May 07 |
gregory |
// connection |
1656 |
22 May 07 |
gregory |
// is |
1656 |
22 May 07 |
gregory |
// going |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// be |
1656 |
22 May 07 |
gregory |
// 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 |
* 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 |
* Get the SessionControl object. |
1676 |
25 May 07 |
olle |
166 |
* |
1676 |
25 May 07 |
olle |
* @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 |
* Set the SessionControl object. |
1676 |
25 May 07 |
olle |
177 |
* |
1676 |
25 May 07 |
olle |
* @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 |
* Get flag to show removed core files. Not in original Xerver code. |
931 |
16 Nov 06 |
olle |
188 |
* |
1652 |
22 May 07 |
gregory |
* @return b_showingRemovedFiles boolean flag indicating if removed core |
1652 |
22 May 07 |
gregory |
* 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 |
* Set flag to show removed core files. Not in original Xerver code. |
931 |
16 Nov 06 |
olle |
200 |
* |
1656 |
22 May 07 |
gregory |
* @param b_showingRemovedFiles boolean flag indicating if removed core |
1656 |
22 May 07 |
gregory |
* 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 |
* Get mode of showing removed files. Not in original Xerver code. |
931 |
16 Nov 06 |
olle |
212 |
* |
931 |
16 Nov 06 |
olle |
* @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 |
* Get inSharedProjectsFolder flag. |
3469 |
02 Nov 09 |
olle |
228 |
* |
3469 |
02 Nov 09 |
olle |
* @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 |
* Set inSharedProjectsFolder flag. |
3469 |
02 Nov 09 |
olle |
239 |
* |
3469 |
02 Nov 09 |
olle |
* @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 |
* Get temporarilyInSharedProjectsFolder flag. |
3469 |
02 Nov 09 |
olle |
250 |
* |
3469 |
02 Nov 09 |
olle |
* @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 |
* Set temporarilyInSharedProjectsFolder flag. |
3469 |
02 Nov 09 |
olle |
261 |
* |
3469 |
02 Nov 09 |
olle |
* @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 |
* Get flag indicating a text-based FTP client type. |
4047 |
01 Dec 10 |
olle |
272 |
* |
4047 |
01 Dec 10 |
olle |
* @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 |
* Set flag indicating a text-based FTP client type. |
4047 |
01 Dec 10 |
olle |
283 |
* |
4047 |
01 Dec 10 |
olle |
* @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 |
// 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 |
// 127.0.0.1 |
1656 |
22 May 07 |
gregory |
324 |
so_userConnection.getInetAddress().isSiteLocalAddress(); // Ex. |
1656 |
22 May 07 |
gregory |
// 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 |
// bis=new BufferedReader(new |
1652 |
22 May 07 |
gregory |
// 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 |
// 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 |
// *** Debug Info |
798 |
24 Oct 06 |
olle |
405 |
log.info("FTPNewConnection::sendWelcomeMessage(): Start"); |
1652 |
22 May 07 |
gregory |
// sendResponse("220-Welcome to Xerver Free FTP Server |
1652 |
22 May 07 |
gregory |
// "+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 |
// *** 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 |
// System.out.print("Command: "); |
1652 |
22 May 07 |
gregory |
// 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 |
// only if we don't |
1656 |
22 May 07 |
gregory |
// make a NOOP. If |
1656 |
22 May 07 |
gregory |
// we make a NOOP we |
1656 |
22 May 07 |
gregory |
// don't update |
1656 |
22 May 07 |
gregory |
// 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 |
// (for example USER and PASS), so we don't have to check |
1656 |
22 May 07 |
gregory |
// these |
1652 |
22 May 07 |
gregory |
// cmd.equals("USER") || |
1652 |
22 May 07 |
gregory |
// cmd.equals("PASS") || |
1652 |
22 May 07 |
gregory |
// cmd.equals("HELP") || |
1652 |
22 May 07 |
gregory |
// cmd.equals("QUIT") || |
1652 |
22 May 07 |
gregory |
// 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 |
// 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 |
* Javadoc not in original Xerver code. Original use: PATH _must_ have / or \ |
1656 |
22 May 07 |
gregory |
* according to the demands of the local file system. If path ends with |
1656 |
22 May 07 |
gregory |
* File.separatorChar, the latter is removed. Modified functionality, not in |
1656 |
22 May 07 |
gregory |
* original Xerver code: Argument path will be converted to web syntax |
1656 |
22 May 07 |
gregory |
* separation '/'. If path ends with '/', the latter is removed. Original |
1656 |
22 May 07 |
gregory |
* use: PATH _must_ have / or \ according to the demands of the local file |
1656 |
22 May 07 |
gregory |
* system. If path ends with File.separatorChar, the latter is removed. |
1652 |
22 May 07 |
gregory |
* Modified functionality, not in original Xerver code: Argument path will |
1652 |
22 May 07 |
gregory |
* be converted to web syntax separation '/'. If path ends with '/', the |
1652 |
22 May 07 |
gregory |
* latter is removed. |
938 |
20 Nov 06 |
olle |
602 |
* |
1656 |
22 May 07 |
gregory |
* @param path String path, possibly expressed with other separator than |
1656 |
22 May 07 |
gregory |
* system |
938 |
20 Nov 06 |
olle |
* @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 |
// if (path.endsWith(File.separator)) |
1652 |
22 May 07 |
gregory |
// return path.substring(0,path.length()-1); |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// return path; |
938 |
20 Nov 06 |
olle |
613 |
/* |
938 |
20 Nov 06 |
olle |
* 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 |
* Javadoc not in original Xerver code. Original use: PATH _must_ have / or \ |
1656 |
22 May 07 |
gregory |
* according to the demands of the local file system. If path does not end |
1656 |
22 May 07 |
gregory |
* with File.separatorChar, the latter is added. Modified functionality, not |
1656 |
22 May 07 |
gregory |
* in original Xerver code: Argument path will be converted to web syntax |
1656 |
22 May 07 |
gregory |
* separation '/'. If path does not end with '/', the latter is appended. |
1652 |
22 May 07 |
gregory |
* Original use: PATH _must_ have / or \ according to the demands of the |
1652 |
22 May 07 |
gregory |
* local file system. If path does not end with File.separatorChar, the |
1656 |
22 May 07 |
gregory |
* latter is added. Modified functionality, not in original Xerver code: |
1656 |
22 May 07 |
gregory |
* Argument path will be converted to web syntax separation '/'. If path |
1656 |
22 May 07 |
gregory |
* does not end with '/', the latter is appended. |
938 |
20 Nov 06 |
olle |
635 |
* |
1656 |
22 May 07 |
gregory |
* @param path String path, possibly expressed with other separator than |
1656 |
22 May 07 |
gregory |
* system |
938 |
20 Nov 06 |
olle |
* @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 |
// if (path.endsWith(File.separator)) |
1652 |
22 May 07 |
gregory |
// return path; |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// return path+File.separator; |
938 |
20 Nov 06 |
olle |
646 |
/* |
938 |
20 Nov 06 |
olle |
* 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 |
* Set accessor method for s_currentRelativePath, not part of the original |
1652 |
22 May 07 |
gregory |
* Xerver code. Sets the instance variable s_currentRelativePath to |
1652 |
22 May 07 |
gregory |
* specified value. |
1652 |
22 May 07 |
gregory |
660 |
* |
1656 |
22 May 07 |
gregory |
* @param s_currentRelativePath String the path to set s_currentRelativePath |
1656 |
22 May 07 |
gregory |
* to. |
1652 |
22 May 07 |
gregory |
663 |
*/ |
1652 |
22 May 07 |
gregory |
// private void setS_currentRelativePath(String s_currentRelativePath) |
1652 |
22 May 07 |
gregory |
665 |
// { |
1652 |
22 May 07 |
gregory |
// if (s_currentRelativePath != null) |
1652 |
22 May 07 |
gregory |
667 |
// { |
1652 |
22 May 07 |
gregory |
// 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 |
* Set accessor method for s_currentRelativePath, not part of the original |
1656 |
22 May 07 |
gregory |
* Xerver code. Sets the instance variable s_currentRelativePath to |
1656 |
22 May 07 |
gregory |
* specified value. The USER command is sent to begin the login process. |
1656 |
22 May 07 |
gregory |
* Argument username should be a valid user name on the system, or |
1656 |
22 May 07 |
gregory |
* "anonymous" to initiate an anonymous login. If no argument username is |
1656 |
22 May 07 |
gregory |
* given, default "guest" is used. |
741 |
10 Oct 06 |
olle |
678 |
* |
1656 |
22 May 07 |
gregory |
* @param argUsername String with login user name. |
741 |
10 Oct 06 |
olle |
* @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 |
// Start removing all permissions for the user since a new USER has been |
1652 |
22 May 07 |
gregory |
// 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 |
* PASS - Password (password) The PASS command is sent to complete the login |
1656 |
22 May 07 |
gregory |
* process, and follows the USER command. Argument password should be the |
1656 |
22 May 07 |
gregory |
* valid password for the username on the system. The PASS command is sent |
1656 |
22 May 07 |
gregory |
* to complete the login process, and follows the USER command. Argument |
1656 |
22 May 07 |
gregory |
* password should be the valid password for the username on the system. |
741 |
10 Oct 06 |
olle |
701 |
* |
1656 |
22 May 07 |
gregory |
* @param argPassword String with login password. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** Debug Info |
1652 |
22 May 07 |
gregory |
// log.info("FTPNewConnection::command_PASS(): Start - s_userName = \"" |
1652 |
22 May 07 |
gregory |
// + 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 |
// *** 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 |
// as |
2418 |
22 Nov 07 |
gregory |
// 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 |
// *** 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 |
* RNFR - Rename From (filename) The RNFR command is used to specify the |
1656 |
22 May 07 |
gregory |
* file to be renamed, and is to be followed by an RNTO (Rename To) command |
1656 |
22 May 07 |
gregory |
* that specifies the new filename. |
741 |
10 Oct 06 |
olle |
759 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file to be renamed. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* Make sure to set this to null here so that after command_RNFR has |
1652 |
22 May 07 |
gregory |
* been called we shall either (1) have f_fileToRenameWithRNFR=null or |
1652 |
22 May 07 |
gregory |
* (2) f_fileToRenameWithRNFR="a correct file that might be renamed" (if |
1652 |
22 May 07 |
gregory |
* we didn't made this we might end up with running this function and |
1652 |
22 May 07 |
gregory |
* get a 550 error but still have f_fileToRenameWithRNFR= "some old |
1652 |
22 May 07 |
gregory |
* 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 |
* RNTO - Rename To (filename) The RNTO command is used to specify the new |
1656 |
22 May 07 |
gregory |
* filename, and is to be preceded by an RNFR (Rename From) command that |
1656 |
22 May 07 |
gregory |
* specifies the file to be renamed. The RNTO command is used to specify the |
1656 |
22 May 07 |
gregory |
* new filename, and is to be preceded by an RNFR (Rename From) command that |
1656 |
22 May 07 |
gregory |
* specifies the file to be renamed. |
741 |
10 Oct 06 |
olle |
804 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with new name of file. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* If we don't want that RNTO shall give an "file already exists"-error, |
2418 |
22 Nov 07 |
gregory |
* but only overwrite the file, comment the following "else |
2418 |
22 Nov 07 |
gregory |
* 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 |
// [file |
2418 |
22 Nov 07 |
gregory |
// renamed |
2418 |
22 Nov 07 |
gregory |
// successfully] |
2418 |
22 Nov 07 |
gregory |
// 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 |
* DELE - Delete (remote filename) |
741 |
10 Oct 06 |
olle |
860 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of remote file to be deleted. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
// File theFile=new File(s_file); |
1652 |
22 May 07 |
gregory |
// 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 |
// theFile.delete(); |
1652 |
22 May 07 |
gregory |
// return "250 "+makeSlashForResponse(argFile)+" was |
1652 |
22 May 07 |
gregory |
// successfully deleted."; |
931 |
16 Nov 06 |
olle |
905 |
/* |
931 |
16 Nov 06 |
olle |
* 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 |
* 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 |
* 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 |
// 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 |
* If no exceptions, file is OK. |
931 |
16 Nov 06 |
olle |
936 |
*/ |
1652 |
22 May 07 |
gregory |
// return "250 "+makeSlashForResponse(argFile)+" was |
1652 |
22 May 07 |
gregory |
// 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 |
* 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 |
* 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 |
* RMD - Remove Directory (remote directory) |
741 |
10 Oct 06 |
olle |
980 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of remote directory to be removed. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
// File theFile=new File(s_file); |
1652 |
22 May 07 |
gregory |
// if (theFile.isDirectory()) |
1652 |
22 May 07 |
gregory |
1013 |
// { |
1652 |
22 May 07 |
gregory |
// if (theFile.delete()) |
1652 |
22 May 07 |
gregory |
// return "250 "+makeSlashForResponse(argFile)+" was |
1652 |
22 May 07 |
gregory |
// successfully deleted."; |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// return "550-"+makeSlashForResponse(argFile)+" could not be |
1652 |
22 May 07 |
gregory |
// deleted.\r\n"+ |
1652 |
22 May 07 |
gregory |
// "550 Make sure you have permissions to delete the folder and |
1652 |
22 May 07 |
gregory |
// that the folder is empty."; |
1652 |
22 May 07 |
gregory |
1022 |
// } |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
1024 |
// { |
1652 |
22 May 07 |
gregory |
// return "550 "+makeSlashForResponse(argFile)+" exists, but is |
1652 |
22 May 07 |
gregory |
// not a directory."; |
1652 |
22 May 07 |
gregory |
1027 |
// } |
2142 |
16 Oct 07 |
gregory |
// boolean pathIsValidCoreDirectory = MyLS.isValidCoreDirectory( |
2142 |
16 Oct 07 |
gregory |
// 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 |
* 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 |
* 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 |
* 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 |
// 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 |
* If no exceptions, directory is OK. |
931 |
16 Nov 06 |
olle |
1068 |
*/ |
1652 |
22 May 07 |
gregory |
// return "250 "+makeSlashForResponse(argFile)+" was |
1652 |
22 May 07 |
gregory |
// 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 |
* 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 |
* 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 |
* MKD - Make Directory (remote directory) |
741 |
10 Oct 06 |
olle |
1112 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of remote directory to be created. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// File tmpFolder; |
1652 |
22 May 07 |
gregory |
// tmpFolder=new File(s_newPath); |
1652 |
22 May 07 |
gregory |
// 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 |
// boolean result=(new File(s_file)).mkdir(); |
1652 |
22 May 07 |
gregory |
// if (result) |
1652 |
22 May 07 |
gregory |
1159 |
// { |
1652 |
22 May 07 |
gregory |
// return "257 \""+makeSlashForResponse(argFile)+"\""; |
1652 |
22 May 07 |
gregory |
1161 |
// } |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
1163 |
// { |
1652 |
22 May 07 |
gregory |
// return "550-Server could not create directory.\r\n"+ |
1652 |
22 May 07 |
gregory |
// "550-The reason might be that the directory name is |
1652 |
22 May 07 |
gregory |
// illegal\r\n"+ |
1652 |
22 May 07 |
gregory |
// "550 or that the server doesn't have write permissions to |
1652 |
22 May 07 |
gregory |
// 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 |
* 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 |
* ALLO - Allocate storage space to receive a file (size [R |
1652 |
22 May 07 |
gregory |
* max-record-size]) |
741 |
10 Oct 06 |
olle |
1196 |
* |
1656 |
22 May 07 |
gregory |
* @param arg String with storage size to allocate, and optional |
1656 |
22 May 07 |
gregory |
* max-record-size. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* STOR - Store (remote filename) Begins transmission of file to the remote |
1656 |
22 May 07 |
gregory |
* system. Must be preceded by a PORT or PASV command to indicate where to |
1656 |
22 May 07 |
gregory |
* accept data from. Begins transmission of file to the remote system. Must |
1656 |
22 May 07 |
gregory |
* be preceded by a PORT or PASV command to indicate where to accept data |
1656 |
22 May 07 |
gregory |
* from. |
741 |
10 Oct 06 |
olle |
1216 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file to be stored on remote system. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* Remove any directory part in absolute path. |
1685 |
28 May 07 |
olle |
1229 |
*/ |
2142 |
16 Oct 07 |
gregory |
// 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 |
// 2 |
2418 |
22 Nov 07 |
gregory |
// secs |
2418 |
22 Nov 07 |
gregory |
// for |
2418 |
22 Nov 07 |
gregory |
// client |
2418 |
22 Nov 07 |
gregory |
// to |
2418 |
22 Nov 07 |
gregory |
// take |
2418 |
22 Nov 07 |
gregory |
// data |
2418 |
22 Nov 07 |
gregory |
// connection |
2418 |
22 Nov 07 |
gregory |
// (true |
2418 |
22 Nov 07 |
gregory |
// if |
2418 |
22 Nov 07 |
gregory |
// taken, |
2418 |
22 Nov 07 |
gregory |
// false |
2418 |
22 Nov 07 |
gregory |
// if |
2418 |
22 Nov 07 |
gregory |
// not |
2418 |
22 Nov 07 |
gregory |
// 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 |
// not |
2418 |
22 Nov 07 |
gregory |
// append |
1656 |
22 May 07 |
gregory |
// to |
2418 |
22 Nov 07 |
gregory |
// file, |
2418 |
22 Nov 07 |
gregory |
// instead |
2418 |
22 Nov 07 |
gregory |
// replace |
2418 |
22 Nov 07 |
gregory |
// 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 |
// I don't know if this is really a good response, as we |
2418 |
22 Nov 07 |
gregory |
// don't close the connection... It's just that the |
2418 |
22 Nov 07 |
gregory |
// client has not taken the data connection we have |
2418 |
22 Nov 07 |
gregory |
// 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 |
// shall not be given |
2418 |
22 Nov 07 |
gregory |
// after a PASV, |
2418 |
22 Nov 07 |
gregory |
// however, I have no |
2418 |
22 Nov 07 |
gregory |
// idea what else to put |
2418 |
22 Nov 07 |
gregory |
// 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 |
* APPE - Append data to remote file (remote filename) Appends data to file |
1656 |
22 May 07 |
gregory |
* to the remote system. The remote file is created, if it does not exist. |
1656 |
22 May 07 |
gregory |
* Must be preceded by a PORT or PASV command to indicate where to accept |
1656 |
22 May 07 |
gregory |
* data from. Appends data to file to the remote system. The remote file is |
1656 |
22 May 07 |
gregory |
* created, if it does not exist. Must be preceded by a PORT or PASV command |
1656 |
22 May 07 |
gregory |
* to indicate where to accept data from. |
741 |
10 Oct 06 |
olle |
1320 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file on remote system to append data |
1656 |
22 May 07 |
gregory |
* to. |
741 |
10 Oct 06 |
olle |
* @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 |
// to end of file |
741 |
10 Oct 06 |
olle |
1328 |
{ |
790 |
23 Oct 06 |
olle |
// *** 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 |
// 2 |
1656 |
22 May 07 |
gregory |
// secs |
1656 |
22 May 07 |
gregory |
// for |
1656 |
22 May 07 |
gregory |
// client |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// take |
1656 |
22 May 07 |
gregory |
// data |
1656 |
22 May 07 |
gregory |
// connection |
1656 |
22 May 07 |
gregory |
// (true |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// taken, |
1656 |
22 May 07 |
gregory |
// false |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// not |
1656 |
22 May 07 |
gregory |
// 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 |
// append |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// 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 |
// I don't know if this is really a good response, as we |
2418 |
22 Nov 07 |
gregory |
// don't close the connection... It's just that the |
2418 |
22 Nov 07 |
gregory |
// client has not taken the data connection we have |
2418 |
22 Nov 07 |
gregory |
// 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 |
// shall not be given |
2418 |
22 Nov 07 |
gregory |
// after a PASV, |
2418 |
22 Nov 07 |
gregory |
// however, I have no |
2418 |
22 Nov 07 |
gregory |
// idea what else to put |
2418 |
22 Nov 07 |
gregory |
// 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 |
* RETR - Retrieve (remote filename) Begins transmission of file from the |
1656 |
22 May 07 |
gregory |
* remote system. Must be preceded by a PORT or PASV command to indicate |
1656 |
22 May 07 |
gregory |
* where to accept data from. Begins transmission of file from the remote |
1656 |
22 May 07 |
gregory |
* system. Must be preceded by a PORT or PASV command to indicate where to |
1656 |
22 May 07 |
gregory |
* accept data from. |
741 |
10 Oct 06 |
olle |
1407 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file on remote system. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* 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 |
// return "550 Requested action not taken. "+argFile+" is a folder, |
1652 |
22 May 07 |
gregory |
// 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 |
* 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 |
// 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 |
* Firefox for example asks for the content of a file when it |
1652 |
22 May 07 |
gregory |
* 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 |
* Wait 2 secs for client to take data connection (true if |
1652 |
22 May 07 |
gregory |
* 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 |
// I don't know if this is really a good response, as we |
2418 |
22 Nov 07 |
gregory |
// don't close the connection... It's just that the |
2418 |
22 Nov 07 |
gregory |
// client has not taken the data connection we have |
2418 |
22 Nov 07 |
gregory |
// 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 |
// shall not be given |
2418 |
22 Nov 07 |
gregory |
// after a PASV, |
2418 |
22 Nov 07 |
gregory |
// however, I have no |
2418 |
22 Nov 07 |
gregory |
// idea what else to put |
2418 |
22 Nov 07 |
gregory |
// 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 |
* SIZE - Size of remote file (remote filename) Returns the size of the |
1656 |
22 May 07 |
gregory |
* remote file as a decimal number. Returns the size of the remote file as a |
1656 |
22 May 07 |
gregory |
* decimal number. |
741 |
10 Oct 06 |
olle |
1541 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file on remote system. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* 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 |
* 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 |
// *** 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 |
// 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 |
// 2 |
1656 |
22 May 07 |
gregory |
// secs |
1656 |
22 May 07 |
gregory |
// for |
1656 |
22 May 07 |
gregory |
// client |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// take |
1656 |
22 May 07 |
gregory |
// data |
1656 |
22 May 07 |
gregory |
// connection |
1656 |
22 May 07 |
gregory |
// (true |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// taken, |
1656 |
22 May 07 |
gregory |
// false |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// not |
1656 |
22 May 07 |
gregory |
// 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 |
// I don't know if this is really a good response, as we |
1652 |
22 May 07 |
gregory |
// don't close the connection... It's just that the client |
1652 |
22 May 07 |
gregory |
// 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 |
// shall not be given |
2418 |
22 Nov 07 |
gregory |
// after a PASV, |
2418 |
22 Nov 07 |
gregory |
// however, I have no |
2418 |
22 Nov 07 |
gregory |
// idea what else to put |
2418 |
22 Nov 07 |
gregory |
// 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 |
// *** 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 |
// 2 |
1656 |
22 May 07 |
gregory |
// secs |
1656 |
22 May 07 |
gregory |
// for |
1656 |
22 May 07 |
gregory |
// client |
1656 |
22 May 07 |
gregory |
// to |
1656 |
22 May 07 |
gregory |
// take |
1656 |
22 May 07 |
gregory |
// data |
1656 |
22 May 07 |
gregory |
// connection |
1656 |
22 May 07 |
gregory |
// (true |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// taken, |
1656 |
22 May 07 |
gregory |
// false |
1656 |
22 May 07 |
gregory |
// if |
1656 |
22 May 07 |
gregory |
// not |
1656 |
22 May 07 |
gregory |
// 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 |
// if (s_currentRelativePath.equals(File.separator)) |
1652 |
22 May 07 |
gregory |
// //Aliases can only be listed (but might not be listed) |
1652 |
22 May 07 |
gregory |
// when we are at root... |
1652 |
22 May 07 |
gregory |
1742 |
if (s_currentRelativePath.equals(coreSeparator)) // Aliases |
1656 |
22 May 07 |
gregory |
// can |
1656 |
22 May 07 |
gregory |
// only |
1656 |
22 May 07 |
gregory |
// be |
1656 |
22 May 07 |
gregory |
// listed |
1656 |
22 May 07 |
gregory |
// (but |
1656 |
22 May 07 |
gregory |
// might |
1656 |
22 May 07 |
gregory |
// not |
1656 |
22 May 07 |
gregory |
// be |
1656 |
22 May 07 |
gregory |
// listed) |
1656 |
22 May 07 |
gregory |
// when |
1656 |
22 May 07 |
gregory |
// we |
1656 |
22 May 07 |
gregory |
// are |
1656 |
22 May 07 |
gregory |
// at |
1656 |
22 May 07 |
gregory |
// root... |
741 |
10 Oct 06 |
olle |
1757 |
{ |
1652 |
22 May 07 |
gregory |
// HERE WE MAKE SURE THAT WE LIST ALIASES IF WE ARE IN |
1652 |
22 May 07 |
gregory |
// 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 |
// 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 |
// I don't know if this is really a good response, as we |
1652 |
22 May 07 |
gregory |
// don't close the connection... It's just that the client |
1652 |
22 May 07 |
gregory |
// 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 |
// shall not be given |
2418 |
22 Nov 07 |
gregory |
// after a PASV, |
2418 |
22 Nov 07 |
gregory |
// however, I have no |
2418 |
22 Nov 07 |
gregory |
// idea what else to put |
2418 |
22 Nov 07 |
gregory |
// 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 |
* LIST - List remote file/directory ([remote file-specification]) For |
1656 |
22 May 07 |
gregory |
* remote file-specification referring to a file, sends information about |
1656 |
22 May 07 |
gregory |
* the file. For remote file-specification referring to a directory, sends |
1656 |
22 May 07 |
gregory |
* information about each file in the directory. Optional argument [remote |
1656 |
22 May 07 |
gregory |
* file-specification] defaults to the current directory. Must be preceded |
1656 |
22 May 07 |
gregory |
* by a PORT or PASV command. For remote file-specification referring to a |
1656 |
22 May 07 |
gregory |
* file, sends information about the file. For remote file-specification |
1656 |
22 May 07 |
gregory |
* referring to a directory, sends information about each file in the |
1656 |
22 May 07 |
gregory |
* directory. Optional argument [remote file-specification] defaults to the |
1656 |
22 May 07 |
gregory |
* current directory. Must be preceded by a PORT or PASV command. |
741 |
10 Oct 06 |
olle |
1823 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String with name of file/directory on remote system. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
// Set initial value of temporarilyInSharedProjectsFolder to that of inSharedProjectsFolder |
3469 |
02 Nov 09 |
olle |
1844 |
setTemporarilyInSharedProjectsFolder(isInSharedProjectsFolder()); |
3469 |
02 Nov 09 |
olle |
// 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 |
//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 |
//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 |
// Show info on a file |
741 |
10 Oct 06 |
olle |
1866 |
{ |
3469 |
02 Nov 09 |
olle |
//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 |
* PASV - Passive mode In passive mode, the server waits for the client to |
1656 |
22 May 07 |
gregory |
* connect to it on a specific port. The port is specified as |
1656 |
22 May 07 |
gregory |
* (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 |
* the port number. In passive mode, the server waits for the client to |
1656 |
22 May 07 |
gregory |
* connect to it on a specific port. The port is specified as |
1656 |
22 May 07 |
gregory |
* (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 |
* the port number. |
741 |
10 Oct 06 |
olle |
1883 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String (unused). |
1652 |
22 May 07 |
gregory |
* @return String with address of the port the server is listening on, or |
1652 |
22 May 07 |
gregory |
* 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 |
// *** 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 |
// already is |
1656 |
22 May 07 |
gregory |
// established, just |
1656 |
22 May 07 |
gregory |
// kill it (this is |
1656 |
22 May 07 |
gregory |
// what PASV is |
1656 |
22 May 07 |
gregory |
// 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 |
// not be given after a |
1656 |
22 May 07 |
gregory |
// PASV, however, I have no |
1656 |
22 May 07 |
gregory |
// idea what else to put |
1656 |
22 May 07 |
gregory |
// 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 |
* PORT - Port to connect to in active mode (IPandPort) In active mode, the |
1656 |
22 May 07 |
gregory |
* server connects to a specific client port. The port is specified as |
1656 |
22 May 07 |
gregory |
* "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 |
* the port number. In active mode, the server connects to a specific client |
1656 |
22 May 07 |
gregory |
* port. The port is specified as "a1,a2,a3,a4,p1,p2", where a1.a2.a3.a4 is |
1656 |
22 May 07 |
gregory |
* the IP address and p1*256+p2 is the port number. |
741 |
10 Oct 06 |
olle |
1932 |
* |
1656 |
22 May 07 |
gregory |
* @param IPandPort String with IP address and port number to connect to. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// already is |
1656 |
22 May 07 |
gregory |
// established, just |
1656 |
22 May 07 |
gregory |
// kill it (this is |
1656 |
22 May 07 |
gregory |
// what PASV is |
1656 |
22 May 07 |
gregory |
// suppsoed to do) |
1652 |
22 May 07 |
gregory |
// NOW MAKE IPandPort="1,2,3,4,a,b" ==> portNr=256*a+b and |
1652 |
22 May 07 |
gregory |
// 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 |
// "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 |
// connect to |
1656 |
22 May 07 |
gregory |
// himself] OR [User |
1656 |
22 May 07 |
gregory |
// is sitting at |
1656 |
22 May 07 |
gregory |
// server], then |
1656 |
22 May 07 |
gregory |
// accept the |
1656 |
22 May 07 |
gregory |
// 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 |
// not be given after a |
1656 |
22 May 07 |
gregory |
// PASV, however, I have no |
1656 |
22 May 07 |
gregory |
// idea what else to put |
1656 |
22 May 07 |
gregory |
// 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 |
* TYPE - Type of file to be transferred (type-character |
1656 |
22 May 07 |
gregory |
* [second-type-character]) First argument type-character can in general be |
1656 |
22 May 07 |
gregory |
* one of: * A - ASCII text * E - EBCDIC text (not implemented in this |
1656 |
22 May 07 |
gregory |
* method) * I - Image (binary data) * L - Local format |
1656 |
22 May 07 |
gregory |
* (second-type-character specifies number of bits/byte, my not be omitted) |
741 |
10 Oct 06 |
olle |
* For A and E, the optional second-type-character specifies how to |
1652 |
22 May 07 |
gregory |
* interpret the text: * N - Non-print (default) * T - Telnet format control (<CR>, |
1652 |
22 May 07 |
gregory |
* <FF>, etc.) * C - ASA Carriage Control |
1652 |
22 May 07 |
gregory |
2005 |
* |
1656 |
22 May 07 |
gregory |
* @param arg String with type information character(s). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* REST - Restart (position) Sets starting point of file transmission |
1656 |
22 May 07 |
gregory |
* (useful when resuming interrupted file transfers). Must be preceded by a |
1656 |
22 May 07 |
gregory |
* PORT or PASV command toindicate where to accept data from. Must |
1656 |
22 May 07 |
gregory |
* immediately precede a RETR or STOR data transfer commend. The position |
1656 |
22 May 07 |
gregory |
* value is a decimal number for non-structured files. Sets starting point |
1656 |
22 May 07 |
gregory |
* of file transmission (useful when resuming interrupted file transfers). |
1656 |
22 May 07 |
gregory |
* Must be preceded by a PORT or PASV command toindicate where to accept |
1656 |
22 May 07 |
gregory |
* data from. Must immediately precede a RETR or STOR data transfer commend. |
1656 |
22 May 07 |
gregory |
* The position value is a decimal number for non-structured files. |
741 |
10 Oct 06 |
olle |
2044 |
* |
1656 |
22 May 07 |
gregory |
* @param startPosValue String with decimal position value. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
* STRU - Structure of file to be transferred (structure-character) Argument |
1656 |
22 May 07 |
gregory |
* structure-character can in general be one of: * F - File, no structure |
1656 |
22 May 07 |
gregory |
* (default) * R - Record structure (not implemented in this method) * P - |
1656 |
22 May 07 |
gregory |
* Page structure (not implemented in this method) Argument |
1656 |
22 May 07 |
gregory |
* structure-character can in general be one of: * F - File, no structure |
1656 |
22 May 07 |
gregory |
* (default) * R - Record structure (not implemented in this method) * P - |
1656 |
22 May 07 |
gregory |
* Page structure (not implemented in this method) |
741 |
10 Oct 06 |
olle |
2078 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with structure information character. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* MODE - Mode of transfer (mode-character) Argument mode-character can in |
1656 |
22 May 07 |
gregory |
* general be one of: * S - Stream (default) * B - Block (not implemented in |
1656 |
22 May 07 |
gregory |
* this method) * C - Compressed (not implemented in this method) Argument |
1656 |
22 May 07 |
gregory |
* mode-character can in general be one of: * S - Stream (default) * B - |
1656 |
22 May 07 |
gregory |
* Block (not implemented in this method) * C - Compressed (not implemented |
1656 |
22 May 07 |
gregory |
* in this method) |
741 |
10 Oct 06 |
olle |
2100 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with mode information character. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* HELP - Help ([command]) |
741 |
10 Oct 06 |
olle |
2117 |
* |
1656 |
22 May 07 |
gregory |
* @param verb String with command to get help on (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* NOOP - No Operation |
741 |
10 Oct 06 |
olle |
2132 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with argument (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* Note: This MIGHT (if we have "been idle" too long) write a |
1652 |
22 May 07 |
gregory |
* "Bye"-response and then close the connection, so Xerver will try |
1652 |
22 May 07 |
gregory |
* 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 |
* SYST - System information Returns a string identifying the system, the |
1656 |
22 May 07 |
gregory |
* string "Type:", and the default transfer type, as set by the TYPE |
1656 |
22 May 07 |
gregory |
* command. Example: UNIX Type: L8 This method simply returns a hard-coded |
1656 |
22 May 07 |
gregory |
* string with system information, and therefore needs to be adapted to the |
1656 |
22 May 07 |
gregory |
* system it is implemented on. Returns a string identifying the system, the |
1656 |
22 May 07 |
gregory |
* string "Type:", and the default transfer type, as set by the TYPE |
1656 |
22 May 07 |
gregory |
* command. Example: UNIX Type: L8 This method simply returns a hard-coded |
1656 |
22 May 07 |
gregory |
* string with system information, and therefore needs to be adapted to the |
1656 |
22 May 07 |
gregory |
* system it is implemented on. |
741 |
10 Oct 06 |
olle |
2170 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with argument (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// Set flag indicating text-based FTP client type to true, |
4047 |
01 Dec 10 |
olle |
// 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 |
* STAT - Status information ([remote file-specification]) If invoked |
1656 |
22 May 07 |
gregory |
* without argument, returns general status information on the FTP server |
1656 |
22 May 07 |
gregory |
* process. With a file-specification argument, acts like the LIST command, |
1656 |
22 May 07 |
gregory |
* except that the information is sent over the control connection, so no |
1656 |
22 May 07 |
gregory |
* PORT or PASV command is required: General expected output is: For remote |
1656 |
22 May 07 |
gregory |
* file-specification referring to a file, sends information about the file. |
1656 |
22 May 07 |
gregory |
* For remote file-specification referring to a directory, sends information |
1656 |
22 May 07 |
gregory |
* about each file in the directory. This method only accepts subCommand |
1656 |
22 May 07 |
gregory |
* argument starting with a hyphen '-', and then ignores characters that |
1656 |
22 May 07 |
gregory |
* follow. |
1652 |
22 May 07 |
gregory |
2205 |
* |
1656 |
22 May 07 |
gregory |
* @param subCommand String with name of file/directory on remote system. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// More information about the status of the server shall be given... |
1652 |
22 May 07 |
gregory |
// return "211 This server is running Xerver Free FTP Server |
1652 |
22 May 07 |
gregory |
// "+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 |
* 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 |
* 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 |
* 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 |
// if (s_currentRelativePath.equals(File.separator)) |
1652 |
22 May 07 |
gregory |
// //Aliases can only be listed (but might not be listed) |
1652 |
22 May 07 |
gregory |
// when we are at root... |
1652 |
22 May 07 |
gregory |
2273 |
if (s_currentRelativePath.equals(coreSeparator)) // Aliases |
1656 |
22 May 07 |
gregory |
// can |
1656 |
22 May 07 |
gregory |
// only |
1656 |
22 May 07 |
gregory |
// be |
1656 |
22 May 07 |
gregory |
// listed |
1656 |
22 May 07 |
gregory |
// (but |
1656 |
22 May 07 |
gregory |
// might |
1656 |
22 May 07 |
gregory |
// not |
1656 |
22 May 07 |
gregory |
// be |
1656 |
22 May 07 |
gregory |
// listed) |
1656 |
22 May 07 |
gregory |
// when |
1656 |
22 May 07 |
gregory |
// we |
1656 |
22 May 07 |
gregory |
// are |
1656 |
22 May 07 |
gregory |
// at |
1656 |
22 May 07 |
gregory |
// root... |
741 |
10 Oct 06 |
olle |
2288 |
{ |
1652 |
22 May 07 |
gregory |
// HERE WE MAKE SURE THAT WE LIST ALIASES IF WE ARE IN |
1652 |
22 May 07 |
gregory |
// 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 |
// (new |
1652 |
22 May 07 |
gregory |
// 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 |
// if (i_howToShowAlias==SHOW_ALIASES_AND_DIRS) |
931 |
16 Nov 06 |
olle |
2307 |
{ |
1652 |
22 May 07 |
gregory |
// (new |
1652 |
22 May 07 |
gregory |
// 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 |
// (new |
1652 |
22 May 07 |
gregory |
// 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 |
// return "211 This server is running Xerver Free FTP Server |
1652 |
22 May 07 |
gregory |
// "+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 |
* QUIT - Quit command connection |
741 |
10 Oct 06 |
olle |
2348 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with argument (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
* 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 |
* PWD - Print Working Directory |
741 |
10 Oct 06 |
olle |
2376 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with argument (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
* CDUP - Change Directory Up Changes working directory to the parent |
1656 |
22 May 07 |
gregory |
* directory of the current working directory, i.e. moves one step up in the |
1656 |
22 May 07 |
gregory |
* directroy tree structure. |
1652 |
22 May 07 |
gregory |
2404 |
* |
1656 |
22 May 07 |
gregory |
* @param dummy String with argument (not used). |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// if (!s_currentRelativePath.equals(File.separator)) |
1652 |
22 May 07 |
gregory |
// return |
1652 |
22 May 07 |
gregory |
// command_CWD(s_currentRelativePath.substring(0,s_currentRelativePath.lastIndexOf(File.separatorChar, |
1652 |
22 May 07 |
gregory |
// s_currentRelativePath.length()-2)+1)); |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// 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 |
* CWD - Change Working Directory (remote-directory) Changes working |
1656 |
22 May 07 |
gregory |
* directory to the given directory on the remote host. |
1652 |
22 May 07 |
gregory |
2434 |
* |
1656 |
22 May 07 |
gregory |
* @param argPath String with path to new working directory. |
741 |
10 Oct 06 |
olle |
* @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 |
// *** 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 |
// 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 |
// 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 |
// 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 |
// 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 |
// 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 |
// 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 |
* 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 |
* NOTE: We must have this line, otherwise when someone would try to |
1652 |
22 May 07 |
gregory |
* list "c:/dir/dir2" the listing would succeed or fail depending on |
1652 |
22 May 07 |
gregory |
* what permission are set for "c:/dir/", but we want the listing to be |
1652 |
22 May 07 |
gregory |
* allowed/denied depending on what access we have on "c:/dir/dir2/", so |
1652 |
22 May 07 |
gregory |
* 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 |
// File tmpFolder; |
1652 |
22 May 07 |
gregory |
// tmpFolder=new File(s_newPath); |
1652 |
22 May 07 |
gregory |
// if (tmpFolder.isDirectory()) |
2142 |
16 Oct 07 |
gregory |
// boolean pathIsValidCoreDirectory = |
2142 |
16 Oct 07 |
gregory |
// 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 |
// 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 |
// 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 |
* Checks if a directory name corresponds to a shared |
3464 |
26 Oct 09 |
olle |
* directory for an input project directory, and if so, |
3464 |
26 Oct 09 |
olle |
* returns the absolute core path of the shared directory, else null. |
3464 |
26 Oct 09 |
olle |
* Method not in the original Xerver code. |
3464 |
26 Oct 09 |
olle |
2578 |
* |
3464 |
26 Oct 09 |
olle |
* @param mixedSharedDirPath String Mixed path where top-most directory is shared to directory in parent path. |
3464 |
26 Oct 09 |
olle |
* @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 |
// 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 |
// 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 |
// 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 |
* Javadoc not in original Xerver code. Examples of original use |
1656 |
22 May 07 |
gregory |
* (File.separatorChar = '\', s_currentRelativePath = "scur\): "" -> "scur\" |
1656 |
22 May 07 |
gregory |
* "blah/blaah" -> "scur\blah\blaah" "/blah/blaah" -> "\blah\blaah" |
1656 |
22 May 07 |
gregory |
* Redirections using '.' and '..' will be expanded as far as possible. |
1652 |
22 May 07 |
gregory |
* Modified functionality, not in original Xerver code: Paths will be |
1652 |
22 May 07 |
gregory |
* converted to web syntax separation '/' before return. |
938 |
20 Nov 06 |
olle |
2625 |
* |
1656 |
22 May 07 |
gregory |
* @param path String path, possibly expressed with other separator than |
1656 |
22 May 07 |
gregory |
* system |
938 |
20 Nov 06 |
olle |
* @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 |
// 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 |
// if (File.separatorChar=='\\') |
1652 |
22 May 07 |
gregory |
// path=path.replace('/',File.separatorChar); |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// path=path.replace('\\',File.separatorChar); |
938 |
20 Nov 06 |
olle |
2642 |
/* |
938 |
20 Nov 06 |
olle |
* 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 |
// if (path.charAt(0)==File.separatorChar) |
1652 |
22 May 07 |
gregory |
// path=MyString.makeCanonicalPath(path); |
1652 |
22 May 07 |
gregory |
// else |
1652 |
22 May 07 |
gregory |
// 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 |
// if (path.startsWith(".."+File.separator) || |
1652 |
22 May 07 |
gregory |
// path.startsWith(File.separator+".."+File.separator) || |
1652 |
22 May 07 |
gregory |
// 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 |
// 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 |
* This will only occur if we try to come to a folder "below" / (for |
2418 |
22 Nov 07 |
gregory |
* example: "/root/../../secret/" (which will evaluate to |
2418 |
22 Nov 07 |
gregory |
* "../secret/")). |
2418 |
22 Nov 07 |
gregory |
2672 |
*/ |
2418 |
22 Nov 07 |
gregory |
// 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 |
* Javadoc not in original Xerver code. Examples of original use |
1656 |
22 May 07 |
gregory |
* (File.separatorChar = '\', s_currentRelativePath = "scur\): "" -> "scur\" |
1656 |
22 May 07 |
gregory |
* "blah/blaah" -> "scur\blah\blaah" "/blah/blaah" -> "\blah\blaah" |
1656 |
22 May 07 |
gregory |
* Redirections using '.' and '..' will be expanded as far as possible. |
1652 |
22 May 07 |
gregory |
* Modified functionality, not in original Xerver code: Paths will be |
1652 |
22 May 07 |
gregory |
* converted to web syntax separation '/' before return. |
938 |
20 Nov 06 |
olle |
2685 |
* |
1656 |
22 May 07 |
gregory |
* @param argFile String file path, possibly expressed with other separator |
1656 |
22 May 07 |
gregory |
* than system |
938 |
20 Nov 06 |
olle |
* @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 |
// *** 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 |
* 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 |
// 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 |
// 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 |
// 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 |
* 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 |
// int |
2418 |
22 Nov 07 |
gregory |
// 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 |
* 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 |
* 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 |
* if (!isAbsPath) { |
2418 |
22 Nov 07 |
gregory |
* log.info("FTPNewConnection::makeRealFilePath(): return \"" + |
2418 |
22 Nov 07 |
gregory |
* folderNameWithoutLastSlash(s_aliasRoot)+absPath.substring(lengthOfAlias+1) + |
2418 |
22 Nov 07 |
gregory |
* "\""); return |
2418 |
22 Nov 07 |
gregory |
* folderNameWithoutLastSlash(s_aliasRoot)+absPath.substring(lengthOfAlias+1); } |
2418 |
22 Nov 07 |
gregory |
* else { log.info("FTPNewConnection::makeRealFilePath(): return |
2418 |
22 Nov 07 |
gregory |
* \"" + coreSeparator+absPath.substring(lengthOfAlias+1) + |
2418 |
22 Nov 07 |
gregory |
* "\""); return |
2418 |
22 Nov 07 |
gregory |
* 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 |
// alias does NOT exists and lengthOfAlias is a dummy value |
2418 |
22 Nov 07 |
gregory |
2798 |
/* |
2418 |
22 Nov 07 |
gregory |
* if (!isAbsPath) { |
2418 |
22 Nov 07 |
gregory |
* log.info("FTPNewConnection::makeRealFilePath(): return \"" + |
2418 |
22 Nov 07 |
gregory |
* folderNameWithoutLastSlash(s_root)+absPath + "\""); return |
2418 |
22 Nov 07 |
gregory |
* folderNameWithoutLastSlash(s_root)+absPath; } else { |
2418 |
22 Nov 07 |
gregory |
* log.info("FTPNewConnection::makeRealFilePath(): return \"" + |
2418 |
22 Nov 07 |
gregory |
* coreSeparator+absPath + "\""); return coreSeparator+absPath; } |
2418 |
22 Nov 07 |
gregory |
2805 |
*/ |
3464 |
26 Oct 09 |
olle |
// 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 |
// 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 |
// 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 |
// 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 |
// 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 |
* private String removeAliasFromAbsolutePath(String path) // |
1652 |
22 May 07 |
gregory |
* "/aliasname/dir1/dir2/" ==> "/dir1/dir2/" ...or... |
1652 |
22 May 07 |
gregory |
* "\aliasname\dir1\dir2\" ==> "\dir1\dir2\" { return |
1652 |
22 May 07 |
gregory |
* 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 |
* Checks if a path is a potential absolute core path, |
3459 |
23 Oct 09 |
olle |
* by checking the start of the path. Note that there |
3459 |
23 Oct 09 |
olle |
* is no guarantee that the path actually exists on the |
3459 |
23 Oct 09 |
olle |
* used system. |
3459 |
23 Oct 09 |
olle |
2884 |
* |
3459 |
23 Oct 09 |
olle |
* @param argPath String Path to check. |
3459 |
23 Oct 09 |
olle |
* @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 |
// 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 |
* Convenience method that checks if path |
3469 |
02 Nov 09 |
olle |
* corresponds to shared projects folder. |
3469 |
02 Nov 09 |
olle |
* Method not part of original Xerver code. |
3469 |
02 Nov 09 |
olle |
2905 |
* |
3469 |
02 Nov 09 |
olle |
* @param path String The path string to check. |
3469 |
02 Nov 09 |
olle |
* 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 |
// 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 |
* Convenience method that checks if path |
3469 |
02 Nov 09 |
olle |
* contains shared projects folder. |
3469 |
02 Nov 09 |
olle |
* Method not part of original Xerver code. |
3469 |
02 Nov 09 |
olle |
2936 |
* |
3469 |
02 Nov 09 |
olle |
* @param path String The path string to check. |
3469 |
02 Nov 09 |
olle |
* 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 |
* Convenience method that fetches the root |
3469 |
02 Nov 09 |
olle |
* directory of shared projects folder. |
3469 |
02 Nov 09 |
olle |
* Method not part of original Xerver code. |
3469 |
02 Nov 09 |
olle |
2961 |
* |
3469 |
02 Nov 09 |
olle |
* @param path String The path string to process. |
3469 |
02 Nov 09 |
olle |
* 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 |
// 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 |
// 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 |
} |