#!/usr/bin/perl require "../jcode.pl"; use CGI; $CGI::POST_MAX = 1024 * 1024; # 1MB # ------------------------------------------------設定変数 $USERFILE = '../dat/users.dat'; # ユーザーファイル $SESSION = '../dat/session.dat'; # セッション管理ファイル $CHARSET = 'EUC-JP'; # 文字コード $DATAFOLDER = '../article/'; # 記事フォルダ $COOKIE_PREFIX = 'login'; # クッキープリフィクス $COOKIE_LIFE = 30; # クッキー期限(日) $DATAFILE = './article.dat'; # 記事ファイル $PAGEVIEW = 10; # ページ記事数 $MAXLINE = 100; # 最大記事数 # ------------------------------------------------メインプログラム $agent = $ENV{'HTTP_USER_AGENT'}; if($agent =~ /DoCoMo/){ printMobile(); }elsif($agent =~ /UP.Browser/){ printMobile(); }elsif($agent =~ /J-PHONE|Vodafone|SoftBank/){ printMobile(); } else{ loadFormdata(); loadCookie(); $member = checkCode(); if(exists $FORM{'logout'}){ $CODE{$member}=0; printPage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } else { # 記事データの読み込み open(FILE, "<$DATAFILE") or printErrorPage("openError"); eval{ flock(FILE, 1) }; @DATA = ; close(FILE); if($member) { # クッキーに暗号が一致 loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み if($FORM{'mode'} ne "") { if($FORM{'mode'} eq 'write') { if($FORM{'title'} ne "" and $FORM{'text'} ne ""){ writeArticle(); # 書き込みモード } } else { deleteArticle(); # 削除モード } # 記事データの書き込み open(FILE, ">$DATAFILE") or printErrorPage("openError"); eval{ flock(FILE, 2) }; print FILE @DATA; close(FILE); $CGI = new CGI(); print $CGI->redirect("$ENV{'SCRIPT_NAME'}"); } printPage("IDpassed"); } else { if($FORM{'id'} and $FORM{'pass'}){ # フォームにID,PASSがあるかどうかの確認 $member = $FORM{'id'}; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 if($FORM{'pass'} eq $ID{'pass'}){ # フォームのID,PASSがユーザーファイルのIDと一致 calculatCode(); # CODEの計算及びユーザーファイルに保存 loadArticle(); # 記事読み込み printPage("IDpassed"); } else { printPage("IDerror"); # エラーページ出力("ID,PASSが異なります") } } else { printPage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } } } } exit; # ------------------------------------------------モバイルのメインプログラム sub printMobile { loadFormdata(); loadCookie(); $member = checkCode(); $mobile = checkMobile(); if(exists $FORM{'logout'}){ $CODE{$member}=0; printMobilePage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } else { if($member) { # クッキーに暗号が一致 loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } elsif($mobile){ $member = $mobile; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } else { if($FORM{'id'} and $FORM{'pass'}){ # フォームにID,PASSがあるかどうかの確認 $member = $FORM{'id'}; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 if($FORM{'pass'} eq $ID{'pass'}){ # フォームのID,PASSがユーザーファイルのIDと一致 calculatCode(); # CODEの計算及びユーザーファイルに保存 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } else { printMobilePage("IDerror"); # エラーページ出力("ID,PASSが異なります") } } else { printMobilePage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } } } } # ------------------------------------------------モバイルページの出力 sub printMobilePage { printHttpHeader(); print < 軟式庭球同好会 軟式庭球同好会
END #振り分け if ($_[0] eq "IDpassed") { print < END }elsif($_[0] eq "IDerror") { #ID,PASSが異なります print < ID:

PASS:

保存する
携帯電話からのアカウント作成はできません END }elsif($_[0] eq "IDvoid") { #ID,PASSを入力してください print < ID:

PASS:

保存する
携帯電話からのアカウント作成はできません
END } #振り分け終わり print <HOME
┣お知らせ
┣イベント
掲示板
メンバー一覧
┗ML

