<?php
//=============================================================
// plywood: Version 1.1.9
// Copyright (C) 2000-2001 けんす
// http://www.kensu.com/
// フリーソフト・再配布/改造/流用可能・許可不要
//=============================================================
// $Id: plywood.php,v 1.1.9 2001/03/23 15:30:46 kensu Exp $
// - plywoodの特徴とか
// o 全ての変数を初期化しているのでエラー通知が厳しくても大丈夫
// o ログの読み書きに配列を使わず1行ずつ読むのでメモリを食わない
// o 管理モードによる削除
// o 名前とEmailを書かないで発言した場合、クッキーを送信しない & 削除する
// o 二度書き防止
// o 本文の行頭が > | : のどれかだったら、色が変わる
// o 本文にURLが含まれていたらリンクする
// o ソース表示モード
// - TODO
// o 出力制御関数を使ってContent-Lengthを出力させる。
// o gzip圧縮送信。
// o iconv関数で文字コード変換。
// o flock関数のオペレーションを定数にする。
define('MAX_MESSAGES', 500);
define('MESSAGES_PER_PAGE', 30);
define('ADMIN_CRYPTED_PASS', 'fa23758b72ff6c06f35584e3cc2a2268');
define('DOCUMENT_TITLE', 'PHPを使った掲示板');
define('SCRIPT_TITLE', 'plywood');
define('LOG_DIR', getenv('DOCUMENT_ROOT'). '/log/');
define('LOG_FILE', LOG_DIR. SCRIPT_TITLE. '.log');
define('TMP_FILE', LOG_DIR. SCRIPT_TITLE. '.tmp');
define('LOCK_FILE', LOG_DIR. SCRIPT_TITLE. '.lock');
define('NL', "\n");
//
// ヘッダー出力。
//
function put_header( $title = DOCUMENT_TITLE ) {
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">', NL;
echo '<html>', NL;
echo '<head>', NL;
echo '<!--', "\xFD\xFE", '-->', NL;
echo '<title>', $title, '</title>', NL;
echo '</head>', NL;
echo '<body>', NL;
}
//
// フッター出力。
//
function put_footer() {
echo '</body>', NL;
echo '</html>', NL;
}
//
// エラー。終了。
//
function error( $reason ) {
put_header();
echo '<p>', NL;
echo $reason, NL;
echo '</p>', NL;
put_footer();
exit;
}
//
// デフォルトの動作
//
function put_default() {
global $name, $email, $msg;
list($c_name, $c_email) = isset($GLOBALS['HTTP_COOKIE_VARS'][strtoupper(SCRIPT_TITLE)]) ?
explode('<>', $GLOBALS['HTTP_COOKIE_VARS'][strtoupper(SCRIPT_TITLE)]) :
'';
list($c_name, $c_email) = ! empty($name) || ! empty($email) ?
array($name, $email) :
array($c_name, $c_email);
put_header();
echo '<h2>', DOCUMENT_TITLE, '</h2>', NL;
echo '<a href="./">[トップページへ戻る]</a>', NL;
echo '<a href="', getenv('SCRIPT_NAME'), '?s">[このスクリプトのそーす]</a>', NL;
echo '<hr>', NL;
echo '<form method="POST" action="', getenv('SCRIPT_NAME'), '">', NL;
echo '<input type="hidden" name="action" value="add_new_message">', NL;
echo '<p>', NL;
echo '名前', NL;
echo '<input type="text" size="20" name="name" value="', $c_name, '"><br>', NL;
echo 'Email', NL;
echo '<input type="text" size="30" name="email" value="', $c_email, '">', NL;
echo '<input type="submit" value="送信 / 再読み込み">', NL;
echo '<input type="reset" value="リセット"><br>', NL;
echo '<br>', NL;
echo '本文', NL;
echo '<em>(記入通りに表示するので適当に改行を入れてください。)</em><br>', NL;
echo '<textarea name="msg" cols="80" rows="5"></textarea>', NL;
echo '</p>', NL;
echo '</form>', NL;
echo '<hr>', NL;
if ( ! isset($GLOBALS['start']) )
$GLOBALS['start'] = 1;
$count = 1;
$next_page_exist = 0;
$in = fopen(LOG_FILE, 'r');
while ( ! feof($in) ) {
$line = fgets($in, 1024 * 100);
$line = trim($line);
if ( empty($line) )
break;
if ( $count >= $GLOBALS['start'] ) {
list($num, $time, $name, $email, $msg, $host) = explode('<>', $line);
// 2000/01/01 (土) 00:00:00
$week = array('日', '月', '火', '水', '木', '金', '土');
$caln = getdate($time);
$date = sprintf('%04d/%02d/%02d (%s) %02d:%02d:%02d',
$caln['year'], $caln['mon'], $caln['mday'], $week[$caln['wday']], $caln['hours'], $caln['minutes'], $caln['seconds']);
$msg = str_replace('<br>', NL, $msg);
$msg = ereg_replace('(s?https?|ftp)://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+', '<a href="\\0">\\0</a>', $msg);
$msg = preg_replace('/(^|\n)((>|\||:)[^\n]*)/', '\\1<font color="#7777DD">\\2</font>', $msg);
$msg = str_replace(NL, '<br>'. NL, $msg);
if ( empty($name) )
$name = '名無しさん';
if ( ! empty($email) )
$name = '<a href="mailto:'. $email. '">'. $name. '</a>';
echo '<font color="#666666">No. ', $num, ' <font color="#FF0000">', $name, '</font> ', $date, '</font><br>', NL;
echo $msg, '<br>', NL;
echo '<hr>', NL;
if ( $count == $GLOBALS['start'] + MESSAGES_PER_PAGE ) {
$next_page_exist = 1;
break;
}
}
$count ++;
}
fclose($in);
echo '<p>', NL;
if ( $GLOBALS['start'] - MESSAGES_PER_PAGE >= 1 )
echo '<a href="', getenv('SCRIPT_NAME'), '?start=', $GLOBALS['start'] - MESSAGES_PER_PAGE, '">前</a><<', NL;
echo '以上、新着順 ', $GLOBALS['start'], ' 番目から ', $count - 1, ' 番目の発言です。', NL;
if ( $next_page_exist == 1 )
echo '>><a href="', getenv('SCRIPT_NAME'), '?start=', $GLOBALS['start'] + MESSAGES_PER_PAGE, '">次</a>', NL;
echo '</p>', NL;
put_footer();
}
//
// 新規発言を追加。
//
function add_new_message() {
global $name, $email, $msg;
if ( getenv('CONTENT_LENGTH') > 1024 * 50 )
error('データの量が多すぎます。内容を削ってください。');
$name = trim($name); // 先頭、末尾の空白を削除
$email = trim($email);
$msg = trim($msg);
$name = htmlspecialchars($name); // & " < > を置換
$email = htmlspecialchars($email);
$msg = htmlspecialchars($msg);
$name = ereg_replace("[\x0D\x0A]", '', $name); // 改行を削除
$email = ereg_replace("[\x0D\x0A]", '', $email);
$msg = ereg_replace("\x0D\x0A|[\x0D\x0A]", '<br>', $msg); // 改行を <br> に置換
$lock = fopen(LOCK_FILE, 'w') or error('ロックファイルを作成できませんでした。');
flock($lock, 2) or error('ロックできませんでした。');
$in = fopen(LOG_FILE, 'r');
$out = fopen(TMP_FILE, 'w');
$line = fgets($in, 1024 * 100);
list($_num, $_time, $_name, $_email, $_msg, $_host) = explode('<>', $line);
if ( $name == $_name && $msg == $_msg ) {
unlink(TMP_FILE);
unlink(LOCK_FILE);
error('二度書きはダメよ。');
}
$num = $_num + 1;
$host = gethostbyaddr(getenv('REMOTE_ADDR'));
fwrite($out, implode('<>', array($num, time(), $name, $email, $msg, $host)). NL. $line);
for ( $i = 0; ! feof($in); $i ++ ) {
if ( $i > MAX_MESSAGES - 2 )
break;
$line = fgets($in, 1024 * 100);
fwrite($out, $line);
}
fclose($out);
fclose($in);
chmod(TMP_FILE, 0666);
rename(TMP_FILE, LOG_FILE);
fclose($lock);
unlink(LOCK_FILE);
! empty($name) || ! empty($email) ?
setcookie(strtoupper(SCRIPT_TITLE), implode('<>', array($name, $email)), time() + 60 * 60 * 24 * 60, '/', '.kensu.com', 0) :
setcookie(strtoupper(SCRIPT_TITLE), '', time() + 60 * 60, '/', '.kensu.com', 0);
}
//
// 管理モード。
//
function admin() {
if ( isset($GLOBALS['admin_pass']) && md5($GLOBALS['admin_pass']) != ADMIN_CRYPTED_PASS )
error('パスワードをよーく確認してね。');
put_header(DOCUMENT_TITLE. ' / 管理モード');
if ( ! isset($GLOBALS['admin_pass']) ) {
echo '<form method="POST" action="', getenv('SCRIPT_NAME'), '">', NL;
echo '<input type="hidden" name="action" value="admin">', NL;
echo '<p>', NL;
echo '<input type="password" size="10" name="admin_pass" value="">', NL;
echo '<input type="submit" value="管理モード">', NL;
echo '</p>', NL;
echo '</form>', NL;
} else {
if ( isset($GLOBALS['del']) ) {
$lock = fopen(LOCK_FILE, 'w') or error('ロックファイルを作成できませんでした。');
flock($lock, 2) or error('ロックできませんでした。');
$in = fopen(LOG_FILE, 'r');
$out = fopen(TMP_FILE, 'w');
while ( ! feof($in) ) {
$line = fgets($in, 1024 * 100);
if ( empty($line) )
break;
list($num, $dummy) = explode('<>', $line);
$flag = 0;
for ( $i = 0; $i < count($GLOBALS['del']); $i ++ ) {
if ( $num == $GLOBALS['del'][$i] ) {
$flag = 1;
break;
}
}
if ( empty($flag) )
fwrite($out, $line);
}
fclose($out);
fclose($in);
chmod(TMP_FILE, 0666);
rename(TMP_FILE, LOG_FILE);
fclose($lock);
unlink(LOCK_FILE);
}
echo '<h2>', DOCUMENT_TITLE, ' / 管理モード</h2>', NL;
echo '<a href="', getenv('SCRIPT_NAME'), '">[デフォルト画面に戻る]</a>', NL;
echo '<hr>', NL;
echo '<h2>発言の削除</h2>', NL;
echo '<p>', NL;
echo '削除したい発言のチェックボックスにチェックを入れ、実行ボタンを押してください。', NL;
echo '</p>', NL;
echo '<form method="POST" action="', getenv('SCRIPT_NAME'), '">', NL;
echo '<p>', NL;
echo '<input type="hidden" name="action" value="admin">', NL;
echo '<input type="hidden" name="admin_pass" value="', $GLOBALS['admin_pass'], '">', NL;
echo '<input type="submit" value=" 実行 ">', NL;
echo '<input type="reset" value="リセット">', NL;
echo '</p>', NL;
echo '<table width="100%" border="0">', NL;
echo '<tr>', NL;
echo '<th></th>', NL;
echo '<th></th>', NL;
echo '<th><small>日付</small></th>', NL;
echo '<th><small>名前</small></th>', NL;
echo '<th><small>メッセージ</small></th>', NL;
echo '<th><small>ホスト名</small></th>', NL;
echo '</tr>', NL;
echo '<tr>', NL;
echo '<td colspan="6"><hr size="1"></td>', NL;
echo '</tr>', NL;
$in = fopen(LOG_FILE, 'r');
while ( ! feof($in) ) {
$line = fgetss($in, 1024 * 100, '<>');
$line = trim($line);
if ( empty($line) )
break;
list($num, $time, $name, $email, $msg, $host) = explode('<>', $line);
// 2000/01/01 (土) 00:00:00
$week = array('日', '月', '火', '水', '木', '金', '土');
$caln = getdate($time);
$date = sprintf('%04d/%02d/%02d (%s) %02d:%02d:%02d',
$caln['year'], $caln['mon'], $caln['mday'], $week[$caln['wday']], $caln['hours'], $caln['minutes'], $caln['seconds']);
if ( strlen($name) > 20 )
$name = substr($name, 0, 20). '...';
if ( strlen($msg) > 50 )
$msg = substr($msg, 0, 50). '...';
if ( empty($name) )
$name = '名無しさん';
if ( ! empty($email) )
$name = '<a href="mailto:'. $email. '">'. $name. '</a>';
echo '<tr>', NL;
echo '<td><small>', $num, '</small></td>', NL;
echo '<td><input type="checkbox" name="del[]" value="', $num, '"></td>', NL;
echo '<td nowrap><small>', $date, '</small></td>', NL;
echo '<td><small>', $name, '</small></td>', NL;
echo '<td><small>', $msg, '</small></td>', NL;
echo '<td><small>', $host, '</small></td>', NL;
echo '</tr>', NL;
}
fclose($in);
echo '<tr>', NL;
echo '<td colspan="6"><hr size="1"></td>', NL;
echo '</tr>', NL;
echo '<tr>', NL;
echo '<th></th>', NL;
echo '<th></th>', NL;
echo '<th><small>日付</small></th>', NL;
echo '<th><small>名前</small></th>', NL;
echo '<th><small>メッセージ</small></th>', NL;
echo '<th><small>ホスト名</small></th>', NL;
echo '</tr>', NL;
echo '</table>', NL;
echo '<p>', NL;
echo '<input type="submit" value=" 実行 ">', NL;
echo '<input type="reset" value="リセット">', NL;
echo '</p>', NL;
echo '</form>', NL;
}
put_footer();
}
//
// main:
//
if ( getenv('QUERY_STRING') == 's' ) {
highlight_file(getenv('SCRIPT_FILENAME'));
exit;
}
if ( getenv('QUERY_STRING') == 'sp' ) {
echo '<code>', NL;
echo '<pre>', NL;
$fp = fopen(getenv('SCRIPT_FILENAME'), 'r');
while ( ! feof($fp) ) {
$buffer = fread($fp, 1024);
$buffer = htmlspecialchars($buffer);
echo $buffer;
flush();
}
fclose($fp);
echo '</pre>', NL;
echo '</code>', NL;
exit;
}
if ( ! isset($action) )
$action = '';
if ( $action == 'admin' ) {
admin();
exit;
}
if ( $action == 'add_new_message' && ! empty($msg) )
add_new_message();
put_default();
exit;
?>
テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル