#!/usr/bin/perl ################################################## # Topics CGI(SSIバージョン) Rev.2.0.0.1 # Created by CATWALK(伊藤智子) # Created on 2002年4月30日 ################################################## use CGI qw/:standard/; use CGI::Carp qw(fatalsToBrowser); ################################################## # 初期設定ここから ################################################## require 'shinsengumi.pl'; require 'jcode.pl'; #戻るリンク $BackURL = '../index.shtml'; #このCGIのURL $CgiURL = './infoed.cgi'; #デザインファイル $CSSFile = '../css/font_win.css'; #データファイル $DataFile = '../data/info.dat'; #パスワードファイル $PasswdFile = '../data/passwd.cgi'; #画像のURL $ImgURL = '../img/'; #CGIのタイトル $CgiTitle = '新着情報CGI'; #最大ログ保存数 $MaxLog = 50; #管理画面最大表示数 $MaxAdminShow = 3; #ロックファイル $LockFile = '../var/lock.lck'; #ロックフラグ #1の時、シンボリックリンクでロック #2の時、$LockFileに1(解除は0)を書き込む #3の時、flockを使ってロック #4の時、何もしない #1〜4以外のときは1と同じ $lockflag = 1; #Newアイコン $NewIcon = $ImgURL . 'icn_newer.gif'; #新しい記事アイコン $new_icon = <<"EOL"; "$NewIcon" width="90" height="30" alt="新しい記事へ" border="0" EOL #Oldアイコン $OldIcon = $ImgURL . 'icn_older.gif'; #古い記事アイコン $old_icon = <<"EOL"; "$OldIcon" width="90" height="30" alt="古い記事へ" border="0" EOL #HTMLヘッダデザイン $HTML_HEAD = <<"EOL"; $CgiTitle
EOL ################################################## # 初期設定ここまで ################################################## $CopyRight = <<"EOL"; TopicsCGIWeb新撰組 EOL sub bynumber { $b <=> $a; } # 並び替えルーチン if(param('action')){ $action = param('action'); }else{ $action = 'show_login'; } &LoginCheck; if($action eq 'show_login'){ ############################# # 管理ログイン画面 ############################# &ShowLogin; }elsif($action eq 'show_data'){ ############################# # 過去のデータ表示 ############################# &ShowData; }elsif($action eq 'show_new_form'){ ############################# # 新規登録フォーム表示 ############################# &ShowNewForm; }elsif($action eq 'check_new_write'){ ############################# # 新規書き込み確認 ############################# &CheckNewWrite; }elsif($action eq 'go_write'){ ############################# # 新規書き込み ############################# &GoWrite; }elsif($action eq 'show_change_form'){ ############################# # 編集フォーム表示 ############################# &ShowChangeForm; }elsif($action eq 'check_change_data'){ ############################# # 編集データ確認 ############################# &CheckChangeData; }elsif($action eq 'go_change_data'){ ############################# # データ編集実行 ############################# &GoChangeData; }elsif($action eq 'check_delete'){ ############################# # データ削除確認 ############################# &CheckDelete; }elsif($action eq 'go_delete'){ ############################# # データ削除実行 ############################# &GoDelete; }elsif($action eq 'change_passwd'){ ############################## # 管理パスワード変更フォーム ############################## &ChangePasswd; }elsif($action eq 'go_change_passwd'){ ############################## # 管理パスワード変更実行 ############################## &GoChangePasswd; }else{ &error(999,'予期せぬエラー'); } exit; ############################# # ログイン画面表示 ############################# sub ShowLogin{ $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle
管理モード

パスワード

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 過去のデータ表示 ############################# sub ShowData{ if (param('start')){ $start = param('start'); }else{ $start = 0; } open(IN,"$DataFile") || &error(100,"データファイルが開けません"); while(){ $line = $_; chop($line); $sec = (split(/Enc_Sep_Code/,$line))[3]; push @allsec,$sec; $ALLLINES{$sec} = $line; } close(IN); @allsec = sort bynumber @allsec; foreach $sec(@allsec){ push @alllines,$ALLLINES{$sec}; } #HTMLその1ヘッダ部分 $HTML_HEADER=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


