#!/usr/bin/perl require "jcode.pl"; use CGI; # ------------------------------------------------設定変数 $USERFILE = './dat/users.dat'; # ユーザーファイル $SESSION = './dat/session.dat'; # セッション管理ファイル $CHARSET = 'EUC-JP'; # 文字コード $DATAFOLDER = './article/'; # 記事フォルダ $COOKIE_PREFIX = 'login'; # クッキープリフィクス $COOKIE_LIFE = 30; # クッキー期限(日) $ADMINPASS = 'nanteidou'; # 管理パスワード $EDITPASS = 'edit_mmmm'; # 管理パスワード $FORGOTPASS = 'nanteidou'; # ------------------------------------------------メインプログラム $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(not exists $FORM{'adminpass'}) { if($FORM{'mode'} eq "edit"){ if($member){ loadMemberfile(); printPage("edit"); } else{ printPage(); } } elsif($FORM{'mode'} eq "account"){ if($member){ loadMemberfile(); printPage("account"); } else{ printPage(); } } elsif($FORM{'mode'} eq "forgot"){ if($member){ loadMemberfile(); printPage("edit"); } else{ printPage("forgot"); } } else{ printPage(); } } elsif($FORM{'adminpass'} eq $ADMINPASS) { if($FORM{'mode'} eq "edit"){ loadMemberfile(); editUser(); printPage("editfinish"); } elsif($FORM{'mode'} eq "account"){ loadMemberfile(); if($FORM{'pass'} eq $ID{'pass'}){ if($FORM{'newpass1'} eq $FORM{'newpass2'}){ $FORM{'pass'} = $FORM{'newpass1'}; editUser(); printPage("accountfinish"); }else{ printPage("accounterror"); } } else{ printPage("accounterror"); } } elsif($FORM{'mode'} eq "del"){ loadMemberfile(); if($FORM{'pass'} eq $ID{'pass'}){ delUser(); $CGI = new CGI(); print $CGI->redirect("./index.html?logout=true"); } else{ printPage("accounterror"); } } elsif($FORM{'mode'} eq "forgot"){ if(exists $FORM{'id'}){ if($FORM{'newpass1'} eq $FORM{'newpass2'}){ $FORM{'pass'} = $FORM{'newpass1'}; editUser(); printPage("forgotfinish"); }else{ printPage("forgoterror"); } } else{ $FORM{'birth'} = $FORM{'birth1'}."年".$FORM{'birth2'}."月".$FORM{'birth3'}."日"; $FORM{'name'} = $FORM{'name1'}.$FORM{'name2'}; loadMemberName(); if($FORM{'year'} eq $NAME{'year'} and $FORM{'sex'} eq $NAME{'sex'} and $FORM{'birth'} eq $NAME{'birth'} and $FORM{'forgotpass'} eq $FORGOTPASS){ printPage("forgotID"); } else{ printPage("forgoterror"); } } } else{ $member = $FORM{'id'}; loadUserfile(); addUser(); calculatCode(); # CODEの計算及びユーザーファイルに保存 printPage("finish"); } } else { printPage("error1"); } } exit; #============================ mobile ========== sub printMobile { $CGI = new CGI(); print $CGI->redirect("./index.html"); } #============================ ユーザー追加 ==== sub addUser { my ($name1, $name2, $pass1, $pass2, $id, $sex, $birth1, $birth2, $birth3, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = ($FORM{'name1'}, $FORM{'name2'}, $FORM{'pass1'}, $FORM{'pass2'}, $FORM{'id'}, $FORM{'sex'}, $FORM{'birth1'}, $FORM{'birth2'}, $FORM{'birth3'}, $FORM{'blood'}, $FORM{'email'}, $FORM{'nickname'}, $FORM{'home'}, $FORM{'school'}, $FORM{'subject'}, $FORM{'year'}, $FORM{'hobby'}, $FORM{'intro'}); $namae = $name1.$name2; if (not $FORM{'name1'} && $FORM{'name2'} && $FORM{'pass1'} && $FORM{'pass2'} && $FORM{'id'} && $FORM{'sex'} && $FORM{'birth1'} && $FORM{'birth2'} && $FORM{'birth3'} && $FORM{'year'}) { printPage("error5"); exit; } elsif ($FORM{'id'} =~ /[^\da-zA-Z]/ || $FORM{'pass1'} =~ /[^\da-zA-Z]/ || $FORM{'pass2'} =~ /[^\da-zA-Z]/) { printPage("error6"); exit; } elsif(exists $SHIMEI{$namae}) { printPage("error3"); exit; } elsif(exists $USERS{$member}) { printPage("error2"); exit; } elsif ($FORM{'pass1'} ne $FORM{'pass2'}) { printPage("error4"); exit; } # ユーザーファイル書き込み open(FILE, ">>$USERFILE") or printErrorPage("ユーザーファイルが開けません。"); eval{ flock(FILE, 2) }; print FILE "$namae\t$pass1\t$id\t$sex\t$birth1年$birth2月$birth3日\t$blood\t$email\t$nickname\t$home\t$school\t$subject\t$year\t$hobby\t$intro\n"; close(FILE); } #============================ ユーザー置換 ==== sub editUser { my ($name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro) = ($FORM{'name'}, $FORM{'pass'}, $FORM{'id'}, $FORM{'sex'}, $FORM{'birth'}, $FORM{'blood'}, $FORM{'email'}, $FORM{'nickname'}, $FORM{'home'}, $FORM{'school'}, $FORM{'subject'}, $FORM{'year'}, $FORM{'hobby'}, $FORM{'intro'}); my ($ln, $namem, $passm, $idm); open(FILE, "+<$USERFILE") or printErrorPage("openError"); eval{ flock(FILE, 2) }; my @MEM = ; for($i = 0 ; $i < @MEM ; ++$i) { my ($namem, $passm, $idm) = split(/\t/, $MEM[$i]); if ($idm eq $id) { $ln = "$name\t$pass\t$id\t$sex\t$birth\t$blood\t$email\t$nickname\t$home\t$school\t$subject\t$year\t$hobby\t$intro\n"; push @MEM, $ln; splice @MEM, $i, 1; } } seek( FILE, 0, 0); my $pos = length @MEM; truncate(FILE, $pos); print FILE @MEM; close(FILE); } #============================ ユーザー削除 ==== sub delUser { open(FILE, "+<$USERFILE") or printErrorPage("openError"); eval{ flock(FILE, 2) }; my @MEM = ; for($i = 0 ; $i < @MEM ; ++$i) { my ($namem, $passm, $idm) = split(/\t/, $MEM[$i]); if ($idm eq $ID{'id'}) { splice @MEM, $i, 1; } } seek( FILE, 0, 0); my $pos = length @MEM; truncate(FILE, $pos); print FILE @MEM; close(FILE); } # ------------------------------------------------セッション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); } # ------------------------------------------------クッキーの暗号が一致したら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; } } # ------------------------------------------------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'; print "Set-Cookie: $name=$value; expires=$date\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; } # ------------------------------------------------ユーザーファイル読み込み sub loadUserfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro); open(FILE, "<$USERFILE") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass, $id) = split(/\t/, $ln); $USERS{$id} = $pass; $SHIMEI{$name} = $pass; } close(FILE); } # ------------------------------------------------ユーザーファイル読み込み($memberを基に個人の%IDを作成。IDが一致しなければIDエラーページ出力) sub loadMemberfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro); 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); $ID{'intro'} =~ s/&/&;/g; $ID{'intro'} =~ s/<//g; $ID{'intro'} =~ s/
/\x0D\x0A/g; return 0; } } close(FILE); printPage("IDerror"); exit; } # ------------------------------------------------ユーザーファイル読み込み(本名を基に%NAMEを作成) sub loadMemberName { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, $nickname, $home, $school, $subject, $year, $hobby, $intro); 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($FORM{'name'} eq $name) { %NAME = ('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); $NAME{'intro'} =~ s/&/&;/g; $NAME{'intro'} =~ s/<//g; $NAME{'intro'} =~ s/
/\x0D\x0A/g; 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; } } # ------------------------------------------------メインhtml出力(メインhtmlのひな型) 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 ($_[0] eq "editfinish" or $_[0] eq "finish" or $_[0] eq "edit" or $_[0] eq "account" or $_[0] eq "accounterror" or $_[0] eq "accountfinish") { print <
ようこそ、$ID{'name'}$FORM{'name1'}$FORM{'name2'}さん
END }else { #ID,PASSが異なります print <
自動的にログイン
END } #振り分け終わり print <
埼玉大学軟式庭球同好会トップページ軟式庭球同好会についてスケジュール試合結果フォトアルバムコミュニティ
埼玉大学軟式庭球同好会写真
メンバーの方へ
END #振り分け if ($_[0] eq "finish") { print <アカウントを作成する
アカウント作成完了しました。

