#!/usr/mesh/bin/perl # # ツリー型掲示板 Ver1.11 # # Copyright (C) 1998 CGI Arkadia All rights reserved. # Script written by Shintaro Wakayama. # # ■標準的なディレクトリ階層 # public_html ┬ cgi-bin ─ tree_bbs ┬ tree_bbs.cgi # │ └ jcode.pl # └ index.html # # ■パーミッション # -------------------------------------------------- # ファイル名 アクセス権 # -------------------------------------------------- # tree_bbs 777(ディレクトリ) # tree_bbs.cgi 755(プログラム) # jcode.pl 755(ライブラリ) # -------------------------------------------------- require 'jcode.pl'; $text = "#000000"; $link = "#0000FF"; $vlink = "#800080"; $alink = "#FF0000"; $bgcolor = "#FFFFFF"; $background = ""; $title_name = "ツリー型掲示板"; $home = "http://www2s.biglobe.ne.jp/~arkadia/cgi/"; &main; sub main { &get_cookie; &decode; &file_check; if ($form{'function'} eq "write" && !&form_check) { &set_cookie; &message_write; &tree_view_html; } elsif ($form{'no'} != 0) { &message_view_html; } else { &tree_view_html; } } sub get_cookie { foreach(split(/\;/,$ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/); $name =~ s/ //g; if ($name eq "tree_bbs") { ($cookie_name, $cookie_mail, $cookie_url) = split(/\"/, $value); $cookie_url =~ s/http:\/\///; last; } } } sub set_cookie { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat) = gmtime(time+(30*24*60*40)); $cookie_expire = sprintf("%s,%02d %s %04d %02d:%02d:02d GMT", ("Sun","Mon","Tue","Wed","Thu","Fri","Sat")[$wday], $mday, ("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec")[$mon], $year + 1900, $hour, $min, $sec); print "Set-Cookie: tree_bbs=$form{'name'}\"$form{'mail'}\"$form{'url'}; expires=$cookie_expire\n"; } sub form_check { open(LOGFILE, "log.txt"); @logfile = ; close(LOGFILE); $logfile = pop(@logfile); chop($logfile); ($log_resno, $log_no, $log_title, $log_name, $log_mail, $log_url, $log_date, $log_message) = split(/\"/, $logfile); if (!($form{'name'} && $form{'title'} && $form{'message'}) || length($form{'message'}) > 5000 || $form{'message'} eq $log_message) { 1; } else { 0; } } sub file_check { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon++; $thisday = ('日','月','火','水','木','金','土')[$wday]; if ($sec < 10) {$sec = "0$sec";} if ($min < 10) {$min = "0$min";} if ($hour < 10) {$hour = "0$hour";} if ($mday < 10) {$mday = "0$mday";} if ($mon < 10) {$mon = "0$mon";} $date = "$year年$mon月$mday日 $thisday曜日 $hour時$min分$sec秒"; unless (-e "log.txt") { open(LOGFILE, ">log.txt"); close(LOGFILE); } } sub message_write { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon++; $thisday = ('日','月','火','水','木','金','土')[$wday]; if ($sec < 10) {$sec = "0$sec";} if ($min < 10) {$min = "0$min";} if ($hour < 10) {$hour = "0$hour";} if ($mday < 10) {$mday = "0$mday";} if ($mon < 10) {$mon = "0$mon";} $update = "$year年$mon月$mday日 $thisday曜日 $hour時$min分$sec秒"; if ($form{'url'} eq "http://") { $form{'url'} = ""; } open(LOGFILE, "log.txt"); @logfile = ; close(LOGFILE); $no = @logfile + 1; open(LOGFILE, ">>log.txt"); flock(LOGFILE, 2); printf(LOGFILE "%d\"%d\"%s\"%s\"%s\"%s\"%s\"%s\n", $form{'resno'}, $no, $form{'title'}, $form{'name'}, $form{'mail'}, $form{'url'}, $update, $form{'message'}); flock(LOGFILE, 8); close(LOGFILE); } sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($form_name, $form_value) = split(/=/, $pair); $form_value =~ tr/+/ /; $form_value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*form_value, 'sjis'); $form_value =~ s/&/&/g; $form_value =~ s/\"/"/g; $form_value =~ s//>/g; $form_value =~ s/\r\n/
/g; $form_value =~ s/\r/
/g; $form_value =~ s/\n/
/g; $form{$form_name} = $form_value; } } sub title_list { local($resno, $level) = @_; open(LOGFILE, "log.txt"); @logfile = ; close(LOGFILE); @logfile = reverse(@logfile); foreach $logfile (@logfile) { ($log_resno, $log_no, $log_title, $log_name, $log_mail, $log_url, $log_date, $log_message) = split(/\"/, $logfile); if ($log_resno == $resno) { if ($level == 0) { printf("\n"); } else { printf("
\n"); } printf(" \n"); printf(" \n", &space($level), $log_no, $log_no, $log_title, $log_name); printf(" \n", $log_date); printf(" \n"); printf("
%s<%d> %s <%s>■%s
\n"); &title_list($log_no, $level + 1); } } } sub space { local($space) = @_; $buffer = ""; for ($i = 0; $i < $space; ++$i) { $buffer = $buffer."   "; } $buffer; } sub tree_view_html { open(LOGFILE, "log.txt"); @logfile = ; close(LOGFILE); $count = @logfile; printf("Content-type: text/html\n\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("%s\n", $title_name); printf("\n"); printf("\n"); printf("\n", $bgcolor, $background, $text, $link, $vlink, $alink); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n", $home); printf(" \n"); printf("
ホームへ戻るツリー型掲示板
\n"); printf("\n"); printf("

ツリー型掲示板

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n", $count); printf(" \n"); printf("
メッセージ数:%d件
\n"); printf("\n"); printf("
\n"); printf("\n"); &title_list(0, 0); printf("\n"); printf("
\n"); printf("\n"); printf("

新規メッセージ

\n"); printf("\n"); printf("
\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_name); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_mail); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_url); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
■名前
■タイトル
■電子メールアドレス ※無ければ記入しないでください。
■ホームページアドレス ※無ければ記入しないでください。
■メッセージ ※HTMLタグは使用できません。
■送信 ※消去ボタンを押すと上記フォーム内容が全て消去されます。
\n"); printf("
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
Copyright (C) 1998 CGI Arkadia All rights reserved.
\n"); printf(" This script written by Shintaro Wakayama.
\n"); printf("\n"); printf("\n"); } sub message_view_html { open(LOGFILE, "log.txt"); @logfile = ; close(LOGFILE); foreach $logfile (@logfile) { ($log_resno, $log_no, $log_title, $log_name, $log_mail, $log_url, $log_date, $log_message) = split(/\"/, $logfile); if ($form{'no'} == $log_resno) { ++$i; } elsif ($form{'no'} == $log_no) { $no = $log_no; $title = $log_title; $name = $log_name; $mail = $log_mail; $url = $log_url; $date = $log_date; $message = $log_message; } } printf("Content-type: text/html\n\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("<%d> %s\n", $no, $title); printf("\n"); printf("\n"); printf("\n", $bgcolor, $background, $text, $link, $vlink, $alink); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n", $home); printf(" \n"); printf("
ホームへ戻るツリー型掲示板
\n"); printf("\n"); printf("

