#!/usr/local/bin/perl #┌───────────────────────────────── #│ YY-BOARD v5.04 (2003/06/23) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── # 外部ファイル取込 require './jcode.pl'; require './yyini.cgi'; # メイン処理 &decode; &axsCheck; if ($mode eq "dele") { &dele; } elsif ($mode eq "edit") { &edit; } elsif ($mode eq "regist") { ®ist; } elsif ($mode eq "past") { &past; } elsif ($mode eq "admin") { &admin; } &logView; #------------# # 記事登録 # #------------# sub regist { local($flag,@lines,@data,@new,@tmp); # フォーム入力チェック &formCheck; # 時間取得 &get_time; # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error: $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); local($no,$ip,$tim) = split(/<>/, $top); $no++; # 連続投稿チェック $flag=0; if ($regCtl == 1) { if ($addr eq $ip && $times - $tim < $wait) { $flag=1; } } elsif ($regCtl == 2) { if ($time - $tim < $wait) { $flag=1; } } if ($flag) { &error("現在投稿制限中です。もうしばらくたってから投稿をお願いします"); } # URL自動リンク if ($autolink) { &auto_link($in{'comment'}); } # 重複チェック $flag=0; foreach (@lines) { local($no2,$re,$dat,$nam,$eml,$sub,$com) = split(/<>/); if ($in{'name'} eq $nam && $in{'comment'} eq $com) { $flag=1; last; } } if ($flag) { &error("重複投稿のため処理を中断しました"); } # 暗証キーを暗号化 if ($in{'pwd'} ne "") { $pwd = &encrypt($in{'pwd'}); } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } elsif ($stop && $pastkey) { push(@data,$_); } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$col[$in{'color'}]<>$in{'icon'}<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if (@data > 0) { &pastlog(@data); } # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートあり } elsif ($in{'reno'} && $topsort) { $f=0; $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} == $no2) { if ($reno2) { $f++; last; } $match=1; push(@new,$_); } elsif ($in{'reno'} == $reno2) { push(@new,$_); } elsif ($match == 1 && $in{'reno'} != $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$col[$in{'color'}]<>$in{'icon'}<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($f) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$col[$in{'color'}]<>$in{'icon'}<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートなし } else { $f=0; $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} == $no2) { if ($reno2) { $f++; last; } $match=1; } elsif ($match == 1 && $in{'reno'} != $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$col[$in{'color'}]<>$in{'icon'}<>\n"); } push(@new,$_); } if ($f) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$col[$in{'color'}]<>$in{'icon'}<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); } # ロック解除 if ($lockkey) { &unlock; } # クッキー発行 &set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'},$in{'icon'},$in{'color'}); # メール処理 if ($mailing == 1 && $in{'email'} ne $mailto) { &mail_to; } elsif ($mailing == 2) { &mail_to; } # リロード if ($location) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $location?\n\n"; exit; } else { &message('投稿は正常に処理されました'); } } #------------# # 記事削除 # #------------# sub dele { local($flag,$check,$no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,@new); # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは暗証キーが入力モレです"); } # ロック処理 &lock if ($lockkey); $flag=0; @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw) = split(/<>/); if ($in{'no'} == $no) { $flag++; $pw2 = $pw; next; } elsif ($in{'no'} == $reno) { next; } push(@new,$_); } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if ($pw2 eq "") { &error("暗証キーが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); if ($check != 1) { &error("暗証キーが違います"); } unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 &unlock if ($lockkey); # 完了メッセージ &message("削除が完了しました"); } #------------# # 記事修正 # #------------# sub edit { local($top,$flag,$pattern,$no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico); if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは暗証キーが入力モレです"); } # 修正実行 if ($in{'job'} eq "edit") { # フォーム入力チェック &formCheck; if ($autolink) { &auto_link($in{'comment'}); } # ロック処理 &lock if ($lockkey); $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($in{'no'} == $no) { $flag++; $pw2 = $pw; $_ = "$no<>$reno<>$dat<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$hos<>$pw<>$col[$in{'color'}]<>$in{'icon'}<>\n"; } push(@new,$_); } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if ($pw2 eq "") { &error("暗証キーが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); if ($check != 1) { &error("暗証キーが違います"); } unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 &unlock if ($lockkey); # 完了メッセージ &message("修正が完了しました"); } $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($in{'no'} == $no) { $pw2 = $pw; $flag=1; last; } } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if ($pw2 eq "") { &error("暗証キーが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); if ($check != 1) { &error("暗証キーが違います"); } $com =~ s/
/\r/g; $pattern = 'http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+'; $com =~ s/($pattern)<\/a>/$1/go; if ($ImageView == 1) { &header('ImageUp'); } else { &header; } print < ▽変更する部分のみ修正して送信ボタンを押して下さい。

