#!/usr/bin/perl ############################################################################## # shiromuku(l2)BBS version 3.12 # Created 04/24/2002 # Copyright 2002 Shiromuku # Available at http://www.t-okada.com/cgi/ ############################################################################### # COPYRIGHT NOTICE (著作権の告示) # Copyright 2002 Shiromuku All Rights Reserved. # This script can be used and modified free of charge as long as you don't change this header or any of the parts that give me credit for writing this. (このスクリプトは無償で使用または改変できます。ただしこの著作権の告知と上記のコメント、及びCGIにより生成されるHTML表示下部にある著作権表示部は変えないで下さい。) # By using this script you agree to indemnify me from any liability that might arise from its use. In simple English, if this script somehow makes your computer run amuck and kill the pope, it's not my fault.(このスクリプトを使用することにより、使用者はその使用によって起こる可能性のあるいかなる事柄に対する責務についても、私Shiromukuに免責の保証を与えることに同意したものとします。) # Redistributing and selling the code for this program without prior written consent is expressly forbidden.(前もって書面での承諾を得ることなくこのプログラムのコードを再配布したり売ったりすることは 明確に禁じられています。) ####################### require './jcode.pl'; require './sl2_bbs_lib.cgi'; ####################### use strict; my $gl = &get_globals("sl2_bbs_gl.cgi"); $gl->{version} = "version 3.12"; my ($form, $filename); if ($ENV{'CONTENT_LENGTH'} || $ENV{'QUERY_STRING'}) {$form = &parse_data($gl);} my $config = &open_config ($gl, $form); my %HoD = (); @HoD{"gl", "config", "form"} = ($gl, $config, $form); if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($form->{action} eq "admin_enter") {&return_admin_enter(\%HoD);} elsif ($form->{action} eq "show_icon") {&show_icon(\%HoD);} elsif ($form->{action} eq "reply") {&check_login(\%HoD); &return_reply(\%HoD);} elsif ($form->{action} eq "search_all") {&check_login(\%HoD); &search_all(\%HoD);} elsif ($form->{action} eq "showlast") {&check_login(\%HoD); &return_html(\%HoD);} elsif ($form->{action} eq "user") {&user(\%HoD);} elsif ($form->{action} eq "user_a") {&user(\%HoD);} exit (0) ; } else { if ($form->{action} eq "show_icon") {&show_icon(\%HoD); exit (0);} $filename = "$gl->{basedir}/$gl->{passfile}"; if (-e $filename) {&return_login(\%HoD);} else { &head("管理用ページ", \%HoD); print "

管理用パスワードとログインパスワードの設定をする

\n"; print "
まず最初に管理用パスワードとログインパスワードの設定をして下さい
\n"; print "
{cgi_a}\">\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
パスワード
(半角英数字で8文字以内にして下さい。)
管理用パスワード
(確認のためもう一度)
ログインパスワード
(半角英数字で8文字以内にして下さい。)
ログインパスワード
(確認のためもう一度)
\n"; print "
\n"; print "
\n"; print "\n"; } } exit (0) ; ############################ sub parse_data { my $gl = shift; my ($buffer, @pairs, $pair, $name, %form, $value); if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($gl->{check_referer} == 1) {&check_referer($gl);} 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; $value =~ s/\|\|\|//g; $value =~ s//>/ig; $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; jcode::convert(\$value,$gl->{mycode}); if ($gl->{mycode} eq 'sjis') {jcode::h2z_sjis(\$value); } if ($gl->{mycode} eq 'euc') {jcode::h2z_euc(\$value); } $form{$name} = $value; } return \%form; } ############################ #loginページ sub return_login{ my$HoD = shift; my$cookie; my%boardname = split(/\,/,$HoD->{gl}{boardname}); if ($HoD->{gl}{usepasscookie} == 1) {$cookie = &get_cookie (\%boardname);} &head_html(\*STDOUT,$HoD); print "$HoD->{config}{c2_title}\n"; print "$HoD->{config}{c2_l_introduction}\n"; print "
{gl}{cgi}\">\n"; print "\n"; print "\n"; print "\n"; print "
PASS{l_password}\" maxlength=8 SIZE=10>
\n"; print "
このパスワードを記憶させる
\n"; print "
\n"; print "

