#!/usr/local/bin/perl #┌───────────────────────────────── #│ TOPICS BOARD : admin.cgi - 2014/02/08 #│ copyright (c) KentWeb #│ http://www.kent-web.com/ #└───────────────────────────────── # モジュール宣言 use strict; use CGI::Carp qw(fatalsToBrowser); use lib "./lib"; use CGI::Minimal; # 設定ファイル認識 require "./init.cgi"; my %cf = init(); # データ受理 CGI::Minimal::max_read_size($cf{maxdata}); my $cgi = CGI::Minimal->new; error('容量オーバー') if ($cgi->truncated); my %in = parse_form($cgi); # 認証 check_passwd(); # 処理分岐 if ($in{data_new}) { data_new(); } if ($in{data_men}) { data_men(); } # メニュー画面 menu_html(); #----------------------------------------------------------- # メニュー画面 #----------------------------------------------------------- sub menu_html { header("メニューTOP"); print <

選択ボタンを押してください。

  処理メニュー
新規記事作成
記事メンテナンス(修正・削除)
掲示板へ移動
ログアウト
EOM exit; } #----------------------------------------------------------- # 新規記事 #----------------------------------------------------------- sub data_new { # 新規作成実行 if ($in{job} eq 'new2') { add_data(); } # 編集時 my $log = shift; my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$att,$tube) = split(/<>/,$log); # タグ指定 my $checked; if ($tag == 1) { $checked = "checked"; } else { $com =~ s/
/\n/ig; $checked = ""; } $com =~ s/\t/\n/g; # 添付 my %chk; if ($att eq 't') { $chk{y} = "checked"; $chk{i} = ""; } else { $chk{y} = ""; $chk{i} = "checked"; } # パラメータ定義 my $job = $in{job} ? "edit2" : "new2"; # 新規投稿時は年月日を取得 my ($hidden,$md); if ($in{data_new}) { $ENV{TZ} = "JST-9"; my ($mday,$mon,$year) = (localtime(time))[3..5]; $date = sprintf("%04d/%02d/%02d", $year+1900,$mon+1,$mday); $hidden = qq||; } else { $hidden = qq||; $md = 'data_men'; } # フォーム表示 header("投稿フォーム", "js"); back_btn($md); print <■ 投稿フォーム
$hidden
年月日
件名
本文 HTMLタグ有効 (但し改行は無効)
貼\付種別 ファイルアップ YouTube
ファイル
アップ
EOM my %e = (1 => $e1, 2 => $e2, 3 => $e3); foreach my $i (1 .. 3) { print qq|添付$i : \n|; if ($e{$i}) { print qq| 削除\n|; print qq|[添付]\n|; } print "
\n"; } print <
YouTube
タグ
EOM exit; } #----------------------------------------------------------- # 記事メンテナンス #----------------------------------------------------------- sub data_men { # 削除 if ($in{job} eq "dele" && $in{no}) { my @data; open(DAT,"+< $cf{logfile}") or error("open err: $cf{logfile}"); while () { my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$att,$tube) = split(/<>/); if ($in{no} == $no) { if ($e1) { unlink("$cf{imgdir}/$no-1$e1"); unlink("$cf{imgdir}/$no-s-1$e1") if (-f "$cf{imgdir}/$no-s-1$e1"); } if ($e2) { unlink("$cf{imgdir}/$no-2$e2"); unlink("$cf{imgdir}/$no-s-2$e2") if (-f "$cf{imgdir}/$no-s-2$e2"); } if ($e3) { unlink("$cf{imgdir}/$no-3$e3"); unlink("$cf{imgdir}/$no-s-3$e3") if (-f "$cf{imgdir}/$no-s-3$e3"); } next; } push(@data,$_); } seek(DAT, 0, 0); print DAT @data; truncate(DAT, tell(DAT)); close(DAT); # 修正フォーム } elsif ($in{job} eq "edit" && $in{no}) { my $log; open(IN,"$cf{logfile}") or error("open err: $cf{logfile}"); while () { my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$att,$tube) = split(/<>/); if ($in{no} == $no) { $log = $_; last; } } close(IN); # 修正画面 data_new($log); # 修正実行 } elsif ($in{job} eq "edit2" && $in{no}) { # 入力チェック input_check(); $in{tube} =~ s/
//g; # コード変換 if ($cf{conv_code} == 1) { require './lib/Jcode.pm'; $in{sub} = Jcode->new($in{sub})->sjis; $in{comment} = Jcode->new($in{comment})->sjis; } # 画像アップ my ($e1n,$w1n,$h1n,$e2n,$w2n,$h2n,$e3n,$w3n,$h3n); if ($in{upfile1} || $in{upfile2} || $in{upfile3}) { ($e1n,$w1n,$h1n,$e2n,$w2n,$h2n,$e3n,$w3n,$h3n) = upload($in{no}); } my @data; open(DAT,"+< $cf{logfile}") or error("open err: $cf{logfile}"); while () { chomp; my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$clip,$tube) = split(/<>/); if ($in{no} == $no) { # 画像削除のとき if ($in{del1}) { unlink("$cf{imgdir}/$no-1$e1"); unlink("$cf{imgdir}/$no-s-1$e1") if (-f "$cf{imgdir}/$no-s-1$e1"); $e1 = $w1 = $h1 = ""; } if ($in{del2}) { unlink("$cf{imgdir}/$no-2$e2"); unlink("$cf{imgdir}/$no-s-2$e2") if (-f "$cf{imgdir}/$no-s-2$e2"); $e2 = $w2 = $h2 = ""; } if ($in{del3}) { unlink("$cf{imgdir}/$no-3$e3"); unlink("$cf{imgdir}/$no-s-3$e3") if (-f "$cf{imgdir}/$no-s-3$e3"); $e3 = $w3 = $h3 = ""; } # 画像差替(拡張子が異なる場合) if ($e1n && $e1n ne $e1) { unlink("$cf{imgdir}/$no-1$e1"); unlink("$cf{imgdir}/$no-s-1$e1") if (-f "$cf{imgdir}/$no-s-1$e1"); } if ($e2n && $e2n ne $e2) { unlink("$cf{imgdir}/$no-2$e2"); unlink("$cf{imgdir}/$no-s-2$e2") if (-f "$cf{imgdir}/$no-s-2$e2"); } if ($e3n && $e3n ne $e3) { unlink("$cf{imgdir}/$no-3$e3"); unlink("$cf{imgdir}/$no-s-3$e3") if (-f "$cf{imgdir}/$no-s-3$e3"); } # 画像差替 if ($e1n) { $e1 = $e1n; $w1 = $w1n; $h1 = $h1n; } if ($e2n) { $e2 = $e2n; $w2 = $w2n; $h2 = $h2n; } if ($e3n) { $e3 = $e3n; $w3 = $w3n; $h3 = $h3n; } $_ = "$no<>$in{date}<>$in{sub}<>$in{comment}<>$e1<>$w1<>$h1<>$e2<>$w2<>$h2<>$e3<>$w3<>$h3<>$in{tag}<>$in{clip}<>$in{tube}<>"; } push(@data,"$_\n"); } seek(DAT, 0, 0); print DAT @data; truncate(DAT, tell(DAT)); close(DAT); # ソート } elsif ($in{job} eq "sort") { my (@sort,@data); open(DAT,"+< $cf{logfile}") or error("open err: $cf{logfile}"); while () { my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$clip,$tube) = split(/<>/); push(@sort,$in{"sort:$no"}); push(@data,$_); } # ソート @data = @data[sort {$sort[$a] <=> $sort[$b]} 0 .. $#sort]; # 更新 seek(DAT, 0, 0); print DAT @data; truncate(DAT, tell(DAT)); close(DAT); } header("メニュー > 記事メンテナンス"); back_btn(); print <<"EOM";
■ 記事メンテナンス
  • 処理を選択して送信ボタンを押してください。
  • 並び替えは「ソ\ート」を選択し、順番の数字を変更して送信ボタンを押してください。