EOM &form($nam,$eml,$url,'??',$ico,$col,$sub,$com); print < EOM exit; } #------------# # 完了文言 # #------------# sub message { local($msg) = @_; &header; print <

$msg


EOM exit; } #------------# # 入力確認 # #------------# sub formCheck { local($ref); # POST限定 if ($postonly && !$post_flag) { &error("不正なアクセスです"); } # 他サイトからのアクセス排除 if ($baseUrl) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $baseUrl =~ s/(\W)/\\$1/g; if ($ref && $ref !~ /$baseUrl/i) { &error("不正なアクセスです"); } } # 名前とコメントは必須 if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in_email && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { &error("Eメールの入力内容が正しくありません"); } if ($iconMode) { @ico1 = split(/\s+/, $ico1); @ico2 = split(/\s+/, $ico2); if ($my_icon) { push(@ico1,$my_gif); } if ($in{'icon'} =~ /\D/ || $in{'icon'} < 0 || $in{'icon'} > @ico1) { &error("アイコン情報が不正です"); } $in{'icon'} = $ico1[$in{'icon'}]; # 管理アイコンチェック if ($my_icon && $in{'icon'} eq $my_gif && $in{'pwd'} ne $pass) { &error("管理用アイコンは管理者専用です"); } } @col = split(/\s+/, $color); if ($in{'color'} =~ /\D/ || $in{'color'} < 0 || $in{'color'} > @col) { &error("文字色情報が不正です"); } # URL if ($in{'url'} eq "http://") { $in{'url'} = ""; } } #--------------# # 管理モード # #--------------# sub admin { local($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$next,$back,$top,$i); if ($in{'pass'} eq "") { &enter; } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } # 修正画面 if ($in{'job'} eq "edit" && $in{'no'}) { local(@num,@f); @num = split(/\0/, $in{'no'}); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { @f = split(/<>/); if ($f[0] == $num[0]) { last; } } close(IN); # 修正フォーム &edit_form(@f); # 修正実行 } elsif ($in{'job'} eq "edit2" && $in{'no'}) { local(@col,@ico,@new); if ($in{'url'} eq "http://") { $in{'url'} = ''; } @col = split(/\s+/, $color); @ico = split(/\s+/, $ico1); # ロック開始 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($no == $in{'no'}) { $_="$no<>$re<>$dat<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$hos<>$pw<>$col[$in{'color'}]<>$ico[$in{'icon'}]<>\n"; } push(@new,$_); } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } # 削除 } elsif ($in{'job'} eq "dele" && $in{'no'}) { # ロック開始 if ($lockkey) { &lock; } # 削除情報をマッチング local(@new)=(); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { $flag=0; ($no,$re) = split(/<>/); foreach $del ( split(/\0/, $in{'no'}) ) { if ($no == $del || $re == $del) { $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } &header; print <
  • 処理を選択し、記事をチェックして送信ボタンを押して下さい。
  • 親記事を削除するとレス記事も一括して削除されます。

