mod_uploader の導入(debian squeeze + apache2)

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 の次の部分を
        // DL pass のチェック
        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 出来ないようになる。
        // DL pass のチェック
        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);
            }
        }
  • のように書き換える。