#!/usr/local/bin/perl #↑1行目にサーバへ設置されているPerlのパスを設定してください。 #不明な場合にはサーバ管理者へ問い合わせてください。 #(このスクリプトはPerl5で書かれています。) ## ## このファイルについて ## 「管理ページ実行ファイル」 ## #---------------------------------------------------------------------------# #初期設定ファイルini.cgiを要求 require( "./ini.cgi" ); #日本語変換ライブラリjcode.plを要求 require( "./lib/jcode.pl" ); #クッキー処理ライブラリap_cookie.plを要求 require( "./lib/ap_cookie.pl" ); #フォームデータ%in値のをshift_jisへ変換する &ch_jcode(); #処理開始 &start(); ## 処理開始 ## @return void sub start { #モードで処理を振り分ける if( $in{'mode'} eq 'write1' ) { #記事追加1モード &check_admin_passw(); &do_write1(); } elsif( $in{'mode'} eq 'write2' ) { #記事追加2モード &check_admin_passw(); &do_write2(); } elsif( $in{'mode'} eq 'edit1' ) { #修正1モード &check_admin_passw(); &do_edit1(); } elsif( $in{'mode'} eq 'edit2' ) { #修正2モード &check_admin_passw(); &do_edit2(); } elsif( $in{'mode'} eq 'edit3' ) { #修正3モード &check_admin_passw(); &do_edit3(); } elsif( $in{'mode'} eq 'del1' ) { #削除1モード &check_admin_passw(); &do_del1(); } elsif( $in{'mode'} eq 'del2' ) { #削除2モード &check_admin_passw(); &do_del2(); } elsif( $in{'mode'} eq 'back' ) { #バックアップ/復旧モード &check_admin_passw(); require( "./lib/admin_back.pl" ); require( "./lib/ap_back.pl" ); &do_back(); } else { #認証モード &do_sertif(); } exit(0); } #---------------------------------------------------------------------------# ## レコード追加1 sub do_write1 { #日付けを取得 my $date = &get_localdate( time(), "%Y/%M/%D" ); #クッキー発行 &set_admin_passw_cookie(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print << "END_OF_DOC";
レコード追加
見出し
内容


