#! /usr/local/bin/perl

#
#	͂Ղ Final Beta #3 (Preview Release 2)
#	 (f{)
#

###############################################################################
#  ݒ
###############################################################################

# Ǘ҃pX[h (bbspass.cgiŐꂽLq)
$adminpost = '';

# fCGIURL
$cgiurl = 'http://cgi.iwa.server.ne.jp/strangeworld/bbs.cgi';

# Ǘc[̃t@C
$admincgi = 'bbsadmin.cgi';

# jcode.pl̃pX
$jcode = './jcode.pl';

# gzip̃pX
#  (gzipk]@\gpȂꍇ͋̂܂܂ɂĂ܂)
$gzip = '/usr/bin/gzip';

# CGIݒuzXgAhX
$bbshost = 'cgi.iwa.server.ne.jp';

# Ot@C
$logfilename = './bbs.log';

# JE^[̃X^[gt
$countdate = '2000/01/05';

# JE^[̃t@C̐擪
$countfile = './count1/count';

# JE^[̉ɂx
$countlevel = 3;

# bZ[W̕ۑ
$logsave = 300;

# Pʂɕ\郁bZ[W̕\
#  (1`bZ[W̕ۑ)
$msgdisp = 30;

# T[o[ݒuꏊƓ{Ƃ̎
#   {             : 0
#   OjbWW : -9
#   AJ         : -14 (Vg)
#                    : -20 (~bhEF[)
#   j[W[h : 3
$difftime = 0;

# f̖O
$bbstitle = 'ǂ[ǁɂ';

# wiF
$bgc    = '004040';

# eLXgF
$textc  = 'ffffff';

# pseLXgF
$quotc  = 'ffffff';

# NF
$linkc  = 'eeffee';
$vlinkc = 'dddddd';
$alinkc = 'ff0000';

# 薼̐F
$subjc  = 'fffffe';

# tH[eʃ{^ɕ\镶
$txtfollow = '';

# ʃtH[e{^ɕ\镶
$txtfollow2 = '';

# eҌ{^ɕ\镶
$txtauthor = '';

# Xbh\{^ɕ\镶
$txtthread = '';

# Xbh\{^ɕ\镶
$txtthread2 = '';


# tH[eɑ̓eҖɕt镶
# iʂ̌fł́uvȂǂtƗǂł傤j
$fsubj = '';

# ߋO̔wiF
$oldlogbgc = '004040';

# ߋOۑpfBNg̖O
$oldlogfiledir = './log/';

# ߋÕtH[eEeҌ
#   0 : s
#   1 : 
$oldlogbtn = 1;

# ߋO̕ۑ@
#   0 : 
#   1 : 
$oldlogsavesw = 0;

# ߋO̕ۑ
#  (ߋOۑPʂ̏ꍇɂ̂ݗL)
$oldlogsaveday = 10;

# ߋO̍őt@CTCY
$maxoldlogsize = 4 * 1024 * 1024;

#d݃`FbN
$checkcount = 30;

# PbZ[W̍ő包
$maxmsgcol = 192;

# PbZ[W̍ős
$maxmsgline = 100;

# PbZ[W̍őTCY(byte)
$maxmsgsize = 8400;

# Aeh~R[hiKύX邱Ɓj
$protect_a = ;	# W̐
$protect_b = ;		# Q̐

$pstime = 5;
$pltime = 3600;

# N@\̏l
#   0 : 
#   1 : L
$autolink = 1;

# tH[eʕ\
#   0 : VKEBhEI[vĕ\
#   1 : ʂɕ\
$followwin = 0;

# eIPAhX̋L^
#   0 : L^Ȃ
#   1 : vNV̂݋L^
#   2 : SċL^
$iprec = 0;

# User Agent(uEU)̋L^
#   0 : 
#   1 : L
$uarec = 0;

# Ǘl̖O
$adminname = 'Ǘl';

# Ǘl̃[AhX
$adminmail = 'webmaster@iwa.server.ne.jp';

# f[^̎n@
$formmethod = 'post';

### ɂ߃JX^
# 摜WJview-source̗L
#   0 : 
#   1 : L
$animeauto = 1;

### ɂ߃JX^
# 摜WJ̏l
#   0 : 
#   1 : L
$autoimg = 0;

### ɂ߃JX^
# view-source`FbN̏l
#   0 : 
#   1 : L
$autovs = 0;


###############################################################################
#  tH[}bgϊ
###############################################################################

sub getnowdate {
	
	( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdat )
		= localtime ( $_[0] );
	$year += 1900;
	$mon++;
	$nowdate = sprintf ( "%d/%02d/%02d(%s)%02d%02d%02db", 
		$year, $mon, $mday, 
		( '', '', '', '', '', '', 'y' )[$wday],
		$hour, $min, $sec );
}


###############################################################################
#  tH[f[^擾
###############################################################################

sub getformdata {
	
	#my ( $buf, $name, $value );
	my ( $name, $value );
	
	if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) {
		read ( STDIN, $buf, $ENV{'CONTENT_LENGTH'} );
	} else {
		$buf = $ENV{'QUERY_STRING'};
	}
	
	if ( $buf ne '' ) {
		
		&prterror ( 'ĂяosłB' ) 
		  if ( $ENV{'HTTP_HOST'} ne '' && ! ( $ENV{'HTTP_HOST'} =~ /$bbshost/i ) );
		
		$referer = $ENV{'HTTP_REFERER'};
		$referer =~ s/\+/ /g;
		$referer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;
		
		foreach ( split ( /&/, $buf ) ) {
			( $name, $value ) = split ( /=/ );
			$value =~ s/\+/ /g;
			$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;
			$value =~ s/&/&amp;/g;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/\r\n/\r/g;
			$value =~ s/\n/\r/g;
			$value =~ s/\r$//;
			$value =~ s/\,/\0/g;
			$FORM{$name} = $value;
		}
		
		if ( $FORM{'charchk'} ne '' && $FORM{'message'} ) {
			require "$jcode";
			foreach ( keys %FORM ) {
				&jcode'convert ( *FORM{$_}, 'sjis' );
			}
		}
	}
}


