#!/usr/local/bin/perl
use CGI::Carp qw(fatalsToBrowser); # エラー原因を探すときはこの行を有効にしてみること
# 1998.04.19 V1.00 初版
# 1998.05.24 V1.01 URL変更の処理見直し
# 1998.05.27 V1.02 チルダ(~)を含むURLを変更できないバグを修正
# 1998.08.02 V1.03 HP MAKINGDIRECTORY から URLの広場 に改名
# 1999.05.23 V1.04 $return_urlを指定可能にした
# 1999.06.06 V1.05 nkfを使用しないようにした
# 1999.06.06 V1.06 ホームページ関連情報を含むチェックを確認するようにした

#このCGIスクリプトのオリジナルは、杜甫々氏のURLの広場です。
#http://www.wakusei.ne.jp/tohoho/www.htm
#オリジナル版では、誰でも自由に登録できますが、この改造版では、
#パスワード機能により、設置者にしか登録できません。
#これにより、厳選されたリンク集を構築するのに適するような気がします。
#

#パーミッション
#+- wwwhpmd(777)　ディレクトリ
#|   |
#|   +-- 1000.txt(666)
#|
#+- wwwhpmd.cgi(755)


#============================================
# 2002.06.01 管理人登録限定版に改造
#
#
#
#
#============================================


# データファイルのフォーマット
# $x[0] = URL
# $x[1] = TITLE
# $x[2] = EMAIL
# $x[3] = NAME
# $x[4] = COMMENT
# $x[5] = DATE
# $x[6] = COUNT


############################################################
#　　　　■設定ここから■
############################################################

$return_url = '../index.html';

#メールアドレス
$mailad = '';

#パスワード
$passward = 'pass';


$title = 'リンク集';

$body = "<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000CD\" vlink=\"#0000CD\" alink=\"#FF0000\">";

############################################################
#　　　　■設定ここまで■
############################################################


# 漢字コード変換ライブラリ
require "./jcode.pl";

# flock()のパラメータ
$READ = 1;
$WRITE = 2;
$UNLOCK = 8;

#
# メインルーチン
#
{
    # %7e(~)を含む場合のCGI引数は信用できないので自前で生成する
    if ($ENV{'REQUEST_METHOD'} eq "GET") {
        @ARGV = split(/\+/, $ENV{'QUERY_STRING'});
        for ($i = 0; $i <= $#ARGV; $i++) {
            $ARGV[$i] =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
        }
    }

    if ($ENV{'REMOTE_ADDR'} eq "127.0.0.1") {
        $script = "http://127.0.0.1/cgi-bin/wwwhpmd.cgi";
    } else {
        $script = "./wwwhpmd.cgi";
    }

    if ($#ARGV == -1) {
        &printList;
    } elsif ($ARGV[0] eq "dsp") {
        &dspItem;
    } elsif ($ARGV[0] eq "new") {
        &newItem;
    } elsif ($ARGV[0] eq "add1") {
        &addItem1;
    } elsif ($ARGV[0] eq "add2") {
        &addItem2;
    } elsif ($ARGV[0] eq "mod1") {
        &modItem1;
    } elsif ($ARGV[0] eq "mod2") {
        &modItem2;
    } elsif ($ARGV[0] eq "mod3") {
        &modItem3;
    } elsif ($ARGV[0] eq "mod4") {
        &modItem4;
    } elsif ($ARGV[0] eq "del1") {
        &delItem1;
    } elsif ($ARGV[0] eq "del2") {
        &delItem2;
    } elsif ($ARGV[0] eq "del3") {
        &delItem3;
    } elsif ($ARGV[0] eq "jump") {
        &jumpItem;
    } elsif ($ARGV[0] eq "find") {
        &findItem;
    }
}

