/** * 新着まとめ読み <a> * * @return string HTML */ function getShinchakuMatomeATag($aThreadList, $shinchaku_num) { global $_conf; static $upper_toolbar_done_ = false; $shinchaku_matome_atag = ''; // 倉庫なら新着まとめのリンクはなし if ($aThreadList->spmode == 'soko') { return $shinchaku_matome_atag = ''; } $attrs = array(); if (UA::isIPhoneGroup()) { $attrs['class'] = 'button'; } // 上下あるツールバーの下だけにアクセスキーをつける if ($upper_toolbar_done_) { $attrs[$_conf['accesskey_for_k']] = $_conf['k_accesskey']['matome']; } $upper_toolbar_done_ = true; $qs = array('host' => $aThreadList->host, 'bbs' => $aThreadList->bbs, 'spmode' => $aThreadList->spmode, 'nt' => date('gis'), UA::getQueryKey() => UA::getQueryValue()); $label = "{$_conf['k_accesskey']['matome']}.新まとめ"; if ($shinchaku_num) { $shinchaku_matome_atag = P2View::tagA(UriUtil::buildQueryUri($_conf['read_new_k_php'], array_merge($qs, array('norefresh' => '1'))), hs("{$label}({$shinchaku_num})"), $attrs); } else { $shinchaku_matome_atag = P2View::tagA(UriUtil::buildQueryUri($_conf['read_new_k_php'], $qs), hs($label), $attrs); } return $shinchaku_matome_atag; }
/** * フィルタ用に書き換えたフッタ変数を取得する * * @access public * @return array array(read_navi_previous_btm_ht, read_navi_next_btm_ht, read_footer_navi_new_btm_ht) */ function getResetReadNaviFooterK($aThread, $params) { global $_conf; global $_filter_hits, $_filter_range; // $prev_st, $next_st, $filter_page, $res_filter extract($params); // {{{ 検索クエリ $filter_qs = array('detect_hint' => '◎◇', 'host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'offline' => 1, 'word' => $GLOBALS['word'], 'ls' => 'all', UA::getQueryKey() => UA::getQueryValue()); foreach ($res_filter as $key => $value) { $filter_qs[$key] = $value; } // }}} if ($filter_page > 1) { $qs = array_merge($filter_qs, array('filter_page' => $filter_page - 1)); $read_navi_previous_url = UriUtil::buildQueryUri($_conf['read_php'], $qs); $read_navi_previous_btm_ht = sprintf('<a %1$s="%2$s" href="%3$s">%2$s.%4$s</a>', hs($_conf['accesskey_for_k']), hs($_conf['k_accesskey']['prev']), hs($read_navi_previous_url), hs($prev_st)); } if ($_filter_range['to'] < $_filter_hits) { $qs = array_merge($filter_qs, array('filter_page' => $filter_page + 1)); $read_navi_next_url = UriUtil::buildQueryUri($_conf['read_php'], $qs); $read_navi_next_btm_ht = sprintf('<a %1$s="%2$s" href="%3$s">%2$s.%4$s</a>', hs($_conf['accesskey_for_k']), hs($_conf['k_accesskey']['next']), hs($read_navi_next_url), hs($next_st)); } $read_footer_navi_new_btm_ht = ''; /* // ※メモ:「6.新着」(新着レスの表示)と「3.新20」(最新N件)は異なる。 $read_footer_navi_new_btm_ht = str_replace( " {$_conf['accesskey_for_k']}=\"{$_conf['k_accesskey']['next']}\"", '', $read_footer_navi_new_btm_ht ); $read_footer_navi_new_btm_ht = str_replace(">{$_conf['k_accesskey']['next']}.", '>', $read_footer_navi_new_btm_ht); */ return array('read_navi_previous_btm_ht' => $rread_navi_previous_btm_ht, 'read_navi_next_btm_ht' => $read_navi_next_btm_ht, 'read_footer_navi_new_btm_ht' => $read_footer_navi_new_btm_ht); }
/** * @return string */ function _getCookieLocationUri() { $qs = array('check_regist_cookie' => '1', 'regist_cookie' => intval(geti($_REQUEST['regist_cookie'])), UA::getQueryKey() => UA::getQueryValue()); if (defined('SID') && strlen(SID)) { $qs[session_name()] = session_id(); } return $next_uri = UriUtil::buildQueryUri('login.php', $qs); }
/** * @access public * @return string HTML */ function getSbToolbarShinchakuMatomeHtml($aThreadList, $shinchaku_num) { global $_conf; static $new_matome_i_ = 0; $new_matome_i_++; $shinchaku_matome_ht = ''; // 倉庫でなければ if ($aThreadList->spmode != 'soko') { $shinchaku_num_ht = ''; if ($shinchaku_num) { $shinchaku_num_ht = " (<span id=\"smynum{$new_matome_i_}\" class=\"matome_num\">{$shinchaku_num}</span>)"; } $shinchaku_matome_ht = P2View::tagA(UriUtil::buildQueryUri($_conf['read_new_php'], array('host' => $aThreadList->host, 'bbs' => $aThreadList->bbs, 'spmode' => $aThreadList->spmode, 'norefresh' => 1, 'nt' => date('gis'), UA::getQueryKey() => UA::getQueryValue())), '新着まとめ読み' . $shinchaku_num_ht, array('id' => "smy{$new_matome_i_}", 'class' => 'matome', 'onClick' => 'chNewAllColor();')); } return $shinchaku_matome_ht; }
/** * お気に板をHTML表示する for 携帯 * * @access public * @return void */ function printFavItaHtml() { global $_conf; $csrfid = P2Util::getCsrfId(); $hr = P2View::getHrHtmlK(); $show_flag = false; if (file_exists($_conf['favita_path']) and $lines = file($_conf['favita_path'])) { echo 'お気に板 [<a href="editfavita.php?b=k">編集</a>]' . $hr; $i = 0; foreach ($lines as $l) { $i++; $l = rtrim($l); if (preg_match("/^\t?(.+)\t(.+)\t(.+)\$/", $l, $matches)) { $itaj = rtrim($matches[3]); $attr = array(); $key_num_st = ''; if ($i <= 9) { $attr[$_conf['accesskey_for_k']] = $i; $key_num_st = "{$i}."; } $atag = P2View::tagA(UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $matches[1], 'bbs' => $matches[2], 'itaj_en' => base64_encode($itaj), UA::getQueryKey() => UA::getQueryValue())), UA::isIPhoneGroup() ? hs($itaj) : hs("{$key_num_st}{$itaj}"), $attr); if (UA::isIPhoneGroup()) { echo '<li>' . $atag . '</li>'; } else { echo $atag . '<br>'; } // [<a href="{$_SERVER['SCRIPT_NAME']}?host={$matches[1]}&bbs={$matches[2]}&setfavita=0&csrfid={$csrfid}&view=favita{$_conf['k_at_a']}">削</a>] $show_flag = true; } } if (UA::isIPhoneGroup()) { ?> </ul><?php } } if (!$show_flag) { ?> <p>お気に板はまだないようだ</p><?php } }
var url_v = document.forms["urlform"].elements["url_text"].value; if (url_v == "" || url_v == "{$ini_url_text}") { \talert("{$explanation}"); \treturn false; } EOP; $htm['urlform'] = <<<EOP \t<form id="urlform" method="GET" action="{$_conf['read_php']}" target="read"> \t\t\t2chのスレURLを直接指定 \t\t\t<input id="url_text" type="text" value="{$defurl}" name="url" size="62" onFocus="this.select()"> \t\t\t<input type="submit" name="btnG" value="表\示" onClick='{$onClick_ht}'> \t</form> EOP; // }}} $bookmarkletUrl = "javascript:location='" . dirname(UriUtil::getMyUri()) . "/" . $_conf['read_php'] . "?url='+escape(location);"; //============================================================= // HTMLプリント //============================================================= P2View::printDoctypeTag(); ?> <html lang="ja"> <head> <?php P2View::printExtraHeadersHtml(); ?> <title>rep2</title> <?php P2View::printIncludeCssHtml('style'); //P2View::printIncludeCssHtml('first_cont'); ?>
/** * @return string <a> */ function _getDatSokoATag($aThreadList) { global $_conf; $dat_soko_atag = ''; if (!$aThreadList->spmode or $aThreadList->spmode == 'taborn') { $uri = UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $aThreadList->host, 'bbs' => $aThreadList->bbs, 'norefresh' => '1', 'spmode' => 'soko', UA::getQueryKey() => UA::getQueryValue())); $dat_soko_atag = P2View::tagA($uri, hs('dat倉庫')); } return $dat_soko_atag; }
/** * @static * @access public * @return void HTML出力 */ function printIncludeCssHtml($css) { global $_conf, $_login; $href = UriUtil::buildQueryUri('css.php', array('css' => $css, 'user' => $_login->user_u, 'skin' => $_conf['skin'])); ?> <link rel="stylesheet" type="text/css" href="<?php eh($href); ?> "><?php }
_setOrderIndexMenuK($_GET['code'], $_GET['set']); } elseif (isset($_REQUEST['setfrom1'])) { P2Util::setConfUser('index_menu_k_from1', (int) $_REQUEST['setfrom1']); // デフォルトに戻す } elseif (isset($_GET['setdef'])) { P2Util::setConfUser('index_menu_k', $conf_user_def['index_menu_k']); P2Util::setConfUser('index_menu_k_from1', $conf_user_def['index_menu_k_from1']); } // }}} require_once P2_LIB_DIR . '/index_print_k.inc.php'; $setfrom1 = (int) (!$_conf['index_menu_k_from1']); require_once P2_LIB_DIR . '/index.funcs.php'; $menuKLinkHtmls = getIndexMenuKLinkHtmls(getIndexMenuKIni(), $noLink = true); $body_at = P2View::getBodyAttrK(); $hr = P2View::getHrHtmlK(); $index_uri = UriUtil::buildQueryUri('index.php', array(UA::getQueryKey() => UA::getQueryValue())); //================================================================ // ヘッダHTML表示 //================================================================ P2Util::headerNoCache(); P2View::printDoctypeTag(); ?> <html lang="ja"> <head> <?php P2View::printExtraHeadersHtml(); ?> <title><?php eh($_conf['p2name']); ?> - 携帯TOPメニューの並び替え</title>
/** * 新着まとめ読みのキャッシュリンクHTMLを表示する * * @return void */ function _printMatomeCacheLinksHtml() { global $_conf; $max = $_conf['matome_cache_max']; $links = array(); for ($i = 0; $i <= $max; $i++) { $dnum = $i ? '.' . $i : ''; $file = $_conf['matome_cache_path'] . $dnum . $_conf['matome_cache_ext']; //echo '<!-- ' . $file . ' -->'; if (file_exists($file)) { $filemtime = filemtime($file); $date = date('Y/m/d G:i:s', $filemtime); $b = filesize($file) / 1024; $kb = round($b, 0); $atag = P2View::tagA(UriUtil::buildQueryUri('read_new.php', array('cview' => '1', 'cnum' => "{$i}", 'filemtime' => $filemtime)), hs($date), array('target' => 'read')); $links[] = sprintf('%s %dKB', $atag, $kb); } } if ($links) { echo '<p>新着まとめ読みの前回キャッシュを表\示<br>' . implode('<br>', $links) . '</p>' . "\n"; if ($_conf['ktai']) { $hr = P2View::getHrHtmlK(); echo $hr . "\n"; } } }
// p2 - サブジェクト - 携帯ヘッダ表示 // for subject.php //=============================================================== // HTML表示用変数 //=============================================================== $newtime = date("gis"); // {{{ ページタイトル部分URL設定 $p2_subject_url = UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $aThreadList->host, 'bbs' => $aThreadList->bbs, UA::getQueryKey() => UA::getQueryValue())); $ptitle_url = null; // あぼーん or 倉庫 if ($aThreadList->spmode == 'taborn' or $aThreadList->spmode == 'soko') { $ptitle_url = $p2_subject_url; // 書き込み履歴 } elseif ($aThreadList->spmode == 'res_hist') { $ptitle_url = UriUtil::buildQueryUri('read_res_hist.php', array(UA::getQueryKey() => UA::getQueryValue())); // 通常 板 } elseif (!$aThreadList->spmode) { // 特別なパターン index2.html // match登録よりheadなげて聞いたほうがよさそうだが、ワンレスポンス増えるのが困る if (preg_match('/www\\.onpuch\\.jp/', $aThreadList->host)) { $ptitle_url = $ptitle_url . 'index2.html'; } elseif (preg_match("/livesoccer\\.net/", $aThreadList->host)) { $ptitle_url = $ptitle_url . 'index2.html'; // PC } elseif (empty($_conf['ktai'])) { $ptitle_url = "http://{$aThreadList->host}/{$aThreadList->bbs}/i/"; // 携帯 } else { if (!empty($GLOBALS['word']) || !empty($GLOBALS['wakati_words'])) { $ptitle_url = $p2_subject_url;
/** * @access private * @return string HTML */ function getMarutoriHtml() { global $_conf; $marutori_atag = P2View::tagA(UriUtil::buildQueryUri($_conf['read_php'], array('host' => $this->host, 'bbs' => $this->bbs, 'key' => $this->key, 'ls' => $this->ls, 'maru' => 'true', UA::getQueryKey() => UA::getQueryValue())), hs('●IDでp2に取り込む')); return "[{$marutori_atag}]"; }
/** * @return string HTML */ function _getOffRecentATag($aThread, $offrecent_accesskey, $ttitle_en) { global $_conf; $preKey = ''; if (UA::isK() && $offrecent_accesskey) { $preKey = $offrecent_accesskey . '.'; } return P2View::tagA(UriUtil::buildQueryUri('info_i.php', array('host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'offrecent' => '1', 'popup' => (int) (bool) geti($_GET['popup']), 'ttitle_en' => $ttitle_en, UA::getQueryKey() => UA::getQueryValue())), sprintf('%s履歴から外す', hs($preKey)), array('title' => 'このスレを「最近読んだスレ」と「書き込み履歴」から外します', 'accesskey' => $offrecent_accesskey)); }
/** * @return string HTML */ function _getPostLinkATag($aThread, $ttitle_en) { return $post_link_atag = P2View::tagA(UriUtil::buildQueryUri('post_form.php', array('host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'rescount' => $aThread->rescount, 'ttitle_en' => $ttitle_en, UA::getQueryKey() => UA::getQueryValue())), '書'); }
$client_host_st = '端末ホスト'; $client_ip_st = '端末IPアドレス'; $browser_ua_st = 'ブラウザUA'; $p2error_st = 'rep2 エラー'; $logout_st = 'ログアウト'; } else { $status_st = 'ステータス'; $autho_user_st = '認証ユーザ'; $client_host_st = '端末ホスト'; $client_ip_st = '端末IPアドレス'; $browser_ua_st = 'ブラウザUA'; $p2error_st = 'rep2 エラー'; $logout_st = 'ログアウト'; } $login_uri = UriUtil::buildQueryUri('login.php', array(UA::getQueryKey() => UA::getQueryValue())); $login2ch_uri = UriUtil::buildQueryUri('login2ch.php', array(UA::getQueryKey() => UA::getQueryValue())); $body_onload = ''; if (UA::isPC()) { $body_onload = ' onLoad="setWinTitle();"'; } $hr = P2View::getHrHtmlK(); $body_at = P2View::getBodyAttrK(); //========================================================= // HTMLプリント //========================================================= P2Util::headerNoCache(); P2View::printDoctypeTag(); ?> <html lang="ja"> <head> <?php
/** * 必要なら(セッションが有効でクッキーが無効)URIにSID引数を付加する * (header('Location: $uri') 用) * SIDがリジェネレートされる場合のために、古いSIDがあれば、削除する。 * PHPでは重複したキーのGETクエリーは後の値を優先するようなので、削除しなくても実用上は問題ないかも。 * * @access public * @param string $uri * @return string */ function addSIDToUri($uri, $sepa = '&', $force = false) { // defined('SID') && strlen(SID) は、 // おそらくsession_id() && !isset($_COOKIE[session_name()]) に大体等しい。 // session.use_transid で付与される機会と同じ if ($force or defined('SID') && strlen(SID)) { $uri = UriUtil::addQueryToUri($uri, array(session_name() => session_id()), $add_sid = false, $sepa); } return $uri; }
foreach ($formdata as $k => $v) { printf($row_format, $k, htmlspecialchars($v['word'], ENT_QUOTES), $v['ic'], $v['re'], htmlspecialchars($v['ht'], ENT_QUOTES), $v['hn'], htmlspecialchars($v['bbs'], ENT_QUOTES), htmlspecialchars($v['tt'], ENT_QUOTES), strlen($v['ht']) > 0 ? htmlspecialchars($v['ht'], ENT_QUOTES) : '--'); } echo $htm['form_submit']; } // PCなら if (!$_conf['ktai']) { echo '</table>' . "\n"; } ?> </form> <?php // 携帯なら if (UA::isK()) { echo P2View::getHrHtmlK(); echo P2View::tagA(UriUtil::buildQueryUri($_conf['editpref_php'], array(UA::getQueryKey() => UA::getQueryValue())), hs(sprintf('%s.設定編集', $_conf['k_accesskey']['up'])), array($_conf['accesskey_for_k'] => $_conf['k_accesskey']['up'])); echo P2View::getBackToIndexKATag(); } ?> </body></html> <?php /* * Local Variables: * mode: php * coding: cp932 * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ // vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker:
/** * 新着まとめ読みのキャッシュリンクHTMLを表示する * * @return void */ function _printMatomeCacheLinksHtml() { global $_conf; $max = $_conf['matome_cache_max']; $links = array(); for ($i = 0; $i <= $max; $i++) { $dnum = $i ? '.' . $i : ''; $file = $_conf['matome_cache_path'] . $dnum . $_conf['matome_cache_ext']; //echo '<!-- ' . $file . ' -->'; if (file_exists($file)) { $filemtime = filemtime($file); $date = date('Y/m/d G:i:s', $filemtime); $b = filesize($file) / 1024; $kb = round($b, 0); $atag = P2View::tagA(UriUtil::buildQueryUri('read_new.php', array('cview' => '1', 'cnum' => "{$i}", 'filemtime' => $filemtime)), hs($date), array('target' => 'read')); $links[] = sprintf('%s %dKB', $atag, $kb); } } if ($links) { echo '<ul><li class="group">新着まとめ読みの前回キャッシュ</li></ul><div id="usage" class="panel"><filedset>' . implode('<br>', $links) . '</fildset></div>' . "\n"; } }
if (isset($_POST['checked_hists'])) { $checked_hists = $_POST['checked_hists']; } elseif (isset($_GET['checked_hists'])) { $checked_hists = $_GET['checked_hists']; } $checked_hists and deleMsg($checked_hists); } // 古いバージョンの形式であるデータPHP形式(p2_res_hist.dat.php, タブ区切り)の書き込み履歴を、 // dat形式(p2_res_hist.dat, <>区切り)に変換する P2Util::transResHistLogPhpToDat(); //====================================================================== // メイン //====================================================================== $karappoMsgHtml = 'p2 - 書き込み履歴内容は空っぽのようです。'; if (!$_conf['res_write_rec']) { $karappoMsgHtml .= sprintf('<p>現在、書き込み内容ログは記録しない設定になっています。<br>設定は、%sのページで変更可能\です。</p>', P2View::tagA(UriUtil::buildQueryUri('edit_conf_user.php', array(UA::getQueryKey() => UA::getQueryValue())), hs('設定編集'), array('target' => 'subject'))); } // 特殊DAT読み 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;
/** * メニュー項目のリンクHTMLを取得する * * @access private * @param array $menuKIni メニュー項目 標準設定 * @param boolean $noLink リンクをつけないのならtrue * @return string HTML */ function _getMenuKLinkHtml($code, $menuKIni, $noLink = false) { global $_conf, $_login; static $accesskey_ = 0; // 無効なコード指定なら if (!isset($menuKIni[$code][0]) || !isset($menuKIni[$code][1])) { return false; } $accesskey = ++$accesskey_; if ($_conf['index_menu_k_from1']) { $accesskey = $accesskey + 1; if ($accesskey == 10) { $accesskey = 0; } } if ($accesskey > 9) { $accesskey = null; } $href = $menuKIni[$code][0] . '&user='******'&' . UA::getQueryKey() . '=' . UA::getQueryValue(); $name = $menuKIni[$code][1]; /*if (!is_null($accesskey)) { $name = $accesskey . '.' . $name; }*/ if ($noLink) { $linkHtml = hs($name); } else { $accesskeyAt = is_null($accesskey) ? '' : " {$_conf['accesskey_for_k']}=\"{$accesskey}\""; $linkHtml = "<a href=\"" . hs($href) . '">' . hs($name) . "</a>"; } // 特別 - #.ログ if ($code == 'res_hist') { $name = 'ログ'; if ($noLink) { $logHt = hs($name); } else { $newtime = date('gis'); $logHt = P2View::tagA(UriUtil::buildQueryUri('read_res_hist.php', array('nt' => $newtime, UA::getQueryKey() => UA::getQueryValue())), hs($name), array($_conf['accesskey_for_k'] => '#')); } $linkHtml .= ' </li><li>' . $logHt; } return $linkHtml; }
$auth_ctl_html = sprintf('docomo端末ID認証登録済[%s]<br>', $atag); } else { if ($_login->pass_x) { $uri = UriUtil::buildQueryUri($_SERVER['SCRIPT_NAME'], array('ctl_regist_docomo' => '1', 'regist_docomo' => '1', 'guid' => 'ON', UA::getQueryKey() => UA::getQueryValue())); $atag = sprintf('<a href="%s" utn>%s</a>', $uri, 'docomo端末IDで認証を登録'); $auth_ctl_html = sprintf('[%s]<br>', $atag); } } // Cookie認証 } else { if ($_login->checkUserPwWithCid($_COOKIE['cid'])) { $atag = P2View::tagA(UriUtil::buildQueryUri('cookie.php', array('ctl_regist_cookie' => '1', UA::getQueryKey() => UA::getQueryValue())), '解除'); $auth_cookie_html = sprintf('cookie認証登録済[%s]<br>', $atag); } else { if ($_login->pass_x) { $atag = P2View::tagA(UriUtil::buildQueryUri('cookie.php', array('ctl_regist_cookie' => '1', 'regist_cookie' => '1', UA::getQueryKey() => UA::getQueryValue())), 'cookieに認証を登録'); $auth_cookie_html = sprintf('[%s]<br>', $atag); } } } // Cookie認証登録解除処理 _preExecCheckRegistCookie(); //================================================================= // HTMLプリント //================================================================= $p_htm['body_onload'] = ''; if (!$_conf['ktai']) { $p_htm['body_onload'] = ' onLoad="setWinTitle();"'; } $body_at = P2View::getBodyAttrK(); P2Util::headerNoCache();
/** * p2 - 最初のログイン画面をHTML表示する関数 * * @access public * @return void */ function printLoginFirst(&$_login) { global $STYLE, $_conf; global $_login_failed_flag, $_p2session; // データ保存ディレクトリに書き込み権限がなければ注意を表示セットする P2Util::checkDirsWritable(array($_conf['dat_dir'], $_conf['idx_dir'], $_conf['pref_dir'])); // 前処理 $_login->cleanInvalidAuthUserFile(); clearstatcache(); // 外部からの変数 $post['form_login_id'] = isset($_POST['form_login_id']) ? $_POST['form_login_id'] : null; $post['form_login_pass'] = isset($_POST['form_login_pass']) ? $_POST['form_login_pass'] : null; //========================================================= // 書き出し用変数 //========================================================= if (UA::isIPhoneGroup()) { $ptitle = $_conf['p2name'] . 'iPhone'; } else { $ptitle = $_conf['p2name']; } $ptitle_ht = hs($ptitle); if (!empty($GLOBALS['brazil'])) { $ptitle_ht = 'p2.2ch.net'; if (!(UA::isK() || UA::isIPhoneGroup())) { $ptitle_ht = '<a href="http://p2.2ch.net/">' . $ptitle_ht . '</a>'; } } $myname = basename($_SERVER['SCRIPT_NAME']); $body_ht = ''; $show_login_form_flag = false; $p_str = array('user' => 'ユーザ', 'password' => 'パスワード'); if (!empty($GLOBALS['brazil'])) { $p_str['user'] = '******'; } // 携帯用表示文字列全角→半角変換 if (!UA::isIPhoneGroup() && UA::isK() && function_exists('mb_convert_kana')) { foreach ($p_str as $k => $v) { $p_str[$k] = mb_convert_kana($v, 'rnsk'); } } // 補助認証 require_once P2_LIB_DIR . '/HostCheck.php'; $mobile = Net_UserAgent_Mobile::singleton(); $auth_sub_input_ht = _getAuthSubInputHtml($mobile); // ログインフォームからの指定 $form_login_id_hs = ''; if ($_login->validLoginId($_login->user_u)) { $form_login_id_hs = hs($_login->user_u); } elseif ($_login->validLoginId($post['form_login_id'])) { $form_login_id_hs = hs($post['form_login_id']); } $form_login_pass_hs = ''; if ($_login->validLoginPass($post['form_login_pass'])) { $form_login_pass_hs = hs($post['form_login_pass']); } // docomoの固有端末認証(セッション利用時のみ有効) $docomo_utn_ht = ''; //if ($_conf['use_session'] && $_login->user_u && $mobile->isDoCoMo()) { if ($_conf['use_session'] && $mobile->isDoCoMo()) { $uri = $myname . '?guid=ON&user='******'<p><a href="' . hs($uri) . '" utn>docomo固有端末認証</a></p>'; } // docomoならリトライ時にパスワード入力を password → text とする // (docomoはpassword入力が完全マスクされるUIで、入力エラーがわかりにく過ぎる) if (isset($post['form_login_pass']) and $mobile->isDoCoMo()) { $type = "text"; } else { $type = "password"; } // {{{ ログイン用フォームを生成 $ruri = $_SERVER['REQUEST_URI']; if (UA::isDoCoMo()) { $ruri = UriUtil::addQueryToUri($ruri, array('guid' => 'ON')); } $REQUEST_URI_hs = hs($ruri); if (!empty($GLOBALS['brazil']) or file_exists($_conf['auth_user_file'])) { $submit_ht = '<input type="submit" name="submit_userlogin" value="ユーザログイン">'; } else { $submit_ht = '<input type="submit" name="submit_newuser" value="新規登録">'; } $login_form_ht = <<<EOP {$docomo_utn_ht} <form id="login" method="POST" action="{$REQUEST_URI_hs}" target="_self" utn> {$_conf['k_input_ht']} {$p_str['user']}: <input type="text" name="form_login_id" value="{$form_login_id_hs}" istyle="3" size="32" autocorrect="off" autocapitalize="off"><br> {$p_str['password']}: <input type="{$type}" name="form_login_pass" value="{$form_login_pass_hs}" istyle="3" autocorrect="off" autocapitalize="off"><br> {$auth_sub_input_ht} <br> {$submit_ht} </form> EOP; // }}} //================================================================= // 新規ユーザ登録処理 //================================================================= $isAllowedNewUser = empty($GLOBALS['brazil']) ? true : false; if ($isAllowedNewUser and !file_exists($_conf['auth_user_file']) && !$_login_failed_flag and !empty($_POST['submit_newuser']) && $post['form_login_id'] && $post['form_login_pass']) { // {{{ 入力エラーをチェック、判定 if (!$_login->validLoginId($post['form_login_id']) || !$_login->validLoginPass($post['form_login_pass'])) { P2Util::pushInfoHtml(sprintf('<p class="infomsg">p2 error: 「%s」名と「%s」は半角英数字で入力して下さい。</p>', hs($p_str['user']), hs($p_str['password']))); $show_login_form_flag = true; // }}} // {{{ 登録処理 } else { $_login->makeUser($post['form_login_id'], $post['form_login_pass']); // 新規登録成功 $form_login_id_hs = hs($post['form_login_id']); $body_ht .= "<p class=\"infomsg\">○ 認証{$p_str['user']}「{$form_login_id_hs}」を登録しました</p>"; $body_ht .= "<p><a href=\"{$myname}?form_login_id={$form_login_id_hs}{$_conf['k_at_a']}\">{$_conf['p2name']} start</a></p>"; $_login->setUser($post['form_login_id']); $_login->setPassX(sha1($post['form_login_pass'])); // セッションが利用されているなら、セッションを更新 if (isset($_p2session)) { // ユーザ名とパスXを更新 $_SESSION['login_user'] = $_login->user_u; $_SESSION['login_pass_x'] = $_login->pass_x; } // 要求があれば、補助認証を登録 $_login->registCookie(); $_login->registKtaiId(); } // }}} // {{{ ログインエラーがある } else { if (isset($_POST['submit_newuser']) || isset($_POST['submit_userlogin'])) { $msg_ht = '<p class="infomsg">'; if (!$post['form_login_id']) { $msg_ht .= "p2 error: 「{$p_str['user']}」が入力されていません。" . "<br>"; } elseif (!$_login->validLoginId($post['form_login_id'])) { $msg_ht .= "p2 error: 「{$p_str['user']}」文字列が不正です。" . "<br>"; } if (!$post['form_login_pass']) { $msg_ht .= "p2 error: 「{$p_str['password']}」が入力されていません。"; } $msg_ht .= '</p>'; P2Util::pushInfoHtml($msg_ht); } $show_login_form_flag = true; } // }}} //========================================================= // HTML表示出力 //========================================================= P2Util::headerNoCache(); P2View::printDoctypeTag(); ?> <html lang="ja"> <head> <?php P2View::printExtraHeadersHtml(); ?> <title><?php eh($ptitle); ?> </title> <?php if (UA::isIPhoneGroup()) { ?> <style type="text/css" media="screen">@import "./iui/iui.css";</style><?php } if (UA::isPC() && !UA::isIPhoneGroup()) { // ユーザは未決定 //P2View::printIncludeCssHtml('style'); //P2View::printIncludeCssHtml('login_first'); ?> <link rel="stylesheet" href="style/login_first.css" type="text/css"> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> <?php } ?> </head><body><?php if (UA::isIPhoneGroup()) { ?> <div class="toolbar"><h1 id="pageTitle"><?php echo $ptitle_ht; ?> </h1></div><?php ?> <div id="usage" class="panel"><filedset><?php } else { ?> <h3><?php echo $ptitle_ht; ?> </h3><?php } P2Util::printInfoHtml(); echo $body_ht; if ($show_login_form_flag) { echo $login_form_ht; if (empty($GLOBALS['brazil']) and !(HostCheck::isAddrLocal() || HostCheck::isAddrPrivate())) { ?> <p> <font size="-1" color="gray">※このページはプライベート利用のためのシステムです。<br> 部外者によるログイン試行は、<br> 不正アクセスとして記録されます。<br> このページへのアクセスURLを部外者が<br> 不特定多数に公知することを禁止します。</font></p><?php } } if (!empty($GLOBALS['brazil']) and UA::isK() || UA::isIPhoneGroup()) { ?> <br><hr size="1"><div align="center"><a href="http://p2.2ch.net/">p2.2ch.net</a></div><?php } if (UA::isIPhoneGroup()) { ?> <br><br><br><br><br><br></filedset></div><?php } ?> </body></html><?php }
/** * @return string HTML */ function _getReadATag($aThread) { global $_conf; $ttitle_hs = hs($aThread->ttitle_hc); if ($_conf['k_save_packet']) { $ttitle_hs = mb_convert_kana($ttitle_hs, 'rnsk'); } return $read_atag = P2View::tagA(UriUtil::buildQueryUri($_conf['read_php'], array('host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'offline' => '1', 'rescount' => $aThread->rescount, UA::getQueryKey() => UA::getQueryValue())) . '#r' . rawurlencode($aThread->rescount), $ttitle_hs); }
/** * レス記事をHTML表示する 携帯用 * * @access public * @param array * @return void */ function printArticlesHtmlK($datlines) { global $_conf; $hr = P2View::getHrHtmlK(); $n = 0; foreach ($datlines as $aline) { $n++; if ($n < $this->resrange['start'] or $n > $this->resrange['to']) { continue; } $aline = rtrim($aline); $ResArticle = $this->lineToRes($aline, $n); $daytime_hs = hs($ResArticle->daytime); $ttitle = html_entity_decode($ResArticle->ttitle, ENT_COMPAT, 'Shift_JIS'); $ttitle_hs = hs($ttitle); $msg_ht = $ResArticle->msg; // 大きさ制限 if (empty($_GET['k_continue'])) { if ($_conf['ktai_res_size'] && strlen($msg_ht) > $_conf['ktai_res_size']) { $msg_ht = substr($msg_ht, 0, $_conf['ktai_ryaku_size']); // 末尾に<br>があれば取り除く(不完全なものも含めて) $brtag = '<br>'; for ($i = 0; $i < strlen($brtag); $i++) { if (substr($msg_ht, -1) == $brtag[strlen($brtag) - $i - 1]) { $msg_ht = substr($msg_ht, 0, strlen($msg_ht) - 1); } } $msg_ht .= ' ' . P2View::tagA(UriUtil::buildQueryUri('read_res_hist.php', array('from' => $ResArticle->order, 'end' => $ResArticle->order, 'k_continue' => '1', UA::getQueryKey() => UA::getQueryValue())), hs('略')); } } // 番号 $res_ht = "[{$ResArticle->order}]"; // 名前 $array = explode('#', $ResArticle->name, 2); if (count($array) == 2) { $name_ht = sprintf('%s◆%s', $array[0], P2Util::mkTrip($array[1])); } else { $name_ht = hs($ResArticle->name); } $res_ht .= $name_ht . ':'; // メール if ($ResArticle->mail) { $res_ht .= hs($ResArticle->mail) . ':'; } // 日付とID $res_ht .= "{$daytime_hs}<br>\n"; // 板名 $res_ht .= P2View::tagA(UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $ResArticle->host, 'bbs' => $ResArticle->bbs, UA::getQueryKey() => UA::getQueryValue())), hs($ResArticle->itaj)) . ' / '; if ($ResArticle->key) { if (empty($ResArticle->resnum) || $ResArticle->resnum == 1) { $ls_qs = array(); $footer_anchor = '#footer'; } else { $lf = max(1, $ResArticle->resnum - 0); $ls_qs = array('ls' => "{$lf}-"); $footer_anchor = "#r{$lf}"; } $time = time(); $ttitle_qs = array_merge(array('host' => $ResArticle->host, 'bbs' => $ResArticle->bbs, 'key' => $ResArticle->key, UA::getQueryKey() => UA::getQueryValue(), 'nt' => time()), $ls_qs); $res_ht .= P2View::tagA(UriUtil::buildQueryUri($_conf['read_php'], $ttitle_qs) . $footer_anchor, "{$ttitle_hs} "); } else { $res_ht .= "{$ttitle_hs}\n"; } // 削除 // $res_ht = "<dt><input name=\"checked_hists[]\" type=\"checkbox\" value=\"{$ResArticle->order},,,,{$daytime_hs}\"> "; $from_q = isset($_GET['from']) ? '&from=' . intval($_GET['from']) : ''; $dele_ht = "[<a href=\"read_res_hist.php?checked_hists[]={$ResArticle->order},,,," . hs(urlencode($ResArticle->daytime)) . "{$from_q}{$_conf['k_at_a']}\">削除</a>]"; $res_ht .= $dele_ht; $res_ht .= '<br>'; // 内容 $res_ht .= "{$msg_ht}{$hr}\n"; if ($_conf['k_save_packet']) { $res_ht = mb_convert_kana($res_ht, 'rnsk'); } echo $res_ht; } }
/** * 2ch, bbspink 板リンク * * @access private * @return string|false HTML */ function plugin_link2chSubject($url, $purl, $html) { global $_conf; if (preg_match('{^http://(\\w+\\.(?:2ch\\.net|bbspink\\.com))/([^/]+)/$}', $url, $m)) { return sprintf('%s [%s]', P2View::tagA($url, $html, array('target' => 'subject')), P2View::tagA(UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $m[1], 'bbs' => $m[2])), hs('板をp2で開く'), array('target' => 'subject'))); } return false; }
/** * GETクエリーでurlの指定があれば、そのままスレッド読みへ飛ばす * * @return void|exit */ function _locationReadPhpIfGetUrl() { global $_conf; if (!empty($_GET['url']) || !empty($_GET['nama_url'])) { header(sprintf('Location: %s/%s?%s', dirname(UriUtil::getMyUri()), $_conf['read_php'], $_SERVER['QUERY_STRING'])); exit; } }
/** * IDフィルタリングリンク変換 * * @access private * @return string HTML */ function idfilter_callback($s) { global $_conf; $idstr = $s[0]; // ID:xxxxxxxxxx $id = $s[1]; // xxxxxxxxxx $idflag = ''; // 携帯/PC識別子 // IDは8桁または10桁(+携帯/PC識別子)と仮定して /* if (strlen($id) % 2 == 1) { $id = substr($id, 0, -1); $idflag = substr($id, -1); } elseif (isset($s[2])) { $idflag = $s[2]; } */ if (isset($this->thread->idcount[$id]) && $this->thread->idcount[$id] > 0) { $filter_url = UriUtil::buildQueryUri($_conf['read_php'], array('host' => $this->thread->host, 'bbs' => $this->thread->bbs, 'key' => $this->thread->key, 'ls' => 'all', 'offline' => '1', 'idpopup' => '1', 'field' => 'id', 'method' => 'just', 'match' => 'on', 'word' => $id, UA::getQueryKey() => UA::getQueryValue())); $num_ht = sprintf('(<a href="%s">%s</a>)', hs($filter_url), $this->thread->idcount[$id]); return "{$idstr}{$num_ht}"; } return $idstr; }
/** * お気に板をHTML表示する * * @access public * @return void */ function printFavItaHtml() { global $_conf, $matome_i, $STYLE; // favita読み込み $favitas = array(); if (file_exists($_conf['favita_path'])) { if ($lines = file($_conf['favita_path'])) { foreach ($lines as $l) { if (preg_match("/^\t?(.+)\t(.+)\t(.+)\$/", trim($l), $matches)) { $favitas[] = array('host' => $matches[1], 'bbs' => $matches[2], 'itaj' => $matches[3]); } } } } // 空っぽなら if (!$favitas) { echo <<<EOP <div class="menu_cate"><b>お気に板</b> [<a href="editfavita.php" target="subject">編集</a>]<br> <div class="itas" id="c_favita">(空っぽ)</div> </div> EOP; return; } // 新着数を表示する場合・まとめてプリフェッチ if ($_conf['enable_menu_new'] && !empty($_GET['shownew'])) { if ($_conf['expack.use_pecl_http'] == 1) { require_once P2_LIB_DIR . '/P2HttpExt.php'; P2HttpRequestPool::fetchSubjectTxt($favitas); $GLOBALS['expack.subject.multi-threaded-download.done'] = true; } } $csrfid = P2Util::getCsrfId(); echo <<<EOP <div class="menu_cate"><b><a class="menu_cate" href="javascript:void(0);" onClick="showHide('c_favita', 'itas_hide');" target="_self">お気に板</a></b> [<a href="editfavita.php" target="subject">編集</a>]<br> <div class="itas" id="c_favita"> EOP; foreach ($favitas as $favita) { extract($favita); // $host, $bbs, $itaj $itaj_en = base64_encode($itaj); $uri = UriUtil::buildQueryUri($_SERVER['SCRIPT_NAME'], array('host' => $host, 'bbs' => $bbs, 'setfavita' => '0', 'csrfid' => $csrfid)); $star_atag = P2View::tagA($uri, '★', array('target' => '_self', 'class' => 'fav', 'title' => "「{$itaj}」をお気に板から外す", 'onClick' => "return confirmSetFavIta('" . str_replace(array("\\", "'"), array("\\\\", "\\'"), $itaj) . "');")); // 新着数を表示する場合 if ($_conf['enable_menu_new'] && !empty($_GET['shownew'])) { $matome_i++; // $host, $bbs $spmode = ''; $shinchaku_num = 0; $_newthre_num = 0; include './subject_new.php'; // $shinchaku_num, $_newthre_num がセットされる $newthre_ht = ''; if ($_newthre_num) { $newthre_ht = "{$_newthre_num}"; } $subject_uri = UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $host, 'bbs' => $bbs, 'itaj_en' => $itaj_en)); $subject_atag = P2View::tagA($subject_uri, hs($itaj), array('onClick' => "chMenuColor('{$matome_i}');")); $read_new_uri = UriUtil::buildQueryUri($_conf['read_new_php'], array('host' => $host, 'bbs' => $bbs)); $read_new_attr = array('target' => 'read', 'id' => "un{$matome_i}", 'onClick' => "chUnColor('{$matome_i}');"); if ($shinchaku_num > 0) { $read_new_attr['class'] = 'newres_num'; } else { $read_new_attr['class'] = 'newres_num_zero'; } $read_new_atag = P2View::tagA($read_new_uri, hs($shinchaku_num), $read_new_attr); echo <<<EOP {$star_atag} {$subject_atag} <span id="newthre{$matome_i}" class="newthre_num">{$newthre_ht}</span> ({$read_new_atag})<br> EOP; // 新着数を表示しない場合 } else { $subject_uri = UriUtil::buildQueryUri($_conf['subject_php'], array('host' => $host, 'bbs' => $bbs, 'itaj_en' => $itaj_en)); $subject_atag = P2View::tagA($subject_uri, hs($itaj)); echo "{$star_atag} {$subject_atag}<br>"; } ob_flush(); flush(); } // foreach echo " </div>\n"; echo "</div>\n"; }
/** * 「続きを読む」 <a> * * @return string HTML */ function _getTudukiATag($aThread, $tuduki_st) { global $_conf; return P2View::tagA(UriUtil::buildQueryUri($_conf['read_php'], array('host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'ls' => $GLOBALS['last_hit_resnum'] . '-', 'offline' => '1')), hs($tuduki_st), array('accesskey' => $_conf['pc_accesskey']['tuduki'], 'title' => sprintf('アクセスキー[%s]', $_conf['pc_accesskey']['tuduki']), 'style' => 'white-space: nowrap;')); }
/** * 1- 101- 201- のリンクHTMLを取得する * _getHeadBarHtml() から呼ばれる * * @return string HTML */ function _getReadNaviRangeHtml($aThread, $rnum_range) { global $_conf; static $cache_ = array(); if (array_key_exists("{$aThread->host}/{$aThread->bbs}/{$aThread->key}", $cache_)) { return $cache_["{$aThread->host}/{$aThread->bbs}/{$aThread->key}"]; } $read_navi_range_ht = ''; for ($i = 1; $i <= $aThread->rescount; $i = $i + $rnum_range) { $ito = $i + $rnum_range - 1; $qs = array('host' => $aThread->host, 'bbs' => $aThread->bbs, 'key' => $aThread->key, 'ls' => "{$i}-{$ito}", UA::getQueryKey() => UA::getQueryValue()); if ($ito <= $aThread->gotnum) { $qs['offline'] = '1'; } $url = UriUtil::buildQueryUri($_conf['read_php'], $qs); $read_navi_range_ht .= P2View::tagA($url, "{$i}-") . "\n"; } return $cache_["{$aThread->host}/{$aThread->bbs}/{$aThread->key}"] = $read_navi_range_ht; }