#!/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 .= "\n"; $ret .= "\n"; $ret .= "
$res_nai[0] > $res_nai[6] $res_nai[7]
\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; 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 .= "