#!/usr/local/bin/perl use Time::Local; use strict; use lite; require "jcode.pl"; $main::title = 'Elecra Secret Square'; %main::PASS = ('hoge' => 'fuga', 'komaba' => 'hongo'); $main::me = 'el.cgi'; $main::title = 'えれくら内部サイト'; $main::top_file = 'top.html'; $main::list_file = 'dat/list.dat'; $main::notice_file = 'dat/notice.dat'; $main::event_file = 'dat/event.dat'; $main::lock = 'dat/lock'; $main::style = 'el.css'; $main::admin = 'xyzzy'; $main::mailto = '高橋 慧'; $main::new = '[New!]'; $main::dir = './file/'; # /を付ける $main::platform = 'Unix'; # Unix/Windows/Mac $main::filecode = 'euc'; # euc/sjis/jis $main::maxfilesize = 50000; # 0:ファイルサイズ n:nキロバイトまで $main::permission = 0664; # ファイルに設定するOS上でのパーミッション @main::name_add_txt = ('pl', 'cgi', 'php', 'rb', 'sht', 'shtm', 'shtml'); # '.txt'を付加する拡張子 @main::name_add_bin = ('exe'); # '.bin'を付加する拡張子 #@main::list = ('title', 'filename','update', 'name', 'pass'); #@main::event = ('eid', 'edate', 'name', 'mail', 'title', 'contact', 'cdate', 'rdate'); @main::key_cookie = ('id', 'pass', 'lastview', 'name', 'fpass', 'mail'); { package List; @List::log; sub regist { my @TEMP = @_; my $i = List::search(1, "$TEMP[1]"); if($i >= 0) { List::error('既に登録されています'); } unshift(@List::log, \@TEMP); } sub update { my $title = Form::get('title'); my $filename = Form::get('filename'); jcode::convert( \$filename, "euc" ); my $name = Form::get('name'); my $fpass = Form::get('fpass'); Cookie::set('name', $name); Cookie::set('fpass', $fpass); my $i = List::search(1, $filename); if($i < 0) { List::error('ファイルがありません'); } my @DAT = @{$List::log[$i]}; if(($fpass ne $DAT[4])&&($fpass ne $main::admin)){ List::error('パスワードが違います'); Cookie::set('fpass', ''); } $DAT[0] = $title; $DAT[3] = $name; splice(@List::log, $i, 1, \@DAT); } sub delete { my $filename = Form::get('filename'); jcode::convert( \$filename, "euc" ); my $fpass = Form::get('fpass'); Cookie::set('fpass', $fpass); my $i = List::search(1, $filename); if($i < 0) { List::error('項目が見つかりません'); } my @TEMP = @{$List::log[$i]}; if(($fpass ne $TEMP[4])&&($fpass ne $main::admin)){ List::error('パスワードが違います'); } unlink($main::dir . $filename) or List::error('ファイルを削除できませんでした'); splice(@List::log, $i, 1); } sub search { my($key, $value) = @_; my @TEMP; my $i; for($i=0;$i<=$#List::log;$i++){ @TEMP = @{$List::log[$i]}; if($TEMP[$key] eq $value){ return $i; } } return -1; } sub load { if( !(-f $main::list_file)){ if( !open( DB, "> $main::list_file" ) ) { List::error( 'データファイルを作れません' ); } print DB "\n"; close DB; chmod(0666, $main::list_file); } open DB, $main::list_file; while (){ chomp(); my @temp = split /<>/; if($#temp > 1 ){ push(@List::log, \@temp); } } close( DB ); } sub save { if( !open( DB, ">$main::list_file" ) ) { List::error( "データファイルを開けません" ); } foreach (@List::log){ print DB join('<>', @$_)."\n"; } close( DB ); } sub error { MyUtils::free_lock('list'); HTML::error($_[0]); } } { package Event; @Event::log; $Event::nextid; sub load { if(!(-f $main::event_file)){ if( !open( DB, "> $main::event_file" ) ) { Event::error( 'データファイルを作れません' ); } print DB "\n"; close DB; chmod(0666, $main::event_file); } open DB, $main::event_file; my $now = time(); $Event::nextid = ; chomp($Event::nextid); if($Event::nextid == 0) {$Event::nextid = 1;} while (){ chomp(); my @temp = split /<>/; if(($#temp > 1 )&&($temp[1] > $now)){ push(@Event::log, \@temp); } } close( DB ); } sub save { if( !open( DB, ">$main::event_file" ) ) { Event::error( "データファイルを開けません" ); } print DB "$Event::nextid\n"; foreach (@Event::log){ print DB join('<>', @$_)."\n"; } close( DB ); } sub regist { my @temp; $temp[2] = Form::get('name'); $temp[3] = Form::get('mail'); if($temp[2] ne ''){ Cookie::set('name', $temp[2]); } if($temp[3] ne ''){ Cookie::set('mail', $temp[3]); } $temp[0] = $Event::nextid; my $xmin = Form::get('min'); my $xhour = Form::get('hour'); my $xmday = Form::get('mday'); my $xmon = Form::get('mon'); $xmon--; my $xyear = Form::get('year'); if($xmday eq '' || $xmon eq '' || $xyear eq ''){ Event::error('日付を全て入力してください'); } $temp[1] = Time::Local::timelocal(0, $xmin, $xhour, $xmday, $xmon, $xyear); $temp[4] = Form::get('title'); if($temp[4] eq ""){Event::error('題名を入力してください');} $temp[5] = Form::get('contact'); if($temp[5] != 0){ if($temp[2] eq ''){Event::error('名前を入力してください');} if($temp[3] eq ''){Event::error('メールアドレスを入力してください');} $xmday = Form::get('cmday'); $xmon = Form::get('cmon'); $xyear = Form::get('cyear'); if($xmday eq '' || $xmon eq '' || $xyear eq ''){ Event::error('連絡期限を入力して下さい'); } $xmon--; $temp[6] = Time::Local::timelocal(59, 59, 23, $xmday, $xmon, $xyear); } $temp[7] = time(); Event::insert(\@temp); $Event::nextid++; } sub update { my @temp; $temp[0] = Form::get('eid'); my $xmin = Form::get('min'); my $xhour = Form::get('hour'); my $xmday = Form::get('mday'); my $xmon = Form::get('mon'); $xmon--; my $xyear = Form::get('year'); if($xmday eq '' || $xmon eq '' || $xyear eq ''){ Event::error('日付を全て入力してください'); } $temp[1] = Time::Local::timelocal(0, $xmin, $xhour, $xmday, $xmon, $xyear); $temp[2] = Form::get('name'); $temp[3] = Form::get('mail'); if($temp[2] ne ''){ Cookie::set('name', $temp[2]); } if($temp[3] ne ''){ Cookie::set('mail', $temp[3]); } $temp[4] = Form::get('title'); if($temp[4] eq ""){Event::error('題名を入力してください');} $temp[5] = Form::get('contact'); if($temp[5] != 0){ if($temp[2] eq ''){Event::error('名前を入力してください');} if($temp[3] eq ''){Event::error('メールアドレスを入力してください');} $xmday = Form::get('cmday'); $xmon = Form::get('cmon'); $xmon--; $xyear = Form::get('cyear'); if($xmday eq '' || $xmon eq '' || $xyear eq ''){ Event::error('連絡期限を入力して下さい'); } $temp[6] = Time::Local::timelocal(59, 59, 23, $xmday, $xmon, $xyear); } $temp[7] = time(); my $i = Event::search(0, Form::get('eid')); splice(@Event::log, $i, 1); Event::insert(\@temp); } sub insert { my @DAT = @{$_[0]}; my $i; for( $i = 0; $i > $#Event::log; $i++){ if(${$Event::log[$i]}[1] < $DAT[1]){ splice(@Event::log, $i, 0, \@DAT); return; } } splice(@Event::log, $i, 0, \@DAT); } sub delete { my $i = Event::search(0, Form::get('eid')); if($i < 0) { Event::error('記事が見つかりません'); } splice(@Event::log, $i, 1); } sub search { my($key, $value) = @_; my @TEMP; my $i; for($i = 0; $i <= $#Event::log; $i++){ @TEMP = @{$Event::log[$i]}; if($TEMP[$key] eq $value){ return $i; } } return -1; } sub error { MyUtils::free_lock('event'); HTML::error($_[0]); } } { package HTML; sub header { Cookie::save(); print <<"_END_"; Content-type: text/html $main::title _END_ } sub footer { print <<"_END_";
* by kei *
_END_ } sub top { my $list; my $event; my $lastview = Cookie::get('lastview'); my $now = time(); Cookie::set('lastview', time()); Cookie::save(); my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); print "Content-type:text/html\n\n"; foreach(@Event::log){ my($eid, $edate, $name, $mail, $title, $contact, $cdate, $rdate) = @$_; my $new; if($rdate > $lastview){ # if($rdate < time() + 60 * 60 * 24){ $new = $main::new; } else { $new = ''; } unless(($edate < time() + 60 * 60 * 24 * 30)||($contact && $cdate > time())||$new){ next; } my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($edate); $xmon++; $event .= '
  • '.$new; if($year == $xyear){ $xyear+=1900; $event .= "$xyear "; } $event .= "$xmon/$xmday $title"; if($contact){ my ($csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst) = localtime($cdate); $cmon++; $cyear+=1900; if($contact == 1){ $event .= "
    (参加者は$cmon/$cmdayまでに$nameさんに連絡して下さい)
  • "; } else { $event .= "
    (全員出欠を$cmon/$cmdayまでに$nameさんに連絡して下さい)"; } } } if($event){ $event = '
      '. $event . '
    '; } else { $event = '現在、予定はありません
    '; } $event .= <<"_END_"; _END_ foreach(@List::log){ my($title, $filename, $update, $name, $fpass) = @$_; if($title eq ""){ next; } my $url = $filename; jcode::convert( \$url, "euc" ); $url =~ s/([^\.\*\-_a-zA-Z0-9 ])/sprintf("%%%02lX",unpack("C",$1))/eg; $url =~ s/ /+/g; my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($update); $xmon++; my $new; # main::err($update, $lastview); if($update > $lastview){ # if($update < time() + 60 * 60 * 24){ $new = $main::new; } if($update > $now - 30 * 24 * 60 * 60){ $list .= '
  • '.$new.$name.'さんが'.$title; $list .= 'をアップしました('.$xmon.'/'.$xmday.')
  • '; } } if($list){ $list = '
      '. $list . '
    '; } else { $list = '現在、新しい文書はありません
    '; } $list .= <<"_END_"; _END_ my $notice = Notice::getlist(); $notice .= ""; open TOP, $main::top_file; while(){ s/__%EVENT%__/$event/g; s/__%LIST%__/$list/g; s/__%NOTICE%__/$notice/g; print; } } sub list { HTML::header(); print <<"_END_";

    文書一覧

    いままでにアップされたファイルの一覧です。 新規アップロードや名前の変更は管理画面から。
    _END_ print <<"_END_";
    _END_ foreach (@List::log){ my($title, $filename, $update, $name, $fpass) = @$_; if($title eq ''){ next; } my $url = $filename; jcode::convert( \$url, "euc" ); $url =~ s/([^\.\*\-_a-zA-Z0-9 ])/sprintf("%%%02lX",unpack("C",$1))/eg; $url =~ s/ /+/g; my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($update); $xmon++; $xyear += 1900; my $str = ""; $str .= ''; $str .= ''; print $str; } print '
    更新日 ファイル名 作成者
    $xyear $xmon/$xmday'.$title.''.$name.'
    '; HTML::footer(); } sub list_form { HTML::header(); my $name = Cookie::get('name'); my $fpass = Cookie::get('fpass'); print <<"_END_";

    文書管理画面

    新規アップロード

    ファイルを選択して、タイトル、作成者、パスワードを入れて「送信」をクリックしてください。タイトルを空にすると、隠しファイルになります。
    ファイル:
    タイトル:
    作成者: パスワード: 全部入力したら

    データの編集・削除

    アップした人に限り、ファイルのタイトルや作成者を編集できます。また、ファイルの削除も出来ます。 編集後、パスワードを入力し、変更か削除かを選び、「変更」ボタンをクリックして下さい。
    _END_ print '
    '; my $k = 0; foreach (@List::log){ $k++; my($title, $filename, $update, $name, $fpass) = @$_; my $url = $filename; my $orig = $filename; jcode::convert( \$url, "euc" ); $url =~ s/([^\.\*\-_a-zA-Z0-9 ])/sprintf("%%%02lX",unpack("C",$1))/eg; $url =~ s/ /+/g; my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($update); $xmon++; $xyear += 1900; print "\n"; print '\n"; print ''."\n"; print ''."\n"; print ''; } print '
    [$xyear $xmon/$xmday]'."\n"; print '
    ['.$filename.']'."\n"; print ''."\n"; print ''."\n"; print 'パスワード'."\n"; print '更新'."\n"; print '削除'."\n"; print ''; print '
    '; HTML::footer(); } sub event { HTML::header(); print <<"_END_";

    \予\定一覧

    \予\定の追加や削除は管理画面から。
    _END_ print <<"_END_";
    _END_ my $now = time(); foreach(@Event::log){ my($eid, $edate, $name, $mail, $title, $contact, $cdate, $rdate) = @$_; my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($edate); $xmon++; $xyear+=1900; my($csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst); if($cdate != 0){ ($csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst) = localtime($cdate); $cmon++; $cyear+=1900; } my $str; if($contact == 0){ $str = '--'; } elsif($contact == 1){ $str = "$cmon/$cmday"; } elsif($contact == 2){ $str = "$cmon/$cmday(全員)"; } if($mail){ $name = "$name"; } if($edate > $now){ print <<"_END_"; _END_ } } print '
    日時 件名 連絡期限 連絡先
    $xmon/$xmday $title $str $name
    '; HTML::footer(); } sub event_form { HTML::header(); my $name = Cookie::get('name'); my $mail = Cookie::get('mail'); my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $year += 1900; $mon += 1; print <<"_END_";

    \予\定管理画面

    新規\予\定

    日時:
    タイトル:
    連絡:不要 参加者のみ 要  期限:
    名前: メール:

    データの編集・削除

    登録されている\予\定を自由に編集できます。 編集後、変更か削除かを選び、「変更」ボタンをクリックして下さい。
    _END_ my $k = 0; foreach (@Event::log){ $k++; my $kk = $k % 2; $kk = "list".$kk; my($eid, $edate, $xname, $xmail, $xtitle, $xcontact, $cdate, $rdate) = @$_; my($xsec, $xmin, $xhour, $xmday, $xmon, $xyear, $xwday, $xyday, $xisdst) = localtime($edate); $xmon++; $xyear += 1900; my($csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst); if($cdate != 0){ ($csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst) = localtime($cdate); $cmon++; $cyear+=1900; } my @c; $c[$xcontact] = 'checked'; print <<"_END_"; _END_ } print '
    タイトル:
    連絡:不要 参加者のみ 要  期限:
    名前: メール: 更新 削除
    '; HTML::footer(); } sub notice_form { my $prev = $_[0]; my $msg; if($prev){ $msg = '編集中に別の人が更新しているので、再編集をお願いします。
    箇条書き形式で、改行を入れると新しい項目に移動します。'; } else { $msg = 'どなたでもお知らせを追加してみて下さい。箇条書き形式で、改行を入れると新しい項目に移動します。'; } HTML::header(); if($prev){ $_ = $prev; my @temp = split /\n/; $prev = "
      "; foreach (@temp){ chomp(); $prev.='
    • '.$_.'
    • '; } $prev .= "
    "; } my $str = Notice::get(); print <<"_END_";

    お知らせの編集画面

    $msg
    _END_ if($prev){ print <<"_END_";

    更新されたお知らせ

    $prev
    _END_ } my $rtime = time(); print <<"_END_";

    記入欄

    _END_ HTML::footer(); } sub error { HTML::header(); print <<"_END_";

    エラー

    メッセージ:$_[0]
    エラーです。入力項目を確認して下さい。
    心当たりの無いエラーの場合は、$main::mailtoまでご連絡下さい。
    _END_ exit(1); } sub auth { HTML::header(); print <<"_END_";

    Secret Square

    IDとPasswordを入力して下さい。
    ログイン出来ない時は$main::mailtoまで。

    ID
    Password
    _END_ } } { package Form; %Form::FORM; sub hash { my( @key ) = @_; my %hash; foreach( @key ) { $hash{$_} = $Form::FORM{$_}; } return \%hash; } sub get { return $Form::FORM{$_[0]}; } sub parse { if( $main::ENV{'REQUEST_METHOD'} eq "POST" ) { parse_post(); } else { parse_get(); } } sub parse_post { read( STDIN, my $query, $main::ENV{'CONTENT_LENGTH'} ); my $x; foreach $x ( split( /&/, $query ) ) { my( $name, $value ) = split( /=/, $x ); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack( "C", hex( $1 ) )/eg; jcode::convert( \$value, "sjis" ); $Form::FORM{$name} = $value; } } sub parse_get { my( $self ) = @_; my $x; foreach $x ( split( /&/, $main::ENV{'QUERY_STRING'} ) ) { my( $name, $value ) = split( /=/, $x ); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack( "C", hex( $1 ) )/eg; jcode::convert( \$value, "sjis" ); $Form::FORM{$name} = $value; } } } { package Cookie; %Cookie::COOKIE; sub clear { my $tmp = ""; foreach (@main::key_cookie){ $Cookie::COOKIE{$_} = ""; $tmp .= "Set-Cookie: "; $tmp .= "$_=; "; $tmp .= " expires=Thu, 1-Jan-1980 00:00:00 GMT;\n"; } print $tmp; } sub get { my($name) = @_; return $Cookie::COOKIE{$name}; } sub hash_set { my %temp = %{$_[0]}; my $name; foreach $name (keys( %temp )){ $Cookie::COOKIE{$name} = $temp{$name}; } } sub set { my ($name, $value) = @_; $Cookie::COOKIE{$name} = $value; } sub load { my ($xx,$name,$value); foreach $xx (split(/; */, $ENV{'HTTP_COOKIE'})) { my ($name, $value) = split(/=/, $xx); $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $Cookie::COOKIE{$name} = $value; } } sub save { my ($tmp, $key, $val); $tmp = ""; foreach $key (@main::key_cookie){ $val = $Cookie::COOKIE{$key}; $val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $tmp .= "Set-Cookie: "; $tmp .= "$key=$val; "; $tmp .= "expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } print $tmp; } } { package Date; sub toStr { my $m_time = $_[0]; my $mode = $_[1];#0: 長い #----- localtime の取得(秒単位) my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst ) = localtime( $m_time ); $wday = ( '日', '月', '火', '水', '木', '金', '土' )[$wday]; if($mode == 0){ return sprintf( "%04d %d/%d (%s) %02d:%02d", $year + 1900, $mon+1, $mday, $wday, $hour, $min ); } else { return sprintf( "%d/%d %s %02d:%02d", $mon+1, $mday, $wday, $hour, $min ); } } } { package Upload; sub up{ my $tempdir = $main::dir.'temp/'; unless (-d $main::dir){ unless(mkdir $main::dir, 0777){ HTML::error('ディレクトリを作れません'); } } unless (-d $tempdir){ unless(mkdir $tempdir, 0777){ HTML::error('一時ディレクトリを作れません'); } } my $cgi = new CGI::Lite; $cgi->add_timestamp(2); unless($cgi->set_directory($tempdir)){ HTML::error('一時ディレクトリに書き込めません'); } $cgi->set_platform ($main::platform); $cgi->filter_filename (\&Upload::fileconv); my %formdata = $cgi->parse_form_data(); $formdata{'tempfile'} = $tempdir.$formdata{'file'}; $formdata{'savefile'} = $main::dir.$formdata{'file'}; my $fpass = $formdata{'fpass'}; my $filename = $formdata{'file'}; my $name = $formdata{'name'}; my $title = $formdata{'title'}; unless($filename && $name && $fpass){ unlink($formdata{'tempfile'}); HTML::error('フォーム項目を全て入力して下さい'); } my $size = (stat($formdata{'tempfile'}))[7]; if ($size == 0){ unlink($formdata{'tempfile'}); HTML::error('ファイルサイズが0です'); } elsif ($main::maxfilesize && $size > $main::maxfilesize * 1024) { unlink($formdata{'tempfile'}); HTML::error('ファイルサイズが'.$main::maxfilesize.'KBを超えています'); } if (-e $formdata{'savefile'}) { unlink($formdata{'tempfile'}); HTML::error('同名のファイルが存在します。名前を変えてください'); } if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $main::permission, $formdata{'savefile'} if ($main::permission); if (-e $formdata{'tempfile'}) { if (unlink $formdata{'tempfile'}) { HTML::error('アップロード失敗…一時ファイルは削除されました'); } else { HTML::error('アップロード失敗…一時ファイルを削除できませんでした'); } } } Cookie::set('fpass', $fpass); Cookie::set('name', $name); List::load(); jcode::convert( \$filename, "sjis" ); jcode::convert( \$title, "sjis" ); jcode::convert( \$name, "sjis" ); List::regist($title, $filename, time(), $name, $fpass); List::save(); HTML::list_form(); exit; } sub fileconv { # ファイル名変換ルーチンの定義 $_ = $_[0]; # (1)eucに変換 my $ascii = '[\x00-\x7F]'; my ($match, $code) = jcode::getcode(\$_); $code = 'euc' if $code eq undef and $match > 0; if ($code eq 'euc') { if ($_ !~ /^(?:$jcode::re_euc_c|$jcode::re_euc_kana|$jcode::re_euc_0212|$ascii)*$/ox) { if ($_ =~ /^(?:$jcode::re_sjis_c|$jcode::re_sjis_kana|$ascii)*$/o) { $code = 'sjis'; } } } &jcode::convert(*_, 'euc', $code); # (2)全角/半角の修正(半角カナ、禁則文字を全角、英数字と記号を半角) &jcode::h2z_euc(*_); &jcode::tr(*_, '<>?[]_*/\\', '<>?[]_*/¥'); &jcode::tr(*_, 'A-Za-z0-9 ()_@−', 'A-Za-z0-9 ()_@-'); # (3)$filecodeに再度変換 &jcode::convert(*_, $main::filecode, 'euc'); # (4)禁止拡張子の削除 $_ .= '.txt' if (/\.([^\.]+)$/ and grep {$_ eq $1} @main::name_add_txt); $_ .= '.bin' if (/\.([^\.]+)$/ and grep {$_ eq $1} @main::name_add_bin); return $_; } } { package Notice; # $Notice::msg; # $Notice::time sub getlist { unless(open DB, $main::notice_file){ unless(open DB, ">$main::notice_file"){ HTML::error($main::notice_file.'を作れません'); } print DB "\n"; close DB; chmod 0666, $main::notice_file; open DB, $main::notice_file; } my $str = "
      "; foreach (){ chomp(); $str.='
    • '.$_.'
    • '; } $str .= "
    "; close DB; return $str; } sub get { unless(open DB, $main::notice_file){ unless(open DB, ">$main::notice_file"){ HTML::error($main::notice_file.'を作れません'); } print DB "\n"; close DB; chmod 0666, $main::notice_file; open DB, $main::notice_file; } my @a = ; return join('', @a); } sub regist { if(-e $main::notice_file){ if((stat($main::notice_file))[9] > Form::get('rtime')){ $_ = Notice::get(); HTML::notice_form($_); exit; } } unless(open DB, ">$main::notice_file"){ HTML::error($main::notice_file.'を作れません'); } print DB Form::get('notice'); close DB; chmod 0666, $main::notice_file; } sub error { MyUtils::free_lock('notice'); HTML::error($_[0]); } } { package MyUtils; sub get_lock { my( $made_time, $i) ; my $lock = $main::lock . $_[0]; foreach $i ( 1..5 ) { if( mkdir( $lock, 0777 ) ) { return; # last ; } elsif( $i == 1 ) { $made_time = ( stat( $lock ) )[ 9 ] ; if( $made_time < time() - 120 ) { MyUtils::free_lock($_[0]) ; } } elsif( $i < 4 ) { sleep( 2 ) ; } else { HTML::error( 'アクセスが集中しています。一度戻って、再試行して下さい'); } } # 強制終了 # $SIG{'PIPE'}=$SIG{'INT'}=$SIG{'HUP'}=$SIG{'QUIT'}=$SIG{'TERM'}='sigexit'; exit; } sub sigexit { MyUtils::free_lock() ; exit( 0 ) ; } sub free_lock { my $lock = $main::lock . $_[0]; rmdir( $lock ) ; } } { package main; Cookie::load(); my $cid = Cookie::get('id'); my $cpass = Cookie::get('pass'); $_ = $main::ENV{'QUERY_STRING'}; if(m/x=x$/){Upload::up();} Form::parse(); my $id = Form::get('id'); my $pass = Form::get('pass'); my $mode = Form::get('mode'); my $action = Form::get('action'); # $id='hoge';$pass='fuga'; # timelocal(0,0,0,4,10,2003); if($mode eq 'clear'){ Cookie::clear(); HTML::auth(); exit; } if($main::PASS{$cid} && ($main::PASS{$cid} eq $cpass)){ #クッキーのpassがOK } elsif ($main::PASS{$id} && ($main::PASS{$id} eq $pass)){ # フォームのpassがOK Cookie::set('id', $id); Cookie::set('pass', $pass); } else { # unauthorized 認証画面 Cookie::set('id', ''); Cookie::set('pass', ''); HTML::auth(); exit; } if($mode eq 'list'){ List::load(); HTML::list(); } elsif($mode eq 'listform'){ if($action){ MyUtils::get_lock('list'); List::load(); if($action eq 'delete'){ List::delete(); } elsif ($action eq 'update'){ List::update(); } List::save(); MyUtils::free_lock('list'); } else { List::load(); } HTML::list_form(); } elsif($mode eq 'event') { Event::load(); HTML::event(); } elsif($mode eq 'eventform'){ if($action){ MyUtils::get_lock('event'); Event::load(); if($action eq 'regist'){ Event::regist(); } elsif($action eq 'delete'){ Event::delete(); } elsif ($action eq 'update'){ Event::update(); } Event::save(); MyUtils::free_lock('event'); } else { Event::load(); } HTML::event_form(); } elsif($mode eq 'notice'){ if($action eq 'regist') { MyUtils::get_lock('notice'); Notice::regist(); MyUtils::free_lock('notice'); List::load(); Event::load(); HTML::top(); } } elsif($mode eq 'noticeform'){ HTML::notice_form(); } else { List::load(); Event::load(); HTML::top() } sub err { open ERR, ">>err.dat"; print ERR join(';',@_)."\n"; close ERR; chmod 0666, "err.dat"; } }