SSブログ

MailPeeper_Menu.appを嫌々SSL対応しようとする。 [プログラミング]

誰も望んでいないけど、Macのメールチェッカー、MailPeeper_MenuをGmailで使いたいがためにSSL対応してみようと思っています。誰かが書いたライブラリを組み込むだけだから、スキルは全然必要ない、と思われ。つーか、労力だけでしょ、実際必要なのわ。

金払ってるプロバイダメールなのに、未だに暗号化のあの字も無いソネットとかに比べると、技術的には雲泥の差ですな。ま、技術うんぬんの前にサポートが面倒になるだけだから、今運用しているものを動かしたくないんだろうな。分かるけど、どうなのよ、ソレ。今更、平文でパスワードそのまま送るのって気持ち悪い。そういや、ホームページのFTPだってそうだし、今時SFTPクライアントとか無いわけじゃないしねぇ。まぁ盗聴する人もいない事はないだろうし、政府とか第三者機関とか、本気で捉えようとする人間だって皆無なわけじゃないしね。まぁいいけど。

本題。組み込んでみるよ。うぁPOP3が無い。popで検索したときは、スタックかなんかのpopが引っかかっていたらしい。きっちりPOP3で検索しとけば良かった。SMTPでSSLとかはあるみたいだけど、POP3は無いみたいね。元ネタがOpenSSLらしきソースがあって、POP3でもそれを使えるかなぁという感じ。OPSSLSocket.mは少なくともパクれそう。OpenSSL自体はC言語とかだろうけど、あまりにもソースが腐ってるって言うのを見た事があるし、かなり厳しいな。

折角SMTPがあるんだからPOP3もやって欲しい。というか、POP3というプロトコルがどんなものだか全然分かってないしね。OPSSLSocket.mにもTLSってあるけど、それを使えばいいのかな。

EDMailAgent.mとかの、ソケットでつなぐところはSMTPもPOP3サーバも同じだろうから、参考にはできそうだけど、そもそもプロトコルが全く見た事がないので分かんないな。パクって動けばいいや、RFCとか見るの面倒いし。



元々のPOP3を使うところは何やってるんだろう。MailPeeperのソースを見てみる。ただ、ソケットをTLSバージョンでつなげばいい、みたいな状態だったら、あんま面倒くさくなさそうだな。あぁ薬が効いてきてネミいな。うぉXcodeでコンパイルすると、半端なくメモり食うな、やっぱり。メモリ消費量を押さえるために、メモリが必要って、なんと矛盾というか、ドツボというか、とても自分らしい状況だな。MailPeeperのソースが腐ってない事を祈る。

Objective-Cのクラスって忘れたけど、C++みたいに継承して必要なところだけオーバーライドできれば、自分が書くソースも少なくて済むし、バグも既存以外のは出にくくなるんだけど、Obj-Cの基本文法を調べんのめんどくさいな。やってる間に頑張って思い出そう。


SimpleTCPClientってクラスを、SSL対応とかにすればいいのかな? そもそもSSLってどこの階層の実装なのか理解してない。セッション層とトランスポート層の境界、らしいけど、言われてもピンと来ない。HTTPとかの上位プロトコルをSSLでラッパーできる感じなので、良さげな感じ。つなぐ時にSSLなソケットでつなげばいいのかな。というか、SSLがソケットとどう相関があるのかがいまいち断言できない感じ。




エラーになると、動作確認に困る。メールチェックをやめようと思っても、どうにも途中でやめられない。こういう動作は、スレッドで分けてください、お願いだから。エラーのときはタイムアウトになるまで待たなきゃなんないみたい。なんだろ、この焦燥感わ。これも直さないといけないのか? 面倒だよ。泣くよ、俺。そもそもどうなってたんだっけ、Macのスレッドって。UNIX的にはpthread?