サイトの使い方
アカウント編集
ログアウト
END } # ------------------------------------------------クッキーの暗号が一致したらID、なければ0を返す sub checkMobile { my($name, $pass, %CODEN, $load); open(FILE, "<$SESSION") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODEN{$pass} = $name; } $load = $FORM{'session'}; close(FILE); if (exists $CODEN{$load}) { return $CODEN{$load}; } else { return 0; } } # ------------------------------------------------クッキーの暗号が一致したらID、なければ0を返す sub checkCode { my($name, $pass, %CODEN, $load); open(FILE, "<$SESSION") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODEN{$pass} = $name; } $load = $COOKIE{'id'}; close(FILE); if (exists $CODEN{$load}) { return $CODEN{$load}; } else { return 0; } } # ------------------------------------------------セッションCODEの乱数発生及びユーザーファイルに保存 sub calculatCode { my ($passwd, @c, $ln, $name, $pass, $fp); @c = (0..9,'A'..'Z','a'..'z'); srand; $passwd = ''; $passwd .= $c[int(rand(@c))] while length($passwd) < 8; # 書き直しユーザーファイル読み書き open(FILE, "+<$SESSION") or printPage("openError"); eval{ flock(FILE, 2) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODE{$name} = $pass; } $CODE{$member} = $passwd; seek( FILE, 0, 0); foreach $CODEKEY (keys %CODE) { print FILE "$CODEKEY:$CODE{$CODEKEY}\n"; } $fp = tell( FILE ); truncate( FILE, $fp); close(FILE); } # ------------------------------------------------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"; if (exists $CODE{$member}) { $value = $CODE{$member}; $name = 'id'; if ($FORM{'login'} eq "true") { print "Set-Cookie: $name=$value; expires=$date\n"; } else { print "Set-Cookie: $name=$value\n"; } } print "\n"; } # ------------------------------------------------クッキー読み込み sub loadCookie { 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; $COOKIE{$name} = $value; } } # ------------------------------------------------記事情報読み込み sub loadArticle { return 0; } # ------------------------------------------------ユーザーファイル読み込み($memberを基に個人の%IDを作成。IDが一致しなければIDエラーページ出力) sub loadUserfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, %USERS); open(FILE, "<$USERFILE") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass, $id, $sex, $birth, $blood, $email) = split(/\t/, $ln); if($id eq $member) { %ID = ('name' => $name, 'pass' => $pass, 'id' => $id, 'sex' => $sex, 'birth' => $birth, 'blood' => $blood, 'email' => $email); close(FILE); return 0; } } close(FILE); printPage("IDerror"); exit; } #================== フォームデータ取り込み ==== 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; } $loadcgi = new CGI; $FORM{'mode'} = $loadcgi->param('mode'); $FORM{'title'} = $loadcgi->param('title'); $FORM{'text'} = $loadcgi->param('text'); $FORM{'pass'} = $loadcgi->param('pass'); $FORM{'del'} = $loadcgi->param('del'); foreach $pairform (keys %FORM) { my $value = $FORM{$pairform}; $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{$pairform} = $value; } } #========================== 記事を書き込む ==== 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); # my $query = new CGI; # 初期設定 ------------------------------------- # 最大許容サイズ(KByte) my $maxsize = 300; # 保存先ディレクトリ my $uploadfiles = "./file/"; # アップロードを許可するファイルの種類(MIMEと拡張子) %hash_mime = ( 'text/html' => 'html', # HTMLファイル 'image/jpeg' => 'jpg', # JPEGファイル 'image/gif' => 'gif', # GIFファイル 'image/pjpeg' => 'jpg', # プログレッシブJPEGファイル 'text/plain' => 'txt', # textファイル 'image/x-png' => 'png', # PNGファイル 'image/png' => 'png', # PNGファイル 'application/msword' => 'doc', # wordファイル 'application/pdf' => 'pdf', # PDFファイル 'application/msexcel' => 'xls', # EXCELファイル 'image/bmp' => 'bmp' # ビットマップファイル ); # 送られてきたデータを処理する ----------------- # ファイル取得 my $fH = $loadcgi->upload('filename'); my $set; # エラーチェック if ($loadcgi->cgi_error) { my $err = $loadcgi->cgi_error; &error("$err") if ($err); } if (defined($fH)) { # MIMEタイプ取得 my $mimetype = $loadcgi->uploadInfo($fH)->{'Content-Type'}; $testmime = $mimetype; # 保存するファイル名を取得 $set = &set_name($mimetype); # ファイルサイズ取得 my $size = (stat($fH))[7]; # サイズ制限 &error("The filesize is too large. Max $maxsize KB") if ($size > $maxsize * 1024); # ファイル保存 --------------------------------- $uploadfilesname = $uploadfiles; my ($buffer); open (OUT, ">$uploadfilesname$set") || &error("Can't open $set"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); # Windowsプラットフォーム用 chmod (0666, "$uploadfilesname$set"); } unshift @DATA, "$date\t$FORM{'title'}\t$ID{'name'}\t$ID{'id'}\t$FORM{'text'}\t$uploadfilesname$set\n"; while(@DATA > $MAXLINE) { pop @DATA; } } # ファイル名を設定 ----------------------------- sub set_name { my ($mime) = @_; # 拡張子をセット my $ext = $hash_mime{$mime} ? $hash_mime{$mime} : &error("この種類のファイルはアップロードできません。
MIMETYPE:$testmime"); # ファイル名のフォーマット my $set = time . "_" . $$ . "." . $ext; return $set; } # エラー出力 ----------------------------------- sub error { print < エラー

