#!/usr/local/bin/perl
#########################################################
# #
# imgbbs.cgi v1.01 #
# 2000/12/29 #
# Copyright(C) ENJOY-WEB #
# #
# このCGIスクリプトはフリーソフトです。このCGI #
# により発生した損害等,当作成者およびサイト管理人は #
# 一切責任を負いませんのでご了承下さい。 #
# #
# 不具合等発生した場合,ENJOY-WEB管理人宛 #
# (kojimitu@enjoy.ne.jp)までメールにてお知らせ下さい。 #
# #
#########################################################
require 'jcode.pl';
#所有者名
$my_name = 'DBCJ';
#所有者のメール
$my_mail = 'info@discus.powerbean.jp';
#戻る時のアドレス
$my_url = '../index.html';
#このプログラムの名前
$my_pgm = 'imgbbs.cgi';
#マスターパスワード
$mast_pass = 'discus8';
#ボディータグの中身
$my_body = '
';
#1ページに表示される件数
$one_page = 20;
#登録最大件数
$max_ken = 300;
#登録画像最大サイズ(KB)
$max_file = 100;
#縦横の最大の長さ(ピクセル)
$haba = 200;
#掲示板のタイトル
$my_title = 'DBCJ-PHOTO-BBS';
#タイトルに使う画像をフルパスで(画像を利用しない場合は変更なし)
$my_title_img = 'http://discus.powerbean.jp/mein_title.jpg';
#更新通知用画像
$kou_gazo = '';
#ログファイル名
$my_log = 'imgbbs.dat';
#タグの許可フラグ 1->許可 2->許可しない
$tagu = 1;
#自動リンクの許可フラグ 1->許可 2->許可しない
$link = 1;
#クッキーの有効日数
$cook_day = '60';
#利用文字色(文字の順番とカラーは同じで数も同一でないといけない)
@colors = ('Black','MediumBlue','DarkGreen','DodgerBlue','Gold','Sienna','Red','Purple','DeepPink');
@kana_colors = ('黒','青','緑','水','黄','茶','赤','紫','桃');
#不正メールの書きこみ防止JavaScript
$javascript = '
';
############################
# 以下は処理ルーチン #
############################
&form_get;
$myaction = $FORM{myaction};
if($myaction eq 'kousin'){
if($kou_gazo ne ''){
$nows = time;
$nows = $nows - 86400;
open DATS, "<$my_log";
&lock_ck(DATS);
@dats = ;
&unlock_ck(DATS);
close(DATS);
@hajidat = split/\t/,$dats[0];
if($hajidat[4] > $nows){
print "Content-type: image/gif\n\n";
open IMG, "<$kou_gazo";
binmode(IMG);
print $_ while ();
close(IMG);
}else{
print "Content-type: image/gif\n\n";
open IMG, ");
close(IMG);
}
}
}elsif($myaction eq 'comadd'){
&dat_add;
&page_set("com","$one_page");
}elsif($myaction eq 'resadd'){
&res_add;
&page_set("res","$one_page");
}elsif($myaction eq 'deldat'){
&dat_del;
&page_set("","$one_page");
}else{
&page_set("","$one_page");
}
############################
# 以下はサブルーチン #
############################
#データ追加処理
sub dat_add {
my($i,$time,$host,@dats,@oneline,$keyid,$maecom,$jika,$gazo_name,$end_gazo,$end_dat);
if($FORM{com} eq ''){
&print_error("コメントが入力されていません");
}elsif($FORM{name} eq ''){
$FORM{name} = 'NO_NAME';
}
if($FORM{subj} eq ''){
$FORM{subj} = 'NO_TITLE';
}
open DATS, "+<$my_log";
&lock_ck(DATS);
@dats = ;
seek(DATS,0,0);
@oneline = split/\t/,$dats[0];
$keyid = $oneline[0] + 1;
$maecom = $oneline[9];
if($maecom eq $FORM{com}){
&print_error("二重投稿です");
}
if($link == 1){
$FORM{com} = &url_hen("$FORM{com}");
}
if($FORM{url} eq 'http://'){
$FORM{url} = '';
}
$time = &get_ji;
$host = &get_host;
$jika = time;
if($IMGW{gazo} ne 'jpg' && $IMGW{gazo} ne 'gif'){
$gazo_name = '';
}else{
$gazo_name = "$keyid.$IMGW{gazo}";
open GAZO, ">imgs/$gazo_name";
binmode(GAZO);
print GAZO $IMGD{gazo};
close(GAZO);
&img_size("$IMGW{gazo}","imgs/$gazo_name");
if($width > $haba){
if($width < 1 ){$width = 1;}
$wid_bai = $haba / $width;
$width = $wid_bai * $width;
$height = $wid_bai * $height;
$width = int $width;
$height = int $height;
}
if($height > $haba){
if($height < 1 ){$height = 1;}
$hei_bai = $haba / $height;
$width = $hei_bai * $width;
$height = $hei_bai * $height;
$width = int $width;
$height = int $height;
}
}
if($#dats >= $max_ken){
@end_dat = split/\t/,$dats[$#dats];
if($end_dat[4] ne ''){
unlink "imgs/$end_dat[4]";
}
}
print DATS "$keyid\t$gazo_name\t$width\t$height\t$jika\t$FORM{name}\t$FORM{mail}\t$FORM{color}\t$FORM{subj}\t$FORM{com}\t$FORM{url}\t\t$time\t$host\t$FORM{pass}\t-\n";
for($i=0;$i<$max_ken;$i++){
print DATS "$dats[$i]";
if($i >= $#dats){
last;
}
}
truncate(DATS, tell(DATS));
&unlock_ck(DATS);
close(DATS);
}
#レス追加処理
sub res_add {
my(@dats,$i,$resline,@ress,@kaesu,$time,$host);
$time = &get_ji;
$host = &get_host;
if($FORM{res_name} eq ''){ $FORM{res_name} = 'NO_NAME'; }
if($FORM{res_com} eq ''){ &print_error("コメントが記入されていません"); }
open DATS, "+<$my_log";
&lock_ck(DATS);
while(){ chomp; push @dats, [ split /\t/ ]; }
for($i=0;$i<=$#dats;$i++){
if($dats[$i][0] == $FORM{res_id}){
$resline = $dats[$i][11];
$resline .= "$FORM{res_name}<><><><><>$FORM{res_color}<>$FORM{res_com}<>$time<>$host<<>>";
$dats[$i][11] = $resline;
last;
}
}
for(@dats){push @kaesu,join("\t",@{$_})."\n";}
seek(DATS,0,0);
print DATS @kaesu;
truncate(DATS, tell(DATS));
&unlock_ck(DATS);
close(DATS);
}
#レス閲覧処理
sub res_see {
my($res_line,$mode) = @_;
my(@ress,$oneres,$ret,@res_nai);
$muyo = 0;
$ret = '';
@ress = split/<<>>/,$res_line;
if($res_line ne ''){
if($mode eq 'gazo'){
$ret .= "\n";
}else{
$ret .= " |
\n";
}
}
foreach $oneres (@ress){
@res_nai = split/<>/,$oneres;
$ret .= "\n";
$ret .= "\n";
$ret .= "$res_nai[0] > $res_nai[6] $res_nai[7] | \n";
$ret .= " \n";
$ret .= " \n";
}
if($res_line ne ''){
$ret .= " |
\n";
}
return $ret;
}
#データ削除処理
sub dat_del {
my($i,@dels,$del_key);
open DELS, "<$my_log";
&lock_ck(DELS);
while(){ chomp; push @dels,[split/\t/]; }
&unlock_ck(DELS);
close(DELS);
for($i=0;$i<=$#dels;$i++){
if($dels[$i][0] == $FORM{del_id}){
if(($dels[$i][14] ne $FORM{c_pass} && $FORM{c_pass} ne $mast_pass) || $FORM{c_pass} eq ''){
&print_error("パスワードが違います");
}
$del_key = $i;
last;
}
}
if(open(GAZO,"<./imgs/$FORM{del_id}.jpg")){
close(GAZO);
unlink "./imgs/$FORM{del_id}.jpg";
}elsif(open(GAZO,"./imgs/$FORM{del_id}.gif")){
close(GAZO);
unlink "./imgs/$FORM{del_id}.gif";
}
open DELS, "+<$my_log";
&lock_ck(DELS);
@dels = ();
@dels = ;
seek(DELS,0,0);
for($i=0;$i<=$#dels;$i++){
if($i != $del_key){
print DELS $dels[$i]
}
}
truncate(DELS,tell(DELS));
&unlock_ck(DELS);
close(DELS);
}
#ロックサブルーチン
#下記の2つはWINとUNIXの違いをのみこんでファイルロックする
sub lock_ck {
local(*FILE) = @_;
eval("flock(FILE, 2)");
if($@ ne ''){
return 0;
}
return 1;
}
sub unlock_ck {
local(*FILE) = @_;
eval("flock(FILE, 8)");
if($@ ne ''){
return 0;
}
return 1;
}
#ページ表示(頭部分)
sub page_head {
my($msg) = $_[0];
print "Content-type: text/html\n\n";
print "\n";
print "\n";
print "$msg\n";
print "$javascript\n";
print "\n";
print "$my_body\n";
}
#クッキーセット+ページの頭部分
#第一引数にページのタイトル
#第二引数にクッキーの内容(name1<>val1<<>>name2,val2<<>>name3<>val3)
#第三引数に保存日数
#第四引数にクッキーの名前
sub set_cook {
my($title,$cook_nai,$dayday,$cook_name) = @_;
my($time_ti) = time;
my($time_titasu) = $time_ti + ($dayday * 60 * 60 * 24);
my(@atobi) = gmtime $time_titasu;
$atobi[5] = $atobi[5]+1900;
my(@youbi) = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
my(@tuki) = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" );
my($tukiti) = $atobi[4];
$tukiti++;
my($monmon) = $tuki[$tukiti];
my($banti) = $atobi[6];
my($weekd) = $youbi[$banti];
my($atobin) = "$weekd, $atobi[3]-$monmon-$atobi[5] $atobi[2]:$atobi[1]:$atobi[0] GMT";
print "Content-type: text/html\n";
print "Set-Cookie: $cook_name=$cook_nai; expires=$atobin\n\n";
print "\n";
print "\n";
print "$title\n";
print "$javascript\n";
print "\n";
print "$my_body\n";
}
#クッキーを取得する
#$gcook{name} = value の形になる
#第一引数にクッキーの名前
sub get_cook {
my($cook_name) = @_;
my($cookie,$c_name,$c_nai,@wcook,$atai,$i,$ck_name,$ck_value,$cookien,@cooke);
$cookie = $ENV{'HTTP_COOKIE'};
@cooke = split/;/,$cookie;
foreach $cookien (@cooke){
($c_name,$c_nai) = split /=/, $cookien;
$c_name =~s/ //g;
if($c_name eq $cook_name){ last; }
}
@wcook = split /<<>>/, $c_nai;
foreach $atai (@wcook){
($ck_name,$ck_value) = split /<>/, $atai;
$gcook{"$ck_name"} = $ck_value;
}
}
sub page_end {
my($back_url) = @_;
print "\n";
print "
\n";
# 著作権表示(削除不可)
print "〓ENJOY-WEBフリーCGI素材〓
\n";
# 著作権表示ここまで
print "
戻 る
\n";
print "$my_name\n";
print "\n";
print "\n";
print "\n";
}
sub form_get {
my($boundary,$upfname,$fname,$names,$name,$named,$dum,$dumdum,@a,@b,$which,@c,$fext,$size,$appli,@assocarray,$assoc,$value,$ookisa);
my($type) = $ENV{'CONTENT_TYPE'};
my($method) = $ENV{'REQUEST_METHOD'};
$method =~ tr/A-Z/a-z/;
if($type =~ m/multipart\/form-data/g){
binmode STDIN;
$boundary = ;
$boundary =~s /\r\n//;
while(){
if($_ =~ /filename=/){
~s/\r\n//;
~s/"//g;
~s/ //g;
~s/\;//g;
($named,$dum) = split(/filename=/,$_);
($dumdum,$names) = split(/dataname=/,$named);
@a = split(/filename=/, $_);
$upfname = $a[@a - 1];
@b = split(/\\/, $_);
$fname = $b[@b - 1];
@c = split(/\./, $upfname);
$fext = $c[@c - 1];
$fext =~tr /A-Z/a-z/;
$which = "その他";
$which = "jpg" if($fext eq "jpg");
$which = "gif" if($fext eq "gif");
$which = "MS-WORD" if($fext eq "doc");
$which = "MS-EXCEL" if($fext eq "xls");
$which = "WAVE" if($fext eq "wav");
if($fname =~m/\./g){
$FORM{$names} = $fname;
}else{
$fname .= ".$which";
$FORM{$names} = $fname;
}
$IMGW{$names} = $which;
$s = '';
$appli = ;
$appli =~s /\r\n//;
($dum, $appli) = split(/\//,$appli);
$dum = ;
while(){
last if($_ =~ /^$boundary/);
$s .= $_;
}
$size = length $s;
if($size != 0){
$IMGD{$names} = $s;
}
$ookisa = $max_file * 1000;
if($size > $ookisa){
&print_error("ファイルサイズが大きすぎます");
}elsif(($which ne 'jpg' && $which ne 'gif') && $s ne ''){
$FORM{$names} = '';
$IMGD{$names} = '';
}
}else{
($dum,$name) = split(/name=/,$_);
$name =~s /\r\n//;
$name =~s /"//g;
$dum = ;
$value = '';
while(){
last if($_ =~ /^$boundary/);
$value .= $_;
}
$value =~ s/\r\n$//;
$value =~ tr/+/ /;
$value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, 'sjis');
if($tagu == 2){
$value = &tagu_hen($value);
}
$value =~s/\t/ /g;
$value =~s/\r\n/
/g;
$value =~s/\n/
/g;
$FORM{$name} = $value;
}
}
}else{
if($method eq 'post') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}else{
$query = $ENV{'QUERY_STRING'};
}
@assocarray = split(/&/, $query);
foreach $assoc (@assocarray){
($name, $value) = split(/=/, $assoc);
$value =~ tr/+/ /;
$value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, 'sjis');
if($tagu == 2){
$value = &tagu_hen($value);
}
$value =~s/\t/ /g;
$value =~s/\r\n/
/g;
$value =~s/\n/
/g;
$FORM{$name} = $value;
}
}
}
#画像サイズ取得サブルーチン
#第一引数に$IMGW{'name'}で得た拡張子(gif or jpeg)
#第二引数に$FORM{'name'}で得た画像名
sub img_size {
my($which,$names) = @_;
my($in,$w1,$w2,$h1,$h2,$length,$buf,$marker,$code,$i);
if($which eq 'gif'){
open FILE, "<$names";
binmode(FILE);
&lock_ck(FILE);
seek(FILE, 6, 0);
unless (read(FILE, $in, 4) == 4) {
$width = '1';
$height = '1';
}else{
($w1, $w2, $h1, $h2) = unpack("CCCC", $in);
$width = $w1 + $w2 * 256;
$height = $h1 + $h2 * 256;
}
&unlock_ck(FILE);
close(FILE);
}elsif($which eq 'jpg'){
open JPEG, "<$names";
binmode(JPEG);
&lock_ck(JPEG);
read(JPEG, $buf, 20);
$i = 0;
while ( 1 ) {
$length = 4;
read (JPEG, $buf, $length);
($marker, $code, $length) = unpack ( "a a n", $buf );
if((ord($code) >= 0xC0) && (ord($code) <= 0xC3)){
$length = 5;
read ( JPEG, $buf, $length );
($height, $width) = unpack ("xnn", $buf);
last;
}else{
read ( JPEG, $buf, ($length - 2) );
}
$i++;
if($i > 1000000){
$width = 10; $height = 10;
last;
}
}
&unlock_ck(JPEG);
close JPEG;
}
}
sub get_ji {
my($time,@now,$yban,$nen,$gatu,$niti,$jiji,$hun,@yobj);
@now = localtime(time);
$yban = $now[6];
$nen = $now[5];
$gatu = $now[4];
$niti = $now[3];
$jiji = $now[2];
$hun = $now[1];
$nen = $nen + 1900;
$gatu++;
@yobj = ("日","月","火","水","木","金","土");
return "$nen年$gatu月$niti日($yobj[$yban])$jiji時$hun分";
}
#タグ変換
sub tagu_hen {
my($msg) = $_[0];
$msg =~ s/&/&/g;
$msg =~ s/"/"/g;
$msg =~ s/</g;
$msg =~ s/>/>/g;
return $msg;
}
#自動リンク
sub url_hen {
my($msg) = $_[0];
$msg =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g;
return $msg;
}
#エラー表示
sub print_error {
my($msg) = @_;
&page_head("$msg");
print "\n";
print "
エラーです
\n";
print "
$msg
\n";
print "再度試されるか$my_nameまでお知らせ下さい
\n";
&page_end("$my_pgm");
exit(0);
}
#ホスト名を返す
sub get_host {
my($atai) = $ENV{'REMOTE_HOST'};
my($addr) = $ENV{'REMOTE_ADDR'};
if($atai eq "" || $atai eq "$addr") {
$atai = gethostbyaddr(pack("C4",split(/\./,$addr)),2);
}
return $atai;
}
#ページを表示させる
sub page_set {
my($mode,$onepage) = @_;
my($i,$col,@see,$resdat,$title,$beg_line,$end_line,$back_form,$next_form);
&get_cook("FFBBS");
if($mode eq 'com'){
&set_cook("$my_title","name<>$FORM{name}<<>>mail<>$FORM{mail}<<>>url<>$FORM{url}<<>>color<>$FORM{color}","$cook_day","FFBBS");
$gcook{name} = $FORM{name};
$gcook{mail} = $FORM{mail};
$gcook{url} = $FORM{url};
$gcook{color} = $FORM{color};
}elsif($mode eq 'res'){
&set_cook("$my_title","name<>$FORM{res_name}<<>>mail<>$gcook{mail}<<>>url<>$gcook{url}<<>>color<>$FORM{res_color}","$cook_day","FFBBS");
$gcook{name} = $FORM{res_name};
$gcook{color} = $FORM{res_color};
}else{
&page_head("$my_title");
}
if($my_title_img ne ''){
$title = "
\n";
}else{
$title = "$my_title
";
}
#ラジオボタン色のバリューセット
$col = '';
for($i=0;$i<=$#colors;$i++){
if($gcook{color} eq '' && $i == 0){
$col .= "■\n";
$i++;
}
if($gcook{color} eq $colors[$i]){
$col .= "■\n";
}else{
$col .= "■\n";
}
}
#セレクトボックス色のバリューセット
$sel = '';
for($i=0;$i<=$#colors;$i++){
if($gcook{color} eq '' && $i == 0){
$sel .= "