7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
\r
9 * @package Magic3 Framework
\r
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
\r
11 * @copyright Copyright 2006-2013 Magic3 Project.
\r
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
\r
13 * @version SVN: $Id: accessManager.php 6084 2013-06-06 12:58:33Z fishbone $
\r
14 * @link http://www.magic3.org
\r
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
\r
18 class AccessManager extends Core
\r
20 private $db; // DBオブジェクト
\r
21 private $_clientId; // クライアントID(クッキー用)
\r
22 private $_oldSessionId; // 古いセッションID
\r
23 private $_accessLogSerialNo; // アクセスログのシリアルNo
\r
24 private $_useAutoLogin; // 自動ログイン機能を使用するかどうか
\r
25 const LOG_REQUEST_PARAM_MAX_LENGTH = 1024; // ログに保存するリクエストパラメータの最大長
\r
26 const PASSWORD_LENGTH = 8; // パスワード長
\r
27 const SEND_PASSWORD_FORM = 'send_tmp_password'; // 仮パスワード送信用フォーム
\r
28 const TMP_PASSWORD_AVAILABLE_HOURS = 24; // 仮パスワード有効時間
\r
29 const CF_AUTO_LOGIN = 'auto_login'; // 自動ログイン機能を使用するかどうか
\r
30 const AUTO_LOGIN_EXPIRE_DAYS = 30; // 自動ログインの有効期間
\r
35 function __construct()
\r
38 parent::__construct();
\r
41 $this->db = $this->gInstance->getSytemDbObject();
\r
44 * アクセスログ初期化処理(直接呼出し用)
\r
48 function initAccessLog()
\r
50 if (empty($this->_accessLogSerialNo)) $this->accessLog();
\r
55 * ログイン処理を行う。可能な場合はユーザ情報を読み込む
\r
57 * @param RequestManager $request HTTPリクエスト処理クラス
\r
58 * @return bool true=アクセス可能、false=アクセス不可
\r
60 function userLogin($request)
\r
63 $account = $request->trimValueOf('account');
\r
64 $password = $request->trimValueOf('password');
\r
65 return $this->userLoginByAccount($account, $password);
\r
70 * ログイン処理を行う。可能な場合はユーザ情報を読み込む
\r
72 * @param string $account アカウント
\r
73 * @param string $password パスワード
\r
74 * @param bool $checkUser ユーザのアクセス権をチェックするかどうか
\r
75 * @return bool true=アクセス可能、false=アクセス不可
\r
77 function userLoginByAccount($account, $password, $checkUser=true)
\r
82 // アカウントが空のときはアクセス不可
\r
83 if (empty($account)) return false;
\r
86 if ($this->db->getLoginUserRecord($account, $row)){
\r
87 // ******** ユーザのログインチェック ********
\r
88 // ******** ログインのチェックを行うのはここだけ ********
\r
89 $checkLogin = false; // ログインが通ったかどうか
\r
90 $pass = $row['lu_password'];
\r
92 if ($pass == $password){
\r
93 $checkLogin = true; // パスワード一致
\r
95 // 仮パスワードが設定されている場合は仮パスワードをチェック
\r
96 $tmpPass = $row['lu_tmp_password']; // 仮パスワード
\r
97 $tmpPassDt = $row['lu_tmp_pwd_dt']; // 仮パスワード変更日時
\r
98 if (!empty($tmpPass) && $tmpPass == $password && $tmpPassDt != $this->gEnv->getInitValueOfTimestamp() &&
\r
99 strtotime('-' . self::TMP_PASSWORD_AVAILABLE_HOURS . ' hours') <= strtotime($tmpPassDt)){ // 仮パスワード有効のとき
\r
102 $fieldArray = array();
\r
103 $fieldArray['lu_tmp_password'] = ''; // 仮パスワード
\r
104 $fieldArray['lu_tmp_pwd_dt'] = $this->gEnv->getInitValueOfTimestamp(); // 仮パスワード変更日時
\r
105 $ret = $this->db->updateLoginUserByField($row['lu_id'], $fieldArray, $newSerial);
\r
107 $checkLogin = true; // パスワード一致
\r
111 if ($checkLogin){ // パスワード一致のとき
\r
113 $retValue = $this->_loadUserInfo($row, $checkUser);
\r
119 $this->gOpeLog->writeUserInfo(__METHOD__, 'ユーザがログインしました。アカウント: ' . $account, 2300,
\r
120 'account=' . $account . ', passward=' . $password . ', userid=' . $this->gEnv->getCurrentUserId(), 'account=' . $account/*検索補助データ*/);
\r
123 $this->gOpeLog->writeUserError(__METHOD__, 'ユーザがログインに失敗しました。アカウント: ' . $account, 2310,
\r
124 'account=' . $account . ', passward=' . $password, 'account=' . $account/*検索補助データ*/);
\r
127 //$this->db->addErrorLoginLog($account, $accessIp, $this->_accessLogSerialNo);
\r
134 * @param array $row ユーザのログインユーザ情報レコード
\r
135 * @param bool $checkUser ユーザのアクセス権のチェックを行うかどうか
\r
136 * @return bool true=成功、false=失敗
\r
138 function _loadUserInfo($row, $checkUser = true)
\r
140 global $gInstanceManager;
\r
141 global $gRequestManager;
\r
143 $now = date("Y/m/d H:i:s"); // 現在日時
\r
144 $accessIp = $gRequestManager->trimServerValueOf('REMOTE_ADDR'); // アクセスIP
\r
146 // ユーザチェックが必要な場合は承認済みユーザのみ許可する
\r
147 if (($checkUser && $row['lu_user_type'] >= 0 && $row['lu_enable_login'] &&
\r
148 $this->_isActive($row['lu_active_start_dt'], $row['lu_active_end_dt'], $now)) || // 承認済みユーザ、ログイン可能
\r
149 !$checkUser){ // ユーザのアクセス権をチェックしない場合
\r
151 // ログインした場合はセッションIDを変更する
\r
152 $this->setOldSessionId(session_id()); // 古いセッションIDを保存
\r
153 session_regenerate_id(true);
\r
156 $userInfo = new UserInfo();
\r
157 $userInfo->userId = $row['lu_id']; // ユーザID
\r
158 $userInfo->account = $row['lu_account']; // ユーザアカウント
\r
159 $userInfo->name = $row['lu_name']; // ユーザ名
\r
160 $userInfo->email = $row['lu_email']; // Eメール
\r
161 $userInfo->userType = $row['lu_user_type']; // ユーザタイプ
\r
162 $userInfo->userTypeOption = $row['lu_user_type_option']; // ユーザタイプオプション
\r
163 $userInfo->_recordSerial = $row['lu_serial']; // レコードシリアル番号
\r
165 // アクセス可能ウィジェット(システム運用者の場合)
\r
166 $userInfo->adminWidget = array();
\r
167 if ($userInfo->userType == UserInfo::USER_TYPE_MANAGER){ // システム運用可能ユーザのとき
\r
168 $adminWidget = trim($row['lu_admin_widget']);
\r
169 if (!empty($adminWidget)) $userInfo->adminWidget = explode(',', $adminWidget);
\r
172 // システム運用可能ユーザの場合は、管理者キーを発行(2011/9/16 修正)
\r
173 if ($userInfo->userType >= UserInfo::USER_TYPE_MANAGER){ // システム運用可能ユーザのとき
\r
174 $adminKey = $this->createAdminKey();
\r
175 if ($this->db->addAdminKey($adminKey, $accessIp)) $userInfo->_adminKey = $adminKey;
\r
177 $userInfo->_adminKey = '';
\r
180 // インスタンスマネージャーとセッションに保存
\r
181 $gInstanceManager->setUserInfo($userInfo);
\r
182 $gRequestManager->setSessionValueWithSerialize(M3_SESSION_USER_INFO, $userInfo);
\r
185 $this->db->updateLoginLog($userInfo->userId, $this->_accessLogSerialNo);
\r
194 * @return bool true=ログイン成功、false=ログイン不可
\r
196 function startAutoLogin()
\r
198 global $gSystemManager;
\r
199 global $gRequestManager;
\r
201 // 自動ログイン機能を使用するかどうか
\r
202 $value = $gSystemManager->getSystemConfig(self::CF_AUTO_LOGIN);
\r
203 $this->_useAutoLogin = isset($value) ? $value : '0';
\r
204 if (!$this->_useAutoLogin) return false;
\r
206 // ログイン中でない場合のみ自動ログイン処理を行う
\r
207 $userId = $this->gEnv->getCurrentUserId();
\r
208 if ($userId > 0) return false;
\r
210 // 自動ログイン処理。自動ログイン情報がある場合は自動ログインクッキーも存在する
\r
211 $loginKey = $gRequestManager->getCookieValue(M3_COOKIE_AUTO_LOGIN); // 自動ログインキー
\r
212 $clientId = $this->getClientId(); // クライアントID
\r
213 if (empty($loginKey) || empty($clientId)) return false; // 空の場合は問題なし
\r
214 $ret = $this->db->getAutoLogin($loginKey, $clientId, $row);
\r
215 if (!$ret){ // 自動ログイン情報がない場合は終了
\r
217 $this->_removeAutoLogin($loginKey);
\r
220 $errMsg = '不正な自動ログインを検出しました。ログインキー: ' . $loginKey;
\r
221 $msgDetail = 'クライアントID=' . $clientId;
\r
222 $this->gOpeLog->writeUserError(__METHOD__, $errMsg, 2310, $msgDetail);
\r
225 // 自動ログインの有効期間をチェック
\r
226 $expireDt = $row['ag_expire_dt'];
\r
227 $now = date("Y/m/d H:i:s"); // 現在日時
\r
228 if ($expireDt == $this->gEnv->getInitValueOfTimestamp() || strtotime($expireDt) < strtotime($now)){ // 期限切れのとき
\r
230 $this->_removeAutoLogin($loginKey);
\r
235 $ret = $this->db->getLoginUserRecordById($row['ag_user_id'], $userInfoRow);
\r
238 $this->_removeAutoLogin($loginKey);
\r
240 $errMsg = '自動ログインエラー(要因=ユーザ情報取得失敗)';
\r
241 $msgDetail = 'ユーザID=' . $row['ag_user_id'];
\r
242 $this->gOpeLog->writeError(__METHOD__, $errMsg, 1100, $msgDetail);
\r
246 // ユーザレベルをチェック。システム運用可能ユーザは自動ログイン不可。
\r
248 if ($userInfoRow['lu_user_type'] >= UserInfo::USER_TYPE_MANAGER) return false; // システム運用可能ユーザのとき
\r
251 $ret = $this->_loadUserInfo($userInfoRow);
\r
252 $userId = $userInfoRow['lu_id']; // ユーザID再取得
\r
253 $account = $userInfoRow['lu_account'];
\r
254 if ($ret){// ログイン成功
\r
256 $errMsg = 'ユーザが自動ログインしました。アカウント: ' . $account;
\r
257 $msgDetail = 'ログインキー=' . $loginKey . ', クライアントID=' . $clientId;
\r
258 $this->gOpeLog->writeUserInfo(__METHOD__, $errMsg, 2302/*自動ログイン*/, $msgDetail, 'account=' . $account/*検索補助データ*/);
\r
261 $this->_removeAutoLogin($loginKey);
\r
264 $errMsg = 'ユーザが自動ログインに失敗しました。アカウント: ' . $account;
\r
265 $msgDetail = 'ログインキー=' . $loginKey . ', クライアントID=' . $clientId;
\r
266 $this->gOpeLog->writeUserError(__METHOD__, $errMsg, 2310, $msgDetail, 'account=' . $account/*検索補助データ*/);
\r
270 $newLoginKey = md5($account . $clientId . time());
\r
271 $ret = $this->_createAutoLogin($newLoginKey, $userId, $clientId);
\r
273 $errMsg = '自動ログインエラー(要因=自動ログイン情報作成失敗)';
\r
274 $msgDetail = 'ログインキー=' . $newLoginKey . ',ユーザID=' . $userId . ',クライアントID=' . $clientId;
\r
275 $this->gOpeLog->writeError(__METHOD__, $errMsg, 1100, $msgDetail);
\r
282 * @return bool true=成功、false=失敗
\r
284 function endAutoLogin()
\r
286 if (!$this->_useAutoLogin) return;
\r
291 * @param int $userId ユーザID
\r
292 * @param bool $isAutoLogin true=自動ログイン開始、false=自動ログイン終了
\r
293 * @return bool true=自動ログイン完了、false=自動ログイン失敗
\r
295 function userAutoLogin($userId, $isAutoLogin)
\r
298 if (!$this->_useAutoLogin) return false;
\r
300 $clientId = $this->getClientId(); // クライアントID
\r
304 if ($userId <= 0) return false;
\r
305 if (empty($clientId)) return false;
\r
308 $userInfo = $this->gEnv->getCurrentUserInfo();
\r
310 // ユーザレベルをチェック。システム運用可能ユーザは自動ログイン不可。
\r
311 if ($userInfo->userType >= UserInfo::USER_TYPE_MANAGER) return false; // システム運用可能ユーザのとき
\r
314 $newLoginKey = md5($userInfo->account . $clientId . time());
\r
315 $ret = $this->_createAutoLogin($newLoginKey, $userId, $clientId);
\r
317 $errMsg = '自動ログインエラー(要因=自動ログイン情報作成失敗)';
\r
318 $msgDetail = 'ログインキー=' . $newLoginKey . ',ユーザID=' . $userId . ',クライアントID=' . $clientId;
\r
319 $this->gOpeLog->writeError(__METHOD__, $errMsg, 1100, $msgDetail);
\r
322 // クッキー削除は必ず行うため引数エラーチェックはしない
\r
324 $loginKey = $this->db->getAutoLoginKey($userId, $clientId);
\r
325 $ret = $this->_removeAutoLogin($loginKey);
\r
332 * @param string $loginKey ログインキー
\r
333 * @param int $userId ユーザID
\r
334 * @param string $clientId クライアントID
\r
335 * @return bool true=成功、false=失敗
\r
337 function _createAutoLogin($loginKey, $userId, $clientId)
\r
339 global $gRequestManager;
\r
342 //$gRequestManager->setCookieValue(M3_COOKIE_AUTO_LOGIN, '', -1); // 一旦削除
\r
343 $gRequestManager->setCookieValue(M3_COOKIE_AUTO_LOGIN, $loginKey, self::AUTO_LOGIN_EXPIRE_DAYS);
\r
346 $accessPath = $this->gEnv->getAccessPath();
\r
347 $expireDt = date("Y/m/d H:i:s", strtotime(self::AUTO_LOGIN_EXPIRE_DAYS . ' day'));
\r
348 $ret = $this->db->updateAutoLogin($userId, $loginKey, $clientId, $accessPath, $expireDt);
\r
354 * @param string $loginKey ログインキー
\r
355 * @return bool true=成功、false=失敗
\r
357 function _removeAutoLogin($loginKey)
\r
359 global $gRequestManager;
\r
362 $gRequestManager->setCookieValue(M3_COOKIE_AUTO_LOGIN, '', -1);
\r
365 $ret = $this->db->delAutoLogin($loginKey);
\r
371 * @param timestamp $startDt 公開開始日時
\r
372 * @param timestamp $endDt 公開終了日時
\r
373 * @param timestamp $now 基準日時
\r
374 * @return bool true=公開可能、false=公開不可
\r
376 function _isActive($startDt, $endDt, $now)
\r
378 $isActive = false; // 公開状態
\r
380 if ($startDt == $this->gEnv->getInitValueOfTimestamp() && $endDt == $this->gEnv->getInitValueOfTimestamp()){
\r
381 $isActive = true; // 公開状態
\r
382 } else if ($startDt == $this->gEnv->getInitValueOfTimestamp()){
\r
383 if (strtotime($now) < strtotime($endDt)) $isActive = true; // 公開状態
\r
384 } else if ($endDt == $this->gEnv->getInitValueOfTimestamp()){
\r
385 if (strtotime($now) >= strtotime($startDt)) $isActive = true; // 公開状態
\r
387 if (strtotime($startDt) <= strtotime($now) && strtotime($now) < strtotime($endDt)) $isActive = true; // 公開状態
\r
394 * @param bool $delSession セッションを削除するかどうか
\r
396 function userLogout($delSession = false)
\r
399 $userInfo = $this->gEnv->getCurrentUserInfo();
\r
401 // ##### 自動ログイン情報を削除 #####
\r
402 $this->userAutoLogin($userInfo->userId, false/*自動ログイン情報削除*/);
\r
405 if (!is_null($userInfo)){
\r
406 $this->gOpeLog->writeUserInfo(__METHOD__, 'ユーザがログアウトしました。アカウント: ' . $userInfo->account, 2301,
\r
407 'account=' . $userInfo->account . ', userid=' . $userInfo->userId, 'account=' . $userInfo->account/*検索補助データ*/);
\r
410 // ログアウトしたとき、管理者のセッション値は削除。一般ユーザの場合はログアウトしても残しておくセッション値があるので(テンプレート等)ユーザ情報のみ削除。
\r
413 // session_start();
\r
418 $this->gInstance->setUserInfo(null);
\r
427 function accessLog()
\r
429 global $gRequestManager;
\r
430 global $gEnvManager;
\r
431 global $gAccessManager;
\r
432 global $gInstanceManager;
\r
434 // ユーザ情報が存在しているときは、ユーザIDを登録する
\r
436 $userInfo = $gEnvManager->getCurrentUserInfo();
\r
437 if (!is_null($userInfo)){ // ユーザ情報がある場合
\r
438 $userId = $userInfo->userId;
\r
440 $cookieVal = isset($this->_clientId) ? $this->_clientId : ''; // アクセス管理用クッキー
\r
441 $session = session_id(); // セッションID
\r
442 //$ip = $gRequestManager->trimServerValueOf('REMOTE_ADDR'); // クライアントIP
\r
443 $ip = $this->_getClientIp($gRequestManager); // クライアントIP
\r
444 $method = $gRequestManager->trimServerValueOf('REQUEST_METHOD'); // アクセスメソッド
\r
445 $uri = $gRequestManager->trimServerValueOf('REQUEST_URI');
\r
446 $referer = $gRequestManager->trimServerValueOf('HTTP_REFERER');
\r
447 $agent = $gRequestManager->trimServerValueOf('HTTP_USER_AGENT'); // クライアントアプリケーション
\r
448 $language = $gRequestManager->trimServerValueOf('HTTP_ACCEPT_LANGUAGE'); // クライアント認識可能言語
\r
451 foreach ($_REQUEST as $strKey => $strValue ) {
\r
452 $request .= sprintf("%s=%s" . M3_TB, $strKey, $strValue); // タブ区切り
\r
454 $request = rtrim($request, M3_TB); // 最後のタブを消去
\r
455 $request = substr($request, 0, self::LOG_REQUEST_PARAM_MAX_LENGTH); // 格納長を制限
\r
458 $path = $gEnvManager->getAccessPath();
\r
461 $isCookie = !empty($_COOKIE); // クッキーがあるかどうか
\r
462 $isCrawler = false; // クローラかどうか
\r
464 // アクセスログのシリアルNoを保存
\r
465 $this->_accessLogSerialNo = $this->db->accessLog($userId, $cookieVal, $session, $ip, $method, $uri, $referer, $request, $agent, $language, $path, $isCookie, $isCrawler);
\r
468 if (M3_SYSTEM_REALTIME_ANALYTICS) $gInstanceManager->getAnalyzeManager()->realtimeAnalytics($this->_accessLogSerialNo, $cookieVal);
\r
473 * @param RequestManager $request HTTPリクエスト処理クラス
\r
474 * @return string IPアドレス
\r
476 function _getClientIp($request)
\r
478 $remoteIp = $request->trimServerValueOf('REMOTE_ADDR');
\r
479 $forwardedStr = $request->trimServerValueOf('HTTP_X_FORWARDED_FOR');
\r
480 if (empty($forwardedStr)) return $remoteIp;
\r
482 $candidateIpArray = array_reverse(explode(',', str_replace(' ', '', $forwardedStr) . ',' . $remoteIp));
\r
483 foreach ($candidateIpArray as $ip){
\r
484 if (!empty($ip) && !preg_match("/^(172\.(1[6-9]|2[0-9]|30|31)|192\.168|10|127)\./", $ip)) return $ip;
\r
495 function accessLogUser()
\r
497 global $gEnvManager;
\r
500 $userInfo = $gEnvManager->getCurrentUserInfo();
\r
501 if (!is_null($userInfo)){ // ユーザ情報がある場合
\r
502 $userId = $userInfo->userId;
\r
504 // ユーザ情報が存在しているときは、ユーザIDを登録する
\r
505 if ($userId != 0) $this->db->updateAccessLogUser($this->_accessLogSerialNo, $userId);
\r
508 * クッキーに保存するクライアントIDを生成
\r
510 function createClientId()
\r
512 global $gRequestManager;
\r
514 // アクセスログの最大シリアルNoを取得
\r
515 $max = $this->db->getMaxSerialOfAccessLog();
\r
516 $this->_clientId = md5(time() . $gRequestManager->trimServerValueOf('REMOTE_ADDR') . ($max + 1));
\r
517 return $this->_clientId; // クライアントID(クッキー用)
\r
520 * クッキーから取得したクライアントIDを設定
\r
522 * @param string $clientId クライアントID
\r
524 function setClientId($clientId)
\r
526 $this->_clientId = $clientId; // クライアントID(クッキー用)
\r
529 * クッキーから取得したクライアントIDを取得
\r
531 * @return string クライアントID
\r
533 function getClientId()
\r
535 return $this->_clientId; // クライアントID(クッキー用)
\r
540 function createAdminKey()
\r
542 global $gRequestManager;
\r
544 return md5($gRequestManager->trimServerValueOf('REMOTE_ADDR') . time());
\r
549 * @param string $sessionId セッションID
\r
551 function setOldSessionId($sessionId)
\r
553 $this->_oldSessionId = $sessionId;
\r
559 * @return int シリアルNo
\r
561 function getAccessLogSerialNo()
\r
563 return $this->_accessLogSerialNo;
\r
566 * システム管理者の認証が完了しているかどうか判断(フレームワーク以外のアクセス制御用)
\r
568 * @return bool true=完了、false=未完了
\r
570 function loginedByAdmin()
\r
572 global $gRequestManager;
\r
573 global $gSystemManager;
\r
576 session_cache_limiter('none'); // IE対策(暫定対応20070703)
\r
579 // セッションを再生成する(セキュリティ対策)
\r
580 if ($gSystemManager->regenerateSessionId()){
\r
581 $this->setOldSessionId(session_id()); // 古いセッションIDを保存
\r
582 session_regenerate_id(true);
\r
586 // セッションが残っていない場合がある(IEのみ)→アクセスできない(原因不明)
\r
587 $userInfo = $gRequestManager->getSessionValueWithSerialize(M3_SESSION_USER_INFO);
\r
588 if (is_null($userInfo)) return false; // ログインしていない場合
\r
590 if ($userInfo->isSystemAdmin()){ // システム管理者の場合
\r
597 * ユーザの認証が完了しているかどうか判断(フレームワーク以外のアクセス制御用)
\r
599 * @return bool true=完了、false=未完了
\r
601 function loginedByUser()
\r
603 global $gRequestManager;
\r
604 global $gSystemManager;
\r
605 global $gInstanceManager;
\r
608 session_cache_limiter('none'); // IE対策(暫定対応20070703)
\r
611 // セッションを再生成する(セキュリティ対策)
\r
612 if ($gSystemManager->regenerateSessionId()){
\r
613 $this->setOldSessionId(session_id()); // 古いセッションIDを保存
\r
614 session_regenerate_id(true);
\r
618 // セッションが残っていない場合がある(IEのみ)→アクセスできない(原因不明)
\r
619 $userInfo = $gRequestManager->getSessionValueWithSerialize(M3_SESSION_USER_INFO);
\r
620 if (is_null($userInfo)) return false; // ログインしていない場合
\r
623 $gInstanceManager->setUserInfo($userInfo);
\r
626 /*if ($userInfo->userType >= UserInfo::USER_TYPE_MANAGER){ // システム運用可能ユーザのとき
\r
633 * 管理者認証用一時キーが存在するかどうか
\r
635 * @return bool true=完了、false=未完了
\r
637 function isValidAdminKey()
\r
639 global $gRequestManager;
\r
640 static $isValidAdminKey;
\r
642 if (!isset($isValidAdminKey)){
\r
644 //$adminKey = $request->trimValueOf(M3_REQUEST_PARAM_ADMIN_KEY);
\r
645 $adminKey = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_ADMIN_KEY);
\r
646 if (empty($adminKey)){
\r
647 $isValidAdminKey = false;
\r
649 //$ret = $this->db->isValidAdminKey($adminKey, $request->trimServerValueOf('REMOTE_ADDR'));
\r
650 $isValidAdminKey = $this->db->isValidAdminKey($adminKey, $gRequestManager->trimServerValueOf('REMOTE_ADDR'));
\r
653 return $isValidAdminKey;
\r
656 * URL用のパラメータとして使用するセッションIDを取得
\r
658 * @return string セッションIDパラメータ文字列
\r
660 function getSessionIdUrlParam()
\r
662 return session_name() . '=' . session_id();
\r
667 * @param RequestManager $request HTTPリクエスト処理クラス
\r
668 * @return bool true=送信完了、false=送信失敗
\r
670 function sendPassword($request)
\r
672 global $gEnvManager;
\r
674 $account = $request->trimValueOf('account');
\r
675 $inputEmail = $request->trimValueOf('email'); // 送信先Eメール
\r
679 $errMessageDetail = '';
\r
680 if ($this->db->getLoginUserRecord($account, $row, true/*有効なユーザのみ*/)){ // アカウントからログインIDを取得
\r
681 $siteEmail = $gEnvManager->getSiteEmail();
\r
682 $email = $row['lu_email'];
\r
684 // 送信先Eメールアドレスをチェック
\r
685 if (!empty($inputEmail) && $inputEmail == $email){
\r
686 // 送信先が設定されているかチェック
\r
687 if (!empty($email) && !empty($siteEmail)){
\r
688 $now = date("Y/m/d H:i:s"); // 現在日時
\r
691 $password = makePassword(self::PASSWORD_LENGTH);
\r
694 $fieldArray = array();
\r
695 $fieldArray['lu_tmp_password'] = md5($password); // 仮パスワード
\r
696 $fieldArray['lu_tmp_pwd_dt'] = $now; // 仮パスワード変更日時
\r
697 $ret = $this->db->updateLoginUserByField($row['lu_id'], $fieldArray, $newSerial);
\r
699 $fromAddress = $siteEmail; // 送信元アドレス
\r
700 $toAddress = $email; // 送信先アドレス
\r
701 $mailParam = array();
\r
702 $mailParam['PASSWORD'] = $password;
\r
703 $ret = $this->gInstance->getMailManager()->sendFormMail(1/*自動送信*/, $this->gEnv->getCurrentWidgetId(), $toAddress, $fromAddress, '', '', self::SEND_PASSWORD_FORM, $mailParam);// 自動送信
\r
704 $isSend = true; // 送信完了
\r
707 $errMessageDetail = 'サイトEメールまたはアカウントの送信先Eメールが設定されていません。';
\r
710 $errMessage = '仮パスワード送信への不正なアクセスを検出しました。アカウント: ' . $account . ', Eメール: ' . $inputEmail;
\r
713 $errMessageDetail = '登録されていないアカウント、または、アカウントが承認済み、ログイン可、有効期間内になっていません。';
\r
716 $this->gOpeLog->writeUserInfo(__METHOD__, '仮パスワードを送信しました。アカウント: ' . $account, 2100);
\r
718 if (empty($errMessage)) $errMessage = '仮パスワード送信に失敗しました。アカウント: ' . $account;
\r
719 $this->gOpeLog->writeUserError(__METHOD__, $errMessage, 2200, $errMessageDetail);
\r