#!/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
#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
#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";
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 "\n";
}
print "\n";
print "\n";
return;
}
## 管理ページ用のフォームボタンを返す
## @param hash_ref フォームボタンのパラメータ
## @return string フォームボタンタグ
sub get_button_tag {
my( $name, $bt_params ) = @_;
my $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;