#!/usr/local/bin/perl # ############################################################# ### ### CGI掲示板(マルチリンガル掲示板) SDnote-Queen Ver. 2.0 ### ### (C) 2001 Sentora Dori ### http://www.lowpower.iis.u-tokyo.ac.jp/~hat ### ############################################################# # #################### 変数設定 #################### #----- セットファイルに依存しない変数 ----- # 掲示板データファイルをおくディレクトリのパス $bbsbasedir = "."; # セットファイルをおくディレクトリのパス $setbasedir = "."; # post: postメソッド get: getメソッド $method = 'post'; # 漢字コード(sjis or jis or euc) $kanjicode = 'sjis'; # 漢字ライブラリのファイル名 $jcodelib ='./jcode.pl'; # 1: ロックを使用する 0:使用しない $uselock =1; # このファイル名 $thisurl = 'SDnoteQ20.cgi'; $minpass = 4; $maxpass = 8; #----- セットファイルに依存する変数の初期値 ----- # 管理人の名前 (要変更) $mastername = "Sentora Dori"; # 管理人のE-mailアドレス (要変更) $adminmail = 'hat@iis.u-tokyo.ac.jp'; # 管理人のURL (要変更) $adminurl = 'http://www.sentora.co.jp/'; # 最初の言語の種類 0:Japanese 1:English $langnumber = 0; # 戻る先のURL (要変更) $ homeurl = '../../index.html'; # 掲示板のタイトル (要変更) @lang_title = ("道里千虎の掲示板 (Ver. 2.0)", "Sentora Dori's BBS (Ver. 2.0)"); # コメント @lang_comment = ("ご自由にお書きください。", "Please feel free to write."); # 1ページに表示される記事の数 $pagesize = 20; # ファイルに記録しておく記事の数 #(記事がこれ以上になると古いものから削除される。0に設定すると削除なし。) $maxarticle = 1000; # メッセージの最大の長さ $maxmessage = 5000; # 背景の色 $bgcolor = '#FFFF99'; # テキストの色 $textcolor = '#333333'; # 背景に埋め込む画像 $bgimage = ''; # 注意書きの文字の色 $notecolor = '#FF0000'; # テーブルの枠線の太さ #$tableborder = 0; # テーブルの背景色 #$tablecolor = ''; # 匿名の投稿者に対してつける名前 $anonymous = 'nanashi no gonbee'; # 1:名前の入力必須, 0:必要なし $needname = 1; # 1:題名の入力必須, 0:必要なし $needsubject =1; # 1:E-mailアドレスの入力必須, 0:必要なし $needmail = 0; # 1:削除用のパスワードの入力必須, 0:必要なし $needpass = 0; # 記事欄に投稿者のURLを表示する $showurl = 1; # 投稿者のホスト名を表示する $showhostname = 0; # 投稿者のIPを表示する $showhostaddress = 0; # 1:タグ入力を許す, 0:タグ入力をすべて禁止する $permittag = 0; # 1:削除を許す, 0:削除を禁止する $permitdelete = 1; # 1:クッキーを使用する, 0:使用しない $usecookie = 1; # クッキーの名前 $cookiename = 'bbs'; # クッキーの有効期限 $cookiedays = 90; #################### 変数設定(ここまで) #################### #################### 表示文字入力(ここから) #################### @lang_mastermode = ("管理人モード", "Master mode"); @lang_master_form_masterpass = ("管理用パスワード", "Master password"); @lang_master_form_retype = ("確認用の再入力", "Retype for matching"); @lang_master_form_formatpass = ("管理用パスワード設定", "format master password"); @lang_master_form_adminname = ("管理人名", "Master name"); @lang_master_form_adminmail = ("メールアドレス", "E-mail address"); @lang_master_form_adminurl = ("管理人URL", "Master URL"); @lang_master_form_langnumber = ("言語", "Language"); @lang_master_form_homeurl = ("戻り先", "Back URL"); @lang_master_form_title = ("タイトル", "Title"); @lang_master_form_comment = ("コメント", "Comment"); @lang_master_form_pagesize = ("ページサイズ", "Page size"); @lang_master_form_maxarticle = ("記事保存件数", "Max. of articles"); @lang_master_form_maxmessage = ("最大文字数", "Max. of alphabets"); @lang_master_form_color = ("色", "Color"); @lang_master_form_color1 = ("テキスト", "text"); @lang_master_form_color2 = ("背景", "background"); @lang_master_form_color3 = ("注意書き", "notes"); @lang_master_form_bgimage = ("背景画像", "Background image"); @lang_master_form_table = ("記事部分のテーブル", "table for articles"); @lang_master_form_table1 = ("ボーダー", "Border"); @lang_master_form_table2 = ("背景色", "Color"); @lang_master_form_anonymous = ("匿名希望", "Anonymous"); @lang_master_form_need0 = ("必要なし", "no need"); @lang_master_form_need1 = ("必須", "required"); @lang_master_form_needname = ("名前の入力", "Input name"); @lang_master_form_needsubject = ("題名の入力", "Input subject"); @lang_master_form_needmail = ("eメールの入力", "Input email"); @lang_master_form_needpass = ("パスワードの入力", "Input password"); @lang_master_form_show0 = ("非表\示", "do not show"); @lang_master_form_show1 = ("表\示", "show"); @lang_master_form_showurl = ("URLを表\示", "Show URL"); @lang_master_form_showhostname = ("ホスト名を表\示", "Show hostname"); @lang_master_form_showhostaddress = ("ホストIPを表\示", "Show hostip"); @lang_master_form_permit0 = ("不可", "not allowed"); @lang_master_form_permit1 = ("可", "allowed"); @lang_master_form_permittag = ("タグ入力", "Input tag"); @lang_master_form_permitdelete = ("記事の削除", "Delete article"); @lang_master_form_cookie0 = ("不使用", "do not use"); @lang_master_form_cookie1 = ("使用", "use"); @lang_master_form_usecookie = ("クッキー", "Cookie"); @lang_master_form_cookiename = ("クッキーの名前", "Cookie name"); @lang_master_form_cookiedays = ("クッキーの有効期日", "Cookie valid days"); @lang_master_form_submit = ("環境設定", "set environment"); @lang_master_form_reset = ("リセット", "reset"); @lang_master_note_langnumber = ("最初に選択される言語", "The language selected at first"); @lang_master_note_pagesize = ("1ページに表\示される記事の数", "The number of articles which can be showed per one page"); @lang_master_note_maxarticle = ("ファイルに保存される記事の数\ 0にするとすべての記事を保存する", "The maximum number of articles which can be stored in a file\ If 0 is set, all the articles can be stored."); @lang_master_note_maxmessage = ("1つの記事の最大の文字数(半角で)", "The maximum number of alphabets per one article"); @lang_master_note_anonymous = ("名前のない記事につける名前", "The name which will be attached to article with no name"); @lang_master_note_inputpass1 = ("管理用のパスワードがまだ設定されていません。必ずパスワードを設定してください。", "Master password hasn't formatted yet. Don't forget to format master password."); @lang_master_note_inputpass2 = ("4-8文字で確認のために2箇所に入力してください。(カット&ペーストは避けてください。)", "Type a password within 4-8 alphabets in two forms for matching. (Don't use cut and paste.)"); @lang_lang = ("Japanese", "English"); @lang_note_mastername = ("管理人", "Master name"); @lang_link_back = ("戻る", "back"); @lang_link_delete = ("削除", "delete"); @lang_link_nextpage = ("次の記事", "next articles"); @lang_link_mastermode = ("管理人モード", "master mode"); @lang_form_id = ("番号", "Number"); @lang_form_name = ("名前", "Name"); @lang_form_subject = ("題名", "Subject"); @lang_form_mail = ("E-mail", "E-mail"); @lang_form_url = ("URL", "URL"); @lang_form_submit = ("書き込む", "Submit"); @lang_form_reset = ("リセット", "Reset"); @lang_form_deletepass = ("削除用のパスワード", "Delete password"); @lang_form_need = ("必須", "required"); @lang_form_password = ("パスワード", "Password"); @lang_form_masterpass = ("マスターパスワード", "Master password"); @lang_form_retype = ("確認用の再入力", "Retype"); @lang_form_newmasterpass = ("新しいマスターパスワード", "New master password"); $lang_error = "\$adminmail\"; @lang_error = ("エラーです。再度試していただいてもエラーが出力される場合には$lang_errorまでお知らせください。", "Error! Try again. If the same error is printed, contact $lang_error."); @lang_error_file1 = ("ファイルがありません。", "Not found."); @lang_error_file2 = ("掲示板データファイルではありません。", "Not BBS data file."); @lang_error_name = ("名前が入力されていません。", "Name is required."); @lang_error_subject = ("題名が入力されていません。", "Subject is required."); @lang_error_mail = ("E-mailアドレスが入力されていません。", "E-mail address is required."); @lang_error_password1 = ("パスワードが入力されていません。", "Password is required."); @lang_error_password2 = ("$minpass 文字以上 $maxpass 文字以下のパスワードを入力してください。", "Password must be $minpass - $maxpass words."); @lang_error_password3 = ("パスワードが正しくありません。", "Wrong password."); @lang_error_password4 = ("管理用パスワードと確認用の入力が違います。もう一度やり直してください。", "Master password doesn't match with retyped password. Try again."); @lang_error_password5 = ("まず先に管理用パスワードを設定してください。", "Master password must be formatted in advance before setting environment."); @lang_error_message1 = ("メッセージが入力されていません。", "Message is required."); @lang_error_message2 = ("メッセージが長すぎます。", "Your message is too long."); @lang_error_message3 = ("メッセージはありません。", "No message."); @lang_note_form_tag1 = ("半角カナは使えません。タグを使用することができます。(<,>,"の記号のみ使えます。)", "Tag can be used.(Only <,>," can be used.) "); @lang_note_form_tag2 = ("半角カナ・タグは使えません。", "Tag cannot be used. "); @lang_note_form_message1 = ("保存されるメッセージは$maxarticle個で、古い順に消えていきます。", "The number of messages kept in data file is $maxarticle, and messages will be deleted from the oldest one. "); $maxmessage_zenkaku = int($maxmessage / 2); @lang_note_form_message2 = ("メッセージの最大の長さは全角で$maxmessage_zenkaku文字です。", "Max length of one message is $maxmessage alphabets. "); @lang_note_form_password = ("削除用パスワードを入れないと削除できません。パスワードは4文字以上8文字以下で入力してください。", "Password is required to delete message. Password must be 4 - 8 words."); #################### 表示文字入力(ここまで) #################### #----- 漢字コード設定 ----- require "$jcodelib"; if ($kanjicode eq 'sjis') { $contenttype = ""; # $contenttype = ""; } elsif ($kanjicode eq 'euc') { $contenttype = ""; # $contenttype = ""; } elsif ($kanjicode eq 'jis') { $contenttype = ""; } ##### format ##### #----- ユーザからの情報取得 ----- &init_form($kanjicode); $bakaddr = $ENV{'REMOTE_ADDR'}; $bakhost = $ENV{'REMOTE_HOST'}; $hostname = ($bakaddr eq $bakhost) ? gethostbyaddr(pack("C4", split(/\./, $bakaddr)), 2) : $bakhost; $hostaddress = $bakaddr; #----- cookie取得 ----- &init_cookie($cookiename); $cookie_name = $cookie{'bbs_name'}; $cookie_mail = $cookie{'bbs_mail'}; $cookie_pass = $cookie{'bbs_pass'}; $cookie_url = $cookie{'bbs_url'}; #----- 変数入力 ----- $bbsname = $form{'bbsname'} if ($form{'bbsname'}); $setname = $form{'setname'} if ($form{'setname'}); $setname = $bbsname if (!$setname); $bbsfile = "$bbsbasedir/$bbsname.txt"; $setfile = "$setbasedir/$setname.pl"; if ($bbsname) { &open_file(TXT, "$setfile", "[no set file]"); close_file(TXT); require "$setfile"; } else { &print_error("Set file name isn't defined."); } $langnumber = $form{'langnumber'}; $bbs_name = $form{'bbs_name'}; $bbs_subject = $form{'bbs_subject'}; $bbs_mail = $form{'bbs_mail'}; $bbs_url = $form{'bbs_url'}; $bbs_pass = $form{'bbs_pass'}; $bbs_message = $form{'bbs_message'}; $bbs_command = $form{'bbs_command'}; $bbs_id = $form{'bbs_id'}; $bbs_hostname = $form{'bbs_hostname'}; $bbs_hostaddress = $form{'bbs_hostaddress'}; $bbs_masterpass = $form{'bbs_masterpass'}; $bbs_newmasterpass = $form{'bbs_newmasterpass'}; $bbs_newmasterpass2 = $form{'bbs_newmasterpass2'}; $bbs_pagenumber = $form{'bbs_pagenumber'}; #----- タグ禁止 ----- $bbs_name = &norm_input($bbs_name); $bbs_subject = &norm_input($bbs_subject); $bbs_mail = &norm_input($bbs_mail); $bbs_url = &norm_input($bbs_url); $bbs_message = &norm_input($bbs_message); $bbs_id = &norm_input($bbs_id); ##### branch(入力されたコマンドによる分岐) ##### if ($bbs_command eq 'read') { &do_read; } elsif ($bbs_command eq 'write') { &do_write; } elsif ($bbs_command eq 'showdelete') { &show_delete; } elsif ($bbs_command eq 'delete') { &do_delete; } elsif ($bbs_command eq 'mastermode') { &do_mastermode; } elsif ($bbs_command eq 'masterdelete') { &do_masterdelete; } elsif ($bbs_command eq 'formatpass') { &do_formatpass; } elsif ($bbs_command eq 'mastersetenv') { &do_mastersetenv; } else { &do_read; } exit(0); ###################### ##### subroutine ##### ###################### ###### do(コマンド実行) ##### #----- 記事を読む(単に表示する) ----- sub do_read { &show_article; } #----- 記事を書く(ファイルに書いて表示する) ----- sub do_write { ### a 入力情報の検証 ###; $error= ''; if ($needname == 1 && $bbs_name eq '') { $error .= "$lang_error_name[$langnumber]
"; } if ($needsubject == 1 && $bbs_subject eq '') { $error .= "$lang_error_subject[$langnumber]
"; } if ($needmail == 1 && $bbs_mail eq '') { $error .= "$lang_error_mail[$langnumber]
"; } if ($needpass == 1 && $bbs_pass eq '') { $error .= "$lang_error_password1[$langnumber]
"; } if ($bbs_message eq '') { $error .= "$lang_error_message1[$langnumber]
"; } if ($error) { &print_error("$error"); } if ($bbs_pass ne '') { if (length($bbs_pass) < $minpass || length($bbs_pass) > $maxpass) { &print_error("$lang_error_password2[$langnumber]"); } } elsif ($needpass == 0) { $nopass = 1; } if ($bbs_name eq '') { $bbs_name = $anonymous; } if ($maxmessage >0 && length($bbs_message) > $maxmessage) { &print_error("$lang_error_message2[$langnumber]"); } ### b ファイルへ書き込み ### &open_file(BBS, "+<$bbsfile", "[no bbs file]"); &lock_file(BBS); @bbs = ; # リロードかどうかチェックし連続書き込みを防止する ($print_id, $print_name, $print_mail, $print_url, $print_date, $print_pass, $print_subject, $print_message, $print_hostname, $print_hostaddress) = split(/,/, $bbs[0]); if ($print_name eq $bbs_name && $print_subject eq $bbs_subject && $print_message eq $bbs_message) { &unlock_file(BBS); &close_file(BBS); &show_article; exit(0); } # 書き込み準備 seek(BBS, 0, 0); $datestr = &get_date_string; if ($bbs_url eq 'http://') { $bbs_url = ''; } # 記事の番号決定 $id = 1; for ($i = 0; $i < @bbs; $i++) { ($bakid) = split(/,/, $bbs[$i]); if ($bakid >= $id) { $id = $bakid + 1; } } # パスワード暗号化 if ($nopass == 1) { $encpass = ''; } else { $encpass = &encode_pass($bbs_pass); } $writeline = "$id,$bbs_name,$bbs_mail,$bbs_url,$datestr,$encpass,$bbs_subject,$bbs_message,$hostname,$hostaddress\n"; unshift(@bbs, $writeline); if ($maxarticle != 0) { splice (@bbs, $maxarticle); } # 書き込み print BBS @bbs; truncate(BBS, tell(BBS)); &unlock_file(BBS); &close_file(BBS); ### c 表示 ### &show_article; } #----- 記事を削除する ----- sub do_delete { ### a 記事削除 ### &open_file(BBS, "+<$bbsfile", "No bbs file"); &lock_file(BBS); @bbs = ; # ファイルから削除する記事を探す $index = -1; for ($i = 0; $i < @bbs; $i++) { ($findid) = split(/,/, $bbs[$i]); if ($bbs_id == $findid) { $index = $i; last; } } if ($index < 0) { &unlock_file(BBS); &close_file(BBS); &print_error("[no message]"); } # パスワード認証 ($print_id, $print_name, $print_mail, $print_url, $print_date, $print_pass, $print_subject, $print_message, $print_hostname, $print_hostaddress) = split(/,/, $bbs[$index]); if ($print_pass ne crypt($bbs_pass, $print_pass) || !$print_pass) { &unlock_file(BBS); &close_file(BBS); &print_error("$lang_error_password3[$langnumber]"); } # 記事の削除 splice(@bbs, $index, 1); seek(BBS, 0, 0); print BBS @bbs; truncate(BBS, tell(BBS)); &unlock_file(BBS); &close_file(BBS); undef @bbs; ### b 削除の表示 ### &show_article; } #----- マスターモードで記事を削除する ----- sub do_masterdelete { # マスターパスワードチェック if ($masterpass && $masterpass ne crypt($bbs_masterpass, $masterpass)) { &print_error("$lang_error_password3[$langnumber]"); } ### a 記事削除 ### &open_file(BBS, "+<$bbsfile", "No bbs file"); &lock_file(BBS); @bbs = ; # ファイルから削除する記事を探す $index = -1; for ($i = 0; $i < @bbs; $i++) { ($findid) = split(/,/, $bbs[$i]); if ($bbs_id == $findid) { $index = $i; last; } } if ($index < 0) { &unlock_file(BBS); &close_file(BBS); &print_error("[no message]"); } # 記事の削除 splice(@bbs, $index, 1); seek(BBS, 0, 0); print BBS @bbs; truncate(BBS, tell(BBS)); &unlock_file(BBS); &close_file(BBS); undef @bbs; ### b マスターモード表示 ### &show_mastermode; } #----- マスターモードに入る ----- sub do_mastermode { # マスターパスワードチェック if ($masterpass && $masterpass ne crypt($bbs_masterpass, $masterpass)) { &print_error("$lang_error_password3[$langnumber]"); } # マスターモード表示 &show_mastermode; } #----- マスターパスワードを設定する ----- sub do_formatpass { # 入力されたパスワードのチェック # if (length($bbs_newmasterpass) < $minpass || length($bbs_newmasterpass) > $maxpass) { &print_error("$lang_error_password2[$langnumber]"); } if ($bbs_newmasterpass ne $bbs_newmasterpass2) { &print_error("$lang_error_password4[$langnumber]"); } # パスワードの設定 # local($encpass) = &encode_pass($bbs_newmasterpass); $bbs_masterpass = $bbs_newmasterpass; &open_file(BBS, "+<$setfile", "[no set file]"); &lock_file(BBS); @bbs = ; $index = -1; for ($i = 0; $i < @bbs; $i++) { if ($bbs[i] =~ /\$masterpass/) { $bbs[i] = "\$masterpass = \'$encpass\'\;\n"; $index = i; last; } } if ($index < 0) { $writeline = "\$masterpass = \'$encpass\'\;\n"; unshift(@bbs, $writeline); } $masterpass = $encpass; seek(BBS, 0, 0); print BBS @bbs; truncate(BBS, tell(BBS)); &unlock_file(BBS); &close_file(BBS); &show_mastermode; } #----- マスターモードで環境設定 ----- sub do_mastersetenv { local(@set); # マスターパスワードチェック if (!$masterpass) { &print_error("$lang_error_password5[$langnumber]"); } if ($masterpass && $masterpass ne crypt($bbs_masterpass, $masterpass)) { &print_error("$lang_error_password3[$langnumber]"); } &open_file(SET, "+<$setfile", "[no set file]"); &lock_file(SET); $adminname = $form{'adminname'}; $adminmail = $form{'adminmail'}; $adminurl = $form{'adminurl'}; $langnumber = $form{'langnumber'}; $homeurl = $form{'homeurl'}; @lang_title = ($form{'lang_title0'}, $form{'lang_title1'}); @lang_comment = ($form{'lang_comment0'}, $form{'lang_comment1'}); $pagesize = $form{'pagesize'}; $maxarticle = $form{'maxarticle'}; $maxmessage = $form{'maxmessage'}; $bgcolor = $form{'bgcolor'}; $textcolor = $form{'textcolor'}; $notecolor = $form{'notecolor'}; $bgimage = $form{'bgimage'}; $tableborder = $form{'tableborder'}; $tablecolor = $form{'tablecolor'}; $anonymous = $form{'anonymous'}; $needname = $form{'needname'}; $needsubject = $form{'needsubject'}; $needmail = $form{'needmail'}; $needpass = $form{'needpass'}; $showurl = $form{'showurl'}; $showhostname = $form{'showhostname'}; $showhostaddress = $form{'showhostaddress'}; $permittag = $form{'permittag'}; $permitdelete = $form{'permitdelete'}; $usecookie = $form{'usecookie'}; $cookiename = $form{'cookiename'}; $cookiedays = $form{'cookiedays'}; $ln = "\$masterpass = \'$masterpass\'\;\n"; push @set, $ln; $ln = "\$adminname = \'$adminname\'\;\n"; push @set, $ln; $ln = "\$adminmail = \'$adminmail\'\;\n"; push @set, $ln; $ln = "\$adminurl = \'$adminurl\'\;\n"; push @set, $ln; $ln = "\$langnumber = $langnumber\;\n"; push @set, $ln; $ln = "\$homeurl = \'$homeurl\'\;\n"; push @set, $ln; $ln = "\@lang_title = (\"$lang_title[0]\", \"$lang_title[1]\")\;\n"; push @set, $ln; $ln = "\@lang_comment = (\"$lang_comment[0]\", \"$lang_comment[1]\")\;\n"; push @set, $ln; $ln = "\$pagesize = $pagesize\;\n"; push @set, $ln; $ln = "\$maxarticle = $maxarticle\;\n"; push @set, $ln; $ln = "\$maxmessage = $maxmessage\;\n"; push @set, $ln; $ln = "\$bgcolor = \'$bgcolor\'\;\n"; push @set, $ln; $ln = "\$textcolor = \'$textcolor\'\;\n"; push @set, $ln; $ln = "\$notecolor = \'$notecolor\'\;\n"; push @set, $ln; $ln = "\$bgimage = \'$bgimage\'\;\n"; push @set, $ln; $ln = "\$tableborder = $tableborder\;\n"; push @set, $ln; $ln = "\$tablecolor = \'$tablecolor\'\;\n"; push @set, $ln; $ln = "\$anonymous = \'$anonymous\'\;\n"; push @set, $ln; $ln = "\$needname = $needname\;\n"; push @set, $ln; $ln = "\$needsubject = $needsubject\;\n"; push @set, $ln; $ln = "\$needmail = $needmail\;\n"; push @set, $ln; $ln = "\$needpass = $needpass\;\n"; push @set, $ln; $ln = "\$showurl = $showurl\;\n"; push @set, $ln; $ln = "\$showhostname = $showhostname\;\n"; push @set, $ln; $ln = "\$showhostaddress = $showhostaddress\;\n"; push @set, $ln; $ln = "\$permittag = $permittag\;\n"; push @set, $ln; $ln = "\$permitdelete = $permitdelete\;\n"; push @set, $ln; $ln = "\$usecookie = $usecookie\;\n"; push @set, $ln; $ln = "\$cookiename = \'$cookiename\'\;\n"; push @set, $ln; $ln = "\$cookiedays = $cookiedays\;\n"; push @set, $ln; $ln = "1\;\n"; push @set, $ln; # 書き込み print SET @set; truncate(SET, tell(SET)); &unlock_file(SET); &close_file(SET); # マスターモード表示 &show_article; } ##### show(HTML表示) ##### #----- 書き込み用フォームと記事を表示する ----- sub show_article { # open &open_file(BBS, "$bbsfile", "$lang_error_file1[$langnumber]"); @bbs = ; &close_file(BBS); $number_article = $#bbs + 1; # クッキーデータの出力 print "Content-type: text/html\n"; if ($bbs_command eq 'write' && $usecookie) { undef %cookie; $cookie{'bbs_name'} = $bbs_name; $cookie{'bbs_mail'} = $bbs_mail; $cookie{'bbs_pass'} = $bbs_pass; $cookie{'bbs_url'} = $bbs_url; &print_cookie($cookiename, $cookiedays); $cookie_name = $bbs_name; $cookie_mail = $bbs_mail; $cookie_pass = $bbs_pass; $cookie_url = $bbs_url; } print "\n"; if ($cookie_url eq '') { $cookie_url = 'http://'; } # ヘッダ表示 print <<"END_SHOW_ARTICLE_HEAD"; $contenttype $lang_title[$langnumber]
[$lang_link_back[$langnumber]]  [Japanese | English]
$lang_title[$langnumber]
$lang_comment[$langnumber]
END_SHOW_ARTICLE_HEAD # 書き込み用フォーム表示 if ($needname) { $print_needname ="($lang_form_need[$langnumber])"; } else { $print_needname = ''; } if ($needsubject) { $print_needsubject ="($lang_form_need[$langnumber])"; } else { $print_needsubject = ''; } if ($needmail) { $print_needmail ="($lang_form_need[$langnumber])"; } else { $print_needmail = ''; } if ($needpass) { $print_needpass ="($lang_form_need[$langnumber])"; } else { $print_needpass = ''; } if ($permittag) { $print_note_tag = "$lang_note_form_tag1[$langnumber]"; } else { $print_note_tag = "$lang_note_form_tag2[$langnumber]"; } if ($permitdelete) { $print_delete = "$lang_form_deletepass[$langnumber] $print_needpass"; $print_note_delete = $lang_note_form_password[$langnumber]; } else { $print_delete = ""; $print_note_delete = ""; } if ($maxarticle != 0) { $print_note_message = "$lang_note_form_message1[$langnumber]"; } else { $print_note_message = ""; } print <<"END_SHOW_ARTICLE_INPUTFORM";
$lang_form_name[$langnumber] $print_needname
$lang_form_subject[$langnumber] $print_needsubject
$lang_form_mail[$langnumber] $print_needmail
$lang_form_url[$langnumber]
$print_delete
$print_note_tag
$print_note_message
$lang_note_form_message2[$langnumber]
$print_note_delete

