/** * ログを保存する処理をオーバーライドして見做しログを保存 */ public function set($data = '', $keeptimestamp = false) { if ($this->config['guess_user']['use']) { LogFactory::factory('guess_user')->set($data); } parent::set($data, $keeptimestamp); }
/** * ページを書き込む * @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']); } }
/** * ユーザ名推測 */ 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; }
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); }
} 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']); }
/** * セッションを設定 * @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(); } }