#!/usr/local/bin/perl
#
######################################################################
###
###
### CGI簡易掲示版 T-Note Ver.4.05
### [1/1] 本体 (tnote.cgi)
### (c) 1996-2005 Takahiro Nishida
### http://www.mytools.net/
###
###
######################################################################
#
### 変数設定部 (詳細は上記ページをご覧下さい) ######################
# データファイルの入っているディレクトリ
$basedir = ".";
# CGIプログラムの拡張子
$ext = "cgi";
# 文字コード
$code = "sjis";
# フォームの送信方法
$method = "post";
# 管理パスワード
$password = "TNote405";
# 管理者メールアドレス
$admin_email = "your\@email.address";
# 文章の最大長(全角での文字数)
$max_words = 3000;
### 変数設定部 (ここまで)###########################################
# 標準時とのズレ(時間)
$time_fix = 0;
# 標準のBOOK名
$default_book = "";
# クッキーの有効期限(日)
$cookie_lifetime = 30;
# スクリプトの名前
$script_name = "tnote";
# クッキーのPATHの設定/非設定
$enable_cookiepath = 1;
# 更新日を見るためのキーワード
$update_keyword = "update";
# スパム扱いするキーワード
@spamwords = ("url.com", "萌", "エッチ", "女子高生", "セフレ", "奥様", "シークレット", "エロ", "ギャル", "放題", "artemisweb", "freexy", "巨乳", "ぴちぴち", "マ○", "芸能人");
# スパムエラー時のメッセージ(0-14:適当なメッセージ、15:スパム専用メッセージ、詳しくはerror関数を参照)
$SPAM_ERROR_ID = 3;
# jcode.plの位置
require './jcode.pl';
##### 発言表示のテンプレート
# "#xxx#" のところに文字が埋め込まれる(xxxの種類は以下の通り)
# ID ... 発言ID
# HEAD ... 発言タイトル
# NAME ... 名前
# MAIL ... メールアドレス
# URL ... ページのURL
# CONT ... 発言内容
# REPLY ... 返信フォーム、返信文
sub article_template{
"
No.#ID# (#DATE#)
#HEAD#
#REPLY#
Name:#NAME##HOST#
Email:#MAIL#
URL:#URL#
";
}
##### 標準の配色、背景画像
$defcol = "#333333,#FFFFFF,#0000BB,#000099,#FF0000,#CC00FF,#FF5555,#6699FF,#FF3333,#003300,";
$lockfile = "$basedir/lockdir/tn.lock";
$pwdfile = "$basedir/tnpwd.$ext";
$verno = '4.05';
&main;
sub main{
&lock;
&init_variables;
&check_input;
&open_datafiles;
&exec_admin;
&get_configs;
&add_newdata;
&add_newreply;
&cut_log;
&update_datafiles;
&deal_cookie;
&select_datas;
&cut_data;
&show_html;
&unlock;
}
########## 変数の初期化
sub init_variables{
local($addr);
### ホスト名
$addr = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
($addr eq $host) && ($host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2));
$host = $host || $addr || "";
### 時刻(秒、時間)
$date_now = &get_time(time);
}
########## 入力の受け取り、チェック
sub check_input{
local($buffer, $vn, $pair, @pairs);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
### 各ノートの更新日表示
($update_keyword) && ($buffer eq $update_keyword) && (&show_update);
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($vn, $value) = split(/=/, $pair);
$F{$vn} .= $value;
}
$book = $F{'book'} || $default_book || &error(3);
$name = &decode($F{'name'});
$mail = &decode($F{'mail'});
$url = &decode($F{'url'});
$head = &decode($F{'head'});
$cont = &decode($F{'cont'});
$pid = $F{'pid'};
$find = &decode($F{'find'});
$page = $F{'page'};
$cook = $F{'cook'};
$rcont= $F{'rcont'};
$pwd = $F{'pwd'};
$ppr = $F{'ppr'};
$type = $F{'type'} || 'and';
($book =~ /^\w+$/) || &error(4);
(!$mail) || ($mail =~ /^[\w\-\+\.]+\@[\w\-\+\.]+$/) || &error(5);
(!$url) || ($url =~ /^http:\/\/+./) || &error(6);
(!$pid) || ($pid =~ /^\d+$/) || &error(7);
### スパムキーワードチェック
&check_spamword($head) && &error($SPAM_ERROR_ID);
&check_spamword($cont) && &error($SPAM_ERROR_ID);
}
########## 更新日の表示
sub show_update{
local($htmlbuf, $file, $book_name, $datafile, $book_update, $book_title);
opendir(DIR, $basedir) || &error(14, "ディレクトリが開けません");
$htmlbuf = "Content-type: text/html\n\n";
$htmlbuf .= "更新日一覧
\n";
$htmlbuf .= "
| タイトル | BOOK名 | 更新日付 |
|---|---|---|
| $book_title | \n"; $htmlbuf .= "$book_name | \n"; $htmlbuf .= "$book_update |
$headline
$comment
/\n\n/g; $headbuf = $head; } ### スイッチ処理 # 削除キー入力欄 if($sw_ppr){ $pprcase = ($sw_ppr == 2) ? "(必須)" : "書かない場合発言の削除ができません"; $html_pphrase = " 削除キー: ※ 発言削除用のパスワード。$pprcase "; } # プレビューボタン $html_submitlabel = "発言"; if($sw_preview == 1){ $html_preview = ""; } # 常にプレビュー elsif($sw_preview == 2){ $html_submitlabel = "プレビュー"; $html_prehidden = "\n"; } # 発言タイトル入力欄 if($sw_head){ $html_head = "
|
";
# 今までの返事を表示
@replys = split(" "; } } else { $C{'REPLY'} .= " [Re.$rno] $rname($rtime)> $rcont "; } } $C{'REPLY'} .= " |
/\n\n/g; $headbuf = $head; "
/g;
$w =~ s/\n/
$fmsg[$fid]
/g;
&jcode'convert(*w, $code);
$w;
}
##### タグを殺す
sub killtag{
local($w) = @_;
$w =~ s/</g;
$w =~ s/>/>/g;
$w =~ s/"/"/g;
$w =~ s/'/'/g;
$w;
}
##### スパムキーワードをチェック
$spam_pattern = "";
sub check_spamword
{
(@spamwords) || return;
local($chkstr) = @_;
# キーワードの初期化処理
if(!$spam_pattern)
{
foreach(@spamwords)
{
s/(\W)/\\$1/g;
$spam_pattern .= $_ . "|";
}
chop($spam_pattern);
}
# スパムワードがあったら1を、なかったら0を返す
if($chkstr =~ /$spam_pattern/)
{
return 1;
}
return 0;
}
##### 現在の時刻を得る
sub get_time{
local($stime) = @_;
$stime += $time_fix * 60 * 60;
local($sec, $min, $hour, $mday, $mon, $year) = localtime($stime);
$mon++;
$year += 1900;
return sprintf("%04d/%02d/%02d %02d:%02d", $year, $mon, $mday, $hour, $min);
}
###### ファイルを開いて、中身を配列に代入する
sub openfile{
local ($filename, *buf) = @_;
open(FILE, "$filename") || &error(1, $filename);
@buf = エラー発生
$msg[$id] $detail
管理者:$admin_email
※ ご一報の際には、サイトのURL、症状等をお書き添え下さいますようお願いします。
";
($id) && &unlock; # ID が 0 以外の場合はロック解除
($tn - $sts[9] > 15) && &unlock; # 約15秒以上ロックが続いてたら自動解除
exit;
}