merge from 1.5.3 (~r10943)

git-svn-id: http://xe-core.googlecode.com/svn/trunk@10951 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
flyskyko 2012-07-27 02:47:10 +00:00
parent 7aa4798373
commit 54e3a72065
334 changed files with 13011 additions and 5561 deletions

View file

@ -155,6 +155,10 @@
<value xml:lang="tr"><![CDATA[Hesap etkinleştirilmemiş.]]></value>
<value xml:lang="vi"><![CDATA[Tài khoản đăng nhập không đúng.]]></value>
</item>
<item name="invalid_email_address">
<value xml:lang="ko"><![CDATA[이메일 주소와 일치하는 회원이 없습니다.]]></value>
<value xml:lang="en"><![CDATA[You have entered an invalid email address. There is no member who has the email, entered.]]></value>
</item>
<item name="invalid_user_id">
<value xml:lang="ko"><![CDATA[존재하지 않는 회원 아이디입니다.]]></value>
<value xml:lang="en"><![CDATA[You have entered an invalid ID.]]></value>
@ -929,6 +933,14 @@
<value xml:lang="tr"><![CDATA[Hesap Bilgisi Bul]]></value>
<value xml:lang="vi"><![CDATA[Lấy lại thông tin]]></value>
</item>
<item name="cmd_find_member_account_with_email">
<value xml:lang="ko"><![CDATA[이메일 주소로 계정 찾기]]></value>
<value xml:lang="en"><![CDATA[Find Account with Email address]]></value>
</item>
<item name="cmd_find_member_account_with_email_question">
<value xml:lang="ko"><![CDATA[질문/답변으로 계정 찾기]]></value>
<value xml:lang="en"><![CDATA[Find Account with Q&amp;A]]></value>
</item>
<item name="cmd_resend_auth_mail">
<value xml:lang="ko"><![CDATA[인증 메일 재발송]]></value>
<value xml:lang="en"><![CDATA[Request for Activation Mail]]></value>
@ -2019,7 +2031,7 @@
</item>
<item name="about_find_member_account">
<value xml:lang="ko"><![CDATA[아이디/ 비밀번호는 가입시 등록한 메일 주소로 알려드립니다.<br />가입할 때 등록하신 메일 주소를 입력하시고 "아이디/비밀번호 찾기" 버튼을 클릭해주세요.<br />]]></value>
<value xml:lang="en"><![CDATA[Your account info will be sent to this email address.<br />Please input the email address you have entered during the registration, then press "Find Account Info" button.<br />]]></value>
<value xml:lang="en"><![CDATA[lease input the email address you have entered during the registration and we will send your account info to this email address.]]></value>
<value xml:lang="jp"><![CDATA[ID/パスワードは登録時に登録されたメールにてお知らせします。<br />登録時に登録したメールアドレスを入力して「IDとパスワードのリマインダー」ボタンをクリックしてください。<br />]]></value>
<value xml:lang="zh-CN"><![CDATA[用户名/密码将发送到您注册时所输入的电子邮件当中。<br />输入注册时的电子邮件地址后,请点击“查找用户名/密码”按钮。<br />]]></value>
<value xml:lang="zh-TW"><![CDATA[帳號/密碼將發送到您註冊時,所輸入的電子郵件當中。<br />輸入註冊時的電子郵件地址後,請按「查詢帳號/密碼」按鈕。<br />]]></value>
@ -2234,6 +2246,22 @@ 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="zh-TW"><![CDATA[可設定密碼更新週期,將會定期通知更換密碼。 (設為零則不使用)]]></value>
<value xml:lang="tr"><![CDATA[Eğer buna bir değer biçerseniz, şifrenizi belirli aralıklarla değiştirmeniz konusunda bildirim alacaksanız (eğer 0 olarak ayarlandıysa, devredışıdır)]]></value>
</item>
<item name="login_trial_limit1">
<value xml:lang="ko"><![CDATA[로그인 시도 횟수 제한 횟수]]></value>
<value xml:lang="en"><![CDATA[Sign in trial limit]]></value>
</item>
<item name="login_trial_limit2">
<value xml:lang="ko"><![CDATA[로그인 시도 횟수 제한 시간]]></value>
<value xml:lang="en"><![CDATA[Sign in trial limit]]></value>
</item>
<item name="about_login_trial_limit1">
<value xml:lang="ko"><![CDATA[정해진 시간 안에 허용되는 로그인 횟수를 입력하십시오. 짧은 시간 동안 하나의 아이피(IP)에서 시도할 수 있는 로그인 횟수에 제한을 둡니다.]]></value>
<value xml:lang="en"><![CDATA[Set the number of trial limit. Limit the number of trial to sign in from a IP address.]]></value>
</item>
<item name="about_login_trial_limit2">
<value xml:lang="ko"><![CDATA[지정된 횟수의 로그인을 허용하는 시간을 정하십시오. 짧은 시간 동안 하나의 아이피(IP)에서 시도할 수 있는 로그인 횟수에 제한을 둡니다. 시간은 가장 마지막 로그인 시도의 시각으로부터의 시간을 기준으로 측정합니다.]]></value>
<value xml:lang="en"><![CDATA[Set the time limit to try the written times of sign in. Limit the number of trial to sign in during the span of time, from a IP address.]]></value>
</item>
<item name="msg_kr_address">
<value xml:lang="ko"><![CDATA[읍, 면, 동 이름으로 검색하세요.]]></value>
<value xml:lang="en"><![CDATA[Search for the name of eup, myeon or dong of your address.]]></value>
@ -2466,4 +2494,23 @@ Bạn có thể quản lý thành viên bằng cách tạo những nhóm mới,
<item name="msg_success_modify_email_address">
<value xml:lang="ko"><![CDATA[이메일 주소가 정상적으로 변경되었습니다. 변경된 이메일 주소로 로그인 가능합니다.]]></value>
</item>
<item name="group">
<value xml:lang="ko"><![CDATA[그룹]]></value>
<value xml:lang="en"><![CDATA[Group]]></value>
</item>
<item name="retrieve_password">
<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="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>
</item>
</lang>

View file

