RFR 7199674: (props) user.home property does not return an accessible location in sandboxed environment [macosx]

Steven Wilson swilson at storyrock.com
Wed Sep 11 10:36:01 PDT 2013


In the versions of Mac OS X that I'm looking at (Lion and Mtn Lion)  
the Documents folder inside the sandbox is NOT a symlink. Desktop,  
Downloads, Movies, Music and Pictures ARE all symlinks, but not  
Documents, so "~/Library/Containers/com.blah.someapp/Data/Documents"  
is not the same as "~/Documents". Someone correct me if I'm wrong but  
that's what I'm seeing.

Steve Wilson

On Sep 11, 2013, at 10:39 AM, macosx-port-dev-request at openjdk.java.net  
wrote:

>> In my app, I have an export dialog where the user can select the  
>> file to export as well as choose some other export options. In that  
>> dialog, after the user has selected the file to export (via the  
>> file selection dialog), I display the full path to the file that  
>> was returned from the file selection Dialog.
>>
>> So, if I understand you correctly (sorry, I haven't had time to  
>> verify this myself), with this change, passing in "user.home/ 
>> Documents" to the file dialog, the user will see "~/Documents" in  
>> the file dialog, but the full Container path will be returned as  
>> the selected file. So in my export dialog, the user would see the  
>> full Container path, even though the file selection dialog had  
>> shown a normal ~/Documents path?
>
> If you're using FileDialog (or some variant that eventually boils  
> down to NSSavePanel) then your app will continue to function  
> properly. If you're using a custom dialog then you'll need to switch  
> to FileDialog (or variant...) since NSSavePanel is what triggers  
> powerbox to do it's thing, if NSSavePanel is not invoked to choose  
> the exported file then your app will never be granted permission to  
> write to the file (unless you incant some other, more complicated,  
> voodoo magic).
>
> The bottom line is, if what you have now allows you to write to ~/ 
> Documents and you're sandboxed then this change should not affect  
> your application at all, except maybe in the UI if you're displaying  
> that path to the user. The user won't notice the difference otherwise.
>
>
>> Additionally what's not clear is (again, sorry, I haven't had time  
>> to verify this myself), if I do export the file to the Documents  
>> directory under the Container path, where does the file actually  
>> get saved? In /Users/nick/Documents or in /Users/nick/Library/ 
>> Container/my.app/Data/Documents? If it saves it to the Container's  
>> Documents folder, for other applications (Finder, Excel, Preview,  
>> etc) will it be visible in /Users/nick/Documents ?
>
> If you look in the app container you'll see that the Data directory  
> returned by NSHomeDirectory() is set up with symlinks back to the  
> users home directory, so when you access files in those directories  
> you're accessing the correct files. IOW, ~/Library/Containers/ 
> com.blah.someapp/Data/Documents is the same as ~/Documents, the  
> system does all this for you when the app container is created.
>
>
>> @Brent - you wrote:
>> "As it is now, apps needing to write app-specific data would need  
>> to special-case for the App Sandbox and go find the Container  
>> directory, since $HOME is not accessible (and only becomes  
>> accessible if the user interacts with a FileDialog)."
>>
>> Well, I already had to special case where I write app-specific data  
>> for each of the 3 platforms I support (Mac, Windows & Linux). Any  
>> Java app that is really cross-platform is going to have some  
>> platform specific code and platform specific jvm-launching/ 
>> packaging, if they want to do things the recommended way for that  
>> platform. A sandboxed Mac version was just another special case.   
>> For that, I use the AppBundler fork to launch the JVM and set some  
>> MAS specific properties so that I know that I'm running in the Mac  
>> sandbox and where the Container directory is. Then the right  
>> platform-specific initialization code in my app can be used to  
>> build the app-specific data in the right place.
>
> That's the unfortunately truth of modern (secure) applications, each  
> platform has it's own way of doing things. Have you tried Windows 8  
> yet?
>
> Changes like what Brent is proposing is helping to keep Java  
> consistent with the ever evolving app model, which is ultimately a  
> good thing.
>
> -DrD-



More information about the macosx-port-dev mailing list