#
# ディレクトリ一覧
#
sub printList {
    &printHead("$title");
#    print "<HR noshade>\n";
    print "おすすめサイト等へのリンクです。\n";
#    print "ホームページ作成関連情報を含むURLを自由に登録・参照してください。\n";
#    print "<BR>カテゴリの追加も自由に行うことができます。\n";
    print "<HR noshade>\n";
    print "[<A HREF=\"$return_url\">戻る</A>]\n";
    print "[<A HREF=\"wwwhpmd.cgi?new\">新着情報</A>]\n";
    print "[<A HREF=\"wwwhpmd.cgi?add1\">URL登録</A>]\n";
    print "[<A HREF=\"wwwhpmd.cgi?mod1\">URL変更</A>]\n";
    print "[<A HREF=\"wwwhpmd.cgi?del1\">URL削除</A>]\n";
    print "<HR noshade>\n";
    print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?find\">\n";
    print "<INPUT TYPE=type NAME=WORD>\n";
    print "<INPUT TYPE=submit VALUE=\" 検索 \">\n";
    print "</FORM>\n";
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        $icnt = 0;
        open(IN, "wwwhpmd/$file");
        $category = <IN>;
        chop($category);
        while (<IN>) {
            $icnt++;
        }
        close(IN);
        $category_list[$ccnt++] = "$category\t<A HREF=\"wwwhpmd.cgi?dsp+$file\">$category</A> ($icnt)";
    }
    closedir(DIR);

    # カウンタアップ
    open(IN, "wwwhpmd/wwwhpmd.cnt");
    $count = <IN>;
    close(IN);
    chop($count);
    $count++;
    open(OUT, "> wwwhpmd/wwwhpmd.cnt");
    print OUT "$count\n";
    close(OUT);

    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    @category_list = sort { $a cmp $b } @category_list;
    print "括弧内の数字は登録URL件数を示します。\n";
    print "<UL>\n";
    for ($i = 0; $i < $ccnt; $i++) {
        @x = split(/\t/, $category_list[$i]);
        print "<LI>$x[1]\n";
    }
#    print "<P>\n";
#    print "<LI>URL登録でカテゴリの追加も可能\です。\n";
    print "</UL>\n";
    print "<HR noshade>\n";
    print "[<A HREF=\"$return_url\">戻る</A>]\n";
#    print "[<A HREF=\"wwwhpmd.cgi?new\">新着情報</A>]\n";
#    print "[<A HREF=\"wwwhpmd.cgi?add1\">URL登録</A>]\n";
#    print "[<A HREF=\"wwwhpmd.cgi?mod1\">URL変更</A>]\n";
#    print "[<A HREF=\"wwwhpmd.cgi?del1\">URL削除</A>]\n";
    print "<HR noshade>\n";
#    print "問題などありましたら、";
#    print "<A HREF=\"mailto:$mailad\">$mailad</A>";
#    print "までご連絡ください。\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# 新着情報
#
sub newItem {
    &printHead("$title");
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "最近１週間以内に登録・変更されたURLを示します。\n";
    print "<DL>\n";
    $date = time() - 3600 * 24 * 7;
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        open(IN, "wwwhpmd/$file");
        $category = <IN>;
        chop($category);
        while (<IN>) {
            @x = split(/\t/, $_);
            if ($date <= $x[5]) {
                if ($category ne "") {
                    print "<DT><P><B>$category</B>\n";
                    $category = "";
                }
                # $x[0] =~ s/([^0-9a-zA-Z:\/\.\-])/sprintf("%%%02X", unpack("C", $1))/eg;
                # $x[6] =~ s/[\r\n]+//g;
                print "<DT><P><A HREF=\"$x[0]\">$x[1]</A>\n";
#                print "（<A HREF=\"mailto:$x[2]\">$x[3]</A>）\n";
                print "<DD>$x[4]\n";
            }

        }
        close(IN);
    }
    closedir(DIR);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    print "</DL>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# 検索
#
sub findItem {
    &readParam();
    &printHead("$title");
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?find\">\n";
    print "<INPUT TYPE=text NAME=WORD VALUE=\"$FORM{'WORD'}\">\n";
    print "<INPUT TYPE=submit VALUE=\"検索\">\n";
    print "</FORM>\n";
    print "<HR noshade>\n";
    print "<DL>\n";
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        open(IN, "wwwhpmd/$file");
        $category = <IN>;
        chop($category);
        while (<IN>) {
            if ($_ =~ /$FORM{'WORD'}/i) {
                if ($category ne "") {
                    print "<DT><P><B>$category</B>\n";
                    $category = "";
                }
                @x = split(/\t/, $_);
                # $x[0] =~ s/([^0-9a-zA-Z:\/\.\-])/sprintf("%%%02X", unpack("C", $1))/eg;
                # $x[6] =~ s/[\r\n]+//g;
                print "<DT><P><A HREF=\"$x[0]\">$x[1]</A>\n";
#                print "（<A HREF=\"mailto:$x[2]\">$x[3]</A>）\n";
                print "<DD>$x[4]\n";
            }
        }
        close(IN);
    }
    closedir(DIR);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    print "</DL>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL表示