@ -2,19 +2,21 @@
/**
* @class memberAdminController
* @author NHN (developers@xpressengine.com)
* @brief member module of the admin controller class
* member module of the admin controller class
**/
class memberAdminController extends member {
/**
* @brief Initialization
* Initialization
* @return void
**/
function init() {
}
/**
* @brief Add a user (Administrator)
* Add a user (Administrator)
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminInsert() {
// if(Context::getRequestMethod() == "GET") return new Object(-1, "msg_invalid_request");
@ -103,15 +105,14 @@
if (is_uploaded_file($image_name['tmp_name'])){
$oMemberController->insertImageName($args->member_srl, $image_name['tmp_name']);
}
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminList');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Delete a user (Administrator)
* Delete a user (Administrator)
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminDelete() {
// Separate all the values into DB entries and others
@ -125,6 +126,10 @@
$this->setMessage("success_deleted");
}
/**
* Set config of member
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminInsertConfig(){
$input_args = Context::gets(
'enable_join',
@ -133,6 +138,7 @@
'webmaster_email',
'limit_day',
'change_password_date',
'max_error_count','max_error_count_time',
'agreement',
'after_login_url',
'after_logout_url',
@ -186,7 +192,7 @@
$signupItem->isDefaultForm = in_array($key, $items);
$signupItem->name = $key;
if(in_array($key, $items)) $signupItem->title = $key;
if(!in_array($key, $items)) $signupItem->title = $key;
else $signupItem->title = $lang->{$key};
$signupItem->mustRequired = in_array($key, $mustRequireds);
$signupItem->imageType = (strpos($key, 'image') !== false);
@ -226,18 +232,30 @@
$this->_createLoginRuleset($args->identifier);
$this->_createFindAccountByQuestion($args->identifier);
}
// check agreement value exist
if($args->agreement)
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt';
$output = FileHandler::writeFile($agreement_file, $args->agreement);
unset($args->agreement);
}
$output = $oModuleController->updateModuleConfig('member', $args);
// default setting end
$this->setMessage('success_updated');
if($output->toBool() && !in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminConfig');
$this->setRedirectUrl($returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminConfig');
$this->setRedirectUrl($returnUrl);
}
/**
* Create ruleset file of signup
* @param object $signupForm (user define signup form)
* @param string $agreement
* @return void
**/
function _createSignupRuleset($signupForm, $agreement = null){
$xml_file = './files/ruleset/insertMember.xml';
$buff = '<?xml version="1.0" encoding="utf-8"?>' . PHP_EOL
@ -285,6 +303,11 @@
$validator->getJsPath();
}
/**
* Create ruleset file of login
* @param string $identifier (login identifier)
* @return void
**/
function _createLoginRuleset($identifier){
$xml_file = './files/ruleset/login.xml';
$buff = '<?xml version="1.0" encoding="utf-8"?>'
@ -307,6 +330,11 @@
$validator->getJsPath();
}
/**
* Create ruleset file of find account
* @param string $identifier (login identifier)
* @return void
**/
function _createFindAccountByQuestion($identifier){
$xml_file = './files/ruleset/find_member_account_by_question.xml';
$buff = '<?xml version="1.0" encoding="utf-8"?>'
@ -333,7 +361,8 @@
}
/**
* @brief Add a user group
* Add a user group
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminInsertGroup() {
$args = Context::gets('title','description','is_default','image_mark');
@ -344,15 +373,13 @@
$this->add('page',Context::get('page'));
$this->setMessage('success_registed');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Update user group information
* Update user group information
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminUpdateGroup() {
$group_srl = Context::get('group_srl');
@ -366,15 +393,13 @@
$this->add('page',Context::get('page'));
$this->setMessage('success_updated');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Update user group information
* Update user group information
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminDeleteGroup() {
$group_srl = Context::get('group_srl');
@ -386,15 +411,13 @@
$this->add('page',Context::get('page'));
$this->setMessage('success_deleted');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Add a join form
* Add a join form
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminInsertJoinForm() {
$args->member_join_form_srl = Context::get('member_join_form_srl');
@ -451,13 +474,14 @@
$this->setMessage('success_registed');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminJoinFormList');
$this->setRedirectUrl($returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminJoinFormList');
$this->setRedirectUrl($returnUrl);
}
/**
* Delete a join form
* @return void
**/
function procMemberAdminDeleteJoinForm(){
$member_join_form_srl = Context::get('member_join_form_srl');
$this->deleteJoinForm($member_join_form_srl);
@ -476,7 +500,9 @@
}
/**
* @brief Move up/down the member join form and modify it
* Move up/down the member join form and modify it
* @deprecated
* @return void
**/
function procMemberAdminUpdateJoinForm() {
$member_join_form_srl = Context::get('member_join_form_srl');
@ -505,6 +531,7 @@
/**
* selected member manager layer in dispAdminList
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminSelectedMemberManage(){
$var = Context::getRequestVars();
@ -572,15 +599,13 @@
}
}
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminList');
$this->setRedirectUrl($returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Delete the selected members
* Delete the selected members
* @return void|Object (void : success, Object : fail)
*/
function procMemberAdminDeleteMembers() {
$target_member_srls = Context::get('target_member_srls');
@ -600,7 +625,8 @@
}
/**
* @brief Update a group of selected memebrs
* Update a group of selected memebrs
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminUpdateMembersGroup() {
$member_srl = Context::get('member_srl');
@ -657,7 +683,8 @@
}
/**
* @brief Add a denied ID
* Add a denied ID
* @return void
**/
function procMemberAdminInsertDeniedID() {
$user_ids = Context::get('user_id');
@ -672,15 +699,13 @@
$this->add('user_ids', implode(',',$success_ids));
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminDeniedIDList');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminDeniedIDList');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Update denied ID
* Update denied ID
* @return void|Object (void : success, Object : fail)
**/
function procMemberAdminUpdateDeniedID() {
$user_id = Context::get('user_id');
@ -699,7 +724,9 @@
}
/**
* @brief Add an administrator
* Add an administrator
* @param object $args
* @return object (info of added member)
**/
function insertAdmin($args) {
// Assign an administrator
@ -714,7 +741,10 @@
}
/**
* @brief Change the group values of member
* Change the group values of member
* @param int $source_group_srl
* @param int $target_group_srl
* @return Object
**/
function changeGroup($source_group_srl, $target_group_srl) {
$args->source_group_srl = $source_group_srl;
@ -724,7 +754,9 @@
}
/**
* @brief find_account_answerInsert a group
* find_account_answerInsert a group
* @param object $args
* @return Object
**/
function insertGroup($args) {
if(!$args->site_srl) $args->site_srl = 0;
@ -741,7 +773,9 @@
}
/**
* @brief Modify Group Information
* Modify Group Information
* @param object $args
* @return Object
**/
function updateGroup($args) {
// Check the value of is_default.
@ -758,6 +792,9 @@
/**
* Delete a Group
* @param int $group_srl
* @param int $site_srl
* @return Object
**/
function deleteGroup($group_srl, $site_srl = 0) {
// Create a member model object
@ -781,6 +818,7 @@
/**
* Set group config
* @return void
**/
function procMemberAdminGroupConfig() {
$vars = Context::getRequestVars();
@ -812,13 +850,14 @@
$this->setMessage('success_updated');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
$this->setRedirectUrl($returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList');
$this->setRedirectUrl($returnUrl);
}
/**
* Set group order
* @return void
**/
function procMemberAdminUpdateGroupOrder() {
$vars = Context::getRequestVars();
@ -828,11 +867,14 @@
executeQuery('member.updateMemberGroupListOrder', $args);
}
header(sprintf('Location:%s', getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList')));
$this->setRedirectUrl(getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList'));
}
/**
* @brief Register denied ID
* Register denied ID
* @param string $user_id
* @param string $description
* @return Object
**/
function insertDeniedID($user_id, $description = '') {
$args->user_id = $user_id;
@ -843,7 +885,9 @@
}
/**
* @brief Delete a denied ID
* Delete a denied ID
* @param string $user_id
* @return Object
**/
function deleteDeniedID($user_id) {
$args->user_id = $user_id;
@ -851,7 +895,9 @@
}
/**
* @brief Delete a join form
* Delete a join form
* @param int $member_join_form_srl
* @return Object
**/
function deleteJoinForm($member_join_form_srl) {
$args->member_join_form_srl = $member_join_form_srl;
@ -860,7 +906,10 @@
}
/**
* @brief Move up a join form
* Move up a join form
* @deprecated
* @param int $member_join_form_srl
* @return Object
**/
function moveJoinFormUp($member_join_form_srl) {
$oMemberModel = &getModel('member');
@ -899,7 +948,10 @@
}
/**
* @brief Move down a join form
* Move down a join form
* @deprecated
* @param int $member_join_form_srl
* @return Object
**/
function moveJoinFormDown($member_join_form_srl) {
$oMemberModel = &getModel('member');

View file

@ -2,26 +2,40 @@
/**
* @class memberAdminModel
* @author NHN (developers@xpressengine.com)
* @brief admin model class of member module
* admin model class of member module
**/
class memberAdminModel extends member {
/**
* @brief Keep data internally which may be frequently called.
* info of member
* @var object
**/
var $member_info = NULL;
/**
* info of member groups
* @var array
**/
var $member_groups = NULL;
/**
* info of sign up form
* @var array
**/
var $join_form_list = NULL;
/**
* @brief Initialization
* Initialization
* @return void
**/
function init() {
}
/**
* @brief Get a member list
* Get a member list
*
* @return object|array (object : when member count is 1, array : when member count is more than 1)
**/
function getMemberList() {
// Search option
@ -119,7 +133,12 @@
}
/**
* @brief Get a memebr list for each site
* Get a memebr list for each site
*
* @param int $site_srl
* @param int $page
*
* @return array
**/
function getSiteMemberList($site_srl, $page = 1) {
$args->site_srl = $site_srl;
@ -131,6 +150,11 @@
return $output;
}
/**
* Get member_srls lists about site admins
*
* @return array
**/
function getSiteAdminMemberSrls(){
$output = executeQueryArray('member.getSiteAdminMemberSrls');
if (!$output->toBool() || !$output->data) return array();
@ -144,7 +168,9 @@
}
/**
* @brief Return colorset list of a skin in the member module
* Return colorset list of a skin in the member module
*
* @return void
**/
function getMemberAdminColorset() {
$skin = Context::get('skin');
@ -167,7 +193,11 @@
}
/**
* @brief Return member count with date
* Return member count with date
*
* @param string $date
*
* @return int
**/
function getMemberCountByDate($date = '') {
if($date) $args->regDate = date('Ymd', strtotime($date));
@ -179,7 +209,11 @@
}
/**
* @brief Return site join member count with date
* Return site join member count with date
*
* @param string $date
*
* @return int
**/
function getMemberGroupMemberCountByDate($date = '') {
if($date) $args->regDate = date('Ymd', strtotime($date));
@ -191,7 +225,9 @@
}
/**
* @brief Return add join Form
* Return add join Form
*
* @return void
**/
function getMemberAdminInsertJoinForm() {
$member_join_form_srl = Context::get('member_join_form_srl');
@ -214,6 +250,13 @@
$this->add('tpl', str_replace("\n"," ",$tpl));
}
/**
* check allowed target ip address when login for admin.
*
* @return boolean (true : allowed, false : refuse)
**/
function getMemberAdminIPCheck() {
$db_info = Context::getDBInfo();

View file

@ -2,15 +2,29 @@
/**
* @class memberAdminView
* @author NHN (developers@xpressengine.com)
* @brief member module's admin view class
* member module's admin view class
**/
class memberAdminView extends member {
var $group_list = NULL; ///< group list
var $memberInfo = NULL; ///< selected member info
/**
* Group list
*
* @var array
**/
var $group_list = NULL;
/**
* Selected member info
*
* @var array
**/
var $memberInfo = NULL;
/**
* @brief initialization
* initialization
*
* @return void
**/
function init() {
$oMemberModel = &getModel('member');
@ -31,7 +45,9 @@
}
/**
* @brief display member list
* display member list
*
* @return void
**/
function dispMemberAdminList() {
$oMemberAdminModel = &getAdminModel('member');
@ -81,7 +97,9 @@
}
/**
* @brief default configuration for member management
* default configuration for member management
*
* @return void
**/
function dispMemberAdminConfig() {
global $lang; // retrieve configuration via module model instance
@ -124,7 +142,9 @@
}
/**
* @brief display member information
* display member information
*
* @return void
**/
function dispMemberAdminInfo() {
$oMemberModel = &getModel('member');
@ -148,7 +168,9 @@
}
/**
* @brief display member insert form
* display member insert form
*
* @return void
**/
function dispMemberAdminInsert() {
// retrieve extend form
@ -189,6 +211,14 @@
$this->setTemplateFile('insert_member');
}
/**
* Get tags by the member info type
*
* @param object $memberInfo
* @param boolean $isAdmin (true : admin, false : not admin)
*
* @return array
**/
function _getMemberInputTag($memberInfo, $isAdmin = false){
$oMemberModel = &getModel('member');
$extend_form_list = $oMemberModel->getCombineJoinForm($memberInfo);
@ -239,7 +269,7 @@
}else{
$inputTag = sprintf('<input type="hidden" name="__%s_exist" value="false" />', $formInfo->name);
}
$inputTag .= sprintf('<p class="a"><input type="file" name="%s" id="%s" value="" /> <span class="desc">%s : %dpx, %s : %dpx</span></p>'
$inputTag .= sprintf('<p class="a"><input type="file" name="%s" id="%s" value="" /></p><p><span class="desc">%s : %dpx, %s : %dpx</span></p>'
,$formInfo->name
,$formInfo->name
,$lang->{$formInfo->name.'_max_width'}
@ -253,7 +283,7 @@
,zdate($memberInfo['birthday'], 'Y-m-d', false)
,$lang->cmd_delete);
}elseif($formInfo->name == 'find_account_question'){
$inputTag = '<select name="find_account_question" style="width:290px">%s</select><br />';
$inputTag = '<select name="find_account_question" style="width:290px; display:block;">%s</select>';
$optionTag = array();
foreach($lang->find_account_question_items as $key=>$val){
if($key == $memberInfo['find_account_question']) $selected = 'selected="selected"';
@ -264,9 +294,9 @@
,$val);
}
$inputTag = sprintf($inputTag, implode('', $optionTag));
$inputTag .= '<input type="text" name="find_account_answer" value="'.$memberInfo['find_account_answer'].'" />';
$inputTag .= '<input type="text" name="find_account_answer" title="'.Context::getLang('find_account_answer').'" value="'.$memberInfo['find_account_answer'].'" class="inputText long tall" />';
}else{
$inputTag = sprintf('<input type="text" name="%s" value="%s" />'
$inputTag = sprintf('<input type="text" name="%s" value="%s" class="inputText long tall" />'
,$formInfo->name
,$memberInfo[$formInfo->name]);
}
@ -372,7 +402,9 @@ EOD;
}
/**
* @brief display member delete form
* display member delete form
*
* @return void
**/
function dispMemberAdminDeleteForm() {
if(!Context::get('member_srl')) return $this->dispMemberAdminList();
@ -380,7 +412,9 @@ EOD;
}
/**
* @brief display group list
* display group list
*
* @return void
**/
function dispMemberAdminGroupList() {
$oModuleModel = &getModel('module');
@ -401,7 +435,9 @@ EOD;
}
/**
* @brief Display a list of member join form
* Display a list of member join form
*
* @return void
**/
function dispMemberAdminJoinFormList() {
// Create a member model object
@ -416,7 +452,9 @@ EOD;
}
/**
* @brief Display an admin page for memebr join forms
* Display an admin page for memebr join forms
*
* @return void
**/
function dispMemberAdminInsertJoinForm() {
// Get the value of join_form
@ -437,7 +475,9 @@ EOD;
}
/**
* @brief Display denied ID list
* Display denied ID list
*
* @return void
**/
function dispMemberAdminDeniedIDList() {
// Create a member model object
@ -457,7 +497,9 @@ EOD;
}
/**
* @brief Update all the member groups
* Update all the member groups
*
* @return void
**/
function dispMemberAdminManageGroup() {
// Get a list of the selected member
@ -476,7 +518,9 @@ EOD;
}
/**
* @brief Delete all members
* Delete members
*
* @return void
**/
function dispMemberAdminDeleteMembers() {
// Get a list of the selected member

View file

@ -2,14 +2,17 @@
/**
* @class memberAPI
* @author NHN (developers@xpressengine.com)
* @brief API Processing of View Action in the member module
* API Processing of View Action in the member module
**/
class memberAPI extends member {
/**
* @brief Content List
* Content List
*
* @param Object $oModule
*
* @return void
**/
function dispSavedDocumentList(&$oModule) {
$document_list = $this->arrangeContentList(Context::get('document_list'));
@ -17,8 +20,13 @@
$oModule->add('page_navigation',Context::get('page_navigation'));
}
/**
* Arrange Contents
*
* @param array $content_list
*
* @return array
**/
function arrangeContentList($content_list) {
$output = array();
if(count($content_list)) {
@ -27,7 +35,13 @@
return $output;
}
/**
* Arrange Contents
*
* @param array $content_list
*
* @return array
**/
function arrangeContent($content) {
$output = null;
if($content){
@ -35,6 +49,5 @@
}
return $output;
}
}
?>

View file

@ -2,14 +2,21 @@
/**
* @class member
* @author NHN (developers@xpressengine.com)
* @brief high class of the member module
* high class of the member module
**/
class member extends ModuleObject {
/**
* Use sha1 encryption
*
* @var boolean
**/
var $useSha1 = false;
/**
* @brief constructor
* constructor
*
* @return void
**/
function member() {
if(!Context::isInstalled()) return;
@ -21,6 +28,8 @@
Context::addSSLAction('dispMemberModifyPassword');
Context::addSSLAction('dispMemberSignUpForm');
Context::addSSLAction('dispMemberModifyInfo');
Context::addSSLAction('dispMemberLoginForm');
Context::addSSLAction('dispMemberFindAccount');
Context::addSSLAction('procMemberLogin');
Context::addSSLAction('procMemberModifyPassword');
Context::addSSLAction('procMemberInsert');
@ -30,7 +39,9 @@
}
/**
* @brief Implement if additional tasks are necessary when installing
* Implement if additional tasks are necessary when installing
*
* @return Object
**/
function moduleInstall() {
// Register action forward (to use in administrator mode)
@ -58,43 +69,46 @@
global $lang;
$oMemberModel = &getModel('member');
$identifier = 'email_address';
$items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark');
$mustRequireds = array('email_address', 'nick_name','password', 'find_account_question');
$list_order = array();
foreach($items as $key){
unset($signupItem);
$signupItem->isDefaultForm = true;
$signupItem->name = $key;
$signupItem->title = $key;
$signupItem->mustRequired = in_array($key, $mustRequireds);
$signupItem->imageType = (strpos($key, 'image') !== false);
$signupItem->required = $signupItem->mustRequired;
$signupItem->isUse = $signupItem->mustRequired;
$signupItem->isIdentifier = ($key == $identifier);
if ($signupItem->imageType){
$signupItem->max_width = $config->{$key.'_max_width'};
$signupItem->max_height = $config->{$key.'_max_height'};
// Create a member controller object
$oMemberController = &getController('member');
$oMemberAdminController = &getAdminController('member');
if(!$args->signupForm || !is_array($args->signupForm))
{
$identifier = 'email_address';
$items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark');
$mustRequireds = array('email_address', 'nick_name','password', 'find_account_question');
$list_order = array();
foreach($items as $key){
unset($signupItem);
$signupItem->isDefaultForm = true;
$signupItem->name = $key;
$signupItem->title = $key;
$signupItem->mustRequired = in_array($key, $mustRequireds);
$signupItem->imageType = (strpos($key, 'image') !== false);
$signupItem->required = $signupItem->mustRequired;
$signupItem->isUse = $signupItem->mustRequired;
$signupItem->isIdentifier = ($key == $identifier);
if ($signupItem->imageType){
$signupItem->max_width = $config->{$key.'_max_width'};
$signupItem->max_height = $config->{$key.'_max_height'};
}
if ($signupItem->isIdentifier)
array_unshift($list_order, $signupItem);
else
$list_order[] = $signupItem;
}
if ($signupItem->isIdentifier)
array_unshift($list_order, $signupItem);
else
$list_order[] = $signupItem;
$args->signupForm = $list_order;
$args->identifier = $identifier;
$oModuleController->insertModuleConfig('member',$args);
// Create Ruleset File
FileHandler::makeDir('./files/ruleset');
$oMemberAdminController->_createSignupRuleset($args->signupForm);
$oMemberAdminController->_createLoginRuleset($args->identifier);
$oMemberAdminController->_createFindAccountByQuestion($args->identifier);
}
$args->signupForm = $list_order;
$args->identifier = $identifier;
$oModuleController->insertModuleConfig('member',$args);
// Create a member controller object
$oMemberController = &getController('member');
$oMemberAdminController = &getAdminController('member');
// Create Ruleset File
FileHandler::makeDir('./files/ruleset');
$oMemberAdminController->_createSignupRuleset($args->signupForm);
$oMemberAdminController->_createLoginRuleset($args->identifier);
$oMemberAdminController->_createFindAccountByQuestion($args->identifier);
$groups = $oMemberModel->getGroups();
if(!count($groups)) {
@ -150,7 +164,9 @@
}
/**
* @brief a method to check if successfully installed
* a method to check if successfully installed
*
* @return boolean
**/
function checkUpdate() {
$oDB = &DB::getInstance();
@ -182,11 +198,14 @@
if(!$oDB->isColumnExists("member", "list_order")) return true;
if(!$oDB->isIndexExists("member","idx_list_order")) return true;
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
// check signup form ordering info
if (!$config->signupForm) return true;
// check agreement field exist
if ($config->agreement) return true;
if (!is_readable('./files/ruleset/insertMember.xml')) return true;
if (!is_readable('./files/ruleset/login.xml')) return true;
if (!is_readable('./files/ruleset/find_member_account_by_question.xml')) return true;
@ -195,7 +214,9 @@
}
/**
* @brief Execute update
* Execute update
*
* @return Object
**/
function moduleUpdate() {
$oDB = &DB::getInstance();
@ -257,13 +278,24 @@
$oDB->addIndex("member","idx_list_order", array("list_order"));
}
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
$oModuleController = &getController('module');
// check agreement value exist
if($config->agreement)
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt';
$output = FileHandler::writeFile($agreement_file, $config->agreement);
unset($config->agreement);
$output = $oModuleController->updateModuleConfig('member', $config);
}
// check signup form ordering info
if (!$config->signupForm || !is_array($config->signupForm)){
global $lang;
$oModuleController = &getController('module');
$oMemberModel = &getModel('member');
// Get join form list which is additionally set
$extendItems = $oMemberModel->getJoinFormList();
@ -312,9 +344,9 @@
}
$config->signupForm = $list_order;
$config->identifier = $identifier;
unset($config->agreement);
$output = $oModuleController->updateModuleConfig('member', $config);
}
FileHandler::makeDir('./files/ruleset');
$oMemberAdminController = &getAdminController('member');
@ -329,7 +361,9 @@
}
/**
* @brief Re-generate the cache file
* Re-generate the cache file
*
* @return void
**/
function recompileCache() {
set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3");
@ -337,5 +371,70 @@
$store = new Auth_OpenID_XEStore();
$store->reset();
}
}
/**
* @brief Record login error and return the error, about IPaddress.
**/
function recordLoginError($error = 0, $message = 'success')
{
if($error == 0) 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.
if($term < $config->max_error_count_time)
{
$args->count = $output->data->count + 1;
}
else
{
$args->count = 1;
}
unset($oMemberModel);
unset($config);
$output = executeQuery('member.updateLoginCountByIp', $args);
}
else
{
//insert
$args->count = 1;
$output = executeQuery('member.insertLoginCountByIp', $args);
}
return new Object($error, $message);
}
/**
* @brief Record login error and return the error, about MemberSrl.
**/
function recordMemberLoginError($error = 0, $message = 'success', $args = NULL)
{
if($error == 0 || !$args->member_srl) return new Object($error, $message);
$output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args);
if($output->data && $output->data->content)
{
//update
$content = unserialize($output->data->content);
$content[] = array($_SERVER['REMOTE_ADDR'],Context::getLang($message),time());
$args->content = serialize($content);
$output = executeQuery('member.updateLoginCountHistoryByMemberSrl', $args);
}
else
{
//insert
$content[0] = array($_SERVER['REMOTE_ADDR'],Context::getLang($message),time());
$args->content = serialize($content);
$output = executeQuery('member.insertLoginCountHistoryByMemberSrl', $args);
}
return $this->recordLoginError($error, $message);
}
}
?>

View file

@ -2,20 +2,34 @@
/**
* @class memberController
* @author NHN (developers@xpressengine.com)
* @brief Controller class of member module
* Controller class of member module
**/
class memberController extends member {
/**
* Info of selected member
*
* @var object
**/
var $memberInfo;
/**
* @brief Initialization
* Initialization
*
* @return void
**/
function init() {
}
/**
* @brief Log-in by checking user_id and password
* Log-in by checking user_id and password
*
* @param string $user_id
* @param string $password
* @param string $keep_signed
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberLogin($user_id = null, $password = null, $keep_signed = null) {
if(!$user_id && !$password && Context::getRequestMethod() == 'GET')
@ -55,23 +69,25 @@
}
}
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
if(!$config->after_login_url) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
} else {
$returnUrl = $config->after_login_url;
}
$this->setRedirectUrl($returnUrl);
return;
if(!$config->after_login_url)
{
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
}
return $output;
else
{
$returnUrl = $config->after_login_url;
}
return $this->setRedirectUrl($returnUrl, $output);
}
/**
* @brief Login by openid
* Login by openid
*
* @deprecated
*
* @param string $validator
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberOpenIDLogin($validator = "procMemberOpenIDValidate") {
$oModuleModel = &getModel('module');
@ -109,10 +125,19 @@
$ApprovedURL = Context::getRequestUri(RELEASE_SSL) . "?module=member&act=" . $validator. "&goto=" . $goto;
$redirect_url = $auth_request->redirectURL($trust_root, $ApprovedURL);
$this->add("redirect_url", $redirect_url);
if (Context::getRequestMethod() == 'POST')
header("location:" . $redirect_url);
$this->setRedirectUrl($redirect_url);
}
/**
* Legacy open id
*
* @deprecated
*
* @param string $openid_identity
*
* @return array
**/
function getLegacyUserIDsFromOpenID($openid_identity) {
// Issue 17515512: workaround
$result = array();
@ -155,7 +180,9 @@
}
/**
* @brief openid authentication check
* openid authentication check
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberOpenIDValidate() {
set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3");
@ -256,14 +283,18 @@
}
/**
* @brief Request member join by openID
* Request member join by openID
*
* @return Object
**/
function procMemberAddOpenIDToMember() {
return $this->procMemberOpenIDLogin("procMemberValidateAddOpenIDToMember");
}
/**
* @brief Validate openID processing
* Validate openID processing
*
* @return Object
**/
function procMemberValidateAddOpenIDToMember() {
set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3");
@ -315,7 +346,9 @@
}
/**
* @brief Disconnect OpenID
* Disconnect OpenID
*
* @return void
**/
function procMemberDeleteOpenIDFromMember() {
$logged_info = Context::get('logged_info');
@ -347,7 +380,9 @@
/**
* @brief Log-out
* Log-out
*
* @return Object
**/
function procMemberLogout() {
// Call a trigger before log-out (before)
@ -371,7 +406,9 @@
}
/**
* @brief Scrap
* Scrap document
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberScrapDocument() {
// Check login information
@ -404,7 +441,9 @@
}
/**
* @brief Delete a scrap
* Delete a scrap
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberDeleteScrap() {
// Check login information
@ -420,15 +459,18 @@
}
/**
* @brief Save posts
* @Deplicated - instead Document Controller - procDocumentTempSave method use
* Save posts
* @deprecated - instead Document Controller - procDocumentTempSave method use
* @return Object
**/
function procMemberSaveDocument() {
return new Object(0, 'Deplicated method');
return new Object(0, 'Deprecated method');
}
/**
* @brief Delete the post
* Delete the post
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberDeleteSavedDocument() {
// Check login information
@ -443,7 +485,9 @@
}
/**
* @brief Check values when member joining
* Check values when member joining
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberCheckValue() {
$name = Context::get('name');
@ -478,7 +522,9 @@
}
/**
* @brief Join Membership
* Join Membership
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberInsert() {
if (Context::getRequestMethod () == "GET") return new Object (-1, "msg_invalid_request");
@ -497,7 +543,7 @@
$getVars = array();
if ($config->signupForm){
foreach($config->signupForm as $formInfo){
if($formInfo->isDefaultForm && $formInfo->isUse && ($formInfo->required || $formInfo->mustRequired)){
if($formInfo->isDefaultForm && ($formInfo->isUse || $formInfo->required || $formInfo->mustRequired)){
$getVars[] = $formInfo->name;
}
}
@ -565,10 +611,18 @@
}
// Log-in
if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id);
//get redirect url from cookie and invalidate cookie
$config->redirect_url = $_COOKIE["XE_REDIRECT_URL"];
setcookie("XE_REDIRECT_URL", '', 1);
if ($config->enable_confirm != 'Y')
{
if($config->identifier == 'email_address')
{
$this->doLogin($args->email_address);
}
else
{
$this->doLogin($args->user_id);
}
}
// Results
$this->add('member_srl', $args->member_srl);
if($config->redirect_url) $this->add('redirect_url', $config->redirect_url);
@ -581,15 +635,30 @@
$trigger_output = ModuleHandler::triggerCall('member.procMemberInsert', 'after', $config);
if(!$trigger_output->toBool()) return $trigger_output;
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
header('location:'.$returnUrl);
return;
if($config->redirect_url)
{
$returnUrl = $config->redirect_url;
}
else
{
if(Context::get('success_return_url'))
{
$returnUrl = Context::get('success_return_url');
}
else if($_COOKIE['XE_REDIRECT_URL'])
{
$returnUrl = $_COOKIE['XE_REDIRECT_URL'];
setcookie("XE_REDIRECT_URL", '', 1);
}
}
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Edit member profile
* Edit member profile
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberModifyInfo() {
if(!Context::get('is_logged')) return $this->stop('msg_not_logged');
@ -672,15 +741,15 @@
// Return result
$this->add('member_srl', $args->member_srl);
$this->setMessage('success_updated');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberInfo');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberInfo');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Change the user password
* Change the user password
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberModifyPassword() {
if(!Context::get('is_logged')) return $this->stop('msg_not_logged');
@ -709,15 +778,15 @@
$this->add('member_srl', $args->member_srl);
$this->setMessage('success_updated');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberInfo');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberInfo');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Membership withdrawal
* Membership withdrawal
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberLeave() {
if(!Context::get('is_logged')) return $this->stop('msg_not_logged');
@ -744,15 +813,15 @@
$this->destroySessionInfo();
// Return success message
$this->setMessage('success_leaved');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief OpenID Withdrawal
* OpenID Withdrawal
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberOpenIDLeave() {
// Return an error if in the non-login state
@ -772,7 +841,9 @@
}
/**
* @brief Add a profile image
* Add a profile image
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberInsertProfileImage() {
// Check if the file is successfully uploaded
@ -792,13 +863,19 @@
$this->insertProfileImage($member_srl, $file['tmp_name']);
// Page refresh
//$this->setRefreshPage();
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
$this->setRedirectUrl($returnUrl);
}
/**
* Insert a profile image
*
* @param int $member_srl
* @param object $target_file
*
* @return void
**/
function insertProfileImage($member_srl, $target_file) {
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
@ -823,7 +900,9 @@
}
/**
* @brief Add an image name
* Add an image name
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberInsertImageName() {
// Check if the file is successfully uploaded
@ -843,13 +922,19 @@
$this->insertImageName($member_srl, $file['tmp_name']);
// Page refresh
//$this->setRefreshPage();
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
$this->setRedirectUrl($returnUrl);
}
/**
* Insert a image name
*
* @param int $member_srl
* @param object $target_file
*
* @return void
**/
function insertImageName($member_srl, $target_file) {
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
@ -871,7 +956,9 @@
}
/**
* @brief Delete profile image
* Delete profile image
*
* @return Object
**/
function procMemberDeleteProfileImage() {
$member_srl = Context::get('member_srl');
@ -894,7 +981,9 @@
}
/**
* @brief Delete Image name
* Delete Image name
*
* @return void
**/
function procMemberDeleteImageName() {
$member_srl = Context::get('member_srl');
@ -917,7 +1006,9 @@
}
/**
* @brief Add an image to mark
* Add an image to mark
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberInsertImageMark() {
// Check if the file is successfully uploaded
@ -937,13 +1028,19 @@
$this->insertImageMark($member_srl, $file['tmp_name']);
// Page refresh
//$this->setRefreshPage();
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberModifyInfo');
$this->setRedirectUrl($returnUrl);
}
/**
* Insert a image mark
*
* @param int $member_srl
* @param object $target_file
*
* @return void
**/
function insertImageMark($member_srl, $target_file) {
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('member');
@ -962,11 +1059,12 @@
if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif');
else @copy($target_file, $target_filename);
}
/**
* @brief Delete Image Mark
* Delete Image Mark
*
* @return Object
**/
function procMemberDeleteImageMark() {
$member_srl = Context::get('member_srl');
@ -982,7 +1080,9 @@
}
/**
* @brief Find ID/Password
* Find ID/Password
*
* @return Object
**/
function procMemberFindAccount() {
$email_address = Context::get('email_address');
@ -1056,12 +1156,18 @@
$oMail->send();
// Return message
$msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address);
return new Object(0,$msg);
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl.'&user_id='.$user_id);
}
return new Object(0,$msg);
}
/**
* @brief Generate a temp password by answering to the pre-determined question
* Generate a temp password by answering to the pre-determined question
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberFindAccountByQuestion() {
$oMemberModel = &getModel('member');
@ -1105,16 +1211,15 @@
$this->add('user_id',$user_id);
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl.'&user_id='.$user_id);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl.'&user_id='.$user_id);
}
/**
* @brief Execute finding ID/Passoword
* Execute finding ID/Passoword
* When clicking the link in the verification email, a method is called to change the old password and to authenticate it
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberAuthAccount() {
// Test user_id and authkey
@ -1148,8 +1253,10 @@
}
/**
* @brief Execute finding ID/Passoword
* Execute finding ID/Passoword
* When clicking the link in the verification email, a method is called to change the old password and to authenticate it
*
* @return Object
**/
function procMemberUpdateAuthMail() {
$member_srl = Context::get('member_srl');
@ -1209,7 +1316,9 @@
}
/**
* @brief Request to re-send the authentication mail
* Request to re-send the authentication mail
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberResendAuthMail() {
// Get an email_address
@ -1264,15 +1373,15 @@
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
$this->setMessage($msg);
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl);
}
/**
* @brief Join a virtual site
* Join a virtual site
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberSiteSignUp() {
$site_module_info = Context::get('site_module_info');
@ -1288,7 +1397,9 @@
}
/**
* @brief Leave the virtual site
* Leave the virtual site
*
* @return void|Object (void : success, Object : fail)
**/
function procMemberSiteLeave() {
$site_module_info = Context::get('site_module_info');
@ -1303,7 +1414,11 @@
}
/**
* @brief Save the member configurations
* Save the member configurations
*
* @param object $args
*
* @return void
**/
function setMemberConfig($args) {
if(!$args->skin) $args->skin = "default";
@ -1333,7 +1448,12 @@
}
/**
* @brief Save the signature as a file
* Save the signature as a file
*
* @param int $member_srl
* @param string $signature
*
* @return void
**/
function putSignature($member_srl, $signature) {
$signature = trim(removeHackTag($signature));
@ -1351,7 +1471,11 @@
}
/**
* @brief Delete the signature file
* Delete the signature file
*
* @param string $member_srl
*
* @return void
**/
function delSignature($member_srl) {
$filename = sprintf('files/member_extra_info/signature/%s%d.gif', getNumberingPath($member_srl), $member_srl);
@ -1359,7 +1483,13 @@
}
/**
* @brief Add group_srl to member_srl
* Add group_srl to member_srl
*
* @param int $member_srl
* @param int $group_srl
* @param int $site_srl
*
* @return Object
**/
function addMemberToGroup($member_srl,$group_srl,$site_srl=0) {
$args->member_srl = $member_srl;
@ -1374,12 +1504,22 @@
$output = executeQuery('member.addMemberToGroup',$args);
$output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args);
$oCacheHandler = &CacheHandler::getInstance('object');
if($oCacheHandler->isSupport()){
$cache_key = 'object_member_groups:'.$member_srl.'_'.$site_srl;
$oCacheHandler->delete($cache_key);
}
return $output;
}
/**
* @brief Change a group of certain members
* Change a group of certain members
* Available only when a member has a single group
*
* @param object $args
*
* @return Object
**/
function replaceMemberGroup($args) {
$obj->site_srl = $args->site_srl;
@ -1404,12 +1544,21 @@
$output = executeQuery('member.addMemberToGroup', $obj);
if(!$output->toBool()) return $output;
}
$oCacheHandler = &CacheHandler::getInstance('object');
if($oCacheHandler->isSupport()){
$cache_key = 'object_member_groups:'.$member_srl.'_'.$site_srl;
$oCacheHandler->delete($cache_key);
}
return new Object();
}
/**
* @brief Auto-login
* Auto-login
*
* @return void
**/
function doAutologin() {
// Get a key value of auto log-in
@ -1435,7 +1584,6 @@
$do_auto_login = false;
// Compare key values based on the information
$key = md5($user_id . $password . $_SERVER['HTTP_USER_AGENT']);
@ -1479,46 +1627,109 @@
}
/**
* @brief Log-in
* Log-in
*
* @param string $user_id
* @param string $password
* @param boolean $keep_signed
*
* @return Object
**/
function doLogin($user_id, $password = '', $keep_signed = false) {
$user_id = strtolower($user_id);
// Call a trigger before log-in (before)
$trigger_obj->user_id = $user_id;
$trigger_obj->password = $password;
$trigger_output = ModuleHandler::triggerCall('member.doLogin', 'before', $trigger_obj);
if(!$trigger_output->toBool()) return $trigger_output;
// Create a member model object
$oMemberModel = &getModel('member');
function doLogin($user_id, $password = '', $keep_signed = false) {
$user_id = strtolower($user_id);
if(!$user_id) return new Object(-1, 'null_user_id');
// Call a trigger before log-in (before)
$trigger_obj->user_id = $user_id;
$trigger_obj->password = $password;
$trigger_output = ModuleHandler::triggerCall('member.doLogin', 'before', $trigger_obj);
if(!$trigger_output->toBool()) return $trigger_output;
// Create a member model object
$oMemberModel = &getModel('member');
// check identifier
$config = $oMemberModel->getMemberConfig();
if ($config->identifier == 'email_address'){
// Get user_id information
$this->memberInfo = $oMemberModel->getMemberInfoByEmailAddress($user_id);
// Set an invalid user if no value returned
if(!$user_id || strtolower($this->memberInfo->email_address) != strtolower($user_id)) return new Object(-1, 'invalid_email_address');
// check IP access count.
$config = $oMemberModel->getMemberConfig();
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$output = executeQuery('member.getLoginCountByIp', $args);
$count = (int)$output->data->count;
if($config->max_error_count < $count)
{
$last_update = strtotime($output->data->last_update);
$term = intval(time()-$last_update);
if($term < $config->max_error_count_time)
{
$term = $config->max_error_count_time - $term;
if($term < 60) $term = intval($term).Context::getLang('unit_sec');
elseif(60 <= $term && $term < 3600) $term = intval($term/60).Context::getLang('unit_min');
elseif(3600 <= $term && $term < 86400) $term = intval($term/3600).Context::getLang('unit_hour');
else $term = intval($term/86400).Context::getLang('unit_day');
return new Object(-1, sprintf(Context::getLang('excess_ip_access_count'),$term));
}
else
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$output = executeQuery('member.deleteLoginCountByIp', $args);
}
}
}else{
// Get user_id information
$this->memberInfo = $oMemberModel->getMemberInfoByUserID($user_id);
// Set an invalid user if no value returned
if(!$user_id || strtolower($this->memberInfo->user_id) != strtolower($user_id)) return new Object(-1, 'invalid_user_id');
}
// Password Check
if($password && !$oMemberModel->isValidPassword($this->memberInfo->password, $password, $this->memberInfo->member_srl)) return new Object(-1, 'invalid_password');
// If denied == 'Y', notify
if($this->memberInfo->denied == 'Y') {
$args->member_srl = $this->memberInfo->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');
}
// Notify if denied_date is less than the current time
if($this->memberInfo->limit_date && substr($this->memberInfo->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($this->memberInfo->limit_date,"Y-m-d")));
// check identifier
if ($config->identifier == 'email_address'){
// Get user_id information
$this->memberInfo = $oMemberModel->getMemberInfoByEmailAddress($user_id);
// Set an invalid user if no value returned
if(!$user_id || strtolower($this->memberInfo->email_address) != strtolower($user_id)) return $this->recordLoginError(-1, 'invalid_email_address');
}else{
// Get user_id information
$this->memberInfo = $oMemberModel->getMemberInfoByUserID($user_id);
// Set an invalid user if no value returned
if(!$user_id || strtolower($this->memberInfo->user_id) != strtolower($user_id)) return $this->recordLoginError(-1, 'invalid_user_id');
}
// Password Check
if($password && !$oMemberModel->isValidPassword($this->memberInfo->password, $password, $this->memberInfo->member_srl)) return $this->recordMemberLoginError(-1, 'invalid_password',$this->memberInfo);
// If denied == 'Y', notify
if($this->memberInfo->denied == 'Y') {
$args->member_srl = $this->memberInfo->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');
}
// Notify if denied_date is less than the current time
if($this->memberInfo->limit_date && substr($this->memberInfo->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($this->memberInfo->limit_date,"Y-m-d")));
// 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')
{
$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();
}
$output = executeQuery('member.deleteLoginCountHistoryByMemberSrl', $args);
}
// Call a trigger after successfully log-in (after)
$trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $this->memberInfo);
if(!$trigger_output->toBool()) return $trigger_output;
@ -1529,7 +1740,7 @@
$autologin_args->member_srl = $this->memberInfo->member_srl;
executeQuery('member.deleteAutologin', $autologin_args);
$autologin_output = executeQuery('member.insertAutologin', $autologin_args);
if($autologin_output->toBool()) setCookie('xeak',$autologin_args->autologin_key, time()+60*60*24*365, '/');
if($autologin_output->toBool()) setCookie('xeak',$autologin_args->autologin_key, time()+31536000, '/');
}
if($this->memberInfo->is_admin == 'Y') {
$oMemberAdminModel = &getAdminModel('member');
@ -1544,7 +1755,7 @@
}
/**
* @brief Update or create session information
* Update or create session information
**/
function setSessionInfo() {
$oMemberModel = &getModel('member');
@ -1584,10 +1795,6 @@
}
*/
// XSS defence
$oSecurity = new Security($this->memberInfo);
$oSecurity->encodeHTML('user_name', 'nick_name', 'address.');
// Information stored in the session login user
Context::set('is_logged', true);
Context::set('logged_info', $this->memberInfo);
@ -1600,7 +1807,7 @@
}
/**
* @brief Logged method for providing a personalized menu
* Logged method for providing a personalized menu
* Login information is used in the output widget, or personalized page
**/
function addMemberMenu($act, $str) {
@ -1612,7 +1819,7 @@
}
/**
* @brief Nickname and click Log In to add a pop-up menu that appears when the method
* Nickname and click Log In to add a pop-up menu that appears when the method
**/
function addMemberPopupMenu($url, $str, $icon = '', $target = 'self') {
$member_popup_menu_list = Context::get('member_popup_menu_list');
@ -1628,7 +1835,7 @@
}
/**
* @brief Add users to the member table
* Add users to the member table
**/
function insertMember(&$args, $password_is_hashed = false) {
// Call a trigger (before)
@ -1797,7 +2004,7 @@
}
/**
* @brief Modify member information
* Modify member information
**/
function updateMember($args) {
// Call a trigger (before)
@ -1821,7 +2028,7 @@
unset($args->denied);
}
// check mamber identifier form
// check member identifier form
$config = $oMemberModel->getMemberConfig();
$output = executeQuery('member.getMemberInfoByMemberSrl', $args);
@ -1834,7 +2041,7 @@
$args->email_address = $orgMemberInfo->email_address;
}else{
$member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id);
if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_email_address');
if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_user_id');
$args->user_id = $orgMemberInfo->user_id;
}
@ -1913,7 +2120,7 @@
}
/**
* @brief Modify member password
* Modify member password
**/
function updateMemberPassword($args) {
$output = executeQuery('member.updateChangePasswordDate', $args);
@ -1944,7 +2151,7 @@
}
/**
* @brief Delete User
* Delete User
**/
function deleteMember($member_srl) {
// Call a trigger (before)
@ -2012,7 +2219,7 @@
}
/**
* @brief Destroy all session information
* Destroy all session information
**/
function destroySessionInfo() {
if(!$_SESSION || !is_array($_SESSION)) return;
@ -2112,11 +2319,8 @@
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $newEmail);
$this->setMessage($msg);
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
header('location:'.$returnUrl);
return;
}
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl);
}
function procMemberAuthEmailAddress(){

View file

@ -31,9 +31,13 @@ class memberMobile extends member
return;
}
// Set a template file
// get member module configuration.
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
Context::set('identifier', $config->identifier);
Context::set('referer_url', $_SERVER['HTTP_REFERER']);
// Set a template file
Context::set('referer_url', htmlspecialchars($_SERVER['HTTP_REFERER']));
$this->setTemplateFile('login_form');
}
@ -95,6 +99,39 @@ class memberMobile extends member
$this->setTemplateFile('member_info_mobile');
}
/**
* @brief Find user ID and password
**/
function dispMemberFindAccount() {
if(Context::get('is_logged')) return $this->stop('already_logged');
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
Context::set('identifier', $config->identifier);
$this->setTemplateFile('find_member_account');
}
/**
* @brief Generate a temporary password
**/
function dispMemberGetTempPassword() {
if(Context::get('is_logged')) return $this->stop('already_logged');
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
Context::set('identifier', $config->identifier);
$user_id = Context::get('user_id');
$temp_password = $_SESSION['xe_temp_password_'.$user_id];
unset($_SESSION['xe_temp_password_'.$user_id]);
if(!$user_id||!$temp_password) return new Object(-1,'msg_invaild_request');
Context::set('temp_password', $temp_password);
$this->setTemplateFile('find_temp_password');
}
/**
* @brief Edit member profile
**/
@ -149,6 +186,9 @@ class memberMobile extends member
// A message appears if the user is not logged-in
if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged');
$config = $oMemberModel->getMemberConfig();
Context::set('identifier', $config->identifier);
$logged_info = Context::get('logged_info');
$member_srl = $logged_info->member_srl;

