#!/usr/bin/perl #*- スクリプト配布&編集 --------------*# # Moji Navi v2.0309 (02.03.09) # # # # *- CGI Cafe. -* # # URL: http://saya.kiy.jp/ # #*-------------------------------------*# $ver = 'Moji Navi v2.0309';# バージョン #-# スクリプト作成 #--------------------# # Cosmo Navigator v2.04 (2001/03/03) # # Copyright(C) KENT WEB 2001 # # webmaster@kent-web.com # # http://www.kent-web.com/ # #---------------------------------------# #━━━━━━━━━━━━━━━━━━━━━━━━━━━ # # ※ このCGIに対する問い合わせを「KENT WEB」さんには # #   絶対にしないでくださいね。お願いします。 # #━━━━━━━━━━━━━━━━━━━━━━━━━━━ # # ■ 必要なファイルとパーミッション # # # # 「moji」ディレクトリ # # ・moji.cgi ----[755] # # ・moji.log ----[666] # # ・count.dat----[666] # # ・bkup.dat ----[666] # # ・A.bak -------[666] # # ・B.bak -------[666] # # ・C.bak -------[666] # # ・jcode.pl ----[755]or[644] # # 「img」ディレクトリ # # ・gif画像 ---[変更不要] # # 「lock」ディレクトリ[777] ※ロックする場合のみ # #-------------------------------------------------------# #============# # 基本設定 # #============# require './jcode.pl'; # コード変換ライブラリ取り込み $home = "http://f19.aaa.livedoor.jp/~webseek/"; # 戻り先 (絶対パスなら http://から) $homett= "_top"; # ↑戻り先のターゲット指定 $pass = '621030'; # 管理用パスワード(英数字で)※必ず変更してね! $admin = "管理人"; # 管理者の名前 $script = "./moji.cgi"; # スクリプト名 $logfile = "./moji.log"; # ログファイル名 $title = "*- Link Navi -*"; # タイトル名 $t_color = "#88b1cd"; # タイトル文字の色 $t_face = "Verdana"; # タイトルの文字フォントタイプ $t_size = '20pt'; # タイトルサイズ:ポイント数 # タイトル画像の指定 $t_gif = "./img/title.gif"; # タイトル画像ファイル名 $t_wid = '200'; # 画像の横サイズ(ピクセル) $t_hgt = '53'; #  〃 縦サイズ(ピクセル) $ba_img = 1; # バナー表示機能を使用しますか?(0=no 1=yes) $hpsize = 4; # バナー表示がない場合のHPタイトルのフォントサイズ # バナー表示機能を使用する場合、バナーサイズを固定しますか? $ban_w = '200'; # 横幅を指定 (固定しない場合は ''; のままでOK) $ban_h = '40'; # 高さを指定 (        〃        ) $rank_on = 1; # ランキングを表示しますか?(0=no 1=yes) # URL登録形態 $regtype = 1; # 0 : ユーザが自由に登録,1 : 管理者のみが登録 $mailkey = 0; # メールアドレス登録は必要ですか? (0=no 1=yes) ※但し「sendmail使用」の場合は必ず【1=yes】にして下さい! $master = "Webmaster:"; # 管理人名を表示する場合の見出し # トップページのテーブル表示の指定 $lup = "./img/1.gif"; # 向かって左上コーナー画像 $rup = "./img/2.gif"; #   〃  右上  〃 $ldown = "./img/3.gif"; #   〃  左下  〃 $rdown = "./img/4.gif"; #  〃  右下  〃 $point = "./img/mk_h.gif"; # 見出しポイント画像を指定 $top_bg= "#88b1cd"; # 背景色 $td_w = "180"; # カテゴリー表示部分の幅 # カテゴリータイトルに長い名前をつけると表示が乱れますのでここで調整してね。 $method = 'POST'; # methodの形式 (POST or GET) $msg_limit = 100; # 紹介コメントの制限文字数(全角文字) $newtime = 7; # NEWアイコンの表示日数 $w_new = 10; # 新着情報の最新表示件数 $p_view = 10; # 登録内容の1ページ当りの表示数 $lockkey = 0; # ロックファイル (0=no 1=symlink関数 2=open関数) $lockfile = "./lock/moji.lock";# ロックファイル名(アップロードの必要はありません) # ホスト名取得モード ------------------------------- # --> 0 : $ENV{'REMOTE_HOST'} で取得できる場合 # --> 1 : gethostbyaddr で取得できる場合 $get_remotehost = 0; $keyfile = "./bkup.dat"; # バックアップ用キーファイル # バックアップファイルを置くディレクトリ $backdir = "."; # [moji.cgi]と同一ディレクトリの場合は「.」のままでOK # カテゴリー(ジャンル)の指定 ------------------------------- # --> 変数のカギ括弧内は 0 から連番で続ける ※表示の関係上「2で割切れる数」にして下さいませ(;^_^A $parts[0] = "サーチエンジン"; $parts[1] = "ゲーム関連"; $parts[2] = "音楽関連"; $parts[3] = "競馬関連"; $parts[4] = " みんごる関連"; $parts[5] = "スポーツ関連"; $parts[6] = "CGI関連"; $parts[7] = "HP作成支援"; $parts[8] = "素材屋さん"; $parts[9] = "その他"; # 環境設定 ------------------------------- $bground = "./img/bg.gif"; # 壁紙(http://からでもOK) $bgcolor = "#FFFFFF"; # 背景色 $text = "#517FA0"; # 文字色 $link = "#517FA0"; # リンク色(未訪問)#426882 $vlink = "#517FA0"; # リンク色(既訪問) $alink = "#517FA0"; # リンク色(訪問中) $obi_color = "#517FA0"; # 横線の色 $obi_width = "60%"; # 各ページの(テーブル)表示サイズ $ta_color = "#eeeeee"; # ランキング見出しの色 # コメント前のマークを指定 ※タグまたは「★」などの記号 $com_m = ''; # NEWアイコン ------------------------------- $newgif = "./img/new.gif"; # NEW画像ファイル名 $new_w = '30'; #  〃 横サイズ $new_h = '10'; #  〃 縦サイズ # おすすめ or 相互リンクアイコン ----------------- $lsicon = 'おすすめ'; # 管理者が付加するアイコンの名前(意味) ※おすすめ、相互リンク など $recom = './img/look.gif'; # 画像ファイル名 $rec_w = '44'; #  〃 横サイズ $rec_h = '8'; #  〃 縦サイズ # プロバイダで「sendmail」が使える場合のみ指定 $mailing = 0; # メール通知 (0=no 1=登録者のみ 2=登録者と管理者へ通知) $sendmail = '/usr/slib/sendmail'; # sendmailのパス $admin_mail = 'master@host.or.jp'; # 管理者メールアドレス(メール通知する時) $admin_url = 'http://www.host/'; # 管理者のURL(メール通知する時) $w_url = 0; # 同一URLの二重登録を許可する? (0=no 1=yes) $target ="_blank"; # 登録されたHPへ飛ぶ時のtarget指定(_blank:新しいウィンドウを開く, _top:新しいウィンドウを開かない) # URLジャンプ形式(Locaion関数の使えないサーバ対応 --->> トクトク,3nopaage などの方は「1」を指定) $meta_jump = 0; # 0 : Location関数,1 : METAタグ $wait = 1; # METAタグジャンプの待ち時間(秒数)※ 上記設定で「1」とした場合のみ # タグ広告挿入オプション # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = ''; # 上部に挿入 $banner2 = ''; # 下部に挿入 # 登録アクセス拒否 # --> 新規登録処理をホスト名から拒否します @deny = ( 'ppp*.xxx.co.jp', 'cache*.*.interlog.com', '*.anonymizer.com', '', '', '', '', '' ); # ミニカウンタの設置--------------------------------------- $counter = 1; # 0=no、 1=テキスト、 2=GIF画像 $mini_fig = 6; # ミニカウンタの桁数 $cnt_color = "#517FA0"; # テキストのとき:ミニカウンタの色 $gif_path = "./img"; # GIFのとき :画像までのディレクトリ $mini_w = 10; # 〃  :画像の横サイズ $mini_h = 10; # 〃  :画像の縦サイズ $cntfile = "./count.dat"; # カウンターファイル $cnt_pl = "right"; # カウンターの表示位置 (画面左:left 画面右:right 中央:center) $cntlock = "./cnt.lock"; # カウンターのロックファイル名 # スタイルシートの設定 ------------------------------- #スタイルシートがわかる人は適当に変更してください。 $font_size = "8pt"; #標準の文字の大きさ $family = "Verdana,Chicago"; #フォント種類 $hlink_color = "#517FA0"; #リンク部分にマウスをのせたときの文字色 $hlink_bgcolor = "#eeeeee"; #リンク部分(ボタン含む)にマウスをのせたときの背景色 $input_color = "#666666"; #入力欄の文字色(IE4以上、NN6以上でのみ反映) $input_border = "#517FA0"; #入力欄の枠の色(IE4以上、NN6以上でのみ反映) $input_bgcolor = "#eeeeee"; #入力欄の背景の色(IE4以上、NN6以上のみ反映) $hr = "#517FA0"; #横線の色(IE4以上、NN6以上のみ反映) $style = <<"HTML"; HTML #============# # 設定完了 # #============# # メイン処理 &decode; if ($mode eq 'howto') { &howto; } if ($mode eq 'new_sort') { &new_sort; } if ($mode eq 'ranking') { &ranking; } if ($mode eq 'new_url') { &new_url; } if ($mode eq 'regist') { ®ist; } if ($mode eq 'mente') { &mente; } if ($mode eq 'do_mente') { &do_mente; } if ($mode eq 'admin') { &admin; } if ($mode eq 'admin_edit') { &admin_edit; } if ($mode eq 'search') { &search; } if ($mode eq 'part') { &part_view; } if ($in{'links'} ne '') { &link_jump; } &html_view; exit; #------------# # 初期画面 # #------------# sub html_view { # バックアップ処理 $bkup_flag=0; if (!$mode) { # キーファイルを読み込み分解 open(BK,"$keyfile") || &error("Open Error : $keyfile"); $BKUP = ; close(BK); ($today,$key) = split(/:/, $BKUP); # 日付が異なればバックアップ処理を行う &get_time; if ($mday ne "$today") { $bkup_flag=1; # バックアップファイルを定義 $bakfile = "$backdir/$key\.bak"; # ローテーションキーを定義 if ($key eq 'A') { $newkey = 'B'; } elsif ($key eq 'B') { $newkey = 'C'; } else { $newkey = 'A'; } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # キーファイルを更新 open(BK,">$keyfile") || &error("Write Error : $keyfile","lock"); print BK "$mday\:$newkey"; close(BK); } } # ログを読み込み open(IN,"$logfile") || &error("Open Error : $logfile"); if ($bkup_flag) { open(OUT,">$bakfile") || &error("Open Error : $bakfile"); } while () { print OUT $_ if ($bkup_flag); ($no,$pt,$sub,$hp,$bann,$name,$email,$pw,$msg,$date,$t) = split(/<>/); foreach (0 .. $#parts) { if ($pt eq "$_") { $bunrui[$_]++; last; } } } close(IN); close(OUT) if ($bkup_flag); # ロック解除 if ($bkup_flag && -e $lockfile) { unlink($lockfile); } &header; # カウンタ処理 if ($counter) { &counter; } print "
\n"; print "$banner1

