#!/usr/bin/perl require "../jcode.pl"; use CGI; #============================ ユーザー設定 ==== $CHARSET = 'EUC-JP'; # 文字コード $DATAFILE = '../dat/users.dat'; # 記事ファイル $PAGEVIEW = 10; # ページ記事数 $MAXLINE = 100; # 最大記事数 $PASSWORD = 'kamisama'; # 管理パスワード $COOKIE_PREFIX = 'bbs'; # クッキープリフィクス $COOKIE_LIFE = 30; # クッキー期限(日) $SESSIONFILE = '../dat/session.dat'; # セッション管理ファイル $USERFILE = '../dat/users.dat'; # ユーザーファイル #======================== メインプログラム ==== loadFormdata(); loadCookie(); loadSession(); $member = checkCode(); if($member) { # クッキーに暗号が一致 loadUserfile(); # 記事データの読み込み open(FILE, "<$DATAFILE") or printErrorPage("openError"); eval{ flock(FILE, 1) }; @DATA = ; close(FILE); if(exists $FORM{'mode'}) { if($FORM{'mode'} eq 'write') { if($FORM{'title'} and $FORM{'text'}){ writeArticle(); # 書き込みモード } } else { deleteArticle(); # 削除モード } # 記事データの書き込み open(FILE, ">$DATAFILE") or printErrorPage("openError"); eval{ flock(FILE, 2) }; print FILE @DATA; close(FILE); } printPage(); } else { $CGI = new CGI(); print $CGI->redirect("./index.html"); } exit; #========================== 記事ページ出力 ==== sub printPage { my ($gsec, $gmin, $ghour, $gmday, $gmon, $gyear, $gwday) = localtime(time); $gyear += 1900; $gmon++; my $begin = $FORM{'page'} * $PAGEVIEW; my $end = $begin + $PAGEVIEW; if($end > @DATA) { $end = @DATA; } printHttpHeader(); print < メンバーリスト|埼玉大学軟式庭球同好会
埼玉大学軟式庭球同好会トップページ軟式庭球同好会についてスケジュール試合結果フォトアルバムコミュニティ
メンバーリスト
END if (exists $FORM{'member'}) { loadMemberfile(); print <$MEMBER{'name'}さんのプロフィール
名前:$MEMBER{'name'}
ニックネーム:$MEMBER{'nickname'}
学部学科:$MEMBER{'subject'}
入学年度:$MEMBER{'year'}
性別:$MEMBER{'sex'}
生年月日:$MEMBER{'birth'}
血液型:$MEMBER{'blood'}
趣味:$MEMBER{'hobby'}
出身地:$MEMBER{'home'}
出身高校:$MEMBER{'school'}
自己紹介:$MEMBER{'intro'}

END } else { print <$ID{'name'}さんのプロフィール
名前:$ID{'name'}
ニックネーム:$ID{'nickname'}
学部学科:$ID{'subject'}
入学年度:$ID{'year'}
性別:$ID{'sex'}
生年月日:$ID{'birth'}
血液型:$ID{'blood'}
趣味:$ID{'hobby'}
出身地:$ID{'home'}
出身高校:$ID{'school'}
自己紹介:$ID{'intro'}

END } print "
"; printf "", $countMember; print < 管理パスワード:
Menu
END my $yearcheck; if($gmon<4){ $yearcheck = $gyear-1; } else{ $yearcheck = $gyear; } $yearcheck .= "年度"; print "\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-2; } else{ $yearcheck = $gyear-1; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-3; } else{ $yearcheck = $gyear-2; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-4; } else{ $yearcheck = $gyear-3; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-5; } else{ $yearcheck = $gyear-4; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-6; } else{ $yearcheck = $gyear-5; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-7; } else{ $yearcheck = $gyear-6; } $yearcheck .= "年度"; print "
\"\" $yearcheck入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year eq $yearcheck) { print "$name
\n"; } } if($gmon<4){ $yearcheck = $gyear-8; } else{ $yearcheck = $gyear-7; } $yearcheck .= "年度"; print "
\"\" $yearcheck以前入学生
\n"; for($i = 0 ; $i < @DATA ; ++$i) { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split (/\t/, $DATA[$i]); if ($year <= $yearcheck) { print "$name
\n"; } } print <
 
