#!/usr/bin/perl #/usr/bin/ # ---------------------------------------------------------------------------------- # Up-BBS Version 1.05(画像アップロード、iモード・J-PHONE対応BBS) # # Script written by CGIダウンロード(Nishiyama) # This script is free # HomePage http://www.cgi-down.com/ # E-Mail webmaster@cgi-down.com # (2002/11/06-2003/04/26) # # 改変履歴 # # V1.00 (2002-11-10) 正式リリース。 # V1.01 (2002-11-01) WinMeで書き込みした場合にWin98とOS表示される不具合修正。 # V1.02 (2003-01-31) CGIサーバーと画像ファイルサーバーが異なる場合でも画像が表示できるように修正。 # V1.03 (2003-02-05) DoCoMo拡張絵文字追加。IP・HOST表示(選択可)追加。OS表示選択機能追加。 # V1.04 (2003-03-13) 管理者ページが表示されないバグ修正。 # V1.05 (2003-04-26) IPアドレス表示モードの場合のIPアドレス用画像定義がなかった部分を修正。 # # 再配布、商用利用(販売・レンタル等)禁止。 # 使用されたらメールをいただけると光栄です。 # 設置等不明な点は、サポート掲示板へお願いします。 # CGIのカスタマイズ・作成も受け付けております。 # メールマガジンにご登録頂きますと最新情報をお届けします。 # http://www.cgi-down.com/magazin/ # ---------------------------------------------------------------------------------- # ********************************************************************************** # これ以降書き換えをする場合は、個人の責任で行って下さい。 # ********************************************************************************** # [メイン処理] require './cgi-lib.pl'; require "./upbbs_setfile.cgi"; if (!(-r $jcode)) { &error("jcode.plが見つかりません。"); } require $jcode; $cgi_lib'maxdata = $Max_KB * 1024; &read_form; @DATA = &read_file($datafile); $agent=$ENV{'HTTP_USER_AGENT'}; $agent =~ s/\,//g; $match = 0; foreach (@ips) {if ($ENV{'REMOTE_ADDR'} =~ /$_/) { $match=1; last; }} if($match){ &error("アクセス権限がありません。"); } if ($in{'mode'} eq 'control') { &password; } elsif ($in{'mode'} eq 'password') { &delete1; } elsif ($in{'mode'} eq 'delete') { &delete2; } elsif ($in{'mode'} eq 'regist') { &check_registry; } elsif ($in{'mode'} eq 'new') { &html_itoukou; } elsif ($in{'mode'} eq 'change') { &html_change; } elsif ($in{'mode'} eq 'change2') { &html_change2; } elsif ($in{'mode'} eq 'change3') { &check_registry; } elsif ($in{'mode'} eq 'delete_t') { &html_delete; } elsif ($in{'mode'} eq 'delete2') { &delete_2; } elsif ($in{'mode'} eq 'help') { &html_help; } &html_view; # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ヘッダー部分] sub html_header { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; if($window) { print "\n"; } print "$title\n"; print "\n"; if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { print "\n"; print "
$title
\n\n"; print "
\n\n"; print "
\n"; print "[H]\n"; print "[]\n"; print "[TOP]\n"; print "[]\n"; print "
\n\n"; } else { if($sheet) { print "\n"; } if ($back_gif) { print "\n"; } else { print "\n"; } print "
\n"; if ($titlegif) { print "\"$title\"

\n\n"; } else { print "$title

