#! /usr/bin/perl #↑各プロバイダで指定しているパスを記述 # # TOPICS CGI # BY YOUR DESIGN http://www.ntswebnet.jp/ #----------------------------------- 設定ここから -----------------------------------# # このファイルの名前 $script = "new.cgi"; #管理用パスワード $passwd = "1234"; # 管理画面へのリンク 0:表示しない 1:表示する $kanri_mode = 1; #管理モードの起動 _blank:新しいウィンドウ _self:同ウィンドウ $target = "_self"; # データファイル名 $file = "data.cgi"; # タイトル $title = ""; # タイトル画像(不要な場合は空白→"") $title_img = ""; #テーブルの幅 $tbl_width = 520; # 1ページに表示する記事の件数 $list = 5; # 一覧表示(編集/削除モード)で1ページに表示する件数 $list_all = 20; # 最大ログ保存件数(ログを自動削除しない場合は 0 にする) $max_logs = 0; #----------------------------------- 設定ここまで -----------------------------------# # 曜日の表示文字 @wday = ('日','月','火','水','木','金','土'); # jcode require 'jcode.pl'; #--------------------------------------------------------------------------------------# if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @buf = split(/&/,$buffer); foreach (@buf) { ($name,$value) = split(/=/,$_); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/<>//g; &jcode'convert(*value,"sjis"); $in{$name} = $value; } if ($in{'mode'} eq 'gate') { &gate; } elsif ($in{'mode'} eq 'write') { &write; } elsif ($in{'mode'} eq 'all') { &view_all; } elsif ($in{'mode'} eq 'edit') { &edit; } elsif ($in{'mode'} eq 'regist') { ®ist; } elsif ($in{'mode'} eq 'del') { &delete; } else { &view; } ################################################################ # 記事表示 ################################################################ sub view { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; # if (! $passwd || $passwd =~ /\W/) { &set; } print "Content-type:text/html; charset=Shift_JIS\n"; print "Pragma:no-cache\n"; print "Cache-Control:no-cache\n"; print "Expires:Thu, 01 Dec 1994 16:00:00 GMT\n\n"; print "\n\n"; print "\n\n
\n"; if ($in{'stt'}) { $stt = $in{'stt'}; } else { $stt = 0; } $end = $stt + $list - 1; $max = $#data; if ($end > $max) { $end = $max; } if ($max < 0) { print "記事はありません"; } else { @data = reverse @data; foreach ($stt .. $end) { $c = $_ + 1; $n = @data - $_; $data[$_] =~ s/\n//; ($date,$no,$text) = split(/<>/,$data[$_]); print "\n"; print "\n"; print "
$date\n"; print "$text\n"; print "
\n"; } print "

\n"; if ($c <= $max) { print "次へ"; } else { print ""; } if ($max > $list) { $no = 0; for ($i = 0; $i <= $max; $i += $list) { $no ++; if ($stt == $i) { print "|$no"; } else { print "|$no"; } } } } if ($kanri_mode) { print "|管理モード|\n"; } print "

\n"; } ################################################################ # 新規入力 ################################################################ sub write { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; if ($in{'pass'} ne $passwd) { &gate; } ($day,$mon,$year) = (localtime(time))[3,4,5]; $year += 1900; $mon ++; print "Content-type:text/html; charset=Shift_JIS\n\n"; &header; print "
\n"; print "
\n"; print "\n"; print "\n"; print "

新規書込

\n"; print "\n"; print "\n"; print "\n"; print "
日付\n"; print "\n"; print "\n"; print "
内容
"; print " URL自動リンク
\n"; print "

\n"; print "\n"; print "

新着情報TOPへ\n"; print "

\n"; } ################################################################ # 記事一覧 ################################################################ sub view_all { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; if ($in{'pass'} ne $passwd) { &gate; } print "Content-type:text/html; charset=Shift_JIS\n\n"; &header; print "
\n"; print "

編集/削除

\n"; if ($in{'stt'}) { $stt = $in{'stt'}; } else { $stt = 0; } $end = $stt + $list_all - 1; $max = $#data; if ($end > $max) { $end = $max; } if ($max < 0) { print "記事はありません"; } else { print "
\n"; print "\n"; print "\n"; @data = reverse @data; foreach ($stt .. $end) { $c = $_ + 1; $n = @data - $_; $data[$_] =~ s/\n//; ($date,$no,$text) = split(/<>/,$data[$_]); $text_sub=substr($text,0,20); if ($date == 0) { $date = "
---
"; } print ""; print ""; print ""; print "\n"; } print "
NO日付内容
$n$date$text_sub"; print "編集 "; print "削除 "; print "
\n"; if ($c <= $max) { print "次へ"; } else { print "
次はありません"; } if ($max > $list_all) { $no = 0; for ($i = 0; $i <= $max; $i += $list_all) { $no ++; if ($stt == $i) { print "|$no"; } else { print "|$no"; } } } print "
\n"; } print "