\n"; &foot_html1 (\*STDOUT, $HoD); } ############################ #修正・削除画面 sub user { my $HoD = shift; my(@u_data, $test_pass, $flag); if ($HoD->{form}{mynum} eq "") {&error("番号を入力して下さい。\n", $HoD);} if ($HoD->{form}{action} eq "user_a") {&check_pass ($HoD);} if ($HoD->{form}{action} eq "user") { if ($HoD->{form}{pass} eq "") {&error("パスワードを入力して下さい。\n", $HoD);} $test_pass = &crypt ($HoD->{form}{pass}, 'aa', $HoD); } open(LOG,"<$HoD->{gl}{basedir}/$HoD->{gl}{yourname}_$HoD->{form}{txtnumber}\.cgi") || &error("ファイルがオープンできません。\n", $HoD); while () { next if /^\d+$/; chomp; @u_data = split(/\|\|\|/,$_); if ($HoD->{form}{mynum} == $u_data[2]) { if ((($HoD->{form}{action} eq "user") && ($u_data[11] eq $test_pass) && ($HoD->{form}{pass} ne '')) || ($HoD->{form}{action} eq "user_a")) { $HoD->{config}{c1_image} = "記事[$HoD->{form}{mynum}]の修正・削除"; &head_html(\*STDOUT,$HoD); print "

記事[$HoD->{form}{mynum}]の修正・削除

\n"; if ($HoD->{form}{action} eq "user_a") { print "
投稿者情報 $u_data[13]

\n"; } if ($u_data[12]) { print "
\n"; print "
\n"; &img_html($u_data[12],$HoD); print "\n"; print "

\n"; } $u_data[9] =~ s/
/\n/g; if ($HoD->{config}{use_html} != 1) { $u_data[9] =~ s/(.*?)<\/B>/<B>$1<\/B>/ig; $u_data[9] =~ s/(.*?)<\/FONT>/<FONT $1>$2<\/FONT>/ig; $u_data[9] =~ s/]+)>(.*?)<\/a>/<a href=$1>$2<\/a>/ig; $u_data[9] =~ s/<([^>]|\n)*>//g; } print "
{gl}{cgi_r}\">\n"; print "{form}{l_password}\">\n"; if ($HoD->{form}{action} eq "user") { print "\n"; print "{form}{pass}\">\n"; } print "{form}{txtnumber}\">\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; &table_html ($HoD); &add_html ($HoD, \@u_data); print "\n"; print "

\n"; if ($HoD->{form}{action} eq "user_a") { &id_html1($HoD); print "\n"; print "\n"; } print "
\n"; print "
\n"; print "

\n"; print "
{gl}{cgi_a}\">\n"; print "{form}{l_password}\">\n"; print "\n"; print "\n"; print "\n"; print "{form}{txtnumber}\">\n"; print "\n"; if ($HoD->{form}{action} eq "user") { print "\n"; print "{form}{pass}\">\n"; } if ($HoD->{form}{action} eq "user_a") { &id_html1($HoD); print "\n"; print "\n"; } print "
\n"; print "
\n"; &back_html($HoD); &foot_html (\*STDOUT, $HoD); $flag = 1; last; } else { &error("ID・パスワードに間違いがあります。\n", $HoD); } } else { $flag = 0; } } close(LOG); if ($flag == 0) { &error("正しい番号を入力して下さい。\n", $HoD); } } ############################ #返信書き込み用ページ sub return_reply{ my $HoD = shift; my (@r_data, @r_datax, $res_num); $HoD->{config}{c1_t_comment} ="Reply to the Message [$HoD->{form}{mynum}]"; $HoD->{config}{c1_image} = "Reply to the Message [$HoD->{form}{mynum}]"; $HoD->{config}{c2_title} = "

Reply to the Message [$HoD->{form}{mynum}]



"; &head_html(\*STDOUT,$HoD); print "$HoD->{config}{c2_title}\n"; open(LOG,"<$HoD->{gl}{basedir}/$HoD->{gl}{yourname}_$HoD->{form}{txtnumber}\.cgi") || &error("ファイルがオープンできません。\n"); while () { chomp; @r_data = split(/\|\|\|/,$_); if (($r_data[0] eq "petadmin") && ($r_data[2] == $HoD->{form}{mynum})) { @r_datax = @r_data; print "
\n"; &table_html ($HoD); &subj_date_name_hp_html ("main", \@r_data, $HoD); } elsif (($r_data[0] eq "reply") && ($r_data[1] == $HoD->{form}{mynum})) { if ($HoD->{config}{border_color}) { print "
{config}{border_color}\">\n"; } else { print "
{config}{text_color}\">\n"; } &subj_date_name_hp_html ("reply", \@r_data, $HoD); } } close(LOG); print "