処理: EOM # ログ展開 my $i = 0; open(IN,"$cf{logfile}") or error("open err: $cf{logfile}"); while () { my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$clip,$tube) = split(/<>/); $i++; print qq||; print qq||; print qq||; print qq|\n|; } close(IN); print < EOM exit; } #----------------------------------------------------------- # 記事追加 #----------------------------------------------------------- sub add_data { # 入力チェック input_check(); $in{tube} =~ s/
//g; # コード変換 if ($cf{conv_code} == 1) { require './lib/Jcode.pm'; $in{sub} = Jcode->new($in{sub})->sjis; $in{comment} = Jcode->new($in{comment})->sjis; } # データオープン my ($num,@file); open(DAT,"+< $cf{logfile}") or error("open err: $cf{logfile}"); while () { my ($no) = (split(/<>/))[0]; if ($num < $no) { $num = $no; } push(@file,$_); } # 採番 $num++; # 画像アップ my ($e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3) = $in{upfile1} || $in{upfile2} || $in{upfile3} ? upload($num) : (); # 最大記事数調整 while ( $cf{max} - 1 <= @file ) { my $del = pop(@file); my ($no,$date,$sub,$com,$e1,$w1,$h1,$e2,$w2,$h2,$e3,$w3,$h3,$tag,$clip,$tube) = split(/<>/,$del); if ($e1) { unlink("$cf{imgdir}/$no-1$e1"); unlink("$cf{imgdir}/$no-s-1$e1") if (-f "$cf{imgdir}/$no-s-1$e1"); } if ($e2) { unlink("$cf{imgdir}/$no-2$e2"); unlink("$cf{imgdir}/$no-s-2$e2") if (-f "$cf{imgdir}/$no-s-2$e2"); } if ($e3) { unlink("$cf{imgdir}/$no-3$e3"); unlink("$cf{imgdir}/$no-s-3$e3") if (-f "$cf{imgdir}/$no-s-3$e3"); } } # 更新 unshift(@file,"$num<>$in{date}<>$in{sub}<>$in{comment}<>$e1<>$w1<>$h1<>$e2<>$w2<>$h2<>$e3<>$w3<>$h3<>$in{tag}<>$in{clip}<>$in{tube}<>\n"); seek(DAT, 0, 0); print DAT @file; truncate(DAT, tell(DAT)); close(DAT); message("新規記事を追加しました"); } #----------------------------------------------------------- # 画像アップロード #----------------------------------------------------------- sub upload { my $no = shift; # サムネイル機能 require './lib/thumb.pl' if ($cf{thumbnail}); my @ret; foreach my $i (1 .. 3) { # 拡張子取得 my $ext; if ($cgi->param_filename("upfile$i") =~ /(\.\w+)$/i) { $ext = $1; } else { push(@ret,('','','')); next; } $ext =~ tr/A-Z/a-z/; if ($ext eq '.jpeg') { $ext = '.jpg'; } # 添付ファイル定義 my $upfile = "$cf{imgdir}/$no-$i$ext"; # アップロード書き込み open(UP,"+> $upfile") or error("up err: $upfile"); binmode(UP); print UP $in{"upfile$i"}; close(UP); # パーミッション付与 chmod(0666,$upfile); # 画像の場合サイズ取得 my ($flg,$w,$h); if ($ext eq ".jpg") { ($w,$h) = j_size($upfile); $flg++; } elsif ($ext eq ".gif") { ($w,$h) = g_size($upfile); $flg++; } elsif ($ext eq ".png") { ($w,$h) = p_size($upfile); $flg++; } # サムネイル作成 if ($flg && $cf{thumbnail}) { ($w,$h) = resize($w,$h); my $thumb = "$cf{imgdir}/$no-s-$i$ext"; make_thumb($upfile,$thumb,$w,$h); } # 拡張子, 横幅, 縦幅 の順 push(@ret,($ext,$w,$h)); } # 結果を返す return @ret; } #----------------------------------------------------------- # JPEGサイズ認識 #----------------------------------------------------------- sub j_size { my $jpg = shift; my ($h, $w, $t); open(IMG,"$jpg"); binmode(IMG); read(IMG, $t, 2); while (1) { read(IMG, $t, 4); my ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $w = $h = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(IMG, $t, 5); ($h, $w) = unpack("xnn", $t); last; } else { read(IMG, $t, ($l - 2)); } } close(IMG); return ($w, $h); } #----------------------------------------------------------- # GIFサイズ認識 #----------------------------------------------------------- sub g_size { my $gif = shift; my $data; open(IMG,"$gif"); binmode(IMG); sysread(IMG, $data, 10); close(IMG); if ($data =~ /^GIF/) { $data = substr($data, -4); } my $w = unpack("v", substr($data, 0, 2)); my $h = unpack("v", substr($data, 2, 2)); return ($w, $h); } #----------------------------------------------------------- # PNGサイズ認識 #----------------------------------------------------------- sub p_size { my $png = shift; my $data; open(IMG,"$png"); binmode(IMG); read(IMG, $data, 24); close(IMG); my $w = unpack("N", substr($data, 16, 20)); my $h = unpack("N", substr($data, 20, 24)); return ($w, $h); } #----------------------------------------------------------- # HTMLヘッダー #----------------------------------------------------------- sub header { my ($ttl,$js) = @_; print < EOM if ($js eq 'js') { print < // referer: http://5am.jp/javascript/form_change_javascript/ function entryChange1(){ radio = document.getElementsByName('clip') if(radio[0].checked) { //フォーム document.getElementById('ibox').style.display = ""; document.getElementById('ybox').style.display = "none"; }else if(radio[1].checked) { //フォーム document.getElementById('ibox').style.display = "none"; document.getElementById('ybox').style.display = ""; } } //オンロードさせ、リロード時に選択を保持 window.onload = entryChange1; JAVAS } print <$ttl EOM } #----------------------------------------------------------- # パスワード認証 #----------------------------------------------------------- sub check_passwd { # パスワードが未入力の場合は入力フォーム画面 if ($in{pass} eq "") { enter_form(); # パスワード認証 } elsif ($in{pass} ne $cf{password}) { error("認証できません"); } } #----------------------------------------------------------- # 入室画面 #----------------------------------------------------------- sub enter_form { header("入室画面"); print <
選択 順番 タイトル 日付 添付
$sub$date|; print qq|[1]\n| if ($e1); print qq|[2]\n| if ($e2); print qq|[3]\n| if ($e3); print qq|
管理パスワード入力


EOM exit; } #----------------------------------------------------------- # エラー #----------------------------------------------------------- sub error { my $err = shift; header("ERROR!"); print <

ERROR!

$err


EOM exit; } #----------------------------------------------------------- # 完了メッセージ #----------------------------------------------------------- sub message { my $msg = shift; header("完了"); print <

$msg


EOM exit; } #----------------------------------------------------------- # 戻りボタン #----------------------------------------------------------- sub back_btn { my $mode = shift; print <
@{[ $mode ? qq|| : "" ]}
EOM } #----------------------------------------------------------- # 入力チェック #----------------------------------------------------------- sub input_check { my $err; if (!$in{date}) { $err .= "日付が未入力です
"; } if (!$in{sub}) { $err .= "タイトルが未入力です
"; } if (!$in{comment}) { $err .= "メッセージが未入力です
"; } error($err) if ($err); # タグ復元 # if ($in{tag} == 1) { $in{comment} =~ s/
//g; } }