#!/usr/bin/perl #------------------------------------------# # ↑このperlのパスはプロバイダによって違う # # ので、分からないときはプロバイダに聞く。 # #------------------------------------------# ########################################################### # PerlDiary Ver.1.08 # # # # 種別     : Free # # 作成日    : 09/28/1997 # # 更新日    : 12/18/2001 # # 著作権者   : 飾り職人ひで(Hideyuki Chikada) # # メールアドレス: hideyuki@din.or.jp # # ホームページ : http://www.din.or.jp/~hideyuki/home/ # # # # Copyright (c) 1997-1998 Hideyuki Chikada # # All rights reserved. # #=========================================================# # この著作権表示は書き換えないで下さい # ########################################################### ########## ↓ 初期設定(必ず書き換える) ↓ ########## ##### ライブラリの呼び出し(jcode.plとcgi-lib.plのパス) require './library/jcode.pl'; require './library/cgi-lib.pl'; &ReadParse; ##### このファイルのURL(相対URLではなく「http://」から始まるURLで指定) $thisfile = 'http://web.sfc.keio.ac.jp/~t00079ki/banrai/diary/perldiary.cgi'; ##### ログファイル(diarylog.datのパス) $logfile = './diarylog.dat'; ##### 日記帳のタイトル $title = 'PerlDiary Ver.1.08'; ##### 文字色や背景色、壁紙などの設定(普通のBODYタグ) $body = ''; ##### FORMタグのMETHOD属性 #--------------------------------------------# # Method not implemented..というエラーが   # # 出る場合は、POSTを GETに書き換えて下さい。 # #--------------------------------------------# $method = 'POST'; ##### 「ホームページへ戻る」のリンク先URL $back = 'http://www.din.or.jp/~hideyuki/home/'; ##### 記録させる記事の最大件数 #----------------------------------------------# # この数値を越えると古い記事から削除されます。 # #----------------------------------------------# $max = 900; ##### 1ページに表示する記事の数 $limit = 30; ##### 管理者のパスワード #----------------------------------------# # このパスワードを知っている管理者だけが # # 記事の投稿や削除ができます。      # # できるだけ他人に分かりにくいパスワード # # にして下さい。             # #----------------------------------------# $admin = 'musai'; ########## ↑ 初期設定終了 ↑ ########## #----------------------------------------------------------# # ここから下をカスタマイズするには、Perlの知識が必要です。 # # Perlについて十分な知識のない方は、変更しないで下さい。  # #----------------------------------------------------------# ##### 漢字コードをsjisに変換、不都合な記号を排除 while (($k,$v) = each %in) { &jcode'convert(*v,"sjis"); $v =~ s/: /:/g; if ($k eq 'text') { $v =~ s/\r?\n/
/g; } $in{$k} = $v; } ##### 時間の取得 ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime; $mon++; $year = 1900 + $year; $mon = sprintf("%.2d",$mon); $mday = sprintf("%.2d",$mday); $hour = sprintf("%.2d",$hour); $sec = sprintf("%.2d",$sec); $min = sprintf("%.2d",$min); @week = ('日','月','火','水','木','金','土'); $wday = $week[$wday]; $jikan = "$year"; ##### 管理者モード or 投稿 or 確認 or 送信 or 削除 or ログ表示 if ($in{'action'} eq "admin") { if ($in{'admin'} ne $admin) { &Error('Forbidden','パスワードが違います。
'); } &PrintAdmin; } elsif ($in{'action'} eq "new") { if ($in{'admin'} ne $admin) { &Error('Forbidden','不正なアクセスを拒否します。'); } &PrintNew; } elsif ($in{'action'} eq "check") { if ($in{'admin'} ne $admin) { &Error('Forbidden','不正なアクセスを拒否します。'); } &PrintCheck; } elsif ($in{'action'} eq "send") { if ($in{'admin'} ne $admin) { &Error('Forbidden','不正なアクセスを拒否します。'); } &ReadFile; &WriteFile; print "Location: $thisfile?\n\n"; } elsif ($in{'action'} eq "del") { if ($in{'admin'} ne $admin) { &Error('Forbidden','不正なアクセスを拒否します。'); } &ReadFile; &PrintDel; } elsif ($in{'action'} eq "del2") { if ($in{'admin'} ne $admin) { &Error('Forbidden','不正なアクセスを拒否します。'); } &ReadFile; &Delete; print "Location: $thisfile?\n\n"; } else { &ReadFile; &PrintLog; } ##### ログファイル読み込み sub ReadFile { open(LOG,"$logfile"); @diarylogs = ; close(LOG); } ##### ログファイル書き込み sub WriteFile { if (substr($diarylogs[0],1,2) eq ': ') { $number = substr($diarylogs[0],0,1); } elsif (substr($diarylogs[0],2,2) eq ': ') { $number = substr($diarylogs[0],0,2); } elsif (substr($diarylogs[0],3,2) eq ': ') { $number = substr($diarylogs[0],0,3); } $number++; $newlog = "$number: $jikan: $in{'text'}: \n"; @diarylogs = ($newlog,@diarylogs); $count = 0; foreach $addlog (@diarylogs) { $count++; if ($count > $max) { last; } push (@newlogs,$addlog); } open(LOG,">>$logfile"); eval { flock(LOG,2); }; eval { truncate(LOG,0) }; seek(LOG,0,0); print LOG @newlogs; eval { flock(LOG,8) }; close(LOG); } ##### HTML出力 sub PrintLog { print "Content-type: text/html\n\n"; ##### ヘッダ出力 print "萬来喫茶 日記


