Merge branch 'develop' into next

This commit is contained in:
Kijin Sung 2020-07-31 15:36:40 +09:00
commit 0f469baae8
40 changed files with 384 additions and 157 deletions

View file

@ -125,6 +125,9 @@ $lang->cmd_member_list = 'Member List';
$lang->cmd_module_config = 'Default Setting';
$lang->cmd_member_group = 'Member Groups';
$lang->cmd_send_mail = 'Send Mail';
$lang->cmd_modify_nickname_log = 'Nickname Change Log';
$lang->cmd_nickname_symbols = 'Allow Symbols in Nickname';
$lang->cmd_nickname_symbols_list = 'Only Allow:';
$lang->cmd_manage_id = 'Prohibited IDs';
$lang->cmd_manage_email_host = 'E-mail provider check';
$lang->cmd_manage_nick_name = 'Prohibited NickNames';
@ -268,6 +271,7 @@ $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.';
$lang->msg_invalid_symbol_in_nickname = 'Your nickname contains a disallowed symbol, \'%s\'.';
$lang->change_password_date = 'Password renewal cycle';
$lang->about_change_password_date = 'If you set a value to this, you will be notified to change your password periodically. (If set to 0, disabled)';
$lang->msg_change_password_date = 'You have not changed the password during %s days. For personal information protection, you need to change the password.';

View file

@ -141,6 +141,8 @@ $lang->cmd_view_scrapped_document = '스크랩 보기';
$lang->cmd_view_saved_document = '저장함 보기';
$lang->cmd_send_email = '메일 보내기';
$lang->cmd_modify_nickname_log = '닉네임 변경 기록';
$lang->cmd_nickname_symbols = '닉네임에 특수문자 허용';
$lang->cmd_nickname_symbols_list = '다음의 문자만 허용:';
$lang->cmd_member_profile_view = '회원 프로필사진 보이기';
$lang->cmd_allow_duplicate_nickname = '닉네임 중복 허용';
$lang->about_allow_duplicate_nickname = '여러 회원이 동일한 닉네임을 사용하는 것을 허용합니다. 주의: 잘못 사용할 경우 혼란이 발생할 수 있습니다.';
@ -258,6 +260,7 @@ $lang->about_reset_auth_mail = '현재등록된 이메일 주소는 %s입니다.
$lang->about_resend_auth_mail = '가입 인증 메일을 받지 못한 경우 다시 받을 수 있습니다.';
$lang->about_reset_auth_mail_submit = '이메일을 로그인 계정으로 사용할 경우 신규 메일주소로 로그인해야 합니다.';
$lang->about_update_nickname_log = '닉네임 로그를 기록합니다. 이 옵션을 사용하게 되면, 닉네임변경이력을 남기도록 할 수 있습니다.';
$lang->about_nickname_symbols = '닉네임에 특수문자를 사용할 수 있도록 허용하거나 금지합니다.';
$lang->about_member_profile_view = '관리자 회원목록 페이지에서 프로필 이미지를 볼 수 있는 옵션입니다. 회원목록을 보기 원치 않을 경우에는 아니요를 선택하세요.';
$lang->no_article = '글이 없습니다.';
$lang->find_account_question = '비밀번호 찾기 질문/답변';
@ -282,6 +285,7 @@ $lang->msg_feature_deprecated = '지원되지 않는 기능입니다.';
$lang->msg_question_not_allowed = '질문/답변을 통한 비밀번호 찾기 기능은 이 사이트에서 사용할 수 없습니다.';
$lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.';
$lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.';
$lang->msg_invalid_symbol_in_nickname = '닉네임에 사용할 수 없는 특수문자 \'%s\'가 포함되어 있습니다.';
$lang->change_password_date = '비밀번호 갱신주기';
$lang->about_change_password_date = '일정 기간이 지나면 비밀번호를 변경하도록 유도하는 기능입니다. 사용하지 않으려면 0을 입력하십시오.';
$lang->msg_change_password_date = '%s일 동안 비밀번호를 변경하지 않았습니다. 개인정보 보호를 위하여 비밀번호를 변경해야 합니다.';
@ -367,3 +371,4 @@ $lang->scrap_folder_create = '폴더 추가';
$lang->scrap_folder_rename = '이름 변경';
$lang->scrap_folder_delete = '삭제';
$lang->member_unauthenticated = '미인증';
$lang->member_number = '회원 번호';

