/**
  * Page を初期化する.
  *
  * @return void
  */
 public function init()
 {
     $this->template = MAIN_FRAME;
     //IP制限チェック
     $allow_hosts = unserialize(ADMIN_ALLOW_HOSTS);
     if (is_array($allow_hosts) && count($allow_hosts) > 0) {
         if (array_search($_SERVER['REMOTE_ADDR'], $allow_hosts) === FALSE) {
             Utils::sfDispError(AUTH_ERROR);
         }
     }
     //SSL制限チェック
     if (ADMIN_FORCE_SSL == TRUE) {
         if (Utils::sfIsHTTPS() === false) {
             Application::alias('eccube.response')->sendRedirect($_SERVER['REQUEST_URI'], $_GET, FALSE, TRUE);
         }
     }
     $this->tpl_authority = $_SESSION['authority'];
     // ディスプレイクラス生成
     $this->objDisplay = Application::alias('eccube.display');
     // スーパーフックポイントを実行.
     $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg);
     $objPlugin->doAction('LC_Page_preProcess', array($this));
     // トランザクショントークンの検証と生成
     $this->doValidToken(true);
     $this->setTokenTo();
     // ローカルフックポイントを実行
     $parent_class_name = get_parent_class($this);
     $objPlugin->doAction($parent_class_name . '_action_before', array($this));
     $class_name = get_class($this);
     if ($class_name != $parent_class_name) {
         $objPlugin->doAction($class_name . '_action_before', array($this));
     }
 }
示例#2
0
 /**
  * アプリケーション内でリダイレクトする
  *
  * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち)
  * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING']
  * 2. $location に含まれる searchpart
  * 3. 引数 $arrQueryString
  * @param  string    $location           「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。
  * @param  array     $arrQueryString     URL に付加する searchpart
  * @param  bool      $inheritQueryString 現在のリクエストの searchpart を継承するか
  * @param  bool|null $useSsl             true:HTTPSを強制, false:HTTPを強制, null:継承
  * @return void
  * @static
  */
 public function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null)
 {
     // ローカルフックポイント処理
     $objPlugin = PluginHelper::getSingletonInstance();
     if (is_object($objPlugin)) {
         $arrBacktrace = debug_backtrace();
         if (is_object($arrBacktrace[0]['object']) && method_exists($arrBacktrace[0]['object'], 'getMode')) {
             $parent_class_name = get_parent_class($arrBacktrace[0]['object']);
             $objPlugin->doAction($parent_class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($arrBacktrace[0]['object']));
             $class_name = get_class($arrBacktrace[0]['object']);
             if ($class_name != $parent_class_name) {
                 $objPlugin->doAction($class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($this));
             }
         } elseif (is_object($arrBacktrace[0]['object'])) {
             $pattern = '/^[a-zA-Z0-9_]+$/';
             $mode = null;
             if (isset($_GET['mode']) && preg_match($pattern, $_GET['mode'])) {
                 $mode = $_GET['mode'];
             } elseif (isset($_POST['mode']) && preg_match($pattern, $_POST['mode'])) {
                 $mode = $_POST['mode'];
             }
             $parent_class_name = get_parent_class($arrBacktrace[0]['object']);
             $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object']));
             $class_name = get_class($arrBacktrace[0]['object']);
             if ($class_name != $parent_class_name) {
                 $objPlugin->doAction($class_name . '_action_' . $mode, array($this));
             }
         }
     }
     // url-path → URL 変換
     if ($location[0] === '/') {
         $netUrl = new \Net_URL($location);
         $location = $netUrl->getUrl();
     }
     // URL の場合
     if (preg_match('/^https?:/', $location)) {
         $url = $location;
         if (is_bool($useSsl)) {
             if ($useSsl) {
                 $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/';
                 $replacement = HTTPS_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             } else {
                 $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/';
                 $replacement = HTTP_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             }
         }
         // 現在のURLからのパス
     } else {
         if (!is_bool($useSsl)) {
             $useSsl = Utils::sfIsHTTPS();
         }
         $netUrl = new \Net_URL($useSsl ? HTTPS_URL : HTTP_URL);
         $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location;
         $url = $netUrl->getUrl();
     }
     $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/';
     // アプリケーション外へのリダイレクトは扱わない
     if (preg_match($pattern, $url) === 0) {
         trigger_error('', E_USER_ERROR);
     }
     $netUrl = new \Net_URL($url);
     if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) {
         $arrQueryStringBackup = $netUrl->querystring;
         // XXX メソッド名は add で始まるが、実際には置換を行う
         $netUrl->addRawQueryString($_SERVER['QUERY_STRING']);
         $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup);
     }
     $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString);
     $session = SessionFactory::getInstance();
     if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) {
         $netUrl->addQueryString(session_name(), session_id());
     }
     $netUrl->addQueryString(TRANSACTION_ID_NAME, SessionHelper::getToken());
     $url = $netUrl->getURL();
     header("Location: {$url}");
     exit;
 }
