Exemple #1
0
 /**
  * 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();
 }
Exemple #2
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;
 }
Exemple #3
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;
 }
 /**
  * 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);
     }
 }
Exemple #5
0
 /**
  * トランザクショントークンを取得する
  *
  * @return string
  */
 function getRefusalToken()
 {
     if (empty($_SESSION['refusal_transactionid'])) {
         $_SESSION['refusal_transactionid'] = SessionHelper::createToken();
     }
     return $_SESSION['refusal_transactionid'];
 }
Exemple #6
0
 /**
  * ログインを実行する.
  *
  * ログインを実行し, 成功した場合はユーザー情報をセッションに格納し,
  * 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;
     }
 }
Exemple #7
0
 /**
  * ログイン情報セッション登録
  *
  * @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();
 }