###############################################################################
#  ϐ擾
###############################################################################

sub getenv {
	
	if ( $uarec ) {
		$agent = $ENV{'HTTP_USER_AGENT'};
		$agent =~ s/</&lt;/g;
		$agent =~ s/>/&gt;/g;
		$agent =~ s/,/./g;
	}
	
	if ( $iprec == 0 ) { return; }
	
	$addr = $ENV{'REMOTE_ADDR'};
	$host = $ENV{'REMOTE_HOST'};
	if ( $addr eq $host || $host eq '' ) {
		$host = gethostbyaddr ( pack ( 'C4', split ( /\./, $addr ) ), 2 ) || $addr;
	}
	
	$proxyflg = 0;
	
	if ( $ENV{'HTTP_CACHE_CONTROL'} ne '' )			{ $proxyflg = 1; }
	if ( $ENV{'HTTP_CACHE_INFO'} ne '' )			{ $proxyflg += 2; }
	if ( $ENV{'HTTP_CLIENT_IP'} ne '' )				{ $proxyflg += 4; }
	if ( $ENV{'HTTP_FORWARDED'} ne '' )				{ $proxyflg += 8; }
	if ( $ENV{'HTTP_FROM'} ne '' )					{ $proxyflg += 16; }
	if ( $ENV{'HTTP_PROXY_AUTHORIZATION'} ne '' )	{ $proxyflg += 32; }
	if ( $ENV{'HTTP_PROXY_CONNECTION'} ne '' )		{ $proxyflg += 64; }
	if ( $ENV{'HTTP_SP_HOST'} ne '' )				{ $proxyflg += 128; }
	if ( $ENV{'HTTP_VIA'} ne '' )					{ $proxyflg += 256; }
	if ( $ENV{'HTTP_X_FORWARDED_FOR'} ne '' )		{ $proxyflg += 512; }
	if ( $ENV{'HTTP_X_LOCKING'} ne '' )				{ $proxyflg += 1024; }
	if ( $agent =~ /cache|delegate|gateway|httpd|proxy|squid|www|via/i ) {
		$proxyflg += 2048;
	}
	if ( $host =~ /cache|^dns|dummy|^ns|firewall|gate|keep|mail|^news|pop|proxy|smtp|w3|^web|www/i ) {
		$proxyflg += 4096;
	}
	if ( $host eq $addr ) {
		$proxyflg += 8192;
	}
	
	$realaddr = '';
	$realhost = '';
	if ( $proxyflg > 0 ) {
		
		if ( $ENV{'HTTP_X_FORWARDED_FOR'} =~
		  s/^(\d+)\.(\d+)\.(\d+)\.(\d+).*/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_FORWARDED'} =~ 
		  s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_VIA'} =~
		  s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_CLIENT_IP'} =~
		  s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_SP_HOST'} =~
		  s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_FORWARDED'} =~ s/.*\sfor\s(.+)/$1/ ) {
			$realhost = "$1";
		} elsif ( $ENV{'HTTP_FROM'} =~ s/\-\@(.+)/$1/ ) {
			$realhost = "$1";
		}
		
		if ( $realaddr eq '' && $realhost ne '' ) {
			$realpackaddr = gethostbyname ( $realhost );
			( $a, $b, $c, $d ) = unpack ( 'C4', $realpackaddr );
			$realaddr = "$a.$b.$c.$d";
		}
		
		if ( $realaddr ne '' && $iprec != 2 ) {
			$host = '(leak)';
		}
	} else {
		$host = '(none)' if ( $iprec != 2 );
	}
}


###############################################################################
#  ̃GR[h
###############################################################################

sub escstring {
	
	my ( $srcstr ) = $_[0];
	
	$srcstr =~ s/([^a-zA-Z0-9\s])/sprintf ( "%%%lx", ( unpack ( "C", $1 ) ) )/eg;
	$srcstr =~ s/ /\+/g;
	
	return $srcstr;
}


###############################################################################
#  bZ[Wǂݍ
###############################################################################

sub loadmessage {
	
	if( $FORM{'file'} eq '' ) {
		open ( READLOG, "$logfilename" ) || &prterror ( 'bZ[Wǂݍ݂Ɏs܂' );
	} else {
		open ( READLOG, "$FORM{'file'}" ) || &prterror ( 'bZ[Wǂݍ݂Ɏs܂' );
	}
	eval 'flock ( READLOG, 1 )';
	seek ( READLOG, 0, 0 );
	@logdata = <READLOG>;
	eval 'flock ( READLOG, 8 )';
	close ( READLOG );
}


###############################################################################
#  bZ[WP擾
###############################################################################

sub getmessage {
	
	( $ndate, $postid, $protect, $thread, $host, $agent, $user, $mail, $title, $msg )
	  = split ( /\,/, $_[0] );
	$msg =~ s/\n$//;
	$title =~ s/\0/\,/g;
	$mail =~ s/\0/\,/g;
	$user =~ s/\0/\,/g;
	$msg =~ s/\0/\,/g;
	$wdate = &getnowdate ( $ndate );
}


###############################################################################
#  bZ[WPo
###############################################################################