\n" if ($banner1 ne ''); if ($t_gif) { print "\n"; } else { print "$title\n"; } print "


\n"; print "HOME * \n"; print "注意事項 * \n"; if (!$regtype) { print "新規登録 * \n"; } print "新着情報 * \n"; if ($rank_on) { print "ランキング * \n"; } print <<"EOM"; $admin用
 
条件 表\示

EOM print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; $flag=0; foreach (0 .. $#parts) { if ($bunrui[$_] eq '') { $bunrui[$_] = 0; } if ($flag == 0) { print "\n"; print "\n"; $flag=1; } else { print "\n"; print "\n"; $flag=0; } } if ($flag == 1) { print "\n"; } print "\n"; print "\n"; print "\n"; print "\n"; print "
 
        \n"; print "$parts[$_]($bunrui[$_]件)       \n"; print "$parts[$_]($bunrui[$_]件) 
 
\n"; print "
\n"; &footer; print "

$banner2

\n"; print "\n"; } # 著作権表示(削除・改変を禁止します) sub footer { print "

\n"; print "- Cosmo Navi -
\n"; print "Edit by *- CGI Cafe. -*
\n"; } #----------------# # 新規登録画面 # #----------------# sub new_url { # 権限チェック if ($regtype) { if ($in{'pass'} eq "") { &error("登録は管理者のみです"); } elsif ($in{'pass'} ne "$pass") { &error("認証エラー"); } } else { $pwd_message = "
  • 「Password」は今後のメンテナンスに必要なので必ず記入してください。\n"; } # ホスト名をチェック &get_host; local($flag)=0; foreach (@deny) { if (!$_) { next; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("現在新規登録はできません"); } &header; print <<"EOM";
    新規登録
    *:*:*: Back :*:*:*

    1. 新規登録を行います。
    2. 下記フォームに内容を記述し、登録ボタンを押してください。 $pwd_message

    EOM #バナー表示? if ($ba_img){ print ""; print "\n"; } print ""; print "\n"; if ($mailkey) { print ""; print "\n"; } if (!$regtype) { print ""; print "\n"; } print "\n"; print "
    URL
    Banner URL
    管理者名
    E-Mail
    Password"; print "(英数字で8文字以内)

    分 類\n"; if ($in{'part'}) { print "\n"; } foreach (0 .. $#parts) { if ($in{'part'} eq "$_") { print "
    HP タイトル
    HP 紹介文(全角$msg_limit文字以内で)
      
    EOM &footer; print ""; exit; } #------------# # 登録処理 # #------------# sub regist { # 権限チェック if ($regtype) { if ($in{'pass'} eq "") { &error("登録は管理者のみです"); } elsif ($in{'pass'} ne "$pass") { &error("認証エラー"); } } # フォームチェック if (!$regtype) { if ($in{'name'} eq '') { &error("なまえの入力がありません"); } if ($in{'pwd'} eq '') { &error("Passwordの入力がありません"); } if ($in{'pwd'} =~ /\W/) { &error("Passwordに全角文字が含まれています。半角の英数字で入力してください"); } } if ($mailkey) { if ($in{'email'} !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です"); } } if ($in{'url'} eq '') { &error("URLの入力がありません"); } if ($in{'part'} eq '') { &error("分類の指定がありません"); } if ($in{'sub'} eq '') { &error("タイトル名の入力がありません"); } if ($in{'msg'} eq '') { &error("紹介コメントの入力がありません"); } if (length($in{'msg'}) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています"); } # 日時の取得 &get_time; # ホスト名を取得 &get_host; # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(IN,"$logfile") || &error("Open Error : $logfile","lock"); @lines = ; close(IN); ($no,$dmy) = split(/<>/, $lines[0]); $no++; if (!$w_url) { $flag=0; foreach (@lines) { # URLが既登録でないかをチェック local($no,$part,$sub,$hp) = split(/<>/); if ($in{'url'} eq "$hp") { $flag=1; last; } } if ($flag) { &error("登録しようとするURLは既に登録済です","lock"); } } # パスワードを暗号化 $PW = &encrypt($in{'pwd'}); # 更新 unshift(@lines,"$no<>$in{'part'}<>$in{'sub'}<>$in{'url'}<>$in{'b_url'}<>$in{'name'}<>$in{'email'}<>$PW<>$in{'msg'}<>$date<>$times<>0<>0<>$host<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @lines; close(OUT); # ロック解除 unlink($lockfile) if (-e $lockfile); # お礼メール通知 if ($mailing) { &mail_to; } # 登録完了画面 &header; print "

    \n"; print "

    \n"; if (!$regtype) { print "** ありがとうございます。以下の内容で登録が完了しました! **\n"; } else { print "** 以下の内容で登録が完了しました! **\n"; } print "


    \n"; print "\n"; print "\n"; #バナー表示? if ($ba_img){ print "\n"; #(*) } print "\n"; if ($mailkey) { print "\n"; } if (!$regtype) { print "\n"; } print "\n"; print "\n"; print "\n"; print "
    URLhttp://$in{'url'}
    Banner URLhttp://$in{'b_url'}
    管理者名$in{'name'}
    E-Mail$in{'email'}
    Password$in{'pwd'}
    分 類$parts[$in{'part'}]
    タイトル$in{'sub'}
    紹介文$in{'msg'}
    \n"; print "
    \n"; print "\n"; print "
    \n"; print "
    \n"; &footer; print "\n"; exit; } #--------------# # メンテ画面 # #--------------# sub mente { open(IN,"$logfile") || &error("Open Error : $logfile"); while () { ($no,$part,$sub,$hp,$bann,$name,$email,$pw,$msg,$date,$t) = split(/<>/); if ($in{'no'} eq "$no") { last; } } close(IN); &header; print <<"EOM";
    登録情報の修正・削除
    *:*:*: Back :*:*:*

    1. 下記ホームページのメンテナンスを行います。 EOM if (!$regtype) { print "
    2. 処理内容を選択し、登録時に指定した「Password」を入力してください。\n"; } else { print "
    3. 処理内容を選択し、「管理者用Password」を入力してください。\n"; } print <<"EOM";

    タイトル$sub
    URLhttp://$hp


    修正 削除

    Password  


    EOM exit; } #--------------# # メンテ実行 # #--------------# sub do_mente { # フォームチェック if ($in{'pwd'} eq '') { &error("Password が入力されていません"); } # ロック開始 if ($lockkey == 1 && $in{'action'} ne 'mente') { &lock1; } elsif ($lockkey == 2 && $in{'action'} ne 'mente') { &lock2; } open(IN,"$logfile") || &error("Open Error : $logfile","lock"); @lines = ; close(IN); # 修正処理実行 if ($in{'action'} eq "go") { # フォームチェック if (!$regtype) { if ($in{'name'} eq '') { &error("なまえの入力がありません","lock"); } if ($in{'pwd'} eq '') { &error("Password の入力がありません","lock"); } if ($in{'pwd'} =~ /\W/) { &error("Password に全角文字が含まれています。半角の英数字で入力してください。","lock"); } } if ($mailkey) { if ($in{'email'} !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です","lock"); } } if ($in{'url'} eq '') { &error("URLの入力がありません","lock"); } if ($in{'part'} eq '') { &error("分類の指定がありません","lock"); } if ($in{'sub'} eq '') { &error("タイトル名の入力がありません","lock"); } if ($in{'msg'} eq '') { &error("紹介コメントの入力がありません","lock"); } if (length($in{'msg'}) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています","lock"); } $flag=0; @new=(); foreach (@lines) { ($no,$pt,$sb,$hp,$bann,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho) = split(/<>/); if ($in{'no'} == $no) { $flag=1; # パスワード照合 $check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype); $_ = "$no<>$in{'part'}<>$in{'sub'}<>$in{'url'}<>$in{'b_url'}<>$in{'name'}<>$in{'email'}<>$pw<>$in{'msg'}<>$dt<>$ts<>$rec<>$cnt<>$ho<>\n"; } push(@new,$_); } if (!$flag) { &error("該当のデータが見つかりません","lock"); } # 認証チェック if ((!$regtype && $check ne 'yes' && $in{'pwd'} ne $pass) || ($regtype && $in{'pwd'} ne $pass)) { &error("Password が違います","lock"); } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 unlink($lockfile) if (-e $lockfile); # 完了メッセージ &header; print "


    ● 修正処理は完了しました ●\n"; print "

    *:*:*: Back :*:*:*\n"; print "


    \n"; &footer; print "\n"; exit; # 削除処理実行 } elsif ($in{'action'} eq "delete") { $flag=0; @new=(); foreach (@lines) { ($no,$pt,$sb,$hp,$bann,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho) = split(/<>/); if ($in{'no'} != $no) { push(@new,$_); } else { $flag=1; # パスワード照合 $check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype); } } if (!$flag) { &error("該当のデータが見つかりません","lock"); } # 認証チェック if ((!$regtype && $check ne 'yes' && $in{'pwd'} ne $pass) || ($regtype && $in{'pwd'} ne $pass)) { &error("Password が違います","lock"); } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 unlink($lockfile) if (-e $lockfile); # 完了メッセージ &header; print "


    ● 削除処理は完了しました ●\n"; print "

    *:*:*: Back :*:*:*\n"; print "


    \n"; &footer; print "\n"; exit; } $flag=0; foreach (@lines) { ($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$date,$ts,$rec,$count) = split(/<>/); if ($in{'no'} eq "$no") { $flag=1; # パスワード照合 $check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype); last; } } if (!$flag) { &error("指定のデータが見つかりません"); } # 認証チェック if (!$regtype && $check ne 'yes' && $in{'pwd'} ne $pass) { &error("Password が違います"); } elsif ($regtype && $in{'pwd'} ne "$pass") { &error("Password が違います"); } # 修正用画面を表示 &header; print <<"EOM";
    登録情報の修正
    *:*:*: Back :*:*:*

    1. 以下のフォームにて登録内容の修正を行います。
    2. 変更する部分のみ修正し、「送信」ボタンを押してください。


    EOM #バナー表示? if ($ba_img){ print "\n"; print "\n"; } print ""; print "\n"; if ($mailkey) { print ""; print "\n"; } print <<"EOM";
    URL
    Banner URL
    管理者名
    E-Mail

    分 類
    HP タイトル
    HP 紹介文($msg_limit文字以内)
      

    EOM exit; } #------------------# # ランキング表示 # #------------------# sub ranking { $times = time; # ランクファイルを読み込む open(IN,"$logfile") || &error("Open Error : $logfile"); &header; print "
    \n"; print "アクセスランキング
    \n"; print "*:*:*: Back :*:*:*
    \n"; print "

    \n"; print "\n"; print "\n"; print "\n"; while () { local($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$date,$ts,$rec,$count) = split(/<>/); $no{$no} = $no; $count{$no} = $count; $part{$no} = $part; $sub{$no} = $sub; $bann{$no} = $bann; $name{$no} = $name; $msg{$no} = $msg; $date{$no} = $date; $ts{$no} = $ts; $rec{$no} = $rec; } $rank1 = 0; $rank2 = 1; $count_tmp = 0; $i=0; $j=0; foreach (sort { ($count{$b} <=> $count{$a}) || ($a cmp $b) } keys(%count)) { $i++; if ($page eq "") { if ($i > $p_view) { last; } } else { if ($i < $page) { next; } else { $j++; if ($j > $p_view) { last; } } } ($count{$_} == $count_tmp) || ($rank1 = $rank2); # 桁区切り if (length($count{$_}) > 3) { $count{$_} = &filler($count{$_}); } if ($ban_w) { $bann_w = "width=$ban_w"; } else { $bann_w = ""; } if ($ban_h) { $bann_h = "height=$ban_h"; } else { $bann_h = ""; } if ($ba_img) { if ($bann{$_} eq "") { $sub{$_} = "$sub{$_}\n"; } else {$sub{$_} = "
    $sub{$_}
    \n";} } else { $sub{$_} = "$sub{$_}\n"; } $part{$_} = "$parts[$part{$_}]"; if ($page) { $ranking = $rank1 + $page - 1; } else { $ranking = $rank1; } print "
    \n"; print "\n"; print "\n"; $count_tmp = $count{$_}; $rank2++; } close(IN); print "
    順 位タイトルコメント[分類]

    $ranking
    ($count{$_}access)
    $sub{$_}\n"; print "$com_m $msg{$_}
        $master$name{$_} [$part{$_}]...$date{$_}\n"; # アイコンを表示 &icons('rank'); print "

    \n"; print "\n"; # 改頁処理 if ($page eq '') { $page = 1; } $next_line = $page + $p_view; $back_line = $page - $p_view; # 前頁処理 if ($back_line > 0) { print "\n"; } # 次頁処理 if ($next_line <= $i) { print "\n"; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; &footer; print "\n"; exit; } #------------# # 検索処理 # #------------# sub search { local($file, $pair, @pairs); # 入力内容を整理 $word = $in{'word'}; $word =~ tr/[A-Z]/[a-z]/; $word =~ s/ / /g; @pairs = split(/\s+/, $word); # 検索処理 open(IN,"$logfile") || &error("Open Error : $logfile"); @new=(); while () { ($no,$part,$sub,$hp,$bann,$name,$email,$pw,$msg) = split(/<>/); $file = "$sub$hp$name$msg"; $file =~ tr/[A-Z]/[a-z]/; $flag=0; foreach $pair (@pairs) { if (index($file,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag == 1) { push(@new,$_); } } close(IN); # 検索終了 $total = @new; &header; print "

    \n"; print "
    \n"; print "ワード検索
    \n"; print "*:*:*: Back :*:*:*

    \n"; print "

    \n"; print "\n"; print "\n"; print "条件 \n"; print "表\示 \n"; print "
    \n"; # 検索でヒットのない場合のエラーメッセージ if (!$total) { print "


    \n"; print "● キーワード $in{'word'} は見つかりませんでした。 ●\n"; print "


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

    検索結果:$total件


    \n"; # エンコード $enwd = $in{'word'}; $enwd =~ s/([\x00-\x1F\x7F\x80-\xff])/"%" . unpack("H2", $1)/eg; if ($in{'page'} eq '') { $in{'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 = $in{'page'} - $in{'view'}; foreach ($in{'page'} .. $page_end) { ($no,$part,$sub,$hp,$bann,$name,$email,$pw,$msg,$dt,$ts,$rec) = split(/<>/, $new[$_]); $sub = "$sub\n"; $times = time; # 結果を表示 print "$sub "; print "[$parts[$part]]...$dt\n"; &icons; print "
    $com_m $msg
        $master$name
    \n"; } # ページ繰越部 print "
    \n"; if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "
    \n"; print "
    \n"; &footer; print "\n"; exit; } #----------------------------# # 分類(カテゴリー)を表示 # #----------------------------# sub part_view { &header; print "
    \n"; print "
    \n"; print "$parts[$in{'part'}]
    \n"; print "*:*:*: Back :*:*:*\n"; if (!$regtype) { print "      *:*:*: 新規登録 :*:*:*\n"; } print "

    \n"; if ($in{'k'}) { print "登録件数:$in{'k'}
    \n"; } print "
    \n"; print "
    • タイトル部分をクリックするとそのホームページへジャンプします。
      \n
    • "; if ($rank_on) { print "タイトル横の数値はアクセス数、"; } print " は「新着」、"; print " は「$lsicon」マークです。\n"; print "
    \n"; print "
    \n"; print "


    \n"; open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; $j=0; while () { local($no,$pt,$sub,$hp,$bann,$name, $email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($in{'part'} ne "$pt") { next; } $i++; if ($page eq "") { if ($i > $p_view) { last; } } else { if ($i < $page) { next; } else { $j++; if ($j > $p_view) { last; } } } $hp_t = "$sub\n"; $times = time; if ($ban_w) { $bann_w = "width=$ban_w"; } else { $bann_w = ""; } if ($ban_h) { $bann_h = "height=$ban_h"; } else { $bann_h = ""; } # 結果を表示 print ""; if ($ba_img){ if ($bann eq "") { print "
    $hp_t\n"; if ($rank_on) { print "[$axs]"; } print " ...$dt [修正・削除]\n"; } else { print "
    \n"; print ""; print "
    $sub
    \n"; print "
    "; if ($rank_on) { print "[$axs]"; } print " ...$dt [修正・削除]\n"; } } else { print "$hp_t\n"; if ($rank_on) { print "[$axs]"; } print " ...$dt [修正・削除]\n"; } &icons; # アイコンを表示 print "
    $com_m $msg
        $master$name
    \n"; print "
    \n"; } close(IN); # 改頁処理 if ($page eq '') { $page = 1; } $next_line = $page + $p_view; $back_line = $page - $p_view; print "\n"; # 前頁処理 if ($back_line > 0) { print "\n"; } # 次頁処理 if ($next_line <= $i) { print "\n"; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; &footer; print "\n"; exit; } #------------# # 新着情報 # #------------# sub new_sort { &header; print "
    \n"; print "新着情報
    \n"; print "*:*:*: Back :*:*:*

    \n"; print "

  • 以下に表\示する情報は新規登録の最新 $w_new件です。\n"; print "


    \n"; print "
    \n"; open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; while () { $i++; local($no,$part,$sub,$hp,$bann,$name,$email,$pw,$msg,$dt,$ts,$rec) = split(/<>/); $times = time; $hp_t = "$sub\n"; if ($ban_w) { $bann_w = "width=$ban_w"; } else { $bann_w = ""; } if ($ban_h) { $bann_h = "height=$ban_h"; } else { $bann_h = ""; } # 結果を表示 print "\n"; if ($ba_img){ if ($bann eq "") { print ""; print ""; print "
    $hp_t\n"; print "[$parts[$part]]\n"; print "  ...$dt\n"; # おすすめアイコン print " "if ($rec == 1); } else { print "
    \n"; print ""; print "
    $sub
    \n"; print "
    [$parts[$part]]\n"; print "  ...$dt\n"; # おすすめアイコン print " "if ($rec == 1); } } else { print "$hp_t\n"; print "[$parts[$part]]\n"; print "  ...$dt\n"; # おすすめアイコン print " "if ($rec == 1); } print "
    $com_m $msg
        $master$name
    \n"; print "
    \n"; # 規定件数でループを抜ける if ($i >= $w_new) { last; } } close(IN); print "
    \n"; &footer; print "\n"; exit; } #----------------------# # リンクジャンプ処理 # #----------------------# sub link_jump { # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } $flag = 0; @new = (); open(IN,"$logfile") || &error("Open Error : $logfile","lock"); while () { ($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/); if ($no eq "$in{'links'}") { $flag = 1; $axs++; $_ = "$no<>$part<>$sub<>$hp<>$bann<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$axs<>$ho<>\n"; $url = $hp; $b_url = $bann; } push(@new,$_); } close(IN); if (!$flag) { &error("リンク先のURL情報が見当たりません","lock"); } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 unlink($lockfile) if (-e $lockfile); # METAタグ方式 if ($meta_jump) { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "

    *- しばらくお待ちください -*

    \n"; print "

    しばらく待っても移動できない場合は ここ をクリックしてください\n"; print "

    \n\n"; exit; } # 目的のURLへジャンプする if ($ENV{'PERLXS'} eq "PerlIS") { # IIS (PerlIS) サーバ対応 print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: http://$url\n\n"; exit; } #------------# # 注意事項 # #------------# sub howto { &header; print <<"EOM";
    注意事項と使用方法について
    *:*:*: Back :*:*:*

    1. このナビゲータは任意の「キーワード」から自由にホームページ情報を検索することが可能\です。

    2. 検索するキーワードは半角スペースで区切って、複数のキーワードを使うことができます。AND と OR をうまく使い分けて目的のホームページを検索してください。

    3. 新規に登録された情報は $newtime日間 マークが表\示されます。

      EOM if (!$regtype) { print <<"EOM";

    4. このナビゲータにあなたのホームページを登録することができます。タイトル下の「新規登録」をクリックすると登録フォームが現れます。

    5. 登録時に任意の Password(英数字で8文字以内)を入力してください。後日その Password を使って、登録内容の修正・削除等のメンテナンス作業を行うことができます。(登録情報の 「修正・削除」をクリックするとメンテ画面が現れます)

    6. 管理者が登録内容について、主観的にふさわしくないと判断した場合、及び登録されたURLのリンク先がなくなっている場合には、予\告なく内容を削除することがあります。

      EOM } if ($rank_on) { print <<"EOM";

    7. 登録されたURLをクリックされた回数はログファイルに蓄積され、ランキング表\示されます。タイトル下の「ランキング」をクリックすると現時点のアクセスランキングが表\示されます。

      EOM } print <<"EOM";

    EOM &footer; print ""; exit; } #--------------# # 管理モード # #--------------# sub admin { if ($in{'action'}) { if ($in{'pass'} ne "$pass") { &error("Password が違います"); } } if ($in{'do'} eq "newurl") { &new_url; } &header; print "

    \n"; print "管理用画面\n"; print "
    \n"; print "*:*:*: Back :*:*:*

    \n"; # 入室画面 if ($in{'action'} eq '') { print "● 処理を選択し Password を入力してください ●\n"; print "

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

     削除\n"; print "   $lsicon\n"; if ($regtype) { print "   登録\n"; } print "   復元\n"; print "

     "; print "

    \n"; print "\n"; exit; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); # 復元画面 if ($in{'do'} eq "refile") { print "
      \n"; print "
    • ただ今より記録ファイルをバックアップファイルから復元します。\n"; print "
    • 復元するバックアップファイルを選択して復元ボタンを押して下さい。
    • \n"; print "

      \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach ("A", "B", "C") { $backfile = "$backdir/$_\.bak"; $size = -s $backfile; $time = int (-M $backfile); print "\n"; print "\n"; } print "
      ファイル名容量バックアップ
      \n"; print "$_ファイル$size Bytes$time日前


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

    \n"; print "
    \n"; exit; } # 復元実行 elsif ($in{'do'} eq "backfile") { if ($in{'file'} eq "") { &error("ファイルが選択されていません"); } $backfile = "$backdir/$in{'file'}\.bak"; open(IN,"$backfile") || &error("Open Error : $backfile"); open(OUT,">$logfile") || &error("Write Error : $logfile"); while () { print OUT $_; } close(OUT); close(IN); print "

    処理は正常に終了しました

    \n"; print "

    \n"; print "
    \n"; print "
    \n\n"; exit; } # ログ容量を算出 $size = -s $logfile; print "

    \n"; print "● ログ容量:$sizeBytes
    \n"; if ($in{'do'} eq 'del') { print "● 削除用チェックボックスにチェックを入れ、処理ボタンを押してください。
    \n"; } elsif ($in{'do'} eq 'rec') { print "● 「$lsicon」マークを付加する場合にはチェックボックスにチェックを入れてください。
    \n"; } print "
    \n"; print "

    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($in{'do'} eq 'del') { print "\n"; } elsif ($in{'do'} eq 'rec') { print "\n"; } print ""; print "\n"; if ($in{'part'} eq "") { $in{'part'} = 0; } foreach $line (@lines) { ($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $line); if ($in{'part'} ne "$part") { next; } ($dt,$dmy) = split(/\(/, $dt); if ($email ne "") { $name = "$name"; } $sub2 = $sub; if (length($sub) > 20) { $sub2 = substr($sub2,0,18); $sub2 .= '..'; } $sub = "$sub2"; if (length($msg) > 40) { $msg = substr($msg,0,38); $msg .= '..'; } $msg =~ s/
    / /g; print "\n"; print ""; print "\n"; } print "
    削除チェックタイトルコメントアクセス管理者ホスト名登録日
    $sub "; if ($rec) { print ""; } print "$msg$axs$name$ho$dt

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

    \n"; &footer; print "\n"; exit; } #--------------------------------------# # 管理者一括削除/推奨マーク付加処理 # #--------------------------------------# sub admin_edit { if ($in{'pass'} ne "$pass") { &error("Password が違います"); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(IN,"$logfile") || &error("Open Error : $logfile","lock"); @lines = ; close(IN); ## 削除処理 if ($in{'do'} eq 'del') { @new=(); foreach $line (@lines) { $dflag=0; ($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $line); foreach $del (@delete) { if ($no eq "$del") { $dflag=1; last; } } if ($dflag == 0) { push(@new,$line); } } ## 推奨マーク付加処理 } elsif ($in{'do'} eq 'rec') { @new=(); foreach $line (@lines) { ($no,$part,$sub,$hp,$bann,$name,$email, $pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $line); foreach (@recs) { if ($no eq "$_") { if ($rec == 0) { $rec = 1; } else { $rec = 0; } $line = "$no<>$part<>$sub<>$hp<>$bann<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$axs<>$ho<>\n"; last; } } push(@new,$line); } } # ログを更新 open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 unlink($lockfile) if (-e $lockfile); # 初期画面に戻る &admin; } #----------------------------# # フォームからのデータ処理 # #----------------------------# sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コード変換 &jcode'convert(*value,'sjis'); # タグ処理 $value =~ s//>/g; # 削除/推奨マーク処理 if ($name eq 'del') { push(@delete,$value); } elsif ($name eq 'rec') { push(@recs,$value); } $in{$name} = $value; } $in{'msg'} =~ s/\r\n/
    /g; $in{'msg'} =~ s/\r/
    /g; $in{'msg'} =~ s/\n/
    /g; $in{'url'} =~ s/^http\:\/\///; $in{'b_url'}=~ s/^http\:\/\///; $mode = $in{'mode'}; $part = $in{'part'}; $page = $in{'page'}; } #----------------# # HTMLのヘッダ # #----------------# sub header { $head_flag=1; print "Content-type: text/html\n\n"; print <<"EOM"; $style $title EOM } #----------------------# # パスワード暗号処理 # #----------------------# sub encrypt { local($inpw) = $_[0]; local(@SALT, $salt, $encrypt); @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))]; $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); return $encrypt; } #----------------------# # パスワード照合処理 # #----------------------# sub decrypt { local($inpw, $logpw) = @_; local($salt, $key, $check); $salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); $check = "no"; if (crypt($inpw, $salt) eq "$logpw" || crypt($inpw, '$1$' . $salt) eq "$logpw") { $check = "yes"; } return $check; } #--------------------------------# # ロックファイル : symlink関数 # #--------------------------------# sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error("LOCK is BUSY","lock"); } sleep(1); } } #-----------------------------# # ロックファイル : open関数 # #-----------------------------# sub lock2 { local($flag) = 0; foreach (1 .. 5) { unless (-e $lockfile) { open(LOCK,">$lockfile") || &error("Write Error : $lockfile","lock"); close(LOCK); $flag = 1; last; } else { sleep(1); } } if (!$flag) { &error("LOCK is BUSY","lock"); } } #--------------# # エラー処理 # #--------------# sub error { if ($_[1] eq "lock" && -e $lockfile) { unlink($lockfile); } &header if (!$head_flag); print "

    ERROR !

    \n"; print "

    $_[0]\n"; print "


    \n"; print "\n"; exit; } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($get_remotehost) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2); } } if ($host eq "") { $host = $addr; } } #------------------# # メール送信処理 # #------------------# sub mail_to { unless (-e $sendmail) { &error("sendmailのパスが不正です"); } # メールタイトル $mail_sub = "$title 登録完了通知"; # メール本文 $mail_msg = <<"EOM"; $in{'name'} さま この度は、$title への登録をありがとうございました。 登録内容は以下のとおりですので、ご確認ください。 ■登録日時:$date ■ホスト名:$host ■管理者名:$in{'name'} ■Eメール:$in{'email'} ■タイトル:$in{'sub'} ■URL :http://$in{'url'} ■Banner URL:http://$in{'b_url'} ■管理Password:$in{'pwd'} ■紹介コメント $in{'msg'} なお、今後登録内容の修正や削除が発生する場合には、ご登録頂いた パスワードにて全て行うことができますので、パスワードは大切に 保管しておいて下さい。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ $title管理人 $admin E-Mail: $admin_mail Home: $admin_url EOM # JISコードへ変換 &jcode'convert(*mail_sub,'jis'); &jcode'convert(*mail_msg,'jis'); # コメント内の改行とタグを復元 $mail_msg =~ s/
    /\n/ig; $mail_msg =~ s/<//g; # メール処理 open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました"); print MAIL "To: $in{'email'}\n"; print MAIL "From: $admin_mail\n"; print MAIL "Bcc: $admin_mail\n" if ($mailing == 2); print MAIL "Subject: $mail_sub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$mail_msg\n"; close(MAIL); } #----------------------------# # アイコンの定義および表示 # #----------------------------# sub icons { if ($_[0] eq 'rank') { if ($times - $ts{$_} < $newtime*24*60*60) { print " "; } if ($rec{$_} == 1) { print " "; } } else { if ($times - $ts < $newtime*24*60*60) { print " "; } if ($rec == 1) { print " "; } } } #--------------# # 時間の取得 # #--------------# sub get_time { $ENV{'TZ'} = "JST-9"; # タイムゾーンを日本時間へ $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy,$dmy) = localtime($times); @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 filler { local($_) = $_[0]; 1 while s/(.*\d)(\d\d\d)/$1,$2/; return $_; } ## --- カウンタ処理 sub counter { # 閲覧時のみカウントアップ $match=0; if ($FORM{'mode'} eq '') { # カウンタロック if ($lockkey) { &lock3; } $match=1; } # カウントファイルを読みこみ open(NO,"$cntfile") || &error("Can't open $cntfile",'0'); $cnt = ; close(NO); # カウントアップ if ($match) { $cnt++; } # 更新 open(OUT,">$cntfile") || &error("Write Error : $cntfile"); print OUT $cnt; close(OUT); # カウンタロック解除 if (-e $cntlock) { unlink($cntlock); } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . "$cnt"; } @cnts = split(//,$cnt); print "
    \n"; # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } # テキストカウンタ表示 } else { print "$cnt"; } print "
    \n"; } ## --- カウンタロック sub lock3 { $cnt_flag = 0; foreach (1 .. 7) { if (-e $cntlock) { sleep(1); } else { open(LOCK,">$cntlock"); close(LOCK); $cnt_flag = 1; last; } } if (!$cnt_flag) { unlink($cntlock); } }