/** * コンストラクタ */ public function __construct($page) { global $_SERVER; $this->referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; $this->page = $page; // 以下はSplFileInfoの派生クラス $this->file = FileFactory::Referer($this->page); }
/** * コンストラクタ * @param $name 設定名 * @param $autoupdate 自動更新するか */ public function __construct($name, $autoupdate = false) { $this->name = $name; $this->page = self::CONFIG_PAGE_PREFIX . $name; // $this->cache_name = self::CACHE_PREFIX.md5($name); $this->wiki = FileFactory::Wiki($this->page); $this->autoupdate = $autoupdate; $this->read(); }
public function __construct($page) { global $cycle, $maxage; $this->page = $page; // バックアップの頻度 //$this->cycle = 0; $this->cycle = !empty($cycle) ? 60 * 60 * $cycle : self::BACKUP_INTERVAL; // バックアップの上限個数 $this->maxage = $maxage; // 以下はSplFileInfoの派生クラス $this->wiki = FileFactory::Wiki($this->page); $this->backup = FileFactory::Backup($this->page); // バックアップの世代間の区切りの正規表現 $this->splitter_reglex = '/^(' . preg_quote(self::SPLITTER) . '\\s\\d+(\\s(\\d+)|))$/'; }
function plugin_diff_view($page) { global $hr, $_string; // global $_msg_notfound, $_msg_goto, $_msg_deleted, $_msg_addline, $_msg_delline; // global $_title_diff, $_title_diff_delete; if (Auth::check_role('safemode')) { die_message('PKWK_SAFE_MODE prohibits this'); } $_msg_notfound = T_('The page was not found.'); $_msg_addline = T_('The added line is <span class="diff_added">THIS COLOR</span>.'); $_msg_delline = T_('The deleted line is <span class="diff_removed">THIS COLOR</span>.'); $_msg_goto = T_('Go to $1.'); $_msg_deleted = T_(' $1 has been deleted.'); $_title_diff = T_('Diff of $1'); $_title_diff_delete = T_('Deleting diff of $1'); $r_page = rawurlencode($page); $s_page = htmlsc($page); $menu = array('<li class="no-js">' . $_msg_addline . '</li>', '<li class="no-js">' . $_msg_delline . '</li>'); $is_page = Factory::Wiki($page)->isValied(); if ($is_page) { $menu[] = ' <li>' . str_replace('$1', '<a href="' . get_page_uri($page) . '">' . $s_page . '</a>', $_msg_goto) . '</li>'; } else { $menu[] = ' <li>' . str_replace('$1', $s_page, $_msg_deleted) . '</li>'; } $diff = FileFactory::Diff($page); if ($diff->has() && ($is_page || Auth::is_role_page($diff))) { // if (! PKWK_READONLY) { if (!Auth::check_role('readonly')) { $menu[] = '<li><a href="' . get_cmd_uri('diff', $page, null, array('action' => 'delete')) . '">' . str_replace('$1', $s_page, $_title_diff_delete) . '</a></li>'; } Auth::is_role_page($diff); $msg = $diff->render(); } else { return array('msg' => $_title_diff, 'body' => $_msg_notfound); } $menu = join("\n", $menu); $body = <<<EOD <ul> {$menu} </ul> {$hr} EOD; return array('msg' => $_title_diff, 'body' => $body . $msg); }
/** * 差分ファイルの存在確認 * @static */ public function diff_exist() { return FileFactory::factory('diff', $this->page)->has(); }
/** * 削除履歴を生成 * @global string $whatsdeleted * @param string $deleted 削除したページ * @return type */ public static function updateRecentDeleted($page) { global $whatsdeleted; // 隠されたページの場合削除履歴を付けない if (Factory::Wiki($page)->isHidden()) { return; } // 新たに削除されるページ名 $_page = '[[' . str_replace(''', '\'', Utility::htmlsc($page)) . ']]'; // 削除履歴ページ $delated_wiki = FileFactory::Wiki($whatsdeleted); $lines = array(); // 削除履歴を確認する $deletedLines = $delated_wiki->get(); if (is_array($deletedLines)) { foreach ($deletedLines as $line) { if (preg_match('/^-(.+) - (\\[\\[.+\\]\\])$/', $line, $matches)) { $lines[$matches[2]] = $line; } } } // 削除されるページ名と同じページが存在した時にそこの行を削除する if (isset($lines[$_page])) { unset($lines[$_page]); } // 削除履歴に追記 array_unshift($lines, '- &epoch(' . UTIME . '); - ' . $_page); array_unshift($lines, '#norelated'); // 履歴の最大記録数を制限 $lines = array_splice($lines, 0, self::RECENT_MAX_SHOW_PAGES); // 削除履歴を付ける(この時に最終更新のキャッシュも自動更新される) $delated_wiki->set(array_values($lines)); }
/** * ページを書き込む * @param string $str 書き込むデーター * @param boolean $notimestamp タイムスタンプを更新するかのフラグ * @return void */ public function set($str, $keeptimestamp = false) { global $use_spam_check, $_string, $vars, $_title, $whatsnew, $whatsdeleted; // roleのチェック if (Auth::check_role('readonly')) { return; } // Do nothing if (Auth::is_check_role(PKWK_CREATE_PAGE)) { Utility::dieMessage(sprintf($_strings['error_prohibit'], 'PKWK_READONLY'), 403); } // 簡易スパムチェック(不正なエンコードだった場合ここでエラー) if (isset($vars['encode_hint']) && $vars['encode_hint'] !== PKWK_ENCODING_HINT) { Utility::dump(); Utility::dieMessage($_string['illegal_chars'], 403); } // ポカミス対策:配列だった場合文字列に変換 if (is_array($str)) { $str = join("\n", $str); } // 入力データーを整形(※string型です) $postdata = Rules::make_str_rules($str); // 過去のデーターを取得 $oldpostdata = self::has() ? self::get(TRUE) : ''; // 差分を生成(ここでの差分データーはAkismetでも使う) $diff = new Diff($oldpostdata, $postdata); $diffobj = new LineDiff(); $diffdata = $diffobj->str_compare($oldpostdata, $postdata); // ログイン済みもしくは、自動更新されるページである $has_not_permission = Auth::check_role('role_contents_admin'); // 未ログインの場合、S25Rおよび、DNSBLチェック if ($has_not_permission) { $ip_filter = new IpFilter(); //if ($ip_filter->isS25R()) Utility::dieMessage('S25R host is denied.'); // 簡易スパムチェック if (Utility::isSpamPost()) { Utility::dump(); Utility::dieMessage('Writing was limited. (Blocking SPAM)'); } if (isset($use_spam_check['page_remote_addr']) && $use_spam_check['page_remote_addr'] !== 0) { // DNSBLチェック $listed = $ip_filter->checkHost(); if ($listed !== false) { Utility::dump('dnsbl'); Utility::dieMessage(sprintf($_strings['prohibit_dnsbl'], $listed), $_title['prohibit'], 400); } } if (isset($use_spam_check['page_contents']) && $use_spam_check['page_contents'] !== 0) { // URLBLチェック $reason = self::checkUriBl($diff); if ($reason !== false) { Utility::dump($reason); Utility::dieMessage($_strings['prohibit_uribl'], $_title['prohibit'], 400); } } // 匿名プロクシ if ($use_spam_check['page_write_proxy'] && ProxyChecker::is_proxy()) { Utility::dump('proxy'); Utility::dieMessage($_strings['prohibit_proxy'], $_title['prohibit'], 400); } // Akismet global $akismet_api_key; if (isset($use_spam_check['akismet']) && $use_spam_check['akismet'] !== 0 && !empty($akismet_api_key)) { $akismet = new Akismet($akismet_api_key, Router::get_script_absuri()); if ($akismet->verifyKey($akismet_api_key)) { // 送信するデーターをセット $akismet_post = array('user_ip' => REMOTE_ADDR, 'user_agent' => $_SERVER['HTTP_USER_AGENT'], 'comment_type' => 'comment', 'comment_author' => isset($vars['name']) ? $vars['name'] : 'Anonymous', 'comment_content' => $postdata); // if ($use_spam_check['akismet'] === 1){ // // 差分のみをAkismetに渡す // foreach ($diff->getSes() as $key=>$line){ // if ($key !== $diff::SES_ADD) continue; // $added_data[] = $line; // } // $akismet_post['comment_content'] = join("\n",$added_data); // unset($added_data); // } if ($akismet->isSpam($akismet_post)) { Utility::dump('akismet'); Utility::dieMessage($_strings['prohibit_akismet'], $_title['prohibit'], 400); } } else { Utility::dieMessage('Akismet API key does not valied.', 500); } } // captcha check if (isset($use_spam_check['captcha']) && $use_spam_check['captcha'] !== 0) { Captcha::check(false); } } // 現時点のページのハッシュを読む $old_digest = $this->wiki->has() ? $this->wiki->digest() : 0; // オリジナルが送られてきている場合、Wikiへの書き込みを中止し、競合画面を出す。 // 現時点のページのハッシュと、送信されたページのハッシュを比較して異なる場合、 // 自分が更新している間に第三者が更新した(=競合が起きた)と判断する。 $collided = isset($vars['digest']) && $old_digest !== 0 && $vars['digest'] !== $old_digest; if ($collided && isset($vars['original'])) { return array('msg' => $_string['title_collided'], 'body' => $_string['msg_collided'] . Utility::showCollision($oldpostdata, $postdata, $vars['original']) . Utility::editForm($this->page, $postdata, false)); } // add client info to diff // $diffdata[] = '// IP:"'. REMOTE_ADDR . '" TIME:"' . UTIME . '" REFERER:"' . $referer . '" USER_AGENT:"' . $user_agent. "\n"; FileFactory::Diff($this->page)->set($diffdata); unset($oldpostdata, $diff, $diffdata); // Logging postdata (Plus!) if (self::POST_LOGGING === TRUE) { Utility::dump(self::POST_LOG_FILENAME); } // 入力が空の場合、削除とする if (empty($str)) { // Wikiページを削除 $ret = $this->wiki->set(''); Recent::set($this->page, true); } else { // Wikiを保存 $ret = $this->wiki->set($postdata, $keeptimestamp); // 最終更新を更新 Recent::set($this->page); } if ($this->page !== $whatsnew || $this->page !== $whatsdeleted || !$this->isHidden()) { // バックアップを更新 Factory::Backup($this->page)->set(); // 更新ログをつける LogFactory::factory('update', $this->page)->set(); if (!$keeptimestamp && !empty($str)) { // weblogUpdates.pingを送信 $ping = new Ping($this->page); $ping->send(); } } // 簡易競合チェック if ($collided) { return array('msg' => $_string['title_collided'], 'body' => $_string['msg_collided_auto']); } }
/** * 一覧を取得 * @param string $type データーのタイプ * @return array */ public static function pages($type = 'wiki') { return FileFactory::getPages($type); }