sub prtmessage {
	
	my $mode = $_[0];
	my $file = $_[1];
	my ( $tag, $refdate, $prtmessage, $btn, $btnfollow, $btnfollow2, $btnauthor, $btnthread, $btnthread2 );
	
	#$title =~ s/\0/\,/g;
	#$mail =~ s/\0/\,/g;
	#$user =~ s/\0/\,/g;
	#$msg =~ s/\0/\,/g;

	### autoimg ǉ ###
	#
	# jpg  gif ̎̂ݓWJiPNG͒ǉȂj
	#
	if ( mode == 0 ) {
		if ( $autoimg eq '1' || $FORM{'autoimg'} ) {
			if ( $msg !~ /\?/g ) {
				$msg =~ s#<a href=\"http://((=[\x21-\xfc]+|[\x21-\x7e])+(jpg|gif))\" target=\"link\">http://((=[\x21-\xfc]+|[\x21-\x7e])+(jpg|gif))</a>#<img src=\"http://$1\" alt=\"http://$1\">#ig;
			}
		}
	}

	### peLXgFς ###
	#
	if ( mode == 0 ) {
		$msg=~s/(^|\r)(&gt;[^\r]*)/$1<font color=\"#$quotc\">$2<\/font>/g;
		$msg=~s/<\/font>\r<font color=\"#$quotc\">/\r/g;
	}

	# uQlv
	if ( $mode == 0 ) {
		$msg =~ s/<A href=\"mode=follow\&search=(.*)\&ref=(.*)\">(.*)<\/A>/<A href=\"$cgiurl\?bgcolor=$bgc\&mode=follow\&search=$1\&ref=$2\">$3<\/A>/i;
	} else {
		$msg =~ s/<A href=\"mode=follow\&search=(.*)\&ref=(.*)\">(.*)<\/A>/<A href=\"#$1\">$3<\/A>/i;
	}

	$prtmessage = $msgtemp;
	
	if ( $mode == 0 || ( $mode == 1 && $oldlogbtn == 1 ) ) {
		
		# tH[e{^
		$btnfollow = "<A href=\"$cgiurl\?mode\=follow\&username=".
		  &escstring ( $FORM{'username'} ) .
		  "&msgdisp=$FORM{'msgdisp'}&postid=$toppostid&search\=$postid\&".
		  "file=$file\&autoimg=$FORM{'autoimg'}\&autolink=$FORM{'autolink'}\&custom\=$FORM{'custom'}\"";
		if ( $followwin == 0 ) {
			$btnfollow .= " target=\"link\"";
		}
		$btnfollow .= ">$txtfollow</A>@\n";
		
		#ʃtH[e{^
		$btnfollow2 = "<A href=\"$cgiurl\?mode\=follow2\&username=".
		  &escstring ( $FORM{'username'} ) .
		  "&msgdisp=$FORM{'msgdisp'}&postid=$toppostid&search\=$postid\&".
		  "file=$file\&autoimg=$FORM{'autoimg'}\&autolink=$FORM{'autolink'}\&custom\=$FORM{'custom'}\"";
		$btnfollow2 .= ">$txtfollow2</A>@\n";
		
		# eҌ{^
		$btnauthor = "<A href=\"$cgiurl\?mode\=search\&search\=".
		  &escstring ( $user ) .
		  "\&file=$file\&autoimg=$FORM{'autoimg'}\&autolink=$FORM{'autolink'}\&custom=$FORM{'custom'}\"".
		  " target=\"link\">$txtauthor</A>@\n";
		
		# Xbh\{^
		if ( $thread ) {
			$btnthread = "<A href=\"$cgiurl\?mode\=thread\&custom=$FORM{'custom'}".
			  "\&file=$file\&search\=$thread\" target=\"link\">$txtthread</A>@\n";
			$btnthread2 = "<A href=\"$cgiurl\?mode\=thread2\&custom=$FORM{'custom'}".
			  "\&file=$file\&search\=$thread\" target=\"link\">$txtthread2</A>\n";
		} else {
			$btnthread = '';
		}
		
		$btn = "@\n  $btnfollow  $btnfollow2  $btnauthor  $btnthread  $btnthread2";
	} else {
		$btn = '';
	}
	
	# [AhX
	if ( $mail ) {
		$user = "<A href=\"mailto\:$mail\">$user<\/A>";
	}
	
	# bZ[W\e`
	$prtmessage = <<__EOF__;
<FONT size="+1" color="#$subjc"><B>$title</B></FONT>
@eҁF<B>$user</B>
@<FONT size="-1">eF$wdate$btn</FONT>
<BLOCKQUOTE>
<PRE>
$msg
</PRE>
</BLOCKQUOTE>
<HR>
__EOF__
	
	return $prtmessage;
}


###############################################################################
#  ɂJE^[
###############################################################################

sub counter {
	
	my ( @count, @filenumber, @sortedcount, $maxcount, $mincount );
	
	for ( $i = 0 ; $i < $countlevel ; $i++ ) {
		open ( IN, "$countfile$i.dat" );
		$count[$i] = <IN>;
		$filenumber{$count[$i]} = $i;
		close ( IN );
	}
	
	@sortedcount = sort { $a <=> $b; } @count;
	$maxcount = $sortedcount[$countlevel-1];
	$mincount = $sortedcount[0];
	
	$maxcount++;
	
	open ( OUT, ">$countfile$filenumber{$mincount}.dat" );
	print OUT $maxcount;
	close ( OUT );
	
	return $maxcount;
}


###############################################################################
#  G[bZ[W\
###############################################################################

sub prterror {
	
	my $error = $_[0];
	
	print <<__EOF__;
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>$bbstitle (error)</TITLE>
</HEAD>
$body
<H3>$error</H3>
</BODY>
</HTML>
__EOF__
	
	exit;
}


###############################################################################
#  tH[ʕ\
###############################################################################

