#! /usr/bin/perl ################################################################################ # # My Gallery ... Version 1.10 # Copyright(c) 2004 by CGI-RESCUE # http://www.rescue.ne.jp/ 利用規定をご一読ください. # # [履歴] ( )内は更新があったファイル # 2004/11/20 v1.00 リリース # 2004/11/29 v1.10 画像データに拡張子を付けるようにした (gallery.cgi) # v1.00利用時に添付した画像データには拡張子は付きません。付けるには削除して再添付が必要です。 # # [構成] < >内はパーミッションの相当値 # # --/任意/ # | # |-- /dat/ <777> ... 画像やコメントデータを保存する場所(Webから見えること) # |-- /lib/ <755> ... ライブラリフォルダ(そのまんまの内容と構成で設置) # | | # | |-- cgi-lib217.pl <644> # | |-- cookie.pl <644> # | |-- crypt.cgi <644> # | |-- jcode.pl <644> # | # |-- gallery.cgi <755> ... このプログラム(実行ファイル) # # [解説] # # ・ログインすると画像の追加・交換・削除、コメントの書き込み・修正・削除、ページの追加が出来ます。 # ・ログインするには、JavaScriptとCookieを使用します。Cookieには暗号文を記録するので、読まれてもパスワードを知られることはありません。 # ・ログインはセッション中(ブラウザを閉じるまで)有効で、自動的に認証し、ログイン状態を維持します。 # ・1ページ目は削除することは出来ません。また、1ページ目と最終ページの間は連続してページが用意されます。 # ・画像がないページは表示されません。ログイン中は表示します。 # ・最終ページの画像が全て削除されると、それよりも前の画像があるページが最終ページとなります。 # ・画像とコメントは/dat/フォルダに記録されます。拡張子がないファイルが画像ファイルです。 # ・添付できる画像の種類は JPEG PNG GIF です。 # ・定期的に/dat/のバックアップをお勧めします。 # ・1ページの枚数設定およびページ数の理論的な上限はありません。 # # [初期設定] # # ・以下、説明に従って設定してください。 # ・上記設置構成で設置した場合は、とりあえず $home と $adminPassword のみ設定すればOKです。 $home = 'http://www.honda-xr.com/blog/'; # "もどる"リンクになるリンク先(URL) $modoru = 'もどる'; # "もどる"名称 $adminPassword = 'tanmendai'; # 画像の追加・変更・削除が出来るモードに入るためのパスワード $IMG_DIR = './dat/'; # 画像とコメントを記録するフォルダ (PATH) 最後は/で閉じる サーバ内部のパスである $IMG_URL = './dat/'; # 画像とコメントを記録するフォルダ (URL) 最後は/で閉じる http://〜書いてもよい $title = 'ギャラリー'; # ブラウザのタイトルバーに記述する内容 $top_messages = <<'EOF'; # 画面上に挿入するHTML (次の行からEOFの上の行の間に記述)

ギャラリー