#
sub dspItem {
    $file = $ARGV[1];
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };
    open(IN, "wwwhpmd/$file");
    $category = <IN>;
    chop($category);
    &printHead($category);
    print "<HR noshade>\n";
    print "[<A HREF=\"wwwhpmd.cgi\">戻る</A>]\n";
    print "<HR noshade>\n";
    print "<ul>\n";
    while (<IN>) {
        @x = split(/\t/, $_);
        # $x[0] =~ s/([^0-9a-zA-Z:\/\.\-])/sprintf("%%%02X", unpack("C", $1))/eg;
        # $x[6] =~ s/[\r\n]+//g;
        print "<li><A HREF=\"$x[0]\">$x[1]</A>\n";
#        print "（<A HREF=\"mailto:$x[2]\">$x[3]</A>）\n";
        print "<font size=2>（$x[4]）</font><font size=5>　</font>\n";
    }
    print "</ul>\n";
    close(IN);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    print "<HR noshade>\n";
    print "[<A HREF=\"wwwhpmd.cgi\">戻る</A>]\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL登録(1)
#
sub addItem1 {
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        open(IN, "wwwhpmd/$file");
        $category[$ccnt++] = <IN> . "\t$file";
        close(IN);
    }
    @category = sort { $a cmp $b } @category;
    closedir(DIR);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);

    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
#    print "<HR noshade>\n";
#    print "<UL>\n";
#    print "<LI><FONT COLOR=red>ホームページの作り方に関する情報を含むURLのみ</FONT>を登録してください。\n";
#    print "<LI>登録は自薦に限ります。\n";
#    print "<LI>登録した内容は管理者(あるいは障害)によって消去・変更されることがありますのでご了承ください。\n";
#    print "<LI>半角カタカナは使用禁止です。\n";
#    print "</UL>\n";
#    print "<HR noshade>\n";
    print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?add2\">";
    print "<B>登録したいカテゴリ：</B>\n";
    print "<BR><SELECT NAME=FILE>\n";
    print "<OPTION VALUE=NEW>(新規登録)\n";
    for ($i = 0; $i <= $#category; $i++) {
        ($tt, $ff) = split("\t", $category[$i]);
        print "<OPTION VALUE=\"$ff\">$tt\n";
    }
    print "</SELECT>\n";
    print "<BR>\n";
    print "<BR><B>新規登録するカテゴリ：</B>\n";
    print "<BR>通常は入力不要です。\n";
    print "カテゴリを新規登録する場合のみ、上の「登録したいカテゴリ」で「(新規登録)」を選んで、下の入力欄にカテゴリ名を入力してください。\n";
    print "英数記号文字はすべて<FONT COLOR=red>半角文字</FONT>で入力してください。\n";
    print "サブカテゴリは「HTML/リファレンス」などのように半角スラッシュで区切ってください。\n";
    print "<BR><INPUT TYPE=text SIZE=50 NAME=CATEGORY>\n";
    print "<BR>\n";
    print "<BR><B>ホームページのタイトル：</B>\n";
    print "<BR><INPUT TYPE=text SIZE=50 NAME=TITLE>\n";
    print "<BR>\n";
    print "<BR><B>ホームページのURL：</B>\n";
    print "<BR><INPUT TYPE=text SIZE=50 NAME=URL VALUE=\"http://\">\n";
    print "<BR>\n";