内容の表\示オプション
日付け
管理メニューへ戻る
END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード追加2 sub do_write2 { #入力検査 if( $in{'headline'} eq "" ) { &error( '見出しを記入してください。' ); } if( $in{'content'} eq "" ) { &error( '内容を記入してください。' ); } if( $in{'date'} eq "" ) { &error( '日付けを記入してください。' ); } #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #全行を読む my @rows = ; #2重書込み防止 if( @rows > 0 ) { &parse_rec( $rows[0] ); if( ($in{'headline'} eq $rec{'headline'}) && ($in{'content'} eq $rec{'content'}) && ($in{'date'} eq $rec{'date'}) ) { &error( 'このレコードは書込み完了しています。', '確認してください。' ); } } #記事番号ファイルを開く if( !open( NUM, "<".$DATA_DIR."pkey.cgi" ) ) { &error( '記事番号ファイルアクセスエラー。' ); } my $pkey = ; chomp( $pkey ); $pkey = $pkey + 1; #記事ファイル、記事番号ファイルを上書き if( !open( RECS, ">".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } if( !open( NUM, ">".$DATA_DIR."pkey.cgi" ) ) { &error( '記事番号ファイルアクセスエラー。' ); } #番号ファイルを書き込む print NUM "$pkey\n"; #記事ファイルへ新しいレコードを書き込む print RECS "$pkey<>"; print RECS "$in{'headline'}<>"; print RECS "$in{'content'}<>"; print RECS "$in{'date'}<>"; print RECS "$in{'auto_ret'}<>"; print RECS "$in{'tag'}<>"; print RECS "\n"; #残りのレコードを書き込む my $cnt = 1; for ( my $i = 0; $i < @rows; $i++ ) { $cnt++; if( $cnt > $MAX_RECS ) { last; } print RECS $rows[$i]; } #ファイルを閉じる close( RECS ); close( NUM ); #ロック解除 &unlock(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); my $button = &get_button_tag( '続けて追加する', { "mode" => 'write1', "admin_passw" => $in{'admin_passw'} } ); print << "END_OF_DOC"; レコード追加完了しました。

$button

管理メニューへ戻る
END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード修正1 sub do_edit1 { #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #全行を読む my @rows = ; #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #クッキー発行 &set_admin_passw_cookie(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print << "END_OF_DOC";
END_OF_DOC # for( my $i = 0; $i < @rows; $i++ ) { &parse_rec( $rows[$i] ); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print << "END_OF_DOC";
レコード修正
選択 番号 見出し 日付け
$rec{'pkey'}$rec{'headline'}$rec{'date'}
管理メニューへ戻る
END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード修正2 sub do_edit2 { #入力検査 if( !exists( $in{'pkey'} ) || $in{'pkey'} eq "" ) { &error( 'レコードを選択してください。' ); } #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } my @rows = ; #修正対象の記事を取る。 my $row = ""; my $check = undef; for( my $i = 0; $i < @rows; $i++ ) { if( $rows[$i] =~ /^$in{'pkey'}<>/ ) { $row = $rows[$i]; $check = 1; last; } } if( !$check ) { &error( '指定のレコードが見つかりませんでした。' ); } #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #レコード解析 &parse_rec( $row ); $rec{'content'} =~ s/\t/\n/g; #タグ my @tag = ( "", "" ); $tag[$rec{'tag'}] = " selected"; #自動改行 my @auto_ret = ( "", "" ); $auto_ret[$rec{'auto_ret'}] = " selected"; #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print << "END_OF_DOC";
レコード修正
見出し
内容


内容の表\示オプション
日付け
管理メニューへ戻る
END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード修正3 sub do_edit3 { #入力検査 if( $in{'pkey'} eq "" ) { &error( 'レコードを選択してください。' ); } if( $in{'headline'} eq "" ) { &error( '見出しを記入してください。' ); } if( $in{'content'} eq "" ) { &error( '内容を記入してください。' ); } if( $in{'date'} eq "" ) { &error( '日付けを記入してください。' ); } #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #全行を読む my @rows = ; #記事ファイルを上書き if( !open( RECS, ">".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #書き込む for( my $i = 0; $i < @rows; $i++ ) { if( $rows[$i] =~ /^$in{'pkey'}<>/ ) { #修正レコード print RECS "$in{'pkey'}<>"; print RECS "$in{'headline'}<>"; print RECS "$in{'content'}<>"; print RECS "$in{'date'}<>"; print RECS "$in{'auto_ret'}<>"; print RECS "$in{'tag'}<>"; print RECS "\n"; next; } print RECS $rows[$i]; } #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); my $button = &get_button_tag( '続けて修正する', { "mode" => 'edit1', "admin_passw" => $in{'admin_passw'} } ); print << "END_OF_DOC"; レコード修正しました。

$button

END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード削除1 sub do_del1 { #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #全行を読む my @rows = ; #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #クッキー発行 &set_admin_passw_cookie(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print << "END_OF_DOC";
END_OF_DOC # for( my $i = 0; $i < @rows; $i++ ) { &parse_rec( $rows[$i] ); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print << "END_OF_DOC";
レコード削除
選択 番号 見出し 日付け
$rec{'pkey'}$rec{'headline'}$rec{'date'}
END_OF_DOC #HTMLフッタ &print_footer(); return; } ## レコード削除2 sub do_del2 { #入力検査 if( $in{'pkey'} eq "" ) { &error( 'レコードを選択してください。' ); } #ロック &lock(); #記事ファイルを開く if( !open( RECS, "<".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #全行を読む my @rows = ; #記事ファイルを上書き if( !open( RECS, ">".$DATA_DIR."recs.cgi" ) ) { &error( '記事ファイルアクセスエラー。' ); } #削除レコード以外を書き込む for( my $i = 0; $i < @rows; $i++ ) { if( $rows[$i] =~ /^$in{'pkey'}<>/ ) { next; } print RECS $rows[$i]; } #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); my $button = &get_button_tag( '続けて削除する', { "mode" => 'del1', "admin_passw" => $in{'admin_passw'} } ); print << "END_OF_DOC"; レコード削除しました。

$button

END_OF_DOC #HTMLフッタ &print_footer(); return; } ## 認証 sub do_sertif { #管理パスワードクッキー取得 my $admin_passw = &ap_cookie::get_cookie( $COOKIE_NAME.'admin_passw' ); my $cookie_check = ""; if( $admin_passw ne "" ) { $cookie_check = " checked"; } #バックアップ機能 my $back = ""; if( $BACK_MODULE ) { $back = ''; } #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print << "END_OF_DOC";
管理メニュー
実行モード
管理パスワード
管理パスワードをCookie保存
END_OF_DOC #HTMLフッタ &print_footer(); return; } #---------------------------------------------------------------------------# ## 管理パスワードを検査 ## @return void sub check_admin_passw { if( $in{'admin_passw'} ne $ADMIN_PASSW ) { &error( '管理パスワードが間違っています。' ); } return; } ## 管理パスワードクッキーを発行 ## @return void sub set_admin_passw_cookie { my $cookie_data = ""; #クッキー処理なし if( exists $in{'no_cookie'} ) { return; } #発行用クッキー文字列を作る if( $in{'cookie'} ) { #クッキーを作る $cookie_data = &ap_cookie::mk_cookie( $COOKIE_NAME.'admin_passw', $in{'admin_passw'}, $COOKIE_PATH, $COOKIE_EXP ); } else { #保存しない場合はクッキーを消すための文字列を作る $cookie_data = &ap_cookie::mk_cookie( $COOKIE_NAME.'admin_passw', "", $COOKIE_PATH, 0 ); } #発行 print "$cookie_data\n"; return; } ## この実行ファイルのHTTPレスポンスヘッダを出力 ## @return void sub print_http_header { #キャッシュ制御 print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; print "Expires: -1\n"; #ロボット用 print "Robots: index,follow\n"; #コンテンツ形 print "Content-Type: text/html;charset=Shift_JIS\n\n"; return; } ## HTMLヘッダを出力 ## @return void sub print_header { my $style = $LIB_DOCS_ADDR.'style_admin.css'; print << "END_OF_DOC"; $TITLE - 管理用
$TITLE - 管理用

END_OF_DOC return; } ## HTMLフッタを出力 ## @return void sub print_footer { print "

\n"; if( $LISENCE ne 'REGISTERED' ) { print "
"; print ""; print "$THIS_NAME $VERSION"; print "
\n"; } print "\n"; print "\n"; return; } ## 管理ページ用のフォームボタンを返す ## @param hash_ref フォームボタンのパラメータ ## @return string フォームボタンタグ sub get_button_tag { my( $name, $bt_params ) = @_; my $ret = "
\n"; my $k = ""; my $v = ""; $ret .= "\n"; while( ($k, $v) = each %{$bt_params} ) { $ret .= "\n"; } $ret .= "\n"; $ret .= "
"; return $ret; } ## $ENV{'TZ'}に基づく日付を返す ## @param int タイムスタンプ ## @param string フォーマット ## @param [array_ref 曜日の配列](メモ:このファイルはsjis用) ## @return string フォーマットされた日付 ## フォーマットについて"%Y/%M/%D(%W) %G:%I:%S" ## %Y: 西暦 ## %M: 月 ## %D: 日 ## %W: 曜日 ## %G: 時間 ## %I: 分 ## %S: 秒 sub get_localdate { my( $time, $format, $week_array ) = @_; if( !defined( $time ) || $time eq "" ) { $time = time(); } my @week = ( "日", "月", "火", "水", "木", "金", "土" ); if( ref( $week_array ) eq 'ARRAY ') { @week = @{$week_array}; } my @tinfo = localtime( $time ); my $fstr = ""; my @farray = (); $format =~ s/%Y/sprintf("%04d",$tinfo[5] + 1900)/eg; $format =~ s/%M/sprintf("%02d",$tinfo[4] + 1)/eg; $format =~ s/%D/sprintf("%02d",$tinfo[3])/eg; $format =~ s/%W/$week[$tinfo[6]]/eg; $format =~ s/%G/sprintf("%02d",$tinfo[2])/eg; $format =~ s/%I/sprintf("%02d",$tinfo[1])/eg; $format =~ s/%S/sprintf("%02d",$tinfo[0])/eg; return $format; } 0;