Exemple #1
0
 /**
  * ログを保存する処理をオーバーライドして見做しログを保存
  */
 public function set($data = '', $keeptimestamp = false)
 {
     if ($this->config['guess_user']['use']) {
         LogFactory::factory('guess_user')->set($data);
     }
     parent::set($data, $keeptimestamp);
 }
Exemple #2
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']);
     }
 }
Exemple #3
0
/**
 * ユーザ名推測
 */
function logview_guess_user($data, $guess)
{
    // 確定的な情報
    $user = isset($data['user']) ? $data['user'] : '';
    $ntlm = isset($data['ntlm']) ? $data['ntlm'] : '';
    $sig = isset($data['sig']) ? $data['sig'] : '';
    $guess_user = LogFactory::factory('guess_user', null);
    $now_user = $guess_user->guess_user($user, $ntlm, $sig);
    if (!empty($now_user)) {
        return $now_user;
    }
    // 見做し
    if (!isset($data['ua'])) {
        return '';
    }
    if (!isset($guess[$data['ua']])) {
        return '';
    }
    // USER-AGENT が一致したデータがあるか
    if (!isset($data['host'])) {
        return '';
    }
    $user = '';
    $level = 0;
    // とりあえずホスト名は完全一致
    foreach ($guess[$data['ua']] as $_host => $val1) {
        list($sw, $lvl) = $guess_user->check_host($data['host'], $_host, $level);
        // ホスト名の一致確認
        if (!$sw) {
            continue;
        }
        // ホスト名が一致しない
        // UA が等しく、同じIPなものの、複数ユーザまたは改変した場合は、複数人分出力
        foreach ($val1 as $_user => $val2) {
            if (!empty($user)) {
                $user .= ' / ';
            }
            $user .= $_user;
        }
    }
    return $user;
}
Exemple #4
0
function plugin_login_action()
{
    global $vars, $_login_msg, $defaultpage;
    $api = isset($vars['api']) ? $vars['api'] : 'plus';
    $page = isset($vars['page']) ? $vars['page'] : $defaultpage;
    if ($api !== 'plus') {
        if (!PluginRenderer::hasPlugin($vars['api'])) {
            return;
        }
        $call_api = 'plugin_' . $vars['api'] . '_jump_url';
        Utility::redirect($call_api());
        exit;
    }
    $auth = Auth::authenticate();
    if ($auth === true) {
        // ログイン成功
        LogFactory::factory('login')->set();
        Utility::redirect(Factory::Wiki($page)->uri());
        exit;
    }
    return array('msg' => $_login_msg['err_auth'], 'body' => $_login_msg['err_auth_guide'], 'http_code' => 401);
}
Exemple #5
0
} else {
    if (!Factory::Wiki($base)->isValied()) {
        $base = $defaultpage;
        $title = $s_base;
        $page = Factory::Wiki($base)->link('related');
    }
    $vars['cmd'] = 'read';
    $vars['page'] = $base;
    if (empty($vars['page'])) {
        die('page is missing!');
    }
    $body = Factory::Wiki($vars['page'])->render();
    LogFactory::factory('check', $vars['page'])->set();
}
if ($vars['cmd'] === 'read') {
    LogFactory::factory('browse', $vars['page'])->set();
}
// ページを描画
new PukiWiki\Render($title, $body, $http_code);
unset($title, $body, $http_code);
exit;
// ここまで。
/**************************************************************************************************/
/** よく使うグローバル関数 **/
// gettext to Zend gettext emulator
function T_setlocale($type, $locale)
{
    global $translator, $cache;
    $translator->setLocale($locale);
    $translator->setCache($cache['core']);
}
Exemple #6
0
 /**
  * セッションを設定
  * @return void
  */
 public function setSession()
 {
     global $session;
     $value = '';
     foreach (array_merge(array('api', 'ts'), $this->field_name) as $key) {
         $value .= empty($value) ? '' : '::';
         // delm
         $value .= $key . '$$';
         switch ($key) {
             case 'api':
                 $value .= $this->auth_name;
                 break;
             case 'ts':
                 $value .= UTIME;
                 break;
             default:
                 $value .= Utility::encode($this->response[$key]);
         }
     }
     // 復号化
     $session->offsetSet($this->session_name, $this->bc->encrypt($value));
     // OpenID認証の場合のみ
     if ($this->auth_name != 'openid_verify') {
         LogFactory::factory('login')->set();
     }
 }