#!/usr/local/bin/perl
#↑perlのパスを自分の環境に合わせて書き直します。
#大抵は、「#!/usr/bin/perl」 か 「#!/usr/local/bin/perl」です。
#解らない場合はサーバー管理者(もしくはプロバイダー)に
#確認してください。
require './jcode.pl';
$ver="2.00";
#####################################################################
# Web-Memo [メモ帳] (1999/12/02)
# (C) 1999-2001 by yomi
# Eメール: yomi@pekori.to
# ホームページ: http://yomi.pekori.to/
#####################################################################
$log[0]=$log_pre[0]=""; #編集不要
## ---[注意事項]------------------------------------------------------------+
## 1. このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に
## 対して作者は一切の責任を負いません。
## 2. 設置に関する質問は掲示板にお願いいたします。メールによる質問には
## お答えできません。
## -------------------------------------------------------------------------+
#------------------↓ここから設定↓---------------------#
#暗号化されたパスワード
#※「passmake.cgi」で生成した文字列を入れてください
#※実際の認証時には生成時に設定したパスワードです
#※普段使用しているパスワードは使わないでください
$Epwd = 'dkeHwQkUo.oX.';
#crypt関数を(使用する=1/使用しない=0)
#※「passmake.cgi」で暗号化したパスワードを生成できない場合のみ「0」を選択
#その場合には上の「暗号化されたパスワード」に使用するパスワードをそのまま
#入れてください
$Ecrypt="1";
#スクリプト名(パーミッションは755)
$script = 'memo.cgi';
#ログファイルの名前又はパス(拡張子が「.txt」のファイルのみ使用できます)
#※複数設置したい場合には例にならって増やしてください。
#新しいログファイルを作成する場合には中身が空のファイルを作ってください。
$log[1]="memo.txt";
$log[2]="memo2.txt";
$log[3]="";
#過去ログファイルの名前又はパス(拡張子が「.txt」のファイルのみ使用できます)
#※複数設置したい場合には例にならって増やしてください。
#新しいログファイルを作成する場合には中身が空のファイルを作ってください。
#※上記のファイルとそれぞれ「現在のログ」と「過去のログ」という形で一対一で対応しています。
$log_pre[1]="memo_log.txt";
$log_pre[2]="memo2_log.txt";
$log_pre[3]="";
#戻るURL
$Ehome = 'index.shtml';
#Location(使用可能=1/使用不可=0)
$Elocation = "1";
#更新履歴画面の保存件数
$Ekensu = "3";
#過去データの1ページの表示件数
$Eclog = "10";
#壁紙URL
$Ebackgif = "";
#文字の色
$Etext_co = "#737373";
#訪問前リンクの色(LINK)
$Eplink_co = " #6666CC";
#訪問後リンクの色(VLINK)
$Evlink_co = "#9999FF";
#訪問中リンクの色(ALINK)
$Ealink_co = "#FF6699";
#背景の色
$Ebackcolor = "#FFFFEE";
#テーブル内の背景色
$Eco1="#CCCCFF";
#テーブル内の背景色2
$Eco2="#99CCFF";
#------------------↑ここまで設定↑---------------------#
##########################################
#目次
#(1)書き込み処理(&write_log)
#(2)過去の更新履歴表示(&read_log)
#(3)目次の作成(&mokuji)
#(4)自動的にリンクを貼る(&auto_link)
#(5)管理モード(&kanri)
#(6)修正処理実行(&act_kanri)
##########################################
if($Ecrypt){$Ecrypt="on";}
else{$Ecrypt="off";}
# 日時の取得
$ENV{'TZ'} = "JST-9";
$times = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times);
$year = 1900 + $year;
$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
$mon++;
if ($mon < 10) { $mon = "0$mon"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($min < 10) { $min = "0$min"; }
# 日時のフォーマット
$DATE_NOW = "$year/$mon/$mday"; #現在の日時
$DATE_NOW_TIME = "$year/$mon/$mday($youbi) $hour:$min"; #現在の日時・時刻
&form_decode("1","1");
#各モードへ分岐
#-----------------#
if($mode eq "write_log"){&write_log;}
elsif($mode eq "read_log"){&read_log;}
elsif($mode eq "kanri"){&kanri;}
elsif($mode eq "act_kanri"){&act_kanri;}
else{&read_log;}
#-----------------#
exit;
#(1)書き込み処理(&write_log)
sub write_log{
&pass("$FORM{'pass'}","$Epwd",$Ecrypt);
if(&jg($log[$FORM{'log'}])){&mes("拡張子が「.txt」以外のファイルには書き込めません","拡張子エラー","java");}
if(&jg($log_pre[$FORM{'log'}])){&mes("拡張子が「.txt」以外のファイルには書き込めません","拡張子エラー","java");}
$FORM{'kousin'} =~ s/\r//g;
$kousinnokazu=@kousin=split(/\n/,$FORM{'kousin'});
$i=0; $Tline="";
foreach $kousin(@kousin){ #@linesに日にちごとに格納
if(!$i && $kousin =~ /^(\d+)\/(\d+):/){ $i=1; $Tline.="$kousin
";}
elsif($i && $kousin =~ /^(\d+)\/(\d+):/){push(@lines,$Tline); $Tline=""; $Tline.="$kousin
";}
else{$Tline.="$kousin
";}
}
push(@lines,$Tline);
open(OUT,">$log[$FORM{'log'}]") || &mes("「$log[$FORM{'log'}]」に書き込みできません。パーミッションが正しく設定されているか確認してみてください。","書き込みエラー","java");
$i=1;
foreach $kousin(@lines){
if($i<=$Ekensu){
$kousin =~ s/
/\n/g;
print OUT "$kousin";
}
else{push(@new,"$kousin\n");}
$i++;
}
close(OUT);
open(IN,"$log_pre[$FORM{'log'}]");
while(){
push(@new,$_);
}
close(IN);
open(OUT,">$log_pre[$FORM{'log'}]") || &mes("「$log_pre[$FORM{'log'}]」に書き込みできません。パーミッションが正しく設定されているか確認してみてください。","書き込みエラー","java");
print OUT @new;
close(OUT);
&location($FORM{'back'});
}
#(2)過去の更新履歴表示(&read_log)
sub read_log{
$i2=1;
open(IN,"$log_pre[$FORM{'log'}]");
while(){$i2++;}
close(IN);
$PRmokuji=&mokuji("$Eclog","3","read_log","$FORM{'page'}","$i2");
&html_head("過去の更新履歴"); #ヘッダ出力 #\\
print "ホーム > ";
&table_head("過去の更新履歴","left"); #テーブルヘッダを表示
print "
";
print "";
print "$PRmokuji
";
if(!$FORM{'page'}){$FORM{'page'}=1;}
$Cend=($FORM{'page'}*$Eclog)+1;
$Cstr=$Cend-$Eclog;
open(IN,"$log_pre[$FORM{'log'}]");
$i2=1;
while(){
$log_line=$_;
&auto_link($log_line);
if($Cstr<=$i2 && $i2<$Cend){
if($i==2){$i=1;$Tco=$Eco2;}
else{$i=2;$Tco=$Eco1;}
print<<"EOM";
EOM
}
$i2++;
}
close(IN);
print $PRmokuji;
print "";
print<<"EOM";
EOM
&html_foot;
}
#(3)目次の作成(&mokuji)
sub mokuji {
$T1=$_[0]; #1ページの表示数
$T2=$_[1]; #目次の種類([/1/2/]のみ=1/[次のXX件→]のみ=2/両方=3)
$T3=$_[2]; #モード選択([例 kt,m1,m2,new...])
$T4=$_[3]; #現在のページNO.
if(!$T4){$T4=1;}
$T5=$_[4]; #登録総数
$T6="";
$T8=$T4-1;
$T9=$T4+1;
$T10=$T5 - ($T4*$T1)+1;
$T10=$T10-2;
if($T5>$T1){
if($T2!=1){
if($T4!=1){$T6 .= " [←前の$T1件]";}
if($T4!=int($T5 / $T1)+1 && $T10 >= $T1){$T6 .= " [次の$T1件→]";}
elsif($T4!=int($T5 / $T1)+1){
if($T10>0){$T6 .= " [次の$T10件→]";}
}
}
if($T2!=2){
$T6 .= " [/";
if(($T5 % $T1)==1 || ($T5 % $T1)==0){$Ti=int($T5 / $T1);}
else{$Ti=int($T5 / $T1)+1;}
foreach $T7(1 .. $Ti){
# foreach $T7(1 .. int($T5 / $T1)){
if($T7==$T4){$T6 .= " $T7 /";}
else{$T6 .= " $T7 /";}
}
$T6 .= "]";
}
}
if($T10 < -($T1)){$T6="";}
return $T6;
}
#(4)自動的にリンクを貼る(&auto_link)
sub auto_link {
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g;
}
#(5)管理モード(&kanri)
sub kanri{
&pass("$FORM{'pass'}","$Epwd",$Ecrypt);
&html_head("更新履歴の修正(管理モード)"); #ヘッダ出力 #\\
print "ホーム > ";
&table_head("更新履歴の修正(管理モード)","left"); #テーブルヘッダを表示
print "
";
print "";
if(!$FORM{'page'}){$FORM{'page'}=1;}
$Cend=($FORM{'page'}*$Eclog)+1;
$Cstr=$Cend-$Eclog;
open(IN,"$log_pre[$FORM{'log'}]");
$i2=1; $T1=1;
while(){
$log_line=$_;
&auto_link($log_line);
if($Cstr<=$i2 && $i2<$Cend){
if($i==2){$i=1;$Tco="#99CCFF";}
else{$i=2;$Tco="#CCCCFF";}
$log_line =~ s/\n//g;
$log_line =~ s/
/\n/g;
$log_line =~ s/\r//g;
print<<"EOM";
EOM
}
$i2++; $T1++;
}
close(IN);
print &mokuji("$Eclog","3","read_log","$FORM{'page'}","$i2");
print "";
&html_foot;
}
#(6)修正処理実行(&act_kanri)
sub act_kanri{
&pass("$FORM{'pass'}","$Epwd",$Ecrypt);
if(&jg($log[$FORM{'log'}])){&mes("拡張子が「.txt」以外のファイルには書き込めません","拡張子エラー","java");}
if(&jg($log_pre[$FORM{'log'}])){&mes("拡張子が「.txt」以外のファイルには書き込めません","拡張子エラー","java");}
##削除処理
if($FORM{'set'} eq "削除"){
if($FORM{'check'}!=1){&mes("削除確認のチェックがしてありません
削除ボタンの右のチェックを付けてから削除してください","エラー","java");}
open(IN,"$log_pre[$FORM{'log'}]");
$T1=1;
while(){
if($T1!=$FORM{'no'}){push(@new,$_);}
$T1++;
}
close(IN);
open(OUT,">$log_pre[$FORM{'log'}]") || &mes("「$log_pre[$FORM{'log'}]」に書き込みできません。パーミッションが正しく設定されているか確認してみてください。","書き込みエラー","java");
print OUT @new;
close(OUT);
&mes("データの削除が完了しました","削除完了","$script");
}
##更新処理
else{
$FORM{'Flog'} =~ s/\n/
/g;
$FORM{'Flog'} =~ s/\r//g;
#$FORM{'Flog'} =~ s/>/>/g;
#$FORM{'Flog'} =~ s/</){
if($T1!=$FORM{'no'}){push(@new,$_);}
else{push(@new,"$FORM{'Flog'}\n");}
$T1++;
}
close(IN);
open(OUT,">$log_pre[$FORM{'log'}]") || &mes("「$log_pre[$FORM{'log'}]」に書き込みできません。パーミッションが正しく設定されているか確認してみてください。","書き込みエラー","java");
print OUT @new;
close(OUT);
&mes("データの修正が完了しました","修正完了","$script");
}
}
#######################################################################
# 【 yomi_pl_wm.cgi (基本処理) 】
#######################################################################
#(1)ディレクトリロック(&lock)
#(2)ディレクトリロック解除(&unlock)
#(3)HTMLのヘッダを出力(&html_head)
#(4)HTMLのフッタを出力(&html_foot)
#(5)パスワード認証(&pass)
#(6)メッセージ画面出力(&mes)
#(7)フォームデータのデコード(&form_decode)
#(8)テーブルヘッダ表示(&table_head)
#(9)管理室用メニュー出力(&kanri_menu)
#(10)クッキーの書き込み(&set_cookie)
#(10.1)クッキーの読み込み(&get_cookie)
#(11)Location 処理(&location)
#(1)ディレクトリロック(&lock)
#書式:&lock($arg1,$arg2);
#機能:ディレクトリロックをする
#引数:$arg1=>ロック用のディレクトリパス(省略時は$Elock_dirが入る)
# $arg2=>古いロックファイルを強制削除するまでの時間(省略時は「3」が入る)
# (分指定で強制削除しない場合は「0」とする)
sub lock{
if(!$_[0]){$LOCK_DIR=$Elock_dir;}
else{$LOCK_DIR = $_[0];}
if(!$_[1]){$LOCK2=3;}
else{$LOCK2=$_[1];}
($PRE_TIME) = (stat($LOCK_DIR))[9];
$TIME_FLAG = time() - $PRE_TIME;
$i=1;
while(1){
if (mkdir("$LOCK_DIR", 0755)) { $RET=1; last; } #ロック成功
if ($i==1) {if($TIME_FLAG > $LOCK2 * 60){rmdir($LOCK_DIR);}} #ロックの強制解除
elsif ($i < 6) { sleep(1); }
else { $RET=0; last; } #ロック失敗
$i++;
}
if(!$RET){
&mes("タイムアウトエラーです。
もう一度「戻る」ボタンで戻ってからやり直してください。","タイムアウトエラー","java");
}
}
#(2)ディレクトリロック解除(&unlock)
#書式:&unlock($arg1);
#機能:ディレクトリロックを解除する
#引数:$arg1=>ロック用のディレクトリパス(省略時は$Elock_dirが入る)
#戻り値:なし
sub unlock{
if(!$_[0]){$LOCK_DIR=$Elock_dir;}
else{$LOCK_DIR = $_[0];}
rmdir($LOCK_DIR);
}
#(3)HTMLのヘッダを出力(&html_head)
#書式:&html_head($arg1);
#機能:HTMLのヘッダ部分を出力する
#引数:$arg1=>ページのタイトル
# $arg2=>Content-typeを(出力しない=no/する=省略)
#※BODY属性は「$Eback_env」に依存
sub html_head{
$T_con=$_[1];
if($_[0]){$HTML_HEAD=$_[0];}
else{$HTML_HEAD="タイトル";}
if($Ebackgif){$HTML_HEAD_xx=" background=\"$Ebackgif\"";}
else{$HTML_HEAD_xx="";}
$Eback_env = "$HTML_HEAD_xx bgcolor=\"$Ebackcolor\" text=\"$Etext_co\" LINK=\"$Eplink_co\" VLINK=\"$Evlink_co\" ALINK=\"$Ealink_co\"";
if($T_con ne "no"){print "Content-type: text/html\n\n";}
print <<"EOM";
EOM
if(!$Ehc){print"\n";}
print<<"EOM";
$HTML_HEAD
EOM
}
#(4)HTMLのフッタを出力(&html_foot)
#書式:&html_foot;
#機能:HTMLのフッタ部分を出力する
#引数:なし
#戻り値:なし
sub html_foot{
&cr;
print "";
}
#(5)パスワード認証(&pass)
#書式:&pass($arg1,$arg2,$arg3);
#機能:パスワードを認証する
#引数:$arg1=>入力するパスワード
# $arg2=>認証側のパスワード(crypt関数処理済)
# $arg3=>crypt関数を(使用する=on/使用しない=off)(省略時は「on」)
sub pass{
$PASS1=$_[0]; $PASS2=$_[1];
if(!$_[2]){$PASS3="on";}
else{$PASS3=$_[2];}
if($PASS3 eq "on"){
if (crypt($PASS1,$PASS2) ne $PASS2) {$RET=0;}
else{$RET=1;}
}
else{
if($PASS1 ne $PASS2){$RET=0;}
else{$RET=1;}
}
if(!$RET){&mes("パスワード認証に失敗しました","パスワード認証エラー(\&pass)","java");}
}
#(6)メッセージ画面出力(&mes)
#書式:&mes($arg1,$arg2,$arg3);
#機能:メッセージ画面を出力する
#引数:$arg1=>表示するメッセージ
# $arg2=>ページのタイトル(省略時は「メッセージ画面」)
# $arg3=>・JavaScriptによる「戻る」ボタン表示=java
# ・$ENV{'HTTP_REFERER'}を使う場合=env
# ・管理室へのボタン=kanri
# ・通常のURL又はパスを指定する場合にはそのURL又はパスを記入
# ・省略時は非表示
# $arg4=>ロック解除=unlock
#戻り値:なし
sub mes{
$Munlock=$_[3];
if($Munlock eq "unlock"){&unlock();}
$MES=$_[0];
if($_[1]){$TITLE=$_[1];}
else{$TITLE="メッセージ画面";}
if($_[2] eq "java"){
$BACK_URL=""
}
elsif($_[2] eq "env"){
$BACK_URL="【戻る】";
}
elsif($_[2] eq "kanri"){
$BACK_URL=""
}
elsif(!$_[2]){$BACK_URL="";}
else{$BACK_URL="【戻る】";}
&html_head($TITLE);
print <<"EOM";
$MES
EOM
if($BACK_URL){print "$BACK_URL ";}
print <<"EOM";
|
EOM
&html_foot;
exit;
}
#(7)フォームデータのデコード(&form_decode)
#書式:&form_decode($arg1,$arg2);
#機能:フォームデータをデコードする
#引数:$arg1=>「>」と「<」を(無効にする(省略時)=0/有効にする=1)
# $arg2=>「\n」と「\r」を(無効にする(省略時)=0/有効にする=1)
#戻り値:なし
sub form_decode{
$arg1=$_[0];
$arg2=$_[1];
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); }
else { $form = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$form);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if(!$arg1){
$value =~ s/>/>/g;
$value =~ s/</g;
}
if(!$arg2){
$value =~ s/\n//g;
$value =~ s/\r//g;
}
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis'); $FORM{$name} = $value;
}
$mode = $FORM{'mode'};
$mode2 = $FORM{'mode2'};
}
#(8)テーブルヘッダ表示(&table_head)
sub table_head{
if(!$_[0]){$TABLE_TITLE="タイトル";}
else{$TABLE_TITLE=$_[0];}
if($_[1]){$TABLE_HEAD2=" align=left";}
else{$TABLE_HEAD2="";}
$T_add=$_[2];
print <<"EOM";
EOM
if(!$Eadd_above_mode && $T_add ne "no_add"){print "$Eadd_data_above";}
}
#(9)管理室用メニュー出力(&kanri_menu)
sub kanri_menu{
if(!$Eregist_mode){
$Ctemp=0;
open(IN,"$Etemp_logfile");
while(){
$Ctemp++;
}
close(IN);
$PRtemp="
EOM
}
#著作権表示(削除・変更をしないでください。ただし、中寄せ・左寄せは可)
sub cr{
print "";
}
#(10)クッキーの書き込み(&set_cookie)
sub set_cookie{
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg)
= gmtime(time + 60*24*60*60);
$yearg += 1900;
if ($secg < 10) { $secg = "0$secg"; }
if ($ming < 10) { $ming = "0$ming"; }
if ($hourg < 10) { $hourg = "0$hourg"; }
if ($mdayg < 10) { $mdayg = "0$mdayg"; }
$month = ('Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec') [$mong];
$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wdayg];
$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
print "Set-Cookie: ysp=$CK_pass:$CK_change:$CKt:$CKflag; expires=$date_gmt\n";
}
#(10.1)クッキーの読み込み(&get_cookie)
sub get_cookie{
@pairs=split(/\;/,$ENV{'HTTP_COOKIE'});
foreach $pair(@pairs) {
local($name,$value) = split(/=/,$pair);
$name =~ s/ //g;
$CK{$name} = $value;
}
($CK_pass,$CK_change,$CKt,$CKflag)=split(/:/,$CK{'ysp'});
}
#(11)Location 処理(&location)
sub location {
$T_location=$_[0];
if($Elocation){print "Location: $T_location\n\n";}
else{
print "Content-type: text/html\n\n";
print <<"EOM";
EOM
&html_foot;
}
}
#(12)ファイルの拡張子を判別
#「.txt」以外は0を返す
sub jg{
@jg=(); $jg_fl=1;
@jg=split(/\./,$_[0]);
if($jg[$#jg] eq "txt" || $jg[$#jg] eq "TXT"){$jg_fl=0;}
else{$jg_fl=1;}
return $jg_fl;
}