ようこそ$FORM{'name1'}$FORM{'name2'}さん。
これでコミュニティを利用することができるようになりました。
登録した内容はアカウント編集ページから変更できます。

ログインID:$FORM{'id'}
ログインPASS: END my $idlength = length $FORM{'pass'}; while($idlength > 0){ print "*"; --$idlength; } print <
名前:$FORM{'name1'}$FORM{'name2'}
ニックネーム:$FORM{'nickname'}
学部学科:$FORM{'subject'}
入学年度:$FORM{'year'}
性別:$FORM{'sex'}
生年月日:$FORM{'birth1'}年$FORM{'birth2'}月$FORM{'birth3'}日
血液型:$FORM{'blood'}
趣味:$FORM{'hobby'}
出身地:$FORM{'home'}
出身高校:$FORM{'school'}
メールアドレス:$FORM{'email'}
自己紹介:$FORM{'intro'}
END }elsif ($_[0] eq "editfinish") { print <アカウントを編集する
アカウント編集完了しました。

以下の内容でアカウントを更新しました。

ログインID:$FORM{'id'}
ログインPASS: END my $idlength = length $FORM{'pass'}; while($idlength > 0){ print "*"; --$idlength; } print <
名前:$FORM{'name'}
ニックネーム:$FORM{'nickname'}
学部学科:$FORM{'subject'}
入学年度:$FORM{'year'}
性別:$FORM{'sex'}
生年月日:$FORM{'birth'}
血液型:$FORM{'blood'}
趣味:$FORM{'hobby'}
出身地:$FORM{'home'}
出身高校:$FORM{'school'}
メールアドレス:$FORM{'email'}
自己紹介:$FORM{'intro'}
END }elsif($_[0] =~ /error(.)/) { print <アカウントを作成する END #アカウント作成パスワードのエラー if($1 == "1"){ print < アカウント作成パスワードが異なります。

アカウント作成パスワードが分からない場合は誰かに聞いてください。

END } #他の人とIDが同じエラー elsif($1 == "2"){ print < このIDは他の人が使用しています。