"; ##### 記事出力 $count = 0; if (! $in{'next'}) { $in{'next'} = 0; } foreach ($in{'next'}..$#diarylogs) { if ($count >= $limit) { $nextpage = "on"; $in{'next'} = $in{'next'} + $count; last; } $count++; ($out_number,$out_jikan,$out_text) = split(/: /,$diarylogs[$_]); print "
$out_jikan

\n"; print "$out_text

"; } ##### フッタ出力 if ($nextpage eq "on") { print "

\n"; print "\n"; print "\n"; print "
\n
\n"; } else { } #--------------------------------# # ここは、書き換えないで下さい。 # #--------------------------------# print "

\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "PerlDiary Ver.1.08\n"; print "
\n"; print "

"; print "\n\n"; exit; } ##### メンテナンスモード画面出力 sub PrintAdmin { print "Content-type: text/html\n\n"; print "\n\n管理者メンテナンスモード\n\n"; print "$body\n"; print "

管理者メンテナンスモード

\n"; print "


\n"; print "

\n"; print "\n"; print "\n"; print "\n"; print "新しく記事を追加する。\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "任意の記事を削除する。\n"; print "
\n"; print "\n\n"; exit; } ##### 記事追加フォーム出力 sub PrintNew { print "Content-type: text/html\n\n"; print "\n\n管理者メンテナンスモード\n\n"; print "$body\n"; print "

新規記事追加フォーム

\n"; print "


\n"; print "

\n"; print "\n"; print "\n"; print "記事内容
\n"; print "\n"; print "

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

\n"; print "\n\n"; exit; } ##### 追加記事内容確認画面出力 sub PrintCheck { print "Content-type: text/html\n\n"; print "\n\n管理者メンテナンスモード\n\n"; print "$body\n"; print "

追加記事内容確認

\n"; print "
\n"; print "$in{'text'}\n"; print "
\n"; print "これでよろしければ、下の送信ボタンを押して下さい。
\n"; print "やり直す場合は、ブラウザーのバックボタンで戻って下さい。

\n"; print "

\n"; print "\n"; print "\n"; $in{'text'} =~ s/\"/"/g; print "\n"; print "\n"; print "
\n"; print "\n\n"; exit; } ##### 記事削除画面出力 sub PrintDel { print "Content-type: text/html\n\n"; print "\n\n管理者メンテナンスモード\n\n"; print "$body\n"; print "

記事削除画面

\n"; print "
\n"; print "\n"; print " 削除したい番号のチェックボックスをチェックして、左の削除ボタンを押して下さい。

\n"; print "\n"; print "\n"; print "\n"; print "\n
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach (@diarylogs) { ($out_number,$out_jikan,$out_text) = split(/: /,$_); $out_text =~ s/
/ /g; $out_text =~ s/(<[^<>]*>)//g; if (length($out_text) > 80) { $out_text = substr($out_text,0,78) . '...'; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
番号日時記事
$out_number$out_jikan$out_text
\n"; print "
\n"; print "

\n"; print "\n\n"; exit; } ##### 記事削除 sub Delete { foreach (@diarylogs) { ($out_number,$out_jikan,$out_text) = split(/: /,$_); if (! $in{$out_number}) { push(@newlogs,$_); } } open(LOG,">>$logfile"); eval { flock(LOG,2); }; eval { truncate(LOG,0) }; seek(LOG,0,0); print LOG @newlogs; eval { flock(LOG,8) }; close(LOG); } ##### エラー表示 sub Error { print "Content-type: text/html\n\n"; print "\n\n\n$_[0]\n\n"; print "\n"; print "

$_[0]

\n"; print "$_[1]\n"; print "\n\n"; exit; }