Esempio n. 1
0
 /**
  * コンストラクタ
  */
 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);
 }
Esempio n. 2
0
 /**
  * コンストラクタ
  * @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();
 }
Esempio n. 3
0
 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+)|))$/';
 }
Esempio n. 4
0
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);
}
Esempio n. 5
0
 /**
  * 差分ファイルの存在確認
  * @static
  */
 public function diff_exist()
 {
     return FileFactory::factory('diff', $this->page)->has();
 }
Esempio n. 6
0
 /**
  * 削除履歴を生成
  * @global string $whatsdeleted
  * @param string $deleted 削除したページ
  * @return type
  */
 public static function updateRecentDeleted($page)
 {
     global $whatsdeleted;
     // 隠されたページの場合削除履歴を付けない
     if (Factory::Wiki($page)->isHidden()) {
         return;
     }
     // 新たに削除されるページ名
     $_page = '[[' . str_replace('&#39;', '\'', 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));
 }
Esempio n. 7
0
 /**
  * ページを書き込む
  * @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']);
     }
 }
Esempio n. 8
0
 /**
  * 一覧を取得
  * @param string $type データーのタイプ
  * @return array
  */
 public static function pages($type = 'wiki')
 {
     return FileFactory::getPages($type);
 }