Fix #955 exclude inaccessible modules from integration search

This commit is contained in:
Kijin Sung 2017-12-06 14:04:36 +09:00
parent f0ad692650
commit fbd9af16a9
3 changed files with 101 additions and 27 deletions

View file

@ -30,21 +30,24 @@ class integration_searchModel extends module
*/
function getDocuments($target, $module_srls_list, $search_target, $search_keyword, $page=1, $list_count = 20)
{
if(is_array($module_srls_list)) $module_srls_list = implode(',',$module_srls_list);
if(!is_array($module_srls_list))
{
$module_srls_list = $module_srl_list ? explode(',', $module_srls_list) : array();
}
$accessible_modules = array_keys(getModel('module')->getAccessibleModuleList());
$args = new stdClass();
if($target == 'exclude')
{
$module_srls_list .= ',0'; // exclude 'trash'
if ($module_srls_list{0} == ',') $module_srls_list = substr($module_srls_list, 1);
$args->exclude_module_srl = $module_srls_list;
$args->module_srl = $accessible_modules;
$args->exclude_module_srl = array_diff($module_srls_list, $accessible_modules);
}
else
{
$args->module_srl = $module_srls_list;
$args->exclude_module_srl = '0'; // exclude 'trash'
$args->module_srl = array_intersect($module_srls_list, $accessible_modules);
$args->exclude_module_srl = array(0); // exclude 'trash'
}
$args->page = $page;
$args->list_count = $list_count;
$args->page_count = 10;
@ -73,21 +76,23 @@ class integration_searchModel extends module
*/
function getComments($target, $module_srls_list, $search_keyword, $page=1, $list_count = 20)
{
$args = new stdClass();
if(is_array($module_srls_list))
if(!is_array($module_srls_list))
{
if (count($module_srls_list) > 0) $module_srls = implode(',',$module_srls_list);
$module_srls_list = $module_srl_list ? explode(',', $module_srls_list) : array();
}
$accessible_modules = array_keys(getModel('module')->getAccessibleModuleList());
$args = new stdClass();
if($target == 'exclude')
{
$args->module_srl = $accessible_modules;
$args->exclude_module_srl = array_diff($module_srls_list, $accessible_modules);
}
else
{
if($module_srls_list)
{
$module_srls = $module_srls_list;
}
$args->module_srl = array_intersect($module_srls_list, $accessible_modules);
$args->exclude_module_srl = array(0); // exclude 'trash'
}
if($target == 'exclude') $args->exclude_module_srl = $module_srls;
else $args->module_srl = $module_srls;
$args->page = $page;
$args->list_count = $list_count;
@ -120,12 +125,25 @@ class integration_searchModel extends module
{
$oTrackbackModel = getAdminModel('trackback');
if(!$oTrackbackModel) return new BaseObject();
$args = new stdClass();
if(is_array($module_srls_list)) $module_srls = implode(',',$module_srls_list);
else $module_srls = $module_srls_list;
if($target == 'exclude') $args->exclude_module_srl = $module_srls;
else $args->module_srl = $module_srls;
if(!is_array($module_srls_list))
{
$module_srls_list = $module_srl_list ? explode(',', $module_srls_list) : array();
}
$accessible_modules = array_keys(getModel('module')->getAccessibleModuleList());
$args = new stdClass();
if($target == 'exclude')
{
$args->module_srl = $accessible_modules;
$args->exclude_module_srl = array_diff($module_srls_list, $accessible_modules);
}
else
{
$args->module_srl = array_intersect($module_srls_list, $accessible_modules);
$args->exclude_module_srl = array(0); // exclude 'trash'
}
$args->page = $page;
$args->list_count = $list_count;
$args->page_count = 10;
@ -153,12 +171,24 @@ class integration_searchModel extends module
*/
function _getFiles($target, $module_srls_list, $search_keyword, $page, $list_count, $direct_download = 'Y')
{
$args = new stdClass();
if(!is_array($module_srls_list))
{
$module_srls_list = $module_srl_list ? explode(',', $module_srls_list) : array();
}
$accessible_modules = array_keys(getModel('module')->getAccessibleModuleList());
if(is_array($module_srls_list)) $module_srls = implode(',',$module_srls_list);
else $module_srls = $module_srls_list;
if($target == 'exclude') $args->exclude_module_srl = $module_srls;
else $args->module_srl = $module_srls;
$args = new stdClass();
if($target == 'exclude')
{
$args->module_srl = $accessible_modules;
$args->exclude_module_srl = array_diff($module_srls_list, $accessible_modules);
}
else
{
$args->module_srl = array_intersect($module_srls_list, $accessible_modules);
$args->exclude_module_srl = array(0); // exclude 'trash'
}
$args->page = $page;
$args->list_count = $list_count;
$args->page_count = 10;

View file

@ -3253,6 +3253,7 @@ class memberController extends member
$member_srl = intval($member_srl);
Rhymix\Framework\Cache::delete("member:member_info:$member_srl");
Rhymix\Framework\Cache::delete("member:member_groups:$member_srl:site:$site_srl");
Rhymix\Framework\Cache::delete("site_and_module:accessible_modules:$member_srl");
if ($site_srl != 0)
{
Rhymix\Framework\Cache::delete("member:member_groups:$member_srl:site:0");

View file

@ -2185,6 +2185,49 @@ class moduleModel extends module
return $__cache = $grant;
}
/**
* Get the list of modules that the member can access.
*
* @param object $member_info
* @return array
*/
function getAccessibleModuleList($member_info = null)
{
if(!$member_info)
{
$member_info = Context::get('logged_info');
}
$result = Rhymix\Framework\Cache::get(sprintf('site_and_module:accessible_modules:%d', $member_info->member_srl));
if($result === null)
{
$mid_list = $this->getMidList();
$result = array();
foreach($mid_list as $module_info)
{
$grant = $this->getGrant($module_info, $member_info);
if(!$grant->access)
{
continue;
}
foreach(array('list', 'view') as $require_grant)
{
if(isset($grant->{$require_grant}) && $grant->{$require_grant} === false)
{
continue 2;
}
}
$result[$module_info->module_srl] = $module_info;
}
ksort($result);
Rhymix\Framework\Cache::set(sprintf('site_and_module:accessible_modules:%d', $member_info->member_srl), $result);
}
return $result;
}
/**
* Get privileges(granted) information of the member for target module by target_srl
* @param string $target_srl as module_srl. It may be a reference serial number