END } # ------------------------------------------------クッキーの暗号が一致したらID、なければ0を返す sub checkCode { my($name, $pass, %CODEN, $load); open(FILE, "<$SESSIONFILE") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODEN{$pass} = $name; } $load = $SESSION{'id'}; close(FILE); if (exists $CODEN{$load}) { return $CODEN{$load}; } else { return 0; } } # ------------------------------------------------ユーザーファイル読み込み($memberを基に個人の%IDを作成。IDが一致しなければIDエラーページ出力) sub loadUserfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro, %USERS); open(FILE, "<$USERFILE") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split(/\t/, $ln); if($id eq $member) { %ID = ('name' => $name, 'pass' => $pass, 'id' => $id, 'sex' => $sex, 'birth' => $birth, 'blood' => $blood, 'email' => $email, 'nickname' => $nickname, 'home' => $home, 'school' => $school, 'subject' => $subject, 'year' => $year, 'hobby' => $hobby, 'intro' => $intro); close(FILE); return 0; } } close(FILE); printPage("IDerror"); exit; } # ------------------------------------------------ユーザーファイル読み込み($memberを基に個人の%IDを作成。IDが一致しなければIDエラーページ出力) sub loadMemberfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro, %USERS); open(FILE, "<$USERFILE") or printPage("openError"); eval{ flock(FILE, 1) }; $countMember = 0; while($ln = ) { chomp $ln; ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = split(/\t/, $ln); if($id eq $FORM{'member'}) { %MEMBER = ('name' => $name, 'pass' => $pass, 'id' => $id, 'sex' => $sex, 'birth' => $birth, 'blood' => $blood, 'email' => $email, 'nickname' => $nickname, 'home' => $home, 'school' => $school, 'subject' => $subject, 'year' => $year, 'hobby' => $hobby, 'intro' => $intro); close(FILE); return 0; } $countMember ++; } close(FILE); exit; } #========================== 記事を書き込む ==== sub writeArticle { my @wdy_str = ('日', '月', '火', '水', '木', '金', '土'); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); my $date = sprintf("%4d年%02d月%02d日(%s) %02d:%02d", $year + 1900, ++$mon, $mday, $wdy_str[$wday], $hour, $min); unshift @DATA, "$date\t$FORM{'title'}\t$ID{'name'}\t$ID{'id'}\t$FORM{'text'}\n"; while(@DATA > $MAXLINE) { pop @DATA; } } #========================== 記事を削除する ==== sub deleteArticle { my $key; if($FORM{'pass'} ne $PASSWORD) { printErrorPage("管理パスワードが違います。"); } $key = $FORM{'del'}; splice @DATA, $key, 1; } #======================== HTTPヘッダー出力 ==== sub printHttpHeader { # グリニッジ標準時の文字列 my @mon_str = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); my @wdy_str = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + ($COOKIE_LIFE * 24 * 60 * 60)); my $date = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $wdy_str[$wday], $mday, $mon_str[$mon], $year + 1900, $hour, $min, $sec); # ヘッダーの出力 my ($name, $value); print "Content-type: text/html; charset=$CHARSET\n"; foreach $name (keys %COOKIE) { $value = $COOKIE{$name}; $name = "${COOKIE_PREFIX}_$name"; $value =~ s/(\W)/sprintf("%%%02X", ord($1))/eg; print "Set-Cookie: $name=$value; expires=$date\n"; } print "\n"; } #======================== エラーページ出力 ==== sub printErrorPage { print < エラー

エラー

$_[0]

END exit; } #================== クッキーデータ取り込み ==== sub loadCookie { my $pair; foreach $pair (split(/;\s*/, $ENV{'HTTP_COOKIE'})) { my ($name, $value) = split(/=/, $pair); if(not $name =~ /${COOKIE_PREFIX}_(.+)/) { next; } $name = $1; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $COOKIE{$name} = $value; } } # ------------------------------------------------クッキー読み込み sub loadSession { my $pair; foreach $pair (split(/;\s*/, $ENV{'HTTP_COOKIE'})) { my ($name, $value) = split(/=/, $pair); $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $SESSION{$name} = $value; } } #================== フォームデータ取り込み ==== sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value = jcode::euc($value); $value =~ s/&/&/g; $value =~ s//>/g; $value =~ s/\x0D\x0A/
/g; $value =~ tr/\t/ /; $FORM{$key} = $value; } }