#!/usr/local/bin/perl
## SPHINX BOARD v2.42 (2000/12/29)
## Copyright(C) Kent Web 1997-2000
## webmaster@kent-web.com
## http://www.kent-web.com/
$ver = 'SPHINX v2.42';
#--- [注意事項] ------------------------------------------------#
# 1. このスクリプトはフリーソフトです。このスクリプトを使用した #
# いかなる損害に対して作者は一切の責任を負いません。 #
# 2. 設置に関する質問はサポート掲示板にお願いいたします。 #
# 直接メールによる質問は一切お受けいたしておりません。 #
#---------------------------------------------------------------#
#============#
# 設定項目 #
#============#
# jcode.plが同一ディレクトリにある場合
require './jcode.pl';
# タイトル名
$title = "Townmag Partner's掲示板";
# タイトル文字の色
$t_color = "#008080";
# タイトル文字の大きさ
$t_size = 6;
# bodyタグ
$body = '
';
# 戻り先のURL (index.htmlなど)
$homepage = '../talkboard/index.html';
# 最大記事数
$max = 100;
# 管理者用マスタパスワード(英数字)
$pass = '11t3m214';
# 上下のID/PASS配列はコンマで区切っていくつでも指定可。(必ずペアで指定)
@userid = ('town200102'); # ユーザID
@userpwd = ('w46uc3r'); # ユーザPASSWORD
# タグの許可 (0=no 1=yes)
$tagkey = 0;
# スクリプトファイル名
$script = "./sphinx.cgi";
# ログファイル名
$logfile = "./townmag1.log";
# methodの形式 (POST or GET)
$method = 'POST';
# 1ページ当たりの記事表示数
$pagelog = 10;
# ロック形式 (0=no 1=symlink 2=open)
$lockkey = 2;
# ロックファイル名
$lockfile = "./townmag1.lock";
# 投稿があるとメール通知する (0=no 1=yes) : sendmail必須
$mailing = 1;
# メールアドレス (メール通知する時)
$mailto = 'editor@townmag.com';
# sendmailパス(メール通知する時)
$sendmail = '/usr/lib/sendmail';
# コメント部 [題名] の色
$sub_color = "#008040";
# コメント部 [名前] の色
$name_color = "#0000EC";
# ホスト名取得モード
# --> 0 : $ENV{'REMOTE_HOST'} で取得できる場合
# --> 1 : gethostbyaddr で取得できる場合
$get_remotehost = 0;
#============#
# 設定完了 #
#============#
$agent = $ENV{'HTTP_USER_AGENT'}; # ブラウザ情報を取得
## --- メイン処理
&form_deco;
if ($buffer eq "") { ✓ }
&pass_chk;
if ($mode eq "howto") { &howto; }
if ($mode eq "find") { &find; }
if ($mode eq "usr_del") { &usr_del; }
if ($mode eq "msg") { ®ist; }
&html_log;
## --- パスワード画面
sub check {
&get_cookie('IN');
print "Content-type: text/html\n\n";
print <<"HTML";
$title
HTML
exit;
}
## --- パスワードエラー処理
sub pass_error {
print "Content-type: text/html\n\n";
print <<"HTML";
401 Authorization Required
Authorization Required
This server could not verify that you
are authorized to access the document you
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.
HTML
exit;
}
## --- ID/PASSチェック処理
sub pass_chk {
# ID/PASSをチェックする
$flag = 0;
foreach (0 .. $#userid) {
if ($usrid eq "$userid[$_]" && $inpwd eq "$userpwd[$_]") {
$flag = 1;
next;
}
}
# 該当なしの場合はエラー処理
if ($flag == 0) { &pass_error; }
# ID/PASS情報をクッキー格納
if ($in{'chk'} eq 'on') { &set_cookie('IN'); }
}
## --- HTMLのヘッダー
sub header {
print "Content-type: text/html\n\n";
print "\n
\n";
print "\n";
print "$title\n";
print "$body\n";
}
## --- 記事表示部
sub html_log {
&get_cookie;
&get_agent;
open(IN,"$logfile") || &error("Can't open $logfile");
@DATA = ;
close(IN);
# 返信の場合
if ($mode eq "res") {
foreach (@DATA) {
($no,$date,$name,$email,$rsub,$rcom,$url,$host,$pw)
= split(/<>/, $_);
if ($no eq "$in{'resno'}") { last; }
}
$rcom =~ s/
/\r> /ig;
$rcom = "> $rcom";
if (!$rsub) { $rsub = '無題'; }
$rsub =~ s/^Re//g;
$rsub = "Re[$no]: $rsub";
}
&header;
print <<"EOM";
$title
[トップにもどる]
[掲示板の使い方]
[ワード検索]
EOM
if ($in{'page'} eq '') { $page = 0; }
else { $page = $in{'page'}; }
# 記事数を取得
$end_data = @DATA - 1;
$page_end = $page + ($pagelog - 1);
if ($page_end >= $end_data) { $page_end = $end_data; }
foreach ($page .. $page_end) {
($no,$date,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/, $DATA[$_]);
if ($email) { $name="$name"; }
if (!$sub) { $sub = "無題"; }
if ($url) { $url = "http://$url\n"; }
print "\n";
print "$com$url
\n";
}
print "
HTML
# 著作権表示 (削除不可)
print "\n";
print "- SPHINX BOARD -\n";
print "\n";
print "\n";
exit;
}
## --- ログ書き込み処理
sub regist {
# 名前とコメントは必須
if ($in{'name'} eq "") { &error("名前が入力されていません"); }
if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
# クッキーを格納
&set_cookie;
# ファイルロック
if ($lockkey == 1) { &lock1; }
elsif ($lockkey == 2) { &lock2; }
# ログを開く
open(LOG,"$logfile") || &error("Can't open $logfile");
@lines = ;
close(LOG);
# 二重投稿の禁止
($knum,$kdate,$kname,$kemail,$ksub,$kcom) = split(/<>/, $lines[0]);
if ($name eq $kname && $comment eq $kcom) { &error("二重投稿は禁止です"); }
# 記事Noカウント及び最大記事数超を切り捨て
@new = ();
for($i=0;$i<$max-1;$i++) { push (@new,$lines[$i]); }
$number = $knum + 1;
# 削除キーを暗号化
if ($in{'usr_pwd'}) { &passwd_encode; }
# 時間を取得
&get_time;
# ホスト名を取得
&get_host;
# ログをフォーマット
unshift (@new,"$number<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$encode_pwd<>\n");
# ログを更新
open(LOG,">$logfile") || &error("Can't write $logfile");
print LOG @new;
close(LOG);
# ロック解除
if (-e $lockfile) { unlink($lockfile); }
# メール処理
if ($mailing && $in{'email'} ne "$mailto") { &mail_to; }
}
## --- フォームからのデータ処理
sub form_deco {
if ($ENV{'REQUEST_METHOD'} eq "POST") {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# 文字コード変換
&jcode'convert(*value,'sjis');
# タグ処理
if ($tagkey == 0) {
$value =~ s/\"/"\;/g;
$value =~ s/<\;/g;
$value =~ s/>/>\;/g;
} else {
$value =~ s///g;
$value =~ s/<>/<\;>\;/g;
}
$in{$name} = $value;
}
$name = $in{'name'};
$comment = $in{'comment'};
$comment =~ s/\r\n/
/g;
$comment =~ s/\r/
/g;
$comment =~ s/\n/
/g;
$email = $in{'email'};
$url = $in{'url'};
$url =~ s/^http\:\/\///;
$mode = $in{'mode'};
$pwd = $in{'pwd'};
$subj = $in{'subj'};
$usr_pwd = $in{'usr_pwd'};
$usrid = $in{'usrid'};
$usrid =~ s/\s*//g;
$inpwd = $in{'inpwd'};
$inpwd =~ s/\s*//g;
}
## --- 掲示板の使い方メッセージ
sub howto {
if($tagkey == 0) { $tag_msg = "投稿内容には、タグは一切使用できません。\n"; }
else { $tag_msg = "コメント欄には、タグ使用をすることができます。\n"; }
&header;
print <<"HTML";
▲ BBS
- この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)
- $tag_msg
- 記事を投稿する上での必須入力項目は「おなまえ」と「メッセージ」です。Eメール、URL、題名、削除キーは任意です。
- 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。
- 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。
- 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。
- 既存の記事に「返信」することができます。各記事にある「返信」ボタンを押すと返信用フォームとなります。
- 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。
- 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は\予\告\なく削除することがあります。