#    print "<BR><B>登録するホームページがホームページ作成関連情報を含むか(確認)：</B>\n";
#    print "<BR>（含まない場合は、$title への登録はお控えください。）\n";
#    print "<BR><INPUT TYPE=checkbox NAME=CHECK> チェック\n";
    print "<BR>\n";
    print "<BR><B>あなたの名前またはペンネーム：</B>\n";
    print "<BR><INPUT TYPE=text SIZE=50 NAME=NAME>\n";
    print "<BR>\n";
    print "<BR><B>あなたのメールアドレス：</B>\n";
    print "<BR><INPUT TYPE=text SIZE=50 NAME=EMAIL>\n";
    print "<BR>\n";
    print "<BR><B>ホームページのコメント：</B>\n";
    print "<BR>改行は無視されます。HTMLは使えません。あまり長いコメントは差し控えください。\n";
    print "<BR><TEXTAREA COLS=50 ROWS=5 NAME=COMMENT WRAP=soft></TEXTAREA>\n";
    print "<BR><BR>パスワード\n";
    print "<BR><INPUT TYPE=text NAME=pass SIZE=20 VALUE=\"\">\n";
    print "<BR>\n";
    print "<BR><INPUT TYPE=submit VALUE=\" 登録 \">\n";
    print "<INPUT TYPE=reset VALUE=\" 取消 \">\n";
    print "</FORM>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL登録(2)
#
sub addItem2 {
    &readParam;
    $file = $FORM{'FILE'};

    # 改行コードを置換する。
    # 次の行が日本語の場合は削除。
    # 日本語でない場合は１文字分のスペースに置換。
    $FORM{'COMMENT'} =~ s/[\r\n]+([\x20-\x7e])/ $1/g;
    $FORM{'COMMENT'} =~ s/[\r\n]+//g;

    #
    # 必須項目が省略されていないかチェック
    #

    if ($FORM{'pass'} ne "$passward") {
&passcheck;
    }

    if (($FORM{'URL'} eq "") || ($FORM{'TITLE'} eq "") ||
            ($FORM{'EMAIL'} eq "") || ($FORM{'NAME'} eq "") ||
            ($FORM{'COMMENT'} eq "")) {
        print "Content-type: text/html\n";
        print "\n";
        print "入力されていない項目があります。\n";
        return;
    }
    if (("$file" eq "NEW") && ($FORM{'CATEGORY'} eq "")) {
        print "Content-type: text/html\n";
        print "\n";
        print "入力されていない項目があります。\n";
        return;
    }
#    if ($FORM{'CHECK'} ne "on") {
#        print "Content-type: text/html\n";
#        print "\n";
#        print "ホームページ作成関連情報を含むページのみ登録可能\です。\n";
#        return;
#    }

    # 今日の日付を得る
    $date = time();

    # ロック
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };

    # 新規ファイルの作成
    if ("$file" eq "NEW") {
        for ($i = 1000; $i <= 9999; $i++) {
            if (! -f "wwwhpmd/$i.txt") {
                last;
            }
        }
        if ($i == 10000) {
            print "Too many categories.\n";
            return;
        }
        $file = "$i.txt";
        open(OUT, "> wwwhpmd/$file");
        print OUT "$FORM{'CATEGORY'}\n";
        close(OUT);
    }

    # ファイルにURLを追加する
    open(IN, "wwwhpmd/$file");
    open(OUT, "> wwwhpmd/wwwhpmd.tmp");
    $category = <IN>;
    print OUT $category;
    print OUT "$FORM{'URL'}\t";
    print OUT "$FORM{'TITLE'}\t";
    print OUT "$FORM{'EMAIL'}\t";
    print OUT "$FORM{'NAME'}\t";
    print OUT "$FORM{'COMMENT'}\t";
    print OUT "$date\t";
    print OUT "1\n";
    while (<IN>) {
        print OUT $_;
    }
    close(IN);
    close(OUT);

    rename("wwwhpmd/$file", "wwwhpmd/wwwhpmd.bak");
    rename("wwwhpmd/wwwhpmd.tmp", "wwwhpmd/$file");
    unlink("wwwhpmd/wwwhpmd.bak");

    eval { flock(LOC, $UNLOCK); };
    close(LOC);

#    &sendMail;

    print "Location: $script?dsp+$file\n";
    print "\n";
}

