#!/usr/local/bin/perl
#******************************************************************************
#upboard.cgi - Upload Board Ver.1.12
#
#Version :1.12
#modified :2000/10/22
#Copyright :The Room
#E-Mail :dream@lib.net
#URL :http://dream.lib.net/room/
#
#UP BOARD (01/02/15)
# Edit by Moerin [Mo-Mo/Material]
# Mail: moe_moe@d9.dion.ne.jp
# Home: http://twin917.vis.ne.jp/
#
#これはフリー素材です。
#転載・商用目的の利用の際には、メールをお願いします。
#御利用の際は、The RoomさんとMo−Mo/Materialの利用規定をお読み
#ください。
#******************************************************************************
#1行目のperlのディレクトリ指定は、サーバによって異なります。
#詳しくは、管理者にお聞きください。
#******************************************************************************
#
# 冒頭の設定が終了したら、スクリプト文末を見てください。
# Help画面を表示していますので、
# 必要に応じて変更してください。
#
#******************************************************************************
#基本設定
# jcode.pl の位置
$jcode="./jcode.pl";
# ログファイルの位置
$logfile="./log.dat";
#ログの最大数
$logmax = 380;
#1ページに表示する親記事数
$pagemax = 8;
#入力が無かった時に設定する名前。
#何もいれないと、名前入力が必須になります。
$newname = "";
#入力が無かった時に設定する題名。
#何もいれないと、題名入力が必須になります。
$newsubject = "私の雲";
# 書きこみの色
#
# 書きこみ時に「Write Color」で選択する色です。
$wclist[0] = "#666666";
$wclist[1] = "#f08080";
$wclist[2] = "#ff9900";
$wclist[3] = "#4a9d02";
$wclist[4] = "#4682b4";
$font_size = "10pt";
# 背景色
#
# 書きこみ時の「back color」で選択する色です。
# $bclist が背景色、$lclistが枠の色、
# $sclist1 がボタン・テキストボックスの枠の色、
# $sclist2 がボタン・テキストボックスの枠の中の色、となっています。
# 例えば、背景色で 2番目の色を選択したら、
# それに伴って他の色も変わります。
#
# *下の初期設定では、背景色は全て白となっています。
# *また、背景はそんなに極端に変更するものでもないと思うので、
# *実際の選択時には、 $lclist で設定した色が表示されます。
#入力フォーム・削除フォーム等の枠の色
$bordercolor="#ffffff";
#入力フォーム・削除フォーム等の中の色
$incolor="#ffffff";
#******************************************************************************
#タイトル
$title = "みんなの撮った雲 -Cloud Collector-";
#BODYタグ
$body = '
';
#ページ上部に表示するタイトル
$pagetop = '
* みんなの撮った雲 *
雲の大辞典をみんなの撮った雲の写真で作ってゆきましょう.
';
#スタイルシート
# .input は親記事入力フォーム・削除入力フォームのテキストボックス、
# .button はなんらかのボタンのスタイルシート指定となっています。
$stylesheet = <
EOD
#back のリンクの戻り先(設定しないとリンクは表示されません)
$homeback = "http://contest.thinkquest.jp/tqj2001/40457/cloud/cloud_index.html";
#******************************************************************************
#動作設定
$linktarget="_self"; # 投稿者のホームページへのリンクのターゲット
$ipindicate=1; # ソースにIPを表示するなら1を。
$resmove = 1; #レスがついた記事を一番上に移動するなら1を。
@permittag=("a","b","font");
#使用を許可するタグ。
#全て不許可の場合は、 @permittag=();
$autolink=1; #URLが書かれたら自動的にリンクを貼る場合は1を
$referercheck=1; #別ページからの投稿を禁止するなら1を。
$doubleerror=1; #二重投稿を禁止するなら1を。
$scripturl="http://contest.thinkquest.jp/tqj2001/40457/cgi-bin/upboard/upboard.cgi";
#スクリプトを置くURL(http://〜の絶対パス)
$adminpass = "isama";#管理用パスワード
#******************************************************************************
#アップロード設定
#管理人のみがアップできるようにするなら1を。
$adminimage = 0;
#ファイルをアップするディレクトリ
# niftyやfreeweb等、HTMLとCGIのサーバが異なる場合には、
# /homepage/updir のようにサーバ内絶対パス指定してください。
$updir="../../updir";
#ファイルをアップするディレクトリへの http://〜 からの絶対パス
# niftyやfreeweb等、HTMLとCGIのサーバが異なる場合のみ設定が必要です。
$upurl = "";
#アップを許可するファイルの拡張子
@permitup=("gif","jpeg","jpg","png","bmp");
#最大アップサイズ(バイト単位)
$maxsize=1024000;
# 表示タイプ
# 0 そのまま表示(画像向き)
# 1 サムネイル表示(画像向き)
# 2 リンク表示(音楽向き・その他ファイル向き)
# 3 小窓を開く(音楽・その他向き・要JavaScript)
# 4 小窓にEMBEDタグを表示して、音楽や動画を再生する
# 5 自動判別(画像ならサムネイル・それ以外はリンク)
$imagetype = 5;
#表示タイプで 1 を設定した時のサムネイルの大きさ
@thumbnail = (100,100);
#サムネイルの大きさを画像サイズに合わせて調整するなら1を。
# jpg gif png bmp(Windowsフォーマット)のみ対応しています。
$autothumb = 1;
#上記で1を設定した場合の、サムネイルの長い方の辺の長さを設定します。
#
#例えば 200x150 の画像をアップした場合、
#長い200の方がここで設定する100に変更され、
#同じ倍率で150を75として表示します。
#
#画像サイズの調整ができない画像タイプの場合は、
# @thumbnail で指定した大きさで表示されます。
#
#ただし、幅・高さともに指定した値よりも小さい場合は、
#原寸で表示します。
$autothumbsize = 150;
#表示タイプで 1/2 を設定した時のリンクターゲット
$imagetarget = "_blank";
#表示タイプで 3/4 を設定した時のウィンドウの大きさ
@windowsize = (150,40);
#拡張子補完機能を使う場合は1を。
#拡張子のついていないファイルを自動的に判別します。
$exsthelp = 1;
#******************************************************************************
#これ以下は基本的に設定不要です。
#MIMEエンコードが分かる方で、特殊なファイルをアップする方だけご覧下さい。
# 表示タイプで 4 を指定した時のMIME指定
# "拡張子" => "type" で指定する。
# 各々の区切りには ,(コンマ)を使う。
%embedtype = (
"mid" => "audio/mid",
"midi" => "audio/midi",
"aif" => "audio/aiff",
"au" => "audio/basic",
"mp3" => "audio/mpeg",
"ra" => "audio/vnd.rn-realaudio",
"ram" => "audio/x-pn-realaudio",
"wav" => "audio/wav",
"avi" => "video/avi",
"mpeg" => "video/mpeg",
"mpa" => "video/mpg",
"mov" => "video/quicktime",
"rv" => "video/vnd.rn-realvideo"
);
#表示タイプで 5 を指定した時、画像としてサムネイルを表示する拡張子
%imagetype = ( "gif" => 1,
"jpg" => 1,
"jpeg" => 1,
"png" => 1,
"bmp" => 1,
"dib" => 1,
"xbm" => 1,
"tif" => 1
);
#拡張子補完用データ
#
# 以下の拡張子は追加してもうまく判断できません。
# shtml/phtml … htmlと同じMIMEであるため。
# これらは html の設定を変更することで対処できますが、
# shtml・html等は同一のタイプと判断されるため、一種類しか判別できません。
# exe等 … MIMEが application/octet-stream であるものです。
# lzh の設定をカットして、exeを追加すると対処できますが、
# サーバによっては危険なので、圧縮してアップしてもらうようにしてください。
@exsttype = (
["lzh","application/octet-stream"],
["txt","text/plain"],
["pdf","application/pdf"],
["html","text/html"],
["hdml","text/hdml"],
["jpg","image/jpg"],
["png","image/png"],
["gif","image/gif"],
["bmp","image/bmp"],
["xbm","image/x-xbitmap"],
["tif","image/tiff"],
["zip","application/zip"],
["zip","application/x-zip"],
["zip","application/x-zip-compressed"],
["gtar","application/x-gtar"],
["shar","application/x-shar"],
["tar","application/x-tar"],
["hqx","application/mac-binhex40"],
["mid","audio/mid"],
["aif","audio/aiff"],
["au","audio/basic"],
["mp3","audio/mpeg"],
["ra","audio/vnd.rn-realaudio"],
["ram","audio/x-pn-realaudio"],
["wav","audio/wav"],
["avi","video/avi"],
["mpeg","video/mpeg"],
["mpa","video/mpg"],
["mov","video/quicktime"],
["rv","video/vnd.rn-realvideo"]
);
#******************************************************************************
require $jcode;
$ENV{'TZ'}="JST-9";
srand;
$buffer = "";
$qs = "";
$a1 = $ENV{'CONTENT_LENGTH'};
binmode(STDIN);
while ($a1) {
$a1 -= sysread(STDIN, $buffer, $a1);
$qs .= $buffer;
}
$cl = $ENV{"CONTENT_LENGTH"};
if( $cl > 0 ){
read(STDIN, $qs2, $cl );
}else{
$qs2 = $ENV{"QUERY_STRING"};
}
if ($qs ne ""){
$del = substr($qs,0,index($qs,"\r\n"));
@y1=split(/$del/,$qs);
shift(@y1);
for (0 .. $#y1){
if ($y1[$_] =~ /Content-Disposition: ([^;]*); name="([^"]*)"; filename="([^"]*)/i){
$a2=$3;
$upfilename = $1 if $a2 =~ /([^\\\/]+$)/;
$upfiletype = $1 if $y1[$_] =~ /Content-Type: ([^\r|\n]*)/i;
$a1=index($y1[$_],"\r\n\r\n");
$upfile=substr($y1[$_],$a1+4,length($y1[$_])-$a1-6);
$upfilename = lc($upfilename);
}
elsif ($y1[$_] =~/Content-Disposition: ([^;]*); name="([^"]*)"/i){
$key = $2;
$a1=index($y1[$_],"\r\n\r\n");
$text=substr($y1[$_],$a1+4,length($y1[$_])-$a1-6);
$text =~ s/\r\n/\n/g;
&jcode::convert(\$text,'sjis');
$act = $text if $key eq 'act';
$name = $text if $key eq 'name';
$email = $text if $key eq 'email';
$siteurl = $text if $key eq 'siteurl';
$subject = $text if $key eq 'subject';
$msg = $text if $key eq 'msg';
$delkey = $text if $key eq 'delkey';
$wrcolor = $text if $key eq 'wrcolor';
$bgcolor = $text if $key eq 'bgcolor';
$page = $text if $key eq 'page';
$pass = $text if $key eq 'pass';
$num = $text if $key eq 'num';
$del = $text if $key eq 'del';
}
}
}else{
@contents = split(/&/,$qs2);
foreach $i (0 .. $#contents) {
local($key,$text)= split(/=/,$contents[$i]);
$text =~ s/\+/ /g;
$text =~ s/%(..)/pack("c",hex($1))/ge;
$text =~ s/[\r\n]//g;
&jcode::convert(\$text,"sjis");
$act = $text if $key eq 'act';
$name = $text if $key eq 'name';
$email = $text if $key eq 'email';
$siteurl = $text if $key eq 'siteurl';
$subject = $text if $key eq 'subject';
$msg = $text if $key eq 'msg';
$delkey = $text if $key eq 'delkey';
$wrcolor = $text if $key eq 'wrcolor';
$bgcolor = $text if $key eq 'bgcolor';
$page = $text if $key eq 'page';
$pass = $text if $key eq 'pass';
$num = $text if $key eq 'num';
$filename = $text if $key eq 'filename';
$filetype = $text if $key eq 'filetype';
}
}
$page||=0;
#環境変数取得
$ip= "$ENV{'REMOTE_ADDR'}";
$host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2);
$host||=$ip;
$referer=$ENV{'HTTP_REFERER'};
$name =~ s/</g;
$name =~ s/>/>/g;
$email =~ s/</g;
$email =~ s/>/>/g;
$siteurl =~ s/</g;
$siteurl =~ s/>/>/g;
#クッキー取得
for $xx (split(/; */, $ENV{'HTTP_COOKIE'})) {
($chname, $value) = split(/=/, $xx);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
$cookie{$chname} = $value;
}
$name||=$cookie{'name'};
$email||=$cookie{'email'};
$siteurl||=$cookie{'siteurl'};
$delkey||=$cookie{'delkey'};
$wrcolor=$cookie{'wrcolor'} if $wrcolor eq "";
$bgcolor=$cookie{'bgcolor'} if $bgcolor eq "";
$name||=$newname;
$subject||=$newsubject;
$wrcolor = 0 if $wclist[$wrcolor] eq "";
$bgcolor = 0 if $bclist[$bgcolor] eq "";
print "Set-Cookie:name=$name; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-Cookie:email=$email; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-Cookie:siteurl=$siteurl; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-Cookie:delkey=$delkey; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-Cookie:wrcolor=$wrcolor; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-Cookie:bgcolor=$bgcolor; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
$readflag = 0;
if ($adminimage == 1){
$imageflag = 0;
if ($act eq "admin"){
if ($pass ne $adminpass){
&error("パスワードが間違っています。");
}else{
$imageflag = 1;
}
}
}else{
$imageflag = 1;
}
$html_wrcolor="";
for (0 .. $#wclist){
if ($wrcolor == $_){$a1=" checked";}else{$a1="";}
$html_wrcolor.="■\n";
}
if ($act eq "help"){&help;}
elsif ($act eq "play"){&play;}
elsif ($act eq "del"){&del;}
elsif ($act eq "write"){&write;}
elsif ($act eq "res"){&res;}
&hphead;
if ($imageflag == 1){
$a1="File | |
";
}else{
$a1="";
}
#入力フォーム表示
print <
EOD
&art;
#ページリンク表示
print "
\n";
if ($page != 0){
$a1=$page-1;
print "
<<Prev Page\n";
}
if ($wrflag == 2){
if ($page != 0){print " ";}
$a1=$page+1;
print "
Next Page>>\n";
}
if ($homeback ne ""){print "
<<雲のページへ戻る";}
print "
\n";
# 削除フォーム表示
print <
EOD
&hpfoot;
#******************************************************************************
sub art{
#記事表示
if ($upurl ne ""){$a13=$upurl;}else{$a13=$updir;}
if ($readflag == 0){
open (IN,"$logfile");
eval{flock(IN,1)};
@y1=;
close (IN);
}
$ct=0;
$bfart=-1;
$resflag = 0;
$wrflag = 0;
foreach $a1(@y1){
@y2=split(/<>/,$a1);
if ($y2[1] == 0){
$ct++;
if (($ct >= $page*$pagemax+1) && ($ct <= ($page+1)*$pagemax)){
$wrflag=1;
}
elsif ($wrflag){
$wrflag=2;
}
if ($wrflag == 1) {
#親記事読みこみ
if ($bfart != -1){
#既に親記事を表示していたら、前の親記事を閉じる
if ($resflag != 0){
#レス記事を表示している場合、そのテーブルも閉じる
print "\n";
}
print <
EOD
}
$bfart=$y2[0];
$resflag = 0;
$maincolor=$y2[12];
$backcolor=$y2[13];
$style1="border-color:$sclist1[$y2[13]];border-style:solid solid solid solid;background-color: $sclist2[$y2[13]];";
$style2="border-color:$sclist1[$y2[13]];border-style:solid solid solid solid;background-color: $sclist2[$y2[13]];color:$wclist[$maincolor];";
#閉じた後に表示
$a2="";
if ($y2[5] ne ""){
$a2="[Mail] ";
}
if ($y2[6] ne ""){
$a2.="[HP] ";
}
($sec,$min,$hour,$day,$mon,$year)=localtime($y2[2]);
$year+=1900;$mon++;
# 日付0補完
if ($sec < 10){$sec="0$sec";}
if ($min < 10){$min="0$min";}
if ($hour < 10){$hour="0$hour";}
if ($day < 10){$day="0$day";}
if ($mon < 10){$mon="0$mon";}
$timeformat = "$year/$mon/$day $hour:$min";
if ($ipindicate == 1){
$y2[15] = "\n";
}else{
$y2[15]="";
}
if ($imagetype == 5){
$a12=$2 if $y2[8]=~/([^\.]*)\.(.*)/i;
if ($imagetype{$a12} == 1){$a10=1;}else{$a10=2;}
}else{
$a10=$imagetype;
}
if ($y2[8] ne ""){
if ($a10 == 0){
#画像表示
$y2[8]="
|
";
}
elsif ($a10 == 1){
#サムネイル表示
if (($y2[10] eq "") || ($y2[11] eq "")){
$y2[10]=$thumbnail[0];
$y2[11]=$thumbnail[1];
}
$y2[8]="
|
";
}
elsif ($a10 == 2){
#リンク表示
$y2[8]=" $y2[8] ($y2[9]kb)
|
";
}
elsif ($a10 == 3){
#小窓表示
$y2[8]=" $y2[8] ($y2[9]kb)
|
";
}
elsif ($a10 == 4){
# EMBED 小窓表示
$a3="";
$a3 = $1 if $y2[8] =~ /\.(\w*)/;
if ($embedtype{"$a3"} eq ""){
$a3 ="$y2[8] ($y2[9]kb)";
}else{
$a3 = "$y2[8] ($y2[9]kb)";
}
$y2[8]=" $a3
|
";
}
}
print <
\[$y2[0]\] $y2[3]
$timeformat $y2[4] $a2
|
$y2[8]
$y2[14]
$y2[15]
|
EOD
}
}else{
if ($wrflag == 1){
#レス記事の表示
if ($resflag == 0){
#レス記事テーブルオープン
print "";
$resflag = 1;
}
($sec,$min,$hour,$day,$mon,$year)=localtime($y2[2]);
$year+=1900;$mon++;
# 日付0補完
if ($sec < 10){$sec="0$sec";}
if ($min < 10){$min="0$min";}
if ($hour < 10){$hour="0$hour";}
if ($day < 10){$day="0$day";}
if ($mon < 10){$mon="0$mon";}
$timeformat = "$mon/$day $hour:$min";
if ($ipindicate == 1){
$y2[7] = "\n";
}else{
$y2[7]="";
}
print <
\[$y2[0]\] $y2[6]
$y2[7]
|
$timeformat $y2[3]
EOD
}
}
}
#ループが終ったら最後にテーブルを閉じる
if ($resflag != 0){
#レス記事を表示している場合、そのテーブルも閉じる
print " | | \n";
}
if ($ct != 0){
print <
|
EOD
}
}
#******************************************************************************
sub write{
#記事書きこみ
if (($referercheck == 1) && ($referer !~ /$scripturl/i)){
&error("別ページからの投稿は禁止されています。");
}
if ($name eq ""){&error("名前を入力してください。");}
if ($subject eq ""){&error("題名を入力してください。");}
if ($msg eq ""){&error("本文を入力してください。");}
if (length($upfile) > $maxsize){&error("画像サイズが大き過ぎます。最大$maxsizeバイトまでです。");}
if (($upfilename eq "") && ($upfile ne "")){
&error("ファイルタイプが不正です。");
}
$a1=0;
&tagcut;
if ($upfilename ne ""){
if ($upfilename =~ /[^\w\.]/){
&error("ファイル名には半角英数字・アンダーバー・ピリオドしか使用できません。");
}
($upfilename,$upfileexst)=($1,$2) if $upfilename=~/([^\.]*)\.(.*)/i;
if (($upfileexst eq "") && ($exsthelp == 1)){
#拡張子補完
for (0 .. $#exsttype){
if ($upfiletype eq $exsttype[$_][1]){
$upfileexst = $exsttype[$_][0];
last;
}
}
}
if ($upfileexst eq ""){
&error("拡張子がついていません。");
}
$flag = 0;
foreach(@permitup){
if ($upfileexst =~ /$_/i){$flag=1;last;}
}
if ($flag == 0){&error("ファイルタイプが不正です。");}
if (!-e "$updir/$upfilename\.$upfileexst"){
$upfilename="$upfilename\.$upfileexst";
}else{
$ct=0;
while(1){
if (!-e "$updir/$upfilename\_$ct\.$upfileexst"){
$upfilename="$upfilename\_$ct\.$upfileexst";
last;
}else{
$ct++;
if ($ct > 9999){last;}
}
}
}
#画像保存
open (OUT,">$updir/$upfilename");
binmode(OUT);
print OUT $upfile;
close (OUT);
chmod(0666,"$updir/$upfilename");
}
$a1="0123456789abcdefghijklmnopqrstuvwxyzABCDEGHIJKLMNOPQRSTUVWXYZ";
$a2=substr($a1,int(rand(64)),1);
$a2.=substr($a1,int(rand(64)),1);
$a9=crypt($delkey,$a2);
#画像の大きさ取得
$width="";
$height="";
if (($upfilename ne "") && ($autothumb == 1)){
if ($upfileexst eq 'png'){
$a1=0;
$a2=0;
while(1){
$a2++;
$a3=substr($upfile,$a1,4);
if (($a3 eq 'IHDR') || ($a2 > 999)){last;}
$a1+=4;
if ($a1 > 9999){last;}
}
if ($a2 < 999){
$a2=substr($upfile,$a1+4,4);
$a3=substr($upfile,$a1+8,4);
$width=ord(substr($a2,0,1))*256*256*256+ord(substr($a2,1,1))*256*256+ord(substr($a2,2,1))*256+ord(substr($a2,3,1));
$height=ord(substr($a3,0,1))*256*256*256+ord(substr($a3,1,1))*256*256+ord(substr($a3,2,1))*256+ord(substr($a3,3,1));
}
}
elsif ($upfileexst eq 'gif'){
$width=ord(substr($upfile,7,1))*256+ord(substr($upfile,6,1));
$height=ord(substr($upfile,9,1))*256+ord(substr($upfile,8,1));
}
elsif (($upfileexst eq 'jpg') || ($upfileexst eq 'jpeg')){
open (SIZE,"$updir/$upfilename");
binmode(SIZE);
read(SIZE,$a1,20);
$aaa=0;
while (1) {
$aaa++;
last if $aaa > 9999;
$a2=4;
read(SIZE,$a1,$a2);
($a3,$a4,$a2)=unpack("a a n",$a1);
if ((ord($a4) >= 0xC0) && (ord($a4) <= 0xC3)){
$a2=5;
read(SIZE,$a1,$a2);
($height,$width)=unpack("xnn",$a1);
last;
}else{
read(SIZE,$a1,($a2-2));
}
}
close (SIZE);
}
elsif (($upfileexst eq 'bmp') || ($upfileexst eq 'dib')){
$width=ord(substr($upfile,21,1))*256*256*256+ord(substr($upfile,20,1))*256*256+ord(substr($upfile,19,1))*256+ord(substr($upfile,18,1));
$height=ord(substr($upfile,25,1))*256*256*256+ord(substr($upfile,24,1))*256*256+ord(substr($upfile,23,1))*256+ord(substr($upfile,22,1));
}
if (($width ==0) || ($height == 0)){$width=$height="";}
if (($width ne "") && ($height ne "")){
if (($width >= $autothumbsize) && ($height >= $autothumb)){
if ($width >= $height){
$a1=$autothumbsize/$width;
$width=$autothumbsize;
$height=int($height*$a1);
}else{
$a1=$autothumbsize/$height;
$height=$autothumbsize;
$width=int($width*$a1);
}
}
}
}
#ログ保存
$ct=-1;
@y1=();
$a2=-1;
$a3="";
$size=int(length($upfile)/1024*10)/10;
open (IO,"+<$logfile");
eval{flock(IO,2)};
while(){
$a1=$_;
@y2=split(/<>/,$a1);
if ($y2[0] >= $ct){$ct=$y2[0]+1;}
if ($y2[2] > $a2){$a2=$y2[2];$a3=$y2[14];}
push(@y1,$a1);
}
if (($doubleerror == 1) && ($a3 eq $msg)){
close (IO);
unlink("$updir/$upfilename");
&error("二重投稿は禁止されています。");
}
if ($ct < 0){$ct=1;}
truncate(IO,0);
seek(IO,0,0);
unshift(@y1,"$ct<>0<>" . time() . "<>$subject<>$name<>$email<>$siteurl<>$a9<>$upfilename<>$size<>$width<>$height<>$wrcolor<>$bgcolor<>$msg<>$ip/$host<>\n");
$ct=0;
for (0 .. $#y1){
if ($y1[$_] eq ""){next;}
@y2=split(/<>/,$y1[$_]);
if ($y2[1] == 0){$ct++;}
if ($ct > $logmax){
if (($y2[1] == 0) && ($y2[8] ne "")){
unlink("$updir/$y2[8]");
splice(@y1,$_,1);
redo;
}
}else{
print IO $y1[$_];
}
}
close (IO);
$readflag=1;
}
#******************************************************************************
sub res{
#レス書きこみ
if ($name eq ""){&error("名前を入力してください。");}
if ($msg eq ""){&error("MESSAGE REQUIRED");}
&tagcut;
$a1="0123456789abcdefghijklmnopqrstuvwxyzABCDEGHIJKLMNOPQRSTUVWXYZ";
$a2=substr($a1,int(rand(64)),1);
$a2.=substr($a1,int(rand(64)),1);
$a4=crypt($delkey,$a2);
$a5=time();
#ログ保存
$ct=-1;
@y1=();
$a2=-1;
$a3="";
$size=int(length($upfile)/1024*10)/10;
open (IO,"+<$logfile");
eval{flock(IO,2)};
while(){
$a1=$_;
@y2=split(/<>/,$a1);
if ($y2[0] >= $ct){$ct=$y2[0]+1;}
if ($y2[2] > $a2){$a2=$y2[2];$a3=$y2[6];}
push(@y1,$a1);
}
if (($doubleerror == 1) && ($a3 eq $msg)){
close (IO);
&error("DO NOT SEND MESSAGE TWICE");
}
@y3=();
truncate(IO,0);
seek(IO,0,0);
if ($resmove == 0){
#レスがあっても移動せず
$flag = 0;
foreach(@y1){
@y2=split(/<>/,$_);
if (($flag == 1) && ($y2[1] == 0)){
print IO "$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n";
push(@y3,"$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n");
$flag = 2;
}
if (($y2[0] == $num) && ($flag ==0)){
$flag=1;
}
print IO $_;
push(@y3,$_);
}
if ($flag == 1){
print IO "$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n";
push(@y3,"$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n");
}
}else{
#レスがあったら移動
$flag =0;
for (0 .. $#y1){
if ($y1[$_] eq ""){next;}
@y2=split(/<>/,$y1[$_]);
if (($flag == 1) && ($y2[1] == 0)){
last;
}
if ($y2[0] == $num){
$flag=1;
}
if ($flag){
print IO $y1[$_];
push(@y3,$y1[$_]);
splice(@y1,$_,1);
redo;
}
}
print IO "$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n";
push(@y3,"$ct<>1<>$a5<>$name<>$a4<>$wrcolor<>$msg<>$ip/$host<>\n");
foreach(@y1){
@y2=split(/<>/,$_);
print IO $_;
push(@y3,$_);
}
}
close (IO);
$readflag=1;
@y1=();
@y1=@y3;
@y3=();
}
#******************************************************************************
sub del{
#記事削除
if ($num eq ""){&error("記事番号を入力してください。");}
if ($pass eq ""){&error("削除キーを入力してください。");}
@y1=@y3=();
$ct=0;
$ct2=0;
open (IO,"+<$logfile");
eval{flock(IO,2)};
while(){
push(@y1,$_);
@y2=split(/<>/,$_);
if ($y2[0] == $num){@y3=@y2;$ct2=$ct;}
$ct++;
}
if ($y3[0] eq ""){&error("記事番号が不正です。");}
if (($y3[1] == 1) && ($del == 1)){&error("レス記事のファイル削除は出来ません。");}
elsif(($y3[8] eq "") && ($del == 1)){&error("ファイルが設定されていません。");}
if ($y3[1] == 0){$a1=$y3[7];}else{$a1=$y3[4];}
if ((crypt($pass,$a1) ne $a1) && ($pass ne $adminpass)){
&error("削除キーが間違っています。");
}
truncate(IO,0);
seek(IO,0,0);
if ($y3[10] eq ""){
#レス記事削除
foreach(@y1){
@y2=split(/<>/,$_);
if ($y2[0] != $num){print IO;}
}
close (IO);
&error("$num番の記事を削除しました。");
}else{
unlink("$updir/$y3[8]");
$y1[$ct2]="$y3[0]<>$y3[1]<>$y3[2]<>$y3[3]<>$y3[4]<>$y3[5]<>$y3[6]<>$y3[7]<><>$y3[9]<>$y3[10]<>$y3[11]<>$y3[12]<>$y3[13]<>$y3[14]<>$y3[15]<><><>\n";
if ($del == 1){
#ファイルだけ削除
print IO @y1;
close (IO);
&error("$num番のファイルを削除しました。");
}else{
#レスごと削除
if ($ct2 != 0){
for (0 .. $ct2-1){
print IO $y1[$_];
}
}
$flag = 0;
for ($ct2+1 .. $#y1){
if ($flag == 0){
@y2=split(/<>/,$y1[$_]);
if ($y2[1] == 0){
$flag=1;
}
}
if ($flag){
print IO $y1[$_];
}
}
close (IO);
&error("$num番とそのレス記事を削除しました。");
}
}
}
#******************************************************************************
sub play{
#小窓表示
print "Content-type:text/html; charset=shift_jis\n\n";
print <
$filename
EOD
if ($upurl ne ""){
print "