#! /usr/local/bin/perl require './jcode.pl'; require "./cgi-lib.pl"; #■■■■■■■■■■ お絵かき掲示板 ver.1.32 # (c)2000,poo site # Web page:http://www2.plala.or.jp/junji21/index.htm # パスワード設定(必ず変更して下さい。12文字以内の英数字) $pass="90489048"; # 戻り先のURL $homepage = "http://www.geocities.co.jp/Playtown/2510"; #■■■■■■■■■■ 配色等のカスタマイズ ■■■■■■■■■■ # 壁紙を使用する場合(使用する場合にのみ、ファイル名を指定して下さい) $BACKGIF = "bg.jpg"; # 背景色(壁紙を使用しない場合) $BGcolor="ffffff"; # 本文の表示色 $TXcolor="#000000"; # 日付の表示色 $DTcolor="#666666"; # 絵のナンバーの表示色 $NOcolor="#333333"; # コメント投稿画面の入力部の色 $CM2color="#ccccff"; # コメント表示部の色 $CMcolor="#ffffff"; # コメント表示部の枠の色 $BDcolor="#ffffff"; # コメント投稿者の名前の表示色 $NMcolor="#3333ff"; # タイトル(お絵かき掲示板)の表示色 $TLcolor="#333333"; #■■■■■■■■■■ メッセージのカスタマイズ ■■■■■■■■■■ # タイトルに画像を使用する場合 $TITLEGIF = ""; $TGW = '150';# 画像の幅 (ピクセルで指定) $TGH = '50';# 画像の高さ (ピクセルで指定) # 新規画像投稿用リンクに画像を使用する場合 $NEWGIF = ""; $NGW = '150';# 画像の幅 (ピクセルで指定) $NGH = '50';# 画像の高さ (ピクセルで指定) # 新規コメント投稿用リンクに画像を使用する場合 $NEWCOM = ""; $NCW = '150';# 画像の幅 (ピクセルで指定) $NCH = '50';# 画像の高さ (ピクセルで指定) # タイトルメッセージ(画像を用いない場合) $TITLE="お絵かき掲示板"; # タイトル文字のフォントタイプ $TITLEFACE = "MS Pゴシック"; # リターンメッセージ $RETURN="HOME"; # メッセージ1 $MESSAGE1="管理用"; # メッセージ2(画像を用いない場合) $MESSAGE2="お絵かきする"; # メッセージ3 $MESSAGE3="この絵についてコメントする"; # メッセージ4 $MESSAGE4="コメント"; # メッセージ5 $MESSAGE5="最新イラスト順"; # メッセージ6 $MESSAGE6="最新レス順"; # メッセージ7 $MESSAGE7="文章のみ投稿する"; # メッセージ8 $MESSAGE8="掲示板に戻る"; # メッセージ9 $MESSAGE9="レス"; # 文字の大きさ(2、3、4のどれかを指定。数が大きいほど、文字も大きい) $moji="2"; # コメント欄の横幅のブラウザの幅に対する割合 $CWIDTH="80%"; # URLの自動リンク (0=no 1=yes) $autolink = 1; # 家アイコンの使用 (0=no 1=yes) $home_icon = 0; $home_gif = "";# 家アイコンのファイル名 $home_wid = 25;# 画像の横サイズ $home_hei = 22;# 〃 縦サイズ #■■■■■■■■■■ 一画面の表示枚数および画像の保持枚数 ■■■■■■■■■■ #一画面の画像表示枚数 $gznumber=10; #画像の保持枚数(デフォルトは50枚) #この値を変更する場合は、必ず、getpic.cgiのソース中の対応する部分も変更して下さい。 $lgnumber=300; #■■■■■■■■■■ ホスト名の表示 ■■■■■■■■■■ #コメントと同時にホストも表示する(0:off 1:on) $sw_host=0; #■■■■■■■■■■ コメントのみの投稿を許可するか ■■■■■■■■■■ #コメントのみの投稿(0:許可しない 1:許可する) $cm_sw=0; #■■■■■■■■■■ 表示順序 ■■■■■■■■■■ #標準的な表示順序(0:最新イラスト順 1:最新レス順) $def_sort=0; #■■■■■■■■■■ ロック機構 ■■■■■■■■■■ #ロック機構の方法(0:symlink関数(標準) 1:open関数 2:なし) $lock_mode=0; #■■■■■■■■■■ 各種パスの設定(通常は変更する必要はありません) ■■■■■■■■■■ #お絵かきをする時に呼び出すファイルへのパス $oefile="./oekaki.html"; #画像ファイルへのパス(内部パス) $gzfile="./"; #画像ファイルへのパス(絶対パス) $gz2file="./"; #■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ #以下は、なるべく変更しないで下さい。レイアウトの変更などのために書き換える場合は、自己の責任において行なって下さい。 $moji1=$moji-1; $moji3=$moji+1; $moji5=$moji+3; $lock_file ="./lock/count.lock"; $script = "picture.cgi"; $method = 'POST'; if ($ENV{'REQUEST_METHOD'} eq "POST") { 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'); $value =~ s//>/g; $value =~ s/\"/"/g; if ($name eq 'del') { push(@delete,$value); } if ($name eq 'del_res') {$value =~ s/[^a-zA-Z0-9\/\:]//gs;push(@delres,$value); } $FORM{$name} = $value; } $name = $FORM{'name'}; $name =~ s/\r//g; $name =~ s/\n//g; $title = $FORM{'title'}; $title =~ s/\r//g; $title =~ s/\n//g; $comment = $FORM{'comment'}; $comment =~ s/\r\n/
/g; $comment =~ s/\r/
/g; $comment =~ s/\n/
/g; $email = $FORM{'email'}; $email =~ s/\r//g; $email =~ s/\n//g; $url = $FORM{'url'}; $url =~ s/^http\:\/\///; $url =~ s/\r//g; $url =~ s/\n//g; $mode = $FORM{'mode'}; $sort = $FORM{'sort'}; $res_mode = $FORM{'res'}; $count_file = "./count"; $targetfile = "./data.txt"; $erasefile = "./erase.txt"; if ($sort eq "0"){$s_mode=0;} elsif($sort eq "1"){$s_mode=1;} else {$s_mode=$def_sort;} if ($mode eq "msg") { ®ist; } if ($mode eq "res_msg"){&res_msg;} if ($mode eq "admin") { &pass; } if ($mode eq "del") { &del; } if ($mode eq "master_del") { &master_del; } if ($mode eq "l_check") { &check_lock; } if (open(FILE,"<$count_file")) { $access = ; close(FILE); } @res=(); $comments=0; open(FILE,"<$targetfile"); while(){ chop; ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$_); $title =~ s/\r//g; $title =~ s/\n//g; if($pic =~ /[\d]/){ $rank{$pic*100+$res[$pic]}.="$pic\t$name\t$mail\t$http\t$body\t$date\t$ip\t$host\t$title"; $res[$pic]++; if($s_mode==1){ $sort[$comments]=$pic; $coms[$pic]=0; $comments++; } } } close(FILE); if($s_mode==1) { $pnum=$access; for($i=$comments-1;$i>0;$i--) { if($coms[$sort[$i]]>0){} else { $s[$pnum]=$sort[$i]; $coms[$sort[$i]]++; $pnum--; } } $i=$access; while($i>$access-$lgnumber && $i>0) { if($res[$i]==0) { $s[$pnum]=$i; $pnum--; } $i--; } } @era=(); open(FILE,"<$erasefile"); while(){ $era[$_]=1; } close(FILE); &head; if ($NEWGIF eq '') { print "
$MESSAGE2