View file

@ -39,6 +39,7 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
.hp li:first-child{border:0;}
.hp a,p{color:#333;text-decoration:none}
/* Button Area */
.captcha{padding:0 10px;}
.bna{text-align:center;padding:0 10px;margin:10px 0}
.bna:after{content:"";display:block;clear:both}
.bn{display:inline-block;line-height:26px !important;padding:0 10px;font-size:12px;font-weight:bold;border:1px solid;text-decoration:none;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;cursor:pointer;vertical-align:middle}

View file

@ -15,6 +15,9 @@
<li><label for="id"><!--@if($identifier == 'user_id')-->{$lang->user_id}<!--@else-->{$lang->email_address}<!--@end--></label><input name="user_id" type="<!--@if($identifier == 'user_id')-->text<!--@else-->email<!--@end-->" id="id" value="" /></li>
<li><label for="pw">{$lang->password}</label><input name="password" type="password" id="pw" value="" /></li>
</ul>
<div class="captcha" cond="$captcha">
{$captcha}
</div>
<div class="hp" id="keep_msg" style="display:none;">
<p>{$lang->about_keep_warning}</p>
</div>

View file

@ -117,10 +117,16 @@ class memberAdminController extends member
{
if(isset($args->{$val}))
{
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', html_entity_decode($args->{$val}));
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val})));
}
}
// 실제로 디비쿼리시 빈값이 없다면 해당 쿼리를 무시하고 업데이트 하기 때문에 메모의 내용이 삭제가 되지 않습니다.
if(!isset($args->description))
{
$args->description = '';
}
$oMemberController = getController('member');
// Execute insert or update depending on the value of member_srl
if(!$args->member_srl)
@ -212,6 +218,8 @@ class memberAdminController extends member
'password_hashing_auto_upgrade',
'password_change_invalidate_other_sessions',
'update_nickname_log',
'nickname_symbols',
'nickname_symbols_allowed_list',
'allow_duplicate_nickname',
'member_profile_view'
);
@ -245,6 +253,12 @@ class memberAdminController extends member
{
$args->password_hashing_auto_upgrade = 'N';
}
if(!in_array($args->nickname_symbols, ['Y', 'N', 'LIST']))
{
$args->nickname_symbols = 'Y';
}
$args->nickname_symbols_allowed_list = utf8_trim($args->nickname_symbols_allowed_list);
$oModuleController = getController('module');
$output = $oModuleController->updateModuleConfig('member', $args);

View file