\n"; print "
\n"; &add_form_html("reply", $HoD, \@r_datax); print "

\n"; &back_html($HoD); &foot_html (\*STDOUT, $HoD); } ############################ #全記事検索処理 sub search_all { my $HoD = shift; my ($filename, $i, @match, $page_maxs, $p, $ps, $lines, @s_data, $cat_data, $cat_name_j,$lastnumx,$pp,$s_num, $p_flag, %last); my $searchword = $HoD->{form}{searchword}; my $next_page = $HoD->{form}{next_page}; my $yourname = $HoD->{gl}{yourname}; if ($searchword eq '') {&error("キーワードを記入して下さい。\n", $HoD);} $searchword =~ s/ / /g; my @searchword = split(' ', $searchword); $HoD->{config}{c1_image} = "Search"; $HoD->{config}{c2_title} = "

Search

"; $HoD->{config}{c2_introduction} = ""; &head_html(\*STDOUT,$HoD); print "
\n"; print "
【$searchword】の検索結果です\n"; open (LFILE,">$HoD->{gl}{basedir}/$HoD->{gl}{lockfile}") or &error("ファイルがオープンできません。\n", $HoD); eval("flock(LFILE, 2)"); opendir (DIR, "$HoD->{gl}{basedir}"); foreach $filename ( readdir (DIR) ) { if ($filename =~ /^$yourname\_(\w+)\.cgi$/o) { $lastnumx = $1; open(FILE,"<$HoD->{gl}{basedir}/$filename") or &error("ファイルがオープンできません。\n", $HoD); while () { next if /^\d+$/; $pp = 0; foreach $i (@searchword) { if (index($_,$i) >= 0) { $pp++; if ($HoD->{form}{s} eq 'or') { last; } } else { $pp = 0; if ($HoD->{form}{s} eq 'and') { last; } } } $_ .= $lastnumx; push (@match, $_) if ($pp > 0); } $s_num = @match; close(FILE); } } closedir (DIR); eval("flock(LFILE, 8)"); close(LFILE); if ($s_num) { print "--- 該当記事: $s_num

\n"; if (!$HoD->{form}{next_page}) { $page_maxs = $HoD->{config}{n_page_max}; $p = 0; $HoD->{form}{next_page} = 0; $ps = 0;} else { $page_maxs = $HoD->{form}{next_page} + $HoD->{config}{n_page_max}; $p = 0; $ps = $HoD->{form}{next_page};} foreach $lines (@match) { my @line = split(/\n/,$lines); chomp $line[0]; @s_data = split(/\|\|\|/,$line[0]); $HoD->{form}{txtnumber} = $line[1]; if ($p >= $page_maxs) { $p_flag = 1; last; } if (($p < $page_maxs) && ($p >= $HoD->{form}{next_page})) { &table_html ($HoD); &subj_date_name_hp_html ("main", \@s_data, $HoD); &back_html ($HoD); print "

\n"; $ps++; } $p++; } $last{ps} = $ps; $last{page_maxs} = $page_maxs; $last{p_flag} = $p_flag; $HoD->{last} = {%last}; &last_html ($HoD); } else { print "
該当する記事はありませんでした。
\n"; } &search_html ($HoD); print "\n"; &back_html($HoD); &foot_html (\*STDOUT, $HoD); } ############################ #アイコンの表示 sub show_icon { my $HoD = shift; my @icon_data; my $file = &file_open("$HoD->{gl}{basedir}/$HoD->{gl}{iconfile}"); $HoD->{config}{c1_image} = "Icon"; $HoD->{config}{c2_title} = "

Icon

"; &head_html(\*STDOUT,$HoD); print "

Icon

\n"; print "
\n"; foreach (@{$file}) { @icon_data = split(/\|\|\|/,$_); print "\n"; } print "
{gl}{icon_dir_url}/$icon_data[2]\">$icon_data[3]
\n"; print "
ブラウザを閉じて戻って下さい。
\n"; print "\n"; }