#444 회원 가입시 메일 인증 기능 추가.

특정 변수명 변경 sended->sent.
긴 메시지에 개행문자 추가.


git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4131 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
rubyeye 2008-04-22 13:26:16 +00:00
parent 52feb9843a
commit 471fa1d2b0
11 changed files with 129 additions and 11 deletions

View file

@ -45,6 +45,7 @@
$lang->signature_max_height = '서명 높이 제한';
$lang->enable_openid = 'OpenID 지원';
$lang->enable_join = '회원 가입 허가';
$lang->enable_confirm = '메일 인증 사용';
$lang->enable_ssl = 'SSL 기능 사용';
$lang->security_sign_in = '보안로그인 사용';
$lang->limit_day = '임시 제한 일자';
@ -125,9 +126,14 @@
$lang->msg_find_account_title = '아이디/ 비밀번호 정보입니다';
$lang->msg_find_account_info = '요청하신 계정 정보는 아래와 같습니다';
$lang->msg_find_account_comment = '아래 링크를 클릭하시면 위에 적힌 비밀번호로 바뀌게 됩니다.<br />로그인 하신 후 비밀번호를 바꾸어주세요.';
$lang->msg_auth_mail_sended = '%s 메일로 인증 정보를 담은 메일이 발송되었습니다. 메일을 확인하세요.';
$lang->msg_confirm_account_title = '가입 인증 메일 입니다';
$lang->msg_confirm_account_info = '가입하신 계정 정보는 아래와 같습니다';
$lang->msg_confirm_account_comment = '아래 링크를 클릭하시면 가입 인증이 이루어집니다.';
$lang->msg_auth_mail_sent = '%s 메일로 인증 정보를 담은 메일이 발송되었습니다. 메일을 확인하세요.';
$lang->msg_confirm_mail_sent = '%s 메일로 가입 인증 메일이 발송되었습니다. 메일을 확인하세요.';
$lang->msg_invalid_auth_key = '잘못된 계정 인증 요청입니다.<br />아이디/비밀번호 찾기를 다시 하시거나 사이트 관리자에게 계정 정보를 문의해주세요';
$lang->msg_success_authed = '인증이 정상적으로 되어 로그인 처리가 되었습니다. 꼭 인증 메일에 표시된 비밀번호를 이용하여 원하시는 비밀번호로 변경하세요.';
$lang->msg_success_authed = '인증이 정상적으로 되어 로그인 처리가 되었습니다.\n꼭 인증 메일에 표시된 비밀번호를 이용하여 원하시는 비밀번호로 변경하세요.';
$lang->msg_success_confirmed = '가입 인증이 정상적으로 처리 되었습니다.';
$lang->msg_no_message = '쪽지가 없습니다';
$lang->message_received = '쪽지가 왔습니다';
@ -159,6 +165,7 @@
$lang->msg_accept_agreement = '약관에 동의하셔야 합니다';
$lang->msg_user_denied = '입력하신 아이디의 사용이 중지되셨습니다';
$lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요';
$lang->msg_user_limited = '입력하신 아이디는 %s 이후부터 사용하실 수 있습니다';
$lang->about_user_id = '사용자 ID는 3~20자 사이의 영문+숫자로 이루어져야 하며 영문으로 시작되어야 합니다';
@ -186,6 +193,7 @@
$lang->about_enable_openid = 'OpenID 지원을 할 경우 체크하시면 됩니다';
$lang->about_enable_join = '체크를 하셔야 사용자들이 회원가입을 할 수 있습니다';
$lang->about_enable_confirm = '입력된 메일 주소로 인증 메일을 보내 회원 가입을 확인 합니다';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = '회원 가입후 정해진 일자동안 인증 제한을 할 수 있습니다';
$lang->about_limit_date = '지정된 일자까지 해당 사용자는 로그인을 할 수 없습니다';

View file

