Issue 1816 , Supplementation revision not to login failure every time the member sign in.

- Administrator can set, to use the function or not.
- A member will not get 'Sign in Failure Report' every time. - The reports would be send when the number of failures is over the limit of the login blocking setting.
- The 'Sign in Failure Report mail' will be send with 'Administrator mail address', not with the member's mail address, to the member's mail address.

git-svn-id: http://xe-core.googlecode.com/svn/branches/maserati@11600 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
misol 2012-10-07 11:40:46 +00:00
parent 79095100b7
commit 2275c779f1
4 changed files with 62 additions and 37 deletions

View file

@ -2491,18 +2491,23 @@ Bạn có thể quản lý thành viên bằng cách tạo những nhóm mới,
<value xml:lang="en"><![CDATA[Group]]></value>
</item>
<item name="retrieve_password">
<value xml:lang="ko"><![CDATA[비밀번호 찾기]]></value>
<value xml:lang="en"><![CDATA[Retrieve password]]></value>
</item>
<item name="excess_ip_access_count">
<value xml:lang="ko"><![CDATA[로그인 가능 횟수를 초과하셨습니다. %s 간 로그인 하실 수 없습니다.]]></value>
<value xml:lang="en"><![CDATA[There was too much sign in trial from your devices in a short time. You can not sign in for %s.]]></value>
</item>
<item name="enable_login_fail_report">
<value xml:lang="ko"><![CDATA[계정 무한 대입 방지 사용]]></value>
<value xml:lang="en"><![CDATA[Sign in failure]]></value>
</item>
<item name="login_fail_report">
<value xml:lang="ko"><![CDATA[로그인 실패 기록 보고 입니다.]]></value>
<value xml:lang="en"><![CDATA[Sign in failure report.]]></value>
</item>
<item name="login_fail_report_contents">
<value xml:lang="ko"><![CDATA[<h2>확인하지 않은 로그인 실패 기록이 있습니다.</h2><div>%1$s</div><p>* 이 알림은 한번만 보입니다.<br />* 이 메시지는 쪽지와 이메일로 발송됩니다.<br />* 이 메시지는 로그인이 성공한 순간, 로그인 성공 이전 실패 기록을 모아서 발송합니다.<br />발송 시각: %2$s</p>]]></value>
<value xml:lang="en"><![CDATA[<h2>There is unfolded sign in failure report</h2><div>%1$s</div><p>* This notification is shown once.<br />* This message will be send to your email and message.<br />* This message contains sign in failure records, before a ID sign in success.<br />Sending: %2$s</p>]]></value>
<value xml:lang="ko"><![CDATA[<h2>로그인 실패 기록을 알려드립니다.</h2><div>%1$s</div><p>* 비밀번호를 틀리는 등의 일이 없었는데 이 메시지를 보신다면, 계정 관리에 유의해주시기 바랍니다.<br />* 이 메시지는 로그인이 성공한 순간 누적 로그인 실패 기록이 많을 경우, 로그인 성공 이전 실패 기록을 모아서 발송합니다.<br />발송 시각: %2$s</p>]]></value>
<value xml:lang="en"><![CDATA[<h2>There is recorded sign in failures.</h2><div>%1$s</div><p>* This notification is shown once.<br />* This message contains sign in failure records, before a ID sign in success.<br />Sending: %2$s</p>]]></value>
</item>
</lang>

View file