\n\n"; } print "
Home掲示板TOP管理者専用
\n"; } print "
\n\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [フッター部分 ※著作権表示] sub html_footer { print "
\n\n"; # 著作権表示(必ず見えるように表示して下さい) if ( index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { print "
V1.05
[CGIダウンロード]
\n"; } else { print "
Up-BBS V1.05 [CGIダウンロード]
\n"; } print "\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [トップ表示] sub html_view { &html_header; # 登録記事数を求める。 $max_date = @DATA; # 改ページ処理 if ($in{'page'} eq '') { $end_page = 0; } else { $end_page = $in{'page'}; } if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { $end_list = ($end_page + $max_ipage); } else { $end_list = ($end_page + $max_page); } if ($end_page < 0) { $end_page = 0; } if ($end_list >= $max_date) { $end_list = $max_date; } if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { for ($i = $end_page;$i<$end_list;$i++) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$DATA[$i]); print "$point"."$title
\n"; print "$point"."$name
\n"; if($file) { print "[画像]
\n"; } print "$com
\n"; if ($hpurl ne '') { print "[HP]\n"; } if ($mail ne '') { print "[Mail]
\n"; } else { print "
\n"; } print "[記事編集]
\n"; print "$date2
\n"; if (index($magent, "DoCoMo") == 0 || index($magent, "J-PHONE/") == 0) { if ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\s(.*)\((.*)\)$/) { $os = "$3"; } } else { if ($magent =~ /win[dows ]*95/i) { $os = 'Win95'; } elsif ($magent =~ /win[dows ]*9x/i) { $os = 'WinMe'; } elsif ($magent =~ /win[dows ]*98/i) { $os = 'Win98'; } elsif ($magent =~ /win[dows ]*XP/i) { $os = 'WinXP'; } elsif ($magent =~ /win[dows ]*NT ?5\.1/i) { $os = 'WinXP'; } elsif ($magent =~ /Win[dows ]*NT ?5/i) { $os = 'Win2000'; } elsif ($magent =~ /win[dows ]*2000/i) { $os = 'Win2000'; } elsif ($magent =~ /Win[dows ]*NT/i) { $os = 'WinNT'; } elsif ($magent =~ /Win[dows ]*CE/i) { $os = 'WinCE'; } elsif ($magent =~ /shap pda browser/i) { $os = 'ZAURUS'; } elsif ($magent =~ /Mac/i) { $os = 'Mac'; } elsif ($magent =~ /X11/ || $magent =~ /SunOS/i || $magent =~ /Linux/i || $magent =~ /HP-UX/i || $magent =~ /FreeBSD/i || $magent =~ /NetBSD/i || $magent =~ /OSF1/i || $magent =~ /IRIX/i) { $os = 'UNIX'; } else { $os = 'unknown'; } } print "■$os\n"; if($end_list-1 != $i) { print "
\n"; } } # 次ページ用 $next_page = $end_list; # まだデータが残っている場合は、次ページボタンを付け、 # 1ページに表示した人数を $next_page で返す。 if ($end_list ne $max_date) { print "
\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; } } else { # 記事の表示 &html_toukou; print " = HomePage   = MailAddress   = 記事の編集/削除
\n"; print "

\n"; print "
\n"; for ($i = $end_page;$i<$end_list;$i++) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$DATA[$i]); $title = &iconvert($title); $name = &iconvert($name); $com = &iconvert($com); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; if (index($magent, "DoCoMo") < 0 && index($magent, "J-PHONE/") < 0) { print "\n"; } else { print "\n"; } print "$title
\n"; print "
\n"; if (index($magent, "DoCoMo") == 0 || index($magent, "J-PHONE/") == 0) { if ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\/(.*)$/) { $os = "$3"; } elsif ($magent =~ /(.*)\/(.*)\s(.*)\((.*)\)$/) { $os = "$3"; } } else { if ($magent =~ /win[dows ]*95/i) { $os = 'Win95'; } elsif ($magent =~ /win[dows ]*98/i) { $os = 'Win98'; } elsif ($magent =~ /win[dows ]*9x/i) { $os = 'WinMe'; } elsif ($magent =~ /win[dows ]*XP/i) { $os = 'WinXP'; } elsif ($magent =~ /win[dows ]*NT ?5\.1/i) { $os = 'WinXP'; } elsif ($magent =~ /Win[dows ]*NT ?5/i) { $os = 'Win2000'; } elsif ($magent =~ /win[dows ]*2000/i) { $os = 'Win2000'; } elsif ($magent =~ /Win[dows ]*NT/i) { $os = 'WinNT'; } elsif ($magent =~ /Win[dows ]*CE/i) { $os = 'WinCE'; } elsif ($magent =~ /shap pda browser/i) { $os = 'ZAURUS'; } elsif ($magent =~ /Mac/i) { $os = 'Mac'; } elsif ($magent =~ /X11/ || $magent =~ /SunOS/i || $magent =~ /Linux/i || $magent =~ /HP-UX/i || $magent =~ /FreeBSD/i || $magent =~ /NetBSD/i || $magent =~ /OSF1/i || $magent =~ /IRIX/i) { $os = 'UNIX'; } else { $os = 'unknown'; } } print "投稿者:[$name]  \n"; if($os_view) { print " $os \n"; } print "
\n"; print "投稿日:[$date]\n"; print "\"記事の編集\"\n"; if ($mail ne '') { print "\"$nameさんへメール\"\n"; } if ($hpurl ne '') { print "\"ホームページ\"\n"; } print "

\n"; if($file) { if($window) { print "
\n"; } else { print "
\n"; } } print "$com

\n"; if($ip_view) { print "
$mip($mhost)
\n"; } print "
\n"; print "


\n"; } print "

\n\n"; # 次ページ用 $next_page = $end_list; # まだデータが残っている場合は、次ページボタンを付け、 # 1ページに表示した人数を $next_page で返す。 if ($end_list ne $max_date) { print "
\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; } } &html_footer; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [i-mode投稿部] sub html_itoukou { &html_header; print "■欄は必須項目です。必ずお書き下さい。
\n"; print "
\n"; print "■名前

\n\n"; print "■タイトル

\n\n"; print "□メール

\n\n"; print "□HP

\n\n"; print "■コメント

\n\n"; print "編集・削除時に使用
\n"; print "■削除キー

\n\n"; print "\n"; print "\n"; print "
\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [パソコン投稿部] sub html_toukou { &read_cookie; # ブラウザによってサイズを変更する。 local($ad_width,$name_width,$com_width) = &bura_check; if($COOKIE{'hpurl'}) { $thpurl = "$COOKIE{'hpurl'}"; } else { $thpurl = 'http://'; } # 投稿部分 print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前タイトル
メールホーム
コメント
添付ファイル
削除キー 変更/削除時のパスワードになります
\n"; print "
\n"; print "
\n"; print "※削除キーは、記事の編集や削除時に使用しますので忘れないで下さい。
\n"; print "アップロードできるファイルは[GIF][JPEG][JPG][PNG]で、$Max_KB"."KB以下です。
\n"; print "DoCoMoの拡張絵文字は、古い機種では見えないので注意して下さい。

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿チェック] sub check_registry { if ($in{'name'} eq "") { &error("お名前を入力して下さい。"); } elsif ($in{'title'} eq '') { $in{'title'} = "無題"; } elsif ($mail_flag) { if ($in{'mail'} eq '') { &error("メールアドレスを入力して下さい。"); } } elsif ($in{'mail'}) { if ($in{'mail'} !~ /^[0-9a-zA-Z\.\-\_]+\@[0-9a-zA-Z\.\-\_]+\.[0-9a-zA-Z\.\-\_]+$/) { &error("メールアドレスが不正です。"); } } elsif ($in{'com'} eq "") { &error("コメントを入力して下さい。"); } elsif (length($in{'com'}) > $max_com) { &error("コメントが制限文字数を超えています。"); } elsif($in{'mode'} eq 'change3') { if ($in{'npwd'} !~ /^[0-9a-zA-Z]+$/) { &error("削除キーは半角英数字で入力して下さい。"); } } else { if ($in{'pwd'} !~ /^[0-9a-zA-Z]+$/) { &error("削除キーは半角英数字で入力して下さい。"); } } ®istry; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [入力文字変換] sub convert { $in{'name'} =~ s/\n//g; $in{'name'} =~ s/,//g; $in{'name'} =~ s//>/g; $in{'name'} =~ s/\r/
/g; $in{'title'} =~ s/\n//g; $in{'title'} =~ s/,//g; $in{'title'} =~ s//>/g; $in{'title'} =~ s/\r/
/g; $in{'com'} =~ s/\n//g; $in{'com'} =~ s/,//g; $in{'com'} =~ s//>/g; $in{'com'} =~ s/\r/
/g; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルに記録] sub registry { # クッキー書き込み &set_cookie; # 現在時間の取得 local($date,$date2) = &time; # メール送信 if($mail_flag2) { &sendmail; } # 入力文字変換 &convert; #オートリンクがONなら、自動的にリンクを設定する if($auto_link) { $in{'com'} =~ s/(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<\/a>/g; } # 最大記録数より大きければ古い記事を削除(新規登録の場合のみ) if($in{'mode'} ne 'change3') { $i = 0; foreach $log (@DATA) { $i++; if ($i == $max_report) { last; } push(@NEW,$log); } } local($host,$ip) = &host; # 添付ファイル処理 if($in{'file'}) { &upfilereg; } # 変更登録の場合、データの書換え $flag3 = 0; if($in{'mode'} eq 'change3') { $flag3 = 1; $cpfile = "$in{'tfile'}"; $passwd = crypt($in{'npwd'},"pass"); $flag = 0; $flag2 = 0; $i = 0; foreach $log (@DATA) { local($mnumber,$mdate,$mdate2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$log); chop($com); if(($pwd eq crypt($in{'tpwd'},"pass") || $in{'tpwd'} eq $master_pass) && $in{'no'} == $mnumber) { if($change_mode == 2) { $DATA[$i] = "$in{'no'},$date,$date2,$passwd,$in{'name'},$in{'title'},$in{'mail'},$in{'hpurl'},$imgfile2,$uw,$uh,$uw_s,$uh_s,$host,$ip,$agent,$in{'com'}\n"; if(!$imgfile2) { unlink("$imgdir$file") if (-e "$imgdir$file"); } } else { $flag2 = 1; if(!$imgfile2) { unlink("$imgdir$file") if (-e "$imgdir$file"); } } $flag = 1; } if(!$flag2) { push(@NEW,$log); } $flag2 = 0; $i++; } $value = "$in{'no'},$date,$date2,$passwd,$in{'name'},$in{'title'},$in{'mail'},$in{'hpurl'},$imgfile2,$uw,$uh,$uw_s,$uh_s,$host,$ip,$agent,$in{'com'}\n"; unshift(@NEW,$value); } else { # 記事番号取得 @NO = &read_file($nofile); $number = $NO[0] + 1; # ファイルを更新 if (!open(OUT, ">$nofile")) { &error("記事番号ファイルに書き込み出来ませんでした。"); } print OUT $number; close (OUT); # 新規登録の場合、データを $value に代入。 $passwd = crypt($in{'pwd'},"pass"); $value = "$number,$date,$date2,$passwd,$in{'name'},$in{'title'},$in{'mail'},$in{'hpurl'},$imgfile2,$uw,$uh,$uw_s,$uh_s,$host,$ip,$agent,$in{'com'}\n"; # データをファイルの最初に記録するようにフォーマット unshift(@NEW,$value); @DATA =@NEW; } if($in{'mode'} eq 'change3') { if(!$flag) { &error("不正なアクセスか記事番号と一致しませんでした。"); } } if($change_mode == 1) { @DATA = @NEW; } # ロック開始 if($lock_mode == 1) { &lock1; } elsif ($lock_mode == 2) { &lock2; } # ファイルを更新 if (!open(OUT, ">$datafile")) { &error("ファイルに書き込み出来ませんでした。"); } print OUT @DATA; close (OUT); # ロック解除 &fileunlock; $COOKIE{'name'} = $in{'name'}; $COOKIE{'mail'} = $in{'mail'}; $COOKIE{'hpurl'} = $in{'hpurl'}; &html_ok($flag3); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [アップロードファイルの記録] sub upfilereg { # 画像処理 $flag2=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$2; } if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; } if ($_ =~ /application\/x-macbinary/i) { $flag2=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $fname =~ tr/\"\x0D\x0A//d; # ファイル形式を認識 $flag=0; if ($kaku =~ /image\/gif/i) { $kaku=".gif"; $flag=1; } if ($kaku =~ /image\/jpeg/i) { $kaku=".jpg"; $flag=1; } if ($kaku =~ /image\/x-png/i) { $kaku=".png"; $flag=1; } if (!$flag) { if ($fname =~ /\.gif$/i) { $kaku=".gif"; $flag=1; } if ($fname =~ /\.jpe?g$/i) { $kaku=".jpg"; $flag=1; } if ($fname =~ /\.png$/i) { $kaku=".png"; $flag=1; } } # アップロード失敗処理 if (!$flag) { &error("アップロードできないファイル形式です"); } $upfile = $in{'file'}; # マックバイナリ対策 if ($flag2) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 記事番号取得 @NO = &read_file($nofile); $number = $NO[0] + 1; # 記事編集時の画像ファイル名処理 if($in{'mode'} eq 'change3') { $number = $in{'no'}; } # 添付データを書き込み $ImgFile = "$imgdir$number$kaku"; $imgfile2 = "$number$kaku"; if (!open(OUT,"> $ImgFile")) { &error("画像のアップロードに失敗しました"); } binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666,$ImgFile); # 画像サイズ取得 if ($kaku eq ".jpg") { ($uw, $uh) = &jpeg_size($ImgFile); } elsif ($kaku eq ".gif") { ($uw, $uh) = &gif_size($ImgFile); } elsif ($kaku eq ".png") { ($uw, $uh) = &pig_size($ImgFile); } # 画像サイズ(ピクセル数)が設定より大きければ縮小表示する if($uw > $max_wid || $uh > $max_hei) { ($uw_s,$uh_s) = &reduce_pixels($uw,$uh); } else { $uw_s = $uw; $uh_s = $uh; } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [JPEGファイルサイズ取得] sub jpeg_size { local($jpeg) = @_; local($data, $m, $c, $l, $wid, $hei); open(JPEG, "$jpeg") || return (0,0); binmode JPEG; read(JPEG, $data, 2); while (1) { read(JPEG, $data, 4); ($m, $c, $l) = unpack("aan", $data); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $data, 5); ($hei, $wid) = unpack("xnn", $data); last; } else { read(JPEG, $data, ($l - 2)); } } close(JPEG); return ($wid, $hei); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [GIFファイルサイズ取得] sub gif_size { local($gif) = @_; local($data,$wid1,$wid2,$hei1,$hei2); open(GIF,"$gif") || return (0,0); binmode(GIF); sysread(GIF,$data,10); close(GIF); if ($data =~ /^GIF/) { $data = substr($data,-4); } ($wid1,$wid2,$hei1,$hei2) = unpack("C"x 4, $data); $wid = $wid1 + $wid2 * 256; $hei = $hei1 + $hei2 * 256; return ($wid, $hei); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [PIGファイルサイズ取得] sub pig_size { local($png) = @_; local($data); open(PNG, "$png") || return (0,0); binmode(PNG); read(PNG, $data, 24); close(PNG); $wid = unpack("N", substr($data, 16, 20)); $hei = unpack("N", substr($data, 20, 24)); return ($wid, $hei); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [画像縮小] sub reduce_pixels { local($uw,$uh) = @_; # 縦横サイズの縮小率を算出 $uw2 = $max_wid / $uw; $uh2 = $max_hei / $uh; # 縮小率が大きい方を基準に縮小する if ($uw2 < $uh2) { $p = $uw2; } else { $p = $uh2; } $uw = int ($uw * $p) || 1; $uh = int ($uh * $p) || 1; return ($uw, $uh); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [登録完了ページ表示] sub html_ok { $change = $_[0]; &html_header; if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { if($change) { print "記事の変更を受け付けました。

\n"; } else { print "登録ありがとうございました。

\n"; } print "
『掲示板へ戻る』
\n"; } else { print "




\n"; if($change) { print "記事の変更を受け付けました。





\n"; } else { print "登録ありがとうございました。





\n"; } print "『掲示板に戻る』
\n"; print "
\n"; } &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿者変更、削除パスワード入力] sub html_change { &html_header; if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { print "削除キーを入力して下さい。
\n"; print "管理者は「管理者パスワード」を入力して下さい
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } else { print "
\n"; print "





\n"; print "削除キーを入力して下さい。
\n"; print "管理者は「管理者パスワード」を入力して下さい
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "





\n"; print "
\n"; } &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿者変更フォーム表示] sub html_change2 { $passwd = crypt($in{'pwd'},"pass"); $flag = 0; foreach $log (@DATA) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$log); chop($com); if(($pwd eq crypt($in{'pwd'},"pass") || $in{'pwd'} eq $master_pass) && $in{'no'} == $number) { $flag = 1; $tnumber = $number; $tdate = $date; $tdate2 = $date2; $tpwd = $pwd; $tname = $name; $ttitle = $title; $tmail = $mail; $thpurl = $hpurl; $tfile = $file; $tmhost = $mhost; $tmip = $mip; $tmagent = $magent; $tcom = $com; } } if(!$flag) { &error("パスワードが一致しません。"); } # ブラウザによってサイズを変更する。 local($ad_width,$name_width,$com_width) = &bura_check; &html_header; $tcom =~ s/
/\n/g; if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { print "■欄は必須項目です。必ずお書き下さい。
\n"; print "
\n"; print "■名前

\n\n"; print "■タイトル

\n\n"; print "□メール

\n\n"; print "□HP

\n\n"; print "■コメント

\n\n"; print "■削除キー

\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; } else { print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前タイトル
メールホーム
コメント
添付ファイル
削除キー 変更/削除時のパスワードになります
\n"; print "
\n"; print "
\n"; print "※削除キーは、記事の編集や削除時に使用しますので忘れないで下さい。
\n"; print "アップロードできるファイルは[GIF][JPEG][JPG][PNG]で、$Max_KB"."KB以下です。

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; print "
\n\n"; } &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿者削除] sub html_delete { &html_header; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "記事を削除します。宜しいですか?

\n"; print "\n"; print "
\n\n"; print "
\n\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿者削除2] sub delete_2 { $cpfile = "$in{'tfile'}"; foreach $lines (@DATA) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$lines); chop($com); if($in{'no'} != $number) { push(@NEW,$lines); } else { unlink("$imgdir$file") if (-e "$imgdir$file"); } } # ロック開始 if($lock_mode == 1) { &lock1; } elsif ($lock_mode == 2) { &lock2; } if (!open(OUT, ">$datafile")) { &error("ファイルに書き込み出来ませんでした。"); } print OUT @NEW; close (OUT); # ロック解除 &fileunlock; if (index($agent, "DoCoMo") == 0 || index($agent, "J-PHONE/") == 0) { &html_header; print "記事を削除しました。

\n"; print "『掲示板へ戻る』
\n"; } else { print "Location: $cgifile" . '?' . "\n\n"; } exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [パスワード入力画面] sub password { &html_header; print "
\n"; print "





\n"; print "管理者用のパスワードを入力して下さい。
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "





\n"; print "
\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [削除処理 1] sub delete1 { if ($in{'pass'} ne $master_pass | $in{'pass'} eq '') { &error("管理者用パスワードが違います。"); } &html_header; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $lines (@DATA) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$lines); print ""; print ""; print ""; print "\n"; if($file) { print "\n"; } else { print "\n"; } print "\n"; } print "\n"; print "
 No名前タイトル画像
$number$name$title[画像]NotFile
\n"; print "


\n"; print "

\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [削除処理 2] sub delete2 { if($in{'get'}) { @DEL = split(/\0/, $in{'get'}); } foreach $lines (@DATA) { local($number,$date,$date2,$pwd,$name,$title,$mail,$hpurl,$file,$uw,$uh,$uw_s,$uh_s,$mhost,$mip,$magent,$com) = split(/,/,$lines); $del = 'up'; foreach $get (@DEL) { if ($get eq $number) { $del = 'del'; unlink("$imgdir$file") if (-e "$imgdir$file"); } } if($del eq 'up') { push(@NEW,$lines); } } # ロック開始 if($lock_mode == 1) { &lock1; } elsif ($lock_mode == 2) { &lock2; } if (!open(OUT, ">$datafile")) { &error("ファイルに書き込み出来ませんでした。"); } print OUT @NEW; close (OUT); # ロック解除 &fileunlock; print "Location: $cgifile" . '?' . "\n\n"; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [携帯用説明ページ] sub html_help { &html_header; print"■注意事項

\n"; print "1.DoCoMoの絵文字に対応しています。それ以外の携帯会社の絵文字には未対応です。
\n"; print "2.DoCoMoの新機種から付いている拡張絵文字を使用される場合は、古い機種では対応していませんので注意して下さい。
\n"; print "3.削除キーは、半角英数字でご記入下さい。編集・削除時のパスワードになりますので、忘れないようにして下さい。
\n"; print "4.大きい画像(写真等)は、携帯で見れない場合があります。
\n"; print "5.携帯から画像(写真等)のアップロードは出来ません。
\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ メール送信 ] sub sendmail { $msg ="From: $master_email\n"; $msg .= "Subject: $subject\n"; $msg .= "To: $tomail\n"; $msg .= "Content-Transfer-Encoding: 7bit\n"; $msg .= "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n"; $msg .= "$titleに書き込みがありました。\n"; $msg .= "$cgiurl \n\n"; $msg .= " http://www.cgi-down.com/ 提供\n"; &jcode'convert(*msg,'jis'); open(ML,"| $sendmail -t") || &error("メールを送信できませんでした。"); print ML $msg; print ML "\n"; close (ML); return; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ホスト名取得] sub host { # ホスト名、IPアドレス取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($get_remotehost) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2); } } if ($host eq "") { $host = $addr; } if ($host =~ /(.*)\.(\d+)$/) { ; } elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; } elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; } return ($host,$addr); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [記録ファイルの読み込み] sub read_file { local($date_file) = $_[0]; if (!open(IN,$date_file)) { &error("ファイルを読み込み出来ませんでした。"); } local(@date_files) = ; close(IN); return @date_files; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック(symlink)] sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if(--$retry <= 0) { &error("ただ今混雑中です。しばらくしてアクセスしてください。"); } sleep(1); } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック(open)] sub lock2 { foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else { open(LOCK,">$lockfile"); close(LOCK); return; } } &error("ただ今混雑中です。しばらくしてアクセスしてください。"); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック解除] sub fileunlock { if (-e $lockfile) { unlink($lockfile); } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [iモード絵文字変換] sub iconvert { $msg = $_[0]; $fontsize = 12; $leng=length($msg); $temp="" ; $flag = 0; for($p=0; $p<$leng; $p++){ $xx=substr($msg,$p,1); $cxx=ord($xx); if($cxx == 0xf8 && $flag == 0){ $flag = 1; } elsif($cxx == 0xf9 && $flag == 0){ $flag = 2; } elsif($cxx > 0x7f && $cxx < 0xa0 && $flag == 0){ $flag = 3; $temp .= $xx; } elsif($cxx > 0xdf && $cxx < 0xf8 && $flag == 0){ $flag = 3; $temp .= $xx; } elsif($flag == 1){ $timg = sprintf("", $emozi,$cxx,$fontsize,$fontsize); $temp .= $timg; $flag = 0; } elsif($flag == 2){ $timg = sprintf("", $emozi,$cxx,$fontsize,$fontsize); # ,$fontsize,$fontsize $temp .= $timg ; $flag = 0; } else{ $temp .= $xx; $flag = 0; } } $iconv = $temp; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [クッキー呼び出し] sub read_cookie { local($cookies) = $ENV{'HTTP_COOKIE'}; local($pair,%DUMMY); local(@pairs) = split(/;/,$cookies); foreach $pair (@pairs) { local($name,$value) = split(/=/,$pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_name}); foreach $pair (@pairs) { local($name,$value) = split(/#/,$pair); $COOKIE{$name} = $value; } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [クッキー記録] sub set_cookie { # クッキーの有効期限を30日にする local($csec,$cmin,$chour,$cmday,$cmon,$cyear,$cwday) = gmtime(time + 30*24*60*60); $cyear = $cyear + 1900; $cmday = sprintf("%.2d",$cmday); $chour = sprintf("%.2d",$chour); $cmin = sprintf("%.2d",$cmin); $csec = sprintf("%.2d",$csec); $cmon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$cmon]; $cwday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$cwday]; $date_gmt = "$cwday, $cmday\-$cmon\-$cyear $chour:$cmin:$csec GMT"; local($cook) = "name\#$in{'name'}\,mail\#$in{'mail'}\,hpurl\#$in{'hpurl'}"; print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [フォームデータを取得し、文字コード統一] sub read_form { # cgi-lib.plより &ReadParse; local($pair,$form_date); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form_date, $ENV{'CONTENT_LENGTH'}); } else { $form_date = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$form_date); foreach $pair (@pairs) { local($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 ($name eq 'get') { push(@DEL,$value); } else { $in{$name} = $value; } } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ブラウザチェック] sub bura_check{ $ad_width = 50; $name_width = 20; $com_width = 50; $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /MSIE 3/i || $agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $ad_width = $ad_width * 1.2; $name_width = $name_width * 1.5; $com_width = $com_width * 1.1; } return ($ad_width,$name_width,$com_width); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [現在時刻を取得] sub time{ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(); $year = $year + 1900; $mon = sprintf("%.2d",$mon +1); $mday = sprintf("%.2d",$mday); $hour = sprintf("%.2d",$hour); $min = sprintf("%.2d",$min); $sec = sprintf("%.2d",$sec); # 曜日を日本語化 @week = ('日','月','火','水','木','金','土'); $wday = $week[$wday]; local($date) = "$year年$mon月$mday日($wday) $hour時$min分$sec秒"; local($date2) = "$year\/$mon\/$mday\
$hour\:$min\:$sec"; return ($date,$date2); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [エラー関連] sub error { # ロック解除 &fileunlock; print "Content-type: text/html\n\n"; print "$error_message\n"; print "\n"; print "◆Error
\n\n"; print "$_[0]\n"; print "\n"; exit; }