/** * Page のアクション. * * @return void */ public function action() { /* @var $objCustomer Customer */ $objCustomer = Application::alias('eccube.customer'); // クッキー管理クラス /* @var $objCookie Cookie */ $objCookie = Application::alias('eccube.cookie'); // ログイン判定 if ($objCustomer->isLoginSuccess()) { $this->tpl_login = true; $this->tpl_user_point = $objCustomer->getValue('point'); $this->tpl_name1 = $objCustomer->getValue('name01'); $this->tpl_name2 = $objCustomer->getValue('name02'); } else { // クッキー判定 $this->tpl_login_email = $objCookie->getCookie('login_email'); if ($this->tpl_login_email != '') { $this->tpl_login_memory = '1'; } // POSTされてきたIDがある場合は優先する。 if (isset($_POST['login_email']) && $_POST['login_email'] != '') { $this->tpl_login_email = $_POST['login_email']; } } $this->tpl_disable_logout = $this->lfCheckDisableLogout(); //スマートフォン版ログアウト処理で不正なページ移動エラーを防ぐ為、トークンをセット $this->transactionid = SessionHelper::getToken(); }
/** * オペレーションの実行権限をチェックする * * @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; }
/** * アプリケーション内でリダイレクトする * * 内部で生成する 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; }
/** * Returns a callable given its string representation. * * @param string $name * * @return array A callable array * * @throws \InvalidArgumentException In case the method does not exist. */ public function convertCallback($name) { if (preg_match(static::PAGE_PATTERN, $name)) { return function (Application $app, Request $request) use($name) { // setpath $path_info = $request->getPathInfo(); if (substr($path_info, -1) == '/') { $path_info .= 'index.php'; } $_SERVER['SCRIPT_NAME'] = str_replace('/index.php', '', $request->server->get('SCRIPT_NAME')) . $path_info . (substr($path_info, -1) == '/' ? 'index.php' : ''); $_SERVER['SCRIPT_FILENAME'] = dirname($request->server->get('SCRIPT_FILENAME')) . $path_info; // rtrim は PHP バージョン依存対策 $GLOBALS['_realdir'] = rtrim(realpath(rtrim(realpath(dirname($request->server->get('SCRIPT_FILENAME'))), '/\\') . '/'), '/\\') . '/'; $GLOBALS['_realdir'] = str_replace('\\', '/', $GLOBALS['_realdir']); $GLOBALS['_realdir'] = str_replace('//', '/', $GLOBALS['_realdir']); define('HTML_REALDIR', $GLOBALS['_realdir']); /** HTMLディレクトリからのDATAディレクトリの相対パス */ define('HTML2DATA_DIR', '../app/'); define('USE_FILENAME_DIR_INDEX', null); if (!defined('DATA_REALDIR')) { define('DATA_REALDIR', HTML_REALDIR . HTML2DATA_DIR); } // アプリケーション初期化処理 if (!defined('CACHE_REALDIR')) { /** キャッシュ生成ディレクトリ */ define('CACHE_REALDIR', DATA_REALDIR . "cache/eccube/"); } \Eccube\Framework\Helper\HandleErrorHelper::load(); // アプリケーション初期化処理 $objInit = new \Eccube\Framework\Initial(); $objInit->init(); // Page instance $objPage = new $name($app); if ($objPage instanceof \Eccube\Page\Admin\AbstractAdminPage) { define('ADMIN_FUNCTION', true); } else { define('FRONT_FUNCTION', true); } // 定数 SAFE が設定されている場合、DBアクセスを回避する。主に、エラー画面を意図する。 if (!defined('SAFE') || !SAFE) { // インストール中で無い場合、 if (!GcUtils::isInstallFunction()) { // インストールチェック Utils::sfInitInstall(); // セッション初期化・開始 $sessionFactory = SessionFactory::getInstance(); $sessionFactory->initSession(); /* * 管理画面の場合は認証行う. * 認証処理忘れ防止のため, \Eccube\Page\Admin::init() 等ではなく, ここでチェックする. */ SessionHelper::adminAuthorization(); } } // bufferを初期化する if ($objPage instanceof \Eccube\Page\Admin\AbstractAdminPage) { ob_start(); } else { // 絵文字変換 (除去) フィルターを組み込む。 ob_start(array('\\Eccube\\Framework\\MobileEmoji', 'handler')); if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE) { // resize_image.phpは除外 if (!$objPage instanceof \Eccube\Page\ResizeImage) { /* @var $objMobile MobileHelper */ $objMobile = Application::alias('eccube.helper.mobile'); $objMobile->sfMobileInit(); } } } $objPage->init(); $objPage->process(); $response = ob_get_contents(); ob_end_clean(); return $response; }; } else { return parent::convertCallback($name); } }
/** * トランザクショントークンを取得する * * @return string */ function getRefusalToken() { if (empty($_SESSION['refusal_transactionid'])) { $_SESSION['refusal_transactionid'] = SessionHelper::createToken(); } return $_SESSION['refusal_transactionid']; }
/** * ログインを実行する. * * ログインを実行し, 成功した場合はユーザー情報をセッションに格納し, * true を返す. * モバイル端末の場合は, 携帯端末IDを保存する. * ログインに失敗した場合は, false を返す. * * @param string $login_email ログインメールアドレス * @param string $login_pass ログインパスワード * @return boolean|null ログインに成功した場合 true; 失敗した場合 false */ public function doLogin($login_email, $login_pass) { switch (Application::alias('eccube.display')->detectDevice()) { case DEVICE_TYPE_MOBILE: if (!$this->getCustomerDataFromMobilePhoneIdPass($login_pass) && !$this->getCustomerDataFromEmailPass($login_pass, $login_email, true)) { return false; } else { // Session Fixation対策 SessionHelper::regenerateSID(); $this->updateMobilePhoneId(); return true; } break; case DEVICE_TYPE_SMARTPHONE: case DEVICE_TYPE_PC: default: if (!$this->getCustomerDataFromEmailPass($login_pass, $login_email)) { return false; } else { // Session Fixation対策 SessionHelper::regenerateSID(); return true; } break; } }
/** * ログイン情報セッション登録 * * @param integer $member_id メンバーID * @param string $login_id ログインID文字列 * @param integer $authority 権限ID * @param string $login_name ログイン表示名 * @param string $last_login 最終ログイン日時(YYYY/MM/DD HH:ii:ss形式) またはNULL * @return string $sid 設定したセッションのセッションID */ public function lfSetLoginSession($member_id, $login_id, $authority, $login_name, $last_login) { // Session Fixation対策 SessionHelper::regenerateSID(); $objSess = new Session(); // 認証済みの設定 $objSess->SetSession('cert', CERT_STRING); $objSess->SetSession('member_id', $member_id); $objSess->SetSession('login_id', $login_id); $objSess->SetSession('authority', $authority); $objSess->SetSession('login_name', $login_name); $objSess->SetSession('uniqid', $objSess->getUniqId()); if (Utils::isBlank($last_login)) { $objSess->SetSession('last_login', date('Y-m-d H:i:s')); } else { $objSess->SetSession('last_login', $last_login); } return $objSess->GetSID(); }
/** * トランザクショントークンを取得し, 設定する. * * @access protected * @return void */ public function setTokenTo() { $this->transactionid = SessionHelper::getToken(); }