#
# URL削除(1)
#
sub delItem1 {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?del2\">";
    print "削除したいホームページのURLを入力してください。\n";
    print "<BR><BR><INPUT TYPE=text NAME=URL SIZE=50 VALUE=\"http://\">\n";
    print "<BR><BR>パスワード\n";
    print "<BR><INPUT TYPE=text NAME=pass SIZE=20 VALUE=\"\">\n";
    print "<BR><BR><INPUT TYPE=submit VALUE=\" 次へ \">\n";
    print "</FORM>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL削除(2)
#
sub delItem2 {
    &readParam;

    if ($FORM{'pass'} ne "$passward") {
&passcheck;
    }


    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "削除したい項目を選んでください。\n";
    print "<DL>\n";
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        open(IN, "wwwhpmd/$file");
        $category = <IN>;
        while (<IN>) {
            chop($_);
            @x = split(/\t/, $_);
            if ($x[0] eq $FORM{'URL'}) {
                $x[0] =~ s/([^0-9a-zA-Z:\/\.\-])/sprintf("%%%02X", unpack("C", $1))/eg;
                print "<DT><P><B>$category</B>\n";
                print "<DT><A HREF=\"wwwhpmd.cgi?del3+$file+$x[0]\">$x[1]</A>\n";
                print "(<A HREF=\"mailto:$x[2]\">$x[3]</A>)\n";
                print "<DD>$x[4]\n";
            }
        }
        close(IN);
    }
    closedir(DIR);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    print "</DL>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL削除(3)
#
sub delItem3 {
    $file = $ARGV[1];
    $url = $ARGV[2];
    $url =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };
    open(IN, "wwwhpmd/$file");
    open(OUT, "> wwwhpmd/wwwhpmd.tmp");
    $category = <IN>;
    print OUT $category;
    while (<IN>) {
        @x = split(/\t/, $_);
        if ($x[0] ne $url) {
            print OUT $_;
        }
    }
    close(IN);
    close(OUT);

    rename("wwwhpmd/$file", "wwwhpmd/wwwhpmd.bak");
    rename("wwwhpmd/wwwhpmd.tmp", "wwwhpmd/$file");
    unlink("wwwhpmd/wwwhpmd.bak");

    eval { flock(LOC, $UNLOCK); };
    close(LOC);

    &sendMail;

    print "Location: $script\n";
    print "\n";
}

#
# URL変更(1)
#
sub modItem1 {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?mod2\">";
    print "変更したいホームページのURLを入力してください。\n";
    print "<BR><BR><INPUT TYPE=text NAME=URL SIZE=50 VALUE=\"http://\">\n";
    print "<BR><BR>パスワード\n";
    print "<BR><INPUT TYPE=text NAME=pass SIZE=20 VALUE=\"\">\n";
    print "<BR><BR><INPUT TYPE=submit VALUE=\" 次へ \">\n";
    print "</FORM>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL変更(2)
#
sub modItem2 {
    &readParam;

    if ($FORM{'pass'} ne "$passward") {
&passcheck;
    }

    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    print "変更したい項目を選んでください。\n";
    print "<DL>\n";
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $READ); };
    opendir(DIR, "wwwhpmd");
    while ($file = readdir(DIR)) {
        if (!($file =~ /\.txt$/)) {
            next;
        }
        open(IN, "wwwhpmd/$file");
        $category = <IN>;
        chop($category);
        while (<IN>) {
            chop($_);
            @x = split(/\t/, $_);
            if ($x[0] eq $FORM{'URL'}) {
                $x[0] =~ s/([^0-9a-zA-Z:\/\.\-])/sprintf("%%%02X", unpack("C", $1))/eg;
                print "<DT><P><B>$category</B>\n";
                print "<DT><A HREF=\"wwwhpmd.cgi?mod3+$file+$x[0]\">$x[1]</A>\n";
                print "($x[3] $x[2])\n";
                print "<DD>$x[4]\n";
            }
        }
        close(IN);
    }
    closedir(DIR);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    print "</DL>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL変更(3)