示例#3
0
 /**
  * ホスト名を正規化する
  *
  * @return void
  */
 public function normalizeHostname()
 {
     if (!USE_NORMALIZE_HOSTNAME || !isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_METHOD'] === 'POST') {
         // 処理せず戻る
         return;
     }
     $netUrlRequest = new \Net_URL($_SERVER['REQUEST_URI']);
     // 要求を受けたホスト名
     $request_hostname = $netUrlRequest->host;
     $netUrlCorrect = new \Net_URL(\Eccube\Framework\Util\Utils::sfIsHTTPS() ? HTTPS_URL : HTTP_URL);
     // 設定上のホスト名
     $correct_hostname = $netUrlCorrect->host;
     // ホスト名が不一致の場合
     if ($request_hostname !== $correct_hostname) {
         // ホスト名を書き換え
         $netUrlRequest->host = $correct_hostname;
         // 正しい URL
         $correct_url = $netUrlRequest->getUrl();
         // 警告
         $msg = 'ホスト名不一致を検出。リダイレクト実行。';
         $msg .= '要求値=' . var_export($request_hostname, true) . ' ';
         $msg .= '設定値=' . var_export($correct_hostname, true) . ' ';
         $msg .= 'リダイレクト先=' . var_export($correct_url, true) . ' ';
         trigger_error($msg, E_USER_WARNING);
         // リダイレクト(恒久的)
         Application::alias('eccube.response')->sendHttpStatus(301);
         Application::alias('eccube.response')->sendRedirect($correct_url);
     }
 }
示例#4
0
 /**
  * オペレーションの実行権限をチェックする
  *
  * @param string オペレーション名
  * @param array リクエストパラメータ
  * @return boolean 権限がある場合 true; 無い場合 false
  */
 protected function checkOperationAuth($operation_name, &$arrParam, &$arrApiConfig)
 {
     if (Utils::isBlank($operation_name)) {
         return false;
     }
     $arrAuthTypes = explode('|', $arrApiConfig['auth_types']);
     $result = false;
     foreach ($arrAuthTypes as $auth_type) {
         $ret = false;
         switch ($auth_type) {
             case self::API_AUTH_TYPE_REFERER:
                 $ret = static::checkReferer();
                 break;
             case self::API_AUTH_TYPE_SESSION_TOKEN:
                 $ret = SessionHelper::isValidToken(false);
                 break;
             case self::API_AUTH_TYPE_API_SIGNATURE:
                 $ret = static::checkApiSignature($operation_name, $arrParam, $arrApiConfig);
                 break;
             case self::API_AUTH_TYPE_CUSTOMER:
                 $ret = static::checkCustomerAccount($arrParam['login_email'], $arrParam['login_password']);
                 break;
             case self::API_AUTH_TYPE_MEMBER:
                 $ret = static::checkMemberAccount($arrParam['member_id'], $arrParam['member_password']);
                 break;
             case self::API_AUTH_TYPE_CUSTOMER_LOGIN_SESSION:
                 /* @var $objCustomer Customer */
                 $objCustomer = Application::alias('eccube.customer');
                 $ret = $objCustomer->isLoginSuccess();
                 break;
             case self::API_AUTH_TYPE_MEMBER_LOGIN_SESSION:
                 $ret = Utils::sfIsSuccess(new Session(), false);
                 break;
             case self::API_AUTH_TYPE_IP:
                 $ret = static::checkIp($operation_name);
                 break;
             case self::API_AUTH_TYPE_HOST:
                 $ret = static::checkHost($operation_name);
                 break;
             case self::API_AUTH_TYPE_SSL:
                 $ret = Utils::sfIsHTTPS();
                 break;
             case self::API_AUTH_TYPE_OPEN:
                 $result = true;
                 break 2;
                 // foreachも抜ける
             // foreachも抜ける
             default:
                 $ret = false;
                 break;
         }
         if ($ret === true) {
             $result = true;
         } else {
             $result = false;
             break;
             // 1つでもfalseがあれば,その時点で終了
         }
     }
     return $result;
 }
示例#5
0
 /**
  * $path から URL を取得する.
  *
  * 以下の順序で 引数 $path から URL を取得する.
  * 1. realpath($path) で $path の 絶対パスを取得
  * 2. $_SERVER['DOCUMENT_ROOT'] と一致する文字列を削除
  * 3. $useSSL の値に応じて, HTTP_URL 又は, HTTPS_URL を付与する.
  *
  * 返り値に, QUERY_STRING を含めたい場合は, key => value 形式
  * の配列を $param へ渡す.
  *
  * @access protected
  * @param string $path   結果を取得するためのパス
  * @param array  $param  URL に付与するパラメーターの配列
  * @param mixed  $useSSL 結果に HTTPS_URL を使用する場合 true,
  *                         HTTP_URL を使用する場合 false,
  *                         デフォルト 'escape' 現在のスキーマを使用
  * @return string $path の存在する http(s):// から始まる絶対パス
  * @see \Net_URL
  */
 public function getLocation($path, $param = array(), $useSSL = 'escape')
 {
     $rootPath = $this->getRootPath($path);
     // スキーマを定義
     if ($useSSL === true) {
         $url = HTTPS_URL . $rootPath;
     } elseif ($useSSL === false) {
         $url = HTTP_URL . $rootPath;
     } elseif ($useSSL == 'escape') {
         if (Utils::sfIsHTTPS()) {
             $url = HTTPS_URL . $rootPath;
         } else {
             $url = HTTP_URL . $rootPath;
         }
     } else {
         die("[BUG] Illegal Parametor of \$useSSL ");
     }
     $netURL = new \Net_URL($url);
     // QUERY_STRING 生成
     foreach ($param as $key => $val) {
         $netURL->addQueryString($key, $val);
     }
     return $netURL->getURL();
 }