アバター
いもちゃんるーむ
あなたは累計
カウンタ
人目の訪問者です。

YY-BOARD v10.2の設置時の注意事項

本サーバの掲示板はこちらの掲示板を自宅サーバに設置し利用しています。

以前はYY-BOARD v5.32を利用していました。昔のプログラムなので文字コードがシフトJISでした。
しばらくは、自分でUTF-8に変更して使用していたのですが、久しぶりに作者のホームページに行くとかなりバージョンアップされていました。
文字コードがUTF-8ですし、スパム対策で画像認証が可能になっていたので、v10.2に置き換える事にしました。

いくつか注意事項があるので、記述しておきます。
設定ファイルは"init.cgi"になります。
私がはまってしまったのは共通ディレクトリの設定「$cf{cmnurl} =」です。デフォルトでは"./cmn"になっていたのですが、こちらのディレクトリ配下に画像ファイルが存在しています。

我が家のLinuxサーバでは"cgi-bin"配下に画像を置いても表示しない設定になっています。
そのため画像ファイルは全てhtmlファイルを置いてあるディレクトリ配下に"images"ディレクトリを作成しその配下に置くことにしています。
"cmn"ディレクトリを"images"ディレクトリにコピーして、
$cf{cmnurl} = '/images/cmn';
と設定しました。
これで無事画像が表示されるようになりました。

次にレイアウトを少し変更したかったので"bbs.css"を修正したのですが、全く反映されません。
原因に気づくまでに結構時間を要しました。
私が修正していたのは"cgi-bin"配下にある"cmn"ディレクトリの"bbs.css"ファイルでした。
"css"も「$cf{cmnurl}」を参照する作りになっていました。
そこで"/images/cmn"ディレクトリにある"bbs.css"ファイルを修正したら無事反映されました。
ディレクトリをコピーでは無く移動していれば間違える事も無かったのでしょうけど、"css"ファイルと画像ファイルは同じディレクトリの配下には置いて欲しく無かったですね。

他にいくつか不具合を見つけました。
"init.cgi"で管理者用アイコンを使用する設定にした場合「cf{my_icon} = 1;」、管理者用パスワードを入力してもエラーになってしまいます。
v5.32では管理者用パスワードは設定ファイルに記述していたのですが、v10.2では管理者用パスワードの変更が画面から出来るようになっており、パスワードは別ファイルに保存されています。
プログラムを眺めて見たのですが、管理者用アイコンを使用するときのパスワードをパスワードファイルから読み込むロジックが存在していませんでした。
そのためパスワードが正しいか比較する変数が常に空白になっていました。
パスワードファイルから読み込んで変数に値をセットしてやるのが正しい方法だと思うのですが、修正が面倒そうだったので、v5.32と同じように設定ファイルに記載する事にしました。
"init.cgi"に「$cf{password} = 'xxxxxxxx'」と言う項目を追加してやり、管理者のパスワードを記載してやると正常に動くようになります。

次にミニカウンタの設置を画像にした場合の「$cf{counter} = 2;」は上手く動きません。
まず、配布ファイルの中に数字の画像ファイルが含まれていません。
0~9の数字gifファイルを用意する必要があります。
ただし、数字gifファイルを置いたディレクトリ変数が空白になっています。
そのため、数字gifファイルを置いたディレクトリを"init.cgi"に「$cf{gif_path} = 」項目を追加して指定してやる必要があります。

記事 [タイトル] 部の長さと言う項目「$cf{sub_len} =」があるのですが、これは投稿した時にチェックするロジックは存在しているのですが、実は12文字より少ない数字を設定した場合にしか動きません。
何故ならタイトルの入力フォームに「maxlength」が設定してあり、それが「12」になっている為、12文字より長いタイトルを入力する事が不可能だからです。
調べて見るとテンプレートファイル"./tmpl/bbs.html"に「maxlength = "12"」と記述されてました。

