Clean up activation workflow (fixes #1154)

This commit is contained in:
Kijin Sung 2019-09-13 13:35:59 +09:00
parent f9b58784cb
commit 5d058942af
8 changed files with 42 additions and 235 deletions

View file

@ -31,7 +31,6 @@
<action name="procMemberAuthAccount" type="controller" method="GET|POST" />
<action name="procMemberAuthEmailAddress" type="controller" method="GET|POST" />
<action name="procMemberResendAuthMail" type="controller" ruleset="resendAuthMail" />
<action name="procMemberResetAuthMail" type="controller" ruleset="resetAuthMail" />
<action name="procMemberModifyInfoBefore" type="controller" permission="member" ruleset="recheckedPassword" />
<action name="procMemberModifyInfo" type="controller" permission="member" ruleset="@insertMember" />
<action name="procMemberModifyPassword" type="controller" permission="member" ruleset="modifyPassword" />

View file

@ -106,7 +106,7 @@ $lang->cmd_leave = 'Delete Account';
$lang->cmd_find_member_account = 'Find Account Info';
$lang->cmd_find_member_account_with_email = 'Find Account with Email address';
$lang->cmd_find_member_account_with_email_question = 'Find Account with Q&amp;A';
$lang->cmd_resend_auth_mail = 'Request for Activation Mail';
$lang->cmd_resend_auth_mail = 'Resend Activation Email';
$lang->cmd_send_auth_new_emaill_address = 'Request for activation mail to new email';
$lang->cmd_member_list = 'Member List';
$lang->cmd_module_config = 'Default Setting';
@ -136,7 +136,7 @@ $lang->msg_cart_is_null = 'Please select the target.';
$lang->msg_checked_file_is_deleted = '%d attached file(s) is(are) deleted.';
$lang->msg_find_account_title = 'Account Info';
$lang->msg_find_account_info = 'This is requested account info.';
$lang->msg_find_account_comment = 'The password will be modified as the one above as you click the link below.<br />Please modify the password after login.';
$lang->msg_find_account_comment = 'Your password will be changed to the one above if you click the link below.<br />Please change the password again as soon as possible after you are able to log in.<br />Your password will remain unchanged until you click the link below.';
$lang->msg_confirm_account_title = 'Rhymix Account Activation';
$lang->msg_confirm_account_info = 'This is your account information:';
$lang->msg_confirm_account_comment = 'Click on the following link to complete your account activation.';
@ -171,7 +171,7 @@ $lang->msg_not_uploaded_image_mark = 'Image mark could not be registered.';
$lang->msg_not_uploaded_group_image_mark = 'Group image mark could not be registered.';
$lang->msg_accept_agreement = 'You must accept all required agreements in order to sign up.';
$lang->msg_user_denied = 'You have entered a prohibited ID.';
$lang->msg_user_not_confirmed = 'Your account is not activated yet. Please check your email.';
$lang->msg_user_not_confirmed = 'Your account is not activated yet. A confirmation email has been sent to %s. Please check your email and click the activation link to continue.';
$lang->msg_user_limited = 'You have entered an ID that cannot be used before %s';
$lang->msg_admin_ip_not_allowed = 'Your IP address is not allowed to log in as an administrator.';
$lang->about_rechecked_password = 'Confirm your password before editing account information.';
@ -231,7 +231,7 @@ $lang->about_accept_agreement = 'I have read the above and agree with it.';
$lang->about_member_default = 'It will be set as the default group on sign up';
$lang->about_find_member_account = 'Please input the email address you have entered during the registration and we will send your account info to this email address.';
$lang->about_ssl_port = 'Please enter if you are using non-default SSL port';
$lang->about_resend_auth_mail = 'You can request for the activation email if you have not activated yet.';
$lang->about_resend_auth_mail = 'You can request the activation email again if you have not received it.';
$lang->no_article = 'No articles';
$lang->find_account_question = 'Question for a temporary password.';
$lang->find_account_answer = 'Answer for a temporary password.';
@ -248,6 +248,9 @@ $lang->find_account_question_items['9'] = 'What is your favorite food?';
$lang->temp_password = 'Temporary password';
$lang->cmd_get_temp_password = 'Get a temporary password';
$lang->about_get_temp_password = 'Change your password after you logged in.';
$lang->msg_activation_not_needed = 'Your account is already activated.';
$lang->msg_activation_key_not_found = 'There is no activation email to resend.';
$lang->msg_feature_deprecated = 'This feature is deprecated.';
$lang->msg_question_not_allowed = 'The administrator has disabled this function.';
$lang->msg_question_not_exists = 'You haven`t set your question for a temporary password.';
$lang->msg_answer_not_matches = 'Your answer for the question is not correct.';

View file

@ -140,7 +140,7 @@ $lang->msg_cart_is_null = '대상을 선택해주세요.';
$lang->msg_checked_file_is_deleted = '%d개의 첨부 파일이 삭제되었습니다.';
$lang->msg_find_account_title = '아이디/비밀번호 정보입니다.';
$lang->msg_find_account_info = '요청한 계정 정보는 아래와 같습니다.';
$lang->msg_find_account_comment = '아래 링크를 클릭하면 위에 적힌 비밀번호로 바뀌게 됩니다.<br />로그인 한 후 비밀번호를 바꾸어주세요.';
$lang->msg_find_account_comment = '아래 링크를 클릭하면 위에 적힌 비밀번호로 변경됩니다.<br />로그인 후 다른 비밀번호로 변경해 주시기 바랍니다.<br />링크를 클릭하지 않으면 비밀번호가 변경되지 않습니다.';
$lang->msg_confirm_account_title = '가입 인증 메일입니다.';
$lang->title_modify_email_address = '이메일주소 변경 요청 확인 메일입니다.';
$lang->msg_confirm_account_info = '가입한 계정 정보는 아래와 같습니다.';
@ -179,7 +179,7 @@ $lang->msg_not_uploaded_image_mark = '이미지 마크를 등록할 수 없습
$lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수 없습니다.';
$lang->msg_accept_agreement = '필수 약관에 모두 동의해야 가입하실 수 있습니다.';
$lang->msg_user_denied = '입력한 아이디의 사용이 중지 되었습니다.';
$lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요.';
$lang->msg_user_not_confirmed = '가입 인증이 완료되지 않았습니다. %s 메일로 인증 정보가 발송되었으니 확인하시고 인증 링크를 클릭해 주세요.';
$lang->msg_user_limited = '입력한 아이디는 %s 까지 사용하실 수 없습니다.';
$lang->msg_admin_ip_not_allowed = '접속하신 IP 주소에서는 관리자 로그인이 허용되지 않습니다.';
$lang->about_rechecked_password = '회원의 정보를 안전하게 보호하기 위해 비밀번호를 다시 한번 확인 합니다.';
@ -237,11 +237,11 @@ $lang->about_profile_image = '회원의 프로필 이미지를 사용할 수 있
$lang->about_signature_max_height = '서명란의 최대 높이를 제한할 수 있습니다. (0 또는 비워두면 제한하지 않습니다.)';
$lang->about_accept_agreement = '위의 내용을 모두 읽었으며 동의합니다.';
$lang->about_member_default = '회원 가입을 한 사람이 최초에 속하는 그룹을 말합니다.';
$lang->about_find_member_account = '아이디/비밀번호는 가입시 등록한 메일 주소로 알려드립니다. 가입할 때 등록한 메일 주소를 입력하고 "ID/PW 찾기" 버튼을 클릭해주세요.<br />';
$lang->about_find_member_account = '회원정보에 등록된 메일 주소로 아이디/비밀번호를 알려드립니다. 메일 주소를 입력하고 "ID/PW 찾기" 버튼을 클릭해 주세요.<br />';
$lang->about_temp_password = '임시 비밀번호가 정상적으로 발급되었습니다.<br />로그인 후 반드시 비밀번호를 변경하세요.<br />';
$lang->about_ssl_port = '기본 포트 이외의 보안접속(SSL) 포트를 사용하는 경우 포트번호를 입력해주세요.';
$lang->about_reset_auth_mail = '현재등록된 이메일 주소는 %s입니다. 이메일 주소를 변경하고자 하는 경우 새로운 이메일 주소로 회원정보 갱신 후 인증메일을 재발송할 수 있습니다.';
$lang->about_resend_auth_mail = '인증 메일을 받지 못한 경우 다시 받을 수 있습니다.';
$lang->about_resend_auth_mail = '가입 인증 메일을 받지 못한 경우 다시 받을 수 있습니다.';
$lang->about_reset_auth_mail_submit = '이메일을 로그인 계정으로 사용할 경우 신규 메일주소로 로그인해야 합니다.';
$lang->about_update_nickname_log = '닉네임 로그를 기록합니다. 이 옵션을 사용하게 되면, 닉네임변경이력을 남기도록 할 수 있습니다.';
$lang->about_member_profile_view = '관리자 회원목록 페이지에서 프로필 이미지를 볼 수 있는 옵션입니다. 회원목록을 보기 원치 않을 경우에는 아니요를 선택하세요.';
@ -262,6 +262,9 @@ $lang->find_account_question_items['9'] = '가장 좋아하는 음식은?';
$lang->temp_password = '임시 비밀번호';
$lang->cmd_get_temp_password = '임시 비밀번호 발급';
$lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.';
$lang->msg_activation_not_needed = '이미 인증된 회원입니다.';
$lang->msg_activation_key_not_found = '인증 메일 발송 내역이 없습니다.';
$lang->msg_feature_deprecated = '지원되지 않는 기능입니다.';
$lang->msg_question_not_allowed = '질문/답변을 통한 비밀번호 찾기 기능은 이 사이트에서 사용할 수 없습니다.';
$lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.';
$lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.';

View file

@ -1,41 +0,0 @@
<include target="./common_header.html" />
<section class="prn-body">
<h1>{$lang->cmd_resend_auth_mail}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/rx_prn/reset_mail/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="rx_member-notice">{sprintf($lang->about_reset_auth_mail, $memberInfo->email_address)}</div>
<form action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResendAuthMail" />
<input type="hidden" name="email_address" value="{$memberInfo->email_address}" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/rx_prn/reset_mail/1" />
<div class="control-group">
<label for="uid1">
{lang('common.email_address')}
</label>
<input type="text" id="uid1" readonly="readonly" disabled="disabled" value="{$memberInfo->email_address}" title="{$lang->cmd_resend_auth_mail}" />
<input type="submit" id="resend_button" name="" value="{$lang->cmd_resend_auth_mail}" class="btn btn-inverse" />
</div>
</form>
</section>
<section class="prn-body">
<h1>{lang('member.cmd_send_auth_new_emaill_address')}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/rx_prn/reset_mail/2'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="rx_member-notice">{lang('member.about_reset_auth_mail_submit')}</div>
<form ruleset="resetAuthMail" action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResetAuthMail" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/rx_prn/reset_mail/2" />
<div class="control-group">
<label for="email_address">
{lang('member.cmd_modify_new_auth_email_address')}
</label>
<input type="text" id="email_address" name="email_address" value="" title="{lang('member.cmd_modify_new_auth_email_address')}" />
<input type="submit" value="{$lang->cmd_send_auth_new_emaill_address}" class="btn btn-inverse" />
</div>
</form>
</section>
<include target="./common_footer.html" />

View file

@ -1656,11 +1656,22 @@ class memberController extends member
$args = new stdClass;
$args->email_address = $email_address;
$memberSrl = $oMemberModel->getMemberSrlByEmailAddress($email_address);
if(!$memberSrl) throw new Rhymix\Framework\Exception('msg_not_exists_member');
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address);
if(!$member_srl)
{
throw new Rhymix\Framework\Exception('msg_not_exists_member');
}
$columnList = array('member_srl', 'user_id', 'user_name', 'nick_name', 'email_address');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($memberSrl, 0, $columnList);
$member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList);
if(!$member_info || !$member_info->member_srl)
{
throw new Rhymix\Framework\Exception('msg_not_exists_member');
}
if($member_info->denied !== 'Y')
{
throw new Rhymix\Framework\Exception('msg_activation_not_needed');
}
$oModuleModel = getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
@ -1671,12 +1682,19 @@ class memberController extends member
$chk_args = new stdClass;
$chk_args->member_srl = $member_info->member_srl;
$output = executeQuery('member.chkAuthMail', $chk_args);
if($output->toBool() && $output->data->count == '0') throw new Rhymix\Framework\Exceptions\InvalidRequest;
if($output->toBool() && $output->data->count == '0')
{
throw new Rhymix\Framework\Exception('msg_activation_key_not_found');
}
$auth_args = new stdClass;
$auth_args->member_srl = $member_info->member_srl;
$output = executeQueryArray('member.getAuthMailInfo', $auth_args);
if(!$output->data || !$output->data[0]->auth_key) throw new Rhymix\Framework\Exceptions\InvalidRequest;
if(!$output->data || !$output->data[0]->auth_key)
{
throw new Rhymix\Framework\Exception('msg_activation_key_not_found');
}
$auth_info = $output->data[0];
// Update the regdate of authmail entry
@ -1733,97 +1751,6 @@ class memberController extends member
$this->setRedirectUrl($returnUrl);
}
function procMemberResetAuthMail()
{
$memberInfo = $_SESSION['auth_member_info'];
unset($_SESSION['auth_member_info']);
if(!$memberInfo)
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$newEmail = Context::get('email_address');
if(!$newEmail)
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($newEmail);
if($member_srl)
{
throw new Rhymix\Framework\Exception('msg_exists_email_address');
}
// Check managed Email Host
if($oMemberModel->isDeniedEmailHost($newEmail))
{
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managed_email_host = lang('managed_email_host');
$email_hosts = $oMemberModel->getManagedEmailHosts();
foreach ($email_hosts as $host)
{
$hosts[] = $host->email_host;
}
$message = sprintf($managed_email_host[$emailhost_check], implode(', ',$hosts), 'id@' . implode(', id@', $hosts));
throw new Rhymix\Framework\Exception($message);
}
// remove all key by member_srl
$args = new stdClass;
$args->member_srl = $memberInfo->member_srl;
$output = executeQuery('member.deleteAuthMail', $args);
if(!$output->toBool())
{
return $output;
}
// update member info
$args->email_address = $newEmail;
list($args->email_id, $args->email_host) = explode('@', $newEmail);
$output = executeQuery('member.updateMemberEmailAddress', $args);
if(!$output->toBool())
{
return $output;
}
$this->_clearMemberCache($args->member_srl);
// Call a trigger (after)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $args->member_srl;
$trigger_obj->email_address = $args->email_address;
$trigger_output = ModuleHandler::triggerCall('member.updateMemberEmailAddress', 'after', $trigger_obj);
// generate new auth key
$auth_args = new stdClass();
$auth_args->user_id = $memberInfo->user_id;
$auth_args->member_srl = $memberInfo->member_srl;
$auth_args->new_password = $memberInfo->password;
$auth_args->auth_key = Rhymix\Framework\Security::getRandom(40, 'hex');
$auth_args->is_register = 'Y';
$output = executeQuery('member.insertAuthMail', $auth_args);
if(!$output->toBool()) return $output;
$memberInfo->email_address = $newEmail;
// resend auth mail.
$this->_sendAuthMail($auth_args, $memberInfo);
$msg = sprintf(lang('msg_confirm_mail_sent'), $memberInfo->email_address);
$this->setMessage($msg);
$returnUrl = getUrl('');
$this->setRedirectUrl($returnUrl);
}
function _sendAuthMail($auth_args, $member_info)
{
$oMemberModel = getModel('member');
@ -2240,11 +2167,9 @@ class memberController extends member
{
$args->member_srl = $member_info->member_srl;
$output = executeQuery('member.chkAuthMail', $args);
if ($output->toBool() && $output->data->count != '0')
if ($output->toBool() && $output->data->count)
{
$_SESSION['auth_member_srl'] = $member_info->member_srl;
$redirectUrl = getUrl('', 'act', 'dispMemberResendAuthMail');
return $this->setRedirectUrl($redirectUrl, new BaseObject(-1,'msg_user_not_confirmed'));
return new BaseObject(-1, sprintf(lang('msg_user_not_confirmed'), $member_info->email_address));
}
$refused_reason = $member_info->refused_reason ? ('<br>' . lang('refused_reason') . ': ' . $member_info->refused_reason) : '';

View file

@ -695,29 +695,14 @@ class memberView extends member
/**
* @brief Page of re-sending an authentication mail
*/
function dispMemberResendAuthMail()
function dispMemberResendAuthMail()
{
$authMemberSrl = $_SESSION['auth_member_srl'];
unset($_SESSION['auth_member_srl']);
if(Context::get('is_logged'))
if(Context::get('is_logged'))
{
throw new Rhymix\Framework\Exception('already_logged');
}
if($authMemberSrl)
{
$oMemberModel = getModel('member');
$memberInfo = $oMemberModel->getMemberInfoByMemberSrl($authMemberSrl);
$_SESSION['auth_member_info'] = $memberInfo;
Context::set('memberInfo', $memberInfo);
$this->setTemplateFile('reset_mail');
}
else
{
$this->setTemplateFile('resend_auth_mail');
}
$this->setTemplateFile('resend_auth_mail');
}
function dispMemberModifyEmailAddress()

View file

@ -1,26 +0,0 @@
<include target="./common_header.html" />
<h1>{$lang->cmd_resend_auth_mail}</h1>
<p>{sprintf($lang->about_reset_auth_mail, $memberInfo->email_address)}</p>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/default/reset_mail/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResendAuthMail" />
<input type="hidden" name="email_address" value="{$memberInfo->email_address}" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/default/reset_mail/1" />
<div class="input-append">
<input type="text" readonly="readonly" disabled="disabled" value="{$memberInfo->email_address}" title="{$lang->cmd_resend_auth_mail}" />
<input type="submit" id="resend_button" name="" value="{$lang->cmd_resend_auth_mail}" class="btn btn-inverse" />
</div>
</form>
<form ruleset="resetAuthMail" action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResetAuthMail" />
<div class="input-append">
<input type="text" id="email_address" name="email_address" value="" placeholder="{$lang->cmd_modify_new_auth_email_address}" title="{$lang->cmd_modify_new_auth_email_address}" />
<input type="submit" value="{$lang->cmd_send_auth_new_emaill_address}" class="btn btn-inverse" />
</div>
<p>{$lang->about_reset_auth_mail_submit}</p>
</form>
<include target="./common_footer.html" />

View file

@ -1,41 +0,0 @@
<include target="./common_header.html" />
<section class="sw-body">
<h1>{$lang->cmd_resend_auth_mail}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/simple_world/reset_mail/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="rx_member-notice">{sprintf($lang->about_reset_auth_mail, $memberInfo->email_address)}</div>
<form action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResendAuthMail" />
<input type="hidden" name="email_address" value="{$memberInfo->email_address}" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/simple_world/reset_mail/1" />
<div class="control-group">
<label for="uid1">
{lang('common.email_address')}
</label>
<input type="text" id="uid1" readonly="readonly" disabled="disabled" value="{$memberInfo->email_address}" title="{$lang->cmd_resend_auth_mail}" />
<input type="submit" id="resend_button" name="" value="{$lang->cmd_resend_auth_mail}" class="btn btn-inverse" />
</div>
</form>
</section>
<section class="sw-body">
<h1>{lang('member.cmd_send_auth_new_emaill_address')}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/simple_world/reset_mail/2'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="rx_member-notice">{lang('member.about_reset_auth_mail_submit')}</div>
<form ruleset="resetAuthMail" action="./" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberResetAuthMail" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/simple_world/reset_mail/2" />
<div class="control-group">
<label for="email_address">
{lang('member.cmd_modify_new_auth_email_address')}
</label>
<input type="text" id="email_address" name="email_address" value="" title="{lang('member.cmd_modify_new_auth_email_address')}" />
<input type="submit" value="{$lang->cmd_send_auth_new_emaill_address}" class="btn btn-inverse" />
</div>
</form>
</section>
<include target="./common_footer.html" />