違うIDを設定し直してください。

END } #すでに作成しているエラー elsif($1 == "3"){ print < $FORM{'name1'}$FORM{'name2'}さんはすでにアカウントを作成しています。

ログインID、パスワードを忘れた方はこちら

END } #パスワードの設定エラー elsif($1 == "4"){ print < パスワードが正しく設定されていません。

パスワードを正しく設定し直してください。

END } #未入力の項目があるエラー elsif($1 == "5"){ print < 未入力の項目があります。

すべての項目を正しく入力してください。

END } #ログインID,PASSが半角でないエラー elsif($1 == "6"){ print < ログインID、又はログインPASSが半角英数字ではありません。

ログインID、ログインPASSは半角英数字で入力してください。

END } #エラー振り分け終わり print <
*は入力必須項目です。正確に入力してください。
ログインPASS以外の入力必須項目は後から変更できません。
ログインID:* (半角英数字)
ログインPASS:* (半角英数字)
ログインPASS:*
(確認用)
(半角英数字)
名前:*姓: 名: (必ず本名を記入)
ニックネーム:
学部・学科:
入学年度:*
性別:* END if($FORM{'sex'} eq "男性"){ print <男性 女性 END }elsif($FORM{'sex'} eq "女性"){ print <男性 女性 END }else{ print <男性 女性 END } print <
生年月日:*
血液型: END if($FORM{'blood'} eq "A型"){ print <A型 B型 O型 AB型 END }elsif($FORM{'blood'} eq "B型"){ print <A型 B型 O型 AB型 END }elsif($FORM{'blood'} eq "O型"){ print <A型 B型 O型 AB型 END }elsif($FORM{'blood'} eq "AB型"){ print <A型 B型 O型 AB型 END }else{ print <A型 B型 O型 AB型 END } print <
趣味:
出身地:
出身高校:
メールアドレス: (公開されません)
自己紹介:
アカウント作成
パスワード:*

(うちのサークルの略称をローマ字でいくつか入れてみてください)
 
