#!/usr/bin/perl $master_pass = '5216'; ################################################## # 処理の開始 ################################################## #日本語処理ライブラリの読み込み require './jcode.pl'; require './board.ini'; #フォーム送信データとクッキーの取得 &get_data; &get_cookie; #ページ振り分け if($form{'page'}){ require $BOARD_INI{"$form{'page'}"}; $page = $DATA_FILE{"$form{'page'}"}; }else{ require $BOARD_INI{'1'}; $page = $DATA_FILE{'1'}; } ############################## #  初期設定 ############################## #HTMLのヘッダー $header = <<"HEADER"; $title

真 夜 中 のWeb地蔵
一日一願/お気に入りに追加

Netで祈願 Webお地蔵様 あなたの願いもこれで成就!
「Web 一言願い地蔵」様へのお願いの仕方。
@お願い事を貼\り付けたい場所を、適当にクリックして決める。
A左の「Web 一言願い地蔵」様 をクリック。後は、適当にネ!!
あなたの願いを叶えるために、Web地蔵が一生懸命ガンバリます。
Web地蔵サポーター募集!よろしくお願いします。m(__)m
マヨラー垂涎の的→ 「森田のマヨネーズ」
HEADER #HTMLのフッター $footer = <<"FOOTER";
presented by |佐|藤|文|庫|
京・六角東洞院 ちきりやちょう
FOOTER #データファイル読みとり &lock; &read_data; &unlock; #投稿データ,書き込み指示,削除指示の読みとり while( ($key, $value) = each %form){ if ($key =~ /delete:(\d+)/) {$form{'_mode'} = "delete:$1";} } #データファイルへの書き込み,削除 if($form{'_mode'} eq 'write') { &write_data; &lock; &save; &unlock; &printout if($html_print); }elsif($form{'_mode'} =~ /delete:(\d+)/){ &delete_data($1); &lock; &save; &unlock; &printout if($html_print); } #掲示板をHTML表示して終了 &display; exit; ################################################## # 掲示板表示 ################################################## sub display{ local($print) = $_[0]; #フォームへのデータ入力(クッキーか書き込みミスで戻ってきた場合の処理) unless($print){ if($form{'name'} ne ''){$name = $form{'name'};} else{$name = $cookie{'name'};} if($form{'email'} ne ''){$email = $form{'email'};} else{$email = $cookie{'email'};} if($form{'url'} ne ''){$url = $form{'url'};} elsif($cookie{'url'} ne ''){$url= $cookie{'url'};} else{$url = 'http://'} if($form{'pass'} ne ''){$pass = $form{'pass'};} else{$pass = $cookie{'pass'};} if($form{'mark'} ne ''){$mark = $form{'mark'};} else{$mark = $cookie{'mark'};} if($form{'pen'} ne ''){$pen = $form{'pen'};} else{$pen = $cookie{'pen'};} if($form{'paper'} ne ''){$paper = $form{'paper'};} else{$paper = $cookie{'paper'};} if($form{'write_mode'} ne ''){$write_mode = $form{'write_mode'};} else{$write_mode = $cookie{'write_mode'};} $message = $form{'message'}; } $yoko = $write_mode ? "" : "checked=\"checked\""; $tate = $write_mode ? "checked=\"checked\"" : ""; #掲示板本体HTMLの表示 print "Content-type: text/html\n\n" unless($print eq "print"); print $header; #書き込みミスの指摘(本当はいらないはずなんだけど,一応) if(@error && !$print){ print "\n"; } #書き込み用フォームの表示 print <<"HERE"; HERE $form{'page'} = 1 if(!$form{'page'}); foreach(sort keys %PAGE_NAME){ ($form{'page'} eq "$_") ? print "\n" : print "\n"; } print "\n
$PAGE_NAME{$_}$PAGE_NAME{$_}
\n"; print <<"HERE";
HERE if($mark_use != 0){ print <<"HERE"; HERE }else{ print "\n"; } if($single_pen eq ""){ print <<"HERE"; HERE }else{ print "\n"; } if($single_paper eq ""){ print <<"HERE"; HERE }else{ print "\n"; } if($write_direction eq ""){ print <<"HERE"; HERE }else{ print ""; } print <<"HERE";
name
email
url
mark sample
pen
paper
横書き 縦書き
pass
HERE #各貼り紙(投稿内容)の表示 $i = 0; foreach $datum(@data){ chomp $datum; my($no, $time, $name, $email, $url, $message, $x, $y, $mark, $pen, $paper, $write_mode) = split(/,/, $datum); my($sec, $min, $hour, $mday, $mon, $year, $wday, $other) = localtime($time); my($id) = 'id'.$no; my($time_string) = sprintf("%02d/%02d %02d:%02d",$mon + 1,$mday,$hour,$min); my($new_time) = sprintf("%d,%d,%d,%d,%d,%d", $year + 1900, $mon, $mday, $hour - 9, $min, $sec); if($url){$link = "$url_button";}else{$link = '';} if($email){$mailto = "$mail_button";}else{$mailto = '';} $x .= 'px'; $y .= 'px'; my($pen_style) = $pen eq '0' ? $single_pen : (split(/,/,$pen{$pen}))[2]; my($paper_style) = $paper eq '0' ? (split(/,/,$single_paper))[0] : (split(/,/,$paper{$paper}))[2]; my($message_style) = $paper eq '0' ? (split(/,/,$single_paper))[1] : (split(/,/,$paper{$paper}))[3]; my($information_style) = $pen eq '0' ? (split(/,/,$single_paper))[2] : (split(/,/,$paper{$paper}))[4]; print <<"PAPER";

$message

PAPER if($mark_use && $mark){ print ""; } print <<"PAPER"; $name $link $mailto

