#!/usr/bin/perl
#--------------------------------------#
# Pallet Town (2006/05/10) #
# #
$version = 'v3.00'; #
# #
# Created by ぱおろん #
# http://paoron.jp/ #
#--------------------------------------#
########## ■初期設定■ ##########
# ●管理者用パスワード 必ず変更して下さい(半角英数字で8文字以内)
$pass = 'a440';
# その他の設定はplug.cgiで行います
$update = 'Ver.3.9/Feb.11\'09';
$top_image = "./imgdir/58.png";
#>>>>>>>>>>>>>>>>>>> ここから下はPerl・htmlの知識が必要 <<<<<<<<<<<<<<<<<<<<#
require 'plug.cgi';
$cgiflag=$limit=$imode=0;
%FORM=();
#
# SPAM防止Cookie期限
#
$c_time = time;
$c_expire = 120;
@c_date = localtime(time + $c_expire * 86400);
$c_date[5] += 1900;
$c_date[3] = sprintf("%02d",$c_date[3]);
$c_date[2] = sprintf("%02d",$c_date[2]);
$c_date[1] = sprintf("%02d",$c_date[1]);
$c_date[0] = sprintf("%02d",$c_date[0]);
$c_wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$c_date[6]];
$c_month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$c_date[4]];
$c_date_gmt = "$c_wday, $c_date[3]\-$c_month\-$c_date[5] $c_date[2]:$c_date[1]:$c_date[0] GMT";
#
# デコード処理
#
&decode;
sub decode {
my ($buffer,$pair,$name,$value,@pairs);
if ($ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data|i) {
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
$ENV{'CONTENT_LENGTH'} > 30720 && &error ('サイズオーバー');
read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
$limit = 1;
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split (/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split (/=/,$pair);
if ($name eq 'targets') { push (@list,"$value"); next; }
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack('H2',$1)/eg;
"e (\$value);
$value =~ s/\x0D?\x0A?$//;
$FORM{$name} = $value;
}
} else {
$ENV{'REQUEST_METHOD'} ne 'POST' && &error ('この掲示板はPOST限定となっております');
$ENV{'CONTENT_LENGTH'} > 1024000 && &error ('サイズオーバー');
binmode (STDIN);
read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
$limit = 1;
$buffer =~ /^([^\r\n]+)(\r?\n?)/;
my $boundary = quotemeta ($1);
my $rn = $2;
@pairs = split (/$boundary-*$rn/,$buffer);
shift @pairs;
foreach $pair (@pairs) {
($name) = $pair =~ /^Content-Disposition: [^;]*; name="(\w+)"/i;
if ($name eq 'image') {
($fname,$ctype,$value) = split (/$rn/,$pair,3);
($fname) = $fname =~ /filename="([^$rn]*)"$/i;
($ctype) = $ctype =~ /Content-Type: ([^$rn]*)$/i;
} else {
($dump,$value) = split (/$rn/,$pair,2);
"e (\$value);
}
$value =~ s/^$rn//;
$value =~ s/$rn$//;
$FORM{$name} = $value;
}
}
}
#
# 表示調整
#
sub quote {
local *quots = shift;
$quots =~ s/"/"/g;
$quots =~ s/</g;
$quots =~ s/>/>/g;
}
#
# ユーザー設定ファイルのチェック
#
if ($FORM{'mode'} eq 'admin' && $FORM{'pwd'} eq $pass) { require $master_script; &custom; }
unless (-e "$userfile") {
require $master_script; &first;
} elsif (-s "$userfile" < 1500) {
require $master_script; &ini; $banner3 = '管理人へ、ユーザー設定ファイルが壊れている可能性があります。再設定をして下さい。';
} else {
require $userfile;
}
&unaccs;
#
# モード振り分け
#
if ($FORM{'mode'} eq 'contribute') { &contribute; }
elsif ($FORM{'mode'} eq 'picture') { &picture; }
elsif ($FORM{'mode'} eq 'draw') { &draw; }
elsif ($FORM{'mode'} eq 'refresh') { &refresh; }
elsif ($FORM{'mode'} eq 'viewer') { &pchviewer; }
elsif ($FORM{'mode'} eq 'preview') { &preview; }
elsif ($FORM{'mode'} eq 'regist') { require $resist_script; ®ist; }
elsif ($FORM{'mode'} eq 'change') { &change; }
elsif ($FORM{'mode'} eq 'search') { require $lib_script; &search; }
elsif ($FORM{'mode'} eq 'myname') { require $lib_script; &myname; }
elsif ($FORM{'mode'} eq 'publish') { require $lib_script; &publish; }
elsif ($FORM{'mode'} eq 'myname_resist') { require $resist_script; &myname_resist; }
elsif ($FORM{'mode'} eq 'past_view') { &past_view; }
elsif ($FORM{'mode'} eq 'all_admin' && $FORM{'pwd'} eq $pass) { require $master_script; &all_admin; }
elsif ($FORM{'mode'} eq 'maintenance' && $FORM{'pwd'} eq $pass) { require $master_script; &maintenance; }
elsif ($FORM{'mode'} eq 'howto') { require $lib_script; &howto; }
elsif ($FORM{'mode'} eq 'revision_edit' && $FORM{'userpwd'} eq $pass) { require $resist_script; &revision_edit; }
elsif ($ENV{'HTTP_USER_AGENT'} =~ /^(?:DoCoMo|J-PHONE|KDDI|UP)/) { require $lib_script; &docomo_view; }
elsif ($ENV{'HTTP_USER_AGENT'} =~ /(?:SoftBank|Vodafone|MOT-)/i) { require $lib_script; &docomo_view; }
elsif ($ENV{'HTTP_USER_AGENT'} =~ /emulator/i) { require $lib_script; &docomo_view; } #test
elsif ($FORM{'i_page'} || $FORM{'i'}) { require $lib_script; &docomo_view; }
else { &view; }
exit;
#
# メニューコントロール
#
sub menu {
my $kind = shift;
if ($kind) {
my @contrl = qw|'' スレッド一覧 使い方 キーワード検索 過去ログ 投稿記事修正|;
print <<"HTML";
\n"; }
}
#
# サブテーブル
#
sub tables {
my ($t1,$t2,$t3) = @_;
print <<"HTML";
$t3
HTML
}
#
# 画像アップロード・お絵描き本文画面
#
sub contribute {
if (exists $FORM{'amp;id'}) { $FORM{'id'} = $FORM{'amp;id'}; }
my $ctb_mode = exists $FORM{'id'};
$pctart == 2 && !$ctb_mode and &error ('不正な入力をブロックしました');
my ($gamen,$kaiga,$hisu,$pno,$pip,$pid,$pex,$pwi,$phi,$repair,$mpt);
local ($hid,$arts,$admin,$sname,$ppwd,$ssub,$smail,$surl,$scom,$ssend,$sok);
if ($ctb_mode && ($pctart or $hanga && !$pctart)) {
$FORM{'id'} =~ /\D/ && &error ('不正な入力です');
my $idfile = "$sytm"."$FORM{'id'}".'.tmp';
my $retry = 5;
until (open (PCT,"$idfile")) {
if (--$retry <= 0) { &error ("専用IDファイルが開きませんでした。
投稿自体は成功しているかもしれません。
ここから確認してみて下さい"); }
sleep 1;
}
($pno,$pip,$sname,$ppwd,$pid,$pex,$pwi,$phi,$repair) = split (/<>/,
);
close (PCT);
unlink ("$idfile");
# substr($ENV{'REMOTE_ADDR'},0,6) ne substr($pip,0,6) && &error ("お絵描きアプレットからのIPアドレスと一致しませんでした。
投稿自体は成功しているものと思われます。
セキュリティチェックにより「修正モード」からコメントを書いて下さい。
記事Noは$pnoです。ここからどうぞ");
$hid = qq|\n\n|;
if ($repair) { $ssub = "> $repair "; }
$gamen = 'お絵描き→コメント入力';
$kaiga = "『$sname』コメント中";
} else {
$gamen = '新規投稿';
$kaiga = qq|[使い方]|;
$hisu = sprintf ("%s拡張子 gif、jpg(jpeg)、pngのみ。FileSize %dKB。縦 ${h_max}pixel×横 ${w_max}pixelまで。", !$cmtonly ?'画像は必須となっております。':'',int($img_max / 1024));
}
&type;
&java_nosubmit;
&java_cookie_sp;
&bgc_ch ($ctb_mode,1);
&header;
&tables ($gamen,$kaiga,$hisu);
if ($ctb_mode) {
$arts = 1;
print qq|
\n|;
} else {
$mpt = ' enctype="multipart/form-data"';
if ($banner4) {
$banner4 =~ s/\0/\n/g;
print "$banner4\n";
}
}
&form ($mpt);
print "
\n";
&java_cookset (!$ctb_mode,1);
if ($pchup && !$ctb_mode && $pctart) {
print <<"HTML";
お絵描きアプレット専用ファイル(
HTML
print 'PaintBBS(.pch) ' if $shipaint != 1;
print 'しぃペインター(.spch) ' if $shipaint != 0;
print ')を直接キャンバスに取り込みます。
FileSize ',int ($sii_ani_max / 1024),"KBまで。\n";
if ($pchsize) {
print '縦 pixel、横 pixelは表の「Canvas Size」の値に合致している必要があります。';
} else {
print "縦 ${h_max}pixel、横 ${w_max}pixelまでです。";
}
print <<"HTML";
\n";
print qq|
JAVA
}
print "
\n";
&footer;
exit;
}
#
# お絵描き画面
#
sub picture {
$limit || &error ('制限されている投稿方法です');
$pctart || ($hanga && !$pctart) or &error ('不正な入力をブロックしました');
&refe;
require $jcode;
&jcode::convert (\$FORM{'name'},'euc');
my $na = $FORM{'name'};
my $pw = $FORM{'pwd'};
my $addr = $ENV{'REMOTE_ADDR'};
$na eq '' && &error ('Nameが入力されていません');
if ($max_name) { (length $na > $max_name * 2) && &error ("Nameの文字数が多すぎます。
$max_name字以内で入力して下さい"); }
$pw eq '' && &error ('Passが入力されていません');
my $replace = $FORM{'paintno'};
"$replace$FORM{'drawing'}" =~ /\D/ && &error ('不正な入力です');
if ($cotei && !$replace) { &name_check ($na,$pw,1); }
my ($kirikae,$apch,$apllet,$res,$dir_val,$shi,$code,$place,$zoon,$start,$hisu);
if ($pchup && $FORM{'upload'}) {
require $resist_script;
($replace,$kirikae) = &pch_spch ($addr);
}
my $tateyoco = exists $FORM{'tateyoco'} ?$FORM{'tateyoco'}:"$FORM{'tate'},$FORM{'yoco'}";
my ($tate,$yoco) = split (/,/,$tateyoco);
if ($sizemode == 0 && !exists $FORM{'drawing'} && !$replace) {
$tate =~ s/\D//g; $yoco =~ s/\D//g;
if ($yoco eq '' || $tate eq '') {
$tate = $cs0_nh; $yoco = $cs0_nw;
} elsif ($cs0_s > $yoco || $yoco > $cs0_m || $cs0_s > $tate || $tate > $cs0_m) {
&error ("入力サイズは最小$cs0_sから最大$cs0_mの間にして下さい");
}
}
my $aws = $yoco + 100;
my $ahs = $tate + 120;
if ($FORM{'shii'}) {
if ($aws < 700) { $aws = 700; }
if ($ahs < 550) { $ahs = 550; }
$apch = $FORM{'shii'} eq 'pro' ?'pro':'normal';
if ($htmlcgi) {
$apllet = "$ct_sct?painter,$ct_sct?$apch.zip";
$res = $dir_val = "$ct_sct?";
} else {
$apllet = "spainter.jar,res/$apch.zip";
$res = $dir_val = 'res/';
}
$code = 'c.ShiPainter';
$shi = '&syi='."$apch";
} else {
if ($aws < 380) { $aws = 380; }
if ($ahs < 420) { $ahs = 420; }
$apllet = $htmlcgi ?"$ct_sct?paint":'PaintBBS.jar';
$code = 'pbbs.PaintBBS';
}
foreach ($na,$pw,$addr) {
s/(\W)/'%'.unpack('H2',$1)/eg;
}
if ($kirikae) {
$place = 'mode=upload';
$hisu = 'アニメアップロードから絵画します。「投稿」ボタンを押すとコメント入力画面が現れます。';
} elsif ($replace && $repaint) {
$place = 'mode=replace';
$hisu = '■ リタッチ ■';
} else {
if ($hanga && $FORM{'drawing'}) {
$replace = $FORM{'drawing'};
$place = 'mode=drawing';
}
$hisu = '絵画後「投稿」ボタンを押すとコメント入力画面が現れます。';
}
$place .= $replace ?('&no='."$replace".'&'):'';
if ($aptime) {
&timezone;
if (!$FORM{'notime'}) { $zoon = '&zoon='.($time - $FORM{'jikan'}); }
my ($sec,$min,$hour,$mday,$mon,$dummy,$wday) = localtime ($time);
my @week = qw|Sun Mon Tue Wed Thu Fri Sat|;
$start = sprintf ("%02d/%02d(%s) %02d:%02d:%02d", $mon+1,$mday,$week[$wday],$hour,$min,$sec);
}
my $send_header = "${place}name=$na&pwd=$pw&addr=$addr$zoon$shi";
my $mation = ($FORM{'manga'} && $animation) ?1:0;
my $co2 = $applet[2] || '#666699';
my $co3 = $applet[5] || '#CCCCFF';
my $co4 = $applet[6] || '#666699';
my $solid = @colordata;
my $mac = defined @colordata && $ENV{'HTTP_USER_AGENT'} !~ /Mac/i ?1:0;
&type;
if ($mac) {
my ($a,$b,$c);
foreach (0..13) {
if ($#colormenu >= $_) {
$a .= "$colormenu[$_][0]"; $b .= "$colormenu[$_][1]"; $c .= "$colormenu[$_][2]";
} else {
$a .= '#000000'; $b .= '#000000'; $c .= '#000000';
}
if ($_ != 13) { $a .= '\n'; $b .= '\n'; $c .= '\n'; }
}
print "clr = new Array();\n";
foreach (0..$#colordata) {
my @cc = ($colordata[$_][1] =~ /([0-9a-zA-Z]{6})/g);
print "clr[$_] = '#", join ('\\n#',@cc) ,"';\n";
}
print <<"JAVA";
tmp = new Array();
tmp[0] = '$a';
tmp[1] = '$b';
tmp[2] = '$c';
function custom(ary) {
if (d.p.sel.selectedIndex != $solid) d.p.sel.selectedIndex = $solid;
clr[$solid] = ary.join("\\n");
d.paintbbs.setColors(clr[$solid]);
}
JAVA
print <<'JAVA';
cargo = new Array(); day = new Array(); flag = 0; color = "";
c = "0123456789ABCDEF";
function Set(akico,s) {
if (akico == 1) {
color = clr[s.selectedIndex];
d.p.contna.selectedIndex = -1;
} else if (akico == 2) {
color = cargo[s.selectedIndex];
d.p.sel.selectedIndex = -1;
} else {
color = tmp[s.options[s.selectedIndex].value];
}
if (d.p.auto.checked) {
d.paintbbs.setColors(color);
} else {
auto(color);
}
if (akico) d.p.codi.selectedIndex = "";
}
function auto(c) {
if (!c) return;
var hold = new Array();
hold = c.split("\n");
JAVA
print qq| var fonts = '';\n|;
print <<'JAVA';
for (i = 0; i < hold.length; i++) {
fonts += '' + '■';
if (i % 2) fonts += '
';
}
fonts += '
';
if (d.all) d.all("ap").innerHTML = fonts;
}
function NonPost() {
if (!d.all) return 0;
if (d.p.auto.checked) {
d.all("ap").style.visibility = "hidden";
d.paintbbs.setColors(color);
} else {
auto(color);
d.all("ap").style.visibility = "visible";
}
}
function Temp(c) {
var date = new Date();
day[flag] = zero(date.getDate())+","+zero(date.getHours())+":"+zero(date.getMinutes())+":"+zero(date.getSeconds());
cargo[flag] = String(d.paintbbs.getColors());
if (flag >= 5) {
for (i = 0; i < 5; i++) {
cargo[i] = cargo[i+1];
day[i] = day[i+1];
}
flag = 5;
} else {
flag++;
}
for (n = 0; n < Math.min(cargo.length,5); n++) {
c.options[n] = new Option(day[n],cargo[n]);
}
d.p.sel.selectedIndex = -1;
}
function zero(t) {
if (t < 10) t = "0" + t;
return t;
}
function Chang(c) {
var marina = c.selectedIndex;
if (marina == -1 || c.options[c.selectedIndex].value == "") return;
c.options[marina] = null;
var len = cargo.length;
len -= len > 5 ?2:1;
cargo = new Array();
day = new Array();
for (n = 0; n < len; n++) {
cargo[n] = c.options[n].value;
day[n] = c.options[n].text;
}
flag -= 1;
}
function cook() {
var len = cargo.length;
len -= len > 5 ?1:0;
if (!len) return;
var cname = "";
var dname = "";
for (n = 0; n < len; n++) {
var junco = cargo[n].split("\n").join("").toString();
cname += junco.replace(/#/g,"");
dname += day[n];
if (n != len-1) { cname += "_"; dname += "_"; }
}
dname = escape(dname);
var set_expires = new Date();
set_expires.setTime(set_expires.getTime() + 60 * 86400000);
var cook = "PTCOLOR=txt:" + dname + ",val:" + cname + ",; expires=" + set_expires.toGMTString();
d.p.biscuit.value = "保存済";
d.cookie = cook;
return true;
}
function map() {
var code = "";
var tr = "";
for (i = 0; i < 6; i++) {
var td = "";
for (ii = 0; ii < 6; ii++) {
for (iii = 0; iii < 6; iii++) {
var ir = i*3; var iig = ii*3; var iiib = iii*3;
code = c.charAt(ir) + c.charAt(ir) + c.charAt(iig) + c.charAt(iig) + c.charAt(iiib) + c.charAt(iiib);
JAVA
print qq| td += ' <\\/a><\\/td>';\n|;
print <<'JAVA';
}
}
tr += "" + td + "<\/tr>";
}
return(tr);
}
function newwindow() {
d.p.contna.selectedIndex = -1;
JAVA
print " d.p.sel.selectedIndex = $solid;\n";
print <<'JAVA';
sub = window.open("","color","width=520,height=135");
with (sub.document) {
open();
write('カスタム<\/title>');
write('
JAVA
}
if ($banner6) {
$banner6 =~ s/\0/\n/g;
}
print " \n$banner6\n
\n";
&footer;
exit;
}
#
# パラメータ共通
#
sub param {
my ($p1,$p2) = @_;
return print qq|\n|;
}
#
# アニメーション再生
#
sub pchviewer {
(!$animation || !$pctart || "$FORM{'h'}$FORM{'w'}$FORM{'clr'}" =~ /\D/ || $FORM{'pch'} !~ /^\d+(?:\Q$pch\E|(\Q$spch\E))$/) && &error ('不正な入力です');
my $file = "$html_img_dir"."$image"."$FORM{'pch'}";
-e "$file" || &error ('ファイルの存在を確認出来ませんでした');
my ($lyr,$buf,$stdpro,$ptate,$pta,$pyoco,$pyo) = 2;
if ($1) {
open (PCH,"$file");
read (PCH,$buf,50);
close (PCH);
($lyr) = $buf =~ /layer_last=(\d+)/;
$stdpro = 2;
}
$ptate = $pta = $FORM{'h'};
$pyoco = $pyo = $FORM{'w'};
$pta += 26;
if ($pyo < 150) { $pyo = 150; }
my $co0 = $colormenu[$FORM{'clr'}][0];
my $co1 = $colormenu[$FORM{'clr'}][1];
my $co2 = $colormenu[$FORM{'clr'}][2];
my $mac = $ENV{'HTTP_USER_AGENT'} !~ /Mac/i;
&type;
print <<'JAVA';
function Speed(i) {
d.pch.setSpeed(i.options[i.selectedIndex].value);
}
function layer(s,n) {
var is = n.checked ?255:0;
d.pch.setVisit(s,is);
}
JAVA
&header;
&java_ok;
print qq|\n \n|;
if ($mac && ($lyr > 5 && $lyr <= 12)) {
print "\n";
}
print qq| | \n
|