@ -83,7 +83,7 @@
**/
function procMemberAdminInsertConfig() {
// 기본 정보를 받음
$args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','enable_ssl','limit_day','after_login_url','after_logout_url','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height','editor_skin');
$args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','enable_confirm','enable_ssl','limit_day','after_login_url','after_logout_url','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height','editor_skin');
if(!$args->skin) $args->skin = "default";
if(!$args->colorset) $args->colorset = "white";
if($args->enable_join!='Y') $args->enable_join = 'N';

View file

@ -81,6 +81,7 @@
// 기본 정보를 세팅
$args->enable_join = 'Y';
if(!$args->enable_openid) $args->enable_openid = 'N';
if(!$args->enable_auth_mail) $args->enable_auth_mail = 'N';
if(!$args->image_name) $args->image_name = 'Y';
if(!$args->image_mark) $args->image_mark = 'Y';
if(!$args->profile_image) $args->profile_image = 'Y';

View file

@ -710,6 +710,9 @@
unset($all_args->accept_agreement);
unset($all_args->signature);
// 메일 인증 기능 사용시 회원 상태를 denied로 설정
if ($config->enable_confirm == 'Y') $args->denied = 'Y';
// 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
$extra_vars = delObjectVars($all_args, $args);
$args->extra_vars = serialize($extra_vars);
@ -719,11 +722,15 @@
if(!$output->toBool()) return $output;
// 로그인 시킴
$this->doLogin($args->user_id);
if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id);
$this->add('member_srl', $args->member_srl);
if($config->redirect_url) $this->add('redirect_url', $config->redirect_url);
$this->setMessage('success_registed');
if ($config->enable_confirm == 'Y') {
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
$this->setMessage($msg);
}
else $this->setMessage('success_registed');
}
/**
@ -1101,11 +1108,19 @@
// 회원의 정보를 가져옴
$member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
// 아이디/비밀번호 찾기가 가능한 상태의 회원인지 검사
if ($member_info->denied == 'Y') {
$chk_args->member_srl = $member_info->member_srl;
$output = executeQuery('member.chkAuthMail', $chk_args);
if ($output->toBool() && $output->data->count != '0') return new Object(-1, 'msg_user_not_confirmed');
}
// 인증 DB에 데이터를 넣음
$args->user_id = $member_info->user_id;
$args->member_srl = $member_info->member_srl;
$args->new_password = rand(111111,999999);
$args->auth_key = md5( rand(0,999999 ) );
$args->is_register = 'N';
$output = executeQuery('member.insertAuthMail', $args);
if(!$output->toBool()) return $output;
@ -1129,7 +1144,7 @@
$oMail->send();
// 메세지 return
$msg = sprintf(Context::getLang('msg_auth_mail_sended'), $member_info->email_address);
$msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address);
$this->setMessage($msg);
}
@ -1150,7 +1165,18 @@
if(!$output->toBool() || $output->data->auth_key != $auth_key) return $this->stop('msg_invalid_auth_key');
// 인증 정보가 맞다면 새비밀번호로 비밀번호를 바꾸고 인증 상태로 바꿈
$args->password = md5($output->data->new_password);
if ($output->data->is_register == 'Y') {
$args->password = $output->data->new_password;
$args->denied = 'N';
}
else {
$args->password = md5($output->data->new_password);
unset($args->denied);
}
// $output->data->is_register 값을 백업해 둔다.
$is_register = $output->data->is_register;
$output = executeQuery('member.updateMemberPassword', $args);
if(!$output->toBool()) return $this->stop($output->getMessage());
@ -1175,6 +1201,7 @@
executeQuery('member.deleteAuthMail',$args);
// 결과를 통보
Context::set('is_register', $is_register);
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile('msg_success_authed');
}
@ -1274,7 +1301,12 @@
if($password && !$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password');
// denied == 'Y' 이면 알림
if($member_info->denied == 'Y') return new Object(-1,'msg_user_denied');
if($member_info->denied == 'Y') {
$args->member_srl = $member_info->member_srl;
$output = executeQuery('member.chkAuthMail', $args);
if ($output->toBool() && $output->data->count != '0') return new Object(-1,'msg_user_not_confirmed');
return new Object(-1,'msg_user_denied');
}
// denied_date가 현 시간보다 적으면 알림
if($member_info->limit_date && $member_info->limit_date >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d")));
@ -1380,14 +1412,13 @@
// 필수 변수들의 조절
if($args->allow_mailing!='Y') $args->allow_mailing = 'N';
if($args->denied!='Y') $args->denied = 'N';
if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message= 'Y';
if($logged_info->is_admin == 'Y') {
if($args->denied!='Y') $args->denied = 'N';
if($args->is_admin!='Y') $args->is_admin = 'N';
} else {
unset($args->is_admin);
unset($args->denied);
}
list($args->email_id, $args->email_host) = explode('@', $args->email_address);
@ -1450,6 +1481,40 @@
}
}
// 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송
if ($args->denied == 'Y') {
// 인증 DB에 데이터를 넣음
$auth_args->user_id = $args->user_id;
$auth_args->member_srl = $args->member_srl;
$auth_args->new_password = $args->password;
$auth_args->auth_key = md5(rand(0, 999999));
$auth_args->is_register = 'Y';
$output = executeQuery('member.insertAuthMail', $auth_args);
if (!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 메일 내용을 구함
Context::set('auth_args', $auth_args);
Context::set('member_info', $args);
$oTemplate = &TemplateHandler::getInstance();
$content = $oTemplate->compile($this->module_path.'tpl', 'confirm_member_account_mail');
// 사이트 웹마스터 정보를 구함
$oModuleModel = &getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
// 메일 발송
$oMail = new Mail();
$oMail->setTitle( Context::getLang('msg_confirm_account_title') );
$oMail->setContent($content);
$oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email);
$oMail->setReceiptor( $args->user_name, $args->email_address );
$oMail->send();
}
// trigger 호출 (after)
if($output->toBool()) {
$trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args);
@ -1598,8 +1663,15 @@
$oDB = &DB::getInstance();
$oDB->begin();
// member_group_member에서 해당 항목들 삭제
$args->member_srl = $member_srl;
// member_auth_mail에서 해당 항목들 삭제
$output = executeQuery('member.deleteAuthMail', $args);
if (!$output->toBool()) {
$oDB->rollback();
return $output;
}
// member_group_member에서 해당 항목들 삭제
$output = executeQuery('member.deleteMemberGroupMember', $args);
if(!$output->toBool()) {
$oDB->rollback();

View file

@ -0,0 +1,11 @@
<query id="getAuthMail" action="select">
<tables>
<table name="member_auth_mail" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" />
</conditions>
</query>

View file

@ -7,6 +7,7 @@
<column name="user_id" var="user_id" notnull="notnull" />
<column name="auth_key" var="auth_key" notnull="notnull" minlength="1" maxlength="60" />
<column name="new_password" var="new_password" notnull="notnull" minlength="1" maxlength="60" />
<column name="is_register" var="is_register" default="N" />
<column name="regdate" default="curdate()" />
</columns>
</query>

View file

@ -4,6 +4,7 @@
</tables>
<columns>
<column name="password" var="password" notnull="notnull" />
<column name="denied" var="denied" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" filter="number"/>

View file

@ -3,5 +3,6 @@
<column name="member_srl" type="number" size="11" notnull="notnull" unique="unique_key" />
<column name="user_id" type="varchar" size="80" notnull="notnull" />
<column name="new_password" type="varchar" size="80" notnull="notnull" />
<column name="is_register" type="char" size="1" default="N" />
<column name="regdate" type="date" index="idx_regdate" />
</table>

View file

@ -0,0 +1,12 @@
{$lang->msg_confirm_account_info}<br />
<hr noshade="noshade" />
<ul>
<li>Site : <a href="{getUrl()}" target="_blank">{getUrl()}</a></li>
<li>{$lang->user_id} : {$member_info->user_id}</li>
<li>{$lang->user_name} : {$member_info->user_name}</li>
<li>{$lang->nick_name} : {$member_info->nick_name}</li>
<li>{$lang->email_address} : {$member_info->email_address}</li>
</ul>
<hr noshade="noshade" />
{$lang->msg_confirm_account_comment}<br />
<a href="{getUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_args->auth_key)}" target="_blank">{getUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl,'auth_key',$auth_args->auth_key)}</a>

View file

@ -37,6 +37,13 @@
{$lang->about_enable_join}
</td>
</tr>
<tr>
<th scope="row">{$lang->enable_confirm}</th>
<td>
<input type="checkbox" name="enable_confirm" value="Y" <!--@if($config->enable_confirm=='Y')-->checked="checked"<!--@end--> class="checkbox" />
{$lang->about_enable_confirm}
</td>
</tr>
<tr>
<th scope="row">{$lang->enable_ssl}</th>
<td>

View file

@ -1,4 +1,8 @@
<script type="text/javascript">
<!--@if ($is_register == 'Y')-->
alert("{$lang->msg_success_confirmed}");
<!--@else-->
alert("{$lang->msg_success_authed}");
<!--@end-->
location.href="{getUrl()}";
</script>