View file

@ -51,6 +51,9 @@
if (!$config->identifier) $config->identifier = 'user_id';
if (!$config->max_error_count) $config->max_error_count = 10;
if (!$config->max_error_count_time) $config->max_error_count_time = 300;
return $config;
}
@ -83,7 +86,8 @@
$oMemberController->addMemberPopupMenu($url,'cmd_view_member_info',$icon_path,'self');
}
// When click other's nickname
if($member_srl != $logged_info->member_srl) {
if($member_srl != $logged_info->member_srl && $logged_info->member_srl)
{
// Send an email
if($member_info->email_address) {
$url = 'mailto:'.htmlspecialchars($member_info->email_address);
@ -197,31 +201,33 @@
/**
* @brief Return member information with member_srl
**/
function getMemberInfoByMemberSrl($member_srl, $site_srl = 0, $columnList = array()) {
if(!$member_srl) return;
function getMemberInfoByMemberSrl($member_srl, $site_srl = 0, $columnList = array()) {
if(!$member_srl) return;
//columnList size zero... get full member info
if(!$GLOBALS['__member_info__'][$member_srl] || count($columnList) == 0) {
//if(true) {
$oCacheHandler = &CacheHandler::getInstance('object');
if($oCacheHandler->isSupport()){
if(!$GLOBALS['__member_info__'][$member_srl] || count($columnList) == 0)
{
$oCacheHandler = &CacheHandler::getInstance('object');
if($oCacheHandler->isSupport())
{
$cache_key = 'object:'.$member_srl;
$output = $oCacheHandler->get($cache_key);
$GLOBALS['__member_info__'][$member_srl] = $oCacheHandler->get($cache_key);
}
if(!$output){
$args->member_srl = $member_srl;
$output = executeQuery('member.getMemberInfoByMemberSrl', $args, $columnList);
if(!$output->data) return;
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output);
}
$this->arrangeMemberInfo($output->data, $site_srl);
}
return $GLOBALS['__member_info__'][$member_srl];
}
if(!$GLOBALS['__member_info__'][$member_srl])
{
$args->member_srl = $member_srl;
$output = executeQuery('member.getMemberInfoByMemberSrl', $args, $columnList);
if(!$output->data) return;
$this->arrangeMemberInfo($output->data, $site_srl);
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $GLOBALS['__member_info__'][$member_srl]);
}
}
return $GLOBALS['__member_info__'][$member_srl];
}
/**
* @brief Add member info from extra_vars and other information

View file

@ -65,6 +65,13 @@
unset($member_info->email_id);
unset($member_info->email_host);
if($logged_info->is_admin != 'Y' && ($member_info->member_srl != $logged_info->member_srl))
{
$start = strpos($member_info->email_address, '@')+1;
$replaceStr = str_repeat('*', (strlen($member_info->email_address) - $start));
$member_info->email_address = substr_replace($member_info->email_address, $replaceStr, $start);
}
if(!$member_info->member_srl) return $this->dispMemberSignUpForm();
Context::set('memberInfo', get_object_vars($member_info));
@ -82,11 +89,11 @@
/**
* @brief Display member join form
**/
function dispMemberSignUpForm() {
//setcookie for redirect url in case of going to member sign up
if (!isset($_COOKIE["XE_REDIRECT_URL"]))
function dispMemberSignUpForm()
{
//setcookie for redirect url in case of going to member sign up
setcookie("XE_REDIRECT_URL", $_SERVER['HTTP_REFERER']);
$oMemberModel = &getModel('member');
// Get the member information if logged-in
if($oMemberModel->isLogged()) return $this->stop('msg_already_logged');
@ -108,6 +115,7 @@
$identifierForm->name = $member_config->identifier;
$identifierForm->value = $member_info->{$member_config->identifier};
Context::set('identifierForm', $identifierForm);
// Set a template file
$this->setTemplateFile('signup_form');
}
@ -247,8 +255,14 @@
$this->setTemplateFile('redirect.html');
return;
}
// get member module configuration.
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
Context::set('identifier', $config->identifier);
// Set a template file
Context::set('referer_url', $_SERVER['HTTP_REFERER']);
Context::set('referer_url', htmlspecialchars($_SERVER['HTTP_REFERER']));
Context::set('act', 'procMemberLogin');
$this->setTemplateFile('login_form');
}

View file

@ -0,0 +1,8 @@
<query id="deleteLoginCountByIp" action="delete">
<tables>
<table name="member_login_count" />
</tables>
<conditions>
<condition operation="equal" column="ipaddress" var="ipaddress" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,8 @@
<query id="deleteLoginCountHistoryByMemberSrl" action="delete">
<tables>
<table name="member_count_history" />
</tables>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="getLoginCountByIp" action="select">
<tables>
<table name="member_login_count" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="ipaddress" var="ipaddress" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="getLoginCountHistoryByMemberSrl" action="select">
<tables>
<table name="member_count_history" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="insertLoginCountByIp" action="insert">
<tables>
<table name="member_login_count" />
</tables>
<columns>
<column name="ipaddress" var="ipaddress" notnull="notnull" />
<column name="count" var="count" notnull="notnull" />
<column name="regdate" default="curdate()" />
<column name="last_update" default="curdate()" />
</columns>
</query>

View file

@ -0,0 +1,10 @@
<query id="insertLoginCountHistoryByMemberSrl" action="insert">
<tables>
<table name="member_count_history" />
</tables>
<columns>
<column name="member_srl" var="member_srl" notnull="notnull" />
<column name="content" var="content" notnull="notnull" />
<column name="last_update" default="curdate()" />
</columns>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateLoginCountByIp" action="update">
<tables>
<table name="member_login_count" />
</tables>
<columns>
<column name="count" var="count" notnull="notnull" />
<column name="last_update" var="last_update" notnull="notnull" default="curdate()" />
</columns>
<conditions>
<condition operation="equal" column="ipaddress" var="ipaddress" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateLoginCountHistoryByMemberSrl" action="update">
<tables>
<table name="member_count_history" />
</tables>
<columns>
<column name="content" var="content" notnull="notnull" />
<column name="last_update" var="last_update" notnull="notnull" default="curdate()" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset version="1.5.0">
<customrules>
</customrules>
<fields>
<field name="email_address" required="true" length="1:200" rule="email" />
</fields>
</ruleset>

View file

@ -5,5 +5,7 @@
<fields>
<field name="webmaster_name" required="true" length="2:40" />
<field name="webmaster_email" length="1:200" rule="email" />
<field name="max_error_count" length="1:20" rule="number" />
<field name="max_error_count_time" length="1:20" rule="number" />
</fields>
</ruleset>

View file

@ -0,0 +1,5 @@
<table name="member_count_history">
<column name="member_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
<column name="content" type="bigtext" notnull="notnull" />
<column name="last_update" type="date" index="idx_last_update" />
</table>

View file

@ -0,0 +1,6 @@
<table name="member_login_count">
<column name="ipaddress" type="varchar" size="128" notnull="notnull" index="idx_ipaddress" />
<column name="count" type="number" size="11" notnull="notnull" />
<column name="regdate" type="date" index="idx_regdate" />
<column name="last_update" type="date" index="idx_last_update" />
</table>

View file

@ -1,6 +1,6 @@
<include target="./common_header.html" />
<load target="filter/find_member_account.xml" />
<h1 class="h1">{$lang->cmd_find_member_account}</h1>
<h2 class="h2">{$lang->cmd_find_member_account_with_email}</h2>
<p>{$lang->about_find_member_account}</p>
<form action="./" method="get" class="form" onsubmit="return procFilter(this, find_member_account)">
<input type="hidden" name="mid" value="{$mid}" />
@ -17,7 +17,7 @@
</div>
</form>
<!--@if(count($lang->find_account_question_items)>1)-->
<h1 class="h1">{$lang->cmd_find_member_account}</h1>
<h2 class="h2">{$lang->cmd_find_member_account_with_email_question}</h2>
<p>{$lang->about_find_account_question}</p>
<form action="./" method="get" class="form" ruleset="@find_member_account_by_question">
<input type="hidden" name="module" value="member" />

View file

@ -5,11 +5,11 @@
</div>
<h1 class="h1">{$lang->cmd_login}</h1>
<form ruleset="@login" action="./" method="post" id="fo_member_login" class="form">
<input type="hidden" name="success_return_url" value="{getUrl('act', '')}" />
<input type="hidden" name="success_return_url" value="{$referer_url}" />
<input type="hidden" name="act" value="procMemberLogin" />
<ul>
<li>
<p class="q"><label for="uid">{$lang->user_id}</label></p>
<p class="q"><label for="uid"><!--@if($identifier == 'user_id')-->{$lang->user_id}<!--@else-->{$lang->email_address}<!--@end--></label></p>
<p class="a"><input type="text" name="user_id" id="uid" value="" /></p>
</li>
<li>

View file

@ -45,8 +45,8 @@
<li>
<p class="q">{$lang->allow_mailing}</p>
<p class="a">
<input type="radio" name="allow_mailing" id="mailingYes" value="Y" checked="checked"|cond="$member_info->allow_mailing == 'Y'"> <label for="mailingYes">{$lang->cmd_yes}</label>
<input type="radio" name="allow_mailing" id="mailingNo" value="N" checked="checked"|cond="$member_info->allow_mailing != 'Y'" > <label for="mailingNo">{$lang->cmd_no}</label>
<input type="radio" name="allow_mailing" id="mailingYes" value="Y" checked="checked"|cond="$member_info->allow_mailing == 'Y'" /> <label for="mailingYes">{$lang->cmd_yes}</label>
<input type="radio" name="allow_mailing" id="mailingNo" value="N" checked="checked"|cond="$member_info->allow_mailing != 'Y'" /> <label for="mailingNo">{$lang->cmd_no}</label>
</p>
</li>
<li>

View file

@ -31,6 +31,11 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
.ff label+input[type=text],
.ff label+input[type=password],
.ff label+textarea{padding:5px}
/* Help */
.hp{background:#eee;border-top:1px solid #ddd;padding:12px 10px !important;margin:10px 0px !important;}
.hp li{margin:0;display:inline;border-left:1px solid #ccc;padding:0 4px 0 8px;}
.hp li:first-child{border:0;}
.hp a{color:#333;text-decoration:none}
/* Button Area */
.bna{text-align:center;padding:0 10px;margin:10px 0}
.bna:after{content:"";display:block;clear:both}
@ -40,3 +45,4 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
.bn[href]{height:26px}
.bn.dark{border-color:#666;background:#777 -webkit-gradient(linear,0% 0%,0% 100%,from(#7e7c78),to(#5c5b58));background:#777 -moz-linear-gradient(top,#7e7c78,#5c5b58);background-color:#777;color:#fff;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset}
.bn.white{border-color:#b5b5b5;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#f6f6f6),color-stop(0.5,#f0f0f0),color-stop(0.5,#e4e4e4));background:#1b1b1b -moz-linear-gradient(top,#fff,#e4e4e4);background-color:#fff;color:#000}
.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}.message p{margin:1em 0!important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#e0e8ec;background:#edf9ff url(../../../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#efdcdc;background:#ffecec url(../../../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#eae9dc;background:#fffdef url(../../../../common/img/msg.update.png) no-repeat 1em .5em}

View file

@ -51,3 +51,4 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
.bn[href]{height:26px}
.bn.dark{border-color:#666;background:#777 -webkit-gradient(linear,0% 0%,0% 100%,from(#7e7c78),to(#5c5b58));background:#777 -moz-linear-gradient(top,#7e7c78,#5c5b58);background-color:#777;color:#fff;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset}
.bn.white{border-color:#b5b5b5;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#f6f6f6),color-stop(0.5,#f0f0f0),color-stop(0.5,#e4e4e4));background:#1b1b1b -moz-linear-gradient(top,#fff,#e4e4e4);background-color:#fff;color:#000}
.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}.message p{margin:1em 0!important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#e0e8ec;background:#edf9ff url(../../../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#efdcdc;background:#ffecec url(../../../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#eae9dc;background:#fffdef url(../../../../common/img/msg.update.png) no-repeat 1em .5em}

View file

@ -0,0 +1,59 @@
<load target="./../../../common/js/jquery.min.js" usecdn="true" index="-1000000" />
<load target="./../../../common/js/xe.min.js" usecdn="true" index="-1000000" />
<load target="css/msignup.css" usecdn="true" />
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="hx h2"><h2>{$lang->cmd_find_member_account_with_email}</h2></div>
<form action="./" ruleset="findAccount" method="post" class="ff">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberFindAccount" />
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="success_return_url" value="{getUrl('act', 'dispMemberFindAccount')}" />
<ul>
<li>
<label for="email_address1">{$lang->email_address}</label>
<input id="email_address1" type="text" name="email_address" />
</li>
</ul>
<div class="bna">
<input type="submit" class="bn dark" value="{$lang->cmd_send_mail}" />
</div>
</form>
<!--@if(count($lang->find_account_question_items)>1)-->
<div class="hx h2"><h2>{$lang->cmd_find_member_account_with_email_question}</h2></div>
<p style="margin:3px 10px;color:#666">{$lang->about_find_account_question}</p>
<form action="./" method="post" class="ff" ruleset="@find_member_account_by_question">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="act" value="procMemberFindAccountByQuestion" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'act', 'dispMemberGetTempPassword')}" />
<input type="hidden" name="page" value="{$page}" />
<ul>
<li cond="$identifier == 'user_id'">
<label for="user_id2">{$lang->user_id}</label>
<input type="text" name="user_id" id="user_id2" />
</li>
<li>
<label for="email_address2">{$lang->email_address}</label>
<input type="text" name="email_address" id="email_address2" />
</li>
<li>
<label for="question">{$lang->find_account_question}</label>
<select id="question" name="find_account_question" style="width:290px;display:block;">
<!--@for($i=1,$c=count($lang->find_account_question_items);$i<$c;$i++)-->
<option value="{$i}">{$lang->find_account_question_items[$i]}</option>
<!--@end-->
</select>
<input type="text" name="find_account_answer" value="" />
</li>
</ul>
<div class="bna">
<input type="submit" class="bn dark" value="{$lang->cmd_get_temp_password}" />
</div>
</form>
<!--@end-->

View file

@ -0,0 +1,7 @@
<load target="css/msignup.css" usecdn="true" />
<div>
<div class="hx h2"><h2>{$lang->cmd_find_member_account}</h2></div>
<p>{$lang->about_temp_password}</p>
<p><!--@if($identifier == 'user_id')-->{$lang->user_id}<!--@else-->{$lang->email_address}<!--@end-->: {$user_id}</p>
<p>{$lang->temp_password}: {$temp_password}</p>
</div>

View file

@ -1,5 +1,9 @@
<load target="./../../../common/js/jquery.min.js" usecdn="true" index="-1000000" />
<load target="css/mlogin.css" usecdn="true" />
<div class="bd">
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="hx h2">
<h2>{$lang->cmd_login}</h2>
</div>
@ -8,12 +12,33 @@
<input type="hidden" name="act" value="procMemberLogin" />
<input type="hidden" name="redirect_url" value="{getUrl('act','')}" />
<ul>
<li><label for="id">{$lang->user_id}</label><input name="user_id" type="text" id="id" value="" /></li>
<li><label for="id"><!--@if($identifier == 'user_id')-->{$lang->user_id}<!--@else-->{$lang->email_address}<!--@end--></label><input name="user_id" type="text" id="id" value="" /></li>
<li><label for="pw">{$lang->password}</label><input name="password" type="password" id="pw" value="" /></li>
</ul>
<div class="message info" id="keep_msg" style="display:none;">
<p>{$lang->about_keep_warning}</p>
</div>
<div class="bna">
<div class="fl"><input name="keep_signed" type="checkbox" value="Y" id="autoLogin" /> <label for="autoLogin">{$lang->keep_signed}</label></div>
<div class="fr"><button type="submit" class="bn dark">{$lang->cmd_login}</button></div>
</div>
<ul class="hp">
<li><a href="{getUrl('','act','dispMemberFindAccount')}"><span>{$lang->cmd_find_member_account}</span></a></li>
<li><a href="{getUrl('','act','dispMemberSignUpForm')}"><span>{$lang->cmd_signup}</span></a></li>
</ul>
</form>
</div>
<script type="text/javascript">
jQuery(function($){
var keep_msg = $('#keep_msg');
keep_msg.hide();
$('#autoLogin').change(function(){
if($(this).is(':checked')){
keep_msg.slideDown(200);
} else {
keep_msg.slideUp(200);
}
});
});
</script>

View file

@ -51,6 +51,14 @@
<p class="q"><label for="change_password_date">{$lang->change_password_date}</label></p>
<p class="a"><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></p>
</li>
<li>
<p class="q"><label for="max_error_count">{$lang->login_trial_limit1}</label></p>
<p class="a"><input type="text" id="max_error_count" name="max_error_count" value="{$config->max_error_count}" style="width:30px" /><span class="desc">{$lang->about_login_trial_limit1}</span></p>
</li>
<li>
<p class="q"><label for="max_error_count_time">{$lang->login_trial_limit2}</label></p>
<input type="text" id="max_error_count_time" name="max_error_count_time" value="{$config->max_error_count_time}" style="width:30px" /><span class="desc">{$lang->unit_sec}({$lang->about_login_trial_limit2})</span></p>
</li>
<li>
<p class="q"><label for="agreement">{$lang->agreement}</label></p>
<p class="a">{$editor}</p>

View file

@ -1,30 +1,38 @@
{@ Context::loadFile(array("./common/js/jquery.js", 'head', '', -100000), true) }
{@ Context::loadFile(array("./common/js/js_app.js", 'head', '', -100000), true) }
{@ Context::loadFile(array("./common/js/common.js", 'head', '', -100000), true) }
{@ Context::loadFile(array("./common/js/xml_handler.js", 'head', '', -100000), true) }
{@ Context::loadFile(array("./common/js/xml_js_filter.js", 'head', '', -100000), true) }
<load target="css/msignup.css" usecdn="true" />
<!--%import("../skins/default/filter/modify_password.xml")-->
<load target="./../../../common/js/jquery.min.js" usecdn="true" index="-1000000" />
<load target="./../../../common/js/xe.min.js" usecdn="true" index="-1000000" />
<load target="../skins/default/js/member.js" usecdn="true" />
<div class="bd">
<h2 class="h2">{$member_title = $lang->cmd_modify_member_password}</h2>
<form id="fo_insert_member" action="./" method="get" onsubmit="return procFilter(this, modify_password)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="page" value="{$page}" />
<fieldset class="sn">
<ul>
<li><label for="uid" class="db fb al">{$lang->user_id}</label><div id="uid">{htmlspecialchars($member_info->user_id)}</div></li>
<li><label for="cpw" class="db fb al">{$lang->current_password}</label><input type="password" name="current_password" id="cpw" class="itx" /></li>
<li><div><label for="npw1" class="db fb al">{$lang->password1}</label><input type="password" name="password1" id="npw1" class="itx" /></div>
<div><label for="npw1" class="db fb al">{$lang->password2}</label><input type="password" name="password2" id="npw2" class="itx" /></div>
<p style="color:#666">{$lang->about_password}</p></li>
</ul>
</fieldset>
<div class="cm">
<input type="submit" value="{$lang->cmd_registration}" class="bn"/><a href="{getUrl('act','dispMemberInfo','member_srl','')}" class="bn"><span>{$lang->cmd_back}</span></a>
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<h2 class="h2">{$member_title = $lang->cmd_modify_member_password}</h2>
<form id="fo_insert_member" action="./" method="post" class="ff" ruleset="modifyPassword">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberModifyPassword" />
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="page" value="{$page}" />
<fieldset class="sn">
<ul>
<li>
<label for="uid" class="db fb al"><!--@if($identifier == 'user_id')-->{$lang->user_id}<!--@else-->{$lang->email_address}<!--@end--></label>
<div id="uid"><!--@if($identifier == 'user_id')-->{htmlspecialchars($member_info->user_id)}<!--@else-->{htmlspecialchars($member_info->email_address)}<!--@end--></div>
</li>
<li>
<label for="cpw" class="db fb al">{$lang->current_password}</label>
<input type="password" name="current_password" id="cpw" class="itx" />
</li>
<li>
<div><label for="npw1" class="db fb al">{$lang->password1}</label><input type="password" name="password1" id="npw1" class="itx" /></div>
<div><label for="npw1" class="db fb al">{$lang->password2}</label><input type="password" name="password2" id="npw2" class="itx" /></div>
<p style="color:#666">{$lang->about_password}</p>
</li>
</ul>
</fieldset>
<div class="cm">
<input type="submit" value="{$lang->cmd_registration}" class="bn dark" />
</div>
</form>
</div>

View file

@ -1,3 +1,5 @@
<load target="./../../../common/js/jquery.min.js" usecdn="true" index="-1000000" />
<load target="./../../../common/js/xe.min.js" usecdn="true" index="-1000000" />
<load target="css/msignup.css" usecdn="true" />
<load target="js/signup_check.js" usecdn="true" />
<!--%load_js_plugin("ui")-->
@ -9,7 +11,7 @@
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="@insertMember" id="fo_insert_member" class="ff" action="./" method="post" enctype="multipart/form-data">
<form ruleset="@insertMember" id="fo_insert_member" class="ff" action="./" method="post" enctype="multipart/form-data">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberInsert" />
<!--@if(!$is_logged && $member_config->agreement)-->
@ -33,23 +35,24 @@
<input type="password" name="password" id="password" value=""/>
</li>
<li>
<label for="password2">{$lang->password2} <em style="color:red">*</em></label>
<label for="password2">{$lang->password3} <em style="color:red">*</em></label>
<input type="password" name="password2" id="password2" value=""/>
</li>
<li loop="$formTags=>$formTag">
<label>{$formTag->title}</label>
<block cond="$formTag->name != 'signature'">{$formTag->inputTag}</block>
<block cond="$formTag->name =='signature'">{$editor}</block>
</li>
<block loop="$formTags=>$formTag" cond="$formTag->name != 'signature'">
<li>
<label>{$formTag->title}</label>
{$formTag->inputTag}
</li>
</block>
<li>
<label>{$lang->allow_mailing}</label>
<input type="radio" name="allow_mailing" id="mailingYes" value="Y" checked="checked"|cond="$member_info->allow_mailing == 'Y'"> <label for="mailingYes">{$lang->cmd_yes}</label>
<input type="radio" name="allow_mailing" id="mailingNo" value="N" checked="checked"|cond="$member_info->allow_mailing != 'Y'" > <label for="mailingNo">{$lang->cmd_no}</label>
<input type="radio" name="allow_mailing" id="mailingYes" value="Y" checked="checked"|cond="$member_info->allow_mailing == 'Y'" /> <label for="mailingYes">{$lang->cmd_yes}</label>
<input type="radio" name="allow_mailing" id="mailingNo" value="N" checked="checked"|cond="$member_info->allow_mailing != 'Y'" /> <label for="mailingNo">{$lang->cmd_no}</label>
</li>
<li>
<label>{$lang->allow_message}</label>
<block loop="$lang->allow_message_type=>$key,$val">
<input type="radio" name="allow_message" value="{$key}" checked="checked"|cond="$member_info->allow_message == $key" id="allow_{$key}" /> <label for="allow_{$key}">{$val}</label>
<input type="radio" name="allow_message" value="{$key}" checked="checked"|cond="$member_info->allow_message == $key || (!$member_info && $key == 'Y')" id="allow_{$key}" /> <label for="allow_{$key}">{$val}</label>
</block>
</li>
</ul>