Jなんとかメールのメッセージ入力欄をテキストエリアにするプロキシを書いた
社内で利用してるJなんとかメールですが、これには「メッセージ入力欄がなぜかテキストフィールドになっていて、複数行コメントが書けない」という致命的仕様バグがあります。解決策としては、「JavaScriptletやGreasemonkeyを使って、メッセージ入力欄をテキストエリアに書き換える」というのが一般的ですが、メッセージ画面を開くたびにJavaScriptletを走らせるのがメンドイ。
ということで、コンテンツ書き換えでテキストエリア化を行うプロキシを書いてみました。
機能
- プロキシとして動作し、J何とかメールからのレスポンスをフック。メッセージ入力欄をテキストエリアに書き換える。
- これにより、ブラウザのプロキシ設定さえ変更しておけば、自動で書き換えが行なわれるようにできる。
- ブラウザの機能に依存しないので、どのブラウザでも複数行メッセージの入力ができる。
- 不特定多数のクライアントにサービスを提供することも可能。(セキュリティ的にはアレだけど)
実装
実装は次の通りです。
#!/usr/bin/ruby require 'webrick' require 'webrick/httpproxy' require 'uri' # J何とかメールのホストを示す正規表現 HOST = /J何とかメールのホスト/ # プロキシを使用しないホストを指定できるようにちょっと改造。 module WEBrick class HTTPProxyServer def proxy_uri(req, res) if @config[:NoPoxy] == nil \ || !(req.request_uri.to_s =~ @config[:NoPoxy]) @config[:ProxyURI] end end end end # プロキシのハンドラ。 # 特定URLのレスポンス中のテキストフィールドをテキストエリアに変換 handler = lambda {|req,res| break if req.request_uri == nil break if res.body == nil break if !(req.request_uri.path =~ /(GetContent|GetInfo|SendMsg)/) break if !(req.host =~ HOST) break if !(res['content-type'] =~ /text\/html/) res.body.gsub!(/<INPUT TYPE="text" NAME="reply" SIZE=48 MAXLENGTH=1999 VALUE="">/m, "<textarea NAME='reply'></textarea>") } # プロキシサーバオブジェクトを作る s = WEBrick::HTTPProxyServer.new( :BindAddress => '127.0.0.1', :Port => 8080, :Logger => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG), :ProxyVia => false, # 移譲先プロキシの設定。なんとかゲートウェイを指定します。> 関係者 :ProxyURI => URI.parse('プロキシのURL 例) http://hogehoge.com:80'), # プロキシを使用しないURIの指定 :NoPoxy=> /プロキシを介さないURIの正規表現/, :ProxyContentHandler => handler ) # 後処理の為に SIGINT を捕捉する。 Signal.trap('INT') do # 捕捉した場合、シャットダウンする。 s.shutdown end # サーバを起動する。 s.start
ほとんど、るびま - WEBrickでプロキシサーバを作って遊ぶのコードと同じだったり。これだけでプロキシができるのがすごい。
使い方
- 1.↑のコードに、プロキシ設定やJ何とかメールのホスト名を設定。
- 2.修正したコードをproxy.rbに保存して実行します。(ちなみに、終了はCtrl+Cです。)
ruby proxy.rb
- 3.ブラウザのプロキシに「localhost/8080」を指定してJ何とかメールにアクセス!
- →メッセージ入力欄がテキストエリアになっているはず。
参考: