David Peacock created CB-4816:
---------------------------------

             Summary: Blackberry File plug-in issues creating files outside 
sandbox
                 Key: CB-4816
                 URL: https://issues.apache.org/jira/browse/CB-4816
             Project: Apache Cordova
          Issue Type: Bug
          Components: BlackBerry, Plugin File
    Affects Versions: 3.0.0
            Reporter: David Peacock
            Assignee: Lorin Beer


I've updated to the latest file plug-in with the automatic un-sandbox changes 
when requesting a path outside the sandboxed area (these are in the dev branch 
today).  However there are still some issues with this.  I'm using 
blackberry.io to get the shared path where I know I should be able to write to.

I've broken down the process of writing to a file in 5 steps at the bottom of 
this issue.  First we get the file system, once we have that we get our 
directory - note we do this because we want to create a sub-folder if it's not 
already there, getFile does not permit this from what we can tell.  When we get 
the directory, everything looks ok - we can see the sandbox flag is turned off. 
 However, in step 3 when we go to get the file we simply pass in the name of 
the file as we are calling from the directory.  The issue here is when we call 
getFile with the current logic it thinks it is sandboxed still.  

If you take a look at the DirectoryEntry.js file for 
DirectoryEntry.prototype.getFile you will notice it's checking the path 
parameter alone to determine whether it is sandboxed.  It's not factoring in 
the currentPath into this equation.  As a result, it goes into the else for 
sandbox disabled, sets the sandbox state to true, then tries to get the file 
using currentPath (which is outside the sandbox) as well as the path (file name 
passed in) and fails.  It shouldn't be going into the else... really the 
fileUtils.isOutsideSandbox should be checking currentPath + "/" + path in this 
case.

I think we need to ensure we are following the API documentation carefully, we 
need support both relative and absolute paths.  Below are some snippets from 
the docs:

getDirectory
path: The path to the directory to be looked up or created. Either an absolute 
path, or a relative path from this DirectoryEntry. (DOMString)

getFile
path: The path to the file to be looked up or created. Either an absolute path, 
or a relative path from this DirectoryEntry. (DOMString)

In my opinion this means the logic in DirectoryEntry.js for getDirectory and 
getFile should be updated.  The first thing we should do is check to see if the 
path is absolute, i.e. the first char is "/" - if it is, we shouldn't be using 
the currentPath here at all I would think?  I made some minor updates to this 
logic locally and it is working now - at least for how we use it!  I will be 
making a pull request to GitHub shortly for this.

Below is a snippet of how we were trying to write to a file:

//Assuming you have blackberry.io plug-in and cordova file plug-in installed...
function FileManager() {}

FileManager.fileDir = blackberry.io.sharedFolder + "/documents/test/"; 
FileManager.fileName = "test.txt";

// Step 1 - Get file system
window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, FileManager.gotWriteFS, 
null);

//Step 2 - Get the directory
FileManager.gotWriteFS = function (fileSystem) {
   //Get/Create the directory we want to use
    fileSystem.root.getDirectory(FileManager.fileDir, {
        create: true,
        exclusive: false
    }, FileManager.gotWriteDirEntry, null); };

//Step 3 - Get the file
FileManager.gotWriteDirEntry = function (dirEntry) {
   //Get the file from the current directory
    dirEntry.getFile(FileManager.fileName, {
        create: true,
        exclusive: false
    }, FileManager.gotWriteFileEntry, null); };

//Step 4 - Create a writer
FileManager.gotWriteFileEntry = function (fileEntry) {
    fileEntry.createWriter(FileManager.gotFileWriter, null); };

//Step 5 - Write the data
FileManager.gotFileWriter = function (writer) {
    writer.write("something to write");
};


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to