#!/usr/local/bin/perl #初期設定を読みこむ require './setup.pl'; #クッキーデータを読み込む------------------------------------------------------------ $CookieName = $ENV{'SCRIPT_NAME'}; $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$CookieName}); foreach $pair (@pairs) { ($name,$value) = split(/:/,$pair); $COOKIE{$name} = $value; } #フォームからのデータを取得---------------------------------------------------------- $ret = &ReadParse; if ($ENV{'QUERY_STRING'} ne "") { &CgiDie("Error"); } if ($ret == 0) { &input; } while (($key,$val) = each %in) { $key =~ s//>/g; $key =~ s/"/"/g; $key =~ s/\n//g; $key =~ s/\t//g; $val =~ s//>/g; $val =~ s/"/"/g; $val =~ s/\n//g; $val =~ s/\t//g; $in{$key} = $val; } foreach $val (split("\0",$in{'vote'})) { push(@VOTE,$val); } if ($in{'email'} eq '' || !($in{'email'} =~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/)) { &CgiDie('入力ミス','Eメールの形式が間違っています.'); } ($id,$domain) = split(/\@/,$in{'email'}); $domain =~ y/A-Z/a-z/; $in{'email'} = $id . '@' . $domain; #クッキーの記録処理------------------------------------------------------------------ ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @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 = "email\:$in{'email'}"; #パスワード照合---------------------------------------------------------------------- if ($in{'passwd'} eq '') { &CgiDie('エラー','パスワードを入力してください.'); } $cook .= "\,passwd\:$in{'passwd'}"; open(IN,"$base_dir$pwdfile") || &CgiDie('エラー','パスワードファイルが読み出せませんでした.'); @USER = ; close(IN); @PICKUP = grep(/^($in{'email'})\t/,@USER); if (!@PICKUP) { &CgiDie('エラー','参加登録されていません.'); } ($in{'email'},$passwd,$in{'user'}) = split(/\t/,$PICKUP[0]); $in{'user'} =~ s/\n//g; if ($in{'passwd'} ne $passwd) { &CgiDie('エラー','パスワードが合いません.'); } if ($in{'action'} eq 'vote') { ®ist; } &html; exit; #画面出力---------------------------------------------------------------------------- sub html { open(IN,"$base_dir$log") || &CgiDie('エラー','投票データファイルが読み出せませんでした.'); @DATA = ; close(IN); @USERDATA = grep(/^($in{'email'})\t/,@DATA); $count = @USERDATA; $ato = $max - $count; if ($count >= $max) { $msg = "投票完了です."; $novote = 1; } else { $msg = "あなたはあと$ato件投票できます."; } open(IN,"$base_dir$entry") || &CgiDie('エラー','エントリーファイルが読み出せませんでした.'); print "Set-Cookie: $CookieName=$cook; expires=$date_gmt\n"; print &PrintHeader; print <<"EOF"; $title $body $message

$in{'user'}様

投票は$max件までできます.


$msg

EOF print "\n"; $cr = 0; while () { if (/^#/ || /^$/) { next; } s/\n//g; ($number,$name,$url) = split(/,/); $name =~ s//>/g; $name =~ s/"/"/g; if (($cr % 2) == 0) { print ''; } print <<"EOF"; \n"; } else { print "$name\n"; } if (($cr % 2) == 1) { print ''; } $cr++; } if (($cr % 2) == 1) { print ''; } close(IN); print <<'EOF';
$number EOF $voted = 0; foreach $d (@USERDATA) { ($email,$vote) = split(/\t/,$d); $vote =~ s/\n//g; if ($number eq $vote) { $voted = 1; print '[済]' . "\n"; } } if (!$voted) { print "\n"; } if ($url ne '') { print "$name

EOF if (!$novote) { print <<"EOF";

EOF } print "

メニューへ戻る

\n"; print &HtmlBot; exit; } #認証フォーム------------------------------------------------------------------------ sub input { print &PrintHeader; print <<"EOF"; $title $body

参加するにはパスワードが必要です

[パスワードを取得/照会する]

Eメール
パスワード

EOF print &HtmlBot; exit; } #登録処理---------------------------------------------------------------------------- sub regist { if (!@VOTE) { &CgiDie('エラー','ひとつも選択されていません.'); } $checked = @VOTE; open(IN,"$base_dir$log") || &CgiDie('エラー','投票データファイルが読み出せませんでした.'); @DATA = ; close(IN); @USERDATA = grep(/^($in{'email'})\t/,@DATA); $count = @USERDATA; if ($count >= $max) { &CgiDie("ご注意","$max件まで投票できますが既に投票できる件数分投票済みです."); } if ($max < ($count + $checked)) { $ato = $max - $count; &CgiDie("ご注意","$max件まで投票できますが、あなたはあと$ato件投票ができます."); } open(OUT,">> $base_dir$log") || &CgiDie('エラー','投票データファイルに記録できませんでした.'); foreach $k (@VOTE) { print OUT "$in{'email'}\t$k\n"; } close(OUT); }