#
sub modItem3 {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3>\n";
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
    $file = $ARGV[1];
    $url = $ARGV[2];
    $url =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };
    open(IN, "wwwhpmd/$file");
    $category = <IN>;
    chop($category);
    $find_flag = 0;
    while (<IN>) {
        chop($_);
        @x = split(/\t/, $_);
        if ($x[0] eq $url) {
            $find_flag = 1;
            last;
        }
    }
    print "<HR noshade>\n";
    close(IN);
    eval { flock(LOC, $UNLOCK); };
    close(LOC);
    if ($find_flag == 0) {
        print "該当するURLが見当たりませんでした。\n";
    } else {
        print "<FORM METHOD=POST ACTION=\"wwwhpmd.cgi?mod4+$file\">\n";
        print "<B>カテゴリ：</B>\n";
        print "<INPUT TYPE=hidden NAME=FILE VALUE=\"$file\">\n";
        print "<TABLE BORDER=1><TR><TD>$category</TD></TR></TABLE>\n";
        print "<BR><B>ホームページのタイトル：</B>\n";
        print "<BR><INPUT TYPE=text SIZE=50 NAME=TITLE VALUE=\"$x[1]\">\n";
        print "<BR>\n";
        print "<BR><B>ホームページのURL：</B>\n";
        print "<INPUT TYPE=hidden NAME=URLOLD VALUE=\"$x[0]\">\n";
        print "<BR><INPUT TYPE=text SIZE=50 NAME=URL VALUE=\"$x[0]\">\n";
        print "<BR>\n";
        print "<BR><B>あなたの名前：</B>\n";
        print "<BR><INPUT TYPE=text SIZE=50 NAME=NAME VALUE=\"$x[3]\">\n";
        print "<BR>\n";
        print "<BR><B>あなたのメールアドレス：</B>\n";
        print "<BR><INPUT TYPE=text SIZE=50 NAME=EMAIL VALUE=\"$x[2]\">\n";
        print "<BR>\n";
        print "<BR><B>ホームページのコメント：</B>\n";
        print "<BR>改行は無視されます。HTMLは使えません。あまり長いコメントは差し控えください。\n";
        print "<BR><TEXTAREA COLS=50 ROWS=5 NAME=COMMENT WRAP=soft>$x[4]</TEXTAREA>\n";
        print "<BR>\n";
        print "<INPUT TYPE=hidden NAME=COUNT VALUE=\"$x[6]\">\n";
        print "<BR><INPUT TYPE=submit VALUE=\" 登録 \">\n";
        print "<INPUT TYPE=reset VALUE=\" 取消 \">\n";
        print "</FORM>\n";
    }
    print "<HR noshade>\n";
    print "<A HREF=\"wwwhpmd.cgi\">[戻る]</A>\n";
    print "<HR noshade>\n";
&copyright;
    print "</BODY>\n";
    print "</HTML>\n";
}

#
# URL変更(4)
#
sub modItem4 {
    &readParam;
    $file = $ARGV[1];

    # 改行コードを置換する。
    # 次の行が日本語の場合は削除。
    # 日本語でない場合は１文字分のスペースに置換。
    $FORM{'COMMENT'} =~ s/[\r\n]+([\x20-\x7e])/ $1/g;
    $FORM{'COMMENT'} =~ s/[\r\n]+//g;

    #
    # 必須項目が省略されていないかチェック
    #
    if (($FORM{'URL'} eq "") || ($FORM{'TITLE'} eq "") ||
            ($FORM{'EMAIL'} eq "") || ($FORM{'NAME'} eq "") ||
            ($FORM{'COMMENT'} eq "")) {
        print "Content-type: text/html\n";
        print "\n";
        print "入力されていない項目があります。\n";
        return;
    }

    # 今日の日付を得る
    $date = time();

    # ファイルにURLを追加する
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };
    open(IN, "wwwhpmd/$file");
    open(OUT, "> wwwhpmd/wwwhpmd.tmp");
    $category = <IN>;
    print OUT $category;
    print OUT "$FORM{'URL'}\t";
    print OUT "$FORM{'TITLE'}\t";
    print OUT "$FORM{'EMAIL'}\t";
    print OUT "$FORM{'NAME'}\t";
    print OUT "$FORM{'COMMENT'}\t";
    print OUT "$date\t";
    print OUT "$FORM{'COUNT'}\n";
    while (<IN>) {
        @x = split(/\t/, $_);
        if ($x[0] ne $FORM{'URLOLD'}) {
            print OUT $_;
        }
    }
    close(IN);
    close(OUT);

    rename("wwwhpmd/$file", "wwwhpmd/wwwhpmd.bak");
    rename("wwwhpmd/wwwhpmd.tmp", "wwwhpmd/$file");
    unlink("wwwhpmd/wwwhpmd.bak");

    eval { flock(LOC, $UNLOCK); };
    close(LOC);

    &sendMail;

    print "Location: $script?dsp+$file\n";
    print "\n";
}

