rhymix/modules/member/member.model.php
Kijin Sung 9364563f4a Merge #1615 선택적 세션 시작 (Proof of Concept) by kijin
* pr/1615:
  Force start session if SSO is used
  Improve and simplify session status detection
  Improve handling of session variables related to validator
  Start session automatically if an addon uses the session and exits
  If cache-friendly behavior is enabled, don't skip updateReadedCount()
  If cache-friendly behavior is enabled, don't update session when reading document or comment
  Add option to enable/disable cache-friendly behavior
  Improve the setCacheControl() method
  Context::setCacheControl() method added etc.
  do not always set mobile/user-agent cookies
  선택적 세션 시작 + 서드파티 자료 호환성 (Proof of Concept)
2015-10-08 15:03:17 +09:00

1186 lines
33 KiB
PHP

<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
* @class memberModel
* @author NAVER (developers@xpressengine.com)
* @brief Model class of the member module
*/
class memberModel extends member
{
/**
* @brief Keep data internally which may be frequently called ...
*/
var $join_form_list = NULL;
/**
* @brief Initialization
*/
function init()
{
}
/**
* @brief Return member's configuration
*/
function getMemberConfig()
{
static $member_config;
if($member_config)
{
return $member_config;
}
// Get member configuration stored in the DB
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
if(!$config->signupForm || !is_array($config->signupForm))
{
$oMemberAdminController = getAdminController('member');
$identifier = ($config->identifier) ? $config->identifier : 'email_address';
$config->signupForm = $oMemberAdminController->createSignupForm($identifier);
}
//for multi language
foreach($config->signupForm AS $key=>$value)
{
$config->signupForm[$key]->title = ($value->isDefaultForm) ? Context::getLang($value->name) : $value->title;
if($config->signupForm[$key]->isPublic != 'N') $config->signupForm[$key]->isPublic = 'Y';
if($value->name == 'find_account_question') $config->signupForm[$key]->isPublic = 'N';
}
// Get terms of user
$config->agreement = memberModel::_getAgreement();
if(!$config->webmaster_name) $config->webmaster_name = 'webmaster';
if(!$config->image_name_max_width) $config->image_name_max_width = 90;
if(!$config->image_name_max_height) $config->image_name_max_height = 20;
if(!$config->image_mark_max_width) $config->image_mark_max_width = 20;
if(!$config->image_mark_max_height) $config->image_mark_max_height = 20;
if(!$config->profile_image_max_width) $config->profile_image_max_width = 90;
if(!$config->profile_image_max_height) $config->profile_image_max_height = 90;
if(!$config->skin) $config->skin = 'default';
if(!$config->colorset) $config->colorset = 'white';
if(!$config->editor_skin || $config->editor_skin == 'default') $config->editor_skin = 'ckeditor';
if(!$config->group_image_mark) $config->group_image_mark = "N";
if(!$config->identifier) $config->identifier = 'user_id';
if(!$config->emailhost_check) $config->emailhost_check = 'allowed';
if(!$config->max_error_count) $config->max_error_count = 10;
if(!$config->max_error_count_time) $config->max_error_count_time = 300;
if(!$config->signature_editor_skin || $config->signature_editor_skin == 'default') $config->signature_editor_skin = 'ckeditor';
if(!$config->sel_editor_colorset) $config->sel_editor_colorset = 'moono';
$member_config = $config;
return $config;
}
function _getAgreement()
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';
if(is_readable($agreement_file))
{
return FileHandler::readFile($agreement_file);
}
$db_info = Context::getDBInfo();
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . $db_info->lang_type . '.txt';
if(is_readable($agreement_file))
{
return FileHandler::readFile($agreement_file);
}
$lang_selected = Context::loadLangSelected();
foreach($lang_selected as $key => $val)
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . $key . '.txt';
if(is_readable($agreement_file))
{
return FileHandler::readFile($agreement_file);
}
}
return null;
}
/**
* @brief Display menus of the member
*/
function getMemberMenu()
{
// Get member_srl of he target member and logged info of the current user
$member_srl = Context::get('target_srl');
$mid = Context::get('cur_mid');
$logged_info = Context::get('logged_info');
$act = Context::get('cur_act');
// When click user's own nickname
if($member_srl == $logged_info->member_srl) $member_info = $logged_info;
// When click other's nickname
else $member_info = $this->getMemberInfoByMemberSrl($member_srl);
$member_srl = $member_info->member_srl;
if(!$member_srl) return;
// List variables
$user_id = $member_info->user_id;
$user_name = $member_info->user_name;
ModuleHandler::triggerCall('member.getMemberMenu', 'before', $null);
$oMemberController = getController('member');
// Display member information (Don't display to non-logged user)
if($logged_info->member_srl)
{
$url = getUrl('','mid',$mid,'act','dispMemberInfo','member_srl',$member_srl);
$oMemberController->addMemberPopupMenu($url,'cmd_view_member_info',$icon_path,'self');
}
// When click other's nickname
if($member_srl != $logged_info->member_srl && $logged_info->member_srl)
{
// Get email config
foreach($this->module_config->signupForm as $field)
{
if($field->name == 'email_address')
{
$email_config = $field;
break;
}
}
// Send an email only if email address is public
if(($logged_info->is_admin == 'Y' || $email_config->isPublic == 'Y') && $member_info->email_address)
{
$url = 'mailto:'.htmlspecialchars($member_info->email_address, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
$oMemberController->addMemberPopupMenu($url,'cmd_send_email',$icon_path);
}
}
// View homepage info
if($member_info->homepage)
$oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->homepage, ENT_COMPAT | ENT_HTML401, 'UTF-8', false), 'homepage', '', 'blank');
// View blog info
if($member_info->blog)
$oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->blog, ENT_COMPAT | ENT_HTML401, 'UTF-8', false), 'blog', '', 'blank');
// Call a trigger (after)
ModuleHandler::triggerCall('member.getMemberMenu', 'after', $null);
// Display a menu for editting member info to a top administrator
if($logged_info->is_admin == 'Y')
{
$url = getUrl('','module','admin','act','dispMemberAdminInsert','member_srl',$member_srl);
$oMemberController->addMemberPopupMenu($url,'cmd_manage_member_info',$icon_path,'MemberModifyInfo');
$url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','member_srl','search_keyword',$member_srl);
$oMemberController->addMemberPopupMenu($url,'cmd_trace_document',$icon_path,'TraceMemberDocument');
$url = getUrl('','module','admin','act','dispCommentAdminList','search_target','member_srl','search_keyword',$member_srl);
$oMemberController->addMemberPopupMenu($url,'cmd_trace_comment',$icon_path,'TraceMemberComment');
}
// Change a language of pop-up menu
$menus = Context::get('member_popup_menu_list');
$menus_count = count($menus);
for($i=0;$i<$menus_count;$i++)
{
$menus[$i]->str = Context::getLang($menus[$i]->str);
}
// Get a list of finalized pop-up menu
$this->add('menus', $menus);
}
/**
* @brief Check if logged-in
*/
function isLogged() {
if($_SESSION['is_logged'])
{
if(Mobile::isFromMobilePhone())
{
return true;
}
else
{
if(ip2long($_SESSION['ipaddress']) >> 8 == ip2long($_SERVER['REMOTE_ADDR']) >> 8)
{
return true;
}
}
}
if(Context::getSessionStatus())
{
$_SESSION['is_logged'] = false;
}
return false;
}
/**
* @brief Return session information of the logged-in user
*/
function getLoggedInfo()
{
// Return session info if session info is requested and the user is logged-in
if($this->isLogged())
{
$logged_info = Context::get('logged_info');
// Admin/Group list defined depending on site_module_info
$site_module_info = Context::get('site_module_info');
if($site_module_info->site_srl)
{
$logged_info->group_list = $this->getMemberGroups($logged_info->member_srl, $site_module_info->site_srl);
// Add is_site_admin bool variable into logged_info if site_administrator is
$oModuleModel = getModel('module');
if($oModuleModel->isSiteAdmin($logged_info)) $logged_info->is_site_admin = true;
else $logged_info->is_site_admin = false;
}
else
{
// Register a default group if the site doesn't have a member group
if(count($logged_info->group_list) === 0)
{
$default_group = $this->getDefaultGroup(0);
$oMemberController = getController('member');
$oMemberController->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, 0);
$groups[$default_group->group_srl] = $default_group->title;
$logged_info->group_list = $groups;
}
$logged_info->is_site_admin = false;
}
Context::set('logged_info', $logged_info);
return $logged_info;
}
return NULL;
}
/**
* @brief Return member information with user_id
*/
function getMemberInfoByUserID($user_id, $columnList = array())
{
if(!$user_id) return;
$args = new stdClass;
$args->user_id = $user_id;
$output = executeQuery('member.getMemberInfo', $args);
if(!$output->toBool()) return $output;
if(!$output->data) return;
$member_info = $this->arrangeMemberInfo($output->data);
return $member_info;
}
/**
* @brief Return member information with email_address
*/
function getMemberInfoByEmailAddress($email_address)
{
if(!$email_address) return;
$args = new stdClass();
$db_info = Context::getDBInfo ();
if($db_info->master_db['db_type'] == "cubrid")
{
$args->email_address = strtolower($email_address);
$output = executeQuery('member.getMemberInfoByEmailAddressForCubrid', $args);
}
else
{
$args->email_address = $email_address;
$output = executeQuery('member.getMemberInfoByEmailAddress', $args);
}
if(!$output->toBool()) return $output;
if(!$output->data) return;
$member_info = $this->arrangeMemberInfo($output->data);
return $member_info;
}
/**
* @brief Return member information with member_srl
*/
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)
{
$GLOBALS['__member_info__'][$member_srl] = false;
$oCacheHandler = CacheHandler::getInstance('object');
if($oCacheHandler->isSupport())
{
$columnList = array();
$object_key = 'member_info:' . getNumberingPath($member_srl) . $member_srl;
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$GLOBALS['__member_info__'][$member_srl] = $oCacheHandler->get($cache_key);
}
if($GLOBALS['__member_info__'][$member_srl] === false)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$output = executeQuery('member.getMemberInfoByMemberSrl', $args, $columnList);
if(!$output->data)
{
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, new stdClass);
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
*/
function arrangeMemberInfo($info, $site_srl = 0)
{
if(!$GLOBALS['__member_info__'][$info->member_srl])
{
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
$info->profile_image = $this->getProfileImage($info->member_srl);
$info->image_name = $this->getImageName($info->member_srl);
$info->image_mark = $this->getImageMark($info->member_srl);
if($config->group_image_mark=='Y')
{
$info->group_mark = $this->getGroupImageMark($info->member_srl,$site_srl);
}
$info->signature = $this->getSignature($info->member_srl);
$info->group_list = $this->getMemberGroups($info->member_srl, $site_srl);
$extra_vars = unserialize($info->extra_vars);
unset($info->extra_vars);
if($extra_vars)
{
foreach($extra_vars as $key => $val)
{
if(!is_array($val) && strpos($val, '|@|') !== FALSE) $val = explode('|@|', $val);
if(!$info->{$key}) $info->{$key} = $val;
}
}
if(strlen($info->find_account_answer) == 32 && preg_match('/[a-zA-Z0-9]+/', $info->find_account_answer))
{
$info->find_account_answer = null;
}
// XSS defence
$oSecurity = new Security($info);
$oSecurity->encodeHTML('user_id', 'user_name', 'nick_name', 'find_account_answer', 'description', 'address.', 'group_list..');
$info->homepage = strip_tags($info->homepage);
$info->blog = strip_tags($info->blog);
if($extra_vars)
{
foreach($extra_vars as $key => $val)
{
if(is_array($val))
{
$oSecurity->encodeHTML($key . '.');
}
else
{
$oSecurity->encodeHTML($key);
}
}
}
// Check format.
$oValidator = new Validator();
if(!$oValidator->applyRule('url', $info->homepage))
{
$info->homepage = '';
}
if(!$oValidator->applyRule('url', $info->blog))
{
$info->blog = '';
}
$GLOBALS['__member_info__'][$info->member_srl] = $info;
}
return $GLOBALS['__member_info__'][$info->member_srl];
}
/**
* @brief Get member_srl corresponding to userid
*/
function getMemberSrlByUserID($user_id)
{
$args = new stdClass();
$args->user_id = $user_id;
$output = executeQuery('member.getMemberSrl', $args);
return $output->data->member_srl;
}
/**
* @brief Get member_srl corresponding to EmailAddress
*/
function getMemberSrlByEmailAddress($email_address)
{
$args = new stdClass();
$args->email_address = $email_address;
$output = executeQuery('member.getMemberSrl', $args);
return $output->data->member_srl;
}
/**
* @brief Get member_srl corresponding to nickname
*/
function getMemberSrlByNickName($nick_name)
{
$args = new stdClass();
$args->nick_name = $nick_name;
$output = executeQuery('member.getMemberSrl', $args);
return $output->data->member_srl;
}
/**
* @brief Return member_srl of the current logged-in user
*/
function getLoggedMemberSrl()
{
if(!$this->isLogged()) return;
return $_SESSION['member_srl'];
}
/**
* @brief Return user_id of the current logged-in user
*/
function getLoggedUserID()
{
if(!$this->isLogged()) return;
$logged_info = Context::get('logged_info');
return $logged_info->user_id;
}
/**
* @brief Get a list of groups which the member_srl belongs to
*/
function getMemberGroups($member_srl, $site_srl = 0, $force_reload = false)
{
static $member_groups = array();
// cache controll
$group_list = false;
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$object_key = 'member_groups:' . getNumberingPath($member_srl) . $member_srl . '_'.$site_srl;
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$group_list = $oCacheHandler->get($cache_key);
}
if(!$member_groups[$member_srl][$site_srl] || $force_reload)
{
if($group_list === false)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$args->site_srl = $site_srl;
$output = executeQueryArray('member.getMemberGroups', $args);
$group_list = $output->data;
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $group_list);
}
if(!$group_list) return array();
foreach($group_list as $group)
{
$result[$group->group_srl] = $group->title;
}
$member_groups[$member_srl][$site_srl] = $result;
}
return $member_groups[$member_srl][$site_srl];
}
/**
* @brief Get a list of groups which member_srls belong to
*/
function getMembersGroups($member_srls, $site_srl = 0)
{
$args->member_srls = implode(',',$member_srls);
$args->site_srl = $site_srl;
$args->sort_index = 'list_order';
$output = executeQueryArray('member.getMembersGroups', $args);
if(!$output->data) return array();
$result = array();
foreach($output->data as $key=>$val)
{
$result[$val->member_srl][] = $val->title;
}
return $result;
}
/**
* @brief Get a default group
*/
function getDefaultGroup($site_srl = 0, $columnList = array())
{
$default_group = false;
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$columnList = array();
$object_key = 'default_group_' . $site_srl;
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$default_group = $oCacheHandler->get($cache_key);
}
if($default_group === false)
{
$args = new stdClass();
$args->site_srl = $site_srl;
$output = executeQuery('member.getDefaultGroup', $args, $columnList);
$default_group = $output->data;
if($oCacheHandler->isSupport())
{
$oCacheHandler->put($cache_key, $default_group);
}
}
return $default_group;
}
/**
* @brief Get an admin group
*/
function getAdminGroup($columnList = array())
{
$output = executeQuery('member.getAdminGroup', $args, $columnList);
return $output->data;
}
/**
* @brief Get group info corresponding to group_srl
*/
function getGroup($group_srl, $columnList = array())
{
$args = new stdClass;
$args->group_srl = $group_srl;
$output = executeQuery('member.getGroup', $args, $columnList);
return $output->data;
}
/**
* @brief Get a list of groups
*/
function getGroups($site_srl = 0)
{
if(!$GLOBALS['__group_info__'][$site_srl])
{
$result = array();
if(!isset($site_srl))
{
$site_srl = 0;
}
$group_list = false;
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$object_key = 'member_groups:site_'.$site_srl;
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$group_list = $oCacheHandler->get($cache_key);
}
if($group_list === false)
{
$args = new stdClass();
$args->site_srl = $site_srl;
$args->sort_index = 'list_order';
$args->order_type = 'asc';
$output = executeQueryArray('member.getGroups', $args);
$group_list = $output->data;
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $group_list);
}
if(!$group_list)
{
return array();
}
foreach($group_list as $val)
{
$result[$val->group_srl] = $val;
}
$GLOBALS['__group_info__'][$site_srl] = $result;
}
return $GLOBALS['__group_info__'][$site_srl];
}
public function getApiGroups()
{
$siteSrl = Context::get('siteSrl');
$groupInfo = $this->getGroups($siteSrl);
$this->add($groupInfo);
}
/**
* @brief Get a list of member join forms
*
* This method works as an extend filter of modules/member/tpl/filter/insert.xml.
* To use as extend_filter, the argument should be boolean.
* When the argument is true, it returns object result in type of filter.
*/
function getJoinFormList($filter_response = false)
{
global $lang;
// Set to ignore if a super administrator.
$logged_info = Context::get('logged_info');
if(!$this->join_form_list)
{
// Argument setting to sort list_order column
$args = new stdClass();
$args->sort_index = "list_order";
$output = executeQuery('member.getJoinFormList', $args);
// NULL if output data deosn't exist
$join_form_list = $output->data;
if(!$join_form_list) return NULL;
// Need to unserialize because serialized array is inserted into DB in case of default_value
if(!is_array($join_form_list)) $join_form_list = array($join_form_list);
$join_form_count = count($join_form_list);
for($i=0;$i<$join_form_count;$i++)
{
$join_form_list[$i]->column_name = strtolower($join_form_list[$i]->column_name);
$member_join_form_srl = $join_form_list[$i]->member_join_form_srl;
$column_type = $join_form_list[$i]->column_type;
$column_name = $join_form_list[$i]->column_name;
$column_title = $join_form_list[$i]->column_title;
$default_value = $join_form_list[$i]->default_value;
// Add language variable
$lang->extend_vars[$column_name] = $column_title;
// unserialize if the data type if checkbox, select and so on
if(in_array($column_type, array('checkbox','select','radio')))
{
$join_form_list[$i]->default_value = unserialize($default_value);
if(!$join_form_list[$i]->default_value[0]) $join_form_list[$i]->default_value = '';
}
else
{
$join_form_list[$i]->default_value = '';
}
$list[$member_join_form_srl] = $join_form_list[$i];
}
$this->join_form_list = $list;
}
// Get object style if the filter_response is true
if($filter_response && count($this->join_form_list))
{
foreach($this->join_form_list as $key => $val)
{
if($val->is_active != 'Y') continue;
unset($obj);
$obj->type = $val->column_type;
$obj->name = $val->column_name;
$obj->lang = $val->column_title;
if($logged_info->is_admin != 'Y') $obj->required = $val->required=='Y'?true:false;
else $obj->required = false;
$filter_output[] = $obj;
unset($open_obj);
$open_obj->name = 'open_'.$val->column_name;
$open_obj->required = false;
$filter_output[] = $open_obj;
}
return $filter_output;
}
// Return the result
return $this->join_form_list;
}
/**
* get used join form list.
*
* @return array $joinFormList
*/
function getUsedJoinFormList()
{
$args = new stdClass();
$args->sort_index = "list_order";
$output = executeQueryArray('member.getJoinFormList', $args);
if(!$output->toBool())
{
return array();
}
$joinFormList = array();
foreach($output->data as $val)
{
if($val->is_active != 'Y')
{
continue;
}
$joinFormList[] = $val;
}
return $joinFormList;
}
/**
* @brief Combine extend join form and member information (used to modify member information)
*/
function getCombineJoinForm($member_info)
{
$extend_form_list = $this->getJoinFormlist();
if(!$extend_form_list) return;
// Member info is open only to an administrator and him/herself when is_private is true.
$logged_info = Context::get('logged_info');
foreach($extend_form_list as $srl => $item)
{
$column_name = $item->column_name;
$value = $member_info->{$column_name};
// Change values depening on the type of extend form
switch($item->column_type)
{
case 'checkbox' :
if($value && !is_array($value)) $value = array($value);
break;
case 'text' :
case 'homepage' :
case 'email_address' :
case 'tel' :
case 'textarea' :
case 'select' :
case 'kr_zip' :
break;
}
$extend_form_list[$srl]->value = $value;
if($member_info->{'open_'.$column_name}=='Y') $extend_form_list[$srl]->is_opened = true;
else $extend_form_list[$srl]->is_opened = false;
}
return $extend_form_list;
}
/**
* @brief Get a join form
*/
function getJoinForm($member_join_form_srl)
{
$args->member_join_form_srl = $member_join_form_srl;
$output = executeQuery('member.getJoinForm', $args);
$join_form = $output->data;
if(!$join_form) return NULL;
$column_type = $join_form->column_type;
$default_value = $join_form->default_value;
if(in_array($column_type, array('checkbox','select','radio')))
{
$join_form->default_value = unserialize($default_value);
}
else
{
$join_form->default_value = '';
}
return $join_form;
}
/**
* @brief Get a list of denied IDs
*/
function getDeniedIDList()
{
if(!$this->denied_id_list)
{
$args->sort_index = "list_order";
$args->page = Context::get('page');
$args->list_count = 40;
$args->page_count = 10;
$output = executeQuery('member.getDeniedIDList', $args);
$this->denied_id_list = $output;
}
return $this->denied_id_list;
}
function getDeniedIDs()
{
$output = executeQueryArray('member.getDeniedIDs');
if(!$output->toBool()) return array();
return $output->data;
}
function getDeniedNickNames()
{
$output = executeQueryArray('member.getDeniedNickNames');
if(!$output->toBool())
{
return array();
}
return $output->data;
}
function getManagedEmailHosts()
{
static $output;
if(isset($output->data)) return $output->data;
$output = executeQueryArray('member.getManagedEmailHosts');
if(!$output->toBool())
{
$output->data = array();
return array();
}
return $output->data;
}
/**
* @brief Verify if ID is denied
*/
function isDeniedID($user_id)
{
$args = new stdClass();
$args->user_id = $user_id;
$output = executeQuery('member.chkDeniedID', $args);
if($output->data->count) return true;
return false;
}
/**
* @brief Verify if nick name is denied
*/
function isDeniedNickName($nickName)
{
$args = new stdClass();
$args->nick_name = $nickName;
$output = executeQuery('member.chkDeniedNickName', $args);
if($output->data->count) return true;
if(!$output->toBool())
{
return true;
}
return false;
}
/**
* @brief Verify if email_host from email_address is denied
*/
function isDeniedEmailHost($email_address)
{
$email_address = trim($email_address);
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managedHosts = $oMemberModel->getManagedEmailHosts();
if(count($managedHosts) < 1) return FALSE;
static $return;
if(!isset($return[$email_address]))
{
$email = explode('@',$email_address);
$email_hostname = $email[1];
if(!$email_hostname) return TRUE;
foreach($managedHosts as $managedHost)
{
if($managedHost->email_host && strtolower($managedHost->email_host) == strtolower($email_hostname))
{
$return[$email_address] = TRUE;
}
}
if(!$return[$email_address])
{
$return[$email_address] = FALSE;
}
}
if($emailhost_check == 'prohibited')
{
return $return[$email_address];
}
else
{
return (!$return[$email_address]);
}
}
/**
* @brief Get information of the profile image
*/
function getProfileImage($member_srl)
{
if(!isset($GLOBALS['__member_info__']['profile_image'][$member_srl]))
{
$GLOBALS['__member_info__']['profile_image'][$member_srl] = null;
$exts = array('gif','jpg','png');
for($i=0;$i<3;$i++)
{
$image_name_file = sprintf('files/member_extra_info/profile_image/%s%d.%s', getNumberingPath($member_srl), $member_srl, $exts[$i]);
if(file_exists($image_name_file))
{
list($width, $height, $type, $attrs) = getimagesize($image_name_file);
$info = new stdClass();
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_name_file;
$info->file = './'.$image_name_file;
$GLOBALS['__member_info__']['profile_image'][$member_srl] = $info;
break;
}
}
}
return $GLOBALS['__member_info__']['profile_image'][$member_srl];
}
/**
* @brief Get the image name
*/
function getImageName($member_srl)
{
if(!isset($GLOBALS['__member_info__']['image_name'][$member_srl]))
{
$image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl);
if(file_exists($image_name_file))
{
list($width, $height, $type, $attrs) = getimagesize($image_name_file);
$info = new stdClass;
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_name_file;
$info->file = './'.$image_name_file;
$GLOBALS['__member_info__']['image_name'][$member_srl] = $info;
}
else $GLOBALS['__member_info__']['image_name'][$member_srl] = null;
}
return $GLOBALS['__member_info__']['image_name'][$member_srl];
}
/**
* @brief Get the image mark
*/
function getImageMark($member_srl)
{
if(!isset($GLOBALS['__member_info__']['image_mark'][$member_srl]))
{
$image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl);
if(file_exists($image_mark_file))
{
list($width, $height, $type, $attrs) = getimagesize($image_mark_file);
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_mark_file;
$info->file = './'.$image_mark_file;
$GLOBALS['__member_info__']['image_mark'][$member_srl] = $info;
}
else $GLOBALS['__member_info__']['image_mark'][$member_srl] = null;
}
return $GLOBALS['__member_info__']['image_mark'][$member_srl];
}
/**
* @brief Get the image mark of the group
*/
function getGroupImageMark($member_srl,$site_srl=0)
{
if(!isset($GLOBALS['__member_info__']['group_image_mark'][$member_srl]))
{
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
if($config->group_image_mark!='Y')
{
return null;
}
$member_group = $this->getMemberGroups($member_srl,$site_srl);
$groups_info = $this->getGroups($site_srl);
if(count($member_group) > 0 && is_array($member_group))
{
$memberGroups = array_keys($member_group);
foreach($groups_info as $group_srl=>$group_info)
{
if(in_array($group_srl, $memberGroups))
{
if($group_info->image_mark)
{
$info = new stdClass();
$info->title = $group_info->title;
$info->description = $group_info->description;
$info->src = $group_info->image_mark;
$GLOBALS['__member_info__']['group_image_mark'][$member_srl] = $info;
break;
}
}
}
}
if (!$info) $GLOBALS['__member_info__']['group_image_mark'][$member_srl] == 'N';
}
if ($GLOBALS['__member_info__']['group_image_mark'][$member_srl] == 'N') return null;
return $GLOBALS['__member_info__']['group_image_mark'][$member_srl];
}
/**
* @brief Get user's signature
*/
function getSignature($member_srl)
{
if(!isset($GLOBALS['__member_info__']['signature'][$member_srl]))
{
$filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl);
if(file_exists($filename))
{
$buff = FileHandler::readFile($filename);
$signature = preg_replace('/<\?.*\?>/', '', $buff);
$GLOBALS['__member_info__']['signature'][$member_srl] = $signature;
}
else $GLOBALS['__member_info__']['signature'][$member_srl] = null;
}
return $GLOBALS['__member_info__']['signature'][$member_srl];
}
/**
* @brief Compare plain text password to the password saved in DB
* @param string $hashed_password The hash that was saved in DB
* @param string $password_text The password to check
* @param int $member_srl Set this to member_srl when comparing a member's password (optional)
* @return bool
*/
function isValidPassword($hashed_password, $password_text, $member_srl=null)
{
// False if no password in entered
if(!$password_text)
{
return false;
}
// Check the password
$oPassword = new Password();
$current_algorithm = $oPassword->checkAlgorithm($hashed_password);
$match = $oPassword->checkPassword($password_text, $hashed_password, $current_algorithm);
if(!$match)
{
return false;
}
// Update the encryption method if necessary
$config = $this->getMemberConfig();
if($member_srl > 0 && $config->password_hashing_auto_upgrade != 'N')
{
$need_upgrade = false;
if(!$need_upgrade)
{
$required_algorithm = $oPassword->getCurrentlySelectedAlgorithm();
if($required_algorithm !== $current_algorithm) $need_upgrade = true;
}
if(!$need_upgrade)
{
$required_work_factor = $oPassword->getWorkFactor();
$current_work_factor = $oPassword->checkWorkFactor($hashed_password);
if($current_work_factor !== false && $required_work_factor > $current_work_factor) $need_upgrade = true;
}
if($need_upgrade === true)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$args->hashed_password = $this->hashPassword($password_text, $required_algorithm);
$oMemberController = getController('member');
$oMemberController->updateMemberPassword($args);
}
}
return true;
}
/**
* @brief Create a hash of plain text password
* @param string $password_text The password to hash
* @param string $algorithm The algorithm to use (optional, only set this when you want to use a non-default algorithm)
* @return string
*/
function hashPassword($password_text, $algorithm = null)
{
$oPassword = new Password();
return $oPassword->createHash($password_text, $algorithm);
}
function checkPasswordStrength($password, $strength)
{
$logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y') return true;
if($strength == NULL)
{
$config = $this->getMemberConfig();
$strength = $config->password_strength?$config->password_strength:'normal';
}
$length = strlen($password);
switch ($strength) {
case 'high':
if($length < 8 || !preg_match('/[^a-zA-Z0-9]/', $password)) return false;
/* no break */
case 'normal':
if($length < 6 || !preg_match('/[a-zA-Z]/', $password) || !preg_match('/[0-9]/', $password)) return false;
break;
case 'low':
if($length < 4) return false;
break;
}
return true;
}
function getAdminGroupSrl($site_srl = 0)
{
$groupSrl = 0;
$output = $this->getGroups($site_srl);
if(is_array($output))
{
foreach($output AS $key=>$value)
{
if($value->is_admin == 'Y')
{
$groupSrl = $value->group_srl;
break;
}
}
}
return $groupSrl;
}
}
/* End of file member.model.php */
/* Location: ./modules/member/member.model.php */