END }elsif($_[0] eq "edit") { print <アカウントを編集する
*は入力必須項目です。ログインPASS以外の入力必須項目は変更できません。
パスワードの変更・アカウントの削除はコチラからお願いします。
ログインID:*$ID{'id'} (変更できません)
ログインPASS:* END my $idlength = length $ID{'pass'}; while($idlength > 0){ print "*"; --$idlength; } print <「パスワードの変更・アカウントの削除」より変更できます)
名前:*$ID{'name'} (変更できません)
ニックネーム:
学部・学科:
入学年度:* $ID{'year'} (変更できません)
性別:* $ID{'sex'} (変更できません)
生年月日:* $ID{'birth'} (変更できません)
血液型: END if($ID{'blood'} eq "A型"){ print <A型 B型 O型 AB型 END }elsif($ID{'blood'} eq "B型"){ print <A型 B型 O型 AB型 END }elsif($ID{'blood'} eq "O型"){ print <A型 B型 O型 AB型 END }elsif($ID{'blood'} eq "AB型"){ print <A型 B型 O型 AB型 END }else{ print <A型 B型 O型 AB型 END } print <
趣味:
出身地:
出身高校:
メールアドレス: (公開されません)
自己紹介:
 


>> パスワードの変更・アカウントの削除はこちらから
END }elsif($_[0] eq "account") { print <パスワードを変更する
ログイン用のパスワードを変更できます。
現在のパスワードを入力し、新しいパスワードを正確に入力してください。
現在のパスワード: (半角英数字)
新しいパスワード: (半角英数字)
新しいパスワード:
(確認用)
(半角英数字)

 

アカウントを削除する

パスワードを入力して下の削除のボタンをクリックするとアカウントを削除できます。
パスワード: (半角英数字)

END }elsif($_[0] eq "accounterror") { print < 入力項目にエラーがあります。

正確に入力しなおしてください。

パスワードを変更する

ログイン用のパスワードを変更できます。
現在のパスワードを入力し、新しいパスワードを正確に入力してください。
現在のパスワード: (半角英数字)
新しいパスワード: (半角英数字)
新しいパスワード:
(確認用)
(半角英数字)

 

アカウントを削除する

現在のパスワード: (半角英数字)

END }elsif($_[0] eq "accountfinish") { print <パスワードを変更する
パスワード変更完了しました。

パスワードは忘れないようにメモをするなどして大切に保管しておいてください。

END }elsif($_[0] eq "forgot") { print <ID・パスワードを忘れた場合
*は入力必須項目です。正確に入力してください。
全ての項目を正確に入力し、送信するとIDの確認・パスワードの再設定をすることができます。
名前:*姓: 名: (必ず本名を記入)
入学年度:*
性別:* 男性 女性
生年月日:*
アカウント作成
パスワード:*

(うちのサークルの略称をローマ字でいくつか入れてみてください)
 
END }elsif($_[0] eq "forgotID"){ print <ID・パスワードを忘れた場合
$NAME{'name'}さん
あなたのIDは $NAME{'id'} です。

もし、パスワードも忘れてしまった場合は以下より設定し直してください。
新しいパスワード: (半角英数字)
新しいパスワード:
(確認用)
(半角英数字)

 
END }elsif($_[0] eq "forgotfinish") { print <ID・パスワードを忘れた場合
パスワード再設定しました。

パスワードは忘れないようにメモをするなどして大切に保管しておいてください。

END }elsif($_[0] eq "forgoterror") { print <ID・パスワードを忘れた場合
入力項目にエラーがあります。

正確に入力しなおしてください。

END }else { print <アカウントを作成する
*は入力必須項目です。正確に入力してください。
ログインPASS以外の入力必須項目は後から変更できません。
ログインID:* (半角英数字)
ログインPASS:* (半角英数字)
ログインPASS:*
(確認用)
(半角英数字)
名前:*姓: 名: (必ず本名を記入)
ニックネーム:
学部・学科:
入学年度:*
性別:* 男性 女性
生年月日:*
血液型: A型 B型 O型 AB型
趣味:
出身地:
出身高校:
メールアドレス: (公開されません)
自己紹介:
アカウント作成
パスワード:*

(うちのサークルの略称をローマ字でいくつか入れてみてください)
 
END } #振り分け終わり print <
 
END } # ------------------------------------------------認証時ページ出力("トップページ") sub IDpassed { return 0; } # ------------------------------------------------エラーページ出力("ID,PASSが異なります") sub IDerror { return 0; } # ------------------------------------------------ログインページ出力("ID,PASSを入力してください") sub IDvoid { return 0; }