#!/usr/bin/perl ############################################################################## # shiromuku(u)ALBUMS version 1.22 # Created 10/09/2003 # Copyright 2003 Shiromuku # Available at http://www.t-okada.com/cgi/ ############################################################################### # COPYRIGHT NOTICE (著作権の告示) # Copyright 2003 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 './su_albums_lib.cgi'; ####################### use strict; my $gl = &get_globals("su_albums_gl.cgi"); $gl->{version} = "version 1.22"; my ($form, $cform, $sform, $filename, $h_filename); if ($ENV{'CONTENT_LENGTH'} || $ENV{'QUERY_STRING'}) { ($form, $cform, $sform) = &parse_data($gl); #if ($form->{t_type} eq "") {$form->{t_type} = $gl->{t_type};} $gl->{txtnumfile} = "$form->{cat}$gl->{txtnumfile}"; $gl->{c_numfile} = "$form->{cat}$gl->{c_numfile}"; $gl->{lockfile} = "$form->{cat}$gl->{lockfile}"; $gl->{tempfile} = "$form->{cat}$gl->{tempfile}"; $gl->{iconfile} = "$form->{cat}$gl->{iconfile}"; } my$config = &open_config ($gl, $form); my %HoD = (); @HoD{"gl", "config", "form", "cform", "sform"} = ($gl, $config, $form, $cform, $sform); if ($config->{use_view_pass}) { my%boardname = split(/\,/,$HoD{gl}{boardname}); my$cookie = &get_cookie (\%boardname); #print "Content-type: text/html\n\n"; #print "cookie/$cookie->{view_password}\n"; if ($HoD{form}{view_password}) { &check_view_pass (\%HoD,"view_pass"); } else { if ($cookie->{view_password}) { $HoD{form}{view_password} = $cookie->{view_password}; &check_view_pass (\%HoD,"view_pass"); } else {&return_login(\%HoD); exit (0) ;} } } if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($form->{action} eq "make_html") { unless (defined $form->{cat}) {&error("カテゴリーを選択して下さい。\n", \%HoD);} if ($form->{cat} !~ /^\d+$/){&error("カテゴリーが不正です。\n", \%HoD);} unless (-e "$HoD{gl}{basedir}/$form->{cat}_log\.cgi") { &error("カテゴリーがありません。\n", \%HoD); } &show_cat(\*STDOUT,\%HoD); exit (0) ; } elsif ($form->{action} eq "removearticle") { &check_pass(\%HoD); &show_cat(\*STDOUT,\%HoD); exit(0) ; } elsif ($form->{action} eq "search_all_lists") { &search_all_lists(\%HoD); exit (0) ; } elsif ($form->{action} eq "return_main") { &return_main(\%HoD); exit (0); } } if ($form->{action} eq "make_html") { unless (defined $form->{cat}) {&error("カテゴリーを選択して下さい。\n", \%HoD);} if ($form->{cat} !~ /^\d+$/){&error("カテゴリーが不正です。\n", \%HoD);} unless (-e "$HoD{gl}{basedir}/$form->{cat}_log\.cgi") { &error("カテゴリーがありません。\n", \%HoD); } &show_cat (\*STDOUT, \%HoD); } else { if (-e "$gl->{basedir}/$gl->{passfile}") {&return_main(\%HoD);} else { &head("管理用ページ", \%HoD); print "

IDとパスワードの設定をする

