How can I stop my app from setting the “quarantine” bit?

不打扰是莪最后的温柔 提交于 2019-12-23 08:51:38

问题


Ever since OS X 10.7.3, my text editor is setting the "quarantine" bit on any file it touches.

My text editor is designed for working with shell scripts, and if the quarantine bit is set then a shell script cannot be executed from the command line, until you double click it in Finder and go through a "This application was downloaded from the internet" alert (or remove the quarantine bit with xattr).

For example, I just created a "hello world" script in my app, it has been quarantined, and cannot be executed:

$ xattr -l foo
com.apple.quarantine: 0006;4f51dd2f;Dux;
$ chmod +x foo
$ ./foo
-bash: ./foo: Operation not permitted

If I remove the quarantine bit, the script works:

$ xattr -d com.apple.quarantine foo
$ ./foo
hello world


According to some forum posts, TextEdit also sets the quarantine bit on any shell script it creates.

I'm using a simple NSDocument subclass to create the file:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
  return [self.textStorage.string dataUsingEncoding:self.stringEncoding];
}


How can I remove the quarantine bit from files created in my app? Other text editors, such a TextWrangler, do not set the quarantine bit.

UPDATE

A little more info, this only occurs when creating a "script application" file, which is anything from perl scripts to html.

And it only occurs when my app is sandboxed. Disabling sandboxing fixes the problem, but that's not a long term solution.

I've filed a bug with Radar, it looks like there might be nothing to do but wait/hope that avenue gets it fixed.


回答1:


Try ensuring that the LSFileQuarantineEnabled in your Info.plist is set to false (which should be the default). If the attribute is still being set, then I'd suggest filing a bug report and removing it programmatically with removexattr(2)/fremovexattr(2)




回答2:


Nice to know that I'm not the only one with this problem - which has been difficult to track-down information on. I've found this problem occurs with data files saved by my program (these are not scripts, they are just XML data...).

I confirm that LSFileQuarantineEnabled made no difference.

I also tried to remove the attribute after the file was written, using removexattr http://hints.macworld.com/article.php?story=20071029151619619, but this didn't work either - the sandbox prevented the call from working.

By way of background, I also found this discussion of the problem: http://reviews.cnet.com/8301-13727_7-57374676-263/workarounds-for-quarantine-bug-in-os-x-lion/

For the record, I've separately raised a bug with Apple.

EDIT: I have found the source of the problem, and figured-out the work-around.

The problem was that if the file data is plain XML format data, MacOS mistakenly displays the reported message (I think this is because it wrongly assumes that the file is a script). If I change the file format to be an alternative that clearly isn't XML, the warning disappears. The file is still saved with the quarantine bit set, however!

So this is definitely due to an issue in MacOS, but there is a relatively easy work-around - just change your file format!




回答3:


As far as I can tell, this bug has been fixed in OS X 10.8 (Mountain Lion).

Seems like I will have to make 10.8 the minimum OS version for my app. Not really a big deal for me... but hopefully Apple fixes it in a bugfix to 10.7 (the system requirements for 10.8 are quite a bit higher than 10.7, I know people who can't upgrade).



来源:https://stackoverflow.com/questions/9544874/how-can-i-stop-my-app-from-setting-the-quarantine-bit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!