SSL_get_mode

SSL_get_modeで、現在のSSLモードを取得できる。

/docs/man1.0.2/ssl/SSL_get_mode.html

SSL_get_mode.cで、

SSL_get_modeにsslを渡すと、long型変数ssl_modeにSSLモードの値が返ってくる。

$ vi SSL_get_mode.c 
$ gcc -o SSL_get_mode SSL_get_mode.c -lssl -lcrypto
$ ./SSL_get_mode 
ctx = 00861820
SSL_CTX_load_verify_locations success!
BIO_new_ssl_connect success! bio = 00864090
ssl = 00864150
ssl_mode = 00000000
$

0ということで、まだ何も設定されていないことがわかる。

Sample/openssl/SSL_get_mode/SSL_get_mode/src/SSL_get_mode at master · bg1bgst333/Sample · GitHub

BIO_get_ssl

BIO構造体ポインタのbioから、今度はSSL接続情報を持つSSL構造体ポインタのsslを取得する。
それにはBIO_get_sslを使う。

bio_get_ssl(3): SSL BIO - Linux man page

BIO_get_ssl.cで、

BIO_get_sslの第1引数にbioを渡し、第2引数にsslのアドレスを渡すと、sslにポインタが格納される。
そして、sslを出力。
sslはここでは解放の必要は無く、bioとctxだけ解放。

$ vi BIO_get_ssl.c 
$ gcc -o BIO_get_ssl BIO_get_ssl.c -lssl -lcrypto
$ ./BIO_get_ssl 
ctx = 01d0b820
SSL_CTX_load_verify_locations success!
BIO_new_ssl_connect success! bio = 01d0e090
ssl = 01d0e150
$

こんな感じでsslも取得できた。

Sample/openssl/BIO_get_ssl/BIO_get_ssl/src/BIO_get_ssl at master · bg1bgst333/Sample · GitHub

BIO_new_ssl_connect

SSLの場合は、BIO_new_ssl_connectでコネクション作成をする。

bio_new_ssl_connect(3): SSL BIO - Linux man page

BIO_new_ssl_connect.cで、

BIO_new_ssl_connectにctxを渡してbioを受け取って、bioを出力。
終わったらBIO_free_allで解放。

$ vi BIO_new_ssl_connect.c
$ gcc -o BIO_new_ssl_connect BIO_new_ssl_connect.c -lssl -lcrypto
$ ./BIO_new_ssl_connect
ctx = 00e61820
SSL_CTX_load_verify_locations success!
BIO_new_ssl_connect success! bio = 00e64090
$

bioの取得まではできた。

Sample/openssl/BIO_new_ssl_connect/BIO_new_ssl_connect/src/BIO_new_ssl_connect at master · bg1bgst333/Sample · GitHub

SSL_CTX_load_verify_locations

セキュアな接続をするには、SSL_CTX_load_verify_locationsで、信頼できる証明書ストアをロードする必要がある。

/docs/man1.0.2/ssl/SSL_CTX_load_verify_locations.html

SSL_CTX_load_verify_locations.cで、

SSL_CTX_load_verify_locationsにSSLコンテキストctxと、信頼できる証明書ストアのパスを指定している。

(OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要
ここだと、ソースにTrustStore.pemがあると書いてるが、ソースではなくyumでインストールしているせいか見当たらないので、とりあえず"/etc/pki/tls/cert.pem"にあるpemを使った。)

$ vi SSL_CTX_load_verify_locations.c
$ gcc -o SSL_CTX_load_verify_locations SSL_CTX_load_verify_locations.c -lssl -lcrypto
$ ./SSL_CTX_load_verify_locations
ctx = 00de1820
SSL_CTX_load_verify_locations success!
$

どうも成功した模様。

Sample/openssl/SSL_CTX_load_verify_locations/SSL_CTX_load_verify_locations/src/SSL_CTX_load_verify_locations at master · bg1bgst333/Sample · GitHub

VizCommand #32 listコマンドでパラメータ無しの場合にカレントパスを補完&デフォルトのカレントパスをマイドキュメントに変更

そろそろ、パラメータ無しでlistコマンドを使えるようにしたい。

ConsoleCore.hで、

m_tstrMyDocumentPathとGetMyDocumentPathを追加。

ConsoleCore.cppは、

このようにマイドキュメント(現在のユーザのドキュメント)のパスを取得。

GetMyDocumentPathで取得したm_tstrMyDocumentPathをm_tstrCurrentPathにセットする。

