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();