sub prtfollow {
	
	my $retry = $_[0];
	my $success = 0;
	my $formmsg;
	
	&loadmessage( "$FORM{'file'}" );
	
	&prterror ( 'p[^܂B' ) if ( $FORM{'search'} eq '' );
	
	print "<html><head><title>$bbstitle</title></head>\n$body\n<hr>\n";
	
	foreach ( 0 .. @logdata - 1 ) {
		&getmessage ( $logdata[$_] );
		if ( $postid eq $FORM{'search'} ) {
			$success = 1;
			last;
		}
		$i++;
	}
	
	if ( $success == 0 ) {
		print "<h3>w肳ꂽbZ[W܂B</h3><body></html>";
		exit;
	}
	
	if ( $retry == 0 ) {
		$formmsg = $msg;
		#$formmsg =~ s/\0/\,/g;
		$formmsg =~ s/\r\r\<A href\=\S+\>QlF.*\<\/A\>//i;
		$formmsg =~ s/\<A href\=\S+ target\=\"link\"\>(\S+)\<\/A\>/$1/ig;
		$formmsg =~ s/\r/\r&gt; /g;
		$formmsg = "&gt; $formmsg\r";
		$formmsg =~ s/&gt; &gt; &gt;.*?\r//g;
		$formmsg =~ s/\r&gt;\s+\r/\r/g;
	} else {
		$formmsg = $FORM{'message'};
	}
	
	print &prtmessage ( 0, "$FORM{'file'}" );
	
	if ( $thread eq '' ) {
		$thread = $postid;
	}
	
	if ( $user =~ /\<A\shref=\"mailto\:.*\"\>(.*)\<\/A\>/ ) {
		$user = $1;
	}
	print "tH[Le<br>";
	&prtform ( "$user$fsubj", "$formmsg\r", '' );
	
	print <<__EOF__;
  <BR>
  <INPUT type=\"hidden\" name=\"msgdisp\" value=\"$FORM{'msgdisp'}\">
  <FONT size="-1">URLN <INPUT type=\"checkbox\" name=\"autolink\" value=\"checked\" $FORM{'autolink'}></FONT><BR>
  <INPUT type=\"hidden\" name=\"autoimg\" value=\"$FORM{'autoimg'}\">
  <INPUT type=\"hidden\" name=\"postid\" value=\"$FORM{'postid'}\">
  <INPUT type=\"hidden\" name=\"search\" value=\"$FORM{'search'}\">
__EOF__

	if( $FORM{'mode'} eq 'follow2' ) {
		print "<INPUT type=\"hidden\" name=\"follow2\" value=\"1\">";
	}

	print <<__EOF__;
  <INPUT type=\"hidden\" name=\"thread\" value=\"$thread\">
  <INPUT type=\"hidden\" name=\"follow\" value=\"$postid:$wdate\">
  <HR>
</FORM>
</BODY>
</HTML>
__EOF__
	
	exit;
}


###############################################################################
#  bZ[W`FbN
###############################################################################

sub chkmessage {
	
	my ( @hostbin, $admincheck, $adminfname );
	
	if ( ! ( $referer =~ /$cgiurl/i ) ) {
		&chkerror ( "eʂ̂tqk<br>$cgiurl<br>" .
		  'ȊO̓e͂ł܂B',  3 );
	}
	
	$i = 0;
	foreach ( split ( /\r/, $FORM{'message'} ) ) {
		if ( length ( $_ ) > $maxmsgcol ) {
			$i++;
		}
	}
	if ( $i != 0 ) { &chkerror ( 'eě傫܂B', 10 ); }
	
	if ( ( $FORM{'message'} =~ tr/\r/\r/ ) > ( $maxmsgline - 1 ) ) {
		&chkerror ( 'ee̍s傫܂B', 11 );
	}
	
	if ( length ( $FORM{'message'} ) > $maxmsgsize ) {
		&chkerror ( 'ee傫܂B', 12 );
	}
	
	if ( $FORM{'protect'} ne '' ) {
		@hostbin = split ( /\./, $ENV{'REMOTE_ADDR'} );
		for ( $i = 0 ; $i < 4 ; $i++ ) {
			$hostbin[$i] = vec ( pack ( 'C4', $hostbin[$i] ), 0, 8 );
		}
		$protect_c = $hostbin[0] ^ $hostbin[1] ^ $hostbin[2] ^ $hostbin[3];
		$pcheck = ( $FORM{'protect'} - $protect_c ) / $protect_b - $protect_a;
		&getnowdate ( $pcheck );
		if ( ( $sec  < 0 ) || ( $sec  > 60 ) || 
		  ( $min  < 0 ) || ( $min  > 60 ) ||
		  ( $hour < 0 ) || ( $hour > 24 ) ) {
			&chkerror ( '', 32 );
		}
		if ( ( $nowtime - $pcheck ) < $pstime ) {
			&chkerror ( 'x蒼ĉB', 30 );
		}
		if ( ( $nowtime - $pcheck ) > $pltime ) {
			&chkerror ( '', 31 );
			if ( $FORM{'follow'} ne '' ) {
				&prtfollow ( 1 );
			} else {
				&prtmain ( $FORM{'title'}, $FORM{'message'}, $FORM{'linkurl'} );
			}
			exit;
		}
	} else {
		&chkerror ( 'tH[f[^̈ꕔɌ܂Bx蒼ĉB', 33 );
	}
	
	if ( $FORM{'mailaddr'} =~ / /i ) {
		$FORM{'mailaddr'} = '';
	}
	if ( $FORM{'mailaddr'} ne '' ) {
#		if ( ! ( $FORM{'mailaddr'} =~ /(.*)\@(.*)\.(.*)/ ) ) {
		if ( ! ( $FORM{'mailaddr'} =~ /.*\@.*\..*/ ) ) {
			&chkerror ( '[AhX͂Ă܂B', 20 );
		} elsif ( $FORM{'mailaddr'} =~ /,/ ) {
			&chkerror ( '[AhX͕wł܂B', 21 );
		}
	}
	
	if ( $FORM{'title'} eq '' ) {
		$FORM{'title'} = ' ';
	}
	
	if ( $FORM{'username'} eq '' ) {
		$FORM{'username'} = '@';
	}
	
	if ( crypt ( "[$FORM{'username'}]", 'r7' ) eq $adminpost ) {
		$FORM{'username'} = $adminname;
		$FORM{'mailaddr'} = $adminmail;
	} else {
		if ( $FORM{'username'} eq $adminpost ) {
			$FORM{'username'} = "$adminnameinJ[j";
		}
		$adminfname = $adminname;
		$adminfname =~ s/\x5b/\\x5b/g;
		if ( $FORM{'username'} =~ /$adminfname/i ) {
			$admincheck = $FORM{'username'};
			$admincheck =~ s/ //g;
			$admincheck =~ s/@//g;
			$admincheck =~ s/_//g;
			if ( $admincheck eq $adminname ) {
				$FORM{'username'} =~ s/$adminfname/$adminnameixj/;
			}
		}
	}
	
	if ( $FORM{'autolink'} eq 'checked' ) {
		$FORM{'message'} =~ s#((https?|ftp|gopher|telnet|whois|news)://(=[\x21-\xfc]+|[\x21-\x7e])+)#<A href="$1" target="link">$1</A>#ig;
	}
	
	if ( $FORM{'linkurl'} =~ '^\w+\:\/\/$' || $FORM{'linkurl'} =~ /\s+/ || $FORM{'linkurl'} eq '' ) {
		$FORM{'linkurl'} = '';
	} else {
		$FORM{'linkurl'} =~ s/http:\/\/http:\/\//http:\/\//;
		$FORM{'message'} .= "\r\r<A href=\"$FORM{'linkurl'}\" target=\"link\">$FORM{'linkurl'}</A>";
	}
	if ( $FORM{'follow'} ne '' ) {
		( $i, $j ) = split ( /:/, $FORM{'follow'} );
		$FORM{'message'} .= "\r\r<A href=\"mode=follow\&search=$i\&ref=$j\">QlF$j</A>";
	}
}