EOL $newnum = $start - $MaxAdminShow; $oldnum = $start + $MaxAdminShow; if($newnum >= 0){ $HTML_HEADER .= <<"EOL"; EOL }else{ $HTML_HEADER .= <<"EOL"; EOL } if($oldnum <= $#alllines ){ $HTML_HEADER .= <<"EOL"; EOL }else{ $HTML_HEADER .= <<"EOL"; EOL } $HTML_HEADER .= <<"EOL";
EOL $HTML_NAVI .= <<"EOL"; EOL if($newnum >= 0){ $HTML_NAVI .= <<"EOL"; EOL }else{ $HTML_NAVI .= <<"EOL"; EOL } if($oldnum <= $#alllines ){ $HTML_NAVI .= <<"EOL"; EOL }else{ $HTML_NAVI .= <<"EOL"; EOL } $HTML_NAVI .= <<"EOL";

EOL $end = $start + $MaxAdminShow; if ($end > $#alllines){ $end = $#alllines + 1; } for($i=$start;$i<$end;$i++){ ($datanum,$name,$text,$sec) = split(/Enc_Sep_Code/,$alllines[$i]); $date = &GetToday($sec); $admin_action=<<"EOL";
EOL #HTMLその2データ表示部分 $HTML_BODY .=<<"EOL";

$date

担当者:$name

$text

$admin_action

EOL } $HTML_BODY =~ s/
$//; #HTMLその3フッタ表示部分 $HTML_FOOT=<<"EOL"; $CopyRight EOL $HTML = $HTML_HEADER . $HTML_BODY . $HTML_NAVI . $HTML_FOOT; &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 新規登録フォーム表示 ############################# sub ShowNewForm{ $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


新規登録


担当者

内容

 
$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 新規書き込み確認 ############################# sub CheckNewWrite{ if(param('uname')){ $uname=param('uname'); &jcode::convert(*uname,'euc'); $uname =~ s/[\r\n]//g; if (!$uname){ push(@errors,'担当者Enc_Sep_Code担当者名をご記入下さい'); } }else{ push(@errors,'担当者Enc_Sep_Code担当者名をご記入下さい'); } if(param('text')){ $text=param('text'); &jcode::convert(*text,'euc'); $text =~ s/\r\n/\n/g; $text =~ s/\n/
/g; $text =~ s/([^=^\"]|^)((http|https|ftp|mailto):[\@!#-9A-~]+)/$1$2<\/a>/g; }else{ push(@errors,'内容Enc_Sep_Code内容をご記入下さい'); } if (@errors){ $errorline = join('Enc_ESep_Code',@errors); &error01($errorline); } $dataline = join('Enc_DataSep_Code',$uname,$text); $dataline =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


新規登録

以下の内容で登録してよろしいですか?


担当者

$uname

内容

$text

 
$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 新規書き込み ############################# sub GoWrite{ if(param('dataline')){ $dataline = param('dataline'); }else{ &error(101,'データ取得に失敗しました'); } $dataline =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; ($uname,$text) = split(/Enc_DataSep_Code/,$dataline); $sec = time(); $today = &GetToday($sec); $status = &SHIN_CGI::FileLockLock(1,$LockFile,$lockflag); if (!$status){ &error(102,"ただいまサーバーが込み合っています"); } open(DATA,"$DataFile") || &error(103,"Can not open DataFile.",1); @alllines=; close(DATA); if (@alllines<=0){ $newnum = 1; }else{ $newnum = (split(/Enc_Sep_Code/,$alllines[0]))[0]; $newnum++; } $newline = join('Enc_Sep_Code',$newnum,$uname,$text,$sec); if($MaxLog){ $MaxLog-=2; if($#alllines > $MaxLog){ $#alllines = $MaxLog; } } open(DATA,"> $DataFile") || &error(104,"Can not open DataFile.",1); print DATA $newline,"\n"; foreach $line (@alllines){ print DATA $line; } close(DATA); &SHIN_CGI::FileLockLock(0,$LockFile,$lockflag); #HTML部分 $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


新規登録

以下の内容で登録しました


登録日

$today

担当者

$uname

内容

$text

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 編集フォーム表示 ############################# sub ShowChangeForm{ if(param('num')){ $num = param('num'); }else{ &error(105,'データ番号がありません'); } $n_flag = 0; open(IN,"$DataFile") || &error(106,'データファイルが開けません'); while(){ $data = $_; chop($data); ($fnum,$fname,$ftext,$fsec) = split(/Enc_Sep_Code/,$data); if ($num == $fnum){ $n_flag = 1; last; } } close(IN); if (!$n_flag){ &error(107,'データ番号がありません'); } $ftext =~ s/
/\n/g; $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


編集


担当者

日時表示更新

しない

 

する

内容

 
$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # 編集データ確認 ############################# sub CheckChangeData{ if(param('num')){ $num = param('num'); }else{ &error(108,'データ番号がありません'); } if(param('uname')){ $uname=param('uname'); &jcode::convert(*uname,'euc'); $uname =~ s/[\r\n]//g; if (!$uname){ push(@errors,'担当者Enc_Sep_Code担当者名をご記入下さい'); } }else{ push(@errors,'担当者Enc_Sep_Code担当者名をご記入下さい'); } if(param('text')){ $text=param('text'); &jcode::convert(*text,'euc'); $text =~ s/\r\n/\n/g; $text =~ s/\n/
/g; $text =~ s|
]+\">([^<>]+)|$1|ig; $text =~ s/([^=^\"]|^)((http|https|ftp|mailto):[\@!#-9A-~]+)/$1$2<\/a>/g; if (!$text){ push(@errors,'内容Enc_Sep_Code内容をご記入下さい'); } }else{ push(@errors,'内容Enc_Sep_Code内容をご記入下さい'); } if (param('datechange')){ $datechange = param('datechange'); }else{ push(@errors,'日時変更Enc_Sep_Code日時変更ボタンを選択して下さい'); } if(param('sec')){ $sec = param('sec'); }else{ push(@errors,'秒数nc_Sep_Code秒数がありません'); } if ($datechange == 1){ $dateword = '変更しない'; }else{ $dateword = '変更する'; $sec = time(); } if (@errors){ $errorline = join('Enc_ESep_Code',@errors); &error01($errorline); } $dataline = join('Enc_DataSep_Code',$num,$uname,$text,$sec); $dataline =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


編集

以下の内容で編集してよろしいですか?


担当者

$uname

日時表示

$dateword

内容

$text

 
$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # データ編集実行 ############################# sub GoChangeData{ if(param('dataline')){ $dataline = param('dataline'); }else{ &error(109,'データ取得に失敗しました'); } $dataline =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; ($num,$uname,$text,$sec) = split(/Enc_DataSep_Code/,$dataline); $today = &GetToday($sec); $newline = join('Enc_Sep_Code',$num,$uname,$text,$sec); $status = &SHIN_CGI::FileLockLock(1,$LockFile,$lockflag); if (!$status){ &error(100,"ただいまサーバーが込み合っています"); } open(IN,"$DataFile")|| &error(111,"データファイルが開けません",1); while(){ $dmy = $_; chop($dmy); $fnum = (split(/Enc_Sep_Code/,$dmy))[0]; if ($fnum == $num){ push @alllines,$newline; next; } push @alllines,$dmy; } close(IN); open(OUT,">$DataFile")|| &error(112,"データファイルが開けません",1); foreach $line (@alllines) { print OUT $line,"\n"; } close(OUT); &SHIN_CGI::FileLockLock(0,$LockFile,$lockflag); $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


編集

以下の内容で編集しました


登録日

$today

担当者

$uname

内容

$text

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # データ削除確認 ############################# sub CheckDelete{ if(param('num')){ $num = param('num'); }else{ &error(113,'データ番号がありません'); } open(IN,"$DataFile")|| &error(114,"データファイルが開けません",1); while(){ $dmy = $_; chop($dmy); ($fnum,$uname,$text,$sec) = split(/Enc_Sep_Code/,$dmy); if ($fnum == $num){ last; } } close(IN); $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


削除

以下の内容を削除してよろしいですか?


担当者

$uname

内容

$text

 
$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################# # データ削除実行 ############################# sub GoDelete{ if(param('num')){ $num = param('num'); }else{ &error(115,'データ番号がありません'); } $status = &SHIN_CGI::FileLockLock(1,$LockFile,$lockflag); if (!$status){ &error(116,"ただいまサーバーが込み合っています"); } open(IN,"$DataFile") || &error(117,"Can not open DataFile.",1); while(){ $line = $_; chop($line); if ($num == (split(/Enc_Sep_Code/,$line))[0]){ $deldata = $line; next; } push @alllines,$line; } close(IN); open(OUT,"> $DataFile") || &error(118,"Can not open DataFile.",1); foreach $data(@alllines){ print OUT $data,"\n"; } close(OUT); &SHIN_CGI::FileLockLock(0,$LockFile,$lockflag); ($num,$name,$text,$sec)=split(/Enc_Sep_Code/,$deldata); $HTML=<<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


削除

以下の内容を削除しました


担当者

$name

内容

$text

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################## # 管理パスワード変更フォーム ############################## sub ChangePasswd{ $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


管理パスワード変更


新しいパスワード


※確認の為もう一度

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################## # 管理パスワード変更実行 ############################## sub GoChangePasswd{ require 'hmkpasswd.pl'; if(param('passwd_a')){ $passwd_a = param('passwd_a'); }else{ &error(119,'新しいパスワードを入力して下さい'); } if(param('passwd_b')){ $passwd_b = param('passwd_b'); }else{ &error(120,'新しいパスワード(確認用)を入力して下さい'); } if($passwd_a ne $passwd_b){ &error(121,'パスワードは2つとも同じものを入力して下さい'); } $newpasswd = &hmkpasswd($passwd_a); open OUT,"> $PasswdFile"; print OUT $newpasswd; close OUT; $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle
管理モード


管理パスワード変更



管理パスワードを変更しました

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; } ############################### # 管理パスワード認証 ############################### sub LoginCheck { if (param('passwd')){ $passwd = param('passwd'); open IN,"$PasswdFile"; $fpasswd = ; close IN; $fpasswd =~ s/[\r\n]//g; if(crypt($passwd,$fpasswd) ne $fpasswd){ $action = 'show_login'; } }else{ $action = 'show_login'; } } ################################################# # 今日の日付 ################################################# sub GetToday { my($time) = @_; my($today); my($sec,$min,$hour,$mday,$mon,$year,$wday,$lyear,$syear,$tmon,$weekj,$weekjs,$weeke,$weekes,$monj,$monjs,$mone,$mones); ($sec,$min,$hour,$mday,$mon,$year,$wday,$lyear,$syear,$tmon,$weekj,$weekjs,$weeke,$weekes,$monj,$monjs,$mone,$mones)=&SHIN_CGI::GetTime($time); if($min < 10){ $min = '0' . $min; } if($sec < 10){ $sec = '0' . $sec; } $today=$lyear . '年' . $tmon . '月' . $mday . '日(' . $weekjs . ')' . $hour . ':' . $min . ':' . $sec; return $today; } ######################### # エラー01 ######################### sub error01 { my($word)=@_; @errors = split('Enc_ESep_Code',$word); $HTML = <<"EOL"; $HTML_HEAD

$CgiTitle

以下のエラーがありました。


EOL foreach $err (@errors){ ($er1,$er2)=split(/Enc_Sep_Code/,$err); $HTML .= <<"EOL"; EOL } $HTML .=<<"EOL";

$er2

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; exit; } ################################################# # エラー表示 ################################################# sub error { ($num,$word,$lflag)=@_; if($lflag){ &SHIN_CGI::FileLockLock(0,$LockFile,$lockflag); } $HTML=<<"EOL"; $HTML_HEAD

Error!!

No:$num

$word

$CopyRight EOL &jcode::euc2sjis(*HTML); print "Content-type: text/html; charset=Shift_JIS\n\n"; print $HTML; exit; }