Gmailにつなぐための実証コード - なんとかできた編 [プログラミング]
もうこの件で一週間ほどかかりきりだ。そろそろできるようにならないと面倒だ。今回は実証コードを動くまでいじくり回してたら何となくできた。
二日にわたって、opensslコマンドのソース解析を行っていたのだが、実はそんな事しなくてもできる事がわかった。何が足りないんだろ、と厳選して関数を加えていこうと思っていたのだが、削ったらできる事が判明した。それまで認証関係をずっと調べてきたので、なんじゃろねと安堵と不満が渦巻いた。
証明書とか必要なかった。なくてもアクセスできた。あった方がいいんだろうけど、なくても良かったので、今回のインプリには加えない。めんどいから。
それと他に受信を直した。Gmailから来るメッセージを待っていたら、タイムアウトになっていたらしく、結果的に送信メッセージが拒否られていた。会話型のプロトコルなので、SSL_write()とSSL_read()を交互に入れる処理にしていた。
←「USER ユーザー名\r\n」を送信
→SSL_read()で待ち受け
←「PASS パスワード\r\n」を送信
→SSL_read()で待ち受け
←「LIST\r\n」を送信
→SSL_read()で待ち受け
←「QUIT\r\n」を送信
こんな感じ。
だけどそれが良くなかった。SSL_read()を最後にまとめて一つだけにしてみたら、上手くいってしまった。ただ、いっぺんに送信すると、パケットの遅延があるらしく、ユーザー名の前に、パスワードが先に着いてしまったりして、エラーになったりならなかったり。まことにインターネットらしい通信を見る事ができて笑う。
無理矢理、sleep(1)を送信の度に入れて、とりあえずサーバに届く順番が上手くいくようにした。本当は受信をきっちりして、受け取った後、送信してあげればいいだけなんだけど、それはそのうち。元々のソースがHTTPSで一発受け取ればいい仕組みになっていたから、その後も続くかもしれないプロトコルには適用できなかったみたい。ずっとメッセージ待ち受けで待ってて、受信状態が終わったのは、単なるタイムアウトだったらしい。
「USER ユーザー名\r\n」を送信
sleep(1);
「PASS パスワード\r\n」を送信
sleep(1);
「LIST\r\n」を送信
sleep(1);
「QUIT\r\n」を送信
SSL_read()で待ち受け
用が足せるのはわかったんだけど、同じレスポンスメッセージが二回も、時には三回も出るのは問題です。ここいらは解決した方がいい感じ。なんにしても、ミニマムなコードを得られる事に道筋は付いたので、あとは不具合を少しずつ突き詰めていけばいい。
そもそも正しくてミニマムな設定を求めるのってかなり厳しい。opensslコマンドのソースってかなり混沌としている感じもあるしなぁ。読みやすくないわけじゃないのだけれど、どうにも手続きが多過ぎて、どの関数が何してるんだか、あんまりわかんない。でも、いらん処理とかソースに入れたくないしなぁ。
んで、やっぱり情報は本家からもらった方がいいに決まってる。
http://www.openssl.org/docs/ssl/ssl.html
わかりやすいサンプルコードがあれば良いのだけれど。
BIOってやたらと出てきて、その意味が不明だったけど、I/O abstractionって書いてあった。
http://www.openssl.org/docs/crypto/bio.html
使いやすいように、SSLの基本的なところを隠蔽しているらしいんだけど、シンプルにしようとしてこの手間かよ、って感じ。まぁ意味が分かって使えればどうでもいいッちゃ、どうでもいい。中で相当に面倒くさい事をやってくれているのは、ソースを見なくても想像つくし。
英文そのまんまなんだが、BIOには二種類あるらしい。
ソケットとかファイルを扱う、ソース・シンクBIOっていうやつ、と
データの暗号化とかを扱う、フィルターBIOってヤツ、があるらしい。
そういうのも、わざわざ明文化しないで、中で隠蔽化して欲しいな。細かく制御したいヤツは自分からハックしそうなものだし。
BIO_で始まる関数は使わなくても大丈夫だったりする。でも、受信メッセージが重複するところは、BIO_系の関数を使ってつながないといけない気がしている。
と、思ったら、認証関係はほとんど要らないみたい。やっていてもある関数の中でなんとかしてくれているのだろう。少なくともBIO_*な関数は一つも必要なかったらしい。検証コードを晒すのは、もうちっと後にさせてください。コメントアウトばっかりで、きちゃないので。
二日にわたって、opensslコマンドのソース解析を行っていたのだが、実はそんな事しなくてもできる事がわかった。何が足りないんだろ、と厳選して関数を加えていこうと思っていたのだが、削ったらできる事が判明した。それまで認証関係をずっと調べてきたので、なんじゃろねと安堵と不満が渦巻いた。
証明書とか必要なかった。なくてもアクセスできた。あった方がいいんだろうけど、なくても良かったので、今回のインプリには加えない。めんどいから。
それと他に受信を直した。Gmailから来るメッセージを待っていたら、タイムアウトになっていたらしく、結果的に送信メッセージが拒否られていた。会話型のプロトコルなので、SSL_write()とSSL_read()を交互に入れる処理にしていた。
←「USER ユーザー名\r\n」を送信
→SSL_read()で待ち受け
←「PASS パスワード\r\n」を送信
→SSL_read()で待ち受け
←「LIST\r\n」を送信
→SSL_read()で待ち受け
←「QUIT\r\n」を送信
こんな感じ。
だけどそれが良くなかった。SSL_read()を最後にまとめて一つだけにしてみたら、上手くいってしまった。ただ、いっぺんに送信すると、パケットの遅延があるらしく、ユーザー名の前に、パスワードが先に着いてしまったりして、エラーになったりならなかったり。まことにインターネットらしい通信を見る事ができて笑う。
無理矢理、sleep(1)を送信の度に入れて、とりあえずサーバに届く順番が上手くいくようにした。本当は受信をきっちりして、受け取った後、送信してあげればいいだけなんだけど、それはそのうち。元々のソースがHTTPSで一発受け取ればいい仕組みになっていたから、その後も続くかもしれないプロトコルには適用できなかったみたい。ずっとメッセージ待ち受けで待ってて、受信状態が終わったのは、単なるタイムアウトだったらしい。
「USER ユーザー名\r\n」を送信
sleep(1);
「PASS パスワード\r\n」を送信
sleep(1);
「LIST\r\n」を送信
sleep(1);
「QUIT\r\n」を送信
SSL_read()で待ち受け
用が足せるのはわかったんだけど、同じレスポンスメッセージが二回も、時には三回も出るのは問題です。ここいらは解決した方がいい感じ。なんにしても、ミニマムなコードを得られる事に道筋は付いたので、あとは不具合を少しずつ突き詰めていけばいい。
そもそも正しくてミニマムな設定を求めるのってかなり厳しい。opensslコマンドのソースってかなり混沌としている感じもあるしなぁ。読みやすくないわけじゃないのだけれど、どうにも手続きが多過ぎて、どの関数が何してるんだか、あんまりわかんない。でも、いらん処理とかソースに入れたくないしなぁ。
んで、やっぱり情報は本家からもらった方がいいに決まってる。
http://www.openssl.org/docs/ssl/ssl.html
わかりやすいサンプルコードがあれば良いのだけれど。
BIOってやたらと出てきて、その意味が不明だったけど、I/O abstractionって書いてあった。
http://www.openssl.org/docs/crypto/bio.html
使いやすいように、SSLの基本的なところを隠蔽しているらしいんだけど、シンプルにしようとしてこの手間かよ、って感じ。まぁ意味が分かって使えればどうでもいいッちゃ、どうでもいい。中で相当に面倒くさい事をやってくれているのは、ソースを見なくても想像つくし。
英文そのまんまなんだが、BIOには二種類あるらしい。
ソケットとかファイルを扱う、ソース・シンクBIOっていうやつ、と
データの暗号化とかを扱う、フィルターBIOってヤツ、があるらしい。
そういうのも、わざわざ明文化しないで、中で隠蔽化して欲しいな。細かく制御したいヤツは自分からハックしそうなものだし。
BIO_で始まる関数は使わなくても大丈夫だったりする。でも、受信メッセージが重複するところは、BIO_系の関数を使ってつながないといけない気がしている。
と、思ったら、認証関係はほとんど要らないみたい。やっていてもある関数の中でなんとかしてくれているのだろう。少なくともBIO_*な関数は一つも必要なかったらしい。検証コードを晒すのは、もうちっと後にさせてください。コメントアウトばっかりで、きちゃないので。
コメント 0