#!/usr/local/bin/perl5 ## ---------------------------------------------------------------------------- ## G-LIGHT v4.4 ## by KENT (99/06/12) ## E-MAIL kent@lemon.ne.jp ## HomePage http://www.lemon.ne.jp/~kent/ $| = 1; $ver = 'G-LIGHT v4.4'; # バージョン情報(修正不要) ## -----[注意事項ほか]---------------------------------------------------------- ## ・このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に ## 対して作者は一切の責任を負いません。 ## ・設置に関する質問はサポート掲示板にお願いいたします。メールによる質問には ## お答えできません。 ## ----------------------------------------------------------------------------- require './jcode.pl'; # jcode.plが同一ディレクトリにある場合 ## 基本設定 $pass = '1022'; # 管理用パスワード $subject = 1; # 「題名」欄の有無 (0=no 1=yes) $counter = 1; # ミニカウンタの有無 (0=no 1=テキスト 2=GIF画像) $mini_fig = 7; # ミニカウンタの桁数 $cnt_color = "#DD0000"; # テキストのとき:ミニカウンタの色 $gif_url = "."; # GIFのとき :画像までのディレクトリ $mini_w = 8; # 〃  :画像の横サイズ $mini_h = 12; # 〃  :画像の縦サイズ $cntfile = './count.dat'; # カウンタファイル $tagkey = 0; # タグの許可(0=no 1=yes) $script = './glight2.cgi'; # スクリプトファイル名 $logfile = './glight.log'; # ログファイル名 $method = 'POST'; # methodの形式(POST or GET) $pagelog = 20; # 1ページ当たりの記事表示数 $lockkey = 0; # ファイルロック処理 (0=no 1=symlink 2=open) $lockfile = 'glight.lock'; # ロックファイル名 $lock_dir = "."; # ロックファイルのディレクトリ $wrap = 'soft'; # 投稿ファーム内の改行形式 (soft=改行なし hard=強制) $autolink = 1; # URLの自動リンク (0=no 1=yes) $mailing = 0; # 自動メール通知の有無 (0=no 1=yes) $sendmail = '/usr/lib/sendmail'; # sendmailパス(メール通知する時) $mail_me = 0; # 自分の記事もメールする (0=no 1=yes) ## ---- <過去ログ> -------------------- # $pastkey = 0; # 過去ログ機能 (0=no 1=yes) $pastno = "./pastno.dat"; # 過去ログ用NOファイル $log_line = 150; # 過去ログ1ファイル当たりの行数 $past_dir = "."; # 過去ログディレクトリ(フルパスだと / から) $past_url = "."; # 過去ログディレクトリのURL(絶対パスだと http:// から) ## --- <画像関連> --------------------- # $img_url = "."; # キャラクタGIF画像のディレクトリを指定 # キャラクタを指定(上下の配列はペアで) @GFILE = ('boy1.gif','boy2.gif','fanta_icon/boy2.gif','fanta_icon/seinen.gif','girl1.gif','girl2.gif','fanta_icon/girl2.gif','fanta_icon/ol1.gif','fanta_icon/ol2.gif','fanta_icon/ol3.gif','heisi1.gif','heisi2.gif','majo.gif','king.gif','ani1.gif','ani2.gif','admin1.gif','admin2.gif','admin3.gif','admin4.gif','fanta_icon/cook.gif','fanta_icon/china.gif'); @CHARA = ('少年1','少年2','少年3','少年4','少女1','少女2','少女3','女性1','女性2','女性3','兵士1','兵士2','魔女','王様','動物1','動物2','かめ','うさぎ','くま','ねこ','コック','中国人'); # 地域名 @areas = ('名古屋大学','金城大学','椙山大学','北海道','東北','関東','甲信越','東海','北陸','近畿','中国','四国','九州','外国','地球外'); # 管理者キャラクタを指定(上下の配列はペアで) @ADMIN_GFILE = ('admin1.gif','admin2.gif','admin3.gif','admin4.gif','king.gif'); @ADMIN_CHARA = ('かめ','うさぎ','くま','ねこ','王様'); ## 設定ここまで ## ロックファイルを定義 $lockfile = "$lock_dir\/$lockfile"; ## --- G-LIGHT のメイン処理 &form_decode; if ($mode eq "usr_del") { &usr_del; } elsif ($mode eq "regist") { ®ist; } elsif ($mode eq "find") { &find; } elsif ($mode eq 'past') { &past; } elsif ($mode eq 'edit') { &edit; } elsif ($mode eq 'edit_msg') { &edit_msg; } elsif ($mode eq 'delete') { &delete; } elsif ($mode eq 'del_msg') { &del_msg; } elsif ($mode eq 'env') { &env; } elsif ($mode eq 'env_init') { &env_init; } elsif ($mode eq "enter") { &enter; } elsif ($mode eq "image") { ℑ } &html_log; ## --- HTMLのヘッダー sub header{ print "Content-type: text/html\n\n"; print "\n\n"; print "\n"; print "$title\n"; if (!$bgc) { print "\n"; } elsif ($bgr) { print "\n"; } else { print "\n"; } print "\n"; } ## --- 記事表示部 sub html_log { &get_cookie; $agent = $ENV{'HTTP_USER_AGENT'}; # MSIE3 の場合フォームの長さを調整 if ($agent =~ /MSIE 3/i) { $nam_wid = 30; $com_wid = 65; $url_wid = 48; $sub_wid = 40; # MSIE4 の場合フォームの長さを調整 } elsif ($agent =~ /MSIE 4/i) { $nam_wid = 30; $com_wid = 65; $url_wid = 75; $sub_wid = 40; } else { $nam_wid = 20; $com_wid = 55; $url_wid = 45; $sub_wid = 30; } # ログを読みこみ &open_log2; # 環境設定部を認識 ($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text, $link,$vlink,$alink,$home,$max,$sbj_color,$mailto, $manager,$man_color) = split(/<>/, $init); # ログチェック unless ($init =~ /^GLIGHT/) { &log_err; } &header; # カウンタ処理 if ($counter) { &counter; } print "
\n"; print "\n"; print "$title
\n"; print "[トップにもどる]\n"; print "[ワード検索]\n"; if ($pastkey) { print "[過去ログ]\n"; } print "[管理用]\n"; print "
\n"; print "
\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; # 題名部 if ($subject) { print "\n"; print "\n"; } print "\n"; print "\n"; print "
おなまえ
Eメール
タイトル
URL
居住地\n"; print " あなたのイメージ [画像イメージ参照]
メッセージ

  削除キー (記事削除時に使用)