WorkerThread.mってあるけど、本当にメールチェックのとこ、別スレッドにしてるのかなぁ。チェック中断できないし、アプリも終わんないんだけどなぁ。何もソースには手を入れなくても、いろいろワーニング出てたので、そのせいかもしれない。元の動作が分かってないので、新しくコンパイルしたために、スレッドを殺すのができてないのかもね。deprecatedって言われてる、この先使えなくなるよ、な関数とかがたくさんあるし。几帳面じゃないけど、ワーニングって出まくってたら無視するんだけど、直せて直せない数だったりすると非常に気になる。



TlsTCPClientってクラスを作ってみる。SimpleTCPClientをパクればいいや。というか、きちんとSSL/TLSのプロトコルを調べておこう。ググればすぐに見つかりそうだし。んーpop3sってのと、GmailのTLSは同じこと?

 http://www.atmarkit.co.jp/fnetwork/rensai/tcp22/03.html

同じと思って実装していきます。を!これがドンピシャ(って古いな、言葉が)みたいです。

 http://x68000.q-e-d.net/~68user/net/ssl-1.html

まんまソースをコピペして使いそう。色々考えるのはもう面倒くさくなった(というか始めからやる気ゼロというか、小数点以下なんですが)。


OpenSSLのライブラリを入れて、

 #include <openssl/crypto.h>
 #include <openssl/ssl.h>
 #include <openssl/err.h>
 #include <openssl/rand.h>

で、それらを取り入れるらしい。Macだとどうすべきか。フレームワークとか自分で作るのかな? .appだけで動くようにするのが妥当だろうな、とは思う。だって、システムにSSLの共有ライブラリとか入れるはちょっと気が引ける。使う時にMacPortsでOpenSSLを入れろとか言うのは言語道断な気がするし。でも/System/Library/OpenSSLなんてフォルダがあるんですけど、それは違うよな。

WindowsのDLLみたいな仕組みが分かっていれば、その使い方は身に付いているけれども、Macって.dylibだったっけ。/opt/local/libなどを見ると、Linuxっぽい.soとか、.aとか、あるけど、UNIX的な使い方はあんまり知らない。全然、作り方とか使い方とか分かっとらん。フレームワークとか作る時にクラスにしなくちゃいけないのなら、手数が多くなるのでやりたくない。なるべくお手軽に使える状況ならなんでもいい。



それで、

 gethostbyname()
 getservbyname()
 socket()
 connect()

っていうところまではSSLじゃなくても一緒かな? これは使い回し決定。
先のページで関数だけ抜いてくると、下記のようになるらしい。


  SSL_load_error_strings();             //エラーメッセージを文字列で
  SSL_library_init();                   //SSL/TLSの初期化
  SSL_CTX_new(TLSv1_client_method());   //プロトコル選択。
  SSL_new();                            //SSL_CTX構造体を生成
  SSL_set_fd();                         //ソケットとSSLの構造体を結びつけ
  
  // PRNG 初期化(なんか乱数生成してるらしいが)最近のOSは要らないとあった。
  RAND_poll();                          //乱数の種生成
  RAND_status()                         //乱数の種の過不足チェック
  RAND_seed();                          //乱数の大きさが小さい場合追加
  
  // SSL で接続
  SSL_connect();                        //サーバとハンドシェイク

 /* リクエスト送信 */
  SSL_write();                          //送る内容は、元ネタであるPOP3と同じでいいはず
  
  // サーバからのレスポンスを受ける
  SSL_read();                           //受けるのも、POP3と一緒。
  
  // 終わり
  SSL_shutdown();                       //TLSのコネクションを切る
  SSL_free();                           //SSL_new()で確保した領域解放
  SSL_CTX_free();                       //SSL_CTX_new()で確保した領域解放
  ERR_free_strings();                   //SSL_load_error_strings()で確保した領域解放



使う関数はこんな感じ。やっぱりこれらの関数をどうするかだよなぁ。Obj-Cのクラスとかの扱いが分からないので、ノーマルのPOP3的な手続きはコピペで済まそうと思う。本当なら、クラスの仕組みでできるだけDRYな方法論でいくべきなんだろうけど、なんかそこまでやろうとすると面倒くさ過ぎる。

タグ:freesoft
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。