From 958c02d7308d7b89cdecf66f17539d7141fc727b Mon Sep 17 00:00:00 2001 From: Gary Spencer Date: Tue, 23 May 2006 11:02:34 +0000 Subject: [PATCH] Fix for AR-565. Checked out files can be edited and saved via CIFS without any warnings being given that the save failed. Locked files are now marked as read-only, and may also be marked as offline if the config is enabled. An attempt to open a locked file for write returns an access denied status to the CIFS client. There is also a minor fix to the file state caching of folders that are not opened/referenced by the client directly, this caused them to be expire from the cache causing path lookups to require a database hit. The expiry time is now bumped when a folders cached file state is used to find the NodeRef for a path. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2948 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../filesys/smb/server/repo/CifsHelper.java | 23 +++++++++------- .../smb/server/repo/ContentDiskDriver.java | 26 ++++++++++++++++--- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java b/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java index 75aac16253..ed7823580e 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java @@ -214,16 +214,21 @@ public class CifsHelper // Check the lock status of the file - if ( hasLockedFilesAsOffline()) - { - String lockTypeStr = (String) nodeProperties.get(ContentModel.PROP_LOCK_TYPE); + String lockTypeStr = (String) nodeProperties.get(ContentModel.PROP_LOCK_TYPE); - if ( lockTypeStr != null) - { - // File is locked so mark it as offline - - fileInfo.setFileAttributes(fileInfo.getFileAttributes() + FileAttribute.NTOffline); - } + if ( lockTypeStr != null) + { + // File is locked so mark it as read-only and offline + + int attr = fileInfo.getFileAttributes(); + + if (( attr & FileAttribute.ReadOnly) == 0) + attr += FileAttribute.ReadOnly; + + if ( hasLockedFilesAsOffline()) + attr += FileAttribute.NTOffline; + + fileInfo.setFileAttributes( attr); } } diff --git a/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java b/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java index 3da4def1b7..e37eab5004 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java @@ -519,20 +519,24 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface { // Get the file information for the node + session.beginTransaction(transactionService, true); finfo = cifsHelper.getFileInformation(nodeRef); // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("getInfo using cached noderef for path " + path); } // If the required node was not in the state cache, the parent folder node might be - session.beginTransaction(transactionService, true); if ( finfo == null) { + // Start a transaction + + session.beginTransaction(transactionService, true); + String[] paths = FileName.splitPath( path); if ( paths[0] != null && paths[0].length() > 1) @@ -548,7 +552,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("getInfo using cached noderef for parent " + path); } } @@ -906,6 +910,13 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface if ( params.hasAccessMode(AccessMode.NTDelete) && permissionService.hasPermission(nodeRef, PermissionService.DELETE) == AccessStatus.DENIED) throw new AccessDeniedException("No delete access to " + params.getFullPath()); + + // Check if the file has a lock + + String lockTypeStr = (String) nodeService.getProperty( nodeRef, ContentModel.PROP_LOCK_TYPE); + + if ( params.hasAccessMode(AccessMode.NTWrite) && lockTypeStr != null) + throw new AccessDeniedException("File is locked, no write access to " + params.getFullPath()); // Check if there is a file state for the file @@ -1042,7 +1053,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("Create file using cached noderef for path " + paths[0]); } } @@ -1084,6 +1095,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface " node: " + nodeRef + "\n" + " network file: " + netFile); } + return netFile; } catch (org.alfresco.repo.security.permissions.AccessDeniedException ex) @@ -1860,6 +1872,12 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // check that the node exists if (nodeService.exists(fstate.getNodeRef())) { + // Bump the file states expiry time + + fstate.setExpiryTime(System.currentTimeMillis() + FileState.DefTimeout); + + // Return the cached noderef + return fstate.getNodeRef(); } else