###############################################################################
#  bZ[W`FbNG[
###############################################################################

sub chkerror {
	
	my $errstr = $_[0];
	$posterr = $_[1];
	
	&prterror ( $errstr ) if ( $errstr ne '' );
}


###############################################################################
#  bZ[Wo^
###############################################################################

sub putmessage {
	
	my $oldlogext;
	
	open ( FLOG, "+<$logfilename" ) || &prterror ( 'bZ[Wǂݍ݂Ɏs܂' );
	eval 'flock ( FLOG, 2 )';
	seek ( FLOG, 0, 0 );
	@logdata = <FLOG>;
	
	$i = 0;
	$posterr = 0;
	while ( $i < $logsave && $posterr == 0 ) {
		@items = split ( /\,/, $logdata[$i] );
		$items[9] =~ s/\n$//;
		$posterr = 1 if ( $i < $checkcount && $FORM{'message'} eq $items[9] );
		$posterr = 2 if ( $FORM{'protect'} eq $items[2] );
		$i++;
	}
	
	if ( $posterr == 0 ) {
		
		@items = split ( /\,/, $logdata[0] );
		$newpostid = $items[1] + 1;
		$msgdata = "$nowtime,$newpostid,$FORM{'protect'},$FORM{'thread'},$host,$agent,$FORM{'username'},$FORM{'mailaddr'},$FORM{'title'},$FORM{'message'}\n";
		
		@logdata = @logdata[0 .. $logsave - 2] if ( @logdata >= $logsave );
		unshift ( @logdata, $msgdata );
		
		$oldstream = select ( FLOG );
		$| = 1;
		seek ( FLOG, 0, 0 );
		truncate ( FLOG, 0 );
		print FLOG @logdata;
		eval 'flock ( FLOG, 8 )';
		close ( FLOG );
		
		select ( $oldstream );
		
		&getnowdate ( $nowtime );
		
		# ߋOo
		if ( $oldlogfiledir ne '' ) {
			
			if ( $oldlogsavesw == 0 ) {
				$oldlogfilename = sprintf ( "%s/%d%02d%02d.dat",
				  $oldlogfiledir, $year, $mon, $mday );
			} else {
				$oldlogfilename = sprintf ( "%s%d%02d.dat",
				  $oldlogfiledir, $year, $mon );
			}
			
			open ( CLOG, ">>$oldlogfilename" ) || &prterror ( 'ߋOo͂Ɏs܂' );
			eval 'flock ( CLOG, 2 )';
			
			$oldstream = select ( CLOG );
			$| = 1;
			print CLOG $msgdata;
			eval 'flock ( CLOG, 8 )';
			close ( CLOG );
			
			select ( $oldstream );
			
			chmod 0400, $logfilename if ( ( -s $oldlogfilename ) > $maxoldlogsize );
			
			&getnowdate ( time + $difftime - $oldlogsaveday * 60 * 60 * 24 );
			$oldlogfilename = sprintf (  "%s/%d%02d%02d.*",
			  $oldlogfiledir, $year, $mon, $mday );
			unlink $oldlogfilename;
		}
		
	} else {
		eval 'flock ( FLOG, 8 )';
		close ( FLOG );
		
		if ( $posterr == 2 ) {
			&chkerror ( '', $posterr );
			if ( $FORM{'follow'} ne '' ) {
				&prtfollow ( 1 );
			} else {
				&prtmain ( $FORM{'title'}, $FORM{'message'}, $FORM{'linkurl'} );
			}
			exit;
		}
	}
}