END_SHOW_ARTICLE_INPUTFORM # 記事表示 $article_start = $bbs_pagenumber * $pagesize; $article_end = $article_start + $pagesize; if ($article_end < $number_article) { $bbs_pagenumber++; $shownextpagebutton = 1; } if ($article_end > $number_article) { $article_end = $number_article; } for ($i = $article_start; $i<$article_end; $i++) { ($print_id, $print_name, $print_mail, $print_url, $print_date, $print_pass, $print_subject, $print_message, $print_hostname, $print_hostaddress) = split(/,/, $bbs[$i]); if ($print_mail) { $print_nametag = "$print_name"; } else { $print_nametag = "$print_name"; } if ($showurl) { $print_urltag = "URL"; } else { $print_urltag = ""; } if ($showhostname) { $print_hostnametag = "$print_hostname"; } else { $print_hostnametag = ""; } if ($showhostaddress) { $print_hostaddresstag = "$print_hostaddress
"; } else { $print_hostaddresstag = "
"; } print <<"END_SHOW_ARTICLE_ARTICLE";
No.$print_id   $print_nametag   $lang_form_subject[$langnumber]: $print_subject   $print_urltag   $print_date
$print_hostnametag   $print_hostaddresstag
$print_message

END_SHOW_ARTICLE_ARTICLE } # 表示の繰り返し # フッター表示 if ($shownextpagebutton) { print <<"END_SHOW_NEXTPAGEBUTTON";
END_SHOW_NEXTPAGEBUTTON } if ($permitdelete) { print <<"END_SHOW_DELETE";
$lang_form_id[$langnumber] $lang_form_deletepass[$langnumber]
END_SHOW_DELETE } print <<"END_SHOW_ARTICLE_FOOT";
$lang_note_mastername[$langnumber]: $adminname
$lang_form_password[$langnumber]
Powered by SDnoteQueen Ver 2.0
END_SHOW_ARTICLE_FOOT } #----- マスターモード設定フォームを表示する ----- sub show_mastermode { # open &open_file(BBS, "$bbsfile", "$lang_error_file1[$langnumber]"); @bbs = ; &close_file(BBS); $number_article = $#bbs + 1; # ヘッダ表示 print "Content-type: text/html\n\n"; print <<"END_SHOW_ARTICLE_HEAD"; $contenttype $lang_title[$langnumber]
$lang_title[$langnumber]

