#!/usr/bin/perl =README by cachu@cachu.xrea.jp $Id: joyful.cgi,v 1.2.2.7 2004/12/02 22:38:41 kato Exp $ ファイルアップロード機能付き CGI joyful Note に Exif 情報を表示する よう改変したバージョン。このスクリプトは同梱の ExifInfo.pl を利用して Exif 情報のある JPEG 画像に対してその情報を表示できるように改変しました。 改変部分に関する著作権は cachu が保有しています。 それ以外の部分については KentWeb さんが著作権を保有しています。また、 同梱されている jcode.pl と fold.pl は歌代 和正さんが著作権を保有しています。 とにかく動かしたいという人は $title $homepage $pass $ScriptURL $imgurl の部分だけ環境に合わせて編集すれば動作します。カスタマイズをしたいという 人は README_exif.txt を参考にして設定をして下さい。 =cut use Time::Local; #┌───────────────────────────────── #│ JOYFUL NOTE v1.96 (2006/01/18) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'JoyfulNote v1.96'; $joyfulexif_ver = 'v2.3h'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #│ 3. このスクリプトは、method=POST 専用です。 #│ 4. 同梱のアイコンで、以下のファイルの著作権者は以下のとおりです。 #│ home.gif : mayuRinさん #│ clip.gif : 牛飼いとアイコンの部屋さん #│ 5. histogram.jar は PhotoXP の作者、ノグチさん作です #└───────────────────────────────── # # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- joyful / joyful.cgi [705] # | joyfullog.cgi [606] # | count.dat [606] # | jcode.pl [604] # | cgi-lib.pl [604] # | pastno.dat [606] # | fold.pl [604] ( added by cachu ) # | exifinfo.pl [604] ( added by cachu ) # | exiftable.pl [604] ( added by cachu ) # | exiftag.info [604] ( added by cachu ) # | joyful.css [604] ( added by cachu ) # | getpicsize.pl [604] ( added by cachu ) # | imageresize.pl [604] ( added by cachu ) # | showexif.cgi [705] ( added by cachu ) # | index.html [606] ( added by cachu ) # | blacklist.cgi [606] ( added by cachu ) # | histogram.jar [606] ( added by cachu ) # | blacklist_util.cgi [705] ( added by cachu ) # | # | mp3read.pl [604] ( added by cachu ) # | # +-- maker_note [705] / makernote.*, *.pl ... ( added by cachu ) # +-- img [707] / home.gif, bear.gif, ... # | +-- thumb [707] / サムネイル画像 # | # +-- lock [707] / # | # +-- past [707] / 1.dat [606] ... #------------------------------------------------- # 設定項目 #------------------------------------------------- # ライブラリ取込 require './jcode.pl'; require './cgi-lib.pl'; require './exiftable.pl'; require './exifinfo.pl'; require './getpicsize.pl'; require './imageresize.pl'; require './fold.pl'; # タイトル名 #$title = "Joyful Note"; $title = "お姉さん画像の掲示板"; # タイトルの文字色 $t_color = "#804040"; # タイトルの文字サイズ $t_size = '26px'; # 本文の文字フォント $face = '"HG丸ゴシックM-PRO", "HG丸ゴシックM-PRO", Osaka'; # 本文の文字サイズ $b_size = '16px'; # 壁紙を指定する場合(http://から指定) $bg = ""; # 背景色を指定 $bc = "#ffdfff"; # 文字色を指定 $tx = "#000000"; # リンク色を指定 $lk = "#0000FF"; # 未訪問 $vl = "#800080"; # 訪問済 $al = "#FF0000"; # 訪問中 # 戻り先のURL (index.htmlなど) $homepage = "../index.html"; # 最大記事数 (親記事+レス記事も含めた数) $max = 100; # 管理者用マスタパスワード (英数字で8文字以内) $pass = '11111'; # 返信がつくと親記事をトップへ移動 (0=no 1=yes) $topsort = 1; # 返信にも添付機能を許可する (0=no 1=yes) $res_clip = 1; # 画像と記事の位置 # 1 : 画像が左。記事は右から回り込む # 2 : 画像が下。記事は画像の上に表示。 $imgpoint = 1; # タイトルにGIF画像を使用する時 (http://から記述) $t_img = ""; $t_w = 180; # GIF画像の幅 (ピクセル) $t_h = 40; # 〃 高さ (ピクセル) # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 $lockkey = 0; # ロックファイル名 $lockfile = './lock/joyful.lock'; # ミニカウンタの設置 # → 0=no 1=テキスト 2=GIF画像 $counter = 0; # ミニカウンタの桁数 $mini_fig = 6; # テキストのとき:ミニカウンタの色 $cnt_color = "#BB0000"; # GIFカウンタのとき:画像までのディレクトリ # → 最後は必ず / で閉じる $gif_path = "./img/"; $mini_w = 8; # 画像の横サイズ $mini_h = 12; # 画像の縦サイズ # カウンタファイル $cntfile = './count.dat'; # スクリプトのURL # $ScriptURL の方は http:// から始めること $script = './joyful.cgi'; $ScriptURL = 'http://www.hp-rank.com/bbs/onee/joyful.cgi'; # ログファイルを指定 # → フルパスで指定する場合は / から記述 $logfile = './joyfullog.cgi'; # アップロードディレクトリ # → パスの最後は / で終わること # → フルパスだと / から記述する $imgdir = './img/'; # アップロードディレクトリのURLパス # → パスの最後は / で終わること $imgurl = "http://www.hp-rank.com/bbs/onee/img/"; $imgurl = "./img/"; # 添付ファイルのアップロードに失敗したとき # 0 : 添付ファイルは無視し、記事は受理する # 1 : エラー表示して処理を中断する $clip_err = 1; # 記事 [タイトル] 部の長さ (全角文字換算) $sub_len = 15; # メールアドレスの入力必須 (0=no 1=yes) $in_email = 0; # 記事の [タイトル] 部の色 $sub_color = "#FFFFFF"; # 記事表示部の下地の色 $tbl_color = "#FFFFFF"; # 同一IPアドレスからの連続投稿時間(秒数) # → 連続投稿などの荒らし対策 # → 値を 0 にするとこの機能は無効になります $wait = 0; # 1ページ当たりの記事表示数 (親記事) $p_log = 5; # 投稿があるとメール通知する (sendmail必須) # 0 : 通知しない # 1 : 通知するが、自分の投稿記事はメールしない。 # 2 : 通知する。自分の投稿記事も通知する。 $mailing = 0; # メールアドレス(メール通知する時) $mailto = 'xxx@xxx.xxx'; # sendmailパス(メール通知する時) $sendmail = '/usr/lib/sendmail'; # 他サイトから投稿排除時に指定 (http://から書く) $base_url = ""; # 文字色の設定(半角スペースで区切る) $colors = '#800000 #DF0000 #008040 #0000FF #C100C1 #FF80C0 #FF8040 #000080'; # URLの自動リンク (0=no 1=yes) $autolink = 1; # タグ広告挿入オプション # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = '
あだると大好きあだると画像掲示板>お姉さん画像掲示板
パンティへの想い 画像掲示板FAN がむしゃら GazouBBS・GABB
あだると掲示板 2ch(;´Д`)ハァハァ画像置き場 あだるとが好き えっちな画像掲示板たち
'; # 掲示板上部に挿入 $banner2 = '
'; # 掲示板下部に挿入 # ホスト取得方法 # 0 : gethostbyaddr関数を使わない # 1 : gethostbyaddr関数を使う $gethostbyaddr = 0; # アクセス制限(半角スペースで区切る、アスタリスク可) # → 拒否ホスト名を記述(後方一致)【例】*.anonymizer.com $deny_host = ''; # → 拒否IPアドレスを記述(前方一致)【例】210.12.345.* $deny_addr = ''; # アップロードを許可するファイル形式 # 0:no 1:yes $gif = 1; # GIFファイル $jpeg = 1; # JPEGファイル $png = 1; # PNGファイル $text = 1; # TEXTファイル $lha = 0; # LHAファイル $zip = 0; # ZIPファイル $pdf = 1; # PDFファイル $midi = 1; # MIDIファイル $word = 0; # WORDファイル $excel = 0; # EXCELファイル $ppt = 0; # POWERPOINTファイル $ram = 0; # RAMファイル $rm = 0; # RMファイル $mpeg = 0; # MPEGファイル $mp3 = 0; # MP3ファイル # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 100KB $cgi_lib'maxdata = 102400; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 300; # 横幅 $MaxH = 150; # 縦幅 # 家アイコンの使用 (0=no 1=yes) $home_icon = 1; # アイコン画像ファイル名 (ファイル名のみ) $IconHome = "home.gif"; # ホーム $IconClip = "clip.gif"; # クリップ $IconSoon = "soon.gif"; # COMINIG SOON # 画像管理者チェック機能 (0=no 1=yes) # → アップロード「画像」は管理者がチェックしないと表示されない機能です # → チェックされるまで「画像」は「COMMING SOON」のアイコンが表示されます $ImageCheck = 0; # 投稿後の処理 # → 掲示板自身のURLを記述しておくと、投稿後リロードします # → ブラウザを再読み込みしても二重投稿されない措置。 # → Locationヘッダの使用可能なサーバのみ $location = 'http://www.hp-rank.com/bbs/onee/joyful.cgi'; # 禁止ワード # → コンマで区切って複数指定する(例)$deny_word = 'アダルト,出会い,カップル'; $deny_word = ''; #---(以下は「過去ログ」機能を使用する場合の設定です)---# # # 過去ログ生成 (0=no 1=yes) $pastkey = 1; # 過去ログ用NOファイル $nofile = './pastno.dat'; # 過去ログのディレクトリ # → フルパスなら / から記述(http://からではない) # → 最後は必ず / で閉じる $pastdir = './past/'; # 過去ログ1ファイルの行数 # → この行数を超えると次ページを自動生成します $log_line = 600; ################################# # 以下 cachu による設定の追加 # ExifInfo に関する設定 $ExifInfo = 0; # 1: Exif 情報表示 $ExifTAGfile = './exiftag.info'; # 表示する Exif 情報ファイル $ExifLang = 'ja'; # Exif 情報の言語 'ja': 日本語, 'en': 英語 $ExifTableCol = 1; # Exif 情報を表示する段数 $ExifBorder = 0; # Exif 情報の表の枠線の太さ 0 で非表示 # サムネイルに関する設定 # $ThumbMake … サムネイル作成のための方法の指定 # -1: 自動検出 # 0: サムネイル作成せず # 1: ImageMagick Perl モジュール (PerlMagick) # 2: gcon (菅さん作) # 3: convert # 4: repng2jpg/gif2png (菅さん作) # 5: netpbm # 99: ユーザー定義 # PerlMagick 以外の各種コマンドの設定は imageresize.pl で直接指定をするか # 下にあるコメントを外して指定してください。その際 Windows な方でパスに # 空白がある場合は # # $ImgResize::convert = '"C:\Program Files\ImageMagic\convert.exe"'; # # のようにダブルコーテーションで囲んでください。ユーザー定義の場合、 # JPEG/PNG/GIF からの変換コマンドをそれぞれ $jpeg_prog, $png_prog, $gif_prog # にて指定します。詳しくは README_exif.txt を参照してください。 # $ThumbMake = -1; $ThumbQuality = 75; # サムネイルのクオリティ(圧縮率) #$ImgResize::convert = '/usr/bin/convert'; #$ImgResize::jpegtopnm = '/usr/bin/jpegtopnm'; #$ImgResize::pnmscale = '/usr/bin/pnmscale'; #$ImgResize::pngtopnm = '/usr/bin/pngtopnm'; #$ImgResize::giftopnm = '/usr/bin/giftopnm'; #$ImgResize::pnmtojpeg = '/usr/bin/pnmtojpeg'; #$ImgResize::pamflip = '/usr/bin/pamflip'; #$ImgResize::repng2jpeg = './repng2jpeg'; #$ImgResize::gcon = './gcon.exe'; #$jpeg_prog = 'convert -geometry %wx%h -quality %q %i %o'; #$png_prog = 'convert -geometry %wx%h -quality %q %i %o'; #$gif_prog = 'convert -geometry %wx%h -quality %q %i %o'; # 投稿画像一覧の設定 # $PicSummary... 111111 # |||||+- 通常表示のトップ # ||||+-- 通常表示のスレッド一覧内 # |||+--- 記事一覧表示のトップ # ||+---- 記事一覧表示の表のすぐ上 # |+----- スレッド表示のトップ # +------ スレッド表示のメニューバー # $PicSummary = '100110'; # 1: 投稿画像一覧表示をする 0: しない $PicColumn = 4; # 画像一覧の列数 (横に並べる数) $PicRow = 3; # 画像一覧の行数 (縦に並べる数) $PicSum_W = $MaxW; # 画像の横幅の最大値 $PicSum_H = $MaxH; # 画像の縦幅の最大値 $PicBorder = 0; # 表の枠線の太さ $PicImgBorder = 0; # 画像の枠線の太さ $PicLink = 2; # 1: 通常表示へのリンク 2: スレッド表示へのリンク # 記事一覧の設定 # $ListSummary ... 11111 # ||||+-- 通常表示のトップ # |||+--- 通常表示のスレッド内 # ||+---- 投稿画像一覧のトップ # |+----- スレッド表示のトップ # +------ スレッド表示のメニューバー $ListSummary = '10110'; # 1: 記事一覧表示をする 0: しない $VoteFormInListMode = 1; # 1: 投稿フォームの表示をする 0: しない # その他の設定 # # $GifThumbnail 1 の時 GIF 画像の場合、サムネイルではなく元画像を表示 # します。0 の時は通常通りサムネイルの表示をします。 # $ImageInfo 1: 画像データの横に大きさと容量の情報を表示する # 0: しない # $ImageCSS 投稿された画像を表示するためのスタイル # マージンは左から、画像の上、右、下、左の順で指定します # $ImageLink 1 の時 JavaScript を用いた画像表示 0 は単純なリンク # 10 の位 … 記事中の画像 1の位 … 画像一覧の画像 # $ImageAutoResize JavaScript を用いた表示の際 # 1の時画像を自動的にウィンドウサイズに合わせる。 # $ForceReturn 1: 文章が画像の下 0: 文章が画像の右 # $viewmode 0: 通常モード 1: 投稿禁止モード # 2: メンバーモード 3: 投稿制限モード # 4: メンバーモード(閲覧のみ) # 5: アップロード制限モード # $mempass メンバーモード時のパスワード # $member_expire 認証されたメンバーが投稿可能な時間 (単位: 秒) # ユーザーID 発行の有効期限も兼ねています。 # $voteform 新規投稿フォームの表示位置 # 0: なし 1: 上部 2: 下部 # $articlelink No.## または >>## という文字列に対し対応する記事に # リンクをはります # $cite 返信時記事の引用 0: なし 1: あり # $ShowMessages 1スレッド辺りに表示する最大記事数。この数字を越えるもの # は最初に投稿した記事と最新記事を指定した記事数だけ表示。 # -1 を指定した場合は全ての記事表示。 # $ShowNumInThread 記事の前にスレッド内通し番号をつける場合 1 を必要が # ない場合 0 を指定します。 # $ThreadLink 各スレッドの右上にスレッドモードへのリンク表示 # $ThreadTopForm スレッド一覧の各スレッドの前につける文字を指定します。 # %d: # で 2ch と同じような表示になります。 # MaxThread スレッド一覧に表示する最大数 # $LastLinkNum スレッドトップにリンクする最新記事数 # $MP3Info 1: ID3v1 タグ表示 0: なし # $SecurityCheck 0: チェックなし # 1: GET による投稿規制 # 2: HTTP_REFERE に基づくチェック # $PageLinkButton 0: [1][2]... による指定 1: ボタンによる指定 # $GifThumbnail = 0; $ImageInfo = 0; $ImageCSS = 'margin: 2pt 10pt 10pt 0pt; float: left'; $ImageLink = '00'; # 画像リンクの方法 10...記事内 1...画像一覧 $ImageAutoResize = 0; $ImgWdt = 800; # 開く画像ウィンドウの横幅 $ImgHgt = 600; # 開く画像ウィンドウの縦幅 $ImgButton = 1; # ナビゲーションの位置 1: 上 2: 下 $ForceReturn = 0; $viewmode = 0; $mempass = 'member'; $member_expire = 60 * 24 * 60 * 60; # 60日 $voteform = 1; $articlelink = 1; $cite = 0; $ShowMessages = -1; $ShowNumInThread = 1; $ThreadLink = 0; # スレッドモードへのリンク表示 $ThreadTopForm = '%d:'; #$ThreadTopForm = '■'; $MaxThread = 30; $LastLinkNum = 5; $MP3Info = 0; $SecurityCheck = 1; $PageLinkButton = 1; # $MaxPicInThread 1スレッド内に投稿できる画像の最大数(負で無制限) # $MaxArticleInThread 1スレッド最大記事数(負で無制限) # $MaxArticleMessage 最大記事数を越えたスレッドトップに表示する文字 # 必ず で囲んでください。文字の表示をしたく # ない場合は ' ' としてください。 $MaxPicInThread = -1; $MaxArticleInThread = -1; $MaxArticleMessage = 'このスレッドにはこれ以上書き込めません'; # 簡易荒らし対策 # $BlackListCheck 1: 荒らし対策を行う 0: 行わない # $BlackListFile ブラックリスト情報の書かれたファイル # $BlackListIP 一時的に拒否する IP を記述するファイル # $BlackListAdmin $BlackListFile を設定する CGI # $FakeThroughTime 一時的に拒否する IP に対してここで指定した秒だけ # 間をおいてから実際にアクセス拒否をする # $CookieIfVote 1 の時、 投稿時にクッキーが有効になっている必要がある # $KeepUserIDs ユーザーID による制限を行う際,保存するユーザーIDの最大数 # $KeepLogs ログファイルの最大行数 # $MaxURLNums リンク URL を書き込める最大の数(負で無制限) # $ComentMatchURL 1 の時、コメント欄に URL 欄と同じ URL が書かれた記事を # 拒否する # $NameMatchSub 1 の時、名前とタイトルが同じ記事を拒否する # $CommentCode 1: コメントに日本語必須 # 2: コメントに日本語不可 # 0: チェックをしない # $BlackListCheck = 0; $BlackListFile = './blacklist.cgi'; $BlackListIP = "$imgdir/blacklist_ip.cgi"; $BlackListAdmin = './blacklist_util.cgi'; $FakeThroughTime = 30; $CookieIfVote = 0; $KeepUserIDs = 200; $KeepLogs = 200; $MaxURLNums = 5; $ComentMatchURL = 0; $NameMatchSub = 1; $CommentCode = 0; # ヒストグラム表示へのリンクをつける場合 1, つけない場合は 0 $Histogram = 0; # トリップ機能 $Trip = 0; # トップの HTMLを作成 # $StaticHTML 出力するファイル名 (空白の場合作成しない) # $StaticForm 1: 通常 2: 投稿記事一覧 $StaticHTML = 'index'; $StaticForm = 1; # RSS を作成する場合は 1 にする。 # $RSS_exec には RSS 作成スクリプトを指定(このファイルのパーミッションは 755) # $RSS_file には作成する RSS ファイル名を指定 $RSS = 0; $RSS_exec = './rss_joyfulexif.pl'; $RSS_file = './joyfulexif.rss'; # 新規メッセージに「NEW」をつける # $MessageNewTime この時刻(日)以内に投稿されたメッセージに NEW をつける # 負の値の場合、つけない # $MessageNew 新規メッセージの後に付加する文字 $MessageNewTime = 7; $MessageNew = ' NEW!'; # 以下トラックバックプラグインをインストールした場合にのみ有効 # # joyful-tbform.cgi のファイル名をを変えた場合、そのファイル名を # ここで設定をしてください。 $TrackBackForm = './joyful-tbform.cgi'; # トラックバック一覧の設定 # $TrackBackSummary ... 111 # ||+-- 通常表示のトップ # |+--- 通常表示のスレッド一覧内 # +---- 記事一覧表示のトップ $TrackBackSummary = '110'; # 1: 表示する 0: 表示しない # 以下のオプションは未サポートです。通常は 0 にしておいて下さい。 # $PicSearched 1 の時、画像一覧でメーカー、機種で画像の絞り込みが出来る # $hidden_check 1 の時、不正投稿のチェックのため変数を hidden で追加する # $hidden_word 追加する変数名。デフォルトのままで構いませんが、変えた # 方がより安全だと思います。 # $hidden_plus 適当な文字列(4文字)を入れてください。 # $res_color 先頭が > で始まっている行の色を指定 (空白で処理せず) $PicSearched = 0; $hidden_check = 0; $hidden_word = 'hdkey'; $hidden_plus = 'plus'; $res_color = ''; # ここまでの設定を別ファイルから読み込む場合、そのファイル名を指定する。 # パスワードなども別ファイルにする場合には設定ファイルが他人から読まれない # ように注意をすること $SettingFromFile = './admin.cgi'; #------------------------------------------------- # 設定完了 #------------------------------------------------- BEGIN{ if( -d 'extlib' ){ unshift( @INC, 'extlib' ); } } # 設定ファイルが存在する場合は読み込む if( $SettingFromFile && -T $SettingFromFile ){ require "$SettingFromFile"; } # サムネイル画像作成プログラムとトラックバックプラグインのチェック ( $ThumbMake != 0 ) and ($ThumbMake = &ImgResize::Init( $ThumbMake ) ); ( -T './joyful-tb.cgi' ) ? ( $TrackBack = 1 ) : ( $TrackBack = 0 ); # 文字コード (現在は sjis のみ) # sjis : Shift-Jis, euc: EUC, jis: JIS $code = 'sjis'; if( $code ne 'euc' && $code ne 'sjis' && $code ne 'jis' ){ $code = 'euc'; } $code = 'sjis'; # サムネイルが保存されるディレクトリ $thumbdir = $imgdir . 'thumb/'; $thumburl = $imgurl . 'thumb/'; # 画像縮小率の計算 #$PicRatio = $PicSum_W / $MaxW; #( $PicRatio > $PicSum_H / $MaxH ) and ( $PicRatio = $PicSum_H / $MaxH ); # Exif データの初期化とスレッド一覧用の情報読み込み ( $ExifInfo ) and ( &ExifInit( $ExifTAGfile ) ); &PageSetup; # MP3 情報を読み込む場合 if( $MP3Info ){ if( -e './mp3read.pl' ){ require './mp3read.pl'; }else{ $MP3Info = 0; } } # if( $viewmode == 5 ){ $PutOnlyMember = 1; }else{ $PutOnlyMember = 0; } # メイン処理 &decode; ( $BlackListCheck ) and ( &blacklist_check ); &axscheck; #( $viewmode >= 2 ) and ( &member_check ); &member_check; if ($mode eq "howto") { &howto; } elsif ($mode eq "hist") { &histogram; } elsif ($mode eq "find") { &find; } elsif ($mode eq "usr_del") { &usr_del; } elsif ($mode eq "usr_edt") { &usr_edt; } elsif ($mode eq "regist") { ®ist; } elsif ($mode eq "res") { &res_form; } elsif ($mode eq "admin") { &admin; } elsif ($mode eq "past") { &past; } elsif ($mode eq "check") { ✓ } elsif ($mode eq "summary") { &pic_summary; } elsif ($mode eq "new") { &new_form; } elsif ($mode eq "list") { &list_title; } elsif ($mode eq "tb") { &tb_list; } &html_log; # 投稿記事にリンクするために一度ログを読み込む #------------------------------------------------- # トラックバックリスト #------------------------------------------------- sub tb_list{ my ( $no, @line ); my ( $min, $hour, $mday, $mon, $year, $wday, $atime ); my @TBfile; return unless ( $TrackBack ); # ヘッダを出力 &header; # カウンタ処理 if( $counter ){ &counter; } # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } print ""; if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } print ""; # メニュー部 print "


\n"; print "[掲示板に戻る]\n"; print "
\n"; print "
\n"; @TBfile = <$imgdir/*_tb.txt>; foreach ( sort { $b cmp $a } @TBfile ){ /(\d+)_tb\.txt/; $no = $1; print "

スレッド: $ArticleTitle{$no}

\n"; print "
\n"; print "\n"; print " \n"; open( TB, $_ ); ; while( ){ &jcode::convert( \$_, $code ); @line = split( /<>/, $_ ); ( $min, $hour, $mday, $mon, $year, $wday ) = ( localtime( $line[0] ) )[1..6]; $year += 1900; $mon++; $atime = sprintf( "%04d/%02d/%02d %02d:%02d", $year, $mon, $mday, $hour, $min ); $line[3] =~ s/<\;br>\;//ig; print " \n"; } print "
タイトル概要日付送信元
$line[4]$line[3]$atime$line[2]
\n
\n"; print "
\n"; } print "
\n"; # 著作権表示部(削除改変不可) print "
\n"; print "$banner2

\n"; print "\n"; print "- Joyful Note -\n"; print "
(joyfulexif $joyfulexif_ver by cachu)\n"; print "

\n\n\n"; exit; } #------------------------------------------------- # メンバーチェック #------------------------------------------------- sub member_check{ my ( $key, $val, $cook, %cook, $match, $PASS, $TIME, $ETIME ); my ( $gmt, @t, @m, @w ); @t = gmtime( time + $member_expire ); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov', 'Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $je_auth = ''; # 投稿可能かどうかのチェックのための準備 ( $viewmode == 0 ) ? ( $je_vote = 1 ) : ( $je_vote = 0 ); $je_vote = 1; # 国際標準時を定義 $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]); $je_auth_time = $gmt; # クッキーの読み込み $cook = $ENV{'HTTP_COOKIE'}; foreach ( split/;/, $cook ){ ( $key, $val ) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } ( $PASS, $TIME, $je_auth ) = split( /<>/, $cook{'JoyfulNoteAuth'} ); unless( $je_auth =~ /\S/ ){ return if( $mode eq "regist" ); $je_auth = time; $je_auth = encrypt( $je_auth ); } if( $viewmode < 2 ){ print "Set-Cookie: JoyfulNoteAuth=$PASS\<>$TIME\<>$je_auth; expires=$gmt\n"; return; } $match = &decrypt( $mempass, $PASS ); ( $viewmode == 5 ) and ( $viewmode = 0 ); # 認証が成功 if( $match eq 'yes' ){ ( $viewmode != 4 ) and ( $je_vote = 1 ); # 期限のチェック if( time - $TIME < $member_expire ){ $TIME = time; print "Set-Cookie: JoyfulNoteAuth=$PASS\<>$TIME\<>$je_auth; expires=$gmt\n"; ( $viewmode == 4 ) ? ( $viewmode = 1 ) : ( $viewmode = 0 ); $PutOnlyMember = 0; return; } } return if( ( $viewmode == 3 || $viewmode == 0 ) && ( $in{'mempass'} ne $mempass && $in{'mode'} ne 'member' ) ); if( $in{'mempass'} ne $mempass ){ &header; print "

パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n\n"; exit; }else{ $PASS = &encrypt( $mempass ); $TIME = time; print "Set-Cookie: JoyfulNoteAuth=$PASS\<>$TIME\<>$je_auth; expires=$gmt\n"; ( $viewmode == 4 ) ? ( $viewmode = 1 ) : ( $viewmode = 0 ); $PutOnlyMember = 0; } } #------------------------------------------------- # 記事一覧 #------------------------------------------------- sub list_title{ my ( $Article, $i, $tclass, $tclassn ); if( $StaticMode ){ $voteform = 0; } # ヘッダを出力 &header; # カウンタ処理 if ($counter) { &counter; } # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } print ""; if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } print ""; # メニュー部 print "


\n"; print "[トップに戻る]\n"; if( $voteform == 0 ){ ( $VoteFormInListMode && $viewmode != 3 ) and ( print "[新規投稿]\n" ); }elsif( $voteform == 2){ ( $VoteFormInListMode && $viewmode != 3 ) and ( print "[新規投稿]\n" ); } print "[留意事項]\n"; print "[ワード検索]\n"; print "[過去ログ]\n" if ($pastkey); print "[画像一覧]\n" if ( substr( $PicSummary, -3, 1 ) == 1 ); print "[TB一覧]\n" if ( $TrackBack && substr( $TrackBackSummary, -3, 1 ) == 1 ); print "[管理用]\n"; ( $viewmode == 3 || $PutOnlyMember == 1 ) and ( print "[認証]\n" ); print "
\n"; # 投稿フォーム ( $VoteFormInListMode && $voteform == 1 ) and ( &form() ); print "

\>\;\>\;画像一覧

\n" if( substr( $PicSummary, -4, 1 ) == 1 ); print "\n"; print " "; print ""; print ""; print ""; print ""; $i = 0; foreach $Article( @article ){ $i++; my $Lnum = "Article$Article"; my $LN = @{ $Lnum } - 1; ( $i % 2 == 0 ) ? ( $tclass = 'tl-even' ) : ( $tclass = 'tl-odd' ); ( $i % 2 == 0 ) ? ( $tclassn = 'tn-even' ) : ( $tclassn = 'tn-odd' ); print " "; print ""; print ""; print ""; print ""; print ""; print "\n"; } print "
No.記事名件数最終更新日 (投稿者)投稿日 (投稿者)
$Article$ArticleTitle{$Article}$ArticleNew{$$Lnum[$LN]}$Article{$Article}$ArticleLatest{$Article} ($ArticleNameLatest{$Article})$ArticleDate{$Article} ($ArticleName{$Article})
\n"; # 投稿フォーム ( $VoteFormInListMode && $voteform == 2 ) and ( &form() ); # 著作権表示部(削除改変不可) print "
\n"; print "$banner2

\n"; print "\n"; print "- Joyful Note -\n"; print "
(joyfulexif $joyfulexif_ver by cachu)\n"; print "

\n\n\n"; unless( $StaticMode ){ exit; } } #------------------------------------------------- # 新規投稿 #------------------------------------------------- sub new_form{ # ヘッダを出力 &header; # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } print ""; if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } print ""; # 投稿フォーム &form(); # 著作権表示部(削除改変不可) print "$banner2

\n"; print "\n"; print "- Joyful Note -\n"; print "
(joyfulexif $joyfulexif_ver by cachu)\n"; print "

\n\n\n"; exit; } #------------------------------------------------- # アクセス制限 #------------------------------------------------- sub axscheck { my ( $baddr, $btime ); # IP&ホスト名取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr && ($host eq "" || $host eq $addr)) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } # IPチェック local($flg); foreach ( split(/\s+/, $deny_addr) ) { s/\./\\\./g; s/\*/\.\*/g; if ($addr =~ /$_/) { $flag=1; last; } } if ($flg) { &error("アクセスを許可されていません"); # ホストチェック } elsif ($host) { foreach ( split(/\s+/, $deny_host) ) { s/\./\\\./g; s/\*/\.\*/g; if ($host =~ /$_$/i) { $flg = 1; last; } } if ($flg) { &error("アクセスを許可されていません"); } } if ($host eq "") { $host = $addr; } # 一時的に禁止した IP のチェック if( $BlackListCheck ){ open( BL, $BlackListIP ); while( ){ chomp; next if( /^\#/ ); next unless ( /\S/ ); /(\S+)\s*(\d+)/; $baddr = $1; $btime = $2; if( $addr eq $baddr && ( time - $btime ) < $TEMPORARY_TIME ){ if( ( time - $btime ) > $FakeThroughTime ){ &error( "アクセスを拒否しました" ); } } } } } #------------------------------------------------- # 記事表示部 #------------------------------------------------- sub html_log { local($ipt,$wh,$i,$flag,$hist); my ( $MenuInThread, $ppage, $npage, $article ); if( $StaticMode ){ $voteform = 0; } $MenuInThread = substr( $PicSummary, -6, 1 ) + substr( $ListSummary, -5, 1 ); # ヘッダを出力 &header; # カウンタ処理 if ($counter) { &counter; } # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } print ""; if( !$viewonly ){ if ($t_img eq '') { print "$title\n"; } else { print "\"$title\"\n"; } }else{ print "[No.$thread] $ArticleTitle{$thread}\n"; } print ""; # メニュー部 if( !$viewonly ){ print "


\n"; print "[トップに戻る]\n"; if( $voteform == 0 ){ ( $viewmode != 3 ) and ( print "[新規投稿]\n" ); }elsif( $voteform == 2){ ( $viewmode != 3 ) and ( print "[新規投稿]\n" ); } print "[留意事項]\n"; print "[ワード検索]\n"; print "[過去ログ]\n" if ($pastkey); print "[画像一覧]\n" if ( substr( $PicSummary, -1, 1 ) == 1 ); print "[記事一覧]\n" if ( substr( $ListSummary, -1, 1 ) == 1 ); print "[TB一覧]\n" if ( $TrackBack && substr( $TrackBackSummary, -1, 1 ) == 1 ); print "[管理用]\n"; ( $viewmode == 3 || $PutOnlyMember == 1 ) and ( print "[認証]\n" ); print "
\n"; }else{ if( $MenuInThread ){ print "
\n"; print "[連続表\示]\n"; print "[画像一覧]\n" if ( substr( $PicSummary, -6, 1 ) == 1 ); print "[記事一覧]\n" if ( substr( $ListSummary, -5, 1 ) == 1 ); print "
\n"; }else{ print "\n"; } } # 投稿フォーム ( $voteform == 1 && !$viewonly ) and ( &form() ); print "

\n"; # 記事展開 $i=0; $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; # 最終更新時刻の追加 ( $last_no, $last_ip, $last_time ) = split( /<>/, $top ); @last_time = localtime( $last_time ); $last_update = sprintf( "%4d/%02d/%02d %02d:%02d:%02d", $last_time[5]+1900, $last_time[4]+1, $last_time[3], $last_time[2], $last_time[1], $last_time[0] ); if( !$viewonly ){ print "
最終更新時刻: $last_update
\n"; # スレッドのタイトル表示 if( $MaxThread > 0 ){ print "\n"; print "
\n"; print "\n"; print " \n"; print "

\n"; print " −スレッド一覧 (最新 $MaxThread 件) −

\n"; $LN = -1; foreach $Article ( @article ){ $LN++; last if ( $LN == $MaxThread ); my $Lnum = "Article$Article"; my $Ln = @{ $Lnum } - 1; my $Top = $ThreadTopForm; my $LNp1 = $LN + 1; $Top =~ s/%s/$script/g; $Top =~ s/%n/$Article/g; $Top =~ s/%d/$LNp1/g; if( $Page{$Article} == $page ){ print " $Top $ArticleTitle{$Article} ($Article{$Article})$ArticleNew{$$Lnum[$Ln]}\n"; }else{ print " $Top $ArticleTitle{$Article} ($Article{$Article})$ArticleNew{$$Lnum[$Ln]}\n"; } } print "

\n"; print "

"; if( $voteform == 0 ){ ( $viewmode != 3 ) and ( print "\>\;\>\;新規投稿 " ); }elsif( $voteform == 2){ ( $viewmode != 3 ) and ( print "\>\;\>\;新規投稿 " ); } print " \>\;\>\;記事一覧 " if( substr( $ListSummary, -2, 1 ) == 1 ); print " \>\;\>\;画像一覧" if ( substr( $PicSummary, -2, 1 ) == 1 ); print " \>\;\>\;TB一覧" if ( $TrackBack && substr( $TrackBackSummary, -2, 1 ) == 1 ); print "

\n"; print "

\n"; } } if( $TrackBack ){ $TrackBackCGI = $ScriptURL; my $ScriptFrom = $script; $ScriptFrom =~ s/http:\/\/.*\/([^\/]+)$/$1/; $ScriptFrom =~ s/^\.?\/?//; $TrackBackCGI =~ s/$ScriptFrom/joyful-tb.cgi/; # print "
トラックバック URL は $TrackBackCGI\/[親記事番号] です(例: joyful-tb.cgi/50 )。
\n"; if( -T $TrackBackForm ){ @TrackBackForm = (); open( TBF, $TrackBackForm ); @TrackBackForm = ; $TrackBackForm = @TrackBackForm; }else{ $TrackBack = 0; } } if( $viewonly ){ $article = @article; $ppage = $ArticlePrev{$thread}; $npage = $ArticleNext{$thread}; print "
" unless( $MenuInThread ); if( !$ppage || $thread == $article[0] ){ print "<\; 前の記事 | "; }else{ print "<\; 前の記事 | "; } print "連続表\示 | " unless( $MenuInThread ); print "画像一覧 | \n" if ( substr( $PicSummary, -5, 1 ) == 1 ); print "記事一覧 | \n" if ( substr( $ListSummary, -4, 1 ) == 1 ); if( !npage || $thread == $article[$article-1] ){ print "次の記事 >\;"; }else{ print "次の記事 >\;"; } print "\n"; } while () { ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); &jcode'convert(*name, $code ); &jcode'convert(*comment, $code ); &jcode'convert(*sub, $code ); if ($reno eq "") { $i++; $ShowMesNum = 0; } if( $thread > 0 ){ if( $no != $thread && $reno != $thread ){ next; } }else{ if ($i < $page + 1) { next; } if ($i > $page + $p_log) { next; } } $ShowMesNum++; if( $show > 1 ){ if( $reno ne '' ){ if( $Article{$reno} >= $show && $ShowMesNum <= ( $Article{$reno} - $show + 1 ) ){ next; } } } # 題名の長さ if (length($sub) > $sub_len*2) { ( $sub_folded, $sub_rest ) = fold( $sub, $sub_len*2 ); $sub = $sub_folded . "..."; } if ($mail) { $name = "$name"; } if ($home_icon && $url) { $url = "HomePage"; } elsif (!$home_icon && $url) { $url = "<HOME>"; } if (!$reno && $flag) { # トラックバックの表示 if( $TrackBack ){ if( $TrackBackExist ){ # print "
\n$TrackBackExist\n"; print "$TrackBackExist\n"; } } print "


\n"; $flag=1; } if (!$reno) { print "
\n"; $flag=1; } if ($reno) { print "
\n"; } if(!$reno){ # トラックバックの設定 if( $TrackBack ){ $TrackBackExist = "
トラックバック - $TrackBackCGI\/$no\n"; if(-T "$imgdir/$no\_tb.txt" ){ open( TB, "$imgdir/$no\_tb.txt" ); for( $TB = 0 ; $TB < $TrackBackForm ; $TB++ ){ if( $TrackBackForm[$TB] =~ /<\$JETrackBack\$>/i ){ for( $TB2 = $TB ; $TB2 < $TrackBackForm ; $TB2++ ){ if( $TrackBackForm[$TB2] =~ /<\/\$JETrackBack\$>/i ){ $top = ; while( ){ chomp; my ( $TB_atime, $TB_addr, $TB_BlogName, $TB_Message, $TB_Title, $TB_URL ) = split( /<>/, $_ ); my @TB_time = localtime( $TB_atime ); my $TB_year = sprintf( "%04d", $TB_time[5] + 1900 ); my $TB_month = sprintf( "%02d", $TB_time[4] + 1 ); my $TB_day = sprintf( "%02d", $TB_time[3] ); my $TB_hour = sprintf( "%02d", $TB_time[2] ); my $TB_minute = sprintf( "%02d", $TB_time[1] ); for( $TB3 = $TB+1 ; $TB3 < $TB2 ; $TB3++ ){ my $OutFile = $TrackBackForm[$TB3]; $OutFile =~ s/\%u/$TB_URL/g; $OutFile =~ s/\%t/$TB_Title/g; $OutFile =~ s/\%c/$TB_Message/g; $OutFile =~ s/\%b/$TB_BlogName/g; $OutFile =~ s/\%Y/$TB_year/g; $OutFile =~ s/\%M/$TB_month/g; $OutFile =~ s/\%D/$TB_day/g; $OutFile =~ s/\%h/$TB_hour/g; $OutFile =~ s/\%m/$TB_minute/g; $OutFile =~ s/\<\;br\>\;/
/g; $TrackBackExist .= $OutFile; } } $TB = $TB2; last; } } }else{ $TrackBackExist .= $TrackBackForm[$TB], "\n"; } } close( TB ); } } if( $MaxArticleInThread > 0 && $Article{$no} >= $MaxArticleInThread ){ $MAXARTICLEMESSAGE = $MaxArticleMessage; }else{ $MAXARTICLEMESSAGE = ''; } print " \n"; print " $MAXARTICLEMESSAGE\n"; print "
"; if( $ThreadLink ){ print "全記事 " if( !$in{thread} ); }elsif( $show > 1 && $Article{$no} > $show ){ print "全記事 "; # }elsif( $viewonly ){ # print "一覧 "; } if( $LastLinkNum > 0 && $Article{$no} > 1 ){ $Lnum = "Article$no"; print "["; for( $ln = 1 ; $ln <= $LastLinkNum ; $ln++ ){ $LN = $Article{$no} - $ln; next if( $LN < 0 ); if( $LN == 0 || $ln == $LastLinkNum ){ print "$$Lnum[$LN]"; }else{ print "$$Lnum[$LN]/"; } } print "]\n"; } print "\ \;"; if( !$viewonly ){ print ""; if( $Page{$ArticlePrev{$no}} == $Page{$no} ){ print ""; }else{ print ""; } if( $Page{$ArticleNext{$no}} == $Page{$no} ){ print ""; }else{ print ""; } } print "
\n"; } unless( ( $viewmode || ( $MaxArticleInThread > 0 && $Article{$reno} >= $MaxArticleInThread ) ) ){ print "
\n"; } print "\n"; if ($reno) { print ""; } if( $ShowNumInThread ){ if( !$reno ){ $NumInThread = "[$i:$Article{$no}] "; }else{ $NumInThread = "[$ShowMesNum] "; } }else{ $NumInThread = ''; } print ""; }else{ print "No.$no$ArticleNew{$no}"; } print "\n"; }else{ print ""; } } else { unless( ( $viewmode || ( $MaxArticleInThread > 0 && $Article{$reno} >= $MaxArticleInThread ) ) ){ print "\n"; print "\n"; ( $cite ) and ( print "\n" ); print "\n"; }else{ print "
\n"; } } print "

$NumInThread$sub "; if (!$reno) { print "投稿者:$name 投稿日:$date "; } else { print "$name - $date "; } if( $reno ){ print "No.$no$ArticleNew{$no}   $url \n"; if (!$reno) { unless( ( $viewmode || ( $MaxArticleInThread > 0 && $Article{$no} >= $MaxArticleInThread ) ) ){ print "\n"; print "\n"; ( $cite ) and ( print "\n" ); print "
\n"; unless( ( $viewmode || ( $MaxArticleInThread > 0 && $Article{$reno} >= $MaxArticleInThread ) ) ){ print "
\n"; } print "\n"; if ($reno) { print "\n"; } print "

"; if (!$reno) { print "
\n"; } # レスに色を付ける if( $res_color ){ $comment =~ s/(^|
)\s*(\>\;.*?|>.*?)
/$1$2<\/font>
/g; $comment =~ s/(^|
)\s*(\>\;.*?|>.*?)
/$1$2<\/font>
/g; } # 自動リンク if ($autolink) { &auto_link($comment); } if( $articlelink ){ $comment = &LinkNumber( $comment, $no ); } if ($imgpoint == 1) { $ipt="align=left hspace=18"; } else { $ipt=""; print "$comment"; } # 添付ファイルが存在する場合 if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { if ($ImageCheck && $chk != 1) { print "

\n"; } else { ( $pic_format, $pic_width, $pic_height ) = &GetImageSize( "$imgdir$no$tail" ); if( $pic_width > 0 && $pic_height > 0 ){ @file_size = stat( "$imgdir$no$tail" ); $file_size = $file_size[7]; $file_size = int( $file_size / 1000 ); $file_size =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; } $thumbfile = "$thumburl$no\.jpg"; if( -e "$thumbdir$no\.jpg" ){ $picfile = $thumbfile; }else{ $picfile = "$imgurl$no$tail"; } if( $tail eq '.gif' && $GifThumbnail ){ $picfile = "$imgurl$no$tail"; } if ($w && $h) { $wh="width=$w height=$h"; } else { $wh=""; } if( $Histogram ){ $hist = "ヒストグラム
"; }else{ $hist = ''; } # 画像の下に文字をいれる場合次の行のコメントをはずす # print "

\n"; if( substr( $ImageLink, -2, 1 ) == 1 ){ print "

$hist\n"; }else{ print "

$hist\n"; } # 画像の下に文字を入れる場合次の2行のコメントを外し、適当な言葉を埋める # print "

【丸見え保障】厳選動画でムスコぴんこ立ち♪我らが性器の味方カリビアンコム

\n"; # print "
\n"; } } elsif ($tail) { @file_size = stat( "$imgdir$no$tail" ); $file_size = $file_size[7]; $File_size = $file_size; $file_size = int( $file_size / 1000 ); $file_size =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print "

Download:$no$tail $no$tail ($file_size kB) \ \;\n"; } if( $tail eq ".jpg" && $ExifInfo ){ unless( ( $ImageCheck && $chk != 1 ) ){ $etab = ''; $etab = &ExifTable( "$imgdir$no$tail", $ExifTableCol, $ExifLang, $pic_width, $pic_height ); print "$etab"; } }elsif( $tail eq '.mp3' && $MP3Info ){ open( MP3, "$imgdir$no$tail" ); ( $mp3_err, $mp3_id3_version, $mp3_track_name, $mp3_artist_name, $mp3_album_name, $mp3_year, $mp3_comment, $mp3_genre ) = &check_id3_tag( 'MP3' ); &jcode'convert( \$mp3_track_name, $code ); &jcode'convert( \$mp3_artist_name, $code ); &jcode'convert( \$mp3_album_name, $code ); &jcode'convert( \$mp3_comment, $code ); &jcode'convert( \$mp3_genre, $code ); if( $mp3_artist_name ne '' ){ print "$mp3_track_name ( $mp3_artist_name )
\n"; # トラック時間の表示もしたい場合は上の print をコメントして # 以下の行のコメントをはずす # seek( MP3, 0, 0 ); # ( $mp3_err, $mp3_mpeg_version, $mp3_bit_rate, # $mp3_sample_rate, $mp3_total_time ) # = &mpeg_audio_info( 'MP3', $File_size ); # $mp3_minute = int($mp3_total_time / 60); # $mp3_second = sprintf("%02d",$mp3_total_time - $mp3_minute * 60); # print "$mp3_track_name ( $mp3_artist_name ) [$mp3_minute\:$mp3_second]
\n"; } close( MP3 ); } if( $ImageInfo == 1 && ( $tail eq '.gif' || $tail eq '.jpg' || $tail eq '.png' ) ){ if( $etab ){ $pic_width = -1; $pic_height = -1; } if( $pic_width > 0 && $pic_height > 0 ){ @file_size = stat( "$imgdir$no$tail" ); $file_size = $file_size[7]; $file_size = int( $file_size / 1000 ); $file_size =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print "$pic_width x $pic_height ($file_size kB)

\n"; } } if ( $imgpoint == 1 && ( $tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png" ) ) { ( $ForceReturn || $etab ) and ( print "

" ); } print "$comment
" if ($imgpoint == 1); if (!$reno) { print "

\n"; } print "
\n"; } close(IN); # トラックバックの表示 if( $TrackBack ){ if( $TrackBackExist ){ # print "
\n$TrackBackExist\n"; print "$TrackBackExist\n"; } } print "
\n"; $next = $page + $p_log; $back = $page - $p_log; $p_flag=0; if( !$viewonly ){ print "

\n"; print ""; if ($back >= 0) { $p_flag=1; print "\n"; } if ($next < $i) { $p_flag=1; print "\n"; } # ページ移動ボタン表示 if ($p_flag) { print "\n"; } print "
[ページトップ]
\n"; print "\n"; print "
\n"; print "\n"; print "
\n"; if( $PageLinkButton != 0 ){ print "
\n"; print "\n"; print "
\n"; } print "
\n"; }else{ print "
\n"; print "[ページトップ]\n"; print "[掲示板トップ]\n"; if( !$ppage || $thread == $article[0] ){ print "[前の記事]\n"; }else{ print "[前の記事]\n"; } if( !npage || $thread == $article[$article-1] ){ print "[次の記事]\n"; }else{ print "[次の記事]\n"; } print "
\n"; } # 投稿フォーム ( $voteform == 2 && !$viewonly ) and ( &form() ); print "
\n"; unless( $viewmode ){ print "
\n"; print "- 以下のフォームから自分の投稿記事を修正・削除することができます -
\n"; print "処理 \n"; print "記事No \n"; print "暗証キー \n"; print "
\n"; } # 著作権表示部(削除改変不可) print "$banner2

\n"; print "\n"; print "- Joyful Note -\n"; print "
(joyfulexif $joyfulexif_ver by cachu)\n"; print "

\n\n\n"; unless( $StaticMode ){ exit; } } #------------------------------------------------- # 投稿記事受付 #------------------------------------------------- sub regist { local($top,$ango,$f,$match,$tail,$W,$H,@lines,@new,@tmp); my ( $blacklist, $keyword, $bl, $dummy ); # スクリプト投稿のチェック &error( '不正な投稿です' ) unless ( $je_vote == 1 ); # GET 方法及び HTTP_REFERER が SCRIPT_NAME と異なる時の投稿はエラー if( $SecurityCheck ){ if( $SecurityCheck == 1 ){ if( $ENV{'REQUEST_METHOD'} eq 'GET' ){ &header; &error( '許されない行動です' ); } }elsif( $SecurityCheck == 2 ){ if( $ENV{'REQUEST_METHOD'} eq 'GET' || $ENV{'HTTP_REFERER'} !~ $ENV{'SCRIPT_NAME'} ){ &header; &error( '許されない行動です' ); } } } if( $CookieIfVote ){ unless( $je_auth ){ &error( 'クッキーを有効にしてください' ); } } # 過剰なリンクの禁止 my $URLNums = ( $in{'comment'} =~ s/http/http/ig ); if( $URLNums > 0 && $URLNums >= $MaxURLNums ){ &error( '不正な投稿です' ); } # コメントに URL 欄と同じ URL がある投稿の拒否 if( $in{'url'} ne '' && $ComentMatchURL ){ if( "$in{'comment'}/" =~ /$in{'url'}/i ){ &error( '不正投稿です' ); } } # 名前とタイトルが同じな投稿の拒否 if( $NameMatchSUb ){ if( $in{'name'} =~ /$in{'sub'}/ || $in{'sub'} =~ /$in{'name'}/ ){ &error( '不正な投稿です' ); } } # コメントの文字コードチェック my $c_code = &jcode::getcode( \$in{'comment'} ); if( $CommentCode == 1 ){ if( $c_code ne 'jis' && $c_code ne 'euc' && $c_code ne 'sjis' ){ &error( '不正な投稿です' ); } }elsif( $CommentCode == 2 ){ if( $c_code eq 'jis' || $c_code eq 'euc' || $c_code eq 'sjis' ){ &error( '不正な投稿です' ); } } # BlackList チェック if( $BlackListCheck ){ if( $BLACKLIST_AFILE ){ my @JE_Auth = (); my ( $i, $nauth, $auth_name ); ( $lockkey ) and ( &lock ); if( $JE_AuthID{$je_auth} ){ $JE_AuthID = $je_auth; }else{ $JE_AuthID = ''; } open( JEA, $BLACKLIST_AFILE ); my %AuthCount = (); while( ){ push( @JE_Auth, $_ ); my @AuthList = split( /<>/, $_ ); if( $AuthList[4] ){ $AuthCount{$AuthList[2]} += $AuthList[4]; }else{ $AuthCount{$AuthList[2]}++; } } $nauth = @JE_Auth; close( JEA ); open( JEA, ">$BLACKLIST_AFILE" ); $auth_name = $in{name}; &jcode::convert( \$auth_name, 'euc' ); $AuthCount{$je_auth}++; printf JEA ( "%d<>%s<>%s<>%s<>%d\n", time, $auth_name, $je_auth, $je_auth_time, $AuthCount{$je_auth} ); my $nline = 0; for( $i = 0; $i < $nauth ; $i++ ){ my @AuthList = split( /<>/, $JE_Auth[$i] ); next if( $AuthList[2] eq $je_auth ); next if( time > $AuthList[0] + $member_expire ); print JEA $JE_Auth[$i]; $nline++; last if( $nline == $KeepUserIDs ); } close( JEA ); ( $lockkey ) and ( &unlock ); } foreach $blacklist ( keys %BlackList ){ next unless( $BlackList{$blacklist} ); $bl = 'BLACKLIST_' . $blacklist; unless( @{$bl} ){ $$bl[0] = '__unchecked__'; } foreach $keyword ( @{$bl} ){ $dummy = $in{$BlackList{$blacklist}}; &jcode::convert( \$dummy, 'euc' ); $keyword =~ s/^([\*\?\+\{])/\\$1/g; $keyword =~ s/\\\\/\\/g; foreach my $key_common ( @{BLACKLIST_URL} ){ $key_common =~ s/^([\*\?\+\{])/\\$1/g; $key_common =~ s/\\\\/\\/g; $key_common =~ s/http:\/\///ig; if( $dummy =~ /$key_common/i ){ $keyword = $key_common; last; } } # チェックに引っ掛かった場合 if( $dummy =~ /$keyword/i || $JE_AuthID ne '' ){ &header; print "

\n"; print "

投稿は正常に処理されました

\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "
\n"; print "
\n\n"; if( $TEMPORARY_DENY ){ ( $lockkey ) and ( &lock ); open( BL, $BlackListIP ); while( ){ chomp; next if( /^\#/ ); next unless( /\S/ ); /(\S+)\s*(\d+)/; next if( time - $2 > $TEMPORARY_TIME ); push( @BLackListOut, $_ ); } close( BL ); $BlackListOut = sprintf( "%s\t%s", $ENV{REMOTE_ADDR}, time ); push( @BlackListOut, $BlackListOut ); open( BL, ">$BlackListIP" ); foreach $BlackListOut ( @BlackListOut ){ print BL "$BlackListOut\n"; } close( BL ); ( $lockkey ) and ( &unlock ); } if( $BLACKLIST_LOG ){ ( $lockkey ) and ( &lock ); $dummy = $in{name}; if( $JE_AuthID ne '' ){ $keyword = $JE_AuthID; } &jcode::convert( \$dummy, 'euc' ); open( BLOG, "$BLACKLIST_LFILE" ); my @BLACKLIST_LFILE = (); my $nBlackListLog = 0; while( ){ push( @BLACKLIST_LFILE, $_ ); $nBlackListLog++; last if( $nBlackListLog == $KeepLogs ); } close( BLOG ); open( BLOG, ">$BLACKLIST_LFILE" ); printf BLOG ( "%s\t%d\t%s\t%s\n", $ENV{REMOTE_ADDR}, time, $dummy, $keyword ); foreach my $LogData ( @BLACKLIST_LFILE ){ print BLOG $LogData; } close( BLOG ); ( $lockkey ) and ( &unlock ); } exit; } } } } # フォーム入力チェック &form_check; # 禁止ワードチェック if ($deny_word) { &deny_word($in{'name'}); &deny_word($in{'comment'}); } # 時間を取得 &get_time; # クッキーを発行 &set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'},$in{'icon'},$in{'color'}); # トリップの作成 if( $Trip ){ my $TripSalt = 'Je'; $in{name} =~ s/◆.*$//; if( $in{name} =~ /\#([^\#]+)$/ ){ my $TripWord = $1; $TripSalt = substr( $TripWord, 0, 2 ); if( length( $TripWord ) < 3 || $TripSalt =~ /[^.\/0-9A-Za-z]/ ){ $in{name} =~ s/\#([^\#]+)$//; }else{ my $TripCrypt = crypt( $TripWord, $TripSalt ); $TripCrypt = substr( $TripCrypt, -10 ); $in{name} =~ s/\#$TripWord/◆$TripCrypt/; } } } # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error: $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); local($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($addr eq $ip && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 削除キーを暗号化 if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } # ファイル添付処理 if ($in{'upfile'}) { ($tail,$W,$H) = &upload; } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail2,$w,$h,$chk) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } else { if ($pastkey) { push(@data,$_); } if (-e "$imgdir$no2$tail2") { unlink("$imgdir$no2$tail2"); } if( -e "$thumbdir$no2\.jpg" ){ unlink( "$thumbdir$no2\.jpg" ); } if( $TrackBack ){ ( -e "$imgdir$no2\_tb.txt" ) and unlink( "$imgdir$no2\_tb.txt" ); } } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if ($data[0]) { &pastlog; } # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートあり } elsif ($in{'reno'} && $topsort) { $f=0; $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; push(@new,$_); } elsif ($in{'reno'} eq $reno2) { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($f || !$match) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートなし } else { $f=0; $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } push(@new,$_); } if ($f || !$match) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); } # ロック解除 if ($lockkey) { &unlock; } # メール処理 if ($mailing == 1 && $in{'email'} ne $mailto) { &mail_to; } elsif ($mailing == 2) { &mail_to; } # トラックバック送信 if( $TrackBack ){ eval { $TBK = eval 'use Net::Trackback; 1' ? 1 : 0; $TBP = eval 'use Net::Trackback::Ping; 1' ? 1 : 0; $TBC = eval 'use Net::Trackback::Client; 1' ? 1 : 0; $TBM = eval 'use Net::Trackback::Message; 1' ? 1 : 0; $TBS = eval 'use Net::Trackback::Server; 1' ? 1 : 0; $JCD = eval 'use Jcode; 1' ? 1 : 0; if( $TBK && $JCD ){ my $BlogName = $title; my $Message = $in{comment}; my $Title = $in{sub}; my $URL = $ScriptURL; my @TB_URL = split( /\s+/, $in{tb} ); if( $in{reno} ){ $URL .= "\?thread=$in{reno}\#$no"; }else{ $URL .= "\?thread=$no"; } ( $Message, my $Message_rest ) = fold( $Message, 128 ); $Message .= " ..."; Jcode::convert( \$BlogName, 'utf-8' ); Jcode::convert( \$Message , 'utf-8' ); Jcode::convert( \$Title , 'utf-8' ); my $ping = new Net::Trackback::Ping; $ping->title( $Title ); $ping->url( $URL ); $ping->excerpt( $Message ); $ping->blog_name( $BlogName ); foreach my $TB_URL ( @TB_URL ){ $ping->ping_url( $TB_URL ); my $client = new Net::Trackback::Client; my $msg = new Net::Trackback::Message; my $return = $client->send_ping( $ping ); $msg->message( $return ); } } }; } # 静的 HTML(トップページ) の作成 if( $StaticHTML ){ $StaticError = 0; open( SHM, ">$StaticHTML" ) || ( $StaticError = 1 ); if( $StaticError == 0 ){ select( SHM ); $StaticMode = 1; &PageSetup; ( $StaticForm == 2 ) ? ( &list_title ) : ( &html_log ); $StaticMode = 0; select( STDOUT ); } } # RSS ファイルの更新 ( $RSS ) and ( system( $RSS_exec ) ); # リロード if ($location) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $location?\n\n"; } else { &header; print "

\n"; print "

投稿は正常に処理されました

\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "
\n"; print "
\n\n"; } exit; } #------------------------------------------------- # 画像アップロード #------------------------------------------------- sub upload { local($macbin,$fname,$flag,$upfile,$imgfile,$tail,$W,$W2,$H,$H2); my ( $pic_format, $thumbfile, $rotate, %ExifInfo ); my $quality = ''; $rotate = 0; # 画像処理 $macbin=0; foreach (@in) { if (/(.*)Content-type:(.*)/i) { $tail=$2; } if (/(.*)filename=\"(.*)\"/i) { $fname=$2; } if (/application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; # ファイル形式を認識 $flag=0; if ($tail =~ /image\/gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /image\/p?jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($tail =~ /image\/x-png/i && $png) { $tail=".png"; $flag=1; } if ($tail =~ /text\/plain/i && $text) { $tail=".txt"; $flag=1; } if ($tail =~ /lha/i && $lha) { $tail=".lzh"; $flag=1; } if ($tail =~ /zip/i && $zip) { $tail=".zip"; $flag=1; } if ($tail =~ /pdf/i && $pdf) { $tail=".pdf"; $flag=1; } if ($tail =~ /audio\/.*mid/i && $midi) { $tail=".mid"; $flag=1; } if ($tail =~ /msword/i && $word) { $tail=".doc"; $flag=1; } if ($tail =~ /ms-excel/i && $excel) { $tail=".xls"; $flag=1; } if ($tail =~ /ms-powerpoint/i && $ppt) { $tail=".ppt"; $flag=1; } if ($tail =~ /audio\/.*realaudio/i && $ram) { $tail=".ram"; $flag=1; } if ($tail =~ /application\/.*realmedia/i && $rm) { $tail=".rm"; $flag=1; } if ($tail =~ /video\/.*mpeg/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($tail =~ /audio\/.*mpeg/i && $mp3) { $tail=".mp3"; $flag=1; } if (!$flag) { if ($fname =~ /\.gif$/i && $gif) { $tail=".gif"; $flag=1; } if ($fname =~ /\.jpe?g$/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($fname =~ /\.png$/i && $png) { $tail=".png"; $flag=1; } if ($fname =~ /\.lzh$/i && $lha) { $tail=".lzh"; $flag=1; } if ($fname =~ /\.txt$/i && $text) { $tail=".txt"; $flag=1; } if ($fname =~ /\.zip$/i && $zip) { $tail=".zip"; $flag=1; } if ($fname =~ /\.pdf$/i && $pdf) { $tail=".pdf"; $flag=1; } if ($fname =~ /\.mid$/i && $midi) { $tail=".mid"; $flag=1; } if ($fname =~ /\.doc$/i && $word) { $tail=".doc"; $flag=1; } if ($fname =~ /\.xls$/i && $excel) { $tail=".xls"; $flag=1; } if ($fname =~ /\.ppt$/i && $ppt) { $tail=".ppt"; $flag=1; } if ($fname =~ /\.ram$/i && $ram) { $tail=".ram"; $flag=1; } if ($fname =~ /\.rm$/i && $rm) { $tail=".rm"; $flag=1; } if ($fname =~ /\.mpe?g$/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($fname =~ /\.mp3$/i && $mp3) { $tail=".mp3"; $flag=1; } } # アップロード失敗処理 if (!$flag || !$fname) { if (!$clip_err) { return; } else { &error("アップロードできません"); } } $upfile = $in{'upfile'}; # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 添付データを書き込み $imgfile = "$imgdir$no$tail"; open(OUT,">$imgfile") || &error("アップロード失敗"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666, $imgfile); # サムネイル画像作成プログラムのチェック # ( $ThumbMake != 0 ) and ($ThumbMake = &ImgResize::Init( $ThumbMake ) ); # 画像サイズ取得 # if ($tail eq ".jpg") { ($W, $H) = &JpegSize($imgfile); } # elsif ($tail eq ".gif") { ($W, $H) = &GifSize($imgfile); } # elsif ($tail eq ".png") { ($W, $H) = &PngSize($imgfile); } if( $tail eq '.jpg' || $tail eq '.gif' || $tail eq '.png' ){ ( $pic_format, $W, $H ) = &GetImageSize( $imgfile ); ( $in{rotate} ) and ( $rotate = $in{rotate} ); ( $W < 0 ) and ( $W = '' ); ( $H < 0 ) and ( $H = '' ); } # 画像表示縮小 if ($W > $MaxW || $H > $MaxH) { $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } # サムネイルの作成 if( $ThumbMake > 0 && $W && $H ){ $thumbfile = "$thumbdir$no\.jpg"; if( abs( $rotate ) != 90 ){ &ImgResize::Resize( $ThumbMake, $W, $H, $ThumbQuality, $tail, $imgfile, $thumbfile, 1, $rotate, $jpeg_prog, $png_prog, $gif_prog ); }else{ &ImgResize::Resize( $ThumbMake, $H, $W, $ThumbQuality, $tail, $imgfile, $thumbfile, 1, $rotate, $jpeg_prog, $png_prog, $gif_prog ); } } if( abs( $rotate ) == 90 ){ return ( $tail, $H, $W ); }else{ return ($tail,$W,$H); } } #------------------------------------------------- # 返信フォーム #------------------------------------------------- sub res_form { local($f,$no,$reno,$date,$name,$mail,$sub,$com,$url); my ( $textarea, @rno, %rno ); my ( $ArticleNum, $PicNum ); $ArticleNum = 0; $PicNum = 0; # ヘッダを出力 &header; @rno = split( /\D/, $in{'rno'} ); foreach $rno ( @rno ){ if( $rno ne '' ){ $rno{$rno} = 1; } } # ログを読み込み $f=0; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; # 関連記事出力 print "[戻る]\n"; # print "[戻る]

\n"; print "- 以下は、記事NO. $in{'no'} に関する 返信フォーム です -
\n"; print "

引用をしたい場合、記事番号隣りのチェックをして、投稿フォーム前の送信ボタンを押してください


\n"; print "
\n"; print "\n"; print "\n"; $flag=0; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url, $host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if( $in{'no'} == $no || $in{'no'} == $reno ){ $ArticleNum++; if( $tail eq '.gif' || $tail eq '.jpg' || $tail eq '.png' ){ $PicNum++; } } ( $rno{$no} ) and ( $textarea .= ">\;>\;$no
$com\n\n" ); if (!$reno) { $com = "
$com
"; } if ($in{'no'} == $no && $reno) { $f++; } if ($in{'no'} == $no || $in{'no'} == $reno) { if ($in{'no'} == $no) { $resub = $sub; } if ($url) { $url = "<HOME>"; } if ($reno && !$flag) { print "
\n"; $flag=1; } print "$sub 投稿者:$name 投稿日:$date $url No.$no$ArticleNew{$no}"; print "
$com

\n"; } } close(IN); if ($f) { &error("不正な返信要求です"); } if ($flag) { print "

\n"; } print "
\n"; # タイトル名 if ($resub !~ /^Re\:/) { $resub = "Re\: $resub"; } if( $textarea ){ $textarea =~ s/
/\n>\;/g; } print "\n"; print "
チェックをした記事の引用をする"; print "
\n"; if( $MaxArticleInThread > 0 && $ArticleNum >= $MaxArticleInThread ){ print "

(注意: この投稿は返信記事制限のため新規投稿になります)

\n"; &form("","","","","","",$resub,$textarea,"","","",""); }elsif( $MaxPicInThread > 0 && $PicNum >= $MaxPicInThread ){ print "

(注意: 画像の投稿の際は新規に投稿して下さい)

\n"; &form("res2","","","","","",$resub,$textarea,"","","",""); }else{ &form("res","","","","","",$resub,$textarea,"","","",""); } print "\n\n"; exit; } #------------------------------------------------- # デコード処理 #------------------------------------------------- sub decode { local($key,$val); undef(%in); &ReadParse; while ( ($key,$val) = each(%in) ) { next if ($key eq "upfile"); # シフトJISコード変換 &jcode'convert(*val, $code, "", "z"); # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; # 改行処理 $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; $in{$key} = $val; } $mode = $in{'mode'}; $page = $in{'page'}; $in{'url'} =~ s/^http\:\/\///; if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } $show = $in{'show'}; if( $show eq '' ){ $show = $ShowMessages; } if( $show > 1 && $show <= $LastLinkNum ){ $LastLinkNum = $show - 1; } if( $in{'thread'} ){ $thread = $in{'thread'}; $viewonly = 1; $show = -1; }else{ $thread = -1; $viewonly = 0; } ( $in{email} eq 'sage' ) and ( $topsort = 0 ); ( $in{email} eq 'age' ) and ( $topsort = 1 ); } #------------------------------------------------- # 留意事項 #------------------------------------------------- sub howto { my ( $MesIfPutOnlyMember, $MesIfTrip, $MesIfNewMessage ); my ( $MesThumbNail ); $MesIfPutOnlyMember = ''; $MesIfTrip = ''; $MesIfNewMessage = ''; $MesThumbNail = ''; ( $PutOnlyMember ) and ( $MesIfPutOnlyMember = "
  • ファイルをアップロードするには [認証] ボタンよりユーザ認証を行ってください

    \n" ); ( $Trip ) and ( $MesIfTrip = "

  • トリップをつけるには「なまえ\#xxxxx」のように名前の後に \# をつけてから3文字以上の英数字を書いてください。最初の 2文字には記号を入れるとトリップはつきませんので注意して下さい。

    \n" ); ( $MessageNewTime > 0 ) and ( $MesIfNewMessage = "

  • $MessageNewTime 日以内に投稿された記事には $MessageNew が表\示されます。" ); if( $ThumbMake == 1 ){ $MesThumbNail = "
  • ImageMagick(Image::Magick) を用いたサムネイルの作成をします(回転対応)。

    \n"; }elsif( $ThumbMake == 2 ){ $MesThumbNail = "

  • gcon.exe(菅さん作) を用いたサムネイルの作成をします。

    \n"; }elsif( $ThumbMake == 3 ){ $MesThumbNail = "

  • ImageMagick(convert) を用いたサムネイルの作成をします(回転対応)。

    \n"; }elsif( $ThumbMake == 4 ){ $MesThumbNail = "

  • repng2jpg(菅さん作) を用いたサムネイルの作成をします。

    \n"; }elsif( $ThumbMake == 5 ){ $MesThumbNail = "

  • netpbm(*topnm/pnmscale/pnmtojpeg/pamflip) を用いたサムネイルの作成をします"; if( -x $ImgResize::pamflip ){ $MesThumbNail .= "(回転対応)"; } $MesThumbNail .= "

    \n"; }elsif( $ThumbMake == 99 ){ $MesThumbNail = "

  • ユーザ定義によるサムネイルの作成をします。

    \n"; }else{ $MesThumbNail = "

  • サムネイルの作成は行いません(縮小画像で表\示します)。

    \n"; } if ($in_email) { $eml_msg = "記事を投稿する上での必須入力項目は「おなまえ」「Eメール」「メッセージ」です。URL、題名、削除キーは任意です。"; } else { $eml_msg = "記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」です。Eメール、URL、題名、削除キーは任意です。"; } $maxkb = int ($cgi_lib'maxdata / 1024); if ($gif) { $FILE .= "GIF, "; } if ($jpeg) { $FILE .= "JPEG, "; } if ($png) { $FILE .= "PNG, "; } if ($text) { $FILE .= "TEXT, "; } if ($lha) { $FILE .= "LHA, "; } if ($zip) { $FILE .= "ZIP, "; } if ($pdf) { $FILE .= "PDF, "; } if ($midi) { $FILE .= "MIDI, "; } if ($word) { $FILE .= "WORD, "; } if ($excel) { $FILE .= "EXCEL, "; } if ($ppt) { $FILE .= "POWERPOINT, "; } if ($rm) { $FILE .= "RM, "; } if ($ram) { $FILE .= "RAM, "; } if ($mpeg) { $FILE .= "MPEG, "; } if ($mp3) { $FILE .= "MP3, "; } $FILE =~ s/\, $//; &header; print <<"HTML"; [掲示板にもどる]
    掲示板の利用上の注意

    1. この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)

    2. 画像などのバイナリーファイルをアップロードすることが可能\です。

      • 添付可能\ファイル : $FILE
      • 最大投稿データ量 : $maxkb KB
      • 画像は横$MaxWピクセル、縦$MaxHピクセルを超えると縮小表\示されます。

      $MesThumbNail

    3. 投稿内容には、タグは一切使用できません。

    4. $eml_msg

    5. Eメールに age と書くとスレッドの位置をトップへ移動します。これに対して sage と書くとスレッドの位置をそのままにします。

    6. 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。

    7. 記事において半角英数で No.25 または \>\;\>\;25のように書くと別記事 (例の場合 No.25 の記事) へのリンクを作成します。ただし、スレッド内の番号ではなく通し番号 (No. の部分)を指定してください。

    8. 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。

    9. 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。

    10. 既存の記事に「返信」をすることができます。各記事の上部にある「返信」ボタンを押すと返信用フォームが現れます。

    11. 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。

    12. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。

      $MesIfPutOnlyMember$MesIfTrip$MesIfNewMessage

    HTML exit; } #------------------------------------------------- # ワード検索処理 #------------------------------------------------- sub find { &header; print <<"EOM"; [掲示板に戻る]

    • 検索したいキーワードを入力し、「条件」「表\示」を選択して検索ボタンを押して下さい。
    • キーワードは「半角スペース」で区切って複数指定することができます。
    • 検索結果から記事へのリンクは別ウインドウにて単一スレッド表\示で行われます。

      キーワード: 条件:\n"; print "表\示:\n"; print "
      \n
    \n"; # ワード検索の実行と結果表示 if ($in{'word'} ne "") { # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); # 検索終了 $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; $enwd = &url_enc($in{'word'}); if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "[検索やり直し]\n"; foreach ($page .. $page_end) { ($no,$reno,$date,$name,$email,$sub,$com,$url) = split(/<>/, $new[$_]); if ($email) { $name = "$name"; } if ($url) { $url = "<HOME>"; } # if ($reno) { $no = "$renoへのレス"; } if( !$reno ){ $no = "$no"; }else{ $no = "$reno へのレス"; } # 結果を表示 print "
    [$no] $sub"; print " 投稿者:$name 投稿日:$date $url
    \n"; print "
    $com
    \n"; } print "
    \n"; } print "\n"; exit; } #------------------------------------------------- # クッキー発行 #------------------------------------------------- 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: JoyfulNote=$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デコードして復元 foreach ( split(/<>/, $cook{'JoyfulNote'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); } #------------------------------------------------- # エラー処理 #------------------------------------------------- sub error { &unlock if ($lockflag); &header if (!$headflag); print "

    ERROR !

    \n"; print "$_[0]\n"; print "


    \n"; print "\n"; exit; } #------------------------------------------------- # 管理モード #------------------------------------------------- sub admin { if ($in{'pass'} eq "") { &header; print "

    パスワードを入力して下さい

    \n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "
    \n\n"; exit; } if ($in{'pass'} ne $pass) { &error("パスワードが違います"); } &header; print "[掲示板に戻る]\n"; if( -e $BlackListAdmin ){ print "[投稿制限の設定]\n"; } print "
    \n"; print "管理モード\n"; print "
    \n"; # トラックバック - 削除 if( $TrackBack && $in{tb} eq 'del' ){ @DEL = split(/\0/, $in{tbdel}); my %TBDelList = (); foreach my $tb_del ( @DEL ){ my @tb_del = split( /_/, $tb_del ); push( @{ $TBDelList->{$tb_del[0]} }, $tb_del ); } # ロック処理 if ($lockkey) { &lock; } foreach my $TBList ( keys %{ $TBDelList } ){ my @TB = (); my $tb_line; open( TB, "$imgdir/$TBList\_tb.txt" ); $tb_line = ; chomp( $tb_line ); push( @TB, $tb_line ); TB: while( ){ chomp; foreach my $TB ( @{ $TBDelList->{$TBList} } ){ my $TBcheck = $TB; $TBcheck =~ s/([^_]+)_([^_]+)_([^_]+)/$2<>$3/; ( /$TBcheck/ ) and ( next TB ); } push( @TB, $_ ); } close( TB ); # 更新 $tb_line = @TB; if( $tb_line == 1 ){ unlink( "$imgdir/$TBList\_tb.txt" ); }else{ open( TB, ">$imgdir/$TBList\_tb.txt" ); my $TBout = join( "\n", @TB ); print TB $TBout; close( TB ); } } # ロック解除 if( $lockkey ){ &unlock; } } # トラックバック - 設定 if( $TrackBack && $in{tb} ){ print "

    \n
      \n"; print "
    • トラックバックを削除する場合は「削除」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; print "
    \n
    \n"; print "
    "; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "
    \n"; print "
    "; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "
    \n"; my @TBList = <$imgdir/*_tb.txt>; foreach ( sort { $b cmp $a } @TBList ){ my $TB = $_; $TB =~ s/$imgdir\/(\d+)\_tb.txt/$1/; print "

    記事番号: $TB ($ArticleTitle{$TB})

    \n"; print "

    \n"; print "\n"; print "\n"; open( TB, $_ ); ; while( ){ chomp; my ( $tb_time, $tb_addr, $tb_name, $tb_comment, $tb_title, $tb_url ) = split( /<>/, $_ ); my ( $tb_min, $tb_hour, $tb_mday, $tb_mon, $tb_year, $tb_wday ) = ( localtime( $tb_time ) )[1..6]; $tb_id = $TB . '_' . $tb_time . '_' . $tb_addr; $tb_year += 1900; $tb_mon++; $tb_time = sprintf( "%04d/%02d/%02d", $tb_year, $tb_mon, $tb_mday ); print ""; print "\n"; } print "
    削除受信日タイトル送信元概要

    $tb_time$tb_title$tb_name$tb_comment
    \n"; print "


    \n"; } print "
    \n"; exit; } # 画像許可 if ($in{'chk'}) { @CHK = split(/\0/, $in{'chk'}); # ロック処理 if ($lockkey) { &lock; } # 許可情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$t,$w,$h,$chk) = split(/<>/); foreach $xx (@CHK) { if ($no eq $xx) { $_ = "$no<>$reno<>$d<>$n<>$m<>$s<>$com<>$u<>$ho<>$p<>$c<>$t<>$w<>$h<>1<>\n"; last; } } push(@new,$_); } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 削除処理 if ($in{'del'}) { @DEL = split(/\0/, $in{'del'}); # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { $flag=0; ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail,$w,$h,$chk) = split(/<>/); foreach $del (@DEL) { if ($no eq $del || $reno eq $del) { if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); } if( -e "$thumbdir$no\.jpg" ){ unlink("$thumbdir$no\.jpg"); } if( $TrackBack ){ ( -e "$imgdir$no\_tb.txt" ) and unlink( "$imgdir$no\_tb.txt" ); } $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 静的ページの更新 if( $StaticHTML ){ $StaticError = 0; open( SHM, ">$StaticHTML" ) || ( $StaticError = 1 ); if( $StaticError == 0 ){ select( SHM ); $StaticMode = 1; &PageSetup; ( $StaticForm == 2 ) ? ( &list_title ) : ( &html_log ); $StaticMode = 0; select( STDOUT ); } } # RSS ファイルの作成 ( $RSS ) and ( system( $RSS_exec ) ); # 管理を表示 if ($page eq "") { $page = 0; } print "

    \n
      \n"; print "
    • 記事を削除する場合は「削除」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; print "
    • 画像許可を行なう場合は「画像許可」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; print "
    \n
    \n"; if( $TrackBack ){ print "
    "; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "
    \n"; print "
    "; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "\n"; if( $TrackBack ){ print "
    \n"; } print "

    \n"; print ""; print ""; print "\n"; $line=9; if ($ImageCheck) { print ""; $line=10; } print "\n"; open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; $i=0; while () { $img_flag=0; ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($mail) { $name="$name"; } ($date) = split(/\(/, $date); if ($url) { $url = "<Home>"; } else { $url = '-'; } $com =~ s/
    //ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if (-e "$imgdir$no$tail") { if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { $img_flag = 1; $File = "画像"; } else { $File = "File"; } $clip = "$File"; $size = -s "$imgdir$no$tail"; $all += $size; } else { $clip = ""; $size = 0; } if ($reno eq "") { print "
    \n"; } # チェックボックス print ""; print ""; print ""; print ""; print "\n"; # 画像許可 if ($ImageCheck) { if ($img_flag == 1 && $chk == 1) { print ""; } elsif ($img_flag == 1 && $chk != 1) { print ""; } else { print ""; } } print "\n"; } close(IN); print "\n"; print "
    削除記事NO投稿日タイトル投稿者URLコメントホスト名画像
    (bytes)
    画像
    許可

    $no$date$sub$name$url$com$host$clip
    ($size)
    OK

    \n"; $all = int ($all / 1024); print "【添付データ総数 : $all KB】\n"; print "

    \n"; print "\n"; exit; } #------------------------------------------------- # ユーザ記事削除 #------------------------------------------------- sub usr_del { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { if( $in{'pwd'} eq $pass ){ $match = "yes"; }else{ if ($pw eq '') { &error("該当記事には削除キーが設定されていません"); } # 削除キーを照合 $match = &decrypt("$in{'pwd'}","$pw"); } if ($match ne 'yes') { &error("削除キーが違います"); } # 添付ファイル削除 if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); } if( -e "$thumbdir$no\.jpg" ){ unlink( "$thumbdir$no\.jpg" ); } if( $TrackBack ){ ( -e "$imgdir$no\_tb.txt" ) and unlink( "$imgdir$no\_tb.txt" ); } if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq $reno) { if (-e "$imgdir$no$tail") { unlink("$imgdir$no$tail"); } if( -e "$thumbdir$no\.jpg" ){ unlink( "$thumbdir$no\.jpg" ); } if( $TrackBack ){ ( -e "$imgdir$no\_tb.txt" ) and unlink( "$imgdir$no\_tb.txt" ); } next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } # 静的ページの更新 if( $StaticHTML ){ $StaticError = 0; open( SHM, ">$StaticHTML" ) || ( $StaticError = 1 ); if( $StaticError == 0 ){ select( SHM ); $StaticMode = 1; &PageSetup; ( $StaticForm == 2 ) ? ( &list_title ) : ( &html_log ); $StaticMode = 0; select( STDOUT ); } } # RSS ファイルの作成 ( $RSS ) and ( system( $RSS_exec ) ); } #------------------------------------------------- # 記事修正処理 #------------------------------------------------- sub usr_edt { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたはパスワードが入力モレです"); } if ($in{'action'} eq "edit") { # フォーム入力チェック &form_check; # 禁止ワードチェック if ($deny_word) { &deny_word($in{'name'}); &deny_word($in{'comment'}); } # ロック処理 &lock if ($lockkey); } $flag=0; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($in{'no'} == $no) { $pw2 = $pw; $flag=1; if ($in{'action'} ne "edit") { last; } else { $_ = "$no<>$reno<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pw<>$in{'color'}<>$tail<>$w<>$h<>$chk<>\n"; } } if ($in{'action'} eq "edit") { push(@new,$_); } } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if( $in{'pwd'} ne $pass ){ if ($pw2 eq "") { &error("パスワードが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); }else{ $check = "yes"; } if ($check ne "yes") { &error("パスワードが違います"); } if ($in{'action'} eq "edit") { unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); &unlock if ($lockkey); if ($in{'url'}) { $in{'url'} = "http://$in{'url'}"; } if ($in{'email'}) { $in{'email'} = "$in{'email'}"; } # 静的ページの更新 if( $StaticHTML ){ $StaticError = 0; open( SHM, ">$StaticHTML" ) || ( $StaticError = 1 ); if( $StaticError == 0 ){ select( SHM ); $StaticMode = 1; &PageSetup; ( $StaticForm == 2 ) ? ( &list_title ) : ( &html_log ); $StaticMode = 0; select( STDOUT ); } } # RSS ファイルの作成 ( $RSS ) and ( system( $RSS_exec ) ); &header; print "

    - 以下のとおり修正が完了しました -

    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    名前$in{'name'}
    e-mail: $in{'email'}
    題名$in{'sub'}
    URL: $in{'url'}
    \n"; print "
    $in{'comment'}\n"; print "
    \n"; print "
    \n"; print "
    \n"; print "\n\n"; exit; } $com =~ s/
    /\r/g; &header; print "[戻る]\n"; print "

    - 変更する部分のみ修正して送信ボタンを押して下さい -
    \n"; &form("edit",$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color); print "\n\n"; exit; } #------------------------------------------------- # フォーム入力チェック #------------------------------------------------- sub form_check { # 他サイトからのアクセスを排除 if ($base_url) { $baseUrl =~ s/(\W)/\\$1/g; $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref && $ref !~ /$base_url/i) { &error("不正なアクセスです"); } } # methodプロパティはPOST限定 if ($ENV{'REQUEST_METHOD'} ne 'POST') { &error("不正な投稿です"); } # 入力項目のチェック if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in_email) { if ($in{'email'} eq "") { &error("Eメールが入力されていません"); } elsif ($in{'email'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { &error("Eメールの入力内容が不正です"); } } # 不正な投稿のチェック if( $hidden_check ){ if( $in{$hidden_word} ){ my ( $sec, $min, $hour, $mday, $mon, $year, $wday ) = localtime; $hidden_id = sprintf( "%02d%02d%s", $mon, $mday, substr( $hidden_plus, 0, 4 ) ); my $check = &decrypt( $hidden_id, $in{$hidden_word} ); unless( $check eq 'yes' ){ &error( "ブラウザの「戻る」で戻った後、リロードしてから再び投稿をして下さい" ); } }else{ &error( "不正な投稿です" ); } } } #------------------------------------------------- # 時間を取得 #------------------------------------------------- sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; ($min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[1..6]; @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } #------------------------------------------------- # カウンタ処理 #------------------------------------------------- sub counter { local($count, $cntup, @count); # 閲覧時のみカウントアップ if ($mode eq '') { $cntup = 1; } else { $cntup = 0; } ( $mode eq 'list' ) and ( $cntup = 1 ); # カウントファイルを読みこみ open(LOG,"+< $cntfile") || &error("Open Error: $cntfile"); eval "flock(LOG, 2);"; $count = ; # IPチェックとログ破損チェック local($cnt, $ip) = split(/:/, $count); if ($addr eq $ip || $cnt eq "") { $cntup = 0; } # カウントアップ if ($cntup) { $cnt++; truncate(LOG, 0); seek(LOG, 0, 0); print LOG "$cnt:$addr"; } close(LOG); # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; } @cnts = split(//, $cnt); # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } } # テキストカウンタ表示 else { print "$cnt
    \n"; } } #------------------------------------------------- # ロック処理 #------------------------------------------------- sub lock { # 古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 30) { &unlock; } } local($retry) = 5; # 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 mail_to { local($mcom,$hp,$msub,$mbody); # メールタイトルを定義 $msub = &base64("[$title : $no] $in{'sub'}"); # 記事を復元 $mcom = $in{'comment'}; $mcom =~ s/
    /\n/g; $mcom =~ s/<//g; $mcom =~ s/"/"/g; $mcom =~ s/&/&/g; # URL情報 if ($in{'url'}) { $hp = "http://$in{'url'}"; } else { $hp = ""; } # メール本文を定義 $mbody = <\n" ); $style_file .= "\n"; if( $code eq 'euc' ){ $charset = 'EUC-JP'; }elsif( $code eq 'jis' ){ $charset = 'iso-2022-jp'; } ( !$StaticMode ) and ( print "Content-type: text/html\n\n" ); print <<"EOM"; ${style_file} $title EOM if ($bg) { print "\n"; } else { print "\n"; } } #------------------------------------------------- # 自動URLリンク #------------------------------------------------- sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; } #------------------------------------------------- # 過去ログ生成 #------------------------------------------------- sub pastlog { local($past_flag)=0; # 過去NOを開く open(NO,"$nofile") || &error("Open Error : $nofile"); $count = ; close(NO); # 過去ログのファイル名を定義 $pastfile = "$pastdir$count\.dat"; # 過去ログを開く open(IN,"$pastfile") || &error("Open Error : $pastfile"); @past = ; close(IN); # 規定の行数をオーバーすると次ファイルを自動生成 if ($#past > $log_line) { $past_flag=1; # カウントファイル更新 $count++; open(NO,">$nofile") || &error("Write Error : $nofile"); print NO $count; close(NO); $pastfile = "$pastdir$count\.dat"; @past=(); } @temp=(); foreach (@data) { ($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho) = split(/<>/); if ($pmail) { $pname = "$pname"; } if ($purl) { $purl = "<HOME>"; } if ($preno) { $pno = "Res: $preno"; } # 保存記事をフォーマット push(@temp,"


    [$pno] $psub 投稿者:$pname 投稿日:$pdate $purl
    $pcom
    \n"); } # 過去ログを更新 unshift(@past,@temp); open(OUT,">$pastfile") || &error("Write Error : $pastfile"); print OUT @past; close(OUT); if ($past_flag) { chmod(0666,$pastfile); } } #------------------------------------------------- # 過去ログ #------------------------------------------------- sub past { open(IN,"$nofile") || &error("Open Error : $nofile"); $pastno = ; close(IN); if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; } &header; print <<"EOM"; [掲示板に戻る]
    過去ログ[$in{'pastlog'}]

    \n"; print "\n"; print "
    過去ログ:\n
    \n"; print "
    \n"; print "\n"; print "\n"; print "ワード検索:\n"; print "条件:\n"; print "表\示:\n
    \n"; # 表示ログを定義 $in{'pastlog'} =~ s/\D//g; $file = "$pastdir$in{'pastlog'}\.dat"; # ワード検索処理 if ($in{'word'} ne "") { $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); @new=(); open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; $enwd = &url_enc($in{'word'}); if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } # 表示開始 foreach ($page .. $page_end) { print $new[$_]; } print "


    \n\n"; exit; } # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; $i=0; open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; if ($_ =~ /^\\[\\d+\<\/b\>\]/) { $flag=1; $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($flag) { print $_; } else { $_ =~ s/
    //ig; print "
    $_
    \n"; } } close(IN); print "
    \n"; $next = $page + $p_log; $back = $page - $p_log; print "\n"; if ($back >= 0) { print "\n"; } if ($next < $i) { print "\n"; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n\n\n"; exit; } #------------------------------------------------- # チェックモード #------------------------------------------------- sub check { &header; print "

    Check Mode

    \n"; print "
      \n"; # ログパス if (-e $logfile) { print "
    • ログファイルのパス:OK\n"; # パーミッション if (-r $logfile && -w $logfile) { print "
    • ログファイルのパーミッション:OK\n"; } else { print "
    • ログファイルのパーミッション:NG\n"; } } else { print "
    • ログファイルのパス:NG → $logfile\n"; } # カウンタログ print "
    • カウンタ:"; if ($counter) { print "設定あり\n"; if (-e $cntfile) { print "
    • カウンタログファイルのパス:OK\n"; } else { print "
    • カウンタログファイルのパス:NG → $cntfile\n"; } } else { print "設定なし\n"; } # ロックディレクトリ print "
    • ロック形式:"; if ($lockkey == 0) { print "ロック設定なし\n"; } else { if ($lockkey == 1) { print "symlink\n"; } else { print "mkdir\n"; } ($lockdir) = $lockfile =~ /(.*)[\\\/].*$/; print "
    • ロックディレクトリ:$lockdir\n"; if (-d $lockdir) { print "
    • ロックディレクトリのパス:OK\n"; if (-r $lockdir && -w $lockdir && -x $lockdir) { print "
    • ロックディレクトリのパーミッション:OK\n"; } else { print "
    • ロックディレクトリのパーミッション:NG → $lockdir\n"; } } else { print "
    • ロックディレクトリのパス:NG → $lockdir\n"; } } # 画像ディレクトリ print "
    • 画像ディレクトリ:$imgdir\n"; if (-d $imgdir) { print "
    • 画像ディレクトリのパス:OK\n"; if (-r $imgdir && -w $imgdir && -x $imgdir) { print "
    • 画像ディレクトリのパーミッション:OK\n"; } else { print "
    • 画像ディレクトリのパーミッション:NG → $imgdir\n"; } } else { print "
    • 画像ディレクトリ:NG → $imgdir\n"; } # 過去ログ print "
    • 過去ログ:"; if ($pastkey == 0) { print "設定なし\n"; } else { print "設定あり\n"; # NOファイル if (-e $nofile) { print "
    • NOファイルパス:OK\n"; if (-r $nofile && -w $nofile) { print "
    • NOファイルパーミッション:OK\n"; } else { print "
    • NOファイルパーミッション:NG → $nofile\n"; } } else { print "
    • NOファイルのパス:NG → $nofile\n"; } # ディレクトリ if (-d $pastdir) { print "
    • 過去ログディレクトリパス:OK\n"; if (-r $pastdir && -w $pastdir && -x $pastdir) { print "
    • 過去ログディレクトリパーミッション:OK\n"; } else { print "
    • 過去ログディレクトリパーミッション:NG → $pastdir\n"; } } else { print "
    • 過去ログディレクトリパーミッション:NG → $pastdir\n"; } } print "
    \n\n"; exit; } #------------------------------------------------- # JPEGサイズ認識 #------------------------------------------------- sub JpegSize { local($jpeg) = @_; local($t, $m, $c, $l, $W, $H); open(JPEG,"$jpeg") || return (0,0); binmode JPEG; read(JPEG, $t, 2); while (1) { read(JPEG, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $t, 5); ($H, $W) = unpack("xnn", $t); last; } else { read(JPEG, $t, ($l - 2)); } } close(JPEG); return ($W, $H); } #------------------------------------------------- # GIFサイズ認識 #------------------------------------------------- sub GifSize { local($gif) = @_; local($data); open(GIF,"$gif") || return (0,0); binmode(GIF); sysread(GIF,$data,10); close(GIF); if ($data =~ /^GIF/) { $data = substr($data,-4); } $W = unpack("v",substr($data,0,2)); $H = unpack("v",substr($data,2,2)); return ($W, $H); } #------------------------------------------------- # PNGサイズ認識 #------------------------------------------------- sub PngSize { local($png) = @_; local($data); open(PNG, "$png") || return (0,0); binmode(PNG); read(PNG, $data, 24); close(PNG); $W = unpack("N", substr($data, 16, 20)); $H = unpack("N", substr($data, 20, 24)); return ($W, $H); } #------------------------------------------------- # URLエンコード #------------------------------------------------- sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; } #------------------------------------------------- # 投稿フォーム #------------------------------------------------- sub form { local($type,$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color) = @_; local($cnam,$ceml,$curl,$cpwd,$cico,$ccol); return if ( $viewmode ); print "
    \n"; ## フォーム種別を判別 # 修正 if ($type eq "edit") { print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; $cnam = $name; $ceml = $mail; $curl = $url; $ccol = $color; # 返信 } elsif ( $type eq "res" || $type eq "res2" ) { if ($res_clip) { print "\n"; } else { print "\n"; } print "\n"; print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; # 新規 } else { print "\n"; print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; } if( $hidden_check ){ my ( $sec, $min, $hour, $mday, $mon, $year, $wday ) = localtime; $hidden_id = sprintf( "%02d%02d%s", $mon, $mday, substr( $hidden_plus, 0, 4 ) ); $hidden_key = &encrypt( "$hidden_id" ); print "\n"; } print <<"EOM"; EOM # 添付フォーム if( $PutOnlyMember == 0 ){ if ($type eq "" || ($type eq "res" && $res_clip)) { print "\n"; # print "\n"; print "\n"; } } # パスワード欄 if ($type ne "edit") { print ""; print "\n"; } # 色指定 print "\n"; print "\n"; print " \n"; } print "
    おなまえ
    Eメール
    タイトル
    コメント
    URL
    添付File
    \n"; if( $ThumbMake == 1 || $ThumbMake == 3 || ( $ThumbMake == 5 && -x $ImgResize::pamflip ) ){ print " 回転: "; } print "
    暗証キー "; print "(英数字で8文字以内)
    文字色\n"; @col = split(/\s+/, $colors); if ($ccol eq "") { $ccol = $col[0]; } foreach (@col) { if ($ccol eq $_) { print "\n"; } else { print "\n"; } } # トラックバック送信 URL if( $TrackBack ){ print "
    Track Back
    \n"; if ($ImageCheck) { print "・画像は管理者が許可するまで「COMING SOON」のアイコンが表\示されます。
    \n"; } print "
    \n"; } #------------------------------------------------- # 禁止ワード #------------------------------------------------- sub deny_word { local($word) = @_; local($flg); foreach ( split(/,+/, $deny_word) ) { if (index($word,$_) >= 0) { $flg=1; last; } } if ($flg) { &error("不適切な投稿のため受理できません"); } } # # リンクのために一度ログを読み込む # sub PageSetup{ my ( $no, $reno, $date, $name, $mail, $sub, $comment, $url ); my ( $host, $pw, $color, $tail, $w, $h, $chk ); my ( $article, $top, $Anum ); my ( $min, $hour, $mday, $mon, $year, $wday ); my ( $ctime, $atime ); $ctime = $MessageNewTime * 60 * 60 * 24; @article = (); open( IN, $logfile ) || &error( "Open Error: $logfile" ); $top = ; while( ){ ( $no, $reno, $date, $name, $mail, $sub, $comment, $url, $host, $pw, $color, $tail, $w, $h, $chk ) = split(/<>/); if( !$reno ){ $article++; push( @article, $no ); $ArticleTitle{$no} = $sub; $ArticleName{$no} = $name; $ArticleDate{$no} = $date; $ArticleLatest{$no} = $date; $ArticleNameLatest{$no} = $name; $ArticlePages{$no} = $article - 1; $ArticleParent{$no} = $no; $Article{$no} = 1; $Anum = "Article$no"; @{$Anum} = (); if( $article > 1 ){ $ArticlePrev{$no} = $article[$article-2]; $ArticleNext{$article[$article-2]} = $no; } }else{ $ArticleLatest{$reno} = $date; $ArticleNameLatest{$reno} = $name; $Article{$reno}++; $ArticleParent{$no} = $reno; $Anum = "Article$reno"; } push( @{$Anum}, $no ); $date =~ /(\d\d\d\d)\/(\d\d)\/(\d\d)\(\S+\) (\d\d)\:(\d\d)/; $year = $1 - 1900; $mon = $2 - 1; $mday = $3; $hour = $4; $min = $5; $atime = timelocal( 0, $min, $hour, $mday, $mon, $year ); if( $ctime > 0 && time - $atime < $ctime ){ $ArticleNew{$no} = $MessageNew; }else{ $ArticleNew{$no} = ''; } $Page{$no} = int( ( $article - 1 ) / $p_log ) * $p_log; } $ArticlePrev{$article[0]} = $article[$article-1]; $ArticleNext{$article[$article-1]} = $article[0]; close(IN); } sub LinkNumber{ my ( $comment, $cno ) = @_; my ( $no, $re, $lpage ); my ( $Lnum, $LN ); my $gt = '>'; $_ = $comment; while( /No\.(\d*)/g ){ next if ( $Page{$1} eq '' ); $no = $1; $Lnum = "Article$ArticleParent{$no}"; $LN = @{ $Lnum }; if( $ShowMessages < 0 || ( $ShowMessages > 0 && $LN - $ShowMessages < 0 ) || ( $no == $$Lnum[0] || $no > $$Lnum[$LN-$ShowMessages] ) ){ if( $Page{$no} == $Page{$cno} ){ if( $in{thread} && $in{thread} != $$Lnum[0] ){ $lpage = "No.$no"; }else{ $lpage = "No.$no"; } }else{ $lpage = "No.$no"; } }else{ $lpage = "No.$no"; } $comment =~ s/No\.$no/$lpage/g; } $_ = $comment; while( /($gt$gt\s*)(\d+)/g ){ next if ( $Page{$2} eq '' ); $re = $1; $no = $2; $Lnum = "Article$ArticleParent{$no}"; $LN = @{ $Lnum }; if( $ShowMessages < 0 || ( $ShowMessages > 0 && $LN - $ShowMessages < 0 ) || ( $no == $$Lnum[0] || $no > $$Lnum[$LN-$ShowMessages] ) ){ if( $Page{$no} == $Page{$cno} ){ if( $in{thread} && $in{thread} != $$Lnum[0] ){ $lpage = "$re$no"; }else{ $lpage = "$re$no"; } }else{ $lpage = "$re$no"; } }