###############################################################################
#  veNgR[h
###############################################################################

sub pcode {
	
	my ( @hostbin, @pkey, @pkeystr, @apkey );
	srand ( time | $$ );
	
	$nowtime = time - $difftime * 60 * 60;
	@hostbin = split ( /\./, $ENV{'REMOTE_ADDR'} );
	for ( $i = 0 ; $i < 4 ; $i++ ) {
		$hostbin[$i] = vec ( pack ( 'C4', $hostbin[$i] ), 0, 8 );
	}
	$protect_c = $hostbin[0] ^ $hostbin[1] ^ $hostbin[2] ^ $hostbin[3];
	$pkey[0] = ( $nowtime + $protect_a ) * $protect_b + $protect_c;
	$pkey[1] = $pkey[0] - int ( rand ( 64 ) );
	$pkey[2] = $pkey[1] + int ( rand ( 128 ) );
	
	$pkeystr[0] = "\n  <INPUT type=\"hidden\" name=\"protect\" value=\"$pkey[0]\">\n";
	$pkeystr[1] = "  <!--\n  <INPUT type=\"hidden\" name=\"protect\" value=\"$pkey[1]\">\n  -->";
	$pkeystr[2] = "  <!--\n  <INPUT type=\"hidden\" name=\"protect\" value=\"$pkey[2]\">\n  -->";
	
	push ( @apkey, splice ( @pkeystr, rand ( @pkeystr ), 1 ) ) while @pkeystr;
	@pkeystr = @apkey;
	
	return "$pkeystr[0]$pkeystr[1]$pkeystr[2]";
}


###############################################################################
#  tH[\
###############################################################################

