DoormanがEclipse Marketplaceからインストール可能に


0x00. Eclipse Marketplaceとは


Eclipse Market Placeとは、Eclipseプラットフォーム上で動作するプラグインや製品などを検索したりダウンロードしたりすることができる仕組みである。ウェブサイトとしてはhttp://marketplace.eclipse.org/となっており、ブラウザからも使用できるほか、Eclipseの3.7以降からは直接メニュー(Help->Eclipse Marketplace)からアクセスできるようになっている。特にEclipseから直接使う場合、ソフトウェアのダウンロードからインストールまでできて便利な仕組みになっている。開発者は自分の開発したソフトウェアを登録することで、より多くのユーザにアピールすることができるようになる。いわばEclipse版AppStoreである。

0x01. 登録は簡単


以前のエントリにまとめたように、以前はスタンドアローンのアプリケーションであったDoorman@JUMPERZ.NETを「Doorman Eclipse Plugin」という名前のEclipseプラグインに移植した(というか、プラットフォームをEclipseに変更した)。そこで、せっかくAppStore的な場所があるのならば使ってみようと思い、手続きを行ってみた。自作アプリケーションを公開する場合、今どきの開発者ならばAppleのAppStoreかGoogleのAndroidマーケットあたりが普通だと思うが、筆者は斜め上のEclipse Marketplaceである。

Doormanのようなオープンソースのプラグインの場合、Eclipse Marketplaceへの登録にはお金は必要ない(商用のものがどうなのかは要調査)。お金どころか特に身分証明も必要ない。ガイダンスにしたがってアカウントを作成し、ソフトウェアの情報を記入すると、数日の審査期間を経て登録が済んだ。現在無事にこちらで公開されている。分類も、自分が選んだとおりに「Tools」「Network」となっている。

0x02. アップデートサイトも用意した


以前のエントリに書いたようにDoormanのアップデートサイトは用意しないつもりだったのだが、Eclipse Marketplaceを眺めていて考えが変わった。意外と多くのソフトウェアがきちんとアップデートサイトを用意しているのだ。もしかしたら今どきのEclipseユーザはjarファイルを直接pluginsフォルダに突っ込むなどということはしなくなっているのかもしれない。Eclipseからのアップデートサイトの使い方も、なれてしまえばURLひとつで行けるため楽な気もする。ということでjumperz.net上に/update/というパスを用意し、そちらでEclipseからのリクエストを受け付けるようにした。現在Doormanだけでなく、ExEditもインストールできるようになっている。

アップデートサイトURL: http://www.jumperz.net/update/

Marketplaceに登録されたため、Eclipseのメニューから直接Marketplaceを開き、「Doorman」で検索すればインストールができるようになっている。

これは案外素晴らしいかもしれない。

0x03. 新機能JSフック

今回の登録と時を同じくして、DoormanJSHookという新プラグインを追加した。Doorman上でリクエストやレスポンスをフックし、その際JavaScriptで処理を書けるようにするものである。以前からClojureで処理を書くことができるDoormanHookは存在していたが、さすがにClojureで書くやつはあまりいなさそうなので、Java上でデフォルトで使えるRhinoを使うものを作成した。User-Agentの書き換えを行いたい場合などやCookieのコントロールを行いたい場合などに、if文で条件を付けることが簡単にできるので便利である。

例えば「Googleにアクセスする際にはCookieを削除し、User-AgentはAnonymousという文字列にする」という場合は以下のように書けばよい。

var host = request.getHeaderValue( 'Host' )
if( host.indexOf( 'google' ) > -1 )
{
request.removeHeaderValue( 'Cookie' )
request.setHeaderValue( 'User-Agent', 'Anonymous' )
}

書き換えを行う場合にはnet.jumperz.net.MHttpRequestクラスなどのメソッドを呼び出すことになる(上記ソースコードにおけるrequestはこのクラスのインスタンスである)。このあたりのAPIなどはドキュメントすら存在していない(なぜなら仕様がコロコロ変わる可能性を秘めているから)ので、詳しくはソースコードを参照いただければと思う。あるいはtwitter上で@kinyukaで質問していただければお答えできる。まぁ、とにかくマニア向けのソフトウェアということである。

0x04. SSL証明書の表示機能

