2月 17 2009
McCoy のかわりにコマンドラインで spock を使う
Firefox のアドオン開発の話。 ていうか Cotoe firefox addon ですけど。
Firefox のアドオンの更新を自動通知できるようにする方法にはいくつかあって、例えば Firefox 3ではじめる拡張機能開発 第7回 インストーラの作成 などに詳しい。
ここで、その次の記事 Firefox 3ではじめる拡張機能開発 第8回 電子署名済みアップデートマニフェストを用いた拡張機能の配布 で紹介されているような、McCoy を使って電子署名を行う形式を採用します。(まだしてないけど)
次のエントリも必見。
それはそうとして、この処理は基本的には機械的な処理なんで、できれば自動的にやらせたいところです。んで、そのためにはコマンドライン処理が必要。
というわけで、Mac OS X で McCoy のページに書いてある spock | hyperstruct を試したよ、という話。
前振り長すぎるぜ。
以下 Mac OS X 10.5 での話。ほかの OS の人は適宜読み替えて。 Windows はわからない。 原作者は Debian Linux で確認してるっぽい。
とりあえずtarballダウンロードして試す……が全く動かねえ。 いろいろ試しました。パッチ作りました。結果。
動いたよ。\(^o^)/
なんか絵文字違う気もするけど。
必要なもの
macports から以下のパッケージをインストール。
- libxml2
- libxslt
- ruby
- rb-rubygems
- gmake
- nss
- nspr
さらに rubygems で以下の gem をインストール。
- ruby-xslt
- libxml-ruby
コンパイル
ruby で動くとかいいつつ中で使うアプリのコンパイルが必要。だまされてる。
んでそのままではコンパイルできなかったんで、github で Makefile その他書き換えたのを fork して公開した。
spock 展開したディレクトリで gmake .
[holy@grafeisen spock]$ gmake
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss/secpwd.o nss/secpwd.c
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss/secutil.o nss/secutil.c
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss/secerror.o nss/secerror.c
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss/pppolicy.o nss/pppolicy.c
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss/moreoids.o nss/moreoids.c
cc -c -Inss -I/usr/include/nss/ -I/usr/include/nspr -I/opt/local/include/nss -I/opt/local/include/nspr -o nss_sign_data.o nss_sign_data.c
cc -o nss_sign_data nss/secpwd.o nss/secutil.o nss/secerror.o nss/pppolicy.o nss/moreoids.o nss_sign_data.o -L/opt/local/lib -lnspr4 -lplds4 -lplc4 -lnss3 -lsoftokn3 -lsmime3 -lssl3
nss_sign_data という実行ファイルができてればOK。
使う
まず McCoy で鍵を作っておく必要がある。ここまでは既存の手法と同じ。 spock は鍵に(残念ながら!)パスフレーズを使えないので、空にしておかなければならない。
鍵を使って署名をするところを spock で行う。
$ ruby -rubygems spock update.rdf.unsigned -i urn:mozilla:extension:cotoe@cotoe.net -d ~/Library/Application\ Support/McCoy/Profiles/XXXXXXXX.default/ > update.rdf
だいたいこんな感じ。McCoy の Profile の設定は人によって違うはずなので注意。 -i オプションには自分の拡張の id を渡す。
注意点。update.rdf.unsigned は、名前空間を省略せずすべてフルで書いておく必要がある(ちょっとひどいと思うが直してない)。つまり、RDF:RDF とか、em:updates とか。
あと update.rdf を自動的には作ってくれない。
cotoe ではパッケージングは自動的に現状行うようなスクリプトを書いた(svn export してバージョン書き換えて xpi に固める)ので、その中で sha1sum 取って自動的に update.rdf.unsigned を生成して、spock で update.rdf を更新するように修正する…今のところ予定。