sub prtform {
	
	my $dtitle = $_[0];
	my $dmsg = $_[1];
	my $dlink = $_[2];
	
	# veNgR[h
	my $ptext = &pcode;
	
	if ( $FORM{'mode'} eq 'rom' ) {
		print <<__EOF__;
<FORM method="$formmethod" action="$cgiurl">
  <INPUT type="hidden" name="mode" value="rom">
  <INPUT type="hidden" name="charchk" value="">
  <INPUT type="hidden" name="custom" value="$FORM{'custom'}">
__EOF__
	} else {
		print <<__EOF__;
<FORM method="$formmethod" action="$cgiurl">
  <INPUT type="hidden" name="mode" value="post">
  e <INPUT size="20" type="text" name="username" maxlength="30" value="$FORM{'username'}"><BR>
  [ <INPUT size="30" type="text" name="mailaddr" maxlength="255" value="$FORM{'mailaddr'}"><BR>
  薼 @<INPUT size="30" type="text" name="title" maxlength="40" value="$dtitle">
  <INPUT type="submit" name="post" value="e^[h"> <INPUT type="reset" value=""><BR>
  e <FONT size="-1"><I>
  iKɉsĂB^O͎g܂Beɓe{^ƃ[hɂȂ܂j
  </I></FONT><BR>
  <TEXTAREA rows="5" cols="70" name="message">$dmsg</TEXTAREA><BR>
  URL <FONT size="-1"><I>iNꂽꍇ͂ɋL܂j</I></FONT><BR>
  <INPUT size="70" type="text" name="linkurl" maxlength="255" value="$dlink">
  $ptext
  <INPUT type="hidden" name="charchk" value="">
  <INPUT type="hidden" name="custom" value="$FORM{'custom'}">
__EOF__
	}
}


###############################################################################
#  ʕ\
###############################################################################

sub prtmain {
	
	my ( @prtmessage, $dispcount, @pkeystr, $msgmore, $msgnext, $cntnext, $counter );
	my $dtitle = $_[0];
	my $dmsg = $_[1];
	my $dlink = $_[2];
	
	&loadmessage( "$FORM{'file'}" );
	
	# ŐVPOSTID擾iO[hpj
	$logdata[0] =~ /^.*,(.*),.*,.*,.*,.*,.*,.*,.*,.*/;
	$toppostid = $1;
	
	# bZ[W\ݒ
	if ( $FORM{'msgdisp'} == 0 ) {
		$dispcount = $toppostid - $FORM{'postid'};
		$cntnext = $msgdisp;
	} else {
		$dispcount = $FORM{'msgdisp'};
		$cntnext = $FORM{'msgdisp'};
	}
	
	# \bZ[W쐬
	$msgtop = $bmsg + $dispcount;
	$msgtop = @logdata if ( $msgtop > @logdata );
	$j = 0;
	
	if ( $FORM{'msgdisp'} == 0 && $reltype == 1 ) {
		for ( $i = $msgtop - 1 ; $i >= $bmsg ; $i-- ) {
			&getmessage ( $logdata[$i] );
			$prtmessage[$j] = &prtmessage ( 0, "$FORM{'file'}" );
			$j++
		}
	} else {
		for ( $i = $bmsg ; $i < $msgtop ; $i++ ) {
			&getmessage ( $logdata[$i] );
			$prtmessage[$j] = &prtmessage ( 0, "$FORM{'file'}" );
			$j++
		}
	}
	$bmsg++;
	if ( $j > 0 ) {
		$msgmore = "ȏ́Aݓo^ĂV$bmsgԖڂ$msgtopԖڂ܂ł̋LłB"
	} else {
		$msgmore = 'ǃbZ[W͂܂B';
	}
	if ( $logdata[$msgtop] ne '' && $j > 0 ) {
		$msgnext = <<__EOF__;
<TABLE>
  <TR>
    <TD>
      <FORM method="$formmethod" action="$cgiurl">
        <INPUT type="hidden" name="mode" value="page">
        <INPUT type="hidden" name="bmsg" value="$msgtop">
        <INPUT type="hidden" name="username" value="$FORM{'username'}">
        <INPUT type="hidden" name="msgdisp" value="$cntnext">
        <INPUT type="hidden" name="autolink" value="$FORM{'autolink'}">
        <INPUT type="hidden" name="autoimg" value="$FORM{'autoimg'}">
        <INPUT type="hidden" name="custom" value="$FORM{'custom'}">
        <INPUT type="submit" name="pnext" value="̃y[W">
      </FORM>
    </TD>
    <TD>
      <FORM method="$formmethod" action="$cgiurl">
        <INPUT type="hidden" name="username" value="$FORM{'username'}">
        <INPUT type="hidden" name="postid" value="$toppostid">
        <INPUT type="hidden" name="msgdisp" value="$FORM{'msgdisp'}">
        <INPUT type="hidden" name="autolink" value="$FORM{'autolink'}">
        <INPUT type="hidden" name="autoimg" value="$FORM{'autoimg'}">
        <INPUT type="hidden" name="custom" value="$FORM{'custom'}">
        <INPUT type="submit" name="reload" value="[h">
      </FORM>
    </TD>
  </TR>
</TABLE>
__EOF__
	} else {
		$msgmore .= 'ȉ̋L͂܂B';
		$msgnext = '';
	}
	
	# JE^
	$counter = &counter;
	
	# Co
	print <<__EOF__;
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>$bbstitle</TITLE>
</HEAD>

<BODY bgcolor="#$bgc" text="#$textc" link="#$linkc" vlink="#$vlinkc" alink="#$alinkc">

<P>
  <B><FONT size="+1">$bbstitle</FONT></B>
  <FONT size="-1"><A href="http://cgi.iwa.server.ne.jp/strangeworld/info.html">L</A></FONT>
  <FONT size="-1"><A href="mailto:$adminmail">A</A></FONT>
</P>
__EOF__
	
	&prtform ( $dtitle, $dmsg, $dlink );
	
	print <<__EOF__;
  <P><FONT size="-1">\\ <INPUT size="6" type="text" name="msgdisp" value="$FORM{'msgdisp'}">
  @<FONT size="-1">URLN <INPUT type="checkbox" name="autolink" value="checked" $FORM{'autolink'}></FONT>
  @<FONT size="-1">摜WJ <INPUT type="checkbox" name="autoimg" value="checked"  $FORM{'autoimg'}></FONT>
  @<INPUT type="submit" name="setup" value="̑̐ݒ"></FONT></P>
  <FONT size="-1">$countdate  $counteriɂx$countlevelj</FONT>
  <HR>
  <FONT size="-1">| 
  <A href="$cgiurl?mode=getlog">ŋ߂̉ߋO</A>|
<a href="http://cgi.iwa.server.ne.jp/strangeworld/upload/upload.cgi" target="_blank">Ղ낾ɂ</a>|
<a href="http://members.tripod.co.jp/~swattylink/">SLW</a>|
<a href="http://members.tripod.co.jp/~strange_walker/">W</a>|
<a href="http://www.yunasoft.gr.jp/cgi-bin/strangeworld/bbs.cgi">DG</a>|
<a href="http://ag.st2.arena.ne.jp/cgi-bin/strangeworld/bbs.cgi">II</a>|
<a href="http://maripe.sakura.ne.jp/strangeworld/bbs.cgi">܂!</a>|
<a href="http://www.strange2000.f2s.com/bbs.cgi">2000</a>|
<a href="http://extra.tomato.nu/strangeworld/">GNXg</a>|
<a href="http://wave.ruru.ne.jp/loplop/remix/bbs.cgi">REMIX</a>|
<a href="http://socialkowai.virtualave.net/cgi-bin/bbs.cgi">{f</a>|
<a href="http://gikousa-bunke.virtualave.net/cgi-bin/usakobbs.cgi">`{</a>|
<a href="http://www.netpro.ne.jp/~salonweb/cgi-bin/strangeworld/bbs.cgi">Cp[</a>|
<a href="http://ep.st22.arena.ne.jp/cgi-bin/remix/bbs.cgi?code="></a>|
<a href="http://extra.tomato.nu/notstrange/">R(L[`)m</a>|
<a href="http://jo.st22.arena.ne.jp/cgi-bin/strangeworld/bbs.cgi">݂炢</a>|
<a href="http://www.strangeworld.cx/cgi-bin/strangeworld/bbs/bbs.cgi">cx</a>|
<a href="http://ekaki00.hypermart.net/cgi-bin/bbs.cgi">G`</a>/<a href="http://ekaki00.hypermart.net/cgi-bin/ura.cgi"></a>|
<a href="http://strgw.virtualave.net/reproduction/bbs.cgi">]</a>|<hr>
| <a href="http://www.infonia.ne.jp/~sei777/sakura.htm" target="_blank">CC</a>|
<a href="http://www.tamon.co.jp/TINAMI/" target="_blank">TINAMI</a>|
<a href="http://www1.odn.ne.jp/hml/" target="_blank">HML</a>|
<a href="http://www.nn.iij4u.or.jp/~showtake/ecoice/" target="_blank"></a>|
<a href="http://sp.cup.com/" target="_blank">[ς</a>|
<a href="http://tv.yahoo.co.jp/" target="_blank">ΰTV</a>|
<a href="http://member.nifty.ne.jp/office98/aniban/index.htm" target="_blank">ɔ</a>|
<a href="http://www.searchdesk.com/" target="_blank">fXN</a>|
  </FONT>
  <HR>
  <FONT size="-1">$txtfollow : tH[eʕ\\ @ $txtauthor : eҌ\\ @ $txtthread : Xbh\\
  @@@őo^ : $logsave</FONT>
  <HR>
__EOF__

### ̃Aj ###
&animeinfo;
########################

	print<<__EOF__;
  <HR><FONT size="-1"><INPUT type="submit" name="post" value="e^[h"></FONT>
  <INPUT type="hidden" name="postid" value="$toppostid">
</FORM>
<HR>

@prtmessage

<P><I><FONT size="-1">$msgmore</FONT></I></P>

$msgnext
<HR>

<P align="right">
<FONT size="-1"><A href="http://kuzuha.tripod.co.jp/">͂Ղ</A> Final Beta #3 (Preview Release 2) + <A href="http://cgi.iwa.server.ne.jp/strangeworld/info.html">ɂ߃JX^(2000/04/19)</A></FONT>
</P>

</BODY>
</HTML>
__EOF__
}


###############################################################################
#  ̃Aj
###############################################################################
sub animeinfo {
	
	my $tddata, $tmdata, $str1, $str2, $tdw, $tmw;

	( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdat )
		= localtime ( $nowtime );

	$tdw = $wday;
	$tmw = $tdw + 1;
	if ( $tmw == 7 ) {
		$tmw = 0;
	}

	open ( IN, "info$tdw.dat" );
	$tddata = <IN>;
	close ( IN );

	open ( IN, "info$tmw.dat" );
	$tmdata = <IN>;
	close ( IN );

	$str1 = sprintf ( "%sj̃Aj", 
				( '', '', '', '', '', '', 'y' )[$tdw] );
	$str2 = sprintf ( "%sj̃Aj", 
				( '', '', '', '', '', '', 'y' )[$tmw] );

	print "<table border=\"0\" width=\"100%\"><tr>\n";
	print "<td width=\"50%\"><font size=\"-1\">$str1</font></td>";
	print "<td width=\"50%\"><font size=\"-1\">$str2</font></td>\n";
	print "</tr><tr>\n";
	print "<td><table>$tddata</table></td>\n";
	print "<td><table>$tmdata</table></td>\n";
	print "</tr></table>\n";
}


###############################################################################
#  C
###############################################################################

&getformdata;
&getenv;

if ( $FORM{'mode'} eq 'customset' ) {
	require './bbscust.cgi';
	&setcustom;
	exit;
}

# wb_o
print "Content-type: text/html\n";
if ( $gzip && ( $ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/ ) ) {
	print "Content-encoding: gzip\n\n";
	open ( STDOUT, "| $gzip -1 -c" );
	print "<!-- gzip enable -->";
} else {
	print "\n<!-- gzip disable -->";
}

if ( $FORM{'mode'} eq 'admin' && $FORM{'admin'} ) {
	require "$admincgi";
	exit;
}

# lpݒ蔽f
if ( $FORM{'custom'} ne '' ) {
	$FORM{'custom'} =~ /^(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\d+)$/;
	$textc = $1;
	$subjc = $textc;
	$bgc = $2;
	$linkc = $3;
	$vlinkc = $4;
	$quotc = $5;
	$i = $6;
	$followwin = int ( $i / 2 );
	$reltype = int ( $i % 2 );
} else {
	$i = $followwin * 2;
	$FORM{'custom'} = "$textc$bgc$linkc$vlinkc$quotc$i";
	if ( ! $FORM{'autolink'} && $autolink eq '1' ) {
		$FORM{'autolink'} = 'checked';
	}
	if ( ! $FORM{'autoimg'} && $autoimg eq '1' ) {
		$FORM{'autoimg'} = 'checked';
	}
}
$body = "<BODY bgcolor=\"#$bgc\" text=\"#$textc\" link=\"#$linkc\" " .
		"vlink=\"#$vlinkc\" alink=\"#$alinkc\">";

if ( $FORM{'msgdisp'} ne '' ) {
	if ( $FORM{'msgdisp'} > $logsave ) {
		$FORM{'msgdisp'} = $logsave;
	}
} else {
	$FORM{'msgdisp'} = $msgdisp;
}

$nowtime = time - $difftime * 60 * 60;

if ( $FORM{'setup'} ne '' ) {
	require './bbscust.cgi';
	&prtcustom;
	exit;
}
if ( $FORM{'mode'} eq 'getlog' ) {
	require './bbslog.cgi';
	&getlog;
	exit;
}
if ( $FORM{'mode'} eq 'post' && $FORM{'message'} ne '' && $FORM{'reload'} eq '' ) {
	$postid = 0;
	$posterr = 0;
	if ( $ENV{'CONTENT_TYPE'} eq 'application/x-www-form-urlencoded' ) {
		&chkmessage;
		&putmessage;
	} else {
		$posterr = 255;
	}

	if ( $FORM{'follow2'} ne '1' ) {
		if ( $FORM{'follow'} && $followwin == 0 ) {
			print <<__EOF__;
<html><head><title>$bbstitle</title></head>
$body
<h1>݊</h1>
</body></html>
__EOF__
exit;
		}
	}
} elsif ( $FORM{'mode'} eq 'follow' || $FORM{'mode'} eq 'follow2' ) {
	&prtfollow ( 0 );
} elsif ( $FORM{'mode'} eq 'search' || $FORM{'mode'} eq 'thread' || $FORM{'mode'} eq 'thread2' ) {
	require './bbssrc.cgi';
	&srcmessage;
} else {
	if ( $FORM{'mode'} eq 'page' ) {
		$bmsg = $FORM{'bmsg'};
	} else {
		$bmsg = 0;
	}
}

&prtmain ( '', '', '' );

exit;


__END__