エラー

$_[0]

戻る END exit; } #========================== 記事を削除する ==== sub deleteArticle { my $key; #if($FORM{'pass'} ne $PASSWORD) { # printErrorPage("管理パスワードが違います。"); #} $key = $FORM{'del'}; splice @DATA, $key, 1; } # ------------------------------------------------メインhtml出力(メインhtmlのひな型) sub printPage { my $begin = $FORM{'page'} * $PAGEVIEW; my $end = $begin + $PAGEVIEW; if($end > @DATA) { $end = @DATA; } printHttpHeader(); print < 試合結果|埼玉大学軟式庭球同好会
END #振り分け if ($_[0] eq "IDpassed") { print <
ようこそ、$ID{'name'}さん
END }elsif($_[0] eq "IDerror") { #ID,PASSが異なります print <
自動的にログイン
END }elsif($_[0] eq "IDvoid") { #ID,PASSを入力してください print <
自動的にログイン
END } #振り分け終わり print <
埼玉大学軟式庭球同好会トップページ軟式庭球同好会についてスケジュール試合結果フォトアルバムコミュニティ
埼玉大学軟式庭球同好会写真
試合結果
END my $iart; if(exists $FORM{'page'}){ $iart = $FORM{'page'}; } else{ $iart = 0; } my ($date, $title, $author, $email, $text, $link) = split (/\t/, $DATA[$iart]); if ($title ne ""){ print "

$title

\n"; print "
\n

$text

\n"; chomp $link; if ($link ne ""){ print "→ 添付ファイル"; } if ($_[0] eq "IDpassed") { print "
$author"; print " [ $date ]
"; } print "
\n"; } else { print "

このページは存在しません

\n

\n"; } if ($_[0] eq "IDpassed") { print "
"; printf "", $iart; print <
END } if ($_[0] eq "IDpassed") { print <試合結果を投稿する
ログインしている人なら誰でも投稿できます。
添付ファイルはドロー表などがあれば添付してください。
題名:
内容:
添付: 300KBまで
END } print <
Menu
過去の試合結果
END if($PAGEVIEW > @DATA) { $PAGEVIEW = @DATA; } for ($i = 0 ; $i < $PAGEVIEW ; $i++) { my ($date, $title, $author, $email, $text) = split (/\t/, $DATA[$i]); print "
\n"; print "
\n"; } print <
 
END } # ------------------------------------------------認証時ページ出力("トップページ") sub IDpassed { return 0; } # ------------------------------------------------エラーページ出力("ID,PASSが異なります") sub IDerror { return 0; } # ------------------------------------------------ログインページ出力("ID,PASSを入力してください") sub IDvoid { return 0; }