Node.js でプライベートファイルエクスプローラ CGI を作ってみた
かつて存在した CGI 配布サイト「すえぽんさいと」で、「Xplorer」「Web Editor」 という2つの CGI が配布されていた。
Xplorer は、サーバ上の指定のディレクトリ配下のファイルツリーを表示し、Web Editor はさらにファイル編集も出来るシロモノだった。
すえぽんさいとの URL http://CGIScriptMarket.com/
はもう死んでいるようで、当該スクリプトも公式での配布は見当たらない。自分がローカルに保存していたモノを勝手に GitHub にアップしているので、どんなコードだったかは確認していただける。
- favourite-cgi/Xplorer.cgi at master · Neos21/favourite-cgi · GitHub
- favourite-cgi/web_editor.cgi at master · Neos21/favourite-cgi · GitHub
元々は Perl 製で、実装はまともに読んでいないのだが、今回このスクリプトのアイデアを元に Node.js 製の CGI スクリプトを作ってみた。それが Node.js CGI Explorer。
目次
インストール方法
簡単にインストール方法を紹介する。
まず、対象のサーバの Apache や nginx で CGI が扱えるようにしておき、さらにそのサーバに Node.js をインストールしておく (async
を使っているので v12 以降)。
Node.js をインストールしたら $ type node
とかで Node.js のフルパスを確認しておく。/usr/bin/node
などと分かるはず。
そしたら本スクリプト index.js.cgi
をサーバに配置する。ファイル名や拡張子は自由に変更して問題ない。
1行目の Shebang を、先程確認した Node.js のフルパスに書き換える。大抵は #!/usr/bin/node
とかになるかな。
また、ファイル中に定数を2ヶ所ほど設定する。
- アクセスパスワードとなる
const credential
- ファイルツリーを表示したいルートディレクトリを
const rootDirectory
ルートディレクトリは、この CGI を実行するユーザの権限さえあればどこでも良い。つまり、よくある /var/www/html/
以外の場所を指定することもできるワケだ。
CGI ファイルを編集したら、最後に実行権限を付与して ($ chmod 755 index.js.cgi
) 完了。
使い方
ブラウザで CGI の URL にアクセスすると、最初はパスワード入力欄が表示される。const credential
で指定したパスワードを入力してログインする。
ログインできると、const rootDirectory
で指定したディレクトリ直下のファイルやディレクトリがツリー表示される。ツリーといっても、リンクの箇条書きだが…。
ディレクトリのリンクを押下すれば、ディレクトリを掘り下げていける。子階層からは1階層上に上がれる ../
リンクがある。
ファイルのリンクを押下すると、そのファイルを表示またはダウンロードできる。
- テキストファイル系は
text/plain
扱いでそのまま表示 - ブラウザで表示できる画像ファイル系はそのまま表示
- それ以外はブラウザ上で表示するのがキツそうなので
application/octet-stream
でダウンロードさせる
この辺は Content-Type
ヘッダと Content-Disposition
ヘッダを付与して雑に process.stdout.write()
しているだけなので、もしかしたら上手く行かないことがあるかも。
Node.js におけるファイル一覧の取得や、CGI でファイルをレスポンスする方法は以下を参考にした。
- 参考 : Node.jsで高速にファイル一覧を取得するfs.readdirのwithFileTypesオプション - Qiita
- 参考 : perl:cgi_filedownload とあるエンジニアの闇歴史帳
- 参考 : Download many kinds of files from CGI
一応考慮してあること
GET リクエストの場合は常にログインページが表示される。ログイン後の全てのページ遷移は POST で行っていて、ログインページで入力させたパスワードを都度検証している (CGI という古い技術なのに LocalStorage とか組み合わせていてカオス感ある)。
credential
の値が平文保存なのはイケてないと思うが、一応はコレを外部に漏らさなければファイルツリーが表示できない作りにしてある。
ディレクトリ移動の際は、rootDirectory
で指定したパス配下しか表示させないようにしている。うかつに /
まで上れたりしないようにしてはある。
ファイルの編集機能は持たせていない。面倒臭かったのでw.表示だけだからまぁ安心?w
つーワケで以上。