<%d> \n", $no); printf("%s

\n", $title); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
\n"); printf(" \n"); printf(" \n", $name); printf(" \n", $date); printf(" \n"); printf("
■%s■%s
\n"); printf(" \n"); printf(" \n"); printf(" \n", $message); printf(" \n"); printf("
%s
\n"); if ($url ne "http://" && $url) { printf(" \n"); printf(" \n"); printf(" \n", $url, $url); printf(" \n"); printf("
url : <%s>
\n"); } if ($mail) { printf(" \n"); printf(" \n"); printf(" \n", $mail, $mail); printf(" \n"); printf("
mail : <%s>
\n"); } printf("
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

"); if ($i == 0) { printf("このメッセージにはレスが付けられていません。

\n"); } else { printf("このメッセージには%dつのレスが付けられています。

\n", $i); } printf("\n"); &title_list($form{'no'}, 0); printf("\n"); printf("
\n"); printf("\n"); printf("

"<%d> \n", $no); printf("%s"についてのレス

\n", $title); printf("\n"); printf("
\n"); printf(" \n"); printf(" \n", $form{'no'}); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_name); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_mail); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n", $cookie_url); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
■名前
■タイトル
■電子メールアドレス ※無ければ記入しないでください。
■ホームページアドレス ※無ければ記入しないでください。
■メッセージ ※HTMLタグは使用できません。
■送信 ※消去ボタンを押すと上記フォーム内容が全て消去されます。
\n"); printf("
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
Copyright (C) 1998 CGI Arkadia All rights reserved.
\n"); printf(" This script written by Shintaro Wakayama.
\n"); printf("\n"); printf("\n"); }