PAPER last if(++$i >= $display_record); } print "\n"; print $footer; } ################################################## # データファイルへの書き込み ################################################## sub write_data{ my($number, $newdata,$buffer,$crypt_pass); my($ref) = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; if ($ref !~ /$myaddress/) { push(@error,"掲示板から入力してください。"); return; } #改行コードを変換 $form{'message'} =~ s/\r\n/\n/g; $form{'message'} =~ s/\r/\n/g; if($form{'name'} eq ''){push(@error,'名前を記入してください。')} if($form{'message'} eq ''){push(@error,'本文を記入してください。')} if(length($form{'message'}) > 200){push(@error,'本文をもっと短く書いてください。');} if(($form{'x'} == 0) && ($form{'y'} == 0) ){push(@error,'画面上をクリックしてピンを刺してください。');} if(@error){&display; exit;} #データのフォーマット while( ($key, $value) = each %form){ $form{$key} = &format_data($value); } my($no, $time, $name, $email, $xurl, $message, $x, $y, $mark, $pen, $paper, $write_mode, $pass) = split(/,/, $data[0]); chomp $pass; if($name eq $form{'name'} && $message eq $form{'message'}){return; } if($no){$number = $no + 1;} else{ $number = '1';} if($form{'url'} eq 'http://'){$form{'url'} = '';} $time = time; $newdata = join(",", ($number, $time, $form{'name'}, $form{'email'}, $form{'url'}, $form{'message'},$form{'x'},$form{'y'}, $form{'mark'}, $form{'pen'}, $form{'paper'}, $form{'write_mode'}, $form{'pass'}) ); unshift(@data,"$newdata\n"); splice(@data,$max_record); $form{'message'} = ''; &set_cookie; } ################################################## # データの削除 ################################################## sub delete_data{ $to_delete = $_[0]; for(my $i =0; $i < @data; $i++){ my ($temp) = $data[$i]; chomp $temp; if($to_delete == (split(/,/,$temp))[0] && ($form{'pass'} eq (split(/,/,$temp))[12] || $form{'pass'} eq $master_pass)){ splice(@data,$i,1); last; } } } ################################################## # データファイルの読み込み,書き込み ################################################## sub read_data{ @data = (); $form{'page'} = 1 if(!exists $form{'page'}); if(!-e "$data_path$DATA_FILE{qq($form{'page'})}"){ open(WRITE,">$data_path$DATA_FILE{qq($form{'page'})}") || push(@error, 'ファイルを作成できません(パーミッションの設定が間違っている可能性があります)。'); close(WRITE); chmod(0666,"$data_path$DATA_FILE{qq($form{'page'})}"); } open(READ,"$data_path$DATA_FILE{qq($form{'page'})}") || push(@error, 'ファイルを開くことができません'); @data = ; close(READ); } sub save{ open(WRITE,">$data_path$DATA_FILE{qq($form{'page'})}") || push(@error, 'ファイルに書き込めません'); print WRITE @data; close(WRITE); } ################################################## # 送信データ整形 ################################################## sub get_data{ my($method, $buffer, @pairs, $pair, $key, $value); $method = $ENV{'REQUEST_METHOD'}; #GETでデータを渡さないはずだが,一応,将来の改造を考えて。 if($method eq 'POST'){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair(@pairs){ ($key, $value) = split(/=/, $pair); $key =~ tr/+/ /; $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge; $value =~ tr/+/ /; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge; &jcode::h2z_sjis(*value); # 半角カナ→全角(SJIS)変換 &jcode::convert(*value,'sjis'); # SJIS変換 $form{$key} = $value; } } ################################################## # クッキー ################################################## sub set_cookie{ ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); @youbi = ("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); @monthg = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); print "Set-Cookie: ForYouBlue=name:$form{'name'}\,email:$form{'email'}\,url:$form{'url'},mark:$form{'mark'},pen:$form{'pen'},paper:$form{'paper'},write_mode:$form{'write_mode'}, pass:$form{'pass'}; expires=$date_gmt\n"; } sub get_cookie{ @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($key,$val) = split(/=/,$pair,2); $key =~ s/ //g; if ($key eq "ForYouBlue") { @pairs = split(/,/,$val); foreach $pair (@pairs) { ($key,$val) = split(/:/,$pair,2); $cookie{$key} = $val; } last; } } } ################################################## # HTMLとの整合性を保つ ################################################## sub format_data{ local($data) = $_[0]; $data =~ s/&/&/g; $data =~ s//>/g; $data =~ s/"/"/g; $data =~ s/\t/ /g; $data =~ s/\r\n/
/g; $data =~ s/\r/
/g; $data =~ s/\n/
/g; $data =~ s/,/,/g; return $data; } ################################################## # ロック ################################################## sub lock{ if(-e $lockdir){ local($checktime) = (stat($lockdir))[9]; if((time - $checktime) > 180){ rmdir($lockdir); } } unless(mkdir($lockdir,0755)){ push(@error,'ロックエラー:申し訳ありませんが,時間をおいてもう一度お願いします。'); &error; } } sub unlock{ rmdir($lockdir); } ################################################## # エラー ################################################## sub error{ print "Content-type: text/html\n\n"; print $header; foreach (@error){ print ("$_",'
'); } print $footer; exit; } ################################################## # HTML出力 ################################################## sub printout { open SAVEHANDLE, ">&STDOUT" or die "STDOUTの保護失敗"; open STDOUT, ">$PRINT{qq($form{'page'})}" or die "HTMLファイル作成失敗"; &display("print"); open STDOUT, ">&SAVEHANDLE" or die "STDOUTの復元失敗"; } #printout