また、順番としてはDoormanJSHookよりも前になるのだが、SSL通信時にどのような証明書チェーンが利用されているのかを簡単に確認できるような機能を追加してある。これは筆者が自分で欲しかったので作った機能だ。

ウェブサーバの管理者ならばご存じかと思うが、SSL証明書を自分でインストールする場合、中間CA証明書というよくわからないものをインストールしたりすることがある。この際やっかいなのが、「IEではエラーにならないのに、Firefoxではエラーになる」のような場合だ。中間CA証明書がIEにはもともと入っているのに、Firefoxには入っていないような場合で、かつサーバ上にインストールし忘れているような場合にこれが起こる。

SSLを使用しているウェブサイトを訪問中、現在どのような証明書が使われているのかをウェブブラウザから確認する場合、手順が少し面倒くさい。まず証明書のダイアログを開くまでの手間がけっこうかかる場合がある。そしてさらに、証明書のチェーンを表示するダイアログにおいて、中間CA証明書が果たしてサーバ側にあるものなのか、あるいはローカルにインストールされているものなのかが確認できないことが多い。

Doormanではこの部分の不満を改善するため、以下のようにCertificate ListとCertificate Detailという2つのViewを用意した(クリックで拡大)。

Certificate Listの一番左のカラムは証明書がサーバ側なのかローカルなのかを示しており、ここでは2つの証明書(ウェブサイトの証明書とそれに対応する中間CA証明書)がサーバ側にインストールされていることがわかる。また、Expカラムでは期限切れまでの日数を表示している。

ちなみに証明書の正当性について「Validation: OK」という表示をしているが、これはDoormanの独自基準(証明書のチェーンだけ見る。ウェブサイトのFQDNと証明書のコモンネームは見ない。実行中のJREに含まれるルート証明書でチェック)での判定なので、あまり当てにしない方がよい。基本的にはウェブブラウザで直接アクセスして確認するのがベストだ。ブラウザには入っているのにJREには入っていない証明書などもあるため、DoormanでNGとなってもブラウザでは問題ないケースがある。

この機能を作ったことで、筆者の業務でのSSL関連の運用作業はずいぶん楽になった。

0x05. 登録してみての感想

Eclipseプラグインの開発自体がかなりマニアックな存在となっていることもあり、Eclipse MarketplaceもAppStoreやAndroidマーケットと比べると3桁か4桁くらい登録されているソフトウェアが少ない(反面、ソフトウェアの平均的な質は高い)。Doormanを登録した先のジャンルである「Network」にわずか16個しかソフトウェアが存在しないことからも、Marketplaceの寂れっぷりが孤高の存在であることが伝わってくる。

ぶっちゃけ登録しても全然ダウンロードされないだろうと思っていたのだが、アクセスログを確認してみたところ意外とそうでもなかった。オランダ・ブラジル・中国など世界各国からそこそこダウンロードされているようだ。(ところで、Eclipseが直接ダウンロードしにくるわけだが、その際のUser-AgentがJakarta Commonsになっていた。Eclipseにしておけばいいのに…)

ぼちぼちでも利用者が増えてくれるとうれしいので、登録して正解だったと考えている。

0x06. 孤高のプログラマを目指せ

ということでClojureやEclipseプラグインの開発などを行っているのだが、国内では書店に行ってもどちらも関連書籍が1冊ずつしかないような有様でかなり孤高な感じである(英語書籍ならそこそこ出版されているのだが…)。Clojureは国内でもじわりとユーザを増やしているような気がするので、Eclipseプラグインの方にも頑張ってもらいたいと考えている日々である。

0x07. 追記

JSHookとHookはどちらもBreakさせるために使うことも可能となっている。Hookのコードが戻り値として”break”を返す場合にはBreakを設定したのと同じようにリクエストやレスポンスの編集が行えるようになる。

例えば「リクエストがPOSTで、かつレスポンスにSet-Cookieヘッダが存在する場合にはBreakする」という場合には以下のようなJSHook(TypeとしてResponseを選ぶことに注意)を記述する。

if( request.getMethod() == 'POST' && response.headerExists( 'Set-Cookie' ) )
{
'break'
}

このように、複雑な条件でのみBreakさせたいという(あるのかどうか極めて微妙な)ニーズに対応した。

Advertisements


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s