source: branches/version-2_12-dev/data/class/pages/forgot/LC_Page_Forgot.php @ 21982

Revision 21982, 12.4 KB checked in by Seasoft, 9 years ago (diff)

#1901 (COOKIE_EXPIRE を設定変更しても反映されないページがある)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2012 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once CLASS_EX_REALDIR . 'page_extends/LC_Page_Ex.php';
26
27/**
28 * パスワード発行 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Forgot extends LC_Page_Ex {
35
36    // {{{ properties
37
38    /** フォームパラメーターの配列 */
39    var $objFormParam;
40
41    /** 秘密の質問の答え */
42    var $arrReminder;
43
44    /** 変更後パスワード */
45    var $temp_password;
46
47    /** エラーメッセージ */
48    var $errmsg;
49
50    // }}}
51    // {{{ functions
52
53    /**
54     * Page を初期化する.
55     *
56     * @return void
57     */
58    function init() {
59        parent::init();
60        $this->tpl_title = 'パスワードを忘れた方';
61        $this->tpl_mainpage = 'forgot/index.tpl';
62        $this->tpl_mainno = '';
63        $masterData = new SC_DB_MasterData_Ex();
64        $this->arrReminder = $masterData->getMasterData('mtb_reminder');
65        $this->device_type = SC_Display_Ex::detectDevice();
66        $this->httpCacheControl('nocache');
67        // デフォルトログインアドレスロード
68        $objCookie = new SC_Cookie_Ex();
69        $this->tpl_login_email = $objCookie->getCookie('login_email');
70    }
71
72    /**
73     * Page のプロセス.
74     *
75     * @return void
76     */
77    function process() {
78        parent::process();
79        $this->action();
80        $this->sendResponse();
81    }
82
83    /**
84     * Page のアクション.
85     *
86     * @return void
87     */
88    function action() {
89
90        // パラメーター管理クラス
91        $objFormParam = new SC_FormParam_Ex();
92
93        switch ($this->getMode()) {
94            case 'mail_check':
95                $this->lfInitMailCheckParam($objFormParam, $this->device_type);
96                $objFormParam->setParam($_POST);
97                $objFormParam->convParam();
98                $objFormParam->toLower('email');
99                $this->arrForm = $objFormParam->getHashArray();
100                $this->arrErr = $objFormParam->checkError();
101                if (SC_Utils_Ex::isBlank($this->arrErr)) {
102                    $this->errmsg = $this->lfCheckForgotMail($this->arrForm, $this->arrReminder);
103                    if (SC_Utils_Ex::isBlank($this->errmsg)) {
104                        $this->tpl_mainpage = 'forgot/secret.tpl';
105                    }
106                }
107                break;
108            case 'secret_check':
109                $this->lfInitSecretCheckParam($objFormParam, $this->device_type);
110                $objFormParam->setParam($_POST);
111                $objFormParam->convParam();
112                $objFormParam->toLower('email');
113                $this->arrForm = $objFormParam->getHashArray();
114                $this->arrErr = $objFormParam->checkError();
115                if (SC_Utils_Ex::isBlank($this->arrErr)) {
116                    $this->errmsg = $this->lfCheckForgotSecret($this->arrForm, $this->arrReminder);
117                    if (SC_Utils_Ex::isBlank($this->errmsg)) {
118                        // 完了ページへ移動する
119                        $this->tpl_mainpage = 'forgot/complete.tpl';
120                        // transactionidを更新させたいので呼び出し元(ログインフォーム側)をリロード。
121                        $this->tpl_onload .= 'opener.location.reload(true);';
122                    } else {
123                        // 秘密の答えが一致しなかった
124                        $this->tpl_mainpage = 'forgot/secret.tpl';
125                    }
126                } else {
127                    // 入力値エラー
128                    $this->tpl_mainpage = 'forgot/secret.tpl';
129                }
130                break;
131            default:
132                break;
133        }
134
135        // ポップアップ用テンプレート設定
136        if ($this->device_type == DEVICE_TYPE_PC) {
137            $this->setTemplate($this->tpl_mainpage);
138        }
139
140    }
141
142    /**
143     * メールアドレス・名前確認
144     *
145     * @param array $arrForm フォーム入力値
146     * @param array $arrReminder リマインダー質問リスト
147     * @return string エラー文字列 問題が無ければNULL
148     */
149    function lfCheckForgotMail(&$arrForm, &$arrReminder) {
150        $errmsg = NULL;
151        $objQuery =& SC_Query_Ex::getSingletonInstance();
152        $where = '(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0';
153        $arrVal = array($arrForm['email'], $arrForm['email'], $arrForm['name01'], $arrForm['name02']);
154        $result = $objQuery->select('reminder, status', 'dtb_customer', $where, $arrVal);
155        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])) {
156            // 会員状態の確認
157            if ($result[0]['status'] == '2') {
158                // 正会員
159                $arrForm['reminder'] = $result[0]['reminder'];
160            } else if ($result[0]['status'] == '1') {
161                // 仮会員
162                $errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。';
163            }
164        } else {
165            $errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。';
166        }
167        return $errmsg;
168    }
169
170    /**
171     * メールアドレス確認におけるパラメーター情報の初期化
172     *
173     * @param array $objFormParam フォームパラメータークラス
174     * @param array $device_type デバイスタイプ
175     * @return void
176     */
177    function lfInitMailCheckParam(&$objFormParam, $device_type) {
178        $objFormParam->addParam('お名前(姓)', 'name01', STEXT_LEN, 'aKV', array('EXIST_CHECK', 'NO_SPTAB', 'SPTAB_CHECK' ,'MAX_LENGTH_CHECK'));
179        $objFormParam->addParam('お名前(名)', 'name02', STEXT_LEN, 'aKV', array('EXIST_CHECK', 'NO_SPTAB', 'SPTAB_CHECK' , 'MAX_LENGTH_CHECK'));
180        if ($device_type === DEVICE_TYPE_MOBILE) {
181            $objFormParam->addParam('メールアドレス', 'email', null, 'a', array('EXIST_CHECK', 'EMAIL_CHECK', 'NO_SPTAB' ,'EMAIL_CHAR_CHECK', 'MOBILE_EMAIL_CHECK'));
182        } else {
183            $objFormParam->addParam('メールアドレス', 'email', null, 'a', array('NO_SPTAB', 'EXIST_CHECK', 'EMAIL_CHECK', 'SPTAB_CHECK' ,'EMAIL_CHAR_CHECK'));
184        }
185        return;
186    }
187
188    /**
189     * 秘密の質問確認
190     *
191     * @param array $arrForm フォーム入力値
192     * @param array $arrReminder リマインダー質問リスト
193     * @return string エラー文字列 問題が無ければNULL
194     */
195    function lfCheckForgotSecret(&$arrForm, &$arrReminder) {
196        $errmsg = '';
197        $objQuery =& SC_Query_Ex::getSingletonInstance();
198        $cols = 'customer_id, reminder, reminder_answer, salt';
199        $table = 'dtb_customer';
200        $where = '(email Like ? OR email_mobile Like ?)'
201                    . ' AND name01 Like ? AND name02 Like ?'
202                    . ' AND status = 2 AND del_flg = 0';
203        $arrVal = array($arrForm['email'], $arrForm['email'],
204                            $arrForm['name01'], $arrForm['name02']);
205        $result = $objQuery->select($cols, $table, $where, $arrVal);
206        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])
207                and $result[0]['reminder'] == $arrForm['reminder']) {
208
209            $is_authorized = false;
210            if (empty($result[0]['salt'])) {
211                // 旧バージョン(2.11未満)からの移行を考慮
212                if ($result[0]['reminder_answer'] == $arrForm['reminder_answer']) {
213                    $is_authorized = true;
214                }
215            }
216            elseif (SC_Utils_Ex::sfIsMatchHashPassword($arrForm['reminder_answer'],
217                    $result[0]['reminder_answer'], $result[0]['salt'])) {
218                $is_authorized = true;
219            }
220
221            if ($is_authorized) {
222                // 秘密の答えが一致
223                // 新しいパスワードを設定する
224                $new_password = GC_Utils_Ex::gfMakePassword(8);
225                if (FORGOT_MAIL == 1) {
226                    // メールで変更通知をする
227                    $objDb = new SC_Helper_DB_Ex();
228                    $CONF = $objDb->sfGetBasisData();
229                    $this->lfSendMail($CONF, $arrForm['email'], $arrForm['name01'], $new_password);
230                }
231                $sqlval = array();
232                $sqlval['password'] = $new_password;
233                SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
234                $arrForm['new_password'] = $new_password;
235            } else {
236                // 秘密の答えが一致しなかった
237                $errmsg = '秘密の質問が一致しませんでした。';
238            }
239        } else {
240            //不正なアクセス リマインダー値が前画面と異なる。
241            // 新リファクタリング基準ではここで遷移は不許可なのでエラー表示
242            //SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
243            $errmsg = '秘密の質問が一致しませんでした。';
244        }
245        return $errmsg;
246    }
247
248    /**
249     * 秘密の質問確認におけるパラメーター情報の初期化
250     *
251     * @param array $objFormParam フォームパラメータークラス
252     * @param array $device_type デバイスタイプ
253     * @return void
254     */
255    function lfInitSecretCheckParam(&$objFormParam, $device_type) {
256        // メールチェックと同等のチェックを再度行う
257        $this->lfInitMailCheckParam($objFormParam, $device_type);
258        // 秘密の質問チェックの追加
259        $objFormParam->addParam('パスワード確認用の質問', 'reminder', STEXT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK'));
260        $objFormParam->addParam('パスワード確認用の質問の答え', 'reminder_answer', STEXT_LEN, 'aKV', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
261        return;
262    }
263
264    /**
265     * デストラクタ.
266     *
267     * @return void
268     */
269    function destroy() {
270        parent::destroy();
271    }
272
273    /**
274     * パスワード変更お知らせメールを送信する.
275     *
276     * @param array $CONF 店舗基本情報の配列
277     * @param string $email 送信先メールアドレス
278     * @param string $customer_name 送信先氏名
279     * @param string $new_password 変更後の新パスワード
280     * @return void
281     *
282     * FIXME: メールテンプレート編集の方に足すのが望ましい
283     */
284    function lfSendMail(&$CONF, $email, $customer_name, $new_password) {
285        // パスワード変更お知らせメール送信
286        $objMailText = new SC_SiteView_Ex(false);
287        $objMailText->setPage($this);
288        $objMailText->assign('customer_name', $customer_name);
289        $objMailText->assign('new_password', $new_password);
290        $toCustomerMail = $objMailText->fetch('mail_templates/forgot_mail.tpl');
291
292        $objHelperMail = new SC_Helper_Mail_Ex();
293        $objHelperMail->setPage($this);
294
295        // メール送信オブジェクトによる送信処理
296        $objMail = new SC_SendMail_Ex();
297        $objMail->setItem(
298            '' //宛先
299            , $objHelperMail->sfMakeSubject('パスワードを変更いたしました。')
300            , $toCustomerMail //本文
301            , $CONF['email03'] //配送元アドレス
302            , $CONF['shop_name'] // 配送元名
303            , $CONF['email03'] // reply to
304            , $CONF['email04'] //return_path
305            , $CONF['email04'] // errors_to
306            );
307        $objMail->setTo($email, $customer_name . ' 様');
308        $objMail->sendMail();
309        return;
310    }
311
312}
Note: See TracBrowser for help on using the repository browser.