1. お名前とメッセージ欄は必須です。
2. 記事は最大$max件まででそれを超えると古い記事から削除されます。
3. 削除キーは英数字で8文字以内で指定して下さい。


HTML if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } # 記事数を取得 $end_data = @lines - 1; $page_end = $page + ($pagelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } foreach ($page .. $page_end) { ($no,$date,$name,$email,$local,$icon,$ad_ico, $com,$res,$url,$host,$pw,$sub) = split(/<>/,$lines[$_]); # 自動URLリンク if ($autolink) { &auto_link($com); &auto_link($res); } # Eメールをリンク if ($email) { $name="$name"; } print "\n"; print "\n"; } else { print "$name\n"; print "\n"; } if ($url) { print "\n"; } print "
[$no] \n"; if ($subject == 1) { if ($sub eq "") { $sub = "no title"; } print "$sub投稿者:$name\n"; print "[$local] 投稿日:$date[$local] $date"; print "
\n"; print "\n"; print "
$com
\n"; if ($res) { print "\n"; print "\n"; print "
$res
\n"; print "[From $manager]\n"; print "
\n"; } print "
\n"; } # 改頁処理 print "\n"; $next_line = $page_end + 1; if ($page_end ne $end_data) { print "\n"; } # 削除フォーム print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "以下のフォームから自分の投稿記事を削除できます
\n"; print "■記事No\n"; print "■削除キー\n"; print "\n"; print "
\n"; ## 著作権を表示(削除禁止) print "
\n"; print "- G-LIGHT -\n"; print "
\n"; print "\n"; exit; } ## --- ログ書き込み処理 sub regist { # フォームチェック if ($FORM{'name'} eq "") { &error("名前が入力されていません。",'NOLOCK'); } if ($FORM{'comment'} eq "") { &error("コメントが入力されていません。",'NOLOCK'); } # クッキーをブラウザに格納 &set_cookie; # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログを開く &open_log1; unless ($init =~ /^GLIGHT/) { &log_err; } # 設定を認識 ($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text,$link, $vlink,$alink,$home,$max,$sbj_color,$mailto, $manager,$man_color) = split(/<>/, $init); # 二重投稿の禁止 ($knum,$kda,$kname,$kem,$klo,$ki,$kad,$kcom) = split(/<>/, $lines[0]); if ($name eq $kname && $comment eq $kcom) { &error("二重投稿は禁止です"); } ## 過去ログを取得する場合 if ($pastkey && $#lines >= $max-1) { &pastlog; } # 記事Noカウント及び最大記事数超を切り捨て $number = $knum + 1; if ($#lines >= $max-1) { splice(@lines,$max-1); } # 削除キーを暗号化 if ($pwd) { &pass_ango("$pwd"); } # ホスト名及び時間を取得 &get_host; &get_time; # ログをフォーマット unshift(@lines,"$number<>$date<>$name<>$email<>$area<>$icon<><>$comment<><>$url<>$host<>$ango<>$subj<>\n"); unshift(@lines,$init); # ログを更新 open(OUT,">$logfile") || &error("Can't write $logfile"); print OUT @lines; close(OUT); # ロック解除 if (-e $lockfile) { unlink($lockfile); } # メール処理 if ($mailto && $mail_me) { &mail_to; } elsif ($mailto && $mail_me == 0 && $email ne "$mailto") { &mail_to; } # 記事表示部に戻る &html_log; } ## --- フォームからのデータ処理 sub form_decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。",'NOLOCK'); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コード変換 &jcode'convert(*value,'sjis'); # タグ処理 if ($tagkey == 0) { $value =~ s/\"/"/g; $value =~ s//>/g; } else { $value =~ s///g; $value =~ s/<>/<>/g; } # 削除情報 if ($name eq 'del') { push(@dels,$value); } $FORM{$name} = $value; } $name = $FORM{'name'}; $comment = $FORM{'comment'}; $comment =~ s/\r\n/
/g; $comment =~ s/\r|\n/
/g; $FORM{'res_msg'} =~ s/\r\n/
/g; $FORM{'res_msg'} =~ s/\r|\n/
/g; $email = $FORM{'email'}; $url = $FORM{'url'}; $url =~ s/^http\:\/\///; $mode = $FORM{'mode'}; $area = $FORM{'area'}; $icon = $FORM{'icon'}; $pwd = $FORM{'pwd'}; $com = $FORM{'com'}; $com =~ s/\r\n/
/g; $com =~ s/\r|\n/
/g; $res = $FORM{'res'}; $res =~ s/\r\n/
/g; $res =~ s/\r|\n/
/g; $subj = $FORM{'subj'}; } ## --- 日時の取得 sub get_time { $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $year = 1900 + $year; $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"; } $week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; # 日時のフォーマット $date = "$year/$mon/$mday($week) $hour\:$min"; } ## --- エラー表示処理 sub error { if ($_[1] ne '0') { &header; } if (-e $lockfile && $_[1] eq "") { unlink($lockfile); } print "