StreamConsole.cppでは、

tstrPathが空だったら、pItem、pConsole、pConsoleCore、と辿っていき、pConsoleCore->m_tstrCurrentPathで現在のパスを取得し、tstrPathに入れる。

f:id:BG1:20170512003058p:plain

絶対パス指定だと、

f:id:BG1:20170512003140p:plain

こうなる。

f:id:BG1:20170512003157p:plain

listコマンドだけで、パラメータ無しで呼ぶと、

f:id:BG1:20170512003221p:plain

マイドキュメント以下を表示する。

・listコマンドでパラメータ無しの場合にカレントパスを補完 · bg1bgst333/VizCommand@ed58ccd · GitHub

VizCommand #31 listコマンドのCCommandクラス対応

コメントアウトしていたlistコマンドもCCommandに対応させる。

Command.hに、

GetParamを追加。
また、tstring&ではなく、通常のtstringに変更。
(GetCommandNameも)

Command.cppで、

GetParamは、m_vectstrCommandTokenの範囲内なら、index番目を返す。
そうでない時は空文字("")。

Console.cppは、

コメント外して、listコマンドにもpCommandを渡すようにする。

StreamConsole.cppは、

wParamをキャストしてpCommandに。
pCommand->GetCommandNameでコマンド名を取得し、判定。
OnListにwParamを渡しているので、そちらでもよろしくやる。

pCommand->GetCommandNameでコマンド名を取得するのに加えて、pCommand->GetParam(1)で1番目のパラメータトークンを取得している。
1番目はパス名なので、tstrPathに入れ、そこから検索パターンtstrPatternを作って、これでファイル検索をする。

f:id:BG1:20170511115954p:plain

CCommandに対応したのでタブで区切ってみる。

f:id:BG1:20170511120149p:plain

これでもちゃんと出る。

・listコマンドのCCommandクラス対応 · bg1bgst333/VizCommand@742e4f7 · GitHub

VizCommand #30 コマンドの定義

コマンド文字列をハンドラにそのまま渡して、各所で(しかも何度も)パースさせるのもちょっと酷い。
そこで、コマンド文字列じゃなく、パース済みのコマンドオブジェクトを渡すようにコマンドクラスを定義する。

Command.hを追加して、

CCommandのメンバ変数はパラメータを含むコマンド文字列m_tstrCommandString、パースしてベクタに格納したトークンm_vectstrCommandToken、コマンド名m_tstrCommandName。
そしてメンバ関数は、コマンド文字列のセットとパースをするSet、メンバ変数をクリアするClear、コマンド名を返すGetCommandName。

Command.cppは、

tstringstream型のtstrsrStreamに"<<"でコマンド文字列を入力。
tstring型のtmpに">>"で出力することで、空白区切りで1つずつトークンを取り出せる。
ただし、最後に空白が入っているとEOFにならないので、tmp.size()が1以上の時にm_vectstrCommandTokenにpush_back()。
0番目をコマンド名としてm_tstrCommandNameに入れる。

ConsoleCore.hに、

CCommandオブジェクトm_ccmdCommandを追加。

ConsoleCore.cppで、

初期化時にコマンドオブジェクトをクリア。

リターンキーを押したら、GetCommandStringの前にも1回クリア。
GetCommandStringの後に取得したコマンド文字列をm_ccmdCommand.Setに渡す。
UM_CONSOLECORECOMMANDのWPARAMにm_ccmdCommandのアドレスを指定する。

レスポンスが終了したら、使ったコマンドオブジェクトをクリアする。

Console.cppで、

OnConsoleCoreCommandで、wParamをキャストして、CCommandオブジェクトポインタpCommandに格納。
これでコマンドと引数のパースは不要になったのでコメント。
pCommand->GetCommandNameでコマンド名を取得して、あとはコマンド"hello"ならOnHelloを呼ぶ。
(今回は"list"は一時的にコメントアウト)

f:id:BG1:20170510155523p:plain

"hello hoge foo bar "という感じでパラメータを付けて、後ろにも空白をたくさん入れる。

f:id:BG1:20170510155618p:plain

これでも、ちゃんと"hello"コマンドが実行される。

f:id:BG1:20170510155745p:plain

パラメータがパースされて、ベクタに入っている。
コマンド名は0番目の"hello"になっている。

・コマンドの定義 · bg1bgst333/VizCommand@52004ed · GitHub