$lang_mastermode[$langnumber]
END_SHOW_ARTICLE_HEAD if (!$masterpass) { $print_inputpass1 = "$lang_master_note_inputpass1[$langnumber]
"; } else { $print_inputpass1 = ""; } ($langnumber) ? ($ch_lang1 = "CHECKED") : ($ch_lang0 = "CHECKED"); ($needname) ? ($ch_name1 = "CHECKED") : ($ch_name0 = "CHECKED"); ($needsubject) ? ($ch_sub1 = "CHECKED") : ($ch_sub0 = "CHECKED"); ($needmail) ? ($ch_mail1 = "CHECKED") : ($ch_mail0 = "CHECKED"); ($needpass) ? ($ch_pass1 = "CHECKED") : ($ch_pass0 = "CHECKED"); ($showurl) ? ($ch_surl1 = "CHECKED") : ($ch_surl0 = "CHECKED"); ($showhostname) ? ($ch_shna1 = "CHECKED") : ($ch_shna0 = "CHECKED"); ($showhostaddress) ? ($ch_shad1 = "CHECKED") : ($ch_shad0 = "CHECKED"); ($permittag) ? ($ch_peta1 = "CHECKED") : ($ch_peta0 = "CHECKED"); ($permitdelete) ? ($ch_pede1 = "CHECKED") : ($ch_pede0 = "CHECKED"); ($usecookie) ? ($ch_cook1 = "CHECKED") : ($ch_cook0 = "CHECKED"); # 設定用フォーム表示 print <<"END_SHOW_MASTER_INPUTFORM";
$print_inputpass1
$lang_master_form_masterpass
$lang_master_form_retype
$lang_master_note_inputpass2[$langnumber]

$lang_master_form_adminname[$langnumber]
$lang_master_form_adminmail[$langnumber]
$lang_master_form_adminurl[$langnumber]
$lang_master_form_langnumber[$langnumber] $lang_lang[0]   $lang_lang[1]
$lang_master_form_homeurl[$langnumber]
$lang_master_form_title[$langnumber] $lang_lang[0]
$lang_lang[1]
$lang_master_form_comment[$langnumber] $lang_lang[0]
$lang_lang[1]
$lang_master_form_pagesize[$langnumber] $lang_master_note_pagesize[$langnumber]
$lang_master_form_maxarticle[$langnumber] $lang_master_note_maxarticle[$langnumber]
$lang_master_form_maxmessage[$langnumber] $lang_master_note_maxmessage[$langnumber]
$lang_master_form_color[$langnumber] $lang_master_form_color1[$langnumber] $lang_master_form_color2[$langnumber] $lang_master_form_color3[$langnumber]
$lang_master_form_bgimage[$langnumber]
$lang_master_form_table[$langnumber] $lang_master_form_table1[$langnumber] $lang_master_form_table2[$langnumber]
$lang_master_form_anonymous[$langnumber] $lang_master_note_anonymous[$langnumber]
$lang_master_form_needname[$langnumber] $lang_master_form_need0[$langnumber]   $lang_master_form_need1[$langnumber]
$lang_master_form_needsubject[$langnumber] $lang_master_form_need0[$langnumber]   $lang_master_form_need1[$langnumber]
$lang_master_form_needmail[$langnumber] $lang_master_form_need0[$langnumber]   $lang_master_form_need1[$langnumber]
$lang_master_form_needpass[$langnumber] $lang_master_form_need0[$langnumber]   $lang_master_form_need1[$langnumber]
$lang_master_form_showurl[$langnumber] $lang_master_form_show0[$langnumber]   $lang_master_form_show1[$langnumber]
$lang_master_form_showhostname[$langnumber] $lang_master_form_show0[$langnumber]   $lang_master_form_show1[$langnumber]
$lang_master_form_showhostaddress[$langnumber] $lang_master_form_show0[$langnumber]   $lang_master_form_show1[$langnumber]
$lang_master_form_permittag[$langnumber] $lang_master_form_permit0[$langnumber]   $lang_master_form_permit1[$langnumber]
$lang_master_form_permitdelete[$langnumber] $lang_master_form_permit0[$langnumber]   $lang_master_form_permit1[$langnumber]
$lang_master_form_usecookie[$langnumber] $lang_master_form_cookie0[$langnumber]   $lang_master_form_cookie1[$langnumber]
$lang_master_form_cookiename[$langnumber]
$lang_master_form_cookiedays[$langnumber]

END_SHOW_MASTER_INPUTFORM # 記事表示 $article_start = $bbs_pagenumber * $pagesize; $article_end = $article_start + $pagesize; if ($article_end < $number_article) { $bbs_pagenumber++; $shownextpagebutton = 1; } if ($article_end > $number_article) { $article_end = $number_article; } for ($i = $article_start; $i<$article_end; $i++) { ($print_id, $print_name, $print_mail, $print_url, $print_date, $print_pass, $print_subject, $print_message, $print_hostname, $print_hostaddress) = split(/,/, $bbs[$i]); if ($print_mail) { $print_nametag = "$print_name"; } else { $print_nametag = "$print_name"; } if ($showurl) { $print_urltag = "URL"; } else { $print_urltag = ""; } if ($showhostname) { $print_hostnametag = "$print_hostname"; } else { $print_hostnametag = ""; } if ($showhostaddress) { $print_hostaddresstag = "$print_hostaddress
"; } else { $print_hostaddresstag = "
"; } print <<"END_SHOW_MASTER_ARTICLE";
No.$print_id   $print_nametag   $lang_form_subject[$langnumber]: $print_subject   $print_urltag   $print_date
$print_hostnametag   $print_hostaddresstag
$print_message

END_SHOW_MASTER_ARTICLE } # 表示の繰り返し # フッター表示 if ($shownextpagebutton) { print <<"END_SHOW_MASTER_NEXTPAGEBUTTON";
END_SHOW_MASTER_NEXTPAGEBUTTON } print <<"END_MASTER_DELETE";
$lang_form_id[$langnumber]
END_MASTER_DELETE print <<"END_SHOW_MASTER_FOOT";
Powered by SDnoteQueen Ver 2.0
END_SHOW_MASTER_FOOT } ##### サブ処理 ##### #----- パスワード暗号化 ----- sub encode_pass { local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); local(@token) = ('0'..'9', 'A'..'Z', 'a'..'z'); local($pass) = @_; local($encpass, $salt1, $salt2); $salt1 = $token[(time | $$) % scalar(@token)]; $salt2 = $token[($sec + $min*60 + $hour*3600) % scalar(@token)]; $encpass = crypt($pass, "$salt1$salt2"); return $encpass; } #----- 時刻文字列の取得 ----- sub get_date_string { local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); $year += 1900; $mon++; if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday] ; return "$year-$mon-$day ($weekstr) $hour:$min"; } #----- クッキー用の有効期限時刻文字列の取得 ----- sub get_expiredate_string { local($days) =@_; local(@month) = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); local($sec, $min, $hour, $day, $mon, $year, $weekday) = gmtime(time + $days * 24*60*60); local($expiredate); $year += 1900; if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday] ; $monstr = $month[$mon]; return "$weekstr, $day-$monstr-$year $hour:$min:$sec GMT"; } ##### 入出力処理 ###### #----- ブラウザへの入力データの取得 ----- sub init_form { local($query, @dataarray, $data, $property, $value, $charcode, $method); $charcode = $_[0]; $method = $ENV{'REQUEST_METHOD'}; $method =~ tr/A-Z/a-z/; if ($method eq 'post') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } @dataarray = split(/&/, $query); if ($dataarray[0] !~ /=/) { $bbsname = $dataarray[0]; $setname = $dataarray[1]; $langnumber = ($dataarray[2] =~ /^\d+$/) ? $dataarray[2] : 0; } else { foreach $data (@dataarray) { ($property, $value) = split(/=/, $data); $value =~ tr/+/ /; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; &jcode'convert(*value, $charcode); $form{$property} = $value; } } } #----- 入力データからのタグ、メタ文字の消去 ----- sub norm_input { local($string) = @_; $string =~ s/&/&/g; $string =~ s/"/"/g if ($permittag != 1); $string =~ s//>/g if ($permittag != 1); $string =~ s/,/,/g; $string =~ s/\r\n/\n/g; $string =~ s/\r/\n/g; $string =~ s/\n\n/