ERROR !

\n"; print "

$_[0]\n"; print "


\n"; print "\n"; exit; } ## --- 記事削除処理 sub usr_del { if ($FORM{'usr_no'} eq "" || $FORM{'usr_key'} eq "") { &error("削除No又は削除キーが入力されていません。",'NOLOCK'); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログを読み込む &open_log1; @new = (); $no_del = 0; ## 削除キーによる記事削除 ## foreach $line (@lines) { ($number,$date,$name,$email,$local,$icon,$ad_icon,$com, $res,$url,$host,$ango) = split(/<>/,$line); $flag = 0; if ($FORM{'usr_no'} eq "$number") { if ($ango eq "") { $no_del = 1; last; } # パスワード照合 &pass_shogo($FORM{'usr_key'}); if ($check eq "yes") { $flag = 1; } else { $no_del = 2; last; } } if ($flag == 0) { push(@new,$line); } } if ($no_del == 1) { &error("削除キーが設定されていません。"); } elsif ($no_del == 2) { &error("パスワードが違います。"); } unshift(@new,$init); # ログを更新 open(DB,">$logfile") || &error("Can't write $logfile"); print DB @new; close(DB); # ロック解除 if (-e $lockfile) { unlink($lockfile); } # 初期画面にもどる &html_log; } ## --- ワード検索サブルーチン sub find { open(IN,"$logfile") || &error("Can't open $logfile",'NOLOCK'); @lines = ; close(IN); ($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc, $text,$link,$vlink,$alink,$home,$max,$sub_color, $mailto,$manager,$man_color) = split(/<>/, $lines[0]); &header; print <<"EOM"; ▲ BBS
ワード検索

  • 検索したいキーワードを入力し、検索条件を選択し「検索する」を押してください。
  • 複数のキーワードを入力するときは、半角スペースで区切って下さい。 EOM if ($pastkey) { print "
  • 過去ログは新着順に5ファイル毎に区切っています。\n"; } print <<"EOM";

EOM # 過去ログ表示 if ($pastkey) { print "\n"; print "\n"; } else { print "\n"; } print "\n"; print "
キーワード
検索条件 AND OR
検索領域"; print "現行ログ\n"; open(NO,"$pastno") || &error("Can't open $pastno",'NOLOCK'); $no = ; close(NO); $part = $no / 5; $part = int($part+1); $i=0; $j=$part; foreach (1 .. $part) { $i++; if ($i == 3) { print "
"; $i=0; } print "過去ログ$j\n"; $j--; } print "
"; print "
\n"; # ワード検索の実行と結果表示 if ($FORM{'word'} ne "") { # 入力内容を整理 $cond = $FORM{'cond'}; $word = $FORM{'word'}; $word =~ s/ / /g; $word =~ s/\t/ /g; @pairs = split(/ /,$word); # 現行ログのとき if ($FORM{'log'} == 0) { # ファイルを読み込み open(DB,"$logfile") || &error("Can't open $logfile",'NOLOCK'); @lines = ; close(DB); shift(@lines); # 過去ログのとき } else { # 検索領域を定義 $start = 5 * $FORM{'log'} - 4; @lines = (); foreach ($start .. $start+5) { unless(-e "$past_dir\/$_\.html") { last; } open(DB,"$past_dir\/$_\.html"); @temp = ; close(DB); push(@lines,@temp); } } # 検索処理 foreach $line (@lines) { $flag = 0; foreach $pair (@pairs){ if (index($line,$pair) >= 0) { $flag = 1; if ($cond eq 'or') { last; } } else { if ($cond eq 'and') { $flag = 0; last; } } } if ($flag == 1) { push(@new,$line); } } # 検索終了 $count = @new; print "
検索結果:$count件\n"; print "

    \n"; if ($FORM{'log'} == 0) { foreach $line (@new) { ($num,$date,$name,$email,$local,$icon,$ad_ico,$com,$res,$url, $host,$pw,$sub) = split(/<>/,$line); if ($subject && !$sub) { $sub = "no title"; } if ($email) { $name = "$name"; } if ($url) { $url = "http://$url"; } # 結果を表示 print "
  1. [$num] $sub\n"; print "投稿者:$name 投稿日:$date\n"; print "

    $com

    $url


    \n"; } } else { foreach $line (@new) { ($p1,$p2) = split(/<\!--T-->/, $line); print "
  2. $p1 \- $p2\n"; } } } print "
\n"; print "\n"; exit; } ## --- メール送信 sub mail_to { $mail_subj = "$title に投稿がありました。"; &jcode'convert(*mail_subj,'jis'); &jcode'convert(*name,'jis'); &jcode'convert(*comment,'jis'); if ($subj) { &jcode'convert(*subj,'jis'); } $comment =~ s/
/\n/g; $comment =~ s/<//g; if (open(MAIL,"| $sendmail $mailto")) { print MAIL "X-Mailer: GLIGHT MAILER\n"; print MAIL "To: $mailto\n"; # メールアドレスがない場合はダミーメールに置き換え if ($email eq "") { $email = "nomail\@xxx.xxx"; } print MAIL "From: $email\n"; print MAIL "Subject: $mail_subj\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "Content-type: text/plain\n\n"; print MAIL "$mail_subj\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "TIME : $date\n"; print MAIL "HOST : $host\n"; print MAIL "NAME : $name\n"; print MAIL "EMAIL: $email\n"; if ($url) { print MAIL "URL : http://$url\n"; } if ($subj) { print MAIL "TITLE: $subj\n"; } print MAIL "$comment\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } } ## --- クッキーの発行 sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg, $wdayg,$ydayg,$isdstg) = gmtime(time + 90*24*60*60); if ($yearg < 10) { $yearg = "0$yearg"; } 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 = ('Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd\,area\:$area\,icon\:$icon"; print "Set-Cookie: GLIGHT=$cook; expires=$date_gmt\n"; } ## --- クッキーを取得 sub get_cookie { @pairs = split(/;/, $ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/, $DUMMY{'GLIGHT'}); foreach $pair (@pairs) { local($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } $c_name = $COOKIE{'name'}; $c_email= $COOKIE{'email'}; $c_url = $COOKIE{'url'}; $c_pwd = $COOKIE{'pwd'}; $c_area = $COOKIE{'area'}; $c_icon = $COOKIE{'icon'}; if ($FORM{'name'}) { $c_name = $FORM{'name'}; } if ($FORM{'email'}) { $c_email = $FORM{'email'}; } if ($FORM{'url'}) { $c_url = $url; } if ($FORM{'pwd'}) { $c_pwd = $FORM{'pwd'}; } if ($FORM{'area'}) { $c_area = $FORM{'area'}; } if ($FORM{'icon'}) { $c_icon = $FORM{'icon'}; } } ## --- パスワード暗号処理 sub pass_ango { $now = time; ($p1, $p2) = unpack("C2", $now); $wk = $now / (60*60*24*7) + $p1 + $p2 - 8; @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); $nsalt = $saltset[$wk % 64] . $saltset[$now % 64]; $ango = crypt($_[0], $nsalt); } ## --- パスワード照合処理 sub pass_shogo { if ($ango =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応 else { $crptkey = 0; } $check = "no"; if (crypt("$_[0]", substr($ango,$crptkey,2)) eq "$ango") { $check = "yes"; } } ## --- ロックファイル(symlink関数) sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error("LOCK is BUSY"); } sleep(1); } } ## --- ロックファイル(open関数) sub lock2 { $lockflag = 0; foreach (1 .. 5) { unless (-e $lockfile) { open(LOCK,">$lockfile"); close(LOCK); $lockflag = 1; last; } else { sleep(1); } } if ($lockflag == 0) { &error("LOCK is BUSY"); } } ## --- カウンタ処理 sub counter { # カウントファイルを読みこみ open(NO,"$cntfile") || &error("Can't open $cntfile",'0'); $cnt = ; close(NO); # 閲覧時のみカウントアップ if ($FORM{'mode'} eq '') { # カウントアップ $cnt++; # テンポラリーファイルを定義 $prono = "$$"; if ($prono eq "") { srand; $prono = 1000000000000000 * rand; } $cnt_temp = "$lock_dir\/$prono\.tmp"; # テンポラリーファイルを作成 open(TMP,">$cnt_temp") || &error("Can't create tempfile",'0'); print TMP $cnt; close(TMP); # パーミッションを666に chmod (0666,"$cnt_temp"); # リネームする rename($cnt_temp,$cntfile); # もしテンポラリーファイルが残っていたら削除 if (-e $cnt_temp) { unlink($cnt_temp); } } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . "$cnt"; } @cnts = split(//,$cnt); print "
\n"; # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } # テキストカウンタ表示 } else { print "$cnt"; } print "
\n"; } ## --- ホスト名を取得 sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq "" || $host eq "$addr") { ($p1,$p2,$p3,$p4) = split(/\./,$addr); $temp = pack("C4",$p1,$p2,$p3,$p4); $host = gethostbyaddr("$temp", 2); if ($host eq "") { $host = $addr; } } } ## --- 自動リンク sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g; } ## --- 過去ログ生成 sub pastlog { $new_flag = 0; open(NUM,"$pastno") || &error("Can't open $pastno"); $count = ; close(NUM); # 過去ログのファイル名を定義 $pastfile = "$past_dir\/$count\.html"; # 過去ログがない場合、新規に自動生成する unless(-e $pastfile) { &new_log; } if ($new_flag == 0) { open (DB,"$pastfile") || &error("Can't open $pastfile"); @past = ; close(DB); } # 規定の行数をオーバーすると、次ファイルを自動生成する if ($#past > $log_line) { &next_log; } $pst_line = $lines[$max-1]; $pst_line =~ s/\n//g; ($pnum,$pdate,$pname,$pemail,$plocal,$picon,$pad_icon, $pcom,$pres,$purl,$phost,$ppw,$psub) = split(/<>/, $pst_line); if ($subject && $psub eq "") { $psub = "no title"; } if ($pemail) { $pname = "$pname"; } if ($purl) { $purl = "http://$purl"; } # 自動リンク if ($autolink) { &auto_link($pcom); } $html = <<"HTML"; [$pnum] $psub 投稿者:$pname [$plocal] 投稿日:$pdate
$pcom

$purl

$pres

HTML @news = (); foreach $line (@past) { if ($line =~ //i) { last; } push (@news,$line); if ($line =~ //i) { push (@news,"$html"); } } push (@news,"\n\n"); open(DB,">$pastfile") || &error("Can't write $pastfile"); print DB @news; close(DB); }## --- 過去ログ完了 --- ## ## --- 過去ログ次ファイル生成ルーチン sub next_log { # 次ファイルのためのカウントアップ $count++; # カウントファイル更新 open(NUM,">$pastno") || &error("Can't write $pastno"); print NUM "$count"; close(NUM); $pastfile = "$past_dir/$count\.html"; &new_log; } ## --- 新規過去ログファイル生成ルーチン sub new_log { $new_flag = 1; $past[0] = "過去ログ\n"; if ($bgr) { $past[1] = "
\n"; } else { $past[1] = "
\n"; } $past[2] = "\n"; $past[3] = "\n"; $past[4] = "\n"; # 新規過去ログファイルを生成更新 open(DB,">$pastfile") || &error("Can't write $pastfile"); print DB @past; close(DB); # パーミッションを666へ。 chmod(0666,"$pastfile"); } ## --- ログエラー sub log_err { &header; print "

\n"; if ($lines[0] eq "") { print "

ログ容量がです。ただ今から環境設定を行います。\n"; } else { print "

ログフォーマットが v4.xx の形式ではありません。
\n"; print "ただ今からログフォーマットを変換し、WEB上から環境設定を行います。\n"; } print "

\n"; print "\n"; print "PASSWORD "; print "
\n"; print "


\n"; print "\n"; exit; } ## --- ログ編集モード入室処理 sub enter { &header; print "
\n"; print "管 理 モ ー ド
\n"; print "

処理オプションを選択し、パスワードを入力して下さい\n"; print "

\n"; print "記事編集\n"; print "記事削除\n"; print "環境設定

\n"; print ""; print "\n"; print "

\n\n"; exit; } ## --- ログ削除画面 sub delete { # パスワード認証 if ($pass ne "$FORM{'pass'}") { &error("パスワードが違います。",'NOLOCK'); } &open_log2; &header; print "▲ BBS\n"; print "
\n"; print "管 理 モ ー ド
\n"; print "

削除する記事をチェックして削除ボタンを押して下さい。\n"; print "

\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($subject) { print "\n"; } print "\n"; foreach $line (@lines) { ($num,$date,$name,$email,$local,$icon,$ad_ico,$com,$res, $url,$host,$pw,$sub) = split(/<>/, $line); if (length($com) > 60) { $com=substr($com,0,58); $com=$com . '..'; } $com =~ s/
/ /g; $com =~ s//>/g; if ($email) { $name = "$name"; } if ($sub eq "") { $sub = "no title"; } print ""; print "\n"; if ($subject) { print ""; } print ""; print "\n"; } print "
削除記事No投稿日題名投稿者地域コメントホスト
$num$date$sub$name$local$com$host

"; print "\n"; print "

\n"; print "\n"; exit; } ## --- 削除処理 sub del_msg { # パスワード認証 if ($pass ne "$FORM{'pass'}") { &error("パスワードが違います。",'NOLOCK'); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } &open_log1; @new=(); foreach $line (@lines) { ($num,$date,$name,$email,$local,$icon,$ad_ico,$msg,$rmsg, $hp,$host,$pw,$sub) = split(/<>/, $line); $flag=0; foreach $chk (@dels) { if ($chk eq "$num") { $flag=1; next; } } if ($flag == 0) { push(@new,$line); } } unshift(@new,$init); open(OUT,">$logfile") || &error("Can't write $logfile"); print OUT @new; close(OUT); unlink($lockfile) if (-e $lockfile); # 初期画面に戻る &delete; } ## --- 編集画面 sub edit { # パスワードチェック if ($FORM{'pass'} ne "$pass") { &error("パスワードが違います。",'NOLOCK'); } &open_log2; # 設定を認識 ($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text,$link,$vlink,$alink, $home,$max,$sbj_color,$mailto,$manager,$man_color) = split(/<>/, $init); &header; print "▲ BBS\n"; print "
\n"; print "記事編集モード
\n"; print "

\n"; print "
    \n
  • 返信レスは、「管理人レス」の部分に記述し編集ボタンを押して下さい。\n"; print "
  • 記事の内容を修正する場合は、変更する個所のみ修正し編集ボタンを押して下さい。\n"; print "
\n


\n"; # 改頁処理 if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } # 記事数を取得 $end_data = @lines - 1; $page_end = $page + ($pagelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } foreach ($page .. $page_end) { ($number,$date,$name,$email,$local,$icon,$ad_icon, $com,$res,$url,$host,$pw,$sub) = split(/<>/, $lines[$_]); $com =~ s/
/\r/g; $res =~ s/
/\r/g; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; # タイトル部表示 if ($subject) { print "\n"; print "\n"; } print "\n"; print "\n"; print "\n"; print "\n"; print "
記事No$number
投稿日$date
投稿者
メール
タイトル
URL
地域$local
ホスト$host
イメージ
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
メッセージ
管理人レス
管理人イメージ
\n"; print "\n"; print "
\n

\n"; } # 改頁処理 $next_line = $page_end + 1; if ($page_end ne $end_data) { print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } print "\n"; exit; } ## --- 編集実行処理 sub edit_msg { # パスワード認証 if ($pass ne "$FORM{'pass'}") { &error("パスワードが違います。",'NOLOCK'); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログ読みこみ &open_log1; @new=(); foreach $line (@lines) { ($num,$date,$name,$email,$local,$icon,$ad_ico, $msg,$rmsg,$hp,$host,$pw,$sub) = split(/<>/, $line); if ($FORM{'no'} eq "$num") { $line = "$num<>$date<>$FORM{'name'}<>$FORM{'email'}<>$local<>$icon<>$FORM{'ad_icon'}<>$com<>$res<>$url<>$host<>$pw<>$FORM{'sub'}<>\n"; } push(@new,$line); } unshift(@new,$init); open(DB,">$logfile") || &error("Can't write $logfile"); print DB @new; close(DB); unlink($lockfile) if (-e $lockfile); &edit; } ## --- 環境設定画面 sub env { # パスワード認証 if ($pass ne "$FORM{'pass'}") { &error("パスワードが違います。",'NOLOCK'); } open(IN,"$logfile") || &error("Can't open $logfile",'NOLOCK'); @lines = ; close(IN); if ($lines[0] =~ /^GLIGHT/) { ($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text, $link,$vlink,$alink,$home,$max,$sbj_color,$mailto, $manager,$mgr_color) = split(/<>/, $lines[0]); } else { $title="Guest Book"; $t_color="008080"; $t_size=6; $t_face="MS Pゴシック"; $bgc="F5F5F5"; $text="000000"; $link="0000FF"; $vlink="800080"; $alink="FF0000"; $home="../index.html"; $max=50; $sbj_color="008040"; $manager="管理人"; $mgr_color="800000"; } &header; print <<"EOF"; ▲ BBS
編 集 モ ー ド

  • 環境設定の修正を行います。
  • 変更したい個所を修正し、送信キーを押してください。
  • タグは書き込まないようにしてください。
EOF if ($mailing) { print ""; print "\n"; print "\n"; print "\n"; } print "\n"; print "

タイトル
サイズ
タイトル色
文字スタイル

壁 紙
背景色
文字色
リンク色(link)
リンク色(vlink)
リンク色(alink)

記事 [題名] 色
管理人名
管理人レスの色

戻り先
最大記事数

メール送信
  • ここにメールアドレスを記入すると投稿記事を送信します。

  • "; print "
    \n"; print "\n"; exit; } ## --- 環境設定更新処理 sub env_init { # パスワード認証 if ($pass ne "$FORM{'pass'}") { &error("パスワードが違います。",'NOLOCK'); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(IN,"$logfile") || &error("Can't open $logfile"); @lines = ; close(IN); # ログフォーマットとが正しければ先頭行をカット if ($lines[0] =~ /^GLIGHT/) { shift(@lines); } unshift(@lines,"GLIGHT<>$FORM{'title'}<>$FORM{'t_color'}<>$FORM{'t_size'}<>$FORM{'t_face'}<>$FORM{'bgr'}<>$FORM{'bgc'}<>$FORM{'text'}<>$FORM{'link'}<>$FORM{'vlink'}<>$FORM{'alink'}<>$FORM{'home'}<>$FORM{'max'}<>$FORM{'subj_color'}<>$FORM{'mailto'}<>$FORM{'manager'}<>$FORM{'mgr_color'}<>\n"); # ログを更新 open(OUT,">$logfile") || &error("Can't write $logfile"); print OUT @lines; close(OUT); unlink($lockfile) if (-e $lockfile); # 完了メッセージ &header; print "


    環境設定の変更が完了しました。

    \n"; print "

    [掲示板へもどる]


    \n"; print "\n"; exit; } ## --- 過去ログ用フレーム sub past { # 過去ログ用カウント open(NO,"$pastno") || &error("Can't open $pastno",'NOLOCK'); $count = ; close(NO); if ($FORM{'ue'} eq "") { print "Content-type: text/html\n\n"; print "\n過去ログ\n"; print "\n"; print "\n"; print "\n"; print "$body\n"; print "<h3>フレーム非対応のブラウザの方は利用できません。</h3>\n"; print "</body>\n\n"; } else { &header; print "[掲示板へ戻る]\n"; print "[ワード検索]\n"; print "
    \n"; print "過去ログ
    \n"; print "
    \n"; print "[最新]\n"; # 過去ログの[リンク]を新規順に表示 for ($i=$count-1; $i>0; $i--) { print "[$i]\n"; } print "

    \n"; print "\n"; } exit; } ## --- ログ読みこみ sub open_log1 { open(IN,"$logfile") || &error("Can't open $logfile"); @lines = ; close(IN); $init = $lines[0]; shift(@lines); } ## --- ログ読みこみ(ロックなし) sub open_log2 { open(IN,"$logfile") || &error("Can't open $logfile",'NOLOCK'); @lines = ; close(IN); $init = $lines[0]; shift(@lines); } ## --- イメージ画像表示 sub image { &header; print "

    \n"; print "

    イメージ画像サンプル

    \n"; print "現在登録されているイメージ画像は以下のとおりです。\n"; print "
    \n"; print "

    \n"; foreach (0 .. $#GFILE) { print "\n"; print "\n"; } print "
    $CHARA[$_]
    \n


    \n"; print "
    \n"; print "
    \n"; print "\n"; exit; }