/** * Clear authorization Cookie * * @param string $authDomain */ private function clearCookie(Request $request, Response $response, $authDomain) { if ($request->getCookie()->offsetExists($authDomain)) { $cookie = new SetCookie($authDomain, '', strtotime('-1 Year', time()), '/'); $response->getHeaders()->addHeader($cookie); $response->send(); } }
public static function createFromRequest(BaseRequest $request) { $new = static::fromString($request->toString()); $new->setQuery($request->getQuery()); $new->setPost($request->getPost()); $new->setCookies($request->getCookie()); $new->setFiles($request->getFiles()); $new->setServer($request->getServer()); $new->setContent($request->getContent()); $new->setEnv($request->getEnv()); $headers = $request->getHeaders(); $new->setHeaders($headers); return $new; }
/** * QueryStringをパースし、$_GETに上書き * @return void */ public static function parseArguments() { global $cookie, $get, $post, $method; global $defaultpage; $request = new Request(); // GET, POST, COOKIE $get = $request->getQuery(); $post = $request->getPost(); $cookie = $request->getCookie(); $method = $request->getMethod(); $vars = array(); if (strlen($get->toString()) > self::MAX_QUERY_STRING_LENGTH) { // Something nasty attack? self::dump('suspicious'); self::dieMessage(_('Query string is too long.')); } if (count($get) === 0) { // Queryがない場合 $get->set('page', $defaultpage); } else { if (count($get) === 1 && empty(array_values((array) $get)[0])) { // 配列の長さが1で最初の配列に値が存在しない場合はキーをページ名とする。 $k = trim(array_keys((array) $get)[0]); $get->set('page', rawurldecode($_SERVER['QUERY_STRING'])); unset($get[$k]); } } // 外部からの変数を$vars配列にマージする if (empty($post)) { $vars = (array) $get; // Major pattern: Read-only access via GET } else { if (empty($get)) { $vars = (array) $post; // Minor pattern: Write access via POST etc. } else { $vars = array_merge((array) $get, (array) $post); // Considered reliable than $_REQUEST } } // var_dump($vars); // die; if (!isset($vars['cmd'])) { $vars['cmd'] = 'read'; } if (isset($vars['page']) && is_string($vars['page']) && preg_match(Wiki::INVALIED_PAGENAME_PATTERN, $vars['page']) === false) { // ページ名チェック self::dump('suspicious'); die('Invalid page name.'); } if (is_string($vars['cmd']) && preg_match(PluginRenderer::PLUGIN_NAME_PATTERN, $vars['cmd']) === false) { // 入力チェック: cmdの文字列は英数字以外ありえない self::dump('suspicious'); die(sprintf('Plugin name %s is invalied or too long! (less than 64 chars)', $vars['cmd'])); } // 文字コード変換 // <form> で送信された文字 (ブラウザがエンコードしたデータ) のコードを変換 // POST method は常に form 経由なので、必ず変換する if (isset($vars['encode_hint']) && !empty($vars['encode_hint'])) { // do_plugin_xxx() の中で、<form> に encode_hint を仕込んでいるので、 // encode_hint を用いてコード検出する。 // 全体を見てコード検出すると、機種依存文字や、妙なバイナリ // コードが混入した場合に、コード検出に失敗する恐れがある。 $encode = mb_detect_encoding($vars['encode_hint']); mb_convert_variables(SOURCE_ENCODING, $encode, $vars); } else { // 全部まとめて、自動検出/変換 mb_convert_variables(SOURCE_ENCODING, 'auto', $vars); } // 環境変数のチェック self::checkEnv($request->getEnv()); switch ($method) { case Request::METHOD_POST: self::spamCheck($vars['cmd']); break; case Request::METHOD_OPTIONS: case Request::METHOD_PROPFIND: case Request::METHOD_DELETE: case 'MOVE': case 'COPY': case 'PROPPATCH': case 'MKCOL': case 'LOCK': case 'UNLOCK': // WebDAV $matches = array(); foreach (self::$ua_dav as $pattern) { if (preg_match('/' . $pattern . '/', $log_ua, $matches)) { PluginRenderer::executePluginAction('dav'); exit; } } break; } return $vars; }