#! /usr/local/bin/perl ;# Simple MEMO v1.4(フリーソフト) ;# ;# (c)rescue.ne.jp ;# Scripts Found at: http://www.rescue.ne.jp/ # History # ------- # 1997年 8月16日 v1.0初版公開 # 1998年 2月 5日 v1.1公開 $1$暗号仕様対応 # 1998年 3月15日 v1.2 暗号処理のバグ修正(管理者削除できないバグを修復) # 1999年 2月20日 v1.3 タグ系のセキュリティ強化 # 1999年 11月26日 v1.4 クッキー処理の2000年対応 #-------------------------------------------------------------------# # 画面中に表示するタイトル名(タグが書けます) $title = '

シンプルメモ

'; # に表示するタイトル名 $title2 = 'シンプルメモ'; # 最大記録保持件数(これを超えると古いものから自動削除) $max = 100; # 1画面に表示するメモ件数 $def = 10; # 画面設定 $body = ''; # 画面上部(タイトルの下)に挿入する文章など(タグが書けます) 必要ない場合は空欄に。 $text1 = 'ここに書いた文章は画面に表示されます。'; $text2 = ''; $text3 = ''; # 終了ボタンを押すと表示するページのURL $bye = 'http://www.xxx.or.jp/~user/'; # 1つのメモに書き込める最大文字制限数(半角文字で換算) $v_max = 100; # データ記録ファイル $file = "./memo.dat"; # 日本語コード変換ライブラリ require './jcode.pl'; # 入力方式 $method = 'post'; #-------------------------------------------------------------------# ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($month < 10) { $month = "0$month"; } if ($mday < 10) { $mday = "0$mday"; } if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } $month = ($mon + 1); $y0="日"; $y1="月"; $y2="火"; $y3="水"; $y4="木"; $y5="金"; $y6="土"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wday]; $num = "$year$month$mday$hour$min$sec"; $date_now = "$month\/$mday($youbi)$hour\:$min"; $cookie_name = $bye; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; $value =~ s//>/g; $value =~ s/"/"/g; &jcode'convert(*value,'sjis'); if ($name eq "target") { push(@RM,$value); } else { $FORM{$name} = $value; } } sub in { if (!open(DB,"$file")) { &error(0); } @lines = ; close(DB); $password = shift(@lines); chop($password) if $password =~ /\n$/; ($header,$password) = split(/:/,$password); if ($FORM{'action'} eq 'password') { &encode; } if ($FORM{'admin'} eq 'change') { &password; } if ($header ne 'crypt_password') { $first = 1; &password; } } ∈ if ($password =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if ($FORM{'action'} eq 'remove' && crypt($FORM{'pwd'}, substr($password,$salt,2)) eq $password) { &remove2; ∈ &html; } elsif (crypt($FORM{'pwd'}, substr($password,$salt,2)) eq $password) { &remove1; } elsif ($FORM{'action'} eq 'regist') { ®ist; } else { &html; } sub html { print "Content-type: text/html\n\n"; print "$title2\n\n"; print "$body\n"; print "$title

\n"; print "$text1\n"; print "$text2\n"; print "$text3

\n"; if ($FORM{'action'} ne 'regist') { &input1; } &input2; print "


\n"; if ($FORM{'action'} ne 'regist') { if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } } $accesses = @lines; if ($accesses == 0) { print "メモはありません.\n"; } $accesses--; $page_end = $page + $def - 1; if ($page_end > $accesses) { $page_end = $accesses; } foreach ($page .. $page_end) { ($number,$date,$name,$email,$value,$url) = split(/\,/,$lines[$_]); chop($url); $value =~ s/\0/\,/g; print "[$date] "; if ($name =~ /(.*)/) { $name = $1; $dns = $2; } if ($email ne '') { print "$name > "; } else { print "$name > "; } print "$value"; if ($url ne '') { print " \n"; } print "\n"; print "
\n"; } $page_next = $page_end + 1; $i = $page + 1; $j = $page_end + 1; print "\n"; if ($accesses >= 0) { if ($page_end ne $accesses) { print "\n"; print "\n"; print "\n"; print "\n"; } else { print "\n"; } } print "\n"; print "\n"; print "
新着順 $i \- $j
新着順 $i \-> 最後最大記録件数 $max

\n\n"; print "

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

' . "\n"; print "
\n"; print ""; print "

\n"; print "
管理者用コマンドエリア
パスワード '; print '

\n\n"; # このスクリプトの著作権表示(かならず表示してください) print "

SimpleMEMO

