Skip to content

Instantly share code, notes, and snippets.

@m---

m---/mrn.cgi Secret

Created December 11, 2015 11:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m---/0066493679a0bb6bc42b to your computer and use it in GitHub Desktop.
Save m---/0066493679a0bb6bc42b to your computer and use it in GitHub Desktop.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# まろやかリレー小説
$version = '1.20d'; # (2010/06/16 Update)
# Copyright(c) 2007-2010 tisa All rights reserved.
#
# URL : http://goo.gl/kxtdN
# MAIL : ari_tisa9@ahsic.com
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ★管理者パスワード(※必ず変更してください)
$mskey = '0123';
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#### ファイルパス ####
$script = './mrn.cgi'; # メインスクリプト
$cnffile = './config.ini'; # 設定ファイル
$style = './style.css'; # スタイルシートファイル
$indexfile = './data.dat'; # インデックスファイル
$mailfile = './mail.dat'; # メールファイル
$jcode = './jcode.pl'; # 日本語コードライブラリ
$mimew = './mimew.pl'; # MIMEコード変換ライブラリ
$cgilib = './cgi-lib.pl'; # デコード・画像処理ライブラリ
$gps = './GetPicSize.pl'; # 画像サイズ取得ライブラリ
#### ディレクトリ ####
$nvdir = 'novel'; # ログ保管ディレクトリ名
$imgdir = 'img'; # 画像保管ディレクトリ名
$lockdir = './lock/lock'; # ロックディレクトリ
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
####■ 以下スクリプト ■####
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ENV{'TZ'} = 'JST-9';
if (!(-e $cnffile)) { die "Error: $cnffileオープンエラー"; } else { require $cnffile; }
if (!(-e $jcode)) { die "Error: $jcodeオープンエラー"; } else { require $jcode; }
if (!(-e $mimew)) { die "Error: $mimewオープンエラー"; } else { require $mimew; }
if (!(-e $cgilib)) { die "Error: $cgilibオープンエラー"; } else { require $cgilib; }
if (!(-e $gps)) { die "Error: $cnffileオープンエラー"; } else { require $gps; }
%FORM = &decode; # デコード
$host = &get_host; # ホストゲット
%COOKIE = &get_cookie; # クッキーゲット
&deny if ($usedeny); # アクセス制限
# 各処理分岐
$mode = $FORM{'mode'};
if ($mode eq 'view') { &view; }
elsif ($mode eq 'mail') { &mail; }
elsif ($mode eq 'mail_update') { &mail_update; }
elsif ($mode eq 'authors') { &authors; }
elsif ($mode eq 'imgview') { &imgview; }
elsif ($mode eq 'chkpw') { &check_pass; }
elsif ($mode eq 'form') { &form; }
elsif ($mode eq 'write') { if (!$FORM{'no'}) { &new_update; } else { &edit_update; } }
elsif ($mode eq 'del') { &delete; }
elsif ($mode eq 'login') { &login; }
elsif ($mode eq 'admin') { &admin; }
elsif ($mode eq 'admin_edits') { if ($FORM{'proc'} ne 'del') { &admin_form; } else { &admin_delete; } }
elsif ($mode eq 'admin_write') { if (!$FORM{'log'}) { &admin_new_update; } else { &admin_edit_update; } }
else { ⊤ }
exit;
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ トップ(タイトル一覧表示)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub top {
my ($log, $title, $joutai, $mess, $rcnt, $days, $name, $jti, @index);
# インデックスファイル読み込み
@index = &file_read("$indexfile");
&header($noveltitle);
print "<p class=\"title\">~ $noveltitle ~\n</p>";
print "<p>$message</p>\n";
if (@index) {
print "<p><table width=\"430\" cellpadding=\"4\" cellspacing=\"3\">\n";
# タイトル表示
foreach (@index) {
($log, $title, $joutai, $mess, $rcnt, $days, $name) = split(/\t/, $_);
# 状態
$jti = ($joutai) ? "完結済" : "進行中";
# 最終更新者
chomp($name);
$name = " by $name" if ($name);
# リレー数
$rcnt-- if ($rcnt > 0);
#タイトル
print "<tr class=\"titlebgc\"><td width=\"1%\" class=\"decor\"><br></td><td width=\"80%\" nowrap>\n";
print "<big><a href=\"$script?mode=view&log=$log\">$title</a></big> [$jti]<br>";
print "</td>\n";
#執筆者一覧
if ($authors) {
print "<td align=\"center\" width=\"20%\" nowrap>\n";
print "<a href=\"$script?mode=authors&log=$log\">執筆者一覧</a>\n";
print "</td>\n";
}
#その他内容
print "</tr><tr class=\"msbgc\"><td colspan=\"3\">$mess\n";
print "<div align=\"right\">リレー数:<font color=\"#CC3333\"><b>$rcnt</b></font> 最終更新:$days$name</div>\n";
print "</td></tr>\n";
}
print "</td></tr></table></p>\n";
} else {
print "<p>[ 小説はまだありません。 ]</p>\n";
}
# 管理フォーム
print "<br>\n";
print "<p><a href=\"$script?mode=login\">管理用</a></p>\n";
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 文章表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub view {
my ($top, $title, $joutai, $page, $total, $editicon,
$no, $name, $mail, $img, $dhost, $days, $time, $pass, $text,
$x, $y, $back, $next, @data);
# ログファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
&header("$title-$noveltitle");
# メニュー
print "<p class=\"title2\">$title</p>\n";
print "<p>[<a href=\"$homeurl\"> HOME </a>]\n";
print "[<a href=\"$script?\"> TOP </a>]\n";
if ($useimg) {
print "[<a href=\"$script?mode=imgview&log=$FORM{'log'}\"> 挿絵一覧 </a>]\n";
}
if ($useml) {
print "[<a href=\"$script?mode=mail&log=$FORM{'log'}\"> メール配信 </a>]\n";
}
if ($joutai != 1) {
if (!$formwindow) {
# 通常執筆画面
print "[<a href=\"$script?mode=form&log=$FORM{'log'}#bottom\"> 執筆 </a>]\n";
} else {
# 小窓執筆画面
print "[<a href=\"javascript:subwin('$script?mode=form&log=$FORM{'log'}&no=$no')\"> 執筆 </a>]\n";
}
}
print "</p>\n";
# ページのダイレクトリンク
$page = $FORM{'page'} || 1;
$total = int((@data) / $pagemax);
$total++ if ((@data) % $pagemax);
if ($total > 1) {
foreach (1..$total) {
if ($page == $_) {
print "[ <b>$_</b> ]\n";
} else {
print "[ <a href=\"$script?mode=view&log=$FORM{'log'}&page=$_\">$_</a> ]\n";
}
}
}
# ここからテキスト表示
print "<div class=\"work\">\n";
print $textline if ($textlinetb);
if (@data) {
#$editicon = ($ENV{'HTTP_USER_AGENT'} =~ /Windows/) ? "<font face=\"Wingdings\">!</font>" : "編集";
$editicon = "<img src=\"eraser.gif\" width=\"15\" height=\"15\" align=\"middle\" alt=\"編集\" border=\"0\">";
$x = ($page - 1) * $pagemax;
$y = (($x + $pagemax) > (@data)) ? (@data) : ($x + $pagemax);
while ($x < $y) {
($no, $name, $mail, $img, $dhost, $days, $time, $pass, $text) = split(/\t/, $data[$x]);
# 文章
print $text;
if ($name) {
# メールリンク
if (!$mail) {
$name = " $name";
} else {
$name = " <a href=\"mailto:$mail\"><u style=\"color:#CC3333\">$name</u></a>";
}
}
# 日付/名前表示
print "<div align=\"right\"><font size=\"-1\"><font color=\"#CC3333\">&lt;$days$name&gt;</font>";
if ($joutai != 1) {
# 編集リンク
if (!$formwindow) {
# 通常編集
print "<a href=\"$script?mode=chkpw&log=$FORM{'log'}&no=$no\">$editicon</a>";
} else {
# 小窓編集
print "<a href=\"javascript:subwin('$script?mode=chkpw&log=$FORM{'log'}&no=$no')\">$editicon</a>\n";
}
}
print "</font></div>\n";
$x++;
# ページ区切り
print "$textline\n" if ($x < $y);
}
} else {
print "[ 文章はまだありません。 ]\n";
}
print $textline if ($textlinetb);
print "</div>\n";
# テキスト表示終わり
# ページ前後移動リンク
$back = $page - 1;
$next = $page + 1;
print "<p>\n";
# 前のページ
if ($back) {
print "<a href=\"$script?mode=view&log=$FORM{'log'}&page=$back\">前のページ</a> ≪ \n";
}
print "<a href=\"$script?\">TOP</a>\n";
# 次のページ
if ($total > $page) {
print " ≫ <a href=\"$script?mode=view&log=$FORM{'log'}&page=$next\">次のページ</a>\n";
} elsif ($joutai != 1) {
if (!$formwindow) {
# 通常執筆画面
print " ≫ <a href=\"$script?mode=form&log=$FORM{'log'}#bottom\">続きを執筆</a>\n";
} else {
# 小窓執筆画面
print " ≫ <a href=\"javascript:subwin('$script?mode=form&log=$FORM{'log'}')\">続きを執筆</a>\n";
}
}
print "</p>\n";
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ メール配信
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub mail {
# ログファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
&header("$title-$noveltitle");
print <<"_HTML_";
<p class="title2">メール配信</p>
メールアドレスを登録しておくことで、<br>リレー小説が更新された時にメールで知らせてくれます。
<form action="$script" method="POST">
<input type="hidden" name="log" value="$FORM{'log'}">
<input type="hidden" name="mode" value="mail_update">
<table class="fmtbl">
<tr>
<td>対象リレー小説</td>
<td>$title</td>
</tr>
<tr>
<td align="right">
メールアドレス
</td>
<td>
<input type="text" size="40" name="mail">
<select name="proc">
<option value="ins">配信登録</option>
<option value="del">配信解除</option>
</select>
<input type="submit" value="決定"></td>
</tr>
</table>
</form>
<p>
<a href="$script?">TOP</a> ≫ <a href="$script?mode=view&log=$FORM{'log'}">小説に戻る</a>
</p>
_HTML_
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 執筆者一覧表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub authors {
my ($top, $title, $joutai, $name, $mail, $days, $time,
@data, %COUNT, %MAIL, %TIME, %DAYS);
# ログファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
&header("$title-$noveltitle");
print "<p><table cellpadding=\"3\"><tr class=\"titlebgc\"><td>\n";
print "■「$title」執筆者一覧<br><small>※名無しの執筆者は表\示されません。</small>\n";
print "</td></tr></table></p>\n";
if (@data) {
# データセット
foreach (@data) {
($name, $mail, $days, $time) = (split(/\t/, $_))[1, 2, 5, 6];
if ($name) {
$COUNT{$name}++;
$MAIL{$name} = $mail;
# 最後に執筆した日付をセット
if ($time > $TIME{$name}) {
$TIME{$name} = $time;
$DAYS{$name} = $days;
}
}
}
print "<p><table width=\"380\" cellpadding=\"10\" cellspacing=\"50\">\n";
# 表示
foreach (keys %COUNT) {
print "<tr><td class=\"aut\"><b style=\"font-size:15px;\">$_</b><br>\n";
print "<hr size=\"1\" style=\"width:100%;\">\n";
print "執筆数:$COUNT{$_} 最終執筆:$DAYS{$_}\n";
print "<br>MAIL:<a href=\"mailto:$MAIL{$_}\">$MAIL{$_}</a>\n" if ($MAIL{$_});
print "</td></tr>\n";
}
print "</table></p>\n";
} else {
print "<p>[ 執筆者はまだいません。 ]</p>\n";
}
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\">このリレー小説を読む</a></p>\n";
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 挿絵一覧表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub imgview {
my ($top, $title, $i, $no, $kaku, $sasie, @data);
# ファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
$title = (split(/\t/, $top))[0];
&header("$title-$noveltitle");
print "<p><table cellpadding=\"3\"><tr class=\"titlebgc\"><td>\n";
print "■「$title」挿絵一覧<br><small>※画像をクリックすると拡大します。</small>\n";
print "</td></tr></table></p>\n";
if (@data) {
# 画像を中央に拡大するためのテーブル
print "<table width=\"100%\" height=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"tbl\" id=\"tb\" onclick=\"cls()\"><tr>\n";
print "<td align=\"center\"><img src=\"\" name=\"view\" border=\"0\" class=\"viw\">\n";
print "</td></tr></table>\n";
print "<table align=\"center\" cellpadding=\"5\"><tr>\n";
$i = 1;
foreach (@data) {
($no, $kaku) = (split(/\t/, $_))[0, 3];
if ($kaku) {
print "<td>\n";
print "<img src=\"./$nvdir$FORM{'log'}/$imgdir/$no\.$kaku\" class=\"smn\" id=\"id$i\" onclick=\"opn('./$nvdir$FORM{'log'}/$imgdir/$no\.$kaku')\">\n";
print "</td>\n";
$sasie = 1;
}
print "</tr><tr>\n" if (!($i % $imgretsu));
$i++;
}
print "</tr></table>\n";
}
print "<p>[ 挿絵はまだありません。 ]</p>\n" if (!$sasie);
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\">このリレー小説を読む</a></p>\n";
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 執筆画面表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub form {
my ($top, $title, $joutai,
$no, $name, $mail, $img, $dhost, $days, $time, $pass, $text,
$textarea, $hsnm, $hsml, $hsps, $hsfl, $rw, $stxt, $oktag, $tag, $usim, $form, @data);
# ログファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
# 状態チェック
if ($joutai == 1) {
&error("この小説は完結しています。続執筆はできません。");
}
# 該当ログデータを取得(なければ最終書き込みデータをもらう)
foreach (@data) {
($no, $name, $mail, $img, $dhost, $days, $time, $pass, $text) = split(/\t/, $_);
last if ($FORM{'no'} == $no);
}
if ($FORM{'no'}) {
# 修正
&pass_check($FORM{'key'}, $pass);
chomp($text);
$textarea = $text;
$textarea =~ s/<br>/\n/g;
$textarea =~ s/<img.+>/##img##/g if ($img);
} else {
# 新規
$name = $COOKIE{'name'};
$mail = $COOKIE{'mail'};
}
# 必須マーク
$hsnm = "<font color=\"#CC3300\">*</font>" if ($hsname);
$hsml = "<font color=\"#CC3300\">*</font>" if ($hsmail);
$hsps = "<font color=\"#CC3300\">*</font>" if ($hspass);
$hsfl = "<font color=\"#CC3300\">*</font>" if ($hsfile);
# 文章制限説明
if ($renwd) {
$rw = "連続ワード限度数は$renwd回、";
}
$stxt = "制限文字数は$maxtext文字以内、$mintext文字以上です。";
# タグ制限説明
if (!$notag) {
# タグ有効
foreach (@oktag) {
$oktag .= "&lt;$_&gt;";
}
$tag = "タグは$oktagが使えます。<br>";
} else {
# タグ無効
$tag = "タグは使えません。<br>";
}
# 画像アップロード説明
if ($useimg) {
foreach (@okimg) {
$okimg .= "[$_]";
}
$usim = "アップロードできるファイルは$okimgで、$imgmxsz\KB以下、$imgwid×$imgheiまでです。<br>".
"挿入方法は文章内の表\示させたい個所に##img##と入れてください。";
}
$form =<<"_HTML_";
<p><b>~ 執筆フォーム ~</b><br>
<font color="#CC3300">*</font>は必須項目です。<br>
</p>
<p><form action="$script" method="POST" name="form" enctype="multipart/form-data">
<input type="hidden" name="log" value="$FORM{'log'}">
<input type="hidden" name="no" value="$FORM{'no'}">
<input type="hidden" name="key" value="$FORM{'key'}">
<input type="hidden" name="mode" value="write">
<table class="fmtbl">
<tr>
<td align="right" nowrap>
$hsnm名前
</td>
<td nowrap>
<input type="text" size="$namesize" maxlength="$maxname" name="name" value="$name">
$hsml\Mail <input type="text" size="$mailsize" name="mail" value="$mail" style="ime-mode: inactive;">
$hsps再編集用PASS <input type="password" size="$passsize" name="pass" value="$COOKIE{'pass'}">
</td>
</tr>
_HTML_
$form .=<<"_HTML_" if ($useimg);
<tr>
<td align="right" nowrap>
$hsfl挿絵
</td>
<td nowrap>
<input type="file" size="48" name="upfile"><br>
$usim
</td>
</tr>
_HTML_
$form .=<<"_HTML_";
<tr>
<td align="right" rowspan="2" nowrap>
文章<br><br>
</td>
<td>
<textarea cols="$textcols" rows="$textrows" wrap="soft" name="text" style="ime-mode: active;">$textarea</textarea><br>
$rw$stxt<br>
$tag
</td>
</tr>
<tr>
<td nowrap>
<input type="button" value=" 書き込む " onClick="this.disabled='true'; this.form.submit();">
<input type="reset" value="リセット">
</td>
</tr>
</table>
</form>
</p>
_HTML_
&header("執筆画面-$noveltitle");
if (!$formwindow) {
# 通常表示
if ($text) {
print "<hr size=\"1\" width=\"640\">\n";
print "<p align=\"left\" class=\"work\">$text</p>\n";
print "<hr size=\"1\" width=\"640\">\n";
}
print "<a name=\"bottom\"></a>\n";
print $form;
print "<hr size=\"1\" width=\"640\">\n";
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\">小説へ戻る</a></p>\n";
&footer;
} else {
# 小窓表示
print $form;
print "<p><a href=\"javascript:window.close();\">閉じる</a></p>\n";
print "</center></body></html>\n";
}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 入力チェック
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub input_check {
my (@text, @error);
# 文章の文字数を調べる
@text = ($FORM{'text'} =~ /[\x80-\x9F\xE0-\xFF].|./g);
if ($hsname && !$FORM{'name'}) { push(@error, "名前を入力してください。"); }
if ($hspass && !$FORM{'pass'}) { push(@error, "パスワードを入力してください。"); }
if ($hsmail && !$FORM{'mail'}) { push(@error, "メールアドレスを入力してください。"); }
elsif ($mail && $mail !~ /^[\-\w\.]+\@[\-\w]+(\.[\-\w]+)+$/) { push(@error, "メールアドレスが不正です。"); }
#if ($url && $url !~ /^http:\/\/.+/) { push(@error, "URLが不正です。"); }
if ($hsfile && !$FORM{'upfile'}) { push(@error, "挿絵を入力してください。"); }
elsif ($FORM{'upfile'} && length($FORM{'upfile'}) > ($imgmxsz * 1024)) { push(@error, "挿絵のファイルサイズが大きすぎます。"); }
if ($mintext > (@text)) { push(@error, "文章が短すぎます。"); }
elsif ($maxtext < (@text)) { push(@error, "文章は長すぎます。"); }
if ($renwd && $FORM{'text'} =~ /(.+)\1{$renwd}/) { push(@error, "連続文字限度数を超えてます。"); }
if (@error) { &error(@error); }
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 新規
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub new_update {
my ($title, $joutai, $no, $hst, $tim, $pwd, $days, $kaku, $wid, $hei, $flg, $nbt, @index, @tmp, @data, @mail);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
&input_check; # 入力チェック
# インデックスファイル・ログファイル・メールファイル読み込み
@index = &file_read("$indexfile");
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
$time = time; # 現時刻ゲット
# 最終書き込みデータをゲット
($no, $hst, $tim) = (split(/\t/, $data[$#data]))[0, 4, 6];
# 連続投稿を制御
if ($renzoku && ($host eq $hst or $time < $tim+60*3)) {
&error("連続投稿は禁止しています。");
}
$pwd = &encrypt($FORM{'pass'}) if ($FORM{'pass'}); # 暗号化
$days = &get_days($time); # 日付
$no += 1; # ナンバー
# タイトルデータを更新
foreach (@index) {
@tmp = split(/\t/, $_);
if ($FORM{'log'} == $tmp[0]) {
$tmp[4]++;
$tmp[5] = $days;
$tmp[6] = $FORM{'name'}."\n";
$_ = join("\t", @tmp);
$flg = 1;
last;
}
}
if (!$flg) {
&error("該当タイトルデータが見つかりません。");
}
# 画像アップロード
if ($incfn{'upfile'}) {
# ログ番号,ローカルファイルパス,画像
$kaku = &img_write($no, $incfn{'upfile'}, $FORM{'upfile'});
($wid, $hei) = (&GetImageSize("./$nvdir$FORM{'log'}/$imgdir\/$no\.$kaku"))[1, 2];
if ($wid > $imgwid || $hei > $imghei) {
if ($oversz) {
# 画像サイズが規定超えてれば直す
$wid = $imgwid if ($wid > $imgwid);
$hei = $imghei if ($hei > $imghei);
} else {
&error("挿絵のサイズが大きすぎます。");
}
}
# 画像挿入
$FORM{'text'} =~ s/##img##/<img src="\.\/$nvdir$FORM{'log'}\/$imgdir\/$no\.$kaku" width="$wid" height="$hei">/g;
}
# データセット
push(@data, "$no\t$FORM{'name'}\t$FORM{'mail'}\t$kaku\t$host\t$days\t$time\t$pwd\t$FORM{'text'}\n");
# ファイル書き込み
&lock if ($lock);
&file_write("./$nvdir$FORM{'log'}\/log\.dat", $top, @data);
&file_write("$indexfile", @index);
&unlock if ($lock);
# メール送信
if ($useml) {
$nbt = (split("\t", $top))[0];
&sendmail($nbt, $FORM{'name'}, $days, $FORM{'text'});
}
# クッキーセット
&set_cookie($FORM{'name'}, $FORM{'mail'}, $FORM{'pass'});
# 以下結果表示
&header("書き込み完了-$noveltitle");
print "<p>書き込みが正常に完了しました。</p>\n";
if (!$formwindow) {
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\"\">小説に戻る</a></p>\n";
}else{
print "<p><a href=\"javascript:window.close();\">閉じる</a></p>\n";
}
print "</center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 修正
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub edit_update {
my ($top, $title, $joutai, $no, $dy, $tm, $flg, $pwd, $kaku, $wid, $hei, @data);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
&input_check; # 入力チェック
# ログファイル読み込み
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
# 該当ログを更新
foreach (@data) {
($no, $kaku, $dy, $tm) = (split(/\t/, $_))[0, 3, 5, 6];
if ($FORM{'no'} == $no) {
$pwd = &encrypt($FORM{'pass'}) if ($FORM{'pass'}); # 暗号化
if ($incfn{'upfile'}) {
# 画像アップロード
$kaku = &img_write($no, $incfn{'upfile'}, $FORM{'upfile'});
}
if ($kaku) {
# 画像サイズが規定超えてれば直す
($wid, $hei) = (&GetImageSize("./$nvdir$FORM{'log'}/$imgdir\/$no\.$kaku"))[1, 2];
if ($wid > $imgwid || $hei > $imghei) {
if ($oversz) {
# 画像サイズが規定超えてれば直す
$wid = $imgwid if ($wid > $imgwid);
$hei = $imghei if ($hei > $imghei);
} else {
&error("挿絵のサイズが大きすぎます。");
}
}
# 画像挿入
$FORM{'text'} =~ s/##img##/<img src="\.\/$nvdir$FORM{'log'}\/$imgdir\/$no\.$kaku" width="$wid" height="$hei">/g;
}
$_ = "$no\t$FORM{'name'}\t$FORM{'mail'}\t$kaku\t$host\t$dy\t$tm\t$pwd\t$FORM{'text'}\n";
$flg = 1;
last;
}
}
if (!$flg) {
&error("該当ログデータが見つかりません。");
}
# ファイル書き込み
&lock if ($lock);
&file_write("./$nvdir$FORM{'log'}\/log\.dat", $top, @data);
&unlock if ($lock);
# クッキーセット
&set_cookie($FORM{'name'}, $FORM{'mail'}, $FORM{'pass'});
# 以下結果表示
&header("修正完了-$noveltitle");
print "<p>修正が正常に完了しました。</p>\n";
if (!$formwindow) {
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\"\">小説に戻る</a></p>\n";
}else{
print "<p><a href=\"javascript:window.close();\">閉じる</a></p>\n";
}
print "</center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 削除
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub delete {
my ($top, $title, $joutai, $no, $im, $pw, $flg, $nm, $dy, $flg2, @index, @index2, @data, @nwdata);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
# インデックスファイル・ログファイル読み込み
@index = &file_read("$indexfile");
($top, @data) = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
($title, $joutai) = split(/\t/, $top);
# 該当ログを削除
foreach (@data) {
($no, $im, $pw) = (split(/\t/, $_))[0, 3, 7];
if ($FORM{'no'} == $no) {
&pass_check($FORM{'key'}, $pw);
unlink("./$nvdir$FORM{'log'}/$imgdir\/$no\.$im") if ($im); # 挿絵も削除
$flg = 1;
next;
}
push(@nwdata, $_);
}
if (!$flg) {
&error("該当ログデータが見つかりません。");
}
# 該当タイトルデータを更新
foreach (@index) {
@index2 = split(/\t/, $_);
if ($FORM{'log'} == $index2[0]) {
$flg2 = 1;
($nm, $dy) = (split(/\t/, $data[$#data]))[1, 5] if ($#data);
$index2[4]--;
$index2[5] = $dy;
$index2[6] = $nm."\n";
$_ = join("\t", @index2);
last;
}
}
if (!$flg2) {
&error("該当タイトルデータが見つかりません。");
}
# ファイル書き込み
&lock if ($lock);
&file_write("./$nvdir$FORM{'log'}\/log\.dat", $top, @nwdata);
&file_write("$indexfile", @index);
&unlock if ($lock);
# 以下結果表示
&header("$title-$noveltitle");
print "<p>削除が正常に完了しました。</p>\n";
if (!$formwindow) {
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\"\">小説に戻る</a></p>\n";
}else{
print "<p><a href=\"javascript:window.close();\">閉じる</a></p>\n";
}
print "</center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 管理画面表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub admin {
my ($log, $title, $joutai, $mess, $rcnt, $days, $name, $jti, @data);
# パスワードチェック
if ($FORM{'key'} ne $mskey) {
&error("パスワードが違います。");
}
# ログファイル読み込み
@data = &file_read("$indexfile");
&header("管理画面-$noveltitle");
print "<p><div class=\"title\">~ 管理画面 ~</div>\n";
print "タイトルを選択して下部の送信で修正・削除ができます。<br>新規作成は下のボタンをポチリ。</p>\n";
print "<p><form action=\"$script\" method=\"POST\">\n";
print "<input type=\"hidden\" name=\"key\" value=\"$FORM{'key'}\">\n";
print "<input type=\"hidden\" name=\"mode\" value=\"admin_edits\">\n";
print "<input type=\"submit\" name=\"new\" value=\"新規作成\">\n";
print "</form></p>\n";
print "<p><form action=\"$script\" method=\"POST\" name=\"form\">\n";
print "<input type=\"hidden\" name=\"key\" value=\"$FORM{'key'}\">\n";
print "<input type=\"hidden\" name=\"mode\" value=\"admin_edits\">\n";
if (@data) {
print "<table width=\"430\" cellpadding=\"3\" cellspacing=\"4\">\n";
# タイトル表示
foreach (@data) {
($log, $title, $joutai, $mess, $rcnt, $days, $name) = split(/\t/, $_);
# 状態
$jti = ($joutai) ? "完結済" : "進行中";
# 最終更新者
chomp($name);
$name = " by $name" if ($name);
# リレー数
$rcnt-- if ($rcnt > 0);
# タイトル
print "<tr class=\"titlebgc\"><td class=\"decor\"><br></td><td width=\"80%\" nowrap>\n";
print "<input type=\"radio\" name=\"log\" value=\"$log\">\n";
print "<big><a href=\"$script?mode=view&log=$log\" target=\"_blank\">$title</a></big> [$jti]<br>";
print "</td>\n";
# 執筆者一覧
print "<td align=\"center\" width=\"20%\" nowrap>\n";
print "<a href=\"$script?mode=authors&log=$log\" target=\"_blank\">執筆者一覧</a>\n";
print "</td>\n";
# その他内容
print "</tr><tr class=\"msbgc\"><td colspan=\"3\">$mess\n";
print "<div align=\"right\">リレー数:<font color=\"#CC3333\"><b>$rcnt</b></font> 最終更新:$days$name</div>\n";
print "</td></tr>\n";
}
print "<tr><td colspan=\"3\">\n";
print "<hr size=\"1\" style=\"width:100%;\">\n";
print "<select name=\"proc\">\n";
print "<option value=\"edit\">修正</option>\n";
print "<option value=\"del\">削除</option>\n";
print "</select>\n";
print "<input type=\"button\" value=\"送信\" onClick=\"disabled='true'; form.submit();\">\n";
print "</td></tr></table>\n";
} else {
print "<p>[ 小説はまだありません。 ]</p>\n";
}
print "</form></p>\n";
print "<p><a href=\"$script?\">TOP</a></p>\n";
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ タイトル作成・修正画面表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub admin_form {
my ($log, $title, $joutai, $mess, $selected, @index);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
if (!$FORM{'new'}) {
# 修正
# 入力チェック
if (!$FORM{'log'}) {
&error("題名を選択してください。");
}
# インデックスファイル読み込み
@index = &file_read("$indexfile");
# 該当タイトルを検索
foreach (@index) {
($log, $title, $joutai, $mess) = (split(/\t/, $_))[0..3];
if ($FORM{'log'} == $log) {
$mess =~ s/<br>/\n/g;
$selected = " selected" if ($joutai);
last;
}
}
}
&header("タイトル編集画面-$noveltitle");
print <<"_HTML_";
<p><b>~ タイトル編集画面 ~</b><br>
<font color="#CC3300">*</font>は必須項目です。</p>
<p><form action="$script" method="POST" name="form">
<input type="hidden" name="log" value="$FORM{'log'}">
<input type="hidden" name="key" value="$FORM{'key'}">
<input type="hidden" name="mode" value="admin_write">
<table class="fmtbl">
<tr>
<td align="right"><font color="#CC3300">*</font>題名</td>
<td><input type="text" size="30" name="title" value="$title" style="ime-mode: active;"></td>
</tr>
<tr>
<td align="right">状態</td>
<td>
<select name="joutai">
<option value="0">進行中</option>
<option value="1"$selected>完結済</option>
</select> ※「完結済」にすると一切の執筆が不可な状態になります。
</td>
</tr>
<tr>
<td align="right">メッセージ</td>
<td><textarea cols="50" rows="6" wrap="soft" name="mess" style="ime-mode: active;">$mess</textarea></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="button" value=" 送信 " onClick="disabled='true'; form.submit();">
<input type="reset" value="リセット">
</td>
</tr>
</table>
</form>
</p>
<p>
<hr size="1" width="350">
</p>
<form action="$script" method="POST" name="form2">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="key" value="$FORM{'key'}">
<a href="$script?">TOP</a> ≫ <a href="#" onClick="form2.submit();">管理画面に戻る</a>
</form>
_HTML_
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 新規タイトル作成
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub admin_new_update {
my ($lstlog, $d, $days, $data, @index);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
# 入力チェック
if (!$FORM{'title'}) {
&error("タイトルを選択してください。");
}
# インデックスファイル読み込み
@index = &file_read("$indexfile");
# ログ保管ディレクトリを作成
$d = 1;
$d++ while (!mkdir("./$nvdir$d", 0755));
# 画像保管ディレクトリを作成
mkdir("./$nvdir$d/$imgdir", 0755);
# データセット
push(@index, "$d\t$FORM{'title'}\t$FORM{'joutai'}\t$FORM{'mess'}\t0\t\t\n");
$data = "$FORM{'title'}\t$FORM{'joutai'}\n";
# ファイル書き込み
&lock if ($lock);
&file_write("./$nvdir$d\/log\.dat", $data);
&file_write("$indexfile", @index);
&unlock if ($lock);
# 以下結果表示
&header("書き込み完了-$noveltitle");
print "<p>書き込みが正常に完了しました。</p>\n";
print "<p><form action=\"$script\" method=\"POST\" name=\"form\">\n";
print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
print "<input type=\"hidden\" name=\"key\" value=\"$FORM{'key'}\">\n";
print "<a href=\"$script?\">TOP</a> ≫ <a href=\"#\" onClick=\"form.submit();\">管理画面に戻る</a>";
print "</form></p></center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ タイトル修正
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub admin_edit_update {
my ($log, $rcnt, $days, $name, @index, @data);
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
# 入力チェック
if (!$FORM{'title'}) {
&error("タイトルを選択してください。");
}
# インデックス・ログファイル読み込み
@index = &file_read("$indexfile");
@data = &file_read("./$nvdir$FORM{'log'}\/log\.dat");
# 該当タイトルデータを更新
foreach (@index) {
($log, $rcnt, $days, $name) = (split(/\t/, $_))[0, 4, 5, 6];
if ($FORM{'log'} == $log) {
chomp($name);
$_ = "$log\t$FORM{'title'}\t$FORM{'joutai'}\t$FORM{'mess'}\t$rcnt\t$days\t$name\n";
last;
}
}
# ログデータも更新
$data[0] = "$FORM{'title'}\t$FORM{'joutai'}\n";
# ファイル書き込み
&lock if ($lock);
&file_write("./$nvdir$log\/log\.dat", @data);
&file_write("$indexfile", @index);
&unlock if ($lock);
# 以下結果表示
&header("修正完了-$noveltitle");
print "<p>修正が正常に完了しました。</p>\n";
print "<p><form action=\"$script\" method=\"POST\" name=\"form\">\n";
print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
print "<input type=\"hidden\" name=\"key\" value=\"$FORM{'key'}\">\n";
print "<a href=\"$script?\">TOP</a> ≫ <a href=\"#\" onClick=\"form.submit();\">管理画面に戻る</a>";
print "</form></p></center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ タイトル削除
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub admin_delete {
my (@index, @index2, @mail, @mail2);
# メールファイル読み込み
@mail = &file_read("$mailfile");
# アクセスチェック
if ($refurl && (!$ENV{'HTTP_REFERER'} or $ENV{'HTTP_REFERER'} !~ /^$refurl/) || $ENV{'REQUEST_METHOD'} ne 'POST') {
&error("不正なアクセスです。");
}
# 入力チェック
if (!$FORM{'log'}) {
&error("題名を選択してください。");
}
# インデックスファイル読み込み
@index = &file_read("$indexfile");
# 該当タイトルを削除
@index = grep { $FORM{'log'} != (split(/\t/, $_))[0] } @index;
# ログファイルも削除
unlink("./$nvdir$FORM{'log'}\/log\.dat");
# 画像ファイルも削除
unlink(glob"./$nvdir$FORM{'log'}/$imgdir\/*");
# メールファイルも一部削除
foreach (@mail) {
($to, $lg) = split(/\t/, $_);
if ($lg != $FORM{'log'}) {
push(@mail2, $_);
}
}
# ディレクトリも削除
rmdir("./$nvdir$FORM{'log'}/$imgdir");
rmdir("./$nvdir$FORM{'log'}");
# ファイル書き込み
&lock if ($lock);
&file_write("$mailfile", @mail2);
&file_write("$indexfile", @index);
&unlock if ($lock);
# 以下結果表示
&header("削除完了-$noveltitle");
print "<p>正常に削除が完了しました。</p>\n";
print "<p><form action=\"$script\" method=\"POST\" name=\"form\">\n";
print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
print "<input type=\"hidden\" name=\"key\" value=\"$FORM{'key'}\">\n";
print "<a href=\"$script?\">TOP</a> ≫ <a href=\"#\" onClick=\"form.submit();\">管理画面に戻る</a>";
print "</form></p></center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ メール登録・解除
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub mail_update {
my ($ml, $lg, @mail, @mail2);
if (!$FORM{'mail'} || $FORM{'mail'} !~ /^[\-\w\.]+\@[\-\w]+(\.[\-\w]+)+$/) { &error("メールアドレスを正しく入力してください。"); }
# メールファイル読み込み
@mail = &file_read("$mailfile");
foreach (@mail) {
($ml, $lg) = split(/\t/, $_);
if ($ml eq $FORM{'mail'} && $lg == $FORM{'log'}) {
# 登録されてれば弾く
if ($FORM{'proc'} eq 'ins') {
&error("そのメールアドレスはすでに登録されています。");
}
next;
}
push(@mail2, $_);
}
# 登録されてなければ弾く
if ($#mail == $#mail2 && $FORM{'proc'} eq 'del') {
&error("そのメールアドレスは登録されていません。");
}
# メールアドレス追加
if ($FORM{'proc'} eq 'ins') {
push(@mail2, "$FORM{'mail'}\t$FORM{'log'}\n");
}
# ファイル書き込み
&lock if ($lock);
&file_write("$mailfile", @mail2);
&unlock if ($lock);
# 以下結果表示
&header("メール配信-$noveltitle");
print "<p>正常に作業が完了しました。</p>\n";
print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=view&log=$FORM{'log'}\"\">小説に戻る</a></p>\n";
print "</center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ メール送信
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub sendmail {
my ($nbt, $name, $days, $text) = @_;
my ($subject, $pt, $from, $body, $to, $lg, @mail);
# 差出人はCGIタイトルにする
$from = $noveltitle;
# サブジェクト
$subject = "「$nbt」が更新されました。";
# 改行を直す
#$text =~ s/<br>/\n/g;
# <img>のパスをフルパスにする
$pt = $ENV{'SCRIPT_NAME'};
$pt =~ s/(\/.+\/).+\.cgi/$1/g;
$text =~ s/<img src="\.\//<img src="http:\/\/$ENV{'SERVER_NAME'}$pt\//g;
# メール文をセット
$body = "□投稿者:$name<br>\n".
"□日時:$days<br>\n".
"-------------------------------------本文-------------------------------------<br>\n".
$text."<br>\n".
"------------------------------------------------------------------------------<br><br>\n\n".
"このメールは「$noveltitle」のリレー小説「$nbt」が更新されたことをお伝えするメールです。<br>\n".
"本文をブラウザで読みたい場合は以下のアドレスへアクセスしてください。<br>\n".
"<a href=\"http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}?mode=view&log=$FORM{'log'}\">http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}?mode=view&log=$FORM{'log'}</a><br>\n";
# jisコードに変換
&jcode::convert(\$from,'jis');
&jcode::convert(\$subject,'jis');
&jcode::convert(\$body,'jis');
# mimeコードに変換
$from = &mimeencode($from);
$subject = &mimeencode($subject);
# 記述
@mail = &file_read("$mailfile");
foreach (@mail) {
($to, $lg) = split(/\t/, $_);
if ($lg == $FORM{'log'}) {
open(MAIL,"| $sendmail -t") || &error("Sendmailエラー");
print MAIL "To: $to\n";
print MAIL "From: $to ($from)\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/html\; charset=\"ISO-2022-JP\"\n\n";
print MAIL $body;
close(MAIL);
}
}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ デコード
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub decode {
&ReadParse;
foreach (keys %in) {
if ($_ ne 'upfile') {
$in{$_} =~ tr/+/ /;
$in{$_} =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$_} =~ s/&/&amp;/g;
$in{$_} =~ s/</&lt;/g;
$in{$_} =~ s/>/&gt;/g;
$in{$_} =~ s/\t/ /g;
$in{$_} =~ s/\0//g;
$in{$_} =~ s/\r\n|\r|\n/<br>/g;
# タグ制御
if (!$notag) {
my $tag = join ("|", @oktag);
$in{$_} =~ s/&lt;(\/?($tag).*?)&gt;/<$1>/ig;
}
&jcode::convert(\$in{$_},'sjis');
}
}
return %in;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ホスト名を獲得
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub get_host {
($addr, $host) = ($ENV{'REMOTE_ADDR'}, $ENV{'REMOTE_HOST'});
if ($host eq $addr || !$host) {
$host = gethostbyaddr(pack("C4", split(/\./,$addr)), 2) || $addr;
}
return $host;
}
#==============================================
# ▼ クッキー書き出し
#==============================================
sub set_cookie {
my ($name, $mail, $pass) = @_;
my (@mons, @week, $date, $cook);
my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + $cvalid*24*60*60);
@mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",
$week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec);
$cook="name\:$name\,mail\:$mail\,pass\:$pass";
print "Set-Cookie: MRN=$cook; expires=$date\n";
}
#==============================================
# ▼ クッキー読み出し
#==============================================
sub get_cookie {
my ($name, $value, @pairs, %DUMMY, %COOKIE);
@pairs = split(/\;/, $ENV{'HTTP_COOKIE'});
foreach (@pairs) {
($name, $value) = split(/\=/, $_);
$name =~ s/ //g;
$DUMMY{$name} = $value;
}
@pairs = split(/\,/, $DUMMY{'MRN'});
foreach (@pairs) {
($name, $value) = split(/\:/, $_);
$COOKIE{$name} = $value;
}
return %COOKIE;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ アクセス制限
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub deny {
my ($i, $denyflg);
for ($i = 0; $i < ((@deny)+(@deny2)); $i++) {
# IPホスト制限
if ($deny[$i]) {
$deny[$i] =~ s/\./\\./g; $deny[$i] =~ s/\*/\.\*/g;
if ($host =~ /$deny[$i]/i) { $denyflg = 1; last; }
}
# Cookie制限
if ($deny2[$i]) {
if ($COOKIE{'name'} eq $deny2[$i]) { $denyflg = 1; last; }
}
}
if ($denyflg) {
if ($jumpurl) {
print "Location: $jumpurl\n\n";
} else {
&error($denyms);
}
}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ファイル読み込み
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub file_read {
my ($file) = @_;
open(FILE, "$file") || &error("ファイル\"$file\"が開けませんでした。");
my @line = <FILE>;
close(FILE);
return @line;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ファイル書き込み
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub file_write {
my ($file, @data) = @_;
open(FILE, ">$file") || &error("ファイル\"$file\"が開けませんでした。");
print FILE @data;
close(FILE);
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 画像アップロード
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub img_write {
my ($no, $file, $img) = @_;
my $flg;
foreach (@okimg) {
if ($file =~ /(.+\.$_)$/i) {
&lock if ($lock);
open(FILE, ">./$nvdir$FORM{'log'}/$imgdir\/$no\.$_") || &error("画像のアップロードに失敗しました。./$nvdir/$imgdir\/$no\.$_");
binmode(FILE);
print FILE $img;
close(FILE);
&unlock if ($lock);
$flg = $_;
last;
}
}
if (!$flg) { &error("アップロード不可なファイルです。"); }
return $flg;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ パスワードを暗号化
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub encrypt {
my ($pass) = @_;
my ($xx, $salt, $pwd);
$xx = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
. "0123456789./";
$salt = substr($xx, int(rand(64)), 1);
$salt .= substr($xx, int(rand(64)), 1);
$pwd = crypt($pass, $salt);
return $pwd;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 認証確認
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub pass_check {
my ($pass, $pwd) = @_;
my $salt = substr($pwd,0,2);
if ($pass ne $mskey) {
if (!$pwd) {
&error("パスワードは登録されていません。");
} elsif ($pwd ne crypt($pass, $salt)) {
&error("パスワードが間違っています。");
}
}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ パスワード認証画面表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub check_pass {
&header("パスワード認証画面-$noveltitle");
print <<"_HTML_";
<p><form action="$script#bottom" method="POST">
<input type="hidden" name="log" value="$FORM{'log'}">
<input type="hidden" name="no" value="$FORM{'no'}">
パスワード:<input type="password" name="key" size="10">
<select name="mode">
<option value="form">修正</option>
<option value="del">削除</option>
</select>
<input type="button" value="送信" onClick="disabled='true'; form.submit();">
</form></p>
_HTML_
if (!$formwindow) {
print "<a href=\"javascript:history.back();\">戻る</a>\n";
}else{
print "<a href=\"javascript:window.close();\">閉じる</a>\n";
}
print "</center></body></html>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ロック
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub lock {
my ($retry, $mtime);
# 3分以上古いロックは解除
if (-e $lockdir) {
$mtime = (stat($lockdir))[9];
if ($mtime < time - 60*3) { &unlock; }
}
$retry = 5;
while (!mkdir($lockdir, 0755)) {
if (--$retry <= 0) {
&error('ビジー状態です。しばらく待ってから再度送信してください。');
}
sleep(1);
}
$lockflg = 1;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ロック解除
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub unlock {
rmdir($lockdir);
$lockflg = 0;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 日付を獲得
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub get_days {
my ($time) = @_;
my ($sec, $min, $hour, $dy, $mon, $year, $wday, $yday, $isdst) = gmtime($time+60*60*9);
my @week = ('日','月','火','水','木','金','土');
$days = sprintf("%04d/%01d/%01d\(%s\) %02d:%02d", $year+1900, $mon+1, $dy, $week[$wday], $hour, $min);
return $days;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ログイン
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub login {
&header("ログイン-$title");
print <<"_HTML_";
<p><h4>ログイン</h4></p>
<p><form action="$script" method="POST">
<input type="hidden" name="mode" value="admin">
パスワード:<input type="password" name="key" value="" size="10">
<input type="button" value="送信" onClick="disabled='true'; form.submit();">
</form></p>
<p><a href="$script?">TOP</a></p>
_HTML_
&footer;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ ヘッダー
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub header {
my ($title) = @_;
print "Content-type: text/html\n\n";
print <<"_HTML_";
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=shift_jis">
<title>$title</title>
<link rel="stylesheet" type="text/css" href="$style">
_HTML_
if ($formwindow && $mode eq 'view') { &java_win; }
elsif ($mode eq 'imgview') { &java_img; }
print "</head><body><center>\n";
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ フッター
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub footer {
print <<"_HTML_";
<a href="$homeurl">HOME</a>
</center>
<div align="right">
<small><a href="http://goo.gl/kxtdN" target="_blank">まろやかリレー小説 Ver$version</a></small>
</div>
</body>
</html>
_HTML_
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 小窓表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub java_win {
print <<"_JAVA_";
<script language="javascript">
<!--
function subwin(url) {
x = (screen.width - $winw) / 2;
y = (screen.height - $winh) / 2;
win = window.open(""+url+"","_form","left="+x+",top="+y+",width=$winw,height=$winh,scrollbars=no,status=no,directories=no,menubar=no,resizable=yes,toolbar=no");
window.win.moveTo(x, y);
}
// -->
</script>
_JAVA_
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ 画像拡大表示
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub java_img {
print <<"_JAVA_";
<script language="javascript">
<!--
function opn(img) {
document.view.src = img;
document.all["tb"].style.display = 'block';
}
function cls() {
document.all["tb"].style.display = 'none';
}
// -->
</script>
_JAVA_
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ▼ エラー
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub error {
&unlock if ($lockflg);
&header("error-$noveltitle");
print "<p><table><tr><td><font color=\"#CC3333\">エラー</font><br>\n";
foreach (@_) {
print "<font color=\"#CC3333\">&gt;&nbsp;</font>$_<br>\n";
}
print "</tr></td></table></p>\n";
print "<a href=\"javascript:history.back();\">戻る</a>\n";
print "</body></html>\n";
exit;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment