Node.js でプライベートファイルエクスプローラ CGI を作ってみた

かつて存在した CGI 配布サイト「すえぽんさいと」で、「Xplorer」「Web Editor」 という2つの CGI が配布されていた。

Xplorer は、サーバ上の指定のディレクトリ配下のファイルツリーを表示し、Web Editor はさらにファイル編集も出来るシロモノだった。

すえぽんさいとの URL http://CGIScriptMarket.com/ はもう死んでいるようで、当該スクリプトも公式での配布は見当たらない。自分がローカルに保存していたモノを勝手に 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ヶ所ほど設定する。

ルートディレクトリは、この CGI を実行するユーザの権限さえあればどこでも良い。つまり、よくある /var/www/html/ 以外の場所を指定することもできるワケだ。

CGI ファイルを編集したら、最後に実行権限を付与して ($ chmod 755 index.js.cgi) 完了。

使い方

ブラウザで CGI の URL にアクセスすると、最初はパスワード入力欄が表示される。const credential で指定したパスワードを入力してログインする。

ログインできると、const rootDirectory で指定したディレクトリ直下のファイルやディレクトリがツリー表示される。ツリーといっても、リンクの箇条書きだが…。

ディレクトリのリンクを押下すれば、ディレクトリを掘り下げていける。子階層からは1階層上に上がれる ../ リンクがある。

ファイルのリンクを押下すると、そのファイルを表示またはダウンロードできる。

この辺は Content-Type ヘッダと Content-Disposition ヘッダを付与して雑に process.stdout.write() しているだけなので、もしかしたら上手く行かないことがあるかも。

Node.js におけるファイル一覧の取得や、CGI でファイルをレスポンスする方法は以下を参考にした。

一応考慮してあること

GET リクエストの場合は常にログインページが表示される。ログイン後の全てのページ遷移は POST で行っていて、ログインページで入力させたパスワードを都度検証している (CGI という古い技術なのに LocalStorage とか組み合わせていてカオス感ある)。

credential の値が平文保存なのはイケてないと思うが、一応はコレを外部に漏らさなければファイルツリーが表示できない作りにしてある。

ディレクトリ移動の際は、rootDirectory で指定したパス配下しか表示させないようにしている。うかつに / まで上れたりしないようにしてはある。

ファイルの編集機能は持たせていない。面倒臭かったのでw.表示だけだからまぁ安心?w

つーワケで以上。