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じゃなくても一緒かな? これは使い回し決定。
先のページで関数だけ抜いてくると、下記のようになるらしい。
使う関数はこんな感じ。やっぱりこれらの関数をどうするかだよなぁ。Obj-Cのクラスとかの扱いが分からないので、ノーマルのPOP3的な手続きはコピペで済まそうと思う。本当なら、クラスの仕組みでできるだけDRYな方法論でいくべきなんだろうけど、なんかそこまでやろうとすると面倒くさ過ぎる。
金払ってるプロバイダメールなのに、未だに暗号化のあの字も無いソネットとかに比べると、技術的には雲泥の差ですな。ま、技術うんぬんの前にサポートが面倒になるだけだから、今運用しているものを動かしたくないんだろうな。分かるけど、どうなのよ、ソレ。今更、平文でパスワードそのまま送るのって気持ち悪い。そういや、ホームページの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
コメント 0