[Svn-src-all:1216] [version-2_5-dev 20104] #980 リファクタリング ([フロント]パスワードリマインダ―) の修正
AMUAMU
admin @ mail.ec-cube.net
2011年 2月 6日 (日) 22:31:40 JST
Subversion committed to /home/svn/open 20104
http://svn.ec-cube.net/open_trac/changeset/20104
┌────────────────────────────┐
│更新者 : AMUAMU │
│更新日時: 2011-02-06 22:31:40 +0900 (日, 06 2月 2011)│
└────────────────────────────┘
Log:
--------------------------------------------------------
#980 リファクタリング ([フロント]パスワードリマインダ―) の修正
Changed: [U:修正,A:追加,D:削除]
--------------------------------------------------------
U branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl
U branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php
変更: branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl
===================================================================
--- branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl 2011-02-06 08:26:43 UTC (rev 20103)
+++ branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl 2011-02-06 13:31:40 UTC (rev 20104)
@@ -27,7 +27,11 @@
※下記パスワードは、MYページの「会員登録内容変更」よりご変更いただけます。</p>
<form action="?" method="post" name="form1">
<div id="completebox">
- <p><em><!--{$temp_password}--></em></p>
+ <!--{if $smarty.const.FORGOT_MAIL != 1}-->
+ <p><em><!--{$arrForm.new_password}--></em></p>
+ <!--{else}-->
+ <p><em>ご登録メールアドレスに送付致しました。</em></p>
+ <!--{/if}-->
</div>
<div class="btn">
<a href="javascript:window.close()" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_close_on.gif','close');" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_close.gif','close');"><img src="<!--{$TPL_URLPATH}-->img/button/btn_close.gif" width="150" height="30" alt="閉じる" name="close" id="close" /></a>
変更: branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php 2011-02-06 08:26:43 UTC (rev 20103)
+++ branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php 2011-02-06 13:31:40 UTC (rev 20104)
@@ -62,8 +62,11 @@
$this->tpl_mainno = '';
$masterData = new SC_DB_MasterData_Ex();
$this->arrReminder = $masterData->getMasterData("mtb_reminder");
- $this->isMobile = Net_UserAgent_Mobile::isMobile();
+ $this->device_type = SC_Display::detectDevice();
$this->httpCacheControl('nocache');
+ // デフォルトログインアドレスロード
+ $objCookie = new SC_Cookie(COOKIE_EXPIRE);
+ $this->tpl_login_email = $objCookie->getCookie('login_email');
}
/**
@@ -82,167 +85,177 @@
* @return void
*/
function action() {
- $objQuery = new SC_Query();
-
+ // 不正アクセスチェック
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!SC_Helper_Session_Ex::isValidToken()) {
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
}
}
+
+ // パラメータ管理クラス
+ $objFormParam = new SC_FormParam();
+
switch($this->getMode()) {
case 'mail_check':
- $this->lfForgotMailCheck();
+ $this->lfInitMailCheckParam($objFormParam, $this->device_type);
+ $objFormParam->setParam($_POST);
+ $objFormParam->convParam();
+ $objFormParam->toLower('email');
+ $this->arrForm = $objFormParam->getHashArray();
+ $this->arrErr = $objFormParam->checkError();
+ if (SC_Utils_Ex::isBlank($this->arrErr)) {
+ $this->errmsg = $this->lfCheckForgotMail($this->arrForm, $this->arrReminder);
+ if(SC_Utils_Ex::isBlank($this->errmsg)) {
+ $this->tpl_mainpage = 'forgot/secret.tpl';
+ }
+ }
break;
case 'secret_check':
- $this->lfForgotSecretCheck();
+ $this->lfInitSecretCheckParam($objFormParam, $this->device_type);
+ $objFormParam->setParam($_POST);
+ $objFormParam->convParam();
+ $objFormParam->toLower('email');
+ $this->arrForm = $objFormParam->getHashArray();
+ $this->arrErr = $objFormParam->checkError();
+ if (SC_Utils_Ex::isBlank($this->arrErr)) {
+ $this->errmsg = $this->lfCheckForgotSecret($this->arrForm, $this->arrReminder);
+ if(SC_Utils_Ex::isBlank($this->errmsg)) {
+ // 完了ページへ移動する
+ $this->tpl_mainpage = 'forgot/complete.tpl';
+ // transactionidを更新させたいので呼び出し元(ログインフォーム側)をリロード。
+ $this->tpl_onload .= 'opener.location.reload(true);';
+ }else{
+ // 秘密の答えが一致しなかった
+ $this->tpl_mainpage = 'forgot/secret.tpl';
+ }
+ }else{
+ // 入力値エラー
+ $this->tpl_mainpage = 'forgot/secret.tpl';
+ }
break;
default:
- $this->lfForgotDefault();
break;
}
$this->transactionid = SC_Helper_Session_Ex::getToken();
-
- if ($this->isMobile) {
- // モバイルサイトの場合はトークン生成
- $this->createMobileToken();
- } else {
- // モバイルサイト以外の場合、ポップアップ用テンプレートファイル設定
+
+ // ポップアップ用テンプレート設定
+ if($this->device_type == DEVICE_TYPE_PC) {
$this->setTemplate($this->tpl_mainpage);
}
}
- // 最初に開いた時の処理(メールアドレス入力画面)
- function lfForgotDefault() {
- // クッキー管理クラス
- $objCookie = new SC_Cookie(COOKIE_EXPIRE);
- $this->tpl_login_email = $objCookie->getCookie('login_email');
- }
-
- // メールアドレス確認(秘密の質問入力画面)
- function lfForgotMailCheck() {
- // パラメータ管理クラス,パラメータ情報の初期化
- $this->objFormParam = new SC_FormParam();
- $this->lfMailCheckInitParam();
- // POST値の取得
- $this->objFormParam->setParam($_POST);
- $this->objFormParam->convParam();
- $this->objFormParam->toLower('email');
- $this->arrForm = $this->objFormParam->getHashArray();
- //エラーチェック
- $this->arrErr = $this->lfMailCheckErrorCheck();
- if (count($this->arrErr) == 0) {
- $email = $this->arrForm['email'];
- $objQuery =& SC_Query::getSingletonInstance();
- $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0";
- $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']);
- $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal);
- if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']])) {
- if($result[0]['status'] == '2') {
- // 有効な情報であるため、秘密の質問確認へ遷移
- $this->tpl_mainpage = 'forgot/secret.tpl';
- $this->arrForm['reminder'] = $result[0]['reminder'];
- } else if ($result[0]['status'] == '1') {
- $this->errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。';
- }
- } else {
- $this->errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。';
+ /**
+ * メールアドレス・名前確認
+ *
+ * @param array $arrForm フォーム入力値
+ * @param array $arrReminder リマインダー質問リスト
+ * @return string エラー文字列 問題が無ければNULL
+ */
+ function lfCheckForgotMail(&$arrForm, &$arrReminder) {
+ $errmsg = NULL;
+ $objQuery =& SC_Query::getSingletonInstance();
+ $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0";
+ $arrVal = array($arrForm['email'], $arrForm['email'], $arrForm['name01'], $arrForm['name02']);
+ $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal);
+ if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])) {
+ // 会員状態の確認
+ if($result[0]['status'] == '2') {
+ // 正会員
+ $arrForm['reminder'] = $result[0]['reminder'];
+ } else if ($result[0]['status'] == '1') {
+ // 仮会員
+ $errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。';
}
+ } else {
+ $errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。';
}
+ return $errmsg;
}
-
- // メールアドレス確認におけるエラーチェック
- function lfMailCheckErrorCheck() {
- // 入力データを渡す
- $arrRet = $this->objFormParam->getHashArray();
- $objErr = new SC_CheckError($arrRet);
- $objErr->arrErr = $this->objFormParam->checkError();
- return $objErr->arrErr;
- }
-
- // メールアドレス確認におけるパラメーター情報の初期化
- function lfMailCheckInitParam() {
- $this->objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
- $this->objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
- if ($this->isMobile == false){
- $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
+
+ /**
+ * メールアドレス確認におけるパラメーター情報の初期化
+ *
+ * @param array $objFormParam フォームパラメータークラス
+ * @param array $device_type デバイスタイプ
+ * @return void
+ */
+ function lfInitMailCheckParam(&$objFormParam, $device_type) {
+ $objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
+ $objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
+ if ($device_type === DEVICE_TYPE_MOBILE){
+ $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK"));
} else {
- $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK"));
+ $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
}
-
+ return;
}
- // 秘密の質問確認
- function lfForgotSecretCheck() {
- // パラメータ管理クラス,パラメータ情報の初期化
- $this->objFormParam = new SC_FormParam();
- $this->lfSecretCheckInitParam();
- // POST値の取得
- $this->objFormParam->setParam($_POST);
- $this->objFormParam->convParam();
- $this->objFormParam->toLower('email');
- $this->arrForm = $this->objFormParam->getHashArray();
- //エラーチェック
- $this->arrErr = $this->lfSecretCheckErrorCheck();
- if (count($this->arrErr) == 0) {
- $email = $this->arrForm['email'];
- $objQuery =& SC_Query::getSingletonInstance();
- $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND status = 2 AND del_flg = 0";
- $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']);
- $result = $objQuery->select("customer_id, reminder, reminder_answer, salt", "dtb_customer", $where, $arrVal);
- if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']])
- and $result[0]['reminder'] == $this->arrForm['reminder']) {
-
- if (SC_Utils_Ex::sfIsMatchHashPassword($this->arrForm['reminder_answer'], $result[0]['reminder_answer'], $result[0]['salt'])) {
- // 秘密の答えが一致
- // 新しいパスワードを設定する
- $this->temp_password = GC_Utils_Ex::gfMakePassword(8);
-
- if(FORGOT_MAIL == 1) {
- // メールで変更通知をする
- $objDb = new SC_Helper_DB_Ex();
- $CONF = $objDb->sfGetBasisData();
- $this->lfSendMail($CONF, $this->arrForm['email'], $this->arrForm['name01'], $this->temp_password);
- }
- $sqlval = array();
- $sqlval['password'] = $this->temp_password;
- SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
-
- // 完了ページへ移動する
- $this->tpl_mainpage = 'forgot/complete.tpl';
- // transactionidの都合で呼び出し元をリロード。
- $this->tpl_onload .= 'opener.location.reload(true);';
- } else {
- // 秘密の答えが一致しなかった
- $this->tpl_mainpage = 'forgot/secret.tpl';
- $this->errmsg = '秘密の質問が一致しませんでした。';
+ /**
+ * 秘密の質問確認
+ *
+ * @param array $arrForm フォーム入力値
+ * @param array $arrReminder リマインダー質問リスト
+ * @return string エラー文字列 問題が無ければNULL
+ */
+ function lfCheckForgotSecret(&$arrForm, &$arrReminder) {
+ $errmsg = '';
+ $objQuery =& SC_Query::getSingletonInstance();
+ $cols = "customer_id, reminder, reminder_answer, salt";
+ $table = "dtb_customer";
+ $where = "(email Like ? OR email_mobile Like ?)"
+ . " AND name01 Like ? AND name02 Like ?"
+ . " AND status = 2 AND del_flg = 0";
+ $arrVal = array($arrForm['email'], $arrForm['email'],
+ $arrForm['name01'], $arrForm['name02']);
+ $result = $objQuery->select($cols, $table, $where, $arrVal);
+ if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])
+ and $result[0]['reminder'] == $arrForm['reminder']) {
+
+ if (SC_Utils_Ex::sfIsMatchHashPassword($arrForm['reminder_answer'],
+ $result[0]['reminder_answer'], $result[0]['salt'])) {
+ // 秘密の答えが一致
+ // 新しいパスワードを設定する
+ $new_password = GC_Utils_Ex::gfMakePassword(8);
+ if(FORGOT_MAIL == 1) {
+ // メールで変更通知をする
+ $objDb = new SC_Helper_DB_Ex();
+ $CONF = $objDb->sfGetBasisData();
+ $this->lfSendMail($CONF, $arrForm['email'], $arrForm['name01'], $new_password);
}
+ $sqlval = array();
+ $sqlval['password'] = $new_password;
+ SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
+ $arrForm['new_password'] = $new_password;
} else {
- //不正なアクセス
- SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
+ // 秘密の答えが一致しなかった
+ $errmsg = '秘密の質問が一致しませんでした。';
}
} else {
- $this->tpl_mainpage = 'forgot/secret.tpl';
+ //不正なアクセス リマインダー値が前画面と異なる。
+ // 新リファクタリング基準ではここで遷移は不許可なのでエラー表示
+ //SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
+ $errmsg = '秘密の質問が一致しませんでした。';
}
+ return $errmsg;
}
- function lfSecretCheckInitParam() {
+ /**
+ * 秘密の質問確認におけるパラメーター情報の初期化
+ *
+ * @param array $objFormParam フォームパラメータークラス
+ * @param array $device_type デバイスタイプ
+ * @return void
+ */
+ function lfInitSecretCheckParam(&$objFormParam, $device_type) {
// メールチェックと同等のチェックを再度行う
- $this->lfMailCheckInitParam();
+ $this->lfInitMailCheckParam($objFormParam, $device_type);
// 秘密の質問チェックの追加
- $this->objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK"));
- $this->objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK","SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
+ $objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK"));
+ $objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
+ return;
}
- // 秘密の答え確認におけるエラーチェック
- function lfSecretCheckErrorCheck() {
- // 入力データを渡す
- $arrRet = $this->objFormParam->getHashArray();
- $objErr = new SC_CheckError($arrRet);
- $objErr->arrErr = $this->objFormParam->checkError();
- return $objErr->arrErr;
- }
-
/**
* デストラクタ.
*
@@ -258,52 +271,32 @@
* @param array $CONF 店舗基本情報の配列
* @param string $email 送信先メールアドレス
* @param string $customer_name 送信先氏名
- * @param string $temp_password 変更後のパスワード
+ * @param string $new_password 変更後の新パスワード
* @return void
*
- * FIXME: メールテンプレート編集の方に足すのが望ましい?
+ * FIXME: メールテンプレート編集の方に足すのが望ましい
*/
- function lfSendMail($CONF, $email, $customer_name, $temp_password){
- // パスワード変更お知らせメール送信
- $this->customer_name = $customer_name;
- $this->temp_password = $temp_password;
+ function lfSendMail(&$CONF, $email, $customer_name, $new_password){
+ // パスワード変更お知らせメール送信
$objMailText = new SC_SiteView(false);
- $objMailText->assignobj($this);
-
+ $objMailText->assign('customer_name', $customer_name);
+ $objMailText->assign('new_password', $new_password);
$toCustomerMail = $objMailText->fetch("mail_templates/forgot_mail.tpl");
+ // メール送信オブジェクトによる送信処理
$objMail = new SC_SendMail();
-
$objMail->setItem(
- '' // 宛先
- , "パスワードが変更されました" ."【" .$CONF["shop_name"]. "】" // サブジェクト
- , $toCustomerMail // 本文
- , $CONF["email03"] // 配送元アドレス
- , $CONF["shop_name"] // 配送元 名前
- , $CONF["email03"] // reply_to
- , $CONF["email04"] // return_path
- , $CONF["email04"] // Errors_to
-
- );
+ '' //宛先
+ , $toCustomerMail //本文
+ , $CONF['email03'] //配送元アドレス
+ , $CONF['shop_name'] // 配送元名
+ , $CONF['email03'] // reply to
+ , $CONF['email04'] //return_path
+ , $CONF['email04'] // errors_to
+ );
$objMail->setTo($email, $customer_name ." 様");
$objMail->sendMail();
+ return;
}
- /**
- * モバイル空メール用のトークン作成
- *
- * @return void
- *
- * FIXME: この処理の有効性が不明
- */
- function createMobileToken() {
- $objMobile = new SC_Helper_Mobile_Ex();
- // 空メール用のトークンを作成。
- if (MOBILE_USE_KARA_MAIL) {
- $token = $objMobile->gfPrepareKaraMail('forgot/' . DIR_INDEX_PATH);
- if ($token !== false) {
- $objPage->tpl_kara_mail_to = MOBILE_KARA_MAIL_ADDRESS_USER . MOBILE_KARA_MAIL_ADDRESS_DELIMITER . 'forgot_' . $token . '@' . MOBILE_KARA_MAIL_ADDRESS_DOMAIN;
- }
- }
- }
}
?>
Svn-src-all メーリングリストの案内