@ -355,19 +355,20 @@
function recordLoginError($error = 0, $message = 'success')
{
if($error == 0) return new Object($error, $message);
// Create a member model object
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
// Check if there is recoding table.
$oDB = &DB::getInstance();
if(!$oDB->isTableExists('member_login_count')) return new Object($error, $message);
if(!$oDB->isTableExists('member_login_count') || $config->enable_login_fail_report == 'N') return new Object($error, $message);
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$output = executeQuery('member.getLoginCountByIp', $args);
if($output->data && $output->data->count)
{
// Create a member model object
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
$last_update = strtotime($output->data->last_update);
$term = intval(time()-$last_update);
//update, if IP address access in a short time, update count. If not, make count 1.
@ -398,10 +399,14 @@
function recordMemberLoginError($error = 0, $message = 'success', $args = NULL)
{
if($error == 0 || !$args->member_srl) return new Object($error, $message);
// Create a member model object
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
// Check if there is recoding table.
$oDB = &DB::getInstance();
if(!$oDB->isTableExists('member_count_history')) return new Object($error, $message);
if(!$oDB->isTableExists('member_count_history') || $config->enable_login_fail_report == 'N') return new Object($error, $message);
$output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args);
if($output->data && $output->data->content)

View file

@ -1555,37 +1555,45 @@
// Update the latest login time
$args->member_srl = $this->memberInfo->member_srl;
$output = executeQuery('member.updateLastLogin', $args);
// check if there is login fail records.
$output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args);
if($output->data && $output->data->content)
{
$title = Context::getLang('login_fail_report');
$message = '<ul>';
$content = unserialize($output->data->content);
foreach($content as $val)
{
$message .= '<li>'.date('Y-m-d H:i:s P',$val[2]).'<br /> Access IP: '.$val[0].'<br /> Message: '.$val[1].'</li>';
}
$message .= '</ul>';
$content = sprintf(Context::getLang('login_fail_report_contents'),$message,date('Y-m-d H:i:s P'));
//send message
$oCommunicationController = &getController('communication');
$oCommunicationController->sendMessage($args->member_srl, $args->member_srl, $title, $content, true);
if($this->memberInfo->email_address && $this->memberInfo->allow_mailing == 'Y')
// Check if there is recoding table.
$oDB = &DB::getInstance();
if($oDB->isTableExists('member_count_history') && $config->enable_login_fail_report != 'N')
{
// check if there is login fail records.
$output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args);
if($output->data && $output->data->content)
{
$view_url = Context::getRequestUri();
$title = sprintf("%s @ %s",$title,$view_url);
$content = sprintf("%s<hr /><p>From: <a href=\"%s\" target=\"_blank\">%s</a><br />To: %s(%s)</p>",$content, $view_url, $view_url, $this->memberInfo->nick_name, $this->memberInfo->email_id);
$oMail = new Mail();
$oMail->setTitle($title);
$oMail->setContent($content);
$oMail->setSender($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address);
$oMail->setReceiptor($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address);
$oMail->send();
$title = Context::getLang('login_fail_report');
$message = '<ul>';
$content = unserialize($output->data->content);
if(count($content) > $config->max_error_count)
{
foreach($content as $val)
{
$message .= '<li>'.date('Y-m-d H:i:s P',$val[2]).'<br /> Access IP: '.$val[0].'<br /> Message: '.$val[1].'</li>';
}
$message .= '</ul>';
$content = sprintf(Context::getLang('login_fail_report_contents'),$message,date('Y-m-d H:i:s P'));
//send message
$oCommunicationController = &getController('communication');
$oCommunicationController->sendMessage($args->member_srl, $args->member_srl, $title, $content, true);
if($this->memberInfo->email_address && $this->memberInfo->allow_mailing == 'Y')
{
$view_url = Context::getRequestUri();
$content = sprintf("%s<hr /><p>From: <a href=\"%s\" target=\"_blank\">%s</a><br />To: %s(%s)</p>",$content, $view_url, $view_url, $this->memberInfo->nick_name, $this->memberInfo->email_id);
$oMail = new Mail();
$oMail->setTitle($title);
$oMail->setContent($content);
$oMail->setSender($config->webmaster_name?$config->webmaster_name:'webmaster', $config->webmaster_email);
$oMail->setReceiptor($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address);
$oMail->send();
}
$output = executeQuery('member.deleteLoginCountHistoryByMemberSrl', $args);
}
}
$output = executeQuery('member.deleteLoginCountHistoryByMemberSrl', $args);
}
// Call a trigger after successfully log-in (after)
$trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $this->memberInfo);

View file

@ -63,6 +63,13 @@
<input type="text" id="change_password_date" name="change_password_date" value="{$config->change_password_date}" style="width:30px" /><span class="desc">{$lang->unit_day}({$lang->about_change_password_date})</span>
</div>
</div>
<div class="x_control-group">
<p>{$lang->enable_login_fail_report}</p>
<div class="x_controls">
<label class="x_inline" for="enable_login_fail_report_yes"><input type="radio" name="enable_login_fail_report" id="enable_login_fail_report_yes" value="Y" checked="checked"|cond="$config->enable_login_fail_report != 'N'" /> {$lang->cmd_yes}</label>
<label class="x_inline" for="enable_join_no"><input type="radio" name="enable_login_fail_report" id="enable_login_fail_report_no" value="N" checked="checked"|cond="$config->enable_login_fail_report == 'N'" /> {$lang->cmd_no}</label>
</div>
</div>
<div class="x_control-group">
<label for="max_error_count">{$lang->login_trial_limit1}</label>
<div class="x_controls">