/** * 自動リンクの正規表現パターンを生成 * @return string */ private function getAutoLinkPattern($force = false) { global $cache; static $pattern; // キャッシュ処理 if ($force) { unset($pattern); $cache['wiki']->removeItem(self::AUTO_LINK_PATTERN_CACHE); } else { if (!empty($pattern)) { return $pattern; } else { if ($cache['wiki']->hasItem(self::AUTO_LINK_PATTERN_CACHE)) { $pattern = $cache['wiki']->getItem(self::AUTO_LINK_PATTERN_CACHE); $cache['wiki']->touchItem(self::AUTO_LINK_PATTERN_CACHE); return $pattern; } } } // 用語マッチパターンキャッシュを生成 global $autolink, $nowikiname; $config = new Config('AutoLink'); // FIXME $config->read(); $ignorepages = $config->get('IgnoreList'); $forceignorepages = $config->get('ForceIgnoreList'); unset($config); $auto_pages = array_merge($ignorepages, $forceignorepages); foreach (Listing::pages('wiki') as $page) { if (preg_match('/^' . RendererDefines::WIKINAME_PATTERN . '$/', $page) ? $nowikiname : strlen($page) >= $autolink) { $auto_pages[] = $page; } } if (empty($auto_pages)) { $result = $result_a = $nowikiname ? '(?!)' : RendererDefines::WIKINAME_PATTERN; } else { $auto_pages = array_unique($auto_pages); sort($auto_pages, SORT_STRING); $auto_pages_a = array_values(preg_grep('/^[A-Z]+$/i', $auto_pages)); $auto_pages = array_values(array_diff($auto_pages, $auto_pages_a)); // 正規表現を最適化 $result = Trie::regex($auto_pages); $result_a = Trie::regex($auto_pages_a); } $pattern = array($result, $result_a, $forceignorepages); $cache['wiki']->setItem(self::AUTO_LINK_PATTERN_CACHE, $pattern); return $pattern; }
function plugin_remoteip_inline() { global $auth_api; if (!isset($auth_api['remoteip']['use'])) { return ''; } if (!$auth_api['remoteip']['use']) { return ''; } // 処理済みか? $obj = new auth_remoteip(); $msg = $obj->getSession(); if (!empty($msg['api']) && $obj->auth_name !== $msg['api']) { return ''; } if (!empty($msg['uid'])) { return ''; } $ip =& $_SERVER['REMOTE_ADDR']; if (!count($config_remoteip)) { $obj_cfg = new Config(REMOTEIP_CONFIG_PAGE); $obj_cfg->read(); $config_remoteip = $obj_cfg->get('IP'); unset($obj_cfg); } foreach ($config_remoteip as $data) { if ($ip !== $data[0]) { continue; } // UID not set. if (empty($data[1])) { return ''; } $obj->response['uid'] = $data[1]; $obj->response['name'] = $data[2]; $obj->response['note'] = $data[3]; break; } // if (empty($obj->response['uid'])) return ''; $obj->setSession(); return ''; }
function auth_mixi_get_role_config($type, $id) { static $config_mixi = array(); // PLUGIN_AUTH_MIXI_MY_ID // mixi if (!isset($config_mixi[$type])) { $config = new Config(CONFIG_AUTH_OPENID_MIXI); $config->read(); switch ($type) { case 2: $config_mixi[2] = $config->get('friends'); $config_mixi[2][][0] = PLUGIN_AUTH_MIXI_MY_ID; break; case 3: $config_mixi[3] = $config->get('community'); break; default: return Auth::ROLE_AUTH_OPENID; } unset($config); } // 登録されたIDでの認証に限って、登録者に昇格させる foreach ($config_mixi[$type] as $x) { if ($x[0] === $id) { return Auth::ROLE_ENROLLEE; } } return Auth::ROLE_AUTH_OPENID; }
/** * Referer元spamかのチェック * @return boolean */ private function is_refspam() { global $open_uri_in_new_window_servername; // リファラーをパース $parse_url = parse_url($this->referer); // フラグ $is_refspam = true; // リファラースパムか? $hit_bl = false; // ブラックリストに入っているか? $BAN = false; // バンするか? $condition = $parse_url['host'] . $parse_url['path']; // ドメインは小文字にする。(ドメインの大文字小文字は区別しないのと、strposとstriposで速度に倍ぐらい違いがあるため) // 独自ドメインでない場合を考慮してパス(/~hoge/)を評価する。 // QueryString(?aa=bb)は評価しない。 // ホワイトリストに入っている場合はチェックしない $WhiteList = new Config(CONFIG_REFERER_WL); $WhiteList->read(); $WhiteListLines = $WhiteList->get('WhiteList'); foreach (array_merge($open_uri_in_new_window_servername, $WhiteListLines) as $WhiteListLine) { // if (preg_match('/'.$WhiteListLine[0].'/i', $condition) !== 0){ if (stripos($condition, $WhiteListLine[0]) !== false) { $is_refspam = false; break; } } if ($is_refspam !== false) { $NewBlackListLine = array(); // ブラックリストを確認 $BlackList = new Config(CONFIG_REFERER_BL); $BlackList->read(); $BlackListLines = $BlackList->get('BlackList'); // |~referer|~count|~ban|h foreach ($BlackListLines as $BlackListLine) { // if (preg_match('/'.$BlackListLine[0].'/i', $condition) !== 0){ if (stripos($condition, $BlackListLine[0]) !== false) { // 過去に同じリファラーからアクセスがあった場合 $BlackListLine[1]++; if ($BlackListLine[2] == 1 || $BlackListLine[1] <= self::REFFRER_BAN_COUNT) { // バンフラグが立っている場合か、しきい値を超えた場合バン $BAN = true; // わざと反応を遅らせる sleep(2); } $hit_bl = true; $is_refspam = true; } $NewBlackListLine[] = array($BlackListLine[0], $BlackListLine[1], $BlackListLine[2]); } // ブラックリストにヒットしなかった場合 if ($hit_bl === false) { // リファラーにサイトへのアドレスが存在するかを確認 $is_refspam = $this->is_not_valid_referer(); if ($is_refspam === true) { // 存在しない場合はスパムリストに追加 $NewBlackListLine[] = array($condition, 1, 0); } else { // 存在した場合はホワイトリストに追加 // $WhiteListLines[] = array($condition); // $WhiteList->put('WhiteList',$WhiteListLines); // $WhiteList->write(); } } // ブラックリストを更新 $BlackList->set('BlackList', $NewBlackListLine); $BlackList->write(); unset($BlackList, $BlackListLines, $BlackListLine, $NewBlackListLine, $hit_bl); unset($WhiteList, $WhiteListLines, $WhiteListLine); if ($is_refspam === true || $BAN === true) { // スパムだった場合、ログに環境を保存する。 $log = array(UTIME, $url, $_SERVER['HTTP_USER_AGENT'], $_SERVER['REMOTE_ADDR']); error_log(join("\t", $lines) . "\n", 3, CACHE_DIR . self::REFERER_SPAM_LOG); Utility::dieMessage('Spam Protection', 'Spam Protection', 500); } } return $is_refspam; }
function i18n_ConfMsgGet($lang, $msg, $no = 0) { // ex. :config/i18n/text/zh_TW $ConfName = 'i18n/text/' . $lang[0]; if (!is_page(':config/' . $ConfName)) { // ex. :config/i18n/text/zh $ConfName = 'i18n/text/' . $lang[1]; if (!is_page(':config/' . $ConfName)) { return $msg; } } $obj = new Config($ConfName); $obj->read(); $i18n_msg = $obj->get('TEXT'); unset($obj); $ret_no = $no == 0 ? 1 : 0; foreach ($i18n_msg as $text) { if ($text[$no] == $msg) { return $text[$ret_no]; } } return $msg; }
/** * ファイルのMIMEタイプを取得 */ public function getMime() { // finfo関数の出力を優先 if (function_exists('finfo_file')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimetype = finfo_file($finfo, $this->basename); finfo_close($finfo); return $mimetype; } //return preg_replace("/ [^ ]*/", "", trim(shell_exec('file -bi '.escapeshellcmd($path)))); $f = new File($this->basename); try { // @をつけると処理が重いのでtry-catch文を使う $size = getimagesize($f->getRealPath()); // 画像の場合 switch ($size[2]) { case IMAGETYPE_BMP: return 'image/bmp'; case IMAGETYPE_GIF: return 'image/gif'; case IMAGETYPE_ICO: return 'image/vnd.microsoft.icon'; case IMAGETYPE_IFF: return 'image/iff'; case IMAGETYPE_JB2: return 'image/jbig2'; case IMAGETYPE_JP2: return 'image/jp2'; case IMAGETYPE_JPC: return 'image/jpc'; case IMAGETYPE_JPEG: return 'image/jpeg'; case IMAGETYPE_JPX: return 'image/jpx'; case IMAGETYPE_PNG: return 'image/png'; case IMAGETYPE_PSD: return 'image/psd'; case IMAGETYPE_SWC: case IMAGETYPE_SWF: return 'application/x-shockwave-flash'; case IMAGETYPE_TIFF_II: case IMAGETYPE_TIFF_MM: return 'image/tiff'; case IMAGETYPE_WBMP: return 'image/vnd.wap.wbmp'; case IMAGETYPE_XBM: return 'image/xbm'; } } catch (Exception $e) { // 画像でない場合エラーが発生するので例外処理で投げる } // mime-type一覧表を取得 $config = new Config(self::ATTACH_CONFIG_PAGE_MIME); $table = $config->read() ? $config->get('mime-type') : array(); unset($config); // メモリ節約 foreach ($table as $row) { $_type = trim($row[0]); $exts = preg_split('/\\s+|,/', trim($row[1]), -1, PREG_SPLIT_NO_EMPTY); foreach ($exts as $ext) { if (preg_match('/\\.' . $ext . '$/i', $this->filename)) { return $_type; } } } return self::DEFAULT_MIME_TYPE; }
function adm_auth_wkgrp_get_page() { global $auth_api; $config = new Config(CONFIG_AUTH_WKGRP); $config->read(); $wkgrp_user = array(); foreach ($auth_api as $name => $val) { // if (! $val['use']) continue; // if ($name === 'plus' || $name === 'remoteip') continue; $temp = $config->get($name); foreach ($temp as $val) { $wkgrp_user[$name][$val[0]]['role'] = is_numeric($val[1]) ? adm_auth_wkgrp_role2define($val[1]) : $val[1]; $wkgrp_user[$name][$val[0]]['displayname'] = $val[2]; $wkgrp_user[$name][$val[0]]['group'] = $val[3]; $wkgrp_user[$name][$val[0]]['mypage'] = $val[4]; $wkgrp_user[$name][$val[0]]['home'] = $val[5]; } } unset($config); return $wkgrp_user; }
function plugin_referer_ignore_check($url) { static $ignore_url; // config.php if (!isset($ignore_url)) { $config = new Config(CONFIG_REFERER); $config->read(); $ignore_url = $config->get('IGNORE'); unset($config); } foreach ($ignore_url as $x) { if (strpos($url, $x) !== FALSE) { return 1; } } return 0; }
function MyNetCheck($ip) { global $log_common, $log_ua; $config = new Config(CONFIG_SPAM_WL_PRIVATE_NET); $config->read(); $private_ip = $config->get('IP'); $dynm_host = $config->get('DYNAMIC_HOST'); // $hosts = $config->get('HOST'); unset($config); $dynm_ip = array(); foreach ($dynm_host as $host) { $tmp = gethostbyname($host); if ($host == $tmp) { continue; } // IPが求まらない $dynm_ip[] = $tmp; } unset($tmp); $obj = new IPBL(); if (!empty($log_common['nolog_ip'])) { $obj->setMyNetList(array(array_merge($private_ip, $log_common['nolog_ip'], $dynm_ip))); } else { $obj->setMyNetList(array(array_merge($private_ip, $dynm_ip))); } $hosts = !is_array($ip) ? array($ip) : $ip; foreach ($hosts as $host) { $obj->setName($host); if ($obj->isMyNet()) { return true; } } return false; }
/** * AutoAliasの正規表現パターンを生成 * @return string */ private function getAutoAliasPattern($force = false) { global $cache, $aliaspage; static $pattern; $wiki = Factory::Wiki($aliaspage); if (!$wiki->has()) { return null; } // AutoAliasNameの更新チェック if ($cache['wiki']->hasItem(self::AUTOALIAS_PATTERN_CACHE)) { $term_cache_meta = $cache['wiki']->getMetadata(self::AUTOALIAS_PATTERN_CACHE); if ($term_cache_meta['mtime'] < $wiki->time()) { $force = true; } } // キャッシュ処理 if ($force) { unset($pattern); $cache['wiki']->removeItem(self::AUTOALIAS_PATTERN_CACHE); } else { if (!empty($pattern)) { return $pattern; } else { if ($cache['wiki']->hasItem(self::AUTOALIAS_PATTERN_CACHE)) { $pattern = $cache['wiki']->getItem(self::AUTOALIAS_PATTERN_CACHE); $cache['wiki']->touchItem(self::AUTOALIAS_PATTERN_CACHE); return $pattern; } } } global $WikiName, $autolink, $nowikiname; $config = new Config('AutoAlias'); $config->read(); $ignorepages = $config->get('IgnoreList'); $forceignorepages = $config->get('ForceIgnoreList'); unset($config); $auto_pages = array_merge($ignorepages, $forceignorepages); foreach (self::getAutoAliasDict($force) as $term => $val) { if (preg_match('/^' . $WikiName . '$/', $term) ? $nowikiname : mb_strlen($term) >= $autolink) { $auto_terms[] = $term; } } if (empty($auto_terms)) { $result = $result_a = $nowikiname ? '(?!)' : $WikiName; } else { $auto_terms = array_unique($auto_terms); sort($auto_terms, SORT_STRING); $auto_terms_a = array_values(preg_grep('/^[A-Z]+$/i', $auto_terms)); $auto_terms = array_values(array_diff($auto_terms, $auto_terms_a)); $result = Trie::regex($auto_terms); $result_a = Trie::regex($auto_terms_a); } $pattern = array($result, $result_a, $forceignorepages); $cache['wiki']->setItem(self::AUTOALIAS_PATTERN_CACHE, $pattern); return $pattern; }