\n"; print '' . "\n"; exit; } sub regist { $FORM{'name'} =~ s/\;//g; $FORM{'name'} =~ s/\://g; $FORM{'name'} =~ s/\=//g; $FORM{'email'} =~ s/\;//g; $FORM{'email'} =~ s/\://g; $FORM{'email'} =~ s/\=//g; $FORM{'value'} =~ s/\,/\0/g; $FORM{'name'} =~ s/\,//g; $FORM{'email'} =~ s/\,//g; $FORM{'url'} =~ s/\,//g; $FORM{'name'} =~ s///g; $FORM{'email'} =~ s///g; $FORM{'url'} =~ s///g; $len = length($FORM{'name'}); $m = '20'; $n = '名前'; if ($len > $m) { &error(len); } $len = $len_value = length($FORM{'value'}); $m = $v_max; $n = 'メモ'; if ($len > $m) { &error(len); } if ($FORM{'name'} eq "") { &error(1); } if ($FORM{'value'} eq "") { &error(2); } if ($FORM{'email'} ne "") { if (!($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error(3); }} if ($FORM{'url'} eq "" || $FORM{'url'} eq "http://") { $FORM{'url'} = ''; } ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60);# 期限を30日後に設定(GMT) $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}"; print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n"; $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } if (!open(DB,"$file")) { &error(0); } @lines = ; $password = shift(@lines); close(DB); $i = 0; foreach $line (@lines) { $i++; if ($i == $max) { last; } push(@new,$line); } $value = "$num\,$date_now\,$FORM{'name'}\\,$FORM{'email'}\,$FORM{'value'}\,$FORM{'url'}\n"; unshift(@new,$value); if (!open(DB,">$file")) { &error(0); } print DB $password; print DB @new; close(DB); $COOKIE{'name'} = $FORM{'name'}; $COOKIE{'email'} = $FORM{'email'}; ∈ &html; } sub error { $error = $_[0]; if ($error eq "0") { $error_msg = '記録ファイルの入出力にエラーが発生しました.'; } elsif ($error eq "1") { $error_msg = '投稿者名が記入されていません.'; } elsif ($error eq "2") { $error_msg = '内容が書かれていません.'; } elsif ($error eq "3") { $error_msg = 'メールアドレスが正しく入力されていません.'; } elsif ($error eq "len") { $error_msg = "$nの文字数制限は半角$m文字以内(全角はその半分)です.
半角で計測(特殊文字を含む)すると$len文字使用しています."; } else { $error_msg = '意味不明なエラー.'; } print "Content-type: text/html\n\n"; print "$title2\n"; print "$body\n"; print "

$error_msg

\n"; print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.\n"; print '

' . "\n"; exit; } sub remove1 { if (!open(DB,"$file")) { &error(0); } @lines = ; $password = shift(@lines); close(DB); print "Content-type: text/html\n\n"; print "$title2\n"; print "$body\n"; print "

削除モード

\n"; print "

\n"; print '' . "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $line (@lines) { ($number2,$date,$name,$email,$value,$url) = split(/\,/,$line); print "\n"; print "\n"; if ($email ne '') { print "\n"; } else { print "\n"; } print "\n"; } print "
削除投稿日投稿者
$date$name$name

\n"; print "\n"; print '' . "\n"; print '' . "\n"; print '

' . "\n"; print "[メモ一覧へ]

\n"; print '' . "\n"; exit; } sub remove2 { if (!open(DB,"$file")) { &error(0); } @lines = ; $password = shift(@lines); close(DB); foreach $line (@lines) { ($number,$date,$name,$email,$value,$url) = split(/\,/,$line); $del = 0; foreach $target (@RM) { if ($target eq $number) { $del = 1; } } if ($del == 0) { push(@new,$line); } } if (!open(DB,">$file")) { &error(0); } print DB $password; print DB @new; close(DB); } sub password { print "Content-type: text/html\n\n"; print "$title2\n"; print "$body\n"; print "

パスワードの設定/変更

\n"; if ($first && $message eq '') { print "メモ削除するためのパスワードを登録します。

\n"; } else { print "$message

\n"; } print "

\n"; print "\n"; if ($first != 1) { print "旧パスワード
\n"; } print "新パスワード
\n"; print "新パスワード (確認のためもう一度)

\n"; print "

\n"; print "\n"; exit; } sub encode { if ($header eq 'crypt_password') { if ($password =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if (crypt($FORM{'password_old'}, substr($password,$salt,2)) ne $password) { $message = '旧パスワードが認証されませんでした.'; &password; } } else { if (!open(DB,"$file")) { &error(0); } @lines = ; close(DB); $first = 1; } if ($FORM{'password'} =~ /\W/ || $FORM{'password'} eq '') { $message = '新パスワードに英数字以外の文字が含まれているか空欄です.'; &password; } if ($FORM{'password'} ne $FORM{'password2'}) { $message = '確認のために入力された新パスワードが一致しません.'; &password; } $now = time; ($p1, $p2) = unpack("C2", $now); $wk = $now / (60*60*24*7) + $p1 + $p2 - 8; @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); $nsalt = $saltset[$wk % 64] . $saltset[$now % 64]; $pwd = crypt($FORM{'password'}, $nsalt); if (!open(DB,">$file")) { &error(0); } print DB "crypt_password:$pwd\n"; print DB @lines; close(DB); &html; } sub input1 { $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_name}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } } sub input2 { print <<"EOF";

\n
投稿者 E-Mail
内容
<記録できる最大文字数は半角で$v_max文字まで(全角でその半分)です>
URL

EOF }