apache2 のモジュールである mod_uploader を導入した。その時のメモ。
- http://sourceforge.jp/projects/mod-uploader/releases/ から tgz ファイルをダウンロード
- 解凍
- cd mod_uploader-3.1.1
- ./configure を実行
- make apache-module を実行
- sudo su
- cp src/.lib/mode_uploader.so /usr/lib/apache2/modules/
- cp debian/conf/uploader.load /etc/apache2/mods-available/
- a2enmod uploader
- /etc/apache2/site-enabled/ 以下の VirtualHost エグゼティブを編集
- ディレクトリ css, data, file, img, js, temp, thumb, tmpl を編集結果で指定した位置にコピー
- chown www-data:www-data data
- chown www-data:www-data file
- chown www-data:www-data temp
- chown www-data:www-data thumb
- /etc/init.d/apache2 restart
設定したパスワードの末尾に任意の文字を加えたパスでもダウンロード出来てしまう。
- 仕様なのか、どうかは知らないが、
- 例えば DL pass を "hoge" と設定しても、hoge.* にマッチするパス(例:hogehoge)で DL が可能。
- src/uploader_handler.cpp の次の部分を
if (!is_admin_mode) {
if ((strlen(uitem->get_download_pass()) != 0) &&
(strncmp(uitem->get_download_pass(), download_pass,
strlen(uitem->get_download_pass())) != 0)) {
if (strlen(download_pass) != 0) {
THROW(MESSAGE_DOWNLOAD_PASS_MISMATCH);
}
if (!is_view_mode &&
(strlen(get_word(r->pool, &arg, ARG_SEPARATE_STR[0])) == 0)) {
return download_prep<Response>(r, config, uitem);
} else {
return input_pass<Response>(r, config, uitem);
}
}
}
- 以下のように修正して、再コンパイルすれば、設定したパス以外では DL 出来ないようになる。
if (!is_admin_mode) {
if ((strlen(uitem->get_download_pass()) != 0)) {
if(strlen(download_pass) == 0) {
if(!is_view_mode &&
(strlen(get_word(r->pool, &arg, ARG_SEPARATE_STR[0])) == 0)) {
return download_prep<Response>(r, config, uitem);
} else {
return input_pass<Response>(r, config, uitem);
}
} else if(strlen(uitem->get_download_pass()) != strlen(download_pass) ||
strncmp(uitem->get_download_pass(), download_pass,
strlen(uitem->get_download_pass())) != 0) {
THROW(MESSAGE_DOWNLOAD_PASS_MISMATCH);
}
}
}
- make apache-module を実行
- sudo su
- cp src/.lib/mode_uploader.so /usr/lib/apache2/modules/
- /etc/init.d/apache2 restart
- 削除パスについても同様のことが言える。
- これを修正するには、同名のファイルの
if (!is_admin_mode) {
if (
#ifndef EMPTY_PASSWORD
(strlen(uitem->get_remove_pass()) == 0) ||
#endif
(strncmp(remove_pass, uitem->get_remove_pass(),
strlen(uitem->get_remove_pass())) != 0)) {
THROW(MESSAGE_REMOVE_PASS_MISMATCH);
}
}
if (!is_admin_mode) {
if (
#ifndef EMPTY_PASSWORD
(strlen(uitem->get_remove_pass()) == 0) ||
#endif
strlen(uitem->get_remove_pass()) != strlen(remove_pass) ||
(strncmp(remove_pass, uitem->get_remove_pass(),
strlen(uitem->get_remove_pass())) != 0)) {
THROW(MESSAGE_REMOVE_PASS_MISMATCH);
}
}