\n"; print "
まず最初にIDとパスワードの設定をして下さい
\n"; print "
{cgi_a}\">\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
ユーザID
(半角英数字で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; if (($value =~ /\W/) && ($ENV{'REQUEST_METHOD'} ne "POST")) { &error("エラーです。\n"); } $value =~ s/\|\|\|//g; $value =~ s/&/&/ig; $value =~ s//>/ig; $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; if ($gl->{w_max}) { my$w_size = length($value); if ($w_size > $gl->{w_max}) { &error("書き込みが多すぎます。$gl->{w_max}バイト以下にして下さい。\n"); } } if (($name eq "email") && ($value !~ /^[\w\.\-]+\@[\w\.\-\_]+\.[a-zA-Z]+$/)) { $value = ""; } if (($name eq "url") && ($value eq "http://")) {$value = "";} jcode::convert(\$value,$gl->{mycode}); if ($gl->{mycode} eq 'sjis') {jcode::h2z_sjis(\$value); } if ($gl->{mycode} eq 'euc') {jcode::h2z_euc(\$value); } if ($name eq "cat") { if ($value && ($value !~ /^\d+$/)){&error("カテゴリーが不正です。\n");} } $form{$name} = $value; } return \%form; } ############################ #全記事検索処理 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); if ($HoD->{form}{cat} eq "") {&error("カテゴリーを選択して下さい。\n", $HoD);} if (($HoD->{config}{img_c_mark} eq "") || ($HoD->{config}{img_c_mark} eq "http://")) {$HoD->{config}{img_c_mark} = $HoD->{config}{c1_c_comment};} else {$HoD->{config}{img_c_mark} = "{config}{img_c_mark}\">";} my $searchword = $HoD->{form}{searchword}; my $next_page = $HoD->{form}{next_page}; my$catx = $HoD->{form}{cat}; my $cat = $HoD->{form}{cat}; if ($searchword eq '') {&error("キーワードを記入して下さい。\n", $HoD);} $searchword =~ s/ / /g; my @searchword = split(' ', $searchword); $HoD->{config}{c1_image} = "Search"; print "Content-type: text/html\n\n"; &head_html(\*STDOUT,$HoD); print "

Search

\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 =~ /^$cat\_(\w+)\.cgi$/o) { $cat_data = &get_catname ($cat, $HoD); $cat_name_j = $cat_data->[2]; $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 . "\n"; $_ .= $cat_name_j . "\n"; $_ .= $cat . "\n"; $_ .= $lastnumx . "\n"; $_ .= $cat_name_j . "\n"; 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"; &article_html(\*STDOUT,$HoD,\@match,$catx); } else { print "
該当する記事はありませんでした。
\n"; } &search_html (\*STDOUT,$HoD); &foot_html (\*STDOUT, $HoD); } ############################ #全記事条件検索処理 sub search_all_lists { 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, @pp_data, $cat, $catx); my $file = &file_open("$HoD->{gl}{basedir}/$HoD->{gl}{catfile}"); my%cathush; foreach (@{$file}) { my@data=split(/\|\|\|/,$_); $cathush{$data[1]}{name} = $data[2]; my$cfile = &file_open("$HoD->{gl}{basedir}/$data[1]$HoD->{gl}{configfile}"); foreach (@{$cfile}) { chomp; my@line = split(/\|\|\|/,$_); $line[1] =~ s/\|\|\|//g; if (($line[0] eq "use_view_pass") && ($line[1] == 1)) { ++$cathush{$data[1]}{forbidden}; last; } } } if (($HoD->{config}{img_c_mark} eq "") || ($HoD->{config}{img_c_mark} eq "http://")) {$HoD->{config}{img_c_mark} = $HoD->{config}{c1_c_comment};} else {$HoD->{config}{img_c_mark} = "{config}{img_c_mark}\">";} my$searchword = $HoD->{form}{searchword}; $searchword =~ s//>/ig; my $next_page = $HoD->{form}{next_page}; $catx = $HoD->{form}{cat}; $cat = $HoD->{form}{cat}; if ($cat eq "") {$cat = qr/\d+/;} #if ($searchword eq '') {&error("キーワードを記入して下さい。\n", $HoD);} $searchword =~ s/ / /g; my @searchword = split(' ', $searchword); $HoD->{config}{c1_image} = "Search"; print "Content-type: text/html\n\n"; &head_html(\*STDOUT,$HoD); print "

Search

\n"; if($searchword) { 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 =~ /^($cat)\_(\w+)\.cgi$/o) { my$cat = $1; if (!$cathush{$cat}{forbidden}) { #$cat_data = &get_catname ($cat, $HoD); #$cat_name_j = $cat_data->[2]; $cat_name_j = $cathush{$cat}{name}; $lastnumx = $2; open(FILE,"<$HoD->{gl}{basedir}/$filename") or &error("ファイルがオープンできません。\n", $HoD); while () { next if /^\d+$/; if ($searchword eq "") { $_ .= $cat . "\n"; $_ .= $lastnumx . "\n"; $_ .= $cat_name_j . "\n"; push (@match, $_); } else { $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 . "\n"; $_ .= $cat_name_j . "\n"; $_ .= $cat . "\n"; $_ .= $lastnumx . "\n"; $_ .= $cat_name_j . "\n"; push (@match, $_) if ($pp > 0); } } $s_num = @match; close(FILE); } } } closedir (DIR); eval("flock(LFILE, 8)"); close(LFILE); $s_num = @match; if ($s_num) { print "--- 該当記事: $s_num

\n"; &article_html(\*STDOUT,$HoD,\@match,$catx); } else { print "
該当する記事はありませんでした。
\n"; } $HoD->{form}{cat} = ""; print "
\n"; &search_html(\*STDOUT,$HoD); print "
\n"; &foot_html (\*STDOUT, $HoD); } ############################ #counter sub counter { my $HoD = shift; my $c_num = &get_number ($HoD->{gl}{c_numfile}, '0', $HoD); if ($ENV{'REQUEST_METHOD'} ne "POST") { $c_num = &increment_num ($HoD->{gl}{c_numfile},$c_num, $HoD); } if (length $c_num < $HoD->{config}{n_figure1}) { $c_num = &make_figure ($c_num,length $c_num,$HoD->{config}{n_figure1}); } return $c_num; } ############################ #桁数調整 sub make_figure { my ($num, $length, $figure) = @_; my $keta = $figure - $length; my $i = 0; while ($i < $keta) { $num = "0$num"; $i++; } return $num; }