EOM $pastView *= 2; $i=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw) = split(/<>/); if ($re eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $pastView) { last; } if ($eml) { $nam = "$nam"; } ($dat) = split(/\(/, $dat); if ($url) { $url = "<URL>"; } else { $url = ' '; } $com =~ s/<[^>]*(>|$)//g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if ($re eq "") { print "\n"; } # 削除チェックボックス print ""; print ""; print ""; print "\n"; } close(IN); print "\n"; print "
記事NO投稿日タイトル 投稿者参照先コメントホスト名

$no$dat$sub$nam$url$com$hos

\n"; $next = $page + $pastView; $back = $page - $pastView; print "

\n"; if ($back >= 0) { print "\n"; } if ($next < $i) { print "\n"; } print <
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
EOM exit; } #------------# # 修正画面 # #------------# sub edit_form { local($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = @_; $com =~ s/
/\r/g; &header; print < ▽変更する部分のみ修正して送信ボタンを押して下さい。

EOM &form($nam,$eml,$url,'??',$ico,$col,$sub,$com); print < EOM exit; } #------------# # 入室画面 # #------------# sub enter { &header; print <

パスワードを入力してください

EOM exit; } #------------# # 時間取得 # #------------# sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); local @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } #--------------# # メール送信 # #--------------# sub mail_to { local($msub,$mbody,$email); # メールタイトルを定義 $msub = "$title (No.$no)"; # 記事の改行・タグを復元 $com = $in{'comment'}; $com =~ s/
/\n/g; $com =~ s/<//g; $com =~ s/"/"/g; $com =~ s/&/&/g; # メール本文を定義 $mbody = <$2<\/a>/g; } #----------------# # 過去ログ生成 # #----------------# sub pastlog { local(@data) = @_; local($count,$pastfile,$i,$f,@past); # 過去ログNoファイル open(NO,"$nofile") || &error("Open Error: $nofile"); $count = ; close(NO); $pastfile = sprintf("%s%04d\.cgi", $pastdir,$count); # 過去ログを開く $i=0; $f=0; open(IN,"$pastfile") || &error("Open Error: $pastfile"); while () { $i++; push(@past,$_); if ($i >= $pastmax) { $f++; last; } } close(IN); # 規定の行数をオーバーすると次ファイルを自動生成 if ($f) { # カウントファイル更新 open(NO,">$nofile") || &error("Write Error: $nofile"); print NO ++$count; close(NO); $pastfile = sprintf("%s%04d\.cgi", $pastdir,$count); @past = @data; } else { unshift(@past,@data); } # 過去ログ更新 open(OUT,">$pastfile") || &error("Write Error: $pastfile"); print OUT @past; close(OUT); if ($f) { chmod(0666, $pastfile); } } #------------# # 過去ログ # #------------# sub past { open(IN,"$nofile") || &error("Open Error: $nofile"); $no = ; close(IN); $in{'pastlog'} =~ s/\D//g; if (!$in{'pastlog'}) { $in{'pastlog'} = $no; } &header; print <<"EOM";
過去ログ
キーワード 条件 表\示
EOM $file = sprintf("%s%04d\.cgi", $pastdir,$in{'pastlog'}); # 検索処理 if ($in{'word'} ne "") { ($i,$next,$back) = &search($file,$in{'word'},$in{'view'},$in{'cond'}); $enwd = &url_enc($in{'word'}); if ($back >= 0) { print "[前の$in{'view'}件]\n"; } if ($next < $i) { print "[次の$in{'view'}件]\n"; } print "\n"; exit; } print "
\n"; $i=0; open(IN,"$file") || &error("Open Error: $file"); while () { ($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($re eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $pastView) { next; } if ($eml) { $nam = "$nam"; } if ($url) { $url = "<URL>"; } if ($re eq "") { print "

"; } else { print "
"; } print "$sub  $nam - $dat $url No.$no

\n"; if ($ico) { print "
$com

\n"; } else { print "
$com
\n"; } } close(IN); print "

\n"; $next = $page + $pastView; $back = $page - $pastView; print "\n"; $flag=0; if ($back >= 0) { $flag++; print "\n"; } if ($next < $i) { $flag++; print "\n"; } # ページ移動ボタン表示 if ($flag) { print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; &mvbtn("$regist?mode=past&pastlog=$in{'pastlog'}&page=", $i, $pastView, 15); print ""; } else { print ""; } print <
EOM exit; } __END__