#! /usr/bin/perl
#↑上の行はプロバイダーの環境に合わせて設定してください。
#=============================================================================
# BBS Note 8.x
# Copyright(C) WonderCatStudio. All rights reserved.
# http://wondercatstudio.com
# LastModify 2004/06/06
#=============================================================================
##############################################################################
######################### 設定項目はありません #############################
##############################################################################
#-----------------------------------------------------------------------------
require 5.003;
sub filelock;
sub fileunlock;
eval { &Initialize };
sub Initialize{
#----------------------------< CONFIG >---------------------------------------
$SYS{ VERSION } = '8.0b14';
$SYS{ CONFIG_VERSION } = '2004011500';
$SYS{ CONFIGDIR } = './';
$SYS{ CONFIG } = 'config.cgi';
$SYS{ SKINDIR } = './';
$SYS{ SKIN } = 'skin.cgi';
$SYS{ SKINCONFIG } = 'skincfg.cgi';
$SYS{ BBSNote } = $1 if($ENV{ SCRIPT_NAME } =~ /([^\\\/]+)$/);
$SYS{ LANGUAGE } = 'JP'; # language [JP=Japanese or EN=English]
$SYS{ RECOVER_SLEEP } = 1; # recover sleep flag
$SYS{ CAPTOR_FORMAT } = 'jpg,png,gif';
$SYS{ SYSINDEX_HEAD } = 'BBSNOTE-SYSTEM-INDEX:';
$CFG{ VIEW_ROTATION } = 'normal,catalog,thumbnail,noimage';
(-e $SYS{ CONFIGDIR }.$SYS{ CONFIG })||&End('ERROR',&Info('CONFIG_NOTFOUND'));
require $SYS{ CONFIGDIR }.$SYS{ CONFIG };
(-e $SYS{ SKINDIR }.$SYS{ SKIN })||&End('ERROR',&Info('SKIN_NOTFOUND'));
require $SYS{ SKINDIR }.$SYS{ SKIN };
$SYS{ SORT_MODE } = $CFG{ ViewSortType };
# *RO = Read Only
$SYS{ MODE } = ''; # system mode *RO
$SYS{ INDEX } = ''; # system index *RO
$SYS{ BBS_COPYRIGHT } = ''; # bbsnote copyright *RO
$SYS{ CLIENT_COPYRIGHT } = ''; # client program copyright *RO
$SYS{ MODULE_COPYRIGHT } = ''; # module copyright *RO
# file lock config
$SYS{ LOCK_SLEEP } = 1; # lock sleep sec *RO
$SYS{ LOCK_TRY } = 5; # lock try count *RO
$SYS{ LOCK_SEC } = 60; # lock sec *RO
$SYS{ LOCK_DIR } = $CFG{ DirSysPath }.'/lock'; # lock directory *RO
$SYS{ LOCKED } = 0; # lock flag
# Flag
$SYS{ FLAG }{ HTTPHEAD } = ''; # HTTPHEAD flag
$SYS{ FLAG }{ MANUALHTTP } = ''; # maual mode http response flag
$SYS{ FLAG }{ GETTEMPFILENAME } = ''; # use tempfile flag
$SYS{ FLAG }{ ALLTAG } = 0; # use all tags flag
$SYS{ Jcode } = ''; # use jcode flag
$SYS{ JAVASCRIPT } = {}; # global javascript
$SYS{ ARG }{ Global } = (); # global all arg
$SYS{ ARG }{ Menu } = (); # all menu arg
$SYS{ ARG }{ PageLink } = (); # page link arg
$SYS{ ARG }{ PostForm } = (); # post form value arg * = replry post form
$SYS{ ARG }{ ReplyForm } = (); # replry form value arg * = res form or button
$SYS{ ARG }{ DeleteForm } = (); # delete form value arg
$SYS{ ARG }{ EditForm } = (); # edit form value arg
$SYS{ ARG }{ ReplyForm } = (); # replry form value arg * = res form or button
#-------------------------------------------------------------------
@SYS{'USER_AGENT','USER_OS','USER_BROWSER','USER_BROWSER_VER'} = &GetUserAgent;
&Call('InitializeInit');
&RegVersion;
}
#-----------------------------------------------------------------------------
# ページ表示
sub OpenPage{
%COOKIE = &GetCookie; # global hash
&Call('OpenPageBegin');
&OpenSysIndex(INDEX , 'index');
$CFG{ LogView } = $CFG{ CatalogCol } * $CFG{ CatalogRow } if $IN{mode} eq 'catalog';
local $LogTotal = $SYS{ INDEX }{ INDEX }{total};
local $Page = int $IN{page} ? int $IN{page} : 1 ;
local $Index = ($Page - 1) * $CFG{ LogView };
$Index = $Page = 0 if($Index >= $LogTotal);
local $IndexPos;
local($PageLinkText, $PageLinkForm) = &CreatePageLink;
$SYS{ SORT_MODE } = $IN{sort} eq '' ? $SYS{ SORT_MODE } : $IN{sort} ? 1 : 0;
&MailCrypt;
&HttpHead;
&SkinHead();
&SkinMenu;
print "$Data / /g;
while($pos >= 0){
$pos = index $msg,'<',$pos;
if($pos >= 0){
$s = index $msg,'>',$pos + 1;
if($s >= 0){
my $a = substr $msg, 0, $pos if$pos;
$msg = $a.(substr $msg, $s+1);
}else{
$pos++
}
}else{last}
}
$seq.="
";
&Call('OpenPageMenu');
for(#< LOG LOOP >=============================================================
$IndexPos = 0;
$IndexPos < $CFG{ LogView } && $Index < $LogTotal;
$Index++, $IndexPos++
){
local $IndexNumber = &ReadSysIndex(INDEX ,$Index, $SYS{ SORT_MODE });
local $ThreadNumber;
if($SYS{ SORT_MODE }){
$ThreadNumber = &ReadSysIndex(INDEX ,$Index, 2);
}else{
$ThreadNumber = $LogTotal - $Index;
}
&OpenLog($IndexNumber);
}#================================================================
&CloseSysIndex(INDEX);
&Call('OpenPageFoot');
&SkinFoot;
exit;
}
#-----------------------------------------------------------------------------
# RSS表示
sub OpenRss{
&OpenSysIndex(INDEX , 'index');
$rdate = sub{ if($_[0] =~ /(\d*)\/(\d\d)\/(\d\d) \((\w*)\) (\d\d):(\d\d):?(\d\d)?/){
my($year,$month,$day,$week,$hour,$min,$sec) = ($1,$2,$3,$4,$5,$6,$7);
$sec = '00'if!$7;
return "$year-$month-$day\T$hour:$min:$sec+09:00";
}};
$mod = &GetDate((stat INDEX)[9]);
$mod = &$rdate($mod);
$SYS{ HTTPCONTENTTYPE } = 'text/xml';
&HttpHead;
if(exists $IN{ modified } && "$IN{ modified }+09:00" ge $mod){
print "304 Not Modified";
exit;
}
my $view = int $IN{ view };
$SYS{ SORT_MODE } = $IN{sort} eq '' ? $SYS{ SORT_MODE } : $IN{sort} ? 1 : 0;
$CFG{ LogView } = $view if 0 < $view && $view <= 30 ;
local $IndexPos;
local $Page = int $IN{page} ? int $IN{page} : 1 ;
local $LogTotal = $SYS{ INDEX }{ INDEX }{total};
local $Index = ($Page - 1) * $CFG{ LogView };
$Index = $Page = 0 if($Index >= $LogTotal);
my $la = lc $SYS{ LANGUAGE };
my $bn = "http://$ENV{HTTP_HOST}$ENV{REQUEST_URI}";
my(%applets, $ap, $seq, $items);
if(exists $SYS{ MODULE }{ Paint }){
# 有効アプレットを示す変数列挙
my $a = $Paint::CFG{ UseApplet };
foreach(keys %$a){
$applets{&Paint::Setting->{$_}{ applet }}=1 if $Paint::CFG{ UseApplet }{$_};
}
map{$ap.= "
/ /g;
$msg =~ s/
'; print $PageLinkForm; &TabeleFrame($txt[0]); print "$txt[1]" if($AutoLogin); print '
| ';
local $FormCgi = "
_HTML_
}
&Call('OpenAdminMenu');
my $f = $FormCgi;
$f =~ s/(method)/name=menuform $1/;
# 一括削除
if($IN{ mode } eq 'delete'){
$SYS{ FLAG }{ MENUFORM } = 'ADMIN';
print <<_HTML_;
$FormCgi
$txt[8] $f $txt[6] $txt[9] _HTML_ }else{ # 通常管理 # フック my $cmd = sub{ local($Bg1,$Bg2,$Size,@cell,@Command); $Bg1=$CFG{ TagTableOut }{bgcolor}; $Bg2=$CFG{ TagTableIn }{bgcolor}; $Size=$CFG{ TagMessage }{size}; @Cell = (1,1,3,0); # cell space padding my $cmd_del={ action => $CFG{ BBSNoteUrl }, fc => 'admin', mode => 'delete', page => $IN{page}, submit => $txt[5], number => $_[0] eq 'SkinMainInit'?$IndexNumber:"$IndexNumber\-$LogValue{num}", }; push @Commad,$cmd_del; &Call('OpenAdminCommand'); my $s; foreach $h(@Commad){ if($$h{ action }){ $s.= " ";
$s.= "";
$s.= "";
delete $$h{ action };
delete $$h{ submit };
map{ $s.= "" if $$h{$_} ne '' } keys %$h;
$s.=' |
$txt[7] _HTML_ } print <<_HTML_; |
| $cf[$c] | @cf[$c+1] |
[ Cookie Data ] *DEBUG
| $_ | $COOKIE{$_} |
'; } &Call('OpenHelpConfig'); print "
| $cfg[$c] | @cfg[$c+1] |
| ImageMagick | $ver[0] |
| $txt[2] : ";
foreach(split /,/,$CFG{ OkTag }){
print "\<\;$_\>\;\ \; | |
| "if$mo_cnt==1; print "[$_ : $$mo{$_}{version}]" } print ' |
| ||||||
';
$linkform='
| '; } if($n < $maxpage){ $linkform .= $formtag.' |
';
$submit = '';
}
my $tag = $arg[1];
$tag =~ s/\$close/$close/;
$tag =~ s/\$submit/$submit/;
${$arg[0]}.=$tag;
my @text = &Info('LAYERFORM_TEXT');
# $arg[2]; 送信ボタンテキスト
$$ref.=</\n\n/g; $$s =~ s/<\/?SPAN class="quot">//g; $$s =~ s/<\/?A["-.!~*'()\w;\/?:\@&=+\$,%# ]*class="(?:quot|autolinkurl|autolinkmail)">//g; } #----------------------------------------------------------------------------- sub ConvertMessage(){ local $Message = $_[0]; &Call('ConvertMessageInit'); # 改行をBRに変換 $Message=~ s/\x0D\x0A/\n/go; $Message=~ s/\x0D/\n/go; $Message=~ s/\x0A/\n/go; $Message=~ s/\n+$//go; $Message=~ s/^\n+//go; &Call('ConvertMessageBegin'); $Message=~ s/ / /go; $Message=~ s/\t/ /go; # 使用可能タグ my $errstr; if(!$SYS{ FLAG }{ ALLTAG } && $CFG{ UseTag } && ($errstr = &ConvertTag(\$Message,\$CFG{ OkTag }))){ push @ERR,&Info('CHECK_TAG',$errstr); } &Call('ConvertMessageAutoLink'); # リンクを有効に if($CFG{ AutoLinkUrl }){$Message =~ s/https?:\/\/([-.!~*'()\w;\/?:\@&=+\$,%#]+)/&ConvertURI($1)/eg} if($CFG{ AutoLinkMail }){$Message =~ s/mailto\:([\w\.\?\#\_\:\;\/\%\&\$\"\!\'\(\)\=\~\^\-\+\|\@]*)/$1<\/A class=\"autolinkmail\">/ig} $Message =~ s/(https?)%3A/$1:/g; &Call('ConvertMessageQuotation'); # 引用文 if($CFG{ Quotation }){ my $m; my $link = sub(){ my($h,$q,$s,$e) = @_; if($q eq '>' && $s =~ />([\d\,\-]+)/){ return $h.''.$q.$s.''.$e }else{ return $h.''.$q.$s.''.$e } }; for($m=0;$m<2;$m++){$Message=~ s/(^|\n)([>#]|\x81\x84+)(.+)(\n|$)/&$link($1,$2,$3,$4)/eg} } &Call('ConvertMessageLineCheck'); # 行数チェック my $line = ($Message =~ s/\n\n/
/img); $line*=2;
$line+=($Message =~ s/\n/
/img);
if($CFG{ LimitLine } < $line){
push @ERR,&Info('CHECK_MESSAGELINEOVER',$line)
}
&CheckError(@ERR);
&Call('ConvertMessageEnd');
return $Message;
}
#-----------------------------------------------------------------------------
# タグ変換
sub ConvertTag(){
my($ref_str,$ref_tag) = @_;
my($str,$end,@parts,@_cnt,$flag_pre,$_pertag);
my @ref_tags = split ',',$$ref_tag;
$$ref_str =~ s/\<\;BR>/\n/igo;
$$ref_str =~ s/\<\;P>/\n\n/igo;
@parts = split(/(>)/,$$ref_str);
undef $$ref_str;
$end = pop @parts;
foreach(@parts){
if(index $_,'<' > -1){
my($n,$aliment,$need,$slash,@l);
foreach $_pertag(@ref_tags){
my($tag,@tag_element) = split /:/,$_pertag;
if(s/\<\;(\/)?$tag([\&\w\s]+.*|$)/<$1$tag/i){
$slash = $1;
$flag_pre = $flag_pre != 1?1:0 if($tag eq 'PRE');
if($slash eq ''){$_cnt[$n]++}else{$_cnt[$n]--}
if(!$flag_pre){
if(length $2 > 1){
$aliment = $2;
$aliment =~ s/\=/\&equ\;/gi;
$aliment =~ s/\ \;/ /gi;
my $ln;
while($aliment =~ /\&equ\;\"\;([\\\w-.!~*'();\/?:\@\&\+\$,%\#\x80-\xFF ]+)\"\;(\s|$)/){
my $v = $1;
$v =~ s/\"\;.+//;
my $t = $v;
$v =~ s/\&equ\;/=/g;
$v =~ s/(https?):/$1%3A/g;
$aliment =~ s/(\&equ\;\"\;)$t(\"\;)(\s|$)/$1$v\e$2$3/;
$ln++;
last if($ln>10);
}
if($tag eq 'FONT'){
push @tag_element,qw/size color face/;
}elsif($tag eq 'IMG'){
$_cnt[$n]--;
}elsif($tag eq 'DIV'){
push @tag_element,'align';
}
foreach $e(@tag_element){
$aliment =~ s/(\s*)$e\&equ\;\"\;([^\e]+)(?:\e)\"\;/$1$e\=\"$2\"/si;
}
}
}elsif($tag ne 'PRE'){s/\<\;/}
$aliment =~ s/(?:\e|\"\;|\&equ\;)//g;
$aliment =~ s/(?: *)$//g;
last
}
$n++
}
$_.=$aliment
}
$str .= $_
}
my($s,$n,$errstr,$tag);
foreach(@_cnt){
if($_>0){
($tag) = split /:/,$ref_tags[$n],1;
$s = join '',$_,&Info('CHECK_TAGPOINT') if $_>1;
$errstr.= "<$tag>$s ";
}
$n++
}
$$ref_str = $str.$end;
return $errstr if($errstr);
return 0;
}
#-----------------------------------------------------------------------------
sub BackupSysIndex{
my $sys_index_cgi = "$CFG{ DirSysPath }/index.$CFG{ FileSysExe }";
my $sys_count_cgi = "$CFG{ DirSysPath }/count.$CFG{ FileSysExe }";
$SYS{ HTTPCONTENTTYPE } = 'application/octet-stream';
&HttpHead;
# バッファリングしない
$|=1;
print $SYS{ SYSINDEX_HEAD };
$size = -s $sys_index_cgi;
if($size){
$buf.=":$size:";
open(BIN,$sys_index_cgi);
binmode BIN;
read BIN, $bin, $size;
close BIN;
}
$size = -s $sys_count_cgi;
if($size){
$buf.="$size:";
open(BIN,$sys_count_cgi);
binmode BIN;
read BIN, $cnt, $size;
close BIN;
}
@sum_bin = &CheckSumFile(\$bin);
@sum_cnt = &CheckSumFile(\$cnt);
$buf.=join ':',@sum_bin,@sum_cnt;
print sprintf "%04d",(length $buf)-1;
print $buf;
print $bin;
print $cnt;
exit;
}
#-----------------------------------------------------------------------------
sub RecoverFileIndex{
@txt = &Info('FILERECOVER_TEXT');
&RecoverFileIndexForm if(!$IN{file});
$l = length $SYS{ SYSINDEX_HEAD };
# file head check
&End('ERROR',&Info('UNKNOWN_FORMAT'))if($SYS{ SYSINDEX_HEAD } ne (substr $IN{file},0,$l));
$header_len = int substr $IN{file},$l,4;
$header = substr $IN{file},$l+5,$header_len;
($index_len,$count_len,@index_sum[0..2],@count_sum[0..2]) = split ':',$header;
$index_bin = substr $IN{file},$l+5+$header_len,$index_len;
$count_bin = substr $IN{file},$l+5+$header_len+$index_len,$count_len;
@sum_bin = &CheckSumFile(\$index_bin);
@sum_cnt = &CheckSumFile(\$count_bin);
# check sum err
&End('ERROR',@txt[0,4]) unless((join ':',@sum_bin,@sum_cnt) eq (join ':',@index_sum,@count_sum));
# recover
filelock;
open(BIN,">$CFG{ DirSysPath }/index.$CFG{ FileSysExe }");
binmode BIN;
print BIN $index_bin;
close BIN;
open(BIN,">$CFG{ DirSysPath }/count.$CFG{ FileSysExe }");
binmode BIN;
print BIN $count_bin;
close BIN;
@txt = &Info('RECOVER_TEXT');
&HttpHead;
&SkinHead($txt[0]);
print "
'} elsif('DEFF_FORM_ARRAY_TYPE_ROW' eq $s){$r[0]='変数エラー';$r[1]='フォーム 行構造体の指定が間違っています。'} elsif('POST_UPLOADSIZEINFO' eq $s){$r[0]=qq/受信できる画像の最大データサイズは /.($CFG{ LimitUpLoadData }>1000?int $CFG{ LimitUpLoadData }/1000:1). qq/<\/B> KB までです。(最大解像度 : $CFG{ LimitImageWidth } x $CFG{ LimitImageHeight } )/} elsif('POST_UPLOADEXEINFO' eq $s){$r[0]='画像ファイルには '.(join '・',(map uc $_,split ',',$SYS{ CAPTOR_FORMAT })).' が使用できます。'} elsif('POST_PASSWORDINFO' eq $s){$r[0]=qq/パスワードは半角英数で8文字まで有効です。/} elsif('CHECK_MULTIPLEPOST' eq $s){$r[0]='投稿エラー!';$r[1]='連続投稿です!
投稿は拒否されました。
もう一度よくお確かめ下さい。'}
elsif('CHECK_TITLE' eq $s) {$r[0]='タイトルの記述がありません!'}
elsif('CHECK_NAME' eq $s) {$r[0]='名前の記述がありません!'}
elsif('CHECK_MAIL' eq $s) {$r[0]='メールの記述がありません!'}
elsif('CHECK_URL' eq $s) {$r[0]='URLの記述がありません!'}
elsif('CHECK_PASSWORD' eq $s) {$r[0]='パスワードの記述がありません!'}
elsif('CHECK_MESSAGE' eq $s) {$r[0]='メッセージの記述がありません!'}
elsif('CHECK_TITLEOVER' eq $s) {$r[0]='タイトルの文字数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitTitle }"}
elsif('CHECK_NAMEOVER' eq $s) {$r[0]='名前の文字数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitName }"}
elsif('CHECK_MAILOVER' eq $s) {$r[0]='メールの文字数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitMail }"}
elsif('CHECK_URLOVER' eq $s) {$r[0]='URLの文字数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitUrl }"}
elsif('CHECK_MESSAGEOVER' eq $s){$r[0]='メッセージの文字数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitMessage }"}
elsif('CHECK_MAILFORMAT' eq $s){$r[0]='メールの入力内容が正しくありません!'}
elsif('CHECK_MESSAGELINEOVER' eq $s){$r[0]='メッセージの行数が多すぎます!'." 現在値 $arg[0]\/制限値 $CFG{ LimitLine }"}
elsif('CHECK_UPCOMMENTONLY' eq $s){$r[0]='コメントのみの投稿はできません! 必ず画像も投稿して下さい'}
elsif('CHECK_UPDATASIZEOVER' eq $s){$r[0]='アップロードデータサイズが制限値を超えました。
'.$arg[0].'byte 以下のデータサイズにして下さい。
現在値:'.$arg[1].' byte'}
elsif('CHECK_UPPIXELSIZEOVER' eq $s){$r[0]='画像サイズが大きすぎます。
'. $CFG{ LimitImageWidth }.'x'.$CFG{ LimitImageHeight }.'ピクセル以下の画像をアップロードして下さい。
現在値 '.$arg[0].'x'.$arg[1]}
elsif('CHECK_TAG' eq $s){$r[0]='タグが閉じられていません!
'.$arg[0].'
タグは閉じる必要があります。'}
elsif('CHECK_TAGPOINT' eq $s){$r[0]='個所'}
elsif('CHECK_POSTERROR' eq $s){$r[0]='投稿エラー!';$r[1]="
| $arg[0] |
もう一度よくお確かめ下さい。"}
elsif('LAYERFORM_TEXT' eq $s){@r=('閉じる',' 【','】 ','へ返信')}
elsif('PAINT_ERR_IMAGESIZE' eq $s){$r[0]='エラー!!'."\n".'画像の受信データサイズが制限値を超えました。'."\n".'SEND : '.$arg[0].' byte / MAX : '.$arg[1].' byte'}
elsif('PAINT_ERR_IMAGEPIXELSIZE' eq $s){$r[0]='エラー!!'."\n".'画像サイズが制限値を超えました。'."\n SEND : $arg[0]x$arg[1] / MAX : $arg[2]x$arg[3]"}
elsif('PAINT_ERR_ANIMESIZE' eq $s){$r[0]='エラー!!'."\n".'アニメデータの受信データサイズが制限値を超えました。'."\n".'SEND : '.$arg[0].' byte / MAX : '.$arg[1].' byte'}
elsif('PAINT_ERR_THUMBSIZE' eq $s){$r[0]='エラー!!'."\n".'サムネイル画像の受信データサイズが制限値を超えました。'."\n".'SEND : '.$arg[0].' byte / MAX : '.$arg[1].' byte'}
elsif('UNKNOWN_FORMAT' eq $s){$r[0]='不明なファイル形式がアップロードされました。
対応している形式のみアップロードして下さい。'}
elsif('SYS_LOCKED' eq $s){$r[0]='エラー!!';$r[1]='只今他の方が書き込み中です';$r[2]='しばらく待ってから再度投稿を行って下さい。'}
elsif('BAD_REQUIRE' eq $s){$r[0]='呼び出しエラー';$r[1]='指定されたファイル('.$arg[0].')は呼び出すことができませんでした。'}
elsif('BAD_WRITE' eq $s){$r[0]='エラー!!';$r[1]="ファイル($arg[0])".'に書き込みできませんでした。'}
elsif('BAD_REQUEST' eq $s){$r[0]='エラー!!';$r[1]='不正なリクエストが送信されました。'}
elsif('LOGIN_TEXT' eq $s){@r=('ログイン','パスワードを入力して下さい。')}
elsif('RECOVER_TEXT' eq $s){@r=('システム修復','システムは修復されました','データディレクトリを解析中です...','システムインデックスを復元しています','作業ディレクトリを削除しています...')}
elsif('FILERECOVER_TEXT' eq $s){@r=( 'ファイルより復帰', 'システムインデックスファイル:','送信','ローカルに保存されたシステムインデックスファイルをアップロードして下さい。',
'アップロードされたファイルは破損または改変により使用できません
正常なファイルをアップロードし直してください')}
elsif('ADMIN_TEXT' eq $s){my $d = $SYS{USER_BROWSER}eq'NN'?'inline':'none';
@r=('管理メニュー','自動ログインしました','管理コマンド',
'通常削除モード','一括削除モード','投稿削除','番号',
'複数の投稿を一括で削除できるモードにします。',
'通常削除モードに戻ります。',
'削除するメッセージをチェック、または番号を指定して下さい。',
'最新情報に更新','「'.($CFG{ IndexFilePath }=~/([\w\.]+)$/?$1:'').'」を最新の情報に書き換えします。',
'システム修復','バックアップ','ファイルより復帰する',
'