テンプレートの数字が変数になるように修正します。
"yybbs.cgi"のコメントが「# 文字置換」になっている場所を検索します。
$tmpl =~ と記載されている最後の行に下記を追加します。何も変更していないれば155行目辺りになります。
$tmpl =~ s/!sub_len!/$cf{sub_len}/g;

テンプレートを見ると、返信時には「Re:」が追加されている場合があるので3文字多く入力出来るのですが、ソースを見ると「Re: 」と4文字増えるので4文字増やしてやります。
最後に入力値のチェック部分を修正します。 "regist.cgi"の380行目辺りに「$tmpl =~」と上記と同じような記述があると思います。次の行に
my $maxlen = $cf{sub_len} + 4;
$tmpl =~ s/!sub_len!/$maxlen/g;
と追加します。

次にテンプレートを修正します。
./tmpl/bbs.html」の47行目辺り
<input type="text" name="sub" class="reg-url" value="!sub!" maxlength="12">
これを
<input type="text" name="sub" class="reg-url" value="!sub!" maxlength="!sub_len!">
と修正します。
./tmpl/edit.html」の43行目辺り
<input type="text" name="sub" class="reg-url" value="!sub!" maxlength="15">
これを
<input type="text" name="sub" class="reg-url" value="!sub!" maxlength="!sub_len!">

"regist.cgi"の465行目付近
if (count_str($in{sub}) > $cf{sub_len}) {
    $err .= "タイトル名は$cf{sub_len}文字以内です<br>";
}
この3行をコメントアウトして修正します。

#  if (count_str($in{sub}) > $cf{sub_len}) {
#      $err .= "タイトル名は$cf{sub_len}文字以内です<br>";
#  }

my $res = @_;
if ($res eq "") {
    if (count_str($in{sub}) > $cf{sub_len}) {
        $err .= "タイトル名は$cf{sub_len}文字以内です<br>";
    }
} else {
    if (count_str($in{sub}) > $cf{sub_len} + 4) {
        $err .= "タイトル名は" . ($cf{sub_len} + 4) . "文字以内です<br>";
    }
}
  
最後に呼び出し元の修正をします。
262行目の
form_check();
これを
form_check('res');
と修正して完了です。 

次に"init.cgi"で「$cf{jp_wd} = 1;」とするとコメントに日本語が含まれていないとエラーになるのですが、日本語が無い投稿でも受け付けられていました。
投稿をよく見ると全角記号が使われていました。
"regist.cgi"の日本語チェックを以下のように修正しました。オリジナルだと580行目なのですが、regist.cgiに手を加えていると行数は変わっていると思います。
「日本語チェック」または「sub jp_wd」で探してみてください。

use Encode;

sub jp_wd {
my $comment  = Encode::decode('UTF-8', $in{comment});

    if ($comment !~ /[\p{Han}\p{Hiragana}\p{Katakana}]/) {
        error("メッセージに日本語が含まれていません");
    }
}

追記
上記、管理者パスワードの設定を"init.cgi"に記述するのでは無く、管理者パスーワードファイルから読み取る方法をKENTさんのサポート掲示板でhirayama様が回答されていたのを見つけたので、こちらにも転記しておきます。

"regist.cgi"を変更していない場合は477行目~479行目まで
          
  if ($in{pwd} ne $cf{password}) {
    $err .= "管理者アイコンは管理者以外は選択できません<br>";
  }
          
こちらを下記の通り変更します。
          
  use lib "./lib";
  use Digest::SHA::PurePerl qw(sha256_base64);
  require 'login.pl';
  open(IN,"$cf{datadir}/pass.dat") or auth_err("open err: pass.dat");
  my $admin_pass;
  
  while() {
      chomp;
      my ($id, $pw) = split(/\t/);
      if (decrypt($pw, $in{pwd})) {
          $admin_pass = 1;
          last;
      }
  }
  close(IN);
  
  if (!$admin_pass) {
      $err .= "管理者アイコンは管理者以外は選択できません<br>";
  }
          
無事に管理画面で設定したパスワードで認証出来るようになりました。