diff --git a/config/alfresco/network-protocol-context.xml b/config/alfresco/network-protocol-context.xml
index bc46127b07..0a685d6f07 100644
--- a/config/alfresco/network-protocol-context.xml
+++ b/config/alfresco/network-protocol-context.xml
@@ -55,12 +55,12 @@
-
-
+
+
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 eeffe910f6..728f43c6a9 100644
--- a/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java
+++ b/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java
@@ -16,8 +16,10 @@
*/
package org.alfresco.filesys.smb.server.repo;
+import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.net.URL;
import java.util.List;
import javax.transaction.UserTransaction;
@@ -52,6 +54,7 @@ import org.alfresco.filesys.smb.server.repo.pseudo.PseudoFileInterface;
import org.alfresco.filesys.smb.server.repo.pseudo.PseudoNetworkFile;
import org.alfresco.filesys.util.DataBuffer;
import org.alfresco.model.ContentModel;
+import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
import org.alfresco.service.cmr.lock.NodeLockedException;
import org.alfresco.service.cmr.repository.ContentService;
@@ -91,12 +94,13 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
private TransactionService transactionService;
private NamespaceService namespaceService;
private NodeService nodeService;
- private NodeService unprotectedNodeService;
- private SearchService unprotectedSearchService;
+ private SearchService searchService;
private ContentService contentService;
private PermissionService permissionService;
private CheckOutCheckInService checkInOutService;
-
+
+ private AuthenticationComponent authComponent;
+
// I/O control handler
private IOControlHandler m_ioHandler;
@@ -139,20 +143,12 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
this.nodeService = nodeService;
}
- /**
- * @param nodeService the node service
- */
- public void setUnprotectedNodeService(NodeService nodeService)
- {
- this.unprotectedNodeService = nodeService;
- }
-
/**
* @param searchService the search service
*/
- public void setUnprotectedSearchService(SearchService searchService)
+ public void setSearchService(SearchService searchService)
{
- this.unprotectedSearchService = searchService;
+ this.searchService = searchService;
}
@@ -184,6 +180,16 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
this.checkInOutService = checkInOutService;
}
+ /**
+ * Set the authentication component
+ *
+ * @param authComponent AuthenticationComponent
+ */
+ public void setAuthenticationComponent(AuthenticationComponent authComponent)
+ {
+ this.authComponent = authComponent;
+ }
+
/**
* Parse and validate the parameter string and create a device context object for this instance
* of the shared device. The same DeviceInterface implementation may be used for multiple
@@ -195,6 +201,10 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
*/
public DeviceContext createContext(ConfigElement cfg) throws DeviceContextException
{
+ // Use the system user as the authenticated context for the filesystem initialization
+
+ authComponent.setCurrentUser( authComponent.getSystemUserName());
+
// Wrap the initialization in a transaction
UserTransaction tx = transactionService.getUserTransaction(true);
@@ -220,11 +230,11 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
// Connect to the repo and ensure that the store exists
- if (!unprotectedNodeService.exists(storeRef))
+ if (! nodeService.exists(storeRef))
{
throw new DeviceContextException("Store not created prior to application startup: " + storeRef);
}
- NodeRef storeRootNodeRef = unprotectedNodeService.getRootNode(storeRef);
+ NodeRef storeRootNodeRef = nodeService.getRootNode(storeRef);
// Get the root path
@@ -237,8 +247,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
// Find the root node for this device
- List nodeRefs = unprotectedSearchService.selectNodes(
- storeRootNodeRef, rootPath, null, namespaceService, false);
+ List nodeRefs = searchService.selectNodes(storeRootNodeRef, rootPath, null, namespaceService, false);
NodeRef rootNodeRef = null;
@@ -260,6 +269,27 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
rootNodeRef = nodeRefs.get(0);
}
+ // Check if a relative path has been specified
+
+ ConfigElement relativePathElement = cfg.getChild(KEY_RELATIVE_PATH);
+
+ if ( relativePathElement != null)
+ {
+ // Make sure the path is in CIFS format
+
+ String relPath = relativePathElement.getValue().replace( '/', FileName.DOS_SEPERATOR);
+
+ // Find the node and validate that the relative path is to a folder
+
+ NodeRef relPathNode = cifsHelper.getNodeRef( rootNodeRef, relPath);
+ if ( cifsHelper.isDirectory( relPathNode) == false)
+ throw new DeviceContextException("Relative path is not a folder, " + relativePathElement.getValue());
+
+ // Use the relative path node as the root of the filesystem
+
+ rootNodeRef = relPathNode;
+ }
+
// Commit the transaction
tx.commit();
@@ -330,9 +360,18 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface
if ( pseudoName != null && appPath != null)
{
+ // Check that the application exists on the local filesystem
+
+ URL appURL = this.getClass().getClassLoader().getResource(appPath.getValue());
+ if ( appURL == null)
+ throw new DeviceContextException("Failed to find drag and drop application, " + appPath.getValue());
+ File appFile = new File(appURL.getFile());
+ if ( appFile.exists() == false)
+ throw new DeviceContextException("Drag and drop application not found, " + appPath.getValue());
+
// Create the pseudo file for the drag and drop application
- PseudoFile dragDropPseudo = new PseudoFile( pseudoName.getValue(), appPath.getValue());
+ PseudoFile dragDropPseudo = new PseudoFile( pseudoName.getValue(), appFile.getAbsolutePath());
context.setDragAndDropApp( dragDropPseudo);
// Enable pseudo file support