plan9portのAcmeエディタを通常のmacOSアプリケーションと同じような感覚で使えるようにするため、起動処理をAppleScriptで実装したappパッケージを使っています(GitHub)。AppleScriptを使っているのは、シェルスクリプトだけではファイルのドロップが実現できなかったという事情があります。
Finderを制御するアクセスを要求しています
いつからだったか忘れましたが、このアプリケーションを実行した際に、突然macOSからアクセス要求ダイアログが表示されるようになりました。
なぜ表示されたのかわからないので、確認してから許可しようと思って「許可しない」を選ぶと、次にアプリケーションを起動してもアクセス要求ダイアログは表示されず、常にFinderにApple Eventsを送信する権限がありませんというエラーが発生するようになってしまいました。
インターネットによると、システム環境設定→セキュリティとプライバシーと進んで、プライバシータブからオートメーションを選択するとアクセスを要求したアプリケーションがリストされていると書かれていましたが、今回遭遇したケースでは何も表示されません。
こうなってしまった場合、tccutil(1)でリセットすると再びダイアログを表示させることができます。
$ tccutil reset AppleEvents
TCC
TCCとはTCC: A Quick Primerによると、Transparency, Consent, and Controlのことで、アプリケーションがユーザデータへ無制限にアクセスさせないための保護機構のようです。また、コマンドのマニュアルにはPrivacy Databaseという名称も見て取れます。今回のエラーはAppleEvents
サービスの設定をリセットしていますが、これ以外にもPhotos
やCamera
などいくつかあります。Helping Your Users Reset TCC Privacy Policy Decisionsにサービスの詳細なリストが掲載されています。
Mojave時点では、残念ながらtccutil(1)はresetサブコマンドしか持っていないので、何を許可しているのかを調べる方法はありません。データベースは~/Library/Application Support/com.apple.TCC/TCC.dbまたは/Library/Application Support/com.apple.TCC/にありますが、SIP(System Integrity Protection)によってrootでさえアクセスを拒否されるので、どうしても読みたければセーフモードで起動させる必要があります。
$ sudo ls /Library/Application\ Support/com.apple.TCC/
Password:
ls: : Operation not permitted
セーフモードでcom.apple.TCCを読むための手順は以下のリンクを参考にしてください。
System Policy
TCCの他にもSystem Policyというシステム保護機構が存在していて、TCCはユーザデータを保護するもので、これは名前の通りシステムを保護するためのものです。例えばシステム環境設定→セキュリティとプライバシーのApp Storeと確認済みの開発元からのアプリケーションなどから許可した開発元などが管理されているようです。System Policyは、spctl(8)コマンドを使うと現在の設定内容を取得できます(--list
オプションはマニュアルに載っていませんが...)。
$ sudo spctl --list 8[Apple System] P20 allow lsopen anchor apple 3[Apple System] P20 allow execute anchor apple 2[Apple Installer] P20 allow install anchor apple generic and certificate 1[subject.CN] = "Apple Software Update Certification Authority" 2711[Mac App Store] P10 allow install anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.10] exists 5[Mac App Store] P10 allow install anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.10] exists ... $ sudo spctl --status assessments enabled
これだけ見ても何も分かりませんね。System Policyをリセットするには、デフォルトデータベースをコピーすればいいです。これはセーフモードでなくても上書きできます。
$ sudo cp /var/db/.SystemPolicy-default /var/db/SystemPolicy
参考
- Fix OS X wrongly reporting an application is corrupted (OSStatus error 99999) - Mac OS X Hints
- How to revoke permission given in System Prefs > Security & Privacy > 'Allow' - Ask Different
- How do I reset all gatekeeper rules? - Ask Different
ACL
ファイルの属性では、伝統的なパーミッションの他にACL(おそらくPOSIX ACL)が使われていて、パーミッションは間違っていないけどファイルの更新ができないといったことが発生します。ACLはls -le
で確認できるので、おかしいなと思ったら眺めてみましょう。