/* $no,$resno,$now,$name,$email,$sub,$com,$url,$host,$pw,$filea,$fileb,$chk
*/
require "config.php";
/* ログからスレッド配列作成 */
function LogOpen() {
// ログを読み込む
$lines = file(LOGFILE);
// $thread[親No.][レスNo.]の配列作成
for ($l = 1; $l < count($lines); $l++) {
list($oya_no, $res_no) = explode(",", $lines[$l]);
$thread[$oya_no][$res_no] = $lines[$l];
}
return $thread;
}
/* メイン表示部分 */
function MainView($page="") {
global $PHP_SELF,$tempcook;
// クッキー展開
list($c_name, $c_email, $c_pwd) = explode(",", stripslashes($tempcook));
// ヘッダーHTML
include(HEADFILE);
$thread = LogOpen();
$st = ($page) ? $page : 0; //開始行設定
for ($n = 0; $n < $st; $n++) next($thread); //読込まで配列飛ばす
// 記事表示ループ
for ($i = 0; $i < PAGEDEF; $i++) {
list(,$lines) = each($thread); //配列分解
if ($lines[0]=="") continue; //空なら都バス
$file_a = $file_b = "";
// 親記事を要素に分解
list($no,$re,$now,$name,$email,$sub,$com,
$url,$host,$pw,$filea,$fileb,$chk) = explode(",", $lines[0]);
// フォーマット
if (strlen($name) > NAMECUT) $name = substr($name, 0, NAMECUT)."..";
if (strlen($sub) > SUBJCUT) $sub = substr($sub, 0, SUBJCUT)."..";
if ($url != "") $url = "".HOMEICON."";
if ($email != "") $name = "$name";
if (AUTOLINK) $com = auto_link($com);
// タイプ別ICONを配列に
$tok = strtok(ICONTYPE, ",");
while ($tok) {
$type = explode("|", $tok);
$fileicon[$type[0]] = $type[1];
$tok = strtok(",");
}
// Aのファイルがある場合
if ($filea != "" && file_exists(SAVEDIR.$filea)) {
$src_a = SAVEDIR.$filea;
$size_a = ceil(filesize($src_a)/1024); //ファイルサイズ(KB)
$tail_a = substr(strrchr($src_a, "."), 1);//拡張子を得る
// 画像の場合
if (INLINE && ereg("(jpe?g|gif|png)", $tail_a)) {
$w_h_a = @getimagesize($src_a);
$file_a = "";
// それ以外のファイル
} else {
$icon = $fileicon[$tail_a];
if (!$icon) $icon = FILEICON;
$file_a = "$filea (${size_a}KB)";
}
}
// Bのファイルがある場合
if ($fileb != "" && file_exists(SAVEDIR.$fileb)) {
$src_b = SAVEDIR.$fileb;
$size_b = ceil(filesize($src_b)/1024); //ファイルサイズ(KB)
$tail_b = substr(strrchr($src_b, "."), 1);//拡張子を得る
// 画像の場合
if (INLINE && ereg("(jpe?g|gif|png)", $tail_b)) {
$w_h_b = @getimagesize($src_b);
$file_b = "";
// それ以外のファイル
} else {
$icon = $fileicon[$tail_b];
if (!$icon) $icon = FILEICON;
$file_b = "$fileb (${size_b}KB)";
}
}
// 親記事HTML
include(MAINFILE);
// レス開始位置
$rescnt = count($lines); //レス数
$rest = $rescnt - RESDEF;
if ($rest <= 0) $rest = 1; //通常レスは1から
// レス数オーバーなら全レスへリンク
if ($rest > 1) $resall = "".RESALL."";
// レスがあるなら区切り線
if ($rescnt > 1) echo KUGIRI;
// レス記事ループ
for ($r = $rest; $r < count($lines); $r++) {
if ($lines[$r] == "") continue;
// レス記事を要素に分解
list($no,$resno,$now,$name,$email,$sub,$com,
$url,$host,$pw,$filea,$fileb,$chk) = explode(",", $lines[$r]);
if (trim($com) == "") continue; //本文が空なら都バス
// フォーマット
if (strlen($name) > NAMECUT) $name = substr($name, 0, NAMECUT)."..";
//if (strlen($sub) > SUBJCUT) $sub = substr($sub, 0, SUBJCUT)."..";
//if ($url != "") $url = "".HOMEICON."";
if ($email != "") $name = "$name";
if (AUTOLINK) $com = auto_link($com);
// レス記事HTML
include(RESFILE);
}
// レスフォームHTML
include(FORMFILE);
}
// ページ処理
$prev = $st - PAGEDEF;
$next = $st + PAGEDEF;
$prev_st = $prev_to = $next_st = $next_to = "";
if ($prev < 0) $prev = 0;
if ($page > 0) {
$prev_st = "";
$prev_to = "";
}
if ($next < count($thread) && $oya >= PAGEDEF) {
$next_st = "";
$next_to = "";
}
// フッタHTML
include(FOOTFILE);
}
/* レス単独表示 */
function ResView($no) {
global $PHP_SELF,$thread;
// ターゲットがないなら終了
if (!is_array($thread[$no])) return false;
// クッキー展開
list($c_name, $c_email, $c_pwd) = explode(",", stripslashes($tempcook));
// ヘッダーHTML
echo HeadPrint("No. ${no}についてのレス一覧");
echo RESALLHEAD;
// 全レス表示
foreach ($thread[$no] as $line) {
// 記事を要素に分解
list($no,$resno,$now,$name,$email,$sub,$com,
$url,$host,$pw,$filea,$fileb,$chk) = explode(",", $line);
// フォーマット
if ($url != "") {
$link = (HOMEICON) ? HOMEICON : $url;
$url = "$link";
}
if ($email != "") $name = "$name";
if (AUTOLINK) $com = auto_link($com);
// レスNo.0なら親記事
if ($resno == "0") {
include(MAINFILE); //親記事HTML
} else {
include(RESFILE); //レス記事HTML
}
}
// フォームHTML
include(FORMFILE);
// フッターHTML
echo RESALLFOOT;
}
/* 書き込み前の処理 */
function RegCheck() {
global $HTTP_POST_VARS,$REQUEST_METHOD;
global $upfile1,$upfile1_name,$upfile1_size,$upfile1_type;
global $upfile2,$upfile2_name,$upfile2_size,$upfile2_type;
print_r($HTTP_POST_VARS);
// フィルターでクリーン
$sub = Clean($HTTP_POST_VARS[sub]);
$name = Clean($HTTP_POST_VARS[name]);
$email = Clean($HTTP_POST_VARS[email]);
$url = Clean($HTTP_POST_VARS[url]);
$pwd = Clean($HTTP_POST_VARS[pwd]);
$com = Clean($HTTP_POST_VARS[com]);
$no = Clean($HTTP_POST_VARS[no]);
// 空チェック
if (!NOSUB && !$no && ereg("^( | )*$", $sub)) error("タイトルを入れてください");
if (!NONAME && ereg("^( | )*$", $name)) error("名前を入力してください");
if (!NOVALUE && ereg("^( | |[\r\n])*$", $com)) error("本文を入力してください");
// 空なら空項目
if (NOSUB && $sub == "") $sub = NOSUB;
if (NONAME && $name == "") $name = NONAME;
if (NOVALUE && $com == "") $com = NOVALUE;
// 長さチェック
if (strlen($sub) > MAXSUB) error("タイトルが長すぎます!");
if (strlen($name) > MAXNAME) error("名前が長すぎます!");
if (strlen($com) > MAXVALUE) error("本文が長すぎます!");
$time = time();
$host = gethostbyaddr(getenv("REMOTE_ADDR"));
// 連続投稿チェック
$fp = fopen(LOGFILE, "r") or error("ログファイルが開けません");
$first = fgets($fp, 4096);
fclose($fp);
list($lno,$lname,$lcom,$lhost,) = explode(",", $first);
if (RENZOKU && $host == $lhost && $time - $ltime < RENZOKU)
error("連続投稿はもうしばらく時間を置いてからお願いします");
// NO
$newno = ($no) ? $no : $lno + 1; //記事No.レスなら親No、親なら最新+1
$maxno = ($no) ? $lno : $lno + 1; //最新親No.レスなら変えない、親なら最新カウントアプ
$resno = ($no) ? count($thread[$res]) : 0; //レス数=レスNo
// 時間のフォーマット
$now = gmdate(DATEFORMAT, $time+9*3600);
// URL
$url = ereg_replace("^http://", "", $url);
// PASS暗号化
$pass = substr(md5($pwd),2,8);
// 使用可タグを<>に戻す
if (USETAG) {
$tag = explode(",", USETAG);
for ($t = 0; $t < count($tag); $t++) {
if ($tag[$t] == "") continue;
$com = eregi_replace("<".$tag[$t]." ", "<".$tag[$t]." ", $com);
$com = eregi_replace("<".$tag[$t].">", "<".$tag[$t].">", $com);
$com = eregi_replace("</".$tag[$t], "".$tag[$t], $com);
}
}
// style使用不可で荒らし防止
if (!USESTYLE) {
$com = eregi_replace("<([^>]*) style=[^>]*>", "<\\1>", $com);
$com = eregi_replace("<([^>]*) on.*=[^>]*>", "<\\1>", $com);
}
// 改行文字の統一。
$com = str_replace("\r\n", "\n", $com);
$com = str_replace("\r", "\n", $com);
// 行数カウント
if (substr_count($com, "\n") > MAXLINE) error("行数オーバーしてます!");
$com = ereg_replace("\n{3,}","\n",$com); //連続する空行を一行
$com = ereg_replace("\n", "
", $com); //改行文字を
に変換
// 二重投稿チェック
if ($name == $lname && $com == $lcom)
error("二重投稿です!
リロード");
// アプロード処理
$denytype = explode(",", DENYMIME);
$allowext = explode(",", ALLOWEXT);
// 一つ目
if ($upfile1 != "none" && $upfile1_size > 0) {
$upfile1 = eregi_replace("\\\\", "\\", $upfile1);
$tail1 = strtolower(substr(strrchr($upfile1_name, "."), 1));//拡張子を得る
if (!in_array($tail1, $allowext))
error("その拡張子のファイルはアップロードできません
$upfile1_name");
if (in_array($upfile1_type, $denytype))
error("その種類のファイルはアップロードできません
$upfile1_type");
// コピー先ファイル名決定
$destname1 = (ORIGIN) ? $upfile1_name : $time.".".$tail1;
// 既にある場合(違う名前にするべきか
if (file_exists(SAVEDIR.$destname1))
error("そのファイルは既にアップロードされてます
$destname1");
// tmpから手前んとこにコピー
copy($upfile1, SAVEDIR.$destname1);
@chmod(SAVEDIR.$destname1, 0706);
}
// 2つ目
if ($upfile2 != "none" && $upfile2_size > 0) {
$upfile2 = eregi_replace("\\\\", "\\", $upfile2);
$tail2 = substr(strrchr($upfile2_name, "."), 1);//拡張子を得る
if (!in_array($tail2, $allowext))
error("その拡張子のファイルはアップロードできません
$upfile2_name");
if (in_array($upfile2_type, $denytype))
error("その種類のファイルはアップロードできません
$upfile2_type");
// コピー先ファイル名決定
$destname2 = (ORIGIN) ? $upfile2_name : PREFIX.$time.$tail2;
// 既にある場合(違う名前にするべきか
if (file_exists(SAVEDIR.$destname2))
error("そのファイルは既にアップロードされてます
$destname2");
// tmpから手前んとこにコピー
copy($upfile2, SAVEDIR.$destname2);
@chmod(SAVEDIR.$destname2, 0706);
}
// アプ前チェック
$chk = (CHECK) ? 0 : 1;
// クッキー保存
$cookval = implode(",", array($name, $email, $pwd));
setcookie("tempcook", $cookval, $time+14*24*3600);
// 新データライン
$newfirst = implode(",", array($maxno,$name,$com,$time,$host,"\n"));
$newline = implode(",", array($newno,$resno,$now,$name,$email,$sub,$com,$url,$host,$pass,$destname1,$destname2,$chk,"\n"));
// 現データ配列に
$old = file(LOGFILE);
// 先頭はチェック用なので進める
next($old);
// 親記事の場合
if ($resno == 0) {
$data = array();
array_push($data, $newfirst, $newline); //チェック用と新データ追加
$new = array_merge($data, $old); //現ログと結合
// レスの場合
} else {
array_push($new, $newfirst); //先頭にチェックデータ
$find = FALSE;
for ($i = 0; $i < count($old); $i++) {
list($keyno,) = explode(",", $old[$i]); //NO取り出し
if ($newno == $keyno) { //該当スレ
$find = TRUE;
array_push($data, $old[$i]); //いまのレス
list($nextno,) = explode(",", $old[$i+1]); //次の行
if ($nextno != $keyno) array_push($data, $newline);
} else {
(AGE) ? array_push($tmp, $old[$i]) : array_push($data, $old[$i]);
}
}
$new = array_merge($data, $tmp);
if (!$find) error("該当記事が見つかりません");
}
// ログ更新
LogRewrite($new);
}
/* あぷロードファイルが有効かチェキ */
function isUpload($filename) {
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname(tempnam('', ''));
}
$tmp_file .= '/' . basename($filename);
/* ユーザーはphp.iniで最後にスラッシュを指定しているかもしれません... */
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}
/* 外部からの変数掃除 */
function Clean($var) {
$var = trim($var);
// SJISの場合\マーク除去
if (get_magic_quotes_gpc()) $var = stripslashes($var);
// タグを変換
$var = htmlspecialchars($var);
// データ区切り文字を変換
return str_replace(",", ",", $var);
}
/* ログ更新 */
function LogRewrite($arr) {
$fp = fopen(LOGFILE, "w");
flock($fp, LOCK_EX);
fputs($fp, implode('', $arr));
fclose($fp);
}
/* 自動リンク */
function auto_link($str) {
return preg_replace("/(https?|ftp)(:\/\/[\!-;\=\?-\~]+)/si", "\\1\\2", $str);
}
/* エラー画面 */
function Error($msg) {
die($msg);
}
if ($mode == "regist") {
RegCheck();
}
MainView();
?>