sftp:4 解決編その1 SFTP の文字化け問題解決の方針

前章で述べたとおり、Windows から FileZillaWinSCP といった SFTPクライアント を使ってファイルを転送すると、
ファイル名は SJIS で送られてくる。SFTPサーバー はその文字をサーバーで使用している文字コードに変換することなく書き込む。


そのため、基本的な考え方はいたってシンプルである。
SFTPクライアント から書き込まれた SJIS をサーバーの文字コード UTF-8 に変換し、
SFTPクライアントにファイル名を送るときは逆に UTF-8 から SJIS に変換するだけである。


実際、T.Tsujikawa氏はとっくの昔にパッチを作成している。
しかし、サーバーの文字コードEUC の場合のものなので、今回作りたい UTF-8 のものとは異なる。
そこで彼のソースコードをベースにして、glib の文字コード変換ルーチン(g_convert)を用いる。
例えば、SJIS から UTF-8 に変換する場合は下記のようにする。

utf8 = g_convert (string, strlen (string), "UTF-8", "CP932",  NULL, NULL, NULL);


CP932 は MicrosoftSJIS のことだと考えてもらってかまわない。





そして、ついでと言ってはなんだが、チェンジルートの仕組みも作る。
チェンジルートは NADMIN氏が作成したパッチを用いることでも可能である。
このパッチは正規版にも取り込まれており、オプションで有効になるようであるが、openssh-portable の変更を必要とするなどライブラリの影響範囲が大きい。
同じく、外部的にチェンジルートを可能にする chroot jail も SSH そのものを防いでしまう形となり、SFTP のみを防ぐことができない。
この結果、既に SSH をコンソール等で利用している環境では用いることが難しい。


今回は、SFTP のみをいじるだけでチェンジルートするようにし、
運用的な面でも、ソースコードの面でも影響範囲を小さくすることが目的である。


チェンジルートの仕組みも間単である。自分のホームディレクトリより上位のディレクトリの操作を常に失敗すればよい。
もちろん。これは完全なチェンジルートではなく、擬似的なものである。
だが十分に役立つだろう。


次章では、上記二つの機能を持ったソース sftp_iconv.c をつくり、 sftp-server.c から利用することで実装する。