EOF $sWidth = 120; # 写真のサムネイルサイズ(横) $winSizeWidth = 500; # 子ウィンドウのサイズ(横) $winSizeHeight = 500; # 子ウィンドウのサイズ(縦) $bgcolor = '#ffffff'; # 背景色 $link = '#00008B'; # 背景色配下のリンク色 $vlink = '#4B0082'; # 同 既リンク色 $alink = '#00008B'; # 同 クリックリンク色 $outerBgcolor = '#B22222'; # 外枠の背景色 $cellBgcolor = '#ffffff'; # 写真枠の背景色 $cellTextcolor = '#696969'; # 写真枠内の文字色 $maxCell = 9; # 1ページの写真枠数 $CellWidth = 3; # 横並びの数 $outerTableWidth = '80%'; # 外枠のスケール $outerBorder = 0; # 外枠の境界線サイズ $innerBorder = 1; # 内枠の境界線サイズ $outerCellpadding = 10; # 外枠の余白 $outerCellspacing = 10; # 外枠の境界線の太さ $innerCellpadding = 20; # 内枠の余白 $innerCellspacing = 30; # 内枠の境界線の太さ ############################################################################################################################################# $sample = 0; if ($sample) { $submit = 'button'; } else { $submit = 'submit'; } require "./lib/jcode.pl"; require "./lib/cgi-lib217.pl"; require "./lib/cookie.pl"; require "./lib/crypt.pl"; if ($ENV{'CONTENT_LENGTH'} > 131072) { push(@ERR,"送信データが大き過ぎます。( $ENV{'CONTENT_LENGTH'} bytes )"); } else { &ReadParse; } while (($name,$value) = each %in) { if ($name eq "file") { next; } &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s//>/g; $value =~ s/\n//g; $value =~ s/\r//g; $value =~ s/\f//g; $value =~ s/\t//g; $in{$name} = $value; } $LOGIN = 0; $time = time; if ($in{'page'} == 0) { $in{'page'} = 1; } $LoginCode = &getCookie("LoginCode"); if ($in{'action'} eq "clear") { &setCookie("clear", "LoginCode", "", "", "", ""); } elsif ($LoginCode ne "") { if (crypt($adminPassword,$LoginCode) eq $LoginCode) { $LOGIN = 1; } } if ($LOGIN && $in{'action'} =~ /^edit/) { &edit; exit; } elsif (!$LOGIN && $in{'action'} eq "login") { if ($in{'pwd'} eq $adminPassword) { $LOGIN = 1; $cPassword = &setCrypt($adminPassword,""); &setCookie("set", "LoginCode", $cPassword, "", "", ""); } else { push(@ERR,"パスワードが合いません。"); } } opendir(DIR,$IMG_DIR); @Gallery = readdir(DIR); closedir(DIR); @Gallery = sort @Gallery; foreach $i (@Gallery) { if ($i =~ /^(\d+)\.(\d+)\.txt/) { ; } elsif ($i =~ /^(\d+)\./) { $page[$1] = 1; $page{$1} ++;} } ############################################################################################################################################# print <<"EOF"; Content-type: text/html\n $title $top_messages
EOF if (@ERR) { print "\n"; } foreach $n (1 .. $maxCell) { if ($n == 1 || ($n % $CellWidth) == 1) { print "\n"; } print "\t\n"; if ($n == $maxCell && $n % $CellWidth != 0) { foreach (1 .. $CellWidth - ($n % $CellWidth)) { print "\t\n"; } } if (($n % $CellWidth) == 0 || $n == $maxCell) { print "\n"; } } print <<"EOF";
\n"; print "
\n"; foreach (@ERR) { print "† $_
\n"; } print "
\n"; print "
\n"; print "\t\n"; if (-e "$IMG_DIR$in{'page'}\.$n\.jpg") { $ext = ".jpg"; } elsif (-e "$IMG_DIR$in{'page'}\.$n\.gif") { $ext = ".gif"; } elsif (-e "$IMG_DIR$in{'page'}\.$n\.png") { $ext = ".png"; } else { $ext = ""; } if (-e "$IMG_DIR$in{'page'}\.$n$ext") { print "\t\n"; } if (-e "$IMG_DIR$in{'page'}\.$n\.txt") { $line = ""; if (open(f,"$IMG_DIR$in{'page'}\.$n\.txt")) { while () { $line .= $_; } close(f); } print "\t\n"; } if ($LOGIN) { print "\t\n"; } print "\t
\"$in{'page'}-$n\"
$line
+
\n"; print "\t