#
# URLへのジャンプ
#
sub jumpItem {
    #print "Content-type: text/html\n";
    #print "\n";
    #print "ARGV[2] = $ARGV[2]\n";

    $file = $ARGV[1];
    $url = $ARGV[2];
    $url =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    $url =~ s/\\~/~/g;
    open(LOC, "> wwwhpmd/wwwhpmd.loc");
    eval { flock(LOC, $WRITE); };
    open(IN, "wwwhpmd/$file");
    open(OUT, "> wwwhpmd/wwwhpmd.tmp");
    $category = <IN>;
    print OUT $category;
    while (<IN>) {
        @x = split(/\t/, $_);
        if ($x[0] eq $url) {
            chop($x[6]);
            $x[6]++;
            print OUT "$x[0]\t$x[1]\t$x[2]\t$x[3]\t$x[4]\t$x[5]\t$x[6]\n";
        } else {
            print OUT $_;
        }
    }
    close(IN);
    close(OUT);

    rename("wwwhpmd/$file", "wwwhpmd/wwwhpmd.bak");
    rename("wwwhpmd/wwwhpmd.tmp", "wwwhpmd/$file");
    unlink("wwwhpmd/wwwhpmd.bak");

    eval { flock(LOC, $UNLOCK); };
    close(LOC);

    print "Location: $url\n";
    print "\n";
}

#
# パラメータ読み込み
#
sub readParam {
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
    } else {
        $query_string = $ENV{'CONTENT_STRING'};
    }
    @xx = split(/&/, $query_string);
    foreach $yy (@xx) {
        ($name, $value) = split(/=/, $yy);
        $value =~ tr/+/ /;
        $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
        &jcode'convert(*value, "sjis");
        $FORM{$name} = $value;
    }
    return(%FORM);
}

#
# ヘッダ情報書き出し
#
sub printHead {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>$_[0]</TITLE>\n";
    print "</HEAD>\n";
    print "$body\n";
    print "<H3>$_[0]</H3>\n";
}




sub passcheck {
        print "Content-type: text/html\n";
        print "\n";
        print "パスワードが違います。\n";
	exit;
}



#
# メール送信
#
sub sendMail {
#    $sendmail = '/usr/lib/sendmail';
    $sendmail = '/usr/sbin/sendmail';
    $mailto = '$mailad';
    $msg = "";

    $msg = "";
    $msg .= "To: $mailto\n";
    $msg .= "From: HPMD\n";
    $msg .= "Subject: HPMD\n";
    $msg .= "\n";
    $msg .= "ACTION = $ARGV[0]\n";
    if (($ARGV[0] eq "add2") || ($ARGV[0] eq "mod4")) {
        $msg .= "CATEGORY = $category\n";
    }
    while (($name, $value) = each(%FORM)) {
        $msg .= "$name = $value\n";
    }
    if ($ARGV[0] eq "del3") {
        $msg .= "FILE = $file\n";
        $msg .= "URL = $url\n";
    }
    open(ML, "| $sendmail $mailto");
    print ML $msg;
    close(ML);
}


# --------------------------------------
#   著作権表示          ----------------
# --------------------------------------
sub copyright
{
	# 著作権を表示（削除禁止）
	print "このシステムは<!-- $ver --><a href='http://www.wakusei.ne.jp/tohoho/www.htm' target='_top'>URLの広場</a>を<a href='http://sapporo.cup.com/column/columnhtml/' target='_top'>カスタマイズ</a>したものです。\n";

}
