Как я могу остановить свое приложение от установки бита "карантина"? - PullRequest
7 голосов
/ 03 марта 2012

Начиная с OS X 10.7.3, мой текстовый редактор устанавливает бит "карантин" для любого файла, к которому он обращается.

Мой текстовый редактор предназначен для работы со сценариями оболочки, и если установлен бит карантина, сценарий оболочки не может быть выполнен из командной строки, пока вы дважды не щелкнете его в Finder и не пройдете через «Это приложение было загружено из предупреждение "Интернет" (или удалите бит карантина с помощью xattr).

Например, я только что создал скрипт "hello world" в своем приложении, он был помещен на карантин и не может быть выполнен:

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

Если я удаляю бит карантина, скрипт работает:

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


Согласно некоторым сообщениям на форуме, TextEdit также устанавливает бит карантина для любого сценария оболочки, который он создает.

Я использую простой NSDocument подкласс для создания файла:

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


Как я могу удалить бит карантина из файлов, созданных в моем приложении? Другие текстовые редакторы, такие как TextWrangler , не устанавливают бит карантина.

UPDATE

Немного больше информации, это происходит только при создании файла "приложения-скрипта", который представляет собой что угодно, от сценариев Perl до HTML.

И это происходит только тогда, когда мое приложение находится в песочнице. Отключение песочницы решает проблему, но это не является долгосрочным решением.

Я сообщил об ошибке в Radar, похоже, что ничего не поделаешь, кроме как ждать / надеяться, что Avenue исправит это.

Ответы [ 3 ]

1 голос
/ 15 апреля 2012

Приятно осознавать, что я не единственный, кто столкнулся с этой проблемой - о которой трудно было найти информацию. Я обнаружил, что эта проблема возникает с файлами данных, сохраненными моей программой (это не скрипты, а просто данные XML ...).

Я подтверждаю, что LSFileQuarantineEnabled не изменил.

Я также попытался удалить атрибут после записи файла, используя removexattr http://hints.macworld.com/article.php?story=20071029151619619,, но это тоже не сработало - песочница помешала вызову.

В качестве фона я также нашел обсуждение проблемы: http://reviews.cnet.com/8301-13727_7-57374676-263/workarounds-for-quarantine-bug-in-os-x-lion/

Для справки, я отдельно поднял ошибку в Apple.

РЕДАКТИРОВАТЬ: Я нашел источник проблемы, и выяснил обходной путь.

Проблема заключалась в том, что если данные файла представляют собой обычные данные в формате XML, MacOS ошибочно отображает сообщаемое сообщение (я думаю, это потому, что оно ошибочно предполагает, что файл является скриптом). Если я изменю формат файла на альтернативный, который явно не является XML, предупреждение исчезнет. Однако файл сохраняется с установленным битом карантина!

Так что это определенно связано с проблемой в MacOS, но есть относительно легкий обходной путь - просто измените свой формат файла!

1 голос
/ 03 марта 2012

Убедитесь, что для LSFileQuarantineEnabled в вашем Info.plist установлено значение false (которое должно быть по умолчанию). Если атрибут все еще устанавливается, я бы предложил заполнить отчет об ошибке и удалить его программно с помощью removexattr(2) / fremovexattr(2)

0 голосов
/ 16 августа 2012

Насколько я могу судить, эта ошибка была исправлена ​​в OS X 10.8 (Mountain Lion).

Похоже, мне придется сделать 10.8 минимальной версией ОС для моего приложения. Для меня это не имеет большого значения ... но, надеюсь, Apple исправит это в 10.7 (системные требования для 10.8 чуть выше 10.7, я знаю людей, которые не могут обновиться).

...