/g; $string =~ s/\n/
/g; return $string; } #----- クッキー情報の取得 ----- sub init_cookie { local($cookiename) = @_; local($name, $value, @pairs, $pair); @cookie_list = split(/;\s/, $ENV{'HTTP_COOKIE'}); foreach $cookie_list (@cookie_list) { ($cookie_name, $cookie_value) = split(/=/, $cookie_list); if ($cookie_name eq $cookiename) { $cookie_value =~ s/:/; /g; $cookie_value =~ s/_/=/g; @pairs = split(/;\s/, $cookie_value); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $name =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $cookie{$name} = $value; } last; } } } #----- クッキー情報の出力 ----- sub print_cookie { local($cookiename, $days, $domain) = @_; local($cookiestr) = &make_cookie($cookiename); local($expiredate) = &get_expiredate_string($days); print "Set-Cookie: $cookiestr;"; print " expires=$expiredate;"; if ($domain) { print " domain=$domain;"; } print "\n"; } #----- クッキー情報の作成 ----- sub make_cookie { local($cookiename) = @_; local(@enccookie, @encstr); local($name, $value); local($encode) = '\%\+\;\,\=\&\_\:'; while (($name, $value) = each %cookie) { $name =~ s/([$encode])/'%'.unpack("H2", $1)/eg; $value =~ s/([$encode])/'%'.unpack("H2", $1)/eg; $name =~ s/\s/\+/g; $value =~ s/\s/\+/g; push(@enccookie, "${name}_${value}"); } $encstr = join(':', @enccookie); return "$cookiename=$encstr"; } ##### ファイル処理 ##### #----- ファイルオープン ----- sub open_file { local(*FILE, $name, $msg) = @_; if (!open(FILE, $name)) { &print_error("$msg"); } seek(FILE, 0, 0); } #----- ファイルクローズ ----- sub close_file { local(*FILE) = @_; close(FILE); } #----- ファイルロック ----- sub lock_file { local(*FILE) = @_; if ($uselock) { eval("flock(FILE, 2)"); if ($@) { &print_error("Cannot use flock"); } } } #----- ファイルアンロック ----- sub unlock_file { local(*FILE) = @_; if ($uselock) { eval("flock(FILE, 8)"); } } ##### エラー処理 ##### #----- エラー文を出力し終了 ----- sub print_error { local($msg) = @_; print "Content-type: text/html\n\n"; print <<"END_PRINT_ERROR"; $contenttype $msg

$msg


END_PRINT_ERROR exit(0); } #@file_info = stat($bbsfile); #if ($file_info[7] == 0) { # &show_initmaster; # return; #} #print "Content-type: text/html\n\n "; print $setfile; exit(0);