\n"; } else { print "

\"NEW

\n"; } if($cm_sw==1){ if ($NEWCOM eq '') { print "

$MESSAGE7

\n"; } else { print "

\"NEW

\n"; } } print << "EOH";

[$RETURN] [$MESSAGE1]

[$MESSAGE5] [$MESSAGE6]

EOH if ($FORM{'page'} eq '') { $cc = 0; } else { $cc = $FORM{'page'}; } if ($FORM{'fno'} eq '') { $i = $access-$cc; } else { $i = $FORM{'fno'}; } $start=$cc; while($i>0 && $i>($access-$lgnumber) && ($cc-$start)<$gznumber ) { if($s_mode==0) {$file=$i%$lgnumber;$article=$i;} else {$file=$s[$i]%$lgnumber;$article=$s[$i];} ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$rank{$article*100}); $flag=0; if($cm_sw==1) { if(($title eq "") && ((-e "$gzfile".$file.".gif"==0 && -e "$gzfile".$file.".jpg"==0 && -e "$gzfile".$file.".png"==0 )|| $era[$file]==1)){$i--;$flag=1;} }else { if((-e "$gzfile".$file.".gif"==0 && -e "$gzfile".$file.".jpg"==0 && -e "$gzfile".$file.".png"==0 )|| $era[$file]==1){$i--;$flag=1;} } if($flag==0) { print << "EOH";
EOH if($title eq "") { print << "EOH"; EOH } print << "EOH";
[$article] EOH if( -e "$gzfile".$file.".png"==0){ if(-e "$gzfile".$file.".jpg"==0){ print "

"; }else{ print "

"; } }else { print "

"; } print << "EOH";
EOH $com_flag=0; for($j=0;$j<$res[$article];$j++) { ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$rank{$article*100+$j}); if($title ne "") { $com_flag=1; print "[$article]
\n"; print "$title
\n"; } if ($mail =~ /^\s*$/) { print "$name\n"; } else{ print "\n"; print "$name\n"; } $http=~ s/^http\:\/\///; if ($http && $home_icon) { print "\n"; } elsif ($http && $http ne 'http://' && $home_icon == 0) { print "[Home Page]\n"; } if($sw_host==1){ print "\n"; print "$date
$ip $host\n"; print "
\n"; } else{ print "\n"; print "$date\n"; print "\n"; } print << "EOH";
$body

EOH if($title ne "") { $body =~ s/"/'/g; print << "EOH"; EOH } if($title ne "" && $res[$article]>1) { print "


\n"; print "
    \n"; } } if($com_flag==1 && $res[$article]>1) { print "
\n"; } print << "EOH";

EOH $i--; $cc++; } $file=$i%$lgnumber; if($i<0){$i=$lgnumber-1;} } print "
\n"; if($i==($access-$lgnumber) || $i==0 || $cc %$gznumber==0 ) { if($cc>$gznumber){ print << "EOH"; EOH } } if($cc % $gznumber== 0 && $cc<$lgnumber && $i!=0) { # 次頁処理 print << "EOH"; EOH } print "
\n"; &foot; exit; #■■■■■■■■■■ コメント投稿処理 ■■■■■■■■■■ sub regist { if ($name eq "") { &CgiError("名前の記入がありません。","ブラウザのバックボタンで戻って再入力してください。"); exit; } if ($comment eq "") { &CgiError("コメントの記入がありません。", "ブラウザのバックボタンで戻って再入力してください。"); exit; } my ($sec,$min,$hour,$mday,$mon,$year,$wday,$seireki_nen,$month,$tuki,$youbi,@youbi,$currenttime,$seireki); ($sec,$min,$hour,$mday,$mon,$year,$wday)=(localtime)[0,1,2,3,4,5,6]; $seireki_nen = $year + 1900; $month = $mon + 1; @youbi = ("Sun","Mon","Tue","Wed","Thurs","Fri","Sat"); $youbi = $youbi[$wday]; $currenttime = sprintf("%02d:%02d:%02d",$hour,$min,$sec); $seireki = "$seireki_nen" . "/" . "$month" . "/" . "$mday" . " ($youbi.)"; $date = "$seireki" . " $currenttime"; if ($autolink) { &auto_link($comment);} # ロック処理 if ($lock_mode == 0) { &process_lock; } elsif ($lock_mode == 1) { &process_lock2; } if($res_mode eq "new") { if (open(FILE,"<$count_file")) { $access = ; close(FILE); } if (open(FILE,">$count_file")) { $access++; print FILE $access; close(FILE); } open(OUT,">>$erasefile") or &CgiDie("現在書き込みができなくなっています。", "しばらくして、もう一度送信してください。"); $pic=$access; $pic =~ s/[^0-9]//gs; $pic=$pic%$lgnumber; print OUT "$pic\n"; close(OUT); if($access>$lgnumber) { open(DATA,"$targetfile") or &CgiDie("現在、ログファイルが読み込めなくなっています。","しばらくして、もう一度送信してください。"); @lines=; close(DATA); foreach $line (@lines) { ($pic,$nm,$mail,$http,$body,$dt,$ip,$host,$subject)=split("\t",$line); $pic =~ s/[^0-9]//gs; if ($pic ne $access-$lgnumber){ push(@new,$line); } } open(DATA,">$targetfile") or &CgiDie("現在、ログファイルが書き込めなくなっています。","しばらくして、もう一度送信してください。"); print DATA @new; close(DATA); } if($title eq "") { $title="無題"; } open(OUT,">>$targetfile") or &CgiDie("現在書き込みができなくなっています。","しばらくして、もう一度送信してください。"); print OUT "$access\t$name\t$email\t$url\t$comment\t$date\t$ENV{'REMOTE_ADDR'}\t$ENV{'REMOTE_HOST'}\t$title\n"; } else { open(OUT,">>$targetfile") or &CgiDie("現在書き込みができなくなっています。","しばらくして、もう一度送信してください。"); print OUT "$FORM{'resno'}\t$name\t$email\t$url\t$comment\t$date\t$ENV{'REMOTE_ADDR'}\t$ENV{'REMOTE_HOST'}\t$title\n"; } close(OUT); &process_unlock; if($FORM{'cook'} eq 'on'){&set_cookie;} $mode=""; $name=""; $comment=""; $sub=""; $email=""; $url=""; } #■■■■■■■■■■ コメント投稿画面 ■■■■■■■■■■ sub res_msg { &get_cookie; $file=$FORM{'resno'}%$lgnumber; &head; if($res_mode eq "new") { print "
$MESSAGE8

\n"; } elsif($res_mode eq "comment") { $comment =~ s/<//g; print << "EOH";

$MESSAGE8

$comment

EOH } else { print "
$MESSAGE3

\n"; if( -e "$gzfile".$file.".png"==0){ if(-e "$gzfile".$file.".jpg"==0){ print "

"; }else { print "

"; } }else { print "

"; } } print << "EOH";

EOH if($res_mode eq "new") { print "title :
\n"; } print << "EOH"; name :
e-mail :
URL :
cookie reminder
タグは全て無効です。

EOH &foot; exit; } #■■■■■■■■■■ ファイルロック処理 ■■■■■■■■■■ sub process_lock { local($wait) = 10; while ( !symlink(".",$lock_file) ) { &CgiDie("lock busy") if --$wait <= 0; sleep (6); } } #■■■■■■■■■■ ファイルロック処理2 ■■■■■■■■■■ sub process_lock2 { local($flag) = 0; foreach (1 .. 5) { if (-e $lock_file) { sleep(1); } else { open(LOCK,">$lock_file") || &CgiDie("lock busy"); close(LOCK); $flag = 1; last; } } if ($flag == 0) { &CgiDie("lock busy") } } #■■■■■■■■■■ ファイルアンロック処理 ■■■■■■■■■■ sub process_unlock { unlink ($lock_file); } #■■■■■■■■■■ ロック状況の監視 ■■■■■■■■■■ sub check_lock { if ($FORM{'pass'} ne "$pass") { &CgiError("パスワードが違います","ブラウザのバックボタンで戻って再入力してください。");exit; } if($FORM{'operate'} eq "unlock") { &process_unlock; } else { $lock_state="正常"; local($wait) = 4; while ( !symlink(".",$lock_file) && $wait>0 ) { $wait--; if ($wait <= 0){$lock_state="異常";} sleep (6); } if($lock_state eq "正常") { &process_unlock; } } &head; print << "EOH";
EOH if($FORM{'operate'} eq "unlock") { print "
ロック解除
"; } else { print "現在のファイルロック状況: $lock_state"; if($lock_state eq "異常") { print "

"; print "サーバーの負荷が大きくなっているか、その他の原因のためにファイルロックがかかったままになっています。
"; print "[ファイルロックを管理者権限で解除する]"; } } print << "EOH";

[掲示板へ戻る]

EOH &foot; } #■■■■■■■■■■ パスワード認証 ■■■■■■■■■■ sub pass { &head; print << "EOH";

管理者パスワードを入力してください。


EOH &foot; exit; } #■■■■■■■■■■ 管理者削除処理 ■■■■■■■■■■ sub del{ if ($FORM{'pass'} ne "$pass") { &CgiError("パスワードが違います","ブラウザのバックボタンで戻って再入力してください。");exit; } if (open(FILE,"<$count_file")) { $access = ; close(FILE); } @res=(); open(FILE,"<$targetfile"); while(){ chop; ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$_); $title =~ s/\r//g; $title =~ s/\n//g; if($pic =~ /[\d]/){ $rank{$pic*100+$res[$pic]}.="$pic\t$name\t$mail\t$http\t$body\t$date\t$ip\t$host\t$title"; $res[$pic]++; } } close(FILE); @era=(); open(FILE,"<$erasefile"); while(){ $era[$_]=1; } close(FILE); &head; print << "EOH";

ファイルロック状況のチェック

削除したい項目のチェックボタンをチェックし、”削除実行”を押して下さい。

[掲示板へ戻る]

EOH if ($FORM{'page'} eq '') { $cc = 0; } else { $cc = $FORM{'page'}; } if ($FORM{'fno'} eq '') { $i = $access-$cc; } else { $i = $FORM{'fno'}; } $start=$cc; while($i>0 && $i>($access-$lgnumber) && ($cc-$start)<$gznumber ) { $file=$i%$lgnumber; ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$rank{$i*100}); $flag=0; if($cm_sw==1) { if(($title eq "") && ((-e "$gzfile".$file.".gif"==0 && -e "$gzfile".$file.".jpg"==0 && -e "$gzfile".$file.".png"==0 )|| $era[$file]==1)){$i--;$flag=1;} }else { if((-e "$gzfile".$file.".gif"==0 && -e "$gzfile".$file.".jpg"==0 && -e "$gzfile".$file.".png"==0 )|| $era[$file]==1){$i--;$flag=1;} } if($flag==0) { print << "EOH";

EOH if($title eq "") { print << "EOH"; EOH } print ""; print "
[$i] EOH if( -e "$gzfile".$file.".png"==0){ #### if( -e "$gzfile".$file.".jpg"==0){ print "

";#### }else{ print "

";#### } }else#### {#### print "

";#### }#### print << "EOH"; 削除
\n"; for($j=0;$j<$res[$i];$j++) { ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$rank{$i*100+$j}); print "削除\n"; if ($mail =~ /^\s*$/) { print "$name\n"; } else{ print "\n"; print "$name\n"; } if ($http =~ /^\s*$/ || $http eq 'http://') { } else{ print "[Home Page]\n"; } print "$date\n"; print "
\n"; print "$body\n"; print "

\n"; } print "


\n"; $i--; $cc++; } $file=$i%$lgnumber; if($i<0){$i=$lgnumber-1;} } print "
\n"; print "
\n"; if($i==($access-$lgnumber) || $i==0 || $cc %$gznumber==0 ) { if($cc>$gznumber){ print << "EOH"; EOH } } if($cc % $gznumber== 0 && $cc<$lgnumber && $i!=0) { print << "EOH"; EOH } print "
\n"; &foot; exit; } #■■■■■■■■■■ 一括削除処理 ■■■■■■■■■■ sub master_del{ if ($FORM{'pass'} ne "$pass") { &CgiError("パスワードが違います","ブラウザのバックボタンで戻って再入力してください。");exit; } if ($FORM{'del'} eq "" && $FORM{'del_res'} eq "") { &CgiError("チェックボタンが選択されていません。","ブラウザのバックボタンで戻って再入力してください。");exit; } # ロック処理 if ($lock_mode == 0) { &process_lock; } elsif ($lock_mode == 1) { &process_lock2; } if($FORM{'del_res'} ne "") { open(DATA,"$targetfile") or &CgiDie("現在、ログファイルが読み込めなくなっています。","しばらくして、もう一度送信してください。"); @lines=; close(DATA); foreach $line (@lines) { $flag=0; ($pic,$name,$mail,$http,$body,$date,$ip,$host,$title)=split("\t",$line); $title =~ s/\r//g; $title =~ s/\n//g; $date =~ s/[^a-zA-Z0-9\/\:]//gs; foreach $res (@delres) { if ($date eq $res) {$flag = 1;if($title ne ""){push(@delete,$pic);$FORM{'del'}="del";}} } if ($flag == 0) { push(@new,$line); } } open(DATA,">$targetfile") or &CgiDie("現在、ログファイルが書き込めなくなっています。","しばらくして、もう一度送信してください。"); print DATA @new; close(DATA); } if($FORM{'del'} ne "") { open(OUT,">>$erasefile") or &CgiDie("現在書き込みができなくなっています。", "しばらくして、もう一度送信してください。"); foreach $pic (@delete) { $pic =~ s/[^0-9]//gs; $pic=$pic%$lgnumber; unlink "$gzfile$pic.gif";#### unlink "$gzfile$pic.jpg";#### unlink "$gzfile$pic.png";#### print OUT "$pic\n"; } close(OUT); } &process_unlock; &del; } #■■■■■■■■■■ URLの自動リンク ■■■■■■■■■■ sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g; } #■■■■■■■■■■ クッキー設定 ■■■■■■■■■■ sub set_cookie { # クッキーは60日間有効 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time + 60*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul', 'Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook="name\:$name\,email\:$email\,url\:$url"; print "Set-Cookie: OEBBS=$cook; expires=$date_gmt\n"; } #■■■■■■■■■■ クッキーを取得 ■■■■■■■■■■ sub get_cookie { @pairs = split(/\;/, $ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/\,/, $DUMMY{'OEBBS'}); foreach $pair (@pairs) { local($name, $value) = split(/\:/, $pair); $COOKIE{$name} = $value; } $c_name = $COOKIE{'name'}; $c_email = $COOKIE{'email'}; $c_url = $COOKIE{'url'}; if($FORM{'cook'}eq 'on'){ if ($FORM{'name'}) { $c_name = $FORM{'name'}; } if ($FORM{'email'}) { $c_email = $FORM{'email'}; } if ($FORM{'url'}) { $c_url = $url; } } } #■■■■■■■■■■ ヘッダー ■■■■■■■■■■ sub head{ print << "EOH"; Content-type: text/html お絵かき掲示板 EOH if ($BACKGIF eq '') { print "

\n"; } else { print "

\n"; } if ($TITLEGIF eq '') { print "

+ $TITLE +

\n"; } else { print "

\"TITLE\"

\n"; } } #■■■■■■■■■■ フッター ■■■■■■■■■■ sub foot{ #このリンク部を削除することはできません print << "EOH";

EOH exit; }