新着情報TOPへ\n"; print "\n"; } ################################################################ # 記事編集 ################################################################ sub edit { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; if ($in{'pass'} ne $passwd) { &gate; } foreach (@data) { ($date,$no,$text) = split(/<>/,$_); $bgcol =~ s/\s//; if ($in{'no'} == $no) { last; } } $text =~ s/
/\n/g; $text =~ s/<.*?>//g; if ($date == 0) { ($day,$mon,$year) = (localtime(time))[3,4,5]; $year += 1900; $year_now = $year; $mon ++; } else { $year_now = (localtime(time))[5]; $year_now += 1900; ($year,$mon,$day) = split(/\D+/,$date); } print "Content-type:text/html; charset=Shift_JIS\n\n"; &header; print "

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "

編集

\n"; print "\n"; print "\n"; } else { print "\n"; } print "\n"; print "
日付\n"; print "\n"; print "\n"; print "
内容
"; print " URL自動リンク
\n"; print "

\n"; print "\n"; print "

新着情報TOPへ\n"; print "

\n"; exit; } ################################################################ #  ################################################################ sub regist { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; if ($in{'pass'} ne $passwd) { &gate; } if ($in{'text'} eq '') { &error("内容が書かれていません"); } if ($in{'no_date'}) { $date = 0; } else { $date = "$in{'year'}/$in{'mon'}/$in{'day'}"; } $in{'text'} =~ s/\n/
/g; if ($in{'auto_link'}) { $in{'text'} =~ s/(https?|ftp|mailto|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig; } if ($in{'no'}) { $new = "$date<>$in{'no'}<>$in{'text'}\n"; foreach (@data) { ($a,$no) = split(/<>/,$_); if ($no == $in{'no'}) { push(@new,$new); } else { push(@new,$_); } } @new = sort @new; # unshift(@new,"$passwd\n"); if (! open(DATA,"> $file")) { &error("file open error"); } print DATA @new; close (DATA); } else { $new = "$date<>" . time . "<>$in{'text'}\n"; push (@data,$new); while ($max_logs && @data > $max_logs) { shift(@data); } @data = sort @data; # unshift(@data,"$passwd\n"); if (! open(DATA,"> $file")) { &error("file open error"); } print DATA @data; close (DATA); } &view; } ################################################################ #  ################################################################ sub delete { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; if ($in{'pass'} ne $passwd) { &gate; } foreach (@data) { ($a,$no) = split(/<>/,$_); if ($no != $in{'no'}) { push(@new,$_); } } # unshift(@new,"$passwd\n"); if (! open(DATA,"> $file")) { &error("file open error"); } print DATA @new; close (DATA); &view_all; } ################################################################ #  ################################################################ sub gate { if (! open(DATA,$file)) { &error("file open error"); } @data = ; close (DATA); # $passwd = shift (@data); # $passwd =~ s/\s//g; print "Content-type:text/html; charset=Shift_JIS\n\n"; &header; print "
\n"; print "
\n"; print ""; print "新規書込 編集/削除
\n"; print "パスワードを入力してログインボタンをクリックして下さい

\n"; print "\n"; print "\n

\n"; print "\n
新着情報TOPへ\n"; print "\n"; exit; } ################################################################ #  ################################################################ sub dataset { if (! $in{'pass'} || ! $in{'pass2'}) { &error("パスワードが入力されていません"); } if ($in{'pass'} ne $in{'pass2'}) { &error("入力された2つのパスワードの内、
どちらかが間違っています"); } if (! open(DATA,"> $file")) { &error("file open error"); } print DATA "$in{'pass'}\n"; close (DATA); print "Content-type:text/html; charset=Shift_JIS\n\n"; print "\n$style\n\n"; print "新たにパスワードを設定しました。

\n"; print "|管理モードへ|\n"; print "新着情報TOPへ|\n"; print "\n"; exit; } ################################################################ # HTMLヘッダ ################################################################ sub header { if ($headflag) { return; } print <<"EOM"; EOM $headflag=1; } ################################################################ #  ################################################################ sub error { print "Content-type:text/html; charset=Shift_JIS\n\n"; print "\n$style\n\n"; print "$_[0]\n"; print "\n"; exit; }