You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2008/09/01 22:02:41 UTC
svn commit: r691042 - in /mina/ftpserver/trunk/core/src:
main/java/org/apache/ftpserver/filesystem/NativeFileObject.java
test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java
Author: ngn
Date: Mon Sep 1 13:02:41 2008
New Revision: 691042
URL: http://svn.apache.org/viewvc?rev=691042&view=rev
Log:
Improve delete permission handling on native file system (FTPSERVER-152). Patch by David Latorre
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/NativeFileObject.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java
Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/NativeFileObject.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/NativeFileObject.java?rev=691042&r1=691041&r2=691042&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/NativeFileObject.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/NativeFileObject.java Mon Sep 1 13:02:41 2008
@@ -215,12 +215,35 @@
*/
public boolean hasDeletePermission() {
+
// root cannot be deleted
if ("/".equals(fileName)) {
return false;
}
- return hasWritePermission();
+ /* Added 12/08/2008: in the case that the permission is not explicitly denied for this file
+ * we will check if the parent file has write permission as most systems consider that a file can
+ * be deleted when their parent directory is writable.
+ */
+ String fullName=getFullName();
+
+ // we check FTPServer's write permission for this file.
+ if (user.authorize(new WriteRequest(fullName)) == null) {
+ return false;
+ }
+ // In order to maintain consistency, when possible we delete the last '/' character in the String
+ int indexOfSlash=fullName.lastIndexOf('/');
+ String parentFullName;
+ if (indexOfSlash==0){
+ parentFullName="/";
+ }
+ else{
+ parentFullName=fullName.substring(0,indexOfSlash);
+ }
+
+ // we check if the parent FileObject is writable.
+ NativeFileObject parentObject=new NativeFileObject(parentFullName,file.getAbsoluteFile().getParentFile(),user);
+ return parentObject.hasWritePermission();
}
/**
Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java?rev=691042&r1=691041&r2=691042&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/filesystem/NativeFileObjectTest.java Mon Sep 1 13:02:41 2008
@@ -159,6 +159,22 @@
// OK
}
}
+ public void testDeleteReadOnlyFiles(){
+
+ NativeFileObject fileObj=(NativeFileObject)createFileObject(FILE2_PATH, USER);
+ File physicalFile=fileObj.getPhysicalFile();
+ // First check
+ assertTrue(fileObj.hasDeletePermission());
+
+ // Now file is read only.
+ if (!physicalFile.setReadOnly() ){
+ fail("Test cannot be setup properly");
+ }
+
+ assertTrue(fileObj.hasDeletePermission());
+ //can we actually delete this file?
+ assertTrue(physicalFile.delete());
+ }
protected void tearDown() throws Exception {
cleanTmpDirs();