EOF @page = sort {$a<=>$b} @page; foreach $i (1 .. $#page) { if ($page{$i} != 0) { if ($i eq $in{'page'}) { print " "; } else { print " "; } } elsif ($LOGIN) { if ($i eq $in{'page'}) { print "$i "; } else { print "$i "; } } } if ($LOGIN) { $Next = $#page + 1; if ($Next eq $in{'page'}) { print "$Next"; } else { print "$Next"; } } print <<"EOF";

$modoru | 更新 EOF if (!$LOGIN) { print " | ログイン"; } else { print " | ログアウト"; } print <<"EOF";

myGallery
EOF # 著作リンクを削除・改ざんすると利用規定違反となります。 exit; ############################################################################################################################################# sub edit { if ($in{'target'} <= 0 || $in{'target'} > $maxCell) { push(@ERR,"写真番号の整合性が合いません。"); } if ($in{'action'} eq "edit3") { if (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.jpg") { unlink("$IMG_DIR$in{'page'}\.$in{'target'}\.jpg"); } elsif (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.gif") { unlink("$IMG_DIR$in{'page'}\.$in{'target'}\.gif"); } elsif (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.png") { unlink("$IMG_DIR$in{'page'}\.$in{'target'}\.png"); } if (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.txt") { unlink("$IMG_DIR$in{'page'}\.$in{'target'}\.txt"); } } elsif ($in{'action'} eq "edit2") { if ($in{'file'} ne "") { foreach (@in) { ($fname) = $_ =~ /\bfilename="([^"]*)"/i; ($fname) = $_ =~ /\bfilename=([^\s:;]+)/i unless defined $fname; if ($fname eq '') { next; } ($name) = $_ =~ /\bname="([^"]+)"/i; ($name) = $_ =~ /\bname=([^\s:;]+)/i unless defined $name; if ($name =~ /file/) { ($ctype) = $_ =~ /\s*Content-type:\s*"([^"]+)"/i; ($ctype) = $_ =~ /\s*Content-Type:\s*([^\s:;]+)/i unless defined $ctype; if ($ctype !~ m#^image/#i) { $onLoad2 = "onLoad='alert(\"画像以外のファイルが検知されました。\\n($ctype)\")'"; last; } if ($ctype =~ m#^image/(.*)jp(.)g#i) { $ext = "jpg"; } elsif ($ctype =~ m#^image/x-png#i) { $ext = "png"; } elsif ($ctype =~ m#^image/gif#i) { $ext = "gif"; } else { $onLoad2 = "onLoad='alert(\"JPEGま/GIF/PNG以外が検知されました。\\n($ctype)\")'"; last; } if (open(IMAGE,"> $IMG_DIR$in{'page'}\.$in{'target'}\.$ext")) { binmode(IMAGE); print IMAGE $in{'file'}; close(IMAGE); chmod(0666,"$IMG_DIR$in{'page'}\.$in{'target'}\.$ext"); } else { $onLoad2 = "onLoad='alert(\"画像ファイルは受信されませんでした。\\n($!)\")'"; } last; } } } if ($in{'com'} ne "") { if (open(DAT,"> $IMG_DIR$in{'page'}\.$in{'target'}\.txt")) { print DAT $in{'com'}; close(DAT); chmod(0666,"$IMG_DIR$in{'page'}\.$in{'target'}\.txt"); } } elsif (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.txt") { unlink("$IMG_DIR$in{'page'}\.$in{'target'}\.txt"); } } print <<"EOF"; Content-type: text/html\n $title
EOF if (@ERR) { print "\n"; } if (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.jpg") { $ext = ".jpg"; } elsif (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.gif") { $ext = ".gif"; } elsif (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.png") { $ext = ".png"; } else { $ext = ""; } if (-e "$IMG_DIR$in{'page'}\.$in{'target'}$ext") { print <<"EOF"; EOF } print <<"EOF";
\n"; print "
\n"; foreach (@ERR) { print "† $_
\n"; } print "
\n"; print "
$in{'page'}-$in{'target'}

EOF if (-e "$IMG_DIR$in{'page'}\.$in{'target'}\.txt") { $line = ""; if (open(f,"$IMG_DIR$in{'page'}\.$in{'target'}\.txt")) { while () { $line .= $_; } close(f); } print "$line

\n"; } print <<"EOF";

画像ファイル
コメント(100バイト以内)

ギャラリーへ | ログアウト

EOF }#edit