#┌───────────────────────────────── #│ YY-BOARD v5.32 (2003/11/10) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'YY-BOARD v5.32'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #│ 3. 添付の home.gif は L.O.V.E の mayuRin さんによる画像です。 #└───────────────────────────────── # # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- yybbs / yybbs.cgi [755] # | yyregi.cgi [755] # | yyini.cgi [644] # | yylog.cgi [666] # | count.dat [666] # | jcode.pl [644] # | pastno.dat [666] # | # +-- img / home.gif, bear.gif, ... # | # +-- lock [777] / # | # +-- past [777] / 0001.cgi [666] ... #------------------------------------------------- # ▼設定項目 #------------------------------------------------- # タイトル名 $title = "kayama meat ゲストブック"; # タイトル文字色 $tCol = "#cccccc"; # タイトルサイズ $tSize = '12px'; # 本文文字フォント $bFace = "MS UI Gothic, Osaka, MS Pゴシック"; # 本文文字サイズ $bSize = '15px'; # 壁紙を指定する場合(http://から指定) $backgif = "http://www.kayamameat.com/event/image/eee3.gif"; # 背景色を指定 $bgcolor = "#ffffff"; # 文字色を指定 $text = "#666666"; # リンク色を指定 $link = "#999966"; # 未訪問 $vlink = "#cc6666"; # 訪問済 $alink = "#996666"; # 訪問中 # 戻り先のURL (index.htmlなど) $homepage = "http://www.kayamameat.com"; # 最大記事数 $max = 1000; # 管理者用パスワード (英数字で8文字以内) $pass = '298k'; # アイコン画像のあるディレクトリ # → フルパスなら http:// から記述する # → 最後は必ず / で閉じる $imgurl = "http://www.kayamameat.com/bbs/yyb02/img/"; # アイコンを定義 # → 上下は必ずペアにして、スペースで区切る $ico1 = '0.gif sky_1b sky_2b sky_4b sea_4_b sea_5_b green_5_b green_4_b green_3d green_8_b green_15b zakka_20b zakka_21b zakka_23bb zakka_23b zakka_25b zakka_26b zakka_7b zakka_11b zakka_14b hana_40b hana_40e hana_42b hana_43b hana_44b hana_45b hana_47b drink_5b drink_8_b drink_10b drink_11b drink_12b1 drink_12b2 drink_13b fv_1b fv_5b fv_6_b f_v_7_b fv_4b f_v_8_b f_v_b fv_3b fv_2b f_v_14b f_v_13b f_v_11bb f_v_11b cake_25c cake_20c cake_2-1a cake_3-1b cake_5-1_1b cake_7b cake9b cake10d food_22b.jpg '; $ico2 = '- sky01 sky02 sky03 sea01 sea02 green01 green02 green03 green04 green05 zakka01 zakka02 zakka03 zakka04 zakka05 zakka06 zakka07 zakka08 zakka09 hana01 hana02 hana03 hana04 hana05 hana06 hana07 drink01 drink02 drink03 drink04 drink05 drink06 drink07 vegetable01 fruit01 fruit02 fruit03 fruit04 fruit05 fruit06 fruit07 fruit08 fruit09 fruit10 fruit11 fruit12 cake01 cake02 cake03 cake04 cake05 cake06 cake07 cake08 food01'; # 管理者専用アイコン機能 (0=no 1=yes) # (使い方) 記事投稿時に「管理者アイコン」を選択し、暗証キーに # 「管理パスワード」を入力して下さい。 $my_icon = 1; # 管理者専用アイコンの「ファイル名」を指定 $my_gif = 'admin.gif'; # アイコンモード (0=no 1=yes) $iconMode = 1; # 返信がつくと親記事をトップへ移動 (0=no 1=yes) $topsort = 0; # タイトルにGIF画像を使用する時 (http://から記述) $t_img = "http://www.kayamameat.com/bbs/yyb02/top.gif"; $t_w = 593; # 画像の幅 (ピクセル) $t_h = 53; # 〃 高さ (ピクセル) # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 $lockkey = 1; # ロックファイル名 $lockfile = './lock/yybbs.lock'; # ミニカウンタの設置 # → 0=no 1=テキスト 2=画像 $counter = 1; # ミニカウンタの桁数 $mini_fig = 6; # テキストのとき:ミニカウンタの色 $cntCol = "#666666"; # 画像のとき:画像ディレクトリを指定 # → 最後は必ず / で閉じる $gif_path = "./img/"; $mini_w = 8; # 画像の横サイズ $mini_h = 12; # 画像の縦サイズ # カウンタファイル $cntfile = './count.dat'; # 本体ファイルURL $script = './yybbs.cgi'; # 更新ファイルURL $regist = './yyregi.cgi'; # ログファイル $logfile = './yylog.cgi'; # メールアドレスの入力必須 (0=no 1=yes) $in_email = 0; # 記事 [タイトル] 部の長さ (全角文字換算) $sub_len = 12; # 記事の [タイトル] 部の色 $subCol = "#83a593"; # 記事表示部の下地の色 $tblCol = "#FFFFFF"; # 投稿フォーム及びボタンの文字色 $formCol1 = "#F7FAFD"; # 下地の色 $formCol2 = "#000000"; # 文字の色 # 家アイコンの使用 (0=no 1=yes) $home_icon = 0; $home_gif = "home.gif"; # 家アイコンのファイル名 $home_wid = 16; # 画像の横サイズ $home_hei = 20; # 〃 縦サイズ # イメージ参照画面の表示形態 # 1 : JavaScriptで表示 # 2 : HTMLで表示 $ImageView = 1; # イメージ参照画面のサイズ (JavaScriptの場合) $img_w = 700; # 横幅 $img_h = 450; # 高さ # 1ページ当たりの記事表示数 (親記事) $pageView = 10; # 投稿があるとメール通知する (sendmail必須) # 0 : 通知しない # 1 : 通知するが、自分の投稿記事は通知しない。 # 2 : すべて通知する。 $mailing = 2; # メールアドレス(メール通知する時) $mailto = 'wave@kayamameat.com'; # sendmailパス(メール通知する時) $sendmail = '/usr/sbin/sendmail'; # 文字色の設定 # → スペースで区切る $color = '#999999 #666666 #333333 #ff9999 #009999 #FF6666 #83a593 #c9d8d0'; # URLの自動リンク (0=no 1=yes) $autolink = 1; # タグ広告挿入オプション # → の代わりに「広告タグ」を挿入 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能 $banner1 = ''; # 掲示板上部に挿入 $banner2 = ''; # 掲示板下部に挿入 # ホスト取得方法 # 0 : gethostbyaddr関数を使わない # 1 : gethostbyaddr関数を使う $gethostbyaddr = 0; # アクセス制限(半角スペースで区切る) # → 拒否するホスト名又はIPアドレスを記述(アスタリスク可) # → 記述例 $deny = '*.anonymizer.com 211.154.120.*'; $denyHost = ''; # 記事の更新は method=POST 限定する場合(セキュリティ対策) # → 0=no 1=yes $postonly = 1; # 他サイトから投稿排除時に指定する場合(セキュリティ対策) # → 掲示板のURLをhttp://から書く $baseUrl = ''; # 投稿制限(セキュリティ対策) # 0 : しない # 1 : 同一IPアドレスからの投稿間隔を制限する # 2 : 全ての投稿間隔を制限する $regCtl = 0; # 制限投稿間隔(秒数) # → $regCtl での投稿間隔 $wait = 0; # 投稿後の処理 # → 掲示板自身のURLを記述しておくと、投稿後リロードします # → ブラウザを再読み込みしても二重投稿されない措置。 # → Locationヘッダの使用可能なサーバのみ $location = ''; #---(以下は「過去ログ」機能を使用する場合の設定です)---# # # 過去ログ生成 (0=no 1=yes) $pastkey = 1; # 過去ログ用NOファイル $nofile = './pastno.dat'; # 過去ログのディレクトリ # → フルパスなら / から記述(http://からではない) # → 最後は必ず / で閉じる $pastdir = './past/'; # 過去ログ1ファイルの行数 # → この行数を超えると次ページを自動生成します $pastmax = 300; # 1ページ当たりの記事表示数 (親記事) $pastView = 10; #------------------------------------------------- # ▲設定完了 #------------------------------------------------- #------------# # 投稿画面 # #------------# sub form { local($nam,$eml,$url,$pwd,$ico,$col,$sub,$com) = @_; local(@ico1,@ico2,@col); if ($url eq "") { $url = 'http://'; } $pattern = 'https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+'; $com =~ s/($pattern)<\/a>/$1/go; print < お名前 Eメール タイトル メッセージ
参照先 EOM # 管理者アイコンを配列に付加 @ico1 = split(/\s+/, $ico1); @ico2 = split(/\s+/, $ico2); if ($my_icon) { push(@ico1,$my_gif); push(@ico2,"管理者用"); } if ($iconMode) { print "イメージ  \n"; # イメージ参照のリンク if ($ImageView == 1) { print "[
イメージ参照]"; } else { print "[イメージ参照]"; } print "\n"; } if ($pwd ne "??") { print "暗証キー"; print "\n"; print "(英数字で8文字以内)\n"; } print "文字色"; # 色情報 @col = split(/\s+/, $color); if ($col eq "") { $col = 0; } foreach (0 .. $#col) { if ($col eq $col[$_] || $col eq $_) { print ""; print "\n"; } else { print ""; print "\n"; } } print < EOM } #----------------# # アクセス制限 # #----------------# sub axsCheck { # IP,ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr && ($host eq "" || $host eq $addr)) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } if ($host eq "") { $host = $addr; } local($flag)=0; foreach ( split(/\s+/, $denyHost) ) { s/(\W)/\\$1/g; s/\*/\.\*/g; if ($host =~ /$_/i || $addr =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #----------------# # デコード処理 # #----------------# sub decode { local($buf, $key, $val); if ($ENV{'REQUEST_METHOD'} eq "POST") { $post_flag=1; if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $post_flag=0; $buf = $ENV{'QUERY_STRING'}; } %in=(); foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JISコード変換 &jcode'convert(*val, "sjis", "", "z"); # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; $val =~ s/\0//g; # 改行処理 if ($key eq "comment") { $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; } else { $val =~ s/\r//g; $val =~ s/\n//g; } $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; } if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } $page = $in{'page'}; $page =~ s/\D//g; if ($page < 0) { $page = 0; } $mode = $in{'mode'}; $lockflag=0; $headflag=0; } #--------------# # エラー処理 # #--------------# sub error { if ($lockflag) { &unlock; } &header if (!$headflag); print <

