= 一般ユーザがNFSにアクセスすることは出来ないのか = 管理者権限なしにNFSにアクセスして他のユーザのファイルを読み取ることが出来ないのか以前から疑問があったので実験した。 {{{ $ rpcgen -DWANT_NFS3 /usr/include/rpcsvc/nfs_prot.x }}} {{{#!highlight c #include #include #include #include "nfs_prot.h" #define HOSTNAME "core" #define MOUNTPOINT "/jail/nest/home" int main() { CLIENT *client; LOOKUP3args lookupargs; LOOKUP3res *lookupres; client = clnt_create(HOSTNAME, NFS3_PROGRAM, NFS_V3, "udp"); if (client == NULL) { printf("Error: clnt_create\n"); return 1; } lookupargs.what.dir.data.data_val = strdup(MOUNTPOINT); lookupargs.what.dir.data.data_len = strlen(MOUNTPOINT) + 1; lookupargs.what.name = strdup("."); lookupres = nfsproc3_lookup_3(&lookupargs, client); if (lookupres) printf("OK\n"); else clnt_perror(client, "nfsproc3_lookup_3"); return 0; } }}} {{{ $ gcc -o nfstest nfstest.c nfs_prot_clnt.c nfs_prot_xdr.c }}} 結果 {{{ $ ./nfstest nfsproc3_lookup_3: RPC: Authentication error; why = Client credential too weak }}} エラーメッセージから検索したところによれば、クライアント側がwell-knownポートを開いて通信する必要があるらしい。 これによってクライアントがroot権限を持っていることを確認しているわけだ。 = BBS設計メモ: どこで書き込み処理を行うか = 書き込み処理をどこで行うべきか。プレビュー画面が必要である。失敗したときはフォームにテキストが残っているべきである。書き込みに成功したときにはメッセージと共に書き込み後の掲示板が表示されるべきである。書き込み後にリロードしても安全であるとなお良い。これらの要件を満たす実装方法はなんだろうか。 Parserの中で書き込み処理を行うのは本質的にNGであろう。表示するための処理を期待されている部分で書き換え操作を行うのはトラブルの元であると考えられる。一度のリクエストで複数回呼び出されても文句は言えないのではないだろうか。実際、現在の掲示板では書き込みの履歴の直後にその書き込みの時刻を1秒遅くするような変更が行われていることがしばしばある。これは同一のリクエストの処理の中で秒をまたいで二回更新が行われていると考えるのが妥当である。(二重送信でレースコンディションを起こしている可能性もないわけではないが頻繁に発生しているところを見ると二回呼ばれていると考える方が説得力があろう) となれば書き込み処理はactionで行うべきであると言うことになる。ところがactionで処理を行った場合にはどのようにしてプレビュー/投稿後のスレッドを表示するかが問題になる。普通に`request.page.send_page()`したのでは少なくともプレビューできない。actionでもスレッドの出力を出来るようにするとなるとその部分のコードを切り出すことになるか。actionで書き換えを行った後に`request.page.send_page()`すると出力はどっちになるんだろう。あるいは`page`オブジェクトを作り直せばOK?要検証。 あるいはParser側に手を入れて、actionと協調動作するようにしてしまうと言う手もあるが、あまり綺麗じゃないなぁ。どうしよう。 そもそもプレビューページはスレッド全体を表示できる必要性がない。となればプレビュー部分はactionの中で実装してしまうのはありだろうか。しかし、プレビューしながら編集するという使い方が出来ると便利なのでフォーム回りのコードをやはり共有する必要がありそう。 やはり、出力回りのコードを切り出した方が幸せになれるか。