/** * チェックした書き込み記事を削除する * * @access public * @return boolean */ function deleMsg($checked_hists) { global $_conf; if (!($reslines = file($_conf['p2_res_hist_dat']))) { p2die(sprintf('%s を開けませんでした', $_conf['p2_res_hist_dat'])); return false; } $reslines = array_map('rtrim', $reslines); // ファイルの下に記録されているものが新しいので逆順にする $reslines = array_reverse($reslines); $neolines = array(); // チェックして整えて if ($reslines) { $rmnums = _getRmNums($checked_hists, $reslines); $neolines = _rmLine($rmnums, $reslines); P2Util::pushInfoHtml("<p>p2 info: " . count($rmnums) . "件のレス記事を削除しました</p>"); } if (is_array($neolines)) { // 行順を戻す $neolines = array_reverse($neolines); $cont = ""; if ($neolines) { $cont = implode("\n", $neolines) . "\n"; } // 書き込み処理 if (false === FileCtl::filePutRename($_conf['p2_res_hist_dat'], $cont)) { $errmsg = sprintf('p2 error: %s(), FileCtl::filePutRename() failed.', __FUNCTION__); trigger_error($errmsg, E_USER_WARNING); return false; } } return true; }
/** * あぼーん&NGワード設定を保存する * * @param void * @return void */ public static function saveNgAborns() { global $ngaborns, $ngaborns_hits; global $_conf; $lasttime = date('Y/m/d G:i'); if ($_conf['ngaborn_daylimit']) { $daylimit = time() - 60 * 60 * 24 * $_conf['ngaborn_daylimit']; } else { $daylimit = 0; } $errors = ''; foreach ($ngaborns_hits as $code => $hits) { // ヒットしなかった場合でも1/100の確率で古いデータを削除するために処理を続ける if (!$hits && mt_rand(1, 100) < 100) { continue; } if (isset($ngaborns[$code]) && !empty($ngaborns[$code]['data'])) { // 更新時間でソートする usort($ngaborns[$code]['data'], array('NgAbornCtl', 'cmpLastTime')); $cont = ''; foreach ($ngaborns[$code]['data'] as $a_ngaborn) { if (empty($a_ngaborn['lasttime']) || $a_ngaborn['lasttime'] == '--') { // 古いデータを削除する都合上、仮に現在の日時を付与 $a_ngaborn['lasttime'] = $lasttime; } else { // 必要ならここで古いデータはスキップ(削除)する if ($daylimit > 0 && strtotime($a_ngaborn['lasttime']) < $daylimit) { continue; } } $cont .= sprintf("%s\t%s\t%d\n", $a_ngaborn['cond'], $a_ngaborn['lasttime'], $a_ngaborn['hits']); } // foreach /* echo "<pre>"; echo $cont; echo "</pre>"; */ // 書き込む $fp = @fopen($ngaborns[$code]['file'], 'wb'); if (!$fp) { $errors .= "cannot write. ({$ngaborns[$code]['file']})\n"; } else { flock($fp, LOCK_EX); fputs($fp, $cont); flock($fp, LOCK_UN); fclose($fp); } } // if } // foreach if ($errors !== '') { p2die('NGあぼーんファイルが更新できませんでした。', $errors); } }
/** * ■スレッドあぼーんを複数一括解除する */ function settaborn_off($host, $bbs, $taborn_off_keys) { if (!$taborn_off_keys) { return; } // p2_threads_aborn.idx のパス取得 $taborn_idx = P2Util::idxDirOfHostBbs($host, $bbs) . 'p2_threads_aborn.idx'; // p2_threads_aborn.idx がなければ if (!file_exists($taborn_idx)) { p2die('あぼーんリストが見つかりませんでした。'); } // p2_threads_aborn.idx 読み込み $taborn_lines = FileCtl::file_read_lines($taborn_idx, FILE_IGNORE_NEW_LINES); // 指定keyを削除 foreach ($taborn_off_keys as $val) { $neolines = array(); if ($taborn_lines) { foreach ($taborn_lines as $line) { $lar = explode('<>', $line); if ($lar[1] == $val) { // key発見 // echo "key:{$val} のスレッドをあぼーん解除しました。<br>"; $kaijo_attayo = true; continue; } if (!$lar[1]) { continue; } // keyのないものは不正データ $neolines[] = $line; } } $taborn_lines = $neolines; } // 書き込む if (file_exists($taborn_idx)) { copy($taborn_idx, $taborn_idx . '.bak'); // 念のためバックアップ } $cont = ''; if (is_array($taborn_lines)) { foreach ($taborn_lines as $l) { $cont .= $l . "\n"; } } if (FileCtl::file_write_contents($taborn_idx, $cont) === false) { p2die('cannot write file.'); } /* if (!$kaijo_attayo) { // echo "指定されたスレッドは既にあぼーんリストに載っていないようです。"; } else { // echo "あぼーん解除、完了しました。"; } */ }
/** * ファイル内容を読み込んで編集する関数 */ function editFile($path, $encode, $title) { global $_conf, $modori_url, $rows, $cols, $csrfid; if ($path == '') { p2die('path が指定されていません'); } $filename = basename($path); $ptitle = 'Edit: ' . p2h($title) . ' (' . $filename . ')'; //ファイル内容読み込み FileCtl::make_datafile($path) or p2die("cannot make file. ({$path})"); $cont = file_get_contents($path); if ($encode == "EUC-JP") { $cont = mb_convert_encoding($cont, 'CP932', 'CP51932'); } $cont_area = p2h($cont); if ($modori_url) { $modori_url_ht = "<p><a href=\"{$modori_url}\">Back</a></p>\n"; } else { $modori_url_ht = ''; } $rows_at = $rows > 0 ? sprintf(' rows="%d"', $rows) : ''; $cols_at = $cols > 0 ? sprintf(' cols="%d"', $cols) : ''; // プリント echo $_conf['doctype']; echo <<<EOHEADER <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta name="ROBOTS" content="NOINDEX, NOFOLLOW"> {$_conf['extra_headers_ht']} <title>{$ptitle}</title> </head> <body onload="top.document.title=self.document.title;"> EOHEADER; $info_msg_ht = P2Util::getInfoHtml(); echo $modori_url_ht; echo $ptitle; echo <<<EOFORM <form action="{$_SERVER['SCRIPT_NAME']}" method="post" accept-charset="{$_conf['accept_charset']}"> <input type="hidden" name="file" value="{$filename}"> <input type="hidden" name="modori_url" value="{$modori_url}"> <input type="hidden" name="encode" value="{$encode}"> <input type="hidden" name="rows" value="{$rows}"> <input type="hidden" name="cols" value="{$cols}"> <input type="hidden" name="csrfid" value="{$csrfid}"> <input type="submit" name="submit" value="Save"> {$info_msg_ht}<br> <textarea style="font-size:9pt;" id="filecont" name="filecont" wrap="off"{$rows_at}{$cols_at}>{$cont_area}</textarea> {$_conf['detect_hint_input_ht']}{$_conf['k_input_ht']} </form> EOFORM; echo '</body></html>'; return true; }
/** * subject.txtの並列ダウンロードを実行する * * @param string $mode * @param array $_conf * @return bool */ public static function fetchSubjectTxt($mode, array $_conf) { // コマンド生成 $args = array(escapeshellarg($_conf['expack.php_cli_path'])); if ($_conf['expack.dl_pecl_http']) { $args[] = '-d'; $args[] = 'extension=' . escapeshellarg('http.' . PHP_SHLIB_SUFFIX); } $args[] = escapeshellarg(P2_CLI_DIR . DIRECTORY_SEPARATOR . 'fetch-subject-txt.php'); switch ($mode) { case 'fav': case 'recent': case 'res_hist': case 'merge_favita': $args[] = sprintf('--mode=%s', $mode); break; default: return false; } if ($_conf['expack.misc.multi_favs']) { switch ($mode) { case 'fav': $args[] = sprintf('--set=%d', $_conf['m_favlist_set']); break; case 'merge_favita': $args[] = sprintf('--set=%d', $_conf['m_favita_set']); break; } } // 標準エラー出力を標準出力にリダイレクト $args[] = '2>&1'; $command = implode(' ', $args); //P2Util::pushInfoHtml('<p>' . htmlspecialchars($command, ENT_QUOTES) . '</p>'); // 実行 $pipe = popen($command, 'r'); if (!is_resource($pipe)) { p2die('コマンドを実行できませんでした。', $command); } $output = ''; while (!feof($pipe)) { $output .= fgets($pipe); } $status = pclose($pipe); if ($status != 0) { P2Util::pushInfoHtml(sprintf('<p>%s(): ERROR(%d)</p>', __METHOD__, $status)); } if ($output !== '') { if ($status == 2) { P2Util::pushInfoHtml($output); } else { P2Util::pushInfoHtml('<p>' . nl2br(htmlspecialchars($output, ENT_QUOTES)) . '</p>'); } } return $status == 0; }
/** * コンストラクタ * * @param string $name ロック名(≒排他処理したいファイル名) * @param bool $remove ロックファイルを自動で削除するかどうか * @param string $suffix ロックファイル名の接尾辞 */ public function __construct($name, $remove = true, $suffix = '.lck') { $this->_filename = p2_realpath($name . $suffix); $this->_remove = $remove; FileCtl::mkdirFor($this->_filename); $this->_fh = fopen($this->_filename, 'wb'); if (!$this->_fh) { p2die("cannot create lockfile ({$this->_filename})."); } if (!flock($this->_fh, LOCK_EX)) { p2die("cannot get lock ({$this->_filename})."); } }
/** * よりセキュアなセッション管理を開始する * @return bool */ private function _autoBegin() { // まだ強化セッションが始まっていなかったら if (!isset($_SESSION[$this->sess_array]['actime'])) { // セッション変数($this->sess_array)を初期セット $this->_initSess(); // セッション変数の登録に失敗したら、エラー if (!isset($_SESSION[$this->sess_array]['actime'])) { trigger_error('Session::_autoBegin() セッション変数を登録できませんでした。', E_USER_WARNING); p2die('Session'); return false; } } return true; }
/** * データを保存するP2KeyValueStoreオブジェクトを取得する * * @param string $databasePath * @param string $codec * @param string $tableName * @return P2KeyValueStore */ protected static function _getKVS($databasePath, $codec = P2KeyValueStore::CODEC_SERIALIZING, $tableName = null) { global $_conf; $id = $codec . ':' . $databasePath; if (array_key_exists($id, self::$_kvs)) { return self::$_kvs[$id]; } if (!file_exists($databasePath) && !is_dir(dirname($databasePath))) { FileCtl::mkdirFor($databasePath); } try { $kvs = P2KeyValueStore::getStore($databasePath, $codec, $tableName); self::$_kvs[$id] = $kvs; } catch (Exception $e) { p2die(get_class($e) . ': ' . $e->getMessage()); } return $kvs; }
/** * コンストラクタ */ public function __construct() { static $set_to_utf8 = false; // 設定の読み込み $ini = ic2_loadconfig(); $this->_ini = $ini; if (!$ini['General']['dsn']) { p2die('DSNが設定されていません。'); } // データベースへ接続 $this->_database_dsn = $ini['General']['dsn']; $this->_db = $this->getDatabaseConnection(); if (DB::isError($this->_db)) { p2die($this->_db->getMessage()); } // クライアントの文字セットに UTF-8 を指定 if (!$set_to_utf8) { if (preg_match('/^(\\w+)(?:\\((\\w+)\\))?:/', $this->_database_dsn, $m)) { $driver = strtolower($m[1]); } else { $driver = 'unknown'; } switch ($driver) { case 'mysql': case 'mysqli': if ($driver == 'mysql' && function_exists('mysql_set_charset')) { mysql_set_charset('utf8', $this->_db->connection); } elseif ($driver == 'mysqli' && function_exists('mysqli_set_charset')) { mysqli_set_charset($this->_db->connection, 'utf8'); } else { $this->_db->query("SET NAMES utf8"); } break; case 'pgsql': if (function_exists('pg_set_client_encoding')) { pg_set_client_encoding($this->_db->connection, 'UNICODE'); } else { $this->_db->query("SET CLIENT_ENCODING TO 'UNICODE'"); } break; } $set_to_utf8 = true; } }
/** * ファイル内容を読み込んで表示する関数 */ function viewTxtFile($file, $encode) { if (!$file) { p2die('file が指定されていません'); } $filename = basename($file); $ptitle = $filename; //ファイル内容読み込み $cont = FileCtl::file_read_contents(P2_BASE_DIR . DIRECTORY_SEPARATOR . $file); if ($cont === false) { $cont_area = ''; } else { if (strcasecmp($encode, 'EUC-JP') === 0) { $cont = mb_convert_encoding($cont, 'CP932', 'CP51932'); } elseif (strcasecmp($encode, 'UTF-8') === 0) { $cont = mb_convert_encoding($cont, 'CP932', 'UTF-8'); } $cont_area = p2h($cont); } // プリント echo <<<EOHEADER <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="ROBOTS" content="NOINDEX, NOFOLLOW"> {$_conf['extra_headers_ht']} <title>{$ptitle}</title> <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> </head> <body onload="top.document.title=self.document.title;"> EOHEADER; P2Util::printInfoHtml(); echo "<pre>"; echo $cont_area; echo "</pre>"; echo '</body></html>'; return true; }
/** * チェックした書き込み記事を削除する */ function deleMsg($checked_hists) { global $_conf; $lock = new P2Lock($_conf['res_hist_dat'], false); // 読み込んで $reslines = FileCtl::file_read_lines($_conf['res_hist_dat'], FILE_IGNORE_NEW_LINES); if ($reslines === false) { p2die("{$_conf['res_hist_dat']} を開けませんでした"); } // ファイルの下に記録されているものが新しいので逆順にする $reslines = array_reverse($reslines); $neolines = array(); // チェックして整えて if ($reslines) { $n = 1; foreach ($reslines as $ares) { $rar = explode("<>", $ares); // 番号と日付が一致するかをチェックする if (checkMsgID($checked_hists, $n, $rar[2])) { $rmnums[] = $n; // 削除する番号を登録 } $n++; } $neolines = rmLine($rmnums, $reslines); P2Util::pushInfoHtml('<p>p2 info: ' . count($rmnums) . '件のレス記事を削除しました</p>'); } if (is_array($neolines)) { // 行順を戻す $neolines = array_reverse($neolines); $cont = ""; if ($neolines) { $cont = implode("\n", $neolines) . "\n"; } // 書き込む if (FileCtl::file_write_contents($_conf['res_hist_dat'], $cont) === false) { p2die('cannot write file.'); } } }
/** * ファイル内容を読み込んで表示する関数 */ function viewTxtFile($file, $encode) { if ($file == '') { p2die('file が指定されていません'); } $filename = basename($file); $ptitle = $filename; //ファイル内容読み込み $cont = FileCtl::file_read_contents($file); if ($cont === false) { $cont_area = ''; } else { if ($encode == 'EUC-JP') { $cont = mb_convert_encoding($cont, 'CP932', 'CP51932'); } elseif ($encode == 'UTF-8') { $cont = mb_convert_encoding($cont, 'CP932', 'UTF-8'); } $cont_area = htmlspecialchars($cont, ENT_QUOTES); } // プリント echo <<<EOHEADER <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="ROBOTS" content="NOINDEX, NOFOLLOW"> {$_conf['extra_headers_ht']} <title>{$ptitle}</title> <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> </head> <body onload="top.document.title=self.document.title;"> EOHEADER; P2Util::printInfoHtml(); echo "<pre>"; echo $cont_area; echo "</pre>"; echo '</body></html>'; return TRUE; }
* rep2 - あぼーんワード編集インタフェース */ require_once './conf/conf.inc.php'; $_login->authorize(); // ユーザ認証 $filename = isset($_REQUEST['file']) ? $_REQUEST['file'] : ''; $csrfid = P2Util::getCsrfId(__FILE__ . $filename); if (!empty($_POST['submit_save']) || !empty($_POST['submit_default'])) { if (!isset($_POST['csrfid']) or $_POST['csrfid'] != $csrfid) { p2die('不正なポストです'); } } $writable_files = array('p2_aborn_thread.txt' => 'あぼーんスレッドタイトル', 'p2_aborn_name.txt' => 'あぼーんネーム', 'p2_aborn_mail.txt' => 'あぼーんメール', 'p2_aborn_msg.txt' => 'あぼーんメッセージ', 'p2_aborn_id.txt' => 'あぼーんID', 'p2_ng_name.txt' => 'NGネーム', 'p2_ng_mail.txt' => 'NGメール', 'p2_ng_msg.txt' => 'NGメッセージ', 'p2_ng_id.txt' => 'NGID'); if (!array_key_exists($filename, $writable_files)) { $files_st = implode(', ', array_keys($writable_files)); p2die(basename($_SERVER['SCRIPT_NAME']) . " 先生の書き込めるファイルは、{$files_st} だけ!"); } $path = $_conf['pref_dir'] . DIRECTORY_SEPARATOR . $filename; //===================================================================== // 前処理 //===================================================================== // {{{ ■保存ボタンが押されていたら、設定を保存 if (!empty($_POST['submit_save'])) { $newdata = ''; foreach ($_POST['nga'] as $na_info) { $a_word = strtr(trim($na_info['word'], "\t\r\n"), "\t\r\n", " "); $a_bbs = strtr(trim($na_info['bbs'], "\t\r\n"), "\t\r\n", " "); $a_tt = strtr(trim($na_info['tt'], "\t\r\n"), "\t\r\n", " "); $a_time = strtr(trim($na_info['ht']), "\t\r\n", " "); if ($a_time === '') { $a_time = '--';
<?php /** * rep2 - ユーザ設定編集UI */ require_once __DIR__ . '/../init.php'; $_login->authorize(); // ユーザ認証 $csrfid = P2Util::getCsrfId(__FILE__); if (!empty($_POST['submit_save']) || !empty($_POST['submit_default'])) { if (!isset($_POST['csrfid']) || $_POST['csrfid'] != $csrfid) { p2die('不正なポストです'); } } define('P2_EDIT_CONF_USER_DEFAULT', 0); define('P2_EDIT_CONF_USER_LONGTEXT', 1); define('P2_EDIT_CONF_USER_HIDDEN', 2); define('P2_EDIT_CONF_USER_DISABLED', 4); define('P2_EDIT_CONF_USER_SKIPPED', 8); define('P2_EDIT_CONF_USER_PASSWORD', 16); define('P2_EDIT_CONF_FILE_ADMIN', 1024); define('P2_EDIT_CONF_FILE_ADMIN_EX', 2048); include P2_CONFIG_DIR . '/conf_user_def.inc.php'; //===================================================================== // 前処理 //===================================================================== // {{{ 保存ボタンが押されていたら、設定を保存 if (!empty($_POST['submit_save'])) { // 値の適正チェック、矯正 // トリム $_POST['conf_edit'] = array_map('trim', $_POST['conf_edit']);
} elseif ($new_login_pass != $_POST['form_new_login_pass2']) { P2Util::pushInfoHtml("<p>rep2 error: {$p_str['password']} と {$p_str['password']} (確認) が一致しませんでした。</p>"); // パスワード変更登録処理を行う } else { $crypted_login_pass = sha1($new_login_pass); $auth_user_cont = <<<EOP <?php \$rec_login_user_u = '{$_login->user_u}'; \$rec_login_pass_x = '{$crypted_login_pass}'; ?> EOP; FileCtl::make_datafile($_conf['auth_user_file'], $_conf['pass_perm']); // ファイルがなければ生成 $fp = @fopen($_conf['auth_user_file'], 'wb'); if (!$fp) { p2die("{$_conf['auth_user_file']} を保存できませんでした。認証ユーザ登録失敗。"); } flock($fp, LOCK_EX); fputs($fp, $auth_user_cont); flock($fp, LOCK_UN); fclose($fp); P2Util::pushInfoHtml('<p>○認証パスワードを変更登録しました</p>'); } } //==================================================== // 補助認証 //==================================================== $mobile = Net_UserAgent_Mobile::singleton(); $p_htm['auth_ctl'] = ''; // docomo認証 if ($mobile->isDoCoMo()) {
/** * ディレクトリがなければ作る * * @param string $apath * @param int $perm * @return bool */ public static function mkdirRecursive($apath, $perm = null) { if (is_dir($apath)) { return true; } elseif (file_exists($apath)) { p2die("cannot mkdir, file already exists. ({$apath})"); } // デフォルトのパーミッション $perm = intval($perm); if (($perm & 0777) === 0 || ($perm & ~0777) !== 0) { $default_perm = 0777 & umask(); $perm = $default_perm ? $default_perm : 0777; } if (strlen($apath) === 0) { p2die("cannot mkdir. ({$apath})", 'ディレクトリ名が空白です。'); } if (strpos($apath, P2_NULLBYTE) !== false) { $epath = str_replace(P2_NULLBYTE, '\\0', $apath); p2die("cannot mkdir. ({$epath})", 'ディレクトリ名にNULLバイトが含まれています。'); } if (!@mkdir($apath, $perm, true)) { p2die("cannot mkdir. ({$apath})"); } return true; }
/** * P2Clientクラスのインスタンスを生成する * * @param void * @return P2Client */ public static function getP2Client() { global $_conf; if (!is_dir($_conf['db_dir'])) { FileCtl::mkdirRecursive($_conf['db_dir']); } try { return new P2Client("http://{$_conf['p2_2ch_host']}/p2/", $_conf['p2_2ch_mail'], $_conf['p2_2ch_pass'], $_conf['db_dir'], (bool) $_conf['p2_2ch_ignore_cip']); } catch (P2Exception $e) { p2die($e->getMessage()); } }
if (!file_exists($_conf['p2_res_hist_dat'])) { P2Util::printSimpleHtml($karappoMsgHtml); exit; } $res_hist_dat_size = filesize($_conf['p2_res_hist_dat']); $logSizeSt = P2Util::getTranslatedUnitFileSize($res_hist_dat_size); $maxLogSize = 0; //1024*1024*10; $maxLogSizeSt = P2Util::getTranslatedUnitFileSize($maxLogSize); if ($maxLogSize and $res_hist_dat_size > $maxLogSize) { P2Util::printSimpleHtml(sprintf('書き込みログ容量(%s/%s)が大き過ぎるため、表\示できません。<br> %sのページより、書き込みログの一括削除を行って下さい。', hs($logSizeSt), hs($maxLogSizeSt), P2View::tagA($_conf['editpref_php'], hs('設定管理'), array('target' => 'subject')))); exit; } if (false === ($datlines = file($_conf['p2_res_hist_dat']))) { p2die('書き込み履歴ログファイルを読み込めませんでした'); } elseif (!$datlines) { P2Util::printSimpleHtml($karappoMsgHtml); exit; } // ファイルの下に記録されているものが新しいので反転させる $datlines = array_reverse($datlines); $datlines_num = count($datlines); $ResHist = new ResHist(); // HTMLプリント用変数 $toolbar_ht = <<<EOP \tチェックした項目を<input type="submit" name="submit" value="{$deletemsg_st}"> \t全てのチェックボックスを \t<input type="button" onclick="hist_checkAll(true)" value="選択"> \t<input type="button" onclick="hist_checkAll(false)" value="解除"> EOP;
} //================================================================== // 変数 //================================================================== $GLOBALS['rnum_all_range'] = $_conf['k_rnum_range']; $GLOBALS['word'] = null; $sb_view = "shinchaku"; $newtime = date("gis"); $host = geti($_GET['host'], geti($_POST['host'])); $bbs = geti($_GET['bbs'], geti($_POST['bbs'])); $spmode = geti($_GET['spmode'], geti($_POST['spmode'])); if ((!$host || !isset($bbs)) && !isset($spmode)) { p2die('必要な引数が指定されていません'); } if ($host && P2Validate::host($host) || $bbs && P2Validate::bbs($bbs) || $spmode && P2Validate::spmode($spmode)) { p2die('不正な引数です'); } $hr = P2View::getHrHtmlK(); //==================================================================== // メイン //==================================================================== register_shutdown_function('saveMatomeCache'); $GLOBALS['_read_new_html'] = ''; ob_start(); $aThreadList = new ThreadList(); // 板とモードのセット if ($spmode) { if ($spmode == "taborn" or $spmode == "soko") { $aThreadList->setIta($host, $bbs, P2Util::getItaName($host, $bbs)); } $aThreadList->setSpMode($spmode);
<?php /** * rep2 - レス書き込みフォーム */ require_once './conf/conf.inc.php'; $_login->authorize(); // ユーザ認証 //================================================== // 変数 //================================================== if (empty($_GET['host'])) { // 引数エラー p2die('host が指定されていません'); } else { $host = $_GET['host']; } $bbs = isset($_GET['bbs']) ? $_GET['bbs'] : ''; $key = isset($_GET['key']) ? $_GET['key'] : ''; $rescount = isset($_GET['rescount']) ? intval($_GET['rescount']) : 1; $popup = isset($_GET['popup']) ? intval($_GET['popup']) : 0; $itaj = P2Util::getItaName($host, $bbs); if (!$itaj) { $itaj = $bbs; } $itaj_hd = htmlspecialchars($itaj, ENT_QUOTES, 'Shift_JIS', false); $ttitle_en = isset($_GET['ttitle_en']) ? $_GET['ttitle_en'] : ''; $ttitle = strlen($ttitle_en) > 0 ? UrlSafeBase64::decode($ttitle_en) : ''; $ttitle_hd = htmlspecialchars($ttitle, ENT_QUOTES); $key_idx = P2Util::idxDirOfHostBbs($host, $bbs) . $key . '.idx'; // フォームのオプション読み込み
function tgrep_search($query) { global $_conf; $client = new HTTP_Client(); $client->setDefaultHeader('User-Agent', 'p2-tgrep-client'); $code = $client->get($_conf['expack.tgrep_url'] . '?' . $query); if (PEAR::isError($code)) { p2die($code->getMessage()); } elseif ($code != 200) { p2die("HTTP Error - {$code}"); } $response = $client->currentResponse(); $result = unserialize($response['body']); if (!$result) { p2die('Error: 検索結果の展開に失敗しました。'); } return $result; }
/** * $subject_keys をシリアライズして保存する */ function saveSubjectKeys($subject_keys, $sb_keys_txt, $sb_keys_b_txt) { global $_conf; //$GLOBALS['debug'] && $GLOBALS['profiler']->enterSection('saveSubjectKeys()'); //if (file_exists($sb_keys_b_txt)) { unlink($sb_keys_b_txt); } if (empty($_REQUEST['norefresh']) && !empty($subject_keys)) { if (file_exists($sb_keys_txt)) { FileCtl::make_datafile($sb_keys_b_txt); copy($sb_keys_txt, $sb_keys_b_txt); } else { FileCtl::make_datafile($sb_keys_txt); } if ($sb_keys_cont = serialize($subject_keys)) { if (FileCtl::file_write_contents($sb_keys_txt, $sb_keys_cont) === false) { p2die('cannot write file.'); } } } //$GLOBALS['debug'] && $GLOBALS['profiler']->leaveSection('saveSubjectKeys()'); return true; }
$host = $_GET['host']; } elseif (isset($_POST['host'])) { $host = $_POST['host']; } if (isset($_GET['bbs'])) { $bbs = $_GET['bbs']; } elseif (isset($_POST['bbs'])) { $bbs = $_POST['bbs']; } if (isset($_GET['spmode'])) { $spmode = $_GET['spmode']; } elseif (isset($_POST['spmode'])) { $spmode = $_POST['spmode']; } if (!(isset($host) && isset($bbs)) && !isset($spmode)) { p2die('必要な引数が指定されていません'); } // 未読数制限 if (isset($_GET['unum_limit'])) { $unum_limit = (int) $_GET['unum_limit']; } elseif (isset($_POST['unum_limit'])) { $unum_limit = (int) $_POST['unum_limit']; } else { $unum_limit = 0; } //================================================= // あぼーん&NGワード設定読み込み //================================================= $GLOBALS['ngaborns'] = NgAbornCtl::loadNgAborns(); //==================================================================== // メイン
/** * パスワード変更登録処理 * * @return void or P2Util::pushInfoHtml() or die */ function _preExecChangePass() { global $_login; if (isset($_POST['form_login_pass'])) { // 入力チェック if (!isset($_POST['csrfid']) || $_POST['csrfid'] != P2Util::getCsrfId()) { P2Util::pushInfoHtml('<p>p2 error: 不正なPOSTです</p>'); } elseif (!preg_match('/^[0-9a-zA-Z_]+$/', $_POST['form_login_pass'])) { P2Util::pushInfoHtml('<p>p2 error: パスワードを半角英数字で入力して下さい。</p>'); // パスワード変更登録処理を行う } else { if (!$_login->savaRegistUserPass($_login->user_u, $_POST['form_login_pass'])) { p2die('ユーザ登録処理を完了できませんでした。'); } P2Util::pushInfoHtml('<p>○認証パスワードを変更登録しました</p>'); } } }
} // }}} // {{{ 初期化 // ライブラリ読み込み require_once P2EX_LIB_DIR . '/ImageCache2/bootstrap.php'; // 設定読み込み $ini = ic2_loadconfig(); if ($ini['Viewer']['cache'] && file_exists($_conf['iv2_cache_db_path'])) { $viewer_cache_exists = true; } else { $viewer_cache_exists = false; } // データベースに接続 $db = DB::connect($ini['General']['dsn']); if (DB::isError($db)) { p2die($db->getMessage()); } // テンプレートエンジン初期化 $_flexy_options =& PEAR5::getStaticProperty('HTML_Template_Flexy', 'options'); $_flexy_options = array('locale' => 'ja', 'charset' => 'Shift_JIS', 'compileDir' => $_conf['compile_dir'] . DIRECTORY_SEPARATOR . 'ic2', 'templateDir' => P2EX_LIB_DIR . '/ImageCache2/templates', 'numberFormat' => ''); $flexy = new HTML_Template_Flexy(); // }}} // {{{ データベース操作・ファイル削除 if (isset($_POST['action'])) { switch ($_POST['action']) { // 画像を削除する case 'dropZero': case 'dropAborn': if ($_POST['action'] == 'dropZero') { // ランク=0 の画像を削除する $where = $db->quoteIdentifier('rank') . ' = 0';
kspDetectThread(); // global $host, $bbs, $key, $ls $aThread = new Thread(); // hostを分解してidxファイルのパスを求める if (!isset($aThread->keyidx)) { $aThread->setThreadPathInfo($host, $bbs, $key); } $aThread->itaj = P2Util::getItaName($host, $bbs); if (!$aThread->itaj) { $aThread->itaj = $aThread->bbs; } // idxファイルがあれば読み込む if ($lines = FileCtl::file_read_lines($aThread->keyidx, FILE_IGNORE_NEW_LINES)) { $idx_data = explode('<>', $lines[0]); } else { p2die('指定されたスレッドのidxがありません。'); } $aThread->getThreadInfoFromIdx(); //================================================= // 表示用変数を設定 //================================================= $ptitle_ht = $aThread->ttitle_hd; $thread_url = "{$_conf['read_php']}?host={$host}&bbs={$bbs}&key={$key}{$_conf['k_at_a']}"; $params = array(); if (!empty($_GET['from_read_new'])) { $params['from_read_new'] = '1'; } $default = !empty($_GET['spm_default']) ? intval($_GET['spm_default']) : ''; //================================================= // 表示 //=================================================
<?php /** * ImageCache2 - 画像のダウンロード・サムネイル作成 */ // {{{ p2基本設定読み込み&認証 define('P2_OUTPUT_XHTML', 1); require_once './conf/conf.inc.php'; $_login->authorize(); if (!$_conf['expack.ic2.enabled']) { p2die('ImageCache2は無効です。', 'conf/conf_admin_ex.inc.php の設定を変えてください。'); } // }}} // {{{ 初期化 // ライブラリ読み込み require_once 'HTTP/Client.php'; require_once P2EX_LIB_DIR . '/ic2/bootstrap.php'; // 受け付けるMIMEタイプ $mimemap = array('image/jpeg' => '.jpg', 'image/png' => '.png', 'image/gif' => '.gif'); // 設定ファイル読み込み $ini = ic2_loadconfig(); // }}} // {{{ prepare // パラメータを設定 $id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : null; $uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : (isset($_REQUEST['url']) ? $_REQUEST['url'] : null); $file = isset($_REQUEST['file']) ? $_REQUEST['file'] : null; $force = !empty($_REQUEST['f']); // 強制更新 $thumb = isset($_REQUEST['t']) ? intval($_REQUEST['t']) : IC2_Thumbnailer::SIZE_SOURCE; // サムネイルタイプ
/** * brdファイルを生成する * * @return string brdファイルのパス */ public function makeBrdFile($cachefile) { global $_conf, $word; $p2brdfile = $cachefile . ".p2.brd"; FileCtl::make_datafile($p2brdfile); $data = FileCtl::file_read_lines($cachefile); $cont = ''; $this->setBrdMatch($cachefile); // パターンマッチ形式を登録 $this->setBrdList($data); // カテゴリーと板をセット if ($this->categories) { foreach ($this->categories as $cate) { if ($cate->num > 0) { $cont .= $cate->name . "\t0\n"; foreach ($cate->menuitas as $mita) { $cont .= "\t{$mita->host}\t{$mita->bbs}\t{$mita->itaj}\n"; } } } } if ($cont) { if (FileCtl::file_write_contents($p2brdfile, $cont) === false) { p2die("{$p2brdfile} を更新できませんでした"); } return $p2brdfile; } else { if (!$word) { P2Util::pushInfoHtml("<p>p2 error: {$cachefile} から板メニューを生成することはできませんでした。</p>"); } return false; } }
/** * Atom 0.3 を RSS 1.0 に変換する(共通) */ function atom_to_rss($input, $stylesheet, $output) { global $_conf; // 保存用ディレクトリがなければつくる if (!is_dir(dirname($output))) { FileCtl::mkdirFor($output); } // 変換 if (extension_loaded('xslt')) { // PHP4, Sablotron $rss_content = atom_to_rss_by_xslt($input, $stylesheet, $output); } elseif (extension_loaded('xsl')) { // PHP5, LibXSLT $rss_content = atom_to_rss_by_xsl($input, $stylesheet, $output); } // チェック if (!$rss_content) { if (file_exists($output)) { unlink($output); } return FALSE; } chmod($output, $_conf['expack.rss.setting_perm']); // FreeBSD 5.3 Ports の textproc/php4-xslt ではバグのせいか変換の際に名前空間が失われるので補正する // (php4-xslt-4.3.10_2, expat-1.95.8, libiconv-1.9.2_1, Sablot-1.0.1) // バグのない環境なら何も変わらない・・・はず。 $rss_fix_patterns = array('/<(\\/)?(RDF|Seq|li)( .+?)?>/u' => '<$1rdf:$2$3>', '/<(channel|item) about=/u' => '<$1 rdf:about=', '/<(\\/)?(encoded)>/u' => '<$1content:$2>', '/<(\\/)?(creator|subject|date|pubdate)>/u' => '<$1dc:$2>'); $rss_fixed = preg_replace(array_keys($rss_fix_patterns), array_values($rss_fix_patterns), $rss_content); if (md5($rss_content) != md5($rss_fixed)) { $fp = @fopen($output, 'wb') or p2die("cannot write. ({$output})"); flock($fp, LOCK_EX); fwrite($fp, $rss_fixed); flock($fp, LOCK_UN); fclose($fp); } return TRUE; }
/** * お気にスレをセットする * * @param string $host * @param string $bbs * @param string $key * @param int|string $setfavita 0(解除), 1(追加), 2(トグル), top, up, down, bottom * @param string $ttitle * @param int|null $setnum * @return bool */ function setFav($host, $bbs, $key, $setfav, $ttitle = null, $setnum = null) { global $_conf; //================================================================== // key.idx //================================================================== // idxfileのパスを求めて $idxfile = P2Util::idxDirOfHostBbs($host, $bbs) . $key . '.idx'; // 板ディレクトリが無ければ作る // FileCtl::mkdirFor($idxfile); // 既にidxデータがあるなら読み込む if ($lines = FileCtl::file_read_lines($idxfile, FILE_IGNORE_NEW_LINES)) { $data = explode('<>', $lines[0]); } else { $data = array_fill(0, 12, ''); if (is_string($ttitle) && strlen($ttitle)) { $data[0] = p2h($ttitle, false); } } // {{{ スレッド.idx 記録 if (($setfav == '0' || $setfav == '1') && $_conf['favlist_idx'] == $_conf['orig_favlist_idx']) { // お気にスレから外した結果、idxの意味がなくなれば削除する if ($setfav == '0' and !$data[3] && !$data[4] && $data[9] <= 1) { @unlink($idxfile); } else { $sar = array($data[0], $key, $data[2], $data[3], $data[4], $data[5], $setfav, $data[7], $data[8], $data[9], $data[10], $data[11], $data[12]); P2Util::recKeyIdx($idxfile, $sar); } } // }}} //================================================================== // favlist.idx //================================================================== if (!is_null($setnum) && $_conf['expack.misc.multi_favs']) { if (0 < $setnum && $setnum <= $_conf['expack.misc.favset_num']) { $favlist_idx = $_conf['pref_dir'] . sprintf('/p2_favlist%d.idx', $setnum); } else { $favlist_idx = $_conf['orig_favlist_idx']; } } else { $favlist_idx = $_conf['favlist_idx']; } // favlistファイルがなければ生成 FileCtl::make_datafile($favlist_idx); // favlist読み込み $favlines = FileCtl::file_read_lines($favlist_idx, FILE_IGNORE_NEW_LINES); //================================================ // 処理 //================================================ $neolines = array(); $before_line_num = 0; $was_set = false; // 最初に重複要素を削除しておく if (!empty($favlines)) { $i = -1; foreach ($favlines as $l) { $i++; $lar = explode('<>', $l); // 重複回避 if ($lar[1] == $key && $lar[11] == $bbs) { $before_line_num = $i; // 移動前の行番号をセット $was_set = true; continue; // keyのないものは不正データなのでスキップ } elseif (!$lar[1]) { continue; } else { $neolines[] = $l; } } } if ($setfav == 2) { $setfav = $was_set ? 0 : 1; } // 記録データ設定 if ($setfav) { if (!function_exists('getSetPosLines')) { include P2_LIB_DIR . '/getsetposlines.inc.php'; } $newdata = "{$data[0]}<>{$key}<>{$data[2]}<>{$data[3]}<>{$data[4]}<>{$data[5]}<>1<>{$data[7]}<>{$data[8]}<>{$data[9]}<>{$host}<>{$bbs}"; $rec_lines = getSetPosLines($neolines, $newdata, $before_line_num, $setfav); } else { $rec_lines = $neolines; } $cont = ''; if (!empty($rec_lines)) { foreach ($rec_lines as $l) { $cont .= $l . "\n"; } } // 書き込む if (FileCtl::file_write_contents($favlist_idx, $cont) === false) { p2die('cannot write file.'); } //================================================ // お気にスレ共有 //================================================ if ($_conf['join_favrank'] && $_conf['favlist_idx'] == $_conf['orig_favlist_idx']) { if ($setfav == "0") { $act = "out"; } elseif ($setfav == "1") { $act = "add"; } else { return; } $itaj = P2Util::getItaName($host, $bbs); $post = array("host" => $host, "bbs" => $bbs, "key" => $key, "ttitle" => $data[0], "ita" => $itaj, "act" => $act); postFavRank($post); } return true; }