@ -215,6 +215,10 @@ class member extends ModuleObject {
// Check scrap folder table
if(!$oDB->isColumnExists("member_scrap", "folder_srl")) return true;
if(!$oDB->isIndexExists('member_nickname_log', 'idx_before_nick_name')) return true;
if(!$oDB->isIndexExists('member_nickname_log', 'idx_after_nick_name')) return true;
if(!$oDB->isIndexExists('member_nickname_log', 'idx_user_id')) return true;
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
@ -429,6 +433,14 @@ class member extends ModuleObject {
$oDB->addIndex("member_scrap","idx_folder_srl", array("folder_srl"));
}
// Add to index in member nickname log table. 2020. 07 .20 @BJRambo
if(!$oDB->isIndexExists('member_nickname_log', 'idx_before_nick_name'))
{
$oDB->addIndex('member_nickname_log', 'idx_before_nick_name', array('before_nick_name'));
$oDB->addIndex('member_nickname_log', 'idx_after_nick_name', array('after_nick_name'));
$oDB->addIndex('member_nickname_log', 'idx_user_id', array('user_id'));
}
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
$changed = false;

View file

@ -870,7 +870,24 @@ class memberController extends member
{
if(isset($args->{$val}))
{
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', html_entity_decode($args->{$val}));
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val})));
}
}
// Check symbols in nickname
if($config->nickname_symbols === 'N')
{
if(preg_match('/[^\pL\d]/u', $args->nick_name, $matches))
{
throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0])));
}
}
elseif($config->nickname_symbols === 'LIST')
{
$list = preg_quote($config->nickname_symbols_allowed_list, '/');
if(preg_match('/[^\pL\d' . $list . ']/u', $args->nick_name, $matches))
{
throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0])));
}
}
@ -1165,10 +1182,27 @@ class memberController extends member
{
if(isset($args->{$val}))
{
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', html_entity_decode($args->{$val}));
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val})));
}
}
// Check symbols in nickname
if($config->nickname_symbols === 'N')
{
if(preg_match('/[^\pL\d]/u', $args->nick_name, $matches))
{
throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0])));
}
}
elseif($config->nickname_symbols === 'LIST')
{
$list = preg_quote($config->nickname_symbols_allowed_list, '/');
if(preg_match('/[^\pL\d' . $list . ']/u', $args->nick_name, $matches))
{
throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0])));
}
}
// Execute insert or update depending on the value of member_srl
$output = $this->updateMember($args);
if(!$output->toBool()) return $output;
@ -2858,8 +2892,12 @@ class memberController extends member
else
{
unset($args->is_admin);
unset($args->limit_date);
unset($args->description);
if($is_admin == false)
{
unset($args->denied);
}
if($logged_info->member_srl != $args->member_srl && $is_admin == false)
{
return new BaseObject(-1, 'msg_invalid_request');
@ -3060,7 +3098,10 @@ class memberController extends member
if(!$args->user_name) $args->user_name = $orgMemberInfo->user_name;
if(!$args->user_id) $args->user_id = $orgMemberInfo->user_id;
if(!$args->nick_name) $args->nick_name = $orgMemberInfo->nick_name;
if(!$args->description) $args->description = $orgMemberInfo->description;
if($logged_info->is_admin !== 'Y')
{
$args->description = $orgMemberInfo->description;
}
if(!$args->birthday) $args->birthday = $orgMemberInfo->birthday;
$output = executeQuery('member.updateMember', $args);

View file

@ -1266,10 +1266,44 @@ class memberModel extends member
public static function getMemberModifyNicknameLog($page = 1, $member_srl = null)
{
$search_keyword = Context::get('search_keyword');
$search_target = Context::get('search_target');
// $this->user 에 재대로 된 회원 정보가 들어 가지 않음.
$logged_info = Context::get('logged_info');
$args = new stdClass();
$args->member_srl = $member_srl;
$args->page = $page;
$output = executeQueryArray('member.getMemberModifyNickName', $args);
if($logged_info->is_admin == 'Y')
{
if($search_keyword && $search_keyword)
{
switch ($search_target)
{
case "before":
$args->before_nick_name = $search_keyword;
break;
case "after":
$args->after_nick_name = $search_keyword;
break;
case "user_id":
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->user_id = $search_keyword;
break;
case "member_srl":
$args->member_srl = intval($search_keyword);
break;
default:
break;
}
$output = executeQuery('member.getMemberModifyNickName', $args);
return $output;
}
}
$args->member_srl = $member_srl;
$output = executeQuery('member.getMemberModifyNickName', $args);
return $output;
}

View file

@ -7,6 +7,9 @@
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" />
<condition operation="equal" column="user_id" var="user_id" pipe="or" />
<condition operation="like" column="after_nick_name" var="after_nick_name" pipe="or" />
<condition operation="like" column="before_nick_name" var="before_nick_name" pipe="or" />
</conditions>
<navigation>
<index var="sort_index" default="regdate" order="desc" />

View file

@ -1,7 +1,7 @@
<table name="member_nickname_log">
<column name="member_srl" type="number" size="11" notnull="notnull" />
<column name="before_nick_name" type="varchar" size="80" notnull="notnull" />
<column name="after_nick_name" type="varchar" size="80" notnull="notnull" />
<column name="member_srl" type="number" size="11" notnull="notnull" index="idx_member_srl" />
<column name="before_nick_name" type="varchar" size="80" notnull="notnull" index="idx_before_nick_name" />
<column name="after_nick_name" type="varchar" size="80" notnull="notnull" index="idx_after_nick_name" />
<column name="regdate" type="date" index="idx_regdate" />
<column name="user_id" type="varchar" size="80" />
<column name="user_id" type="varchar" size="80" index="idx_user_id" />
</table>

View file

@ -263,6 +263,7 @@
.xm .signin>.login-footer>a:focus{text-decoration:underline}
.xm .signin .control-group{position:relative;padding:0 14px 0 0;margin:0;clear:both}
.xm .signin .control-group:before{content:"";display:block;clear:both}
.xm .signin .captcha{margin-bottom:10px}
.xm .signin form{margin:0}
.xm .signin fieldset{margin:0}
.xm .signin label{cursor:pointer;display:inline-block}

View file

@ -18,6 +18,9 @@
<input type="email" cond="$identifier != 'user_id'" name="user_id" id="uid" required placeholder="{$lang->email_address}" title="{$lang->email_address}" />
<input type="password" name="password" id="upw" required placeholder="{$lang->password}" title="{$lang->password}" />
</div>
<div class="control-group captcha" cond="$captcha">
{$captcha}
</div>
<div class="control-group">
<label for="keepid_opt">
<input type="checkbox" name="keep_signed" id="keepid_opt" value="Y" />

View file

@ -49,6 +49,16 @@
<p class="x_help-block">{$lang->about_update_nickname_log}</p>
</div>
</div>
<div class="x_control-group">
<div class="x_control-label">{$lang->cmd_nickname_symbols}</div>
<div class="x_controls">
<label class="x_inline" for="nickname_symbols_yes"><input type="radio" name="nickname_symbols" id="nickname_symbols_yes" value="Y" checked="checked"|cond="$config->nickname_symbols == 'Y' || !isset($config->nickname_symbols)" /> {$lang->cmd_yes}</label>
<label class="x_inline" for="nickname_symbols_no"><input type="radio" name="nickname_symbols" id="nickname_symbols_no" value="N" checked="checked"|cond="$config->nickname_symbols == 'N'"/> {$lang->cmd_no}</label>
<label class="x_inline" for="nickname_symbols_list"><input type="radio" name="nickname_symbols" id="nickname_symbols_list" value="LIST" checked="checked"|cond="$config->nickname_symbols == 'LIST'"/> {$lang->cmd_nickname_symbols_list}</label>
<input type="text" name="nickname_symbols_allowed_list" value="{$config->nickname_symbols_allowed_list ?: ''}" />
<p class="x_help-block">{$lang->about_nickname_symbols}</p>
</div>
</div>
<div class="x_control-group" style="display:none"|cond="$config->allow_duplicate_nickname != 'Y'">
<div class="x_control-label">{$lang->cmd_allow_duplicate_nickname}</div>
<div class="x_controls">

View file

@ -27,6 +27,19 @@
</tr>
</tbody>
</table>
<form action="./" method="get" class="search center x_input-append" no-error-return-url="true">
<input type="hidden" name="module" value="{$module}" />
<select name="search_target" style="margin-right:4px" title="{$lang->search_target}">
<option value="before" selected="selected"|cond="$search_target=='before'">{$lang->nick_name_before_changing}</option>
<option value="after" selected="selected"|cond="$search_target=='after'">{$lang->nick_name_after_changing}</option>
<option value="user_id" selected="selected"|cond="$search_target=='user_id'">{$lang->user_id}</option>
<option value="member_srl" selected="selected"|cond="$search_target=='member_srl'">{$lang->member_number}</option>
</select>
<input type="search" name="search_keyword" value="{htmlspecialchars($search_keyword, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" style="width:140px">
<button class="x_btn x_btn-inverse" type="submit">{$lang->cmd_search}</button>
</form>
<div class="x_clearfix">
<div class="x_pagination x_pull-left">
<ul>