ERROR !

$_[0]


EOM exit; } #--------------# # HTMLヘッダ # #--------------# sub header { $headflag=1; print "Content-type: text/html\n\n"; print <<"EOM"; EOM # JavaScriptヘッダ if ($ImageView == 1 && $_[0] eq "ImageUp") { print "\n"; print "\n"; } print "$title\n"; if ($backgif) { print "\n"; } else { print "\n"; } } #--------------# # ロック処理 # #--------------# sub lock { local($retry)=5; # 古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 30) { &unlock; } } # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } } $lockflag=1; } #--------------# # ロック解除 # #--------------# sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } $lockflag=0; } #----------------# # クッキー発行 # #----------------# sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 国際標準時を定義 $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); # 保存データをURLエンコード foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } # 格納 print "Set-Cookie: YY_BOARD=$cook; expires=$gmt\n"; } #----------------# # クッキー取得 # #----------------# sub get_cookie { local($key, $val, *cook); # クッキー取得 $cook = $ENV{'HTTP_COOKIE'}; # 該当IDを取り出す foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } # データをURLデコードして復元 @cook=(); foreach ( split(/<>/, $cook{'YY_BOARD'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); } #--------------# # 移動ボタン # #--------------# sub mvbtn { local($link,$i,$view) = @_; local($start,$end,$x,$y,$bk_bl,$fw_bl); # if ($in{'view'}) { $view = $in{'view'}; } if ($in{'bl'}) { $start = $in{'bl'}*10 + 1; $end = $start + 9; } else { $in{'bl'} = 0; $start = 1; $end = 10; } $x=1; $y=0; while ($i > 0) { # 当ページ if ($page == $y) { print "| $x\n"; # 切替ページ } elsif ($x >= $start && $x <= $end) { print "| $x\n"; # 前ブロック } elsif ($x == $start-1) { $bk_bl = $in{'bl'}-1; print "| \n"; # 次ブロック } elsif ($x == $end+1) { $fw_bl = $in{'bl'}+1; print "| \n"; } $x++; $y += $view; $i -= $view; } print "|\n"; } #------------# # 検索処理 # #------------# sub search { local($file,$word,$view,$cond) = @_; local($i,$f,$top,$wd,$next,$back,@wd); # キーワードを配列化 $word =~ s/\x81\x40/ /g; @wd = split(/\s+/, $word); # ファイル展開 print "
\n"; $i=0; open(IN,"$file") || &error("Open Error: $file"); $top = ; while () { $f=0; foreach $wd (@wd) { if (index($_,$wd) >= 0) { $f++; if ($cond eq 'OR') { last; } } else { if ($cond eq 'AND') { $f=0; last; } } } # ヒットした場合 if ($f) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($eml) { $nam = "$nam"; } if ($url) { $url = "<Home>"; } # 結果を表示 print "

[$no] $sub "; print "投稿者:$nam 投稿日:$dat $url

\n"; print "
$com\n"; } } close(IN); print <
検索結果:$i
EOM $next = $page + $view; $back = $page - $view; return ($i, $next, $back); } #-----------------# # URLエンコード # #-----------------# sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; } 1; __END__