あじのたたき板 Evo.(仮名) ver.0.32 修正メモ

この記事は2005年頃に執筆した文書がもとになっている。

本稿は、あじのひらきで配布されている掲示板スクリプト、あじのたたき板 Evo.(仮名)の機能及び修正すべき点について記した日記の再録である。
執筆時現在、同スクリプトの更新は止まっている。現在のバージョンにはいくつか既知のバグが確認されている為、使用する場合は自分で修正しておくと良いだろう。全て自己責任で行う事。

なお、使用したバージョンは0.32。同梱されている kako.dat は不要。修正対象となるファイルは全てbbs.cgiである。

記事削除

readme を見ると、複数記事削除するのに、「1,2,3」あるいは、「4-8」などのように指定できるとされているが、正常に機能しない。
まず、「1,2,3」のようにカンマで区切る場合、1086-1088行目で(dele関数内)、

$in{'target'} =~ s/,/,/g;
if(!$in{'target'}) { &error("削除対象記事番号が入力されていません"); }
if($in{'target'} =~ /[^0-9\,\-]+/) { &error("削除対象記事番号に使用不能文字が含まれています。"); }

とフォームデータデコード時に置き換えられたカンマを、データチェック用に再び復元しているが、その後1107-1111行目で

if($in{'target'} =~ s/&#44/,/g){
  @tgt = split(/,/,$in{'target'});
}else{
  $tgt[0] = $in{'target'};
}

となっているので、これを以下のように修正する。

if($in{'target'} =~ /,/){  # ←変更
  @tgt = split(/,/,$in{'target'});
}else{
  $tgt[0] = $in{'target'};
}

4-8」のようにハイフンで区切ってやる場合、readme には、– で繋ぐ数字は1ページに表示する記事の件数以内であることとあるが、1ページに表示する記事の件数以上になってしまっているので、1118行目、

if($f - $e > $how) { for($e..$f) { push(@array,$_); } }

if($f - $e < $how) { for($e..$f) { push(@array,$_); } }
&#91;/perl&#93;

<p>としてやれば、仕様通りの動作になるだろう。</p>

<h2>スレッドストップ</h2>
<p>管理者が、本文の最後に「<kbd>STOP</kbd>」と書いて投稿すると、スレッドがストップされる。ストップされたスレッドへの投稿は記事記録ファイルへ出力されなくなるが、記事番号記録ファイルへは書き込まれる(ただし、通常は投稿フォーム自体表示されない)。</p>

<h2>賞味期限切れのファイル削除</h2>
<p><code>delfile</code> 関数では、仮保存された記事とアップロードされたファイルが指定された時間以上経過していると削除する。<br />
<code>delfile</code> は <code>page</code> 関数で(344行目)、</p>


if($updir && $dellim) { &delfile; }

と呼び出されるので、アップローダー機能を使用していないと、仮保存された記事が投稿されなかった場合(なお、本投稿時に当該の仮保存された記事は削除されるが、他のファイルの賞味期限チェックは行われない)、仮保存ファイルが増えていってしまう。
上の行を単に、

&delfile;

とし、delfile 関数で(655-671行目)、

($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime(time - 60*60*24*$dellim);
$year = $year + 1900;
$delnum = sprintf("$year%02d%02d%02d%02d%02d", $mon + 1, $mday, $hour, $min, $sec);

opendir(DIR, "$updir");
@array =readdir(DIR);
closedir(DIR);
@old = ();
foreach $d (@array) {
  if($d =~ /([0-9]+)/) {
    $e = $1;
    @kari = grep(/$e/, @new);
    if($e < $delnum || $kari&#91;0&#93;) { push(@old,"$updir$d"); }
  }
}
unlink @old;
@old = ();
&#91;/perl&#93;

<p>を</p>


if($updir && $dellim) {  # ←変更
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime(time - 60*60*24*$dellim);
  $year = $year + 1900;
  $delnum = sprintf("$year%02d%02d%02d%02d%02d", $mon + 1, $mday, $hour, $min, $sec);

opendir(DIR, "$updir");
@array =readdir(DIR);
closedir(DIR);
@old = ();
foreach $d (@array) {
  if($d =~ /([0-9]+)/) {
    $e = $1;
    @kari = grep(/$e/, @new);
    if($e < $delnum || $kari&#91;0&#93;) { push(@old,"$updir$d"); }
  }
}
  unlink @old;
  @old = ();
}  # ←変更
&#91;/perl&#93;

<p>とでもしてやれば良いだろう。</p>

<h2>過去ログになったスレッド</h2>
<p>「<samp>bbs.cgi?mode=read&amp;tgtn=20040423045533</samp>」のように指定するとそのスレッドを表示する。<br />
既に過去ログに入っているスレッドを指定した場合、過去ログを提示する事になっているが、正常に動作しない。これは <code>read</code> 関数内において(498行目)、</p>


if($line eq ""){
  $f = $kakodir . $in{'tgtn'} . ".html";
  if(-f $file){

if($line eq ""){
  $f = $kakodir . $in{'tgtn'} . ".html";
  if(-f $f){  # ←変更

と変数名を修正してやるだけで良い。

記事番号記録ファイルの記録数

記事番号記録ファイルの記録数は、デフォルトでアクセスログの記録数と同じになっている。もしもアクセスログの記録数よりも記事記録数の方が大きいと、現行ログでも古い記事は削除できなくなる可能性もある。
現行ログの容量にあわせたい場合は、regist2 関数で(879行目)、

$d = $max_log;

if($how*$how2*$page > $max_log){
  $d = $how*$how2*$page;
}
else{$d = $max_log;}

などとする。
ただし、非推奨。

削除時の管理者認証

削除時の管理者認証で、$ad_host 即ち、管理者ホスト/IP チェックを指定していないと認証されない事がある。指定していない場合はチェックしないという仕様のはずなので、そのように修正する。
以下は1094-1105行目。

if($pwd && ($addr =~ /$ad_host/ || $host =~ /$ad_host/)) {
  if($pwd =~ /^\$1\$/) { $salt = 3; }
  else { $salt = 0; }
  if(crypt($in{'pass'},substr($pwd,;$salt,2)) eq $pwd) {
    $admin = 1;
    if($reg_limit > 0) {
      open(CN,">$count")|| &error("記事数カウントファイルが開けません");
      print CN "0";
      close(CN);
    }
  }
}

最初の条件を修正すればOK。

if($pwd && ($addr =~ /$ad_host/ || $host =~ /$ad_host/ || $ad_host eq "")) {  # ←変更
  if($pwd =~ /^\$1\$/) { $salt = 3; }
  else { $salt = 0; }
  if(crypt($in{'pass'},substr($pwd,$salt,2)) eq $pwd) {
    $admin = 1;
    if($reg_limit > 0) {
      open(CN,">$count")|| &error("記事数カウントファイルが開けません");
      print CN "0";
      close(CN);
    }
  }
}
Pocket

コメントを残す

メールアドレスが公開されることはありません。