Notes:AppleScript(Studio)でキーチェーンを使う

※ これは Kaku 1.0.2・Kaku 1.1a2 リリース からのスピンオフ記事です。

パスワードなどを扱いたいときに、システム標準の「キーチェーン」にアクセスできると便利です。

AppleScript でそれを行うために、「Keychain Scripting」というスクリプティング機能追加(正確には、その処理を代行してくれるウィンドウのないアプリケーション)が用意されていますが、これが不具合てんこ盛りの代物なのです。

まず、Studio じゃない場合の不具合からいくと、

  • 認証ダイアログで「拒否」すると、Keychain Scripting がハングする。
  • 複数のスクリプトが Keychain Scripting にアクセスすると、不安定になる(これは僕自身では確認していません)。

また、AppleScript Studio から Keychain Scripting を使おうとする人がどれだけいるか分かりませんが、上記に加えて、

  • なぜかフィルタ参照が使えなくなる。それも全部ではなく、項目によって。試してみないと分からない。例えば、 first key of current keychain whose account is "ppm" など。
  • (上の問題と関連していたかもしれませんが)リテラルなら大丈夫なのだが、変数を与えるととたんに動かなくなる。例えば、 first key of current keychain whose account is accountVar などが、ときに動かなくなる。
  • 一度登録したキーの内容を変更できない(普通の AppleScript ならできる)

…と、意味の分からない不具合が多々あるのですが、AppleScript からシームレスに呼び出せるという利便性もあり、以前のバージョンの Kaku では、フィルタ参照で済むはずのところを repeat 文にしたり、内容の変更ができないので 削除 → 新規登録 で対応したりと、なんとか手なずけて使っていたのですが、やはり Hiro さんのところでハングしてしまう、ということで、代替案を探しました。以下では、僕の選択肢に入ったものを紹介しています。キーチェーンを使いたい動機が違えば、選択肢が変わってきますので、全て載せます。

security コマンド

do shell script で使えます。ただし、一度登録したキーの内容の変更・削除ができません。しかし、既存のキーの情報を使えればいいとき、あるいはユーザー自身に「キーチェーンアクセス」アプリケーションでキーを登録してもらうことができるなら、とても有効な手段となります。使い方は、ちゃらんぽらん さんの記事「スクリプト内のパスワード」と アップルのマニュアル をどうぞ。

Usable Keychain Scripting

これ、ご存知ですか…? 言わずと知れた素敵ブログクライアントソフト「 MarsEdit 」の現作者、Daniel Jalkut 氏が開発した、Keychain Scripting の代替アプリケーションです。「これを Kaku に内蔵できたらちょっと面白いな」と思った(笑)のですが、残念ながらこれもまだ、変更・削除に対応していないようです。また、自分のソフトにバンドルするには、ちょっとライセンスが曖昧です(直接 Jalkut 氏に聞いてみる必要がありそうです)。でも、これも security コマンドと同様、既存の情報を使うだけなら、かなり便利そうです。AppleScript から直接使えますし、Keychain Scripting と比べると、スピードもかなり速いようです。AppleScripter の方にもおススメします。ダウンロードは、Jalkut 氏のブログ記事 から。

Keychain.framework

ここからは、AppleScript Studio 限定になります。Objective-C で書かれたフレームワークであれば、call method コマンドで操作することができますが、残念ながら、キーチェーンの扱いに関しては、「Security.framework」と呼ばれる C 言語で書かれた API しかありません。しかしそこはちゃんと、Objective-C ベースでオープンソースの「 Keychain.framework 」というものが公開されていて、これを使う、という手があります。しかし、これはとてもいいのですが、いかんせんフルフィーチャーなので、サイズが大きすぎます。例えば Kaku はだいたい 600KB 前後なのですが、試しに Keychain.framework を入れてビルドすると、2MB 強になってしまいます。「この時代たかが 1.5MB ぐらい…」と思われるかもしれませんが、やっぱりバランスが悪いというか…。Kaku 本体が 3MB ぐらいになったら使うかもしれません(笑)

Security.framework

いわゆる「直」、Kaku で最終的にとった方法です。Objective-C のクラスを作り、その中で Security.framework にアクセスします。AppleScript からは call method です(どこが直)。その際、Adam Gerson 氏のウェブサイト で公開されている「 Simple Keychain Example 」がそのまま使えそうだと思い、(サンプルとしての使い方ではなくなってしまうので、一応)Gerson 氏に連絡し、許可ももらったのですが、実際にやってみると手直ししなければならない部分が多く、最終的には、本当に「参考にした程度」になっています。

AppleScript Studio から Cocoa API を利用する

久々に AppleScript Studio の話題を。先日、applescript-studio ML に、

  • call method コマンドで Cocoa API を呼び出せるのはいいが、膨大な API の中には、AppleScript がネイティブに対応しているものもある。本当に必要な API がどれかを判断するには、どうしたらいいのか

  • また、その必要な API を AppleScript でラップして、AppleScript の知識だけあれば使えるような、ライブラリのようなものを作ったらどうか

という趣旨(たぶん)の 投稿 がありました。

で、僕はそれに返答を試みたのですが、まず英語に関して、読解力は、なんとかキープできていると思いますが、記述力は、もともと無いうえに、さらに悪化、高校レベルの基本的な文法を忘れている気がします。来年の目標が一つ確定(涙) 結局、自分が思ったことを、自分の記述力で漉してみたら、ちょっとしか汁が出なかった(?)という状態だったので、(日本語なら大丈夫かは別として)ここでリベンジしてみようかと。

Continue reading