diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index 364a22d8c..57f746cea 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -352,6 +352,8 @@ class moduleAdminController extends module if(!$output->toBool()) return $output; } } + + Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl"); $this->setMessage('success_registed'); } @@ -632,7 +634,10 @@ class moduleAdminController extends module } } } + + Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl"); $this->setMessage('success_registed'); + if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { if(Context::get('success_return_url')) diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 77bc33052..f5568f294 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -827,6 +827,7 @@ class moduleController extends module $output = executeQueryArray('module.insertSiteAdmin', $args); if(!$output->toBool()) return $output; } + Rhymix\Framework\Cache::delete("site_and_module:site_admins:$site_srl"); return new Object(); } @@ -842,8 +843,11 @@ class moduleController extends module $member_info = $oMemberModel->getMemberInfoByEmailAddress($admin_id); else $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); - + if(!$member_info->member_srl) return; + + Rhymix\Framework\Cache::delete("site_and_module:module_admins:$module_srl"); + $args = new stdClass(); $args->module_srl = $module_srl; $args->member_srl = $member_info->member_srl; @@ -864,6 +868,9 @@ class moduleController extends module $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); if($member_info->member_srl) $args->member_srl = $member_info->member_srl; } + + Rhymix\Framework\Cache::delete("site_and_module:module_admins:$module_srl"); + return executeQuery('module.deleteAdminId', $args); } @@ -1046,6 +1053,8 @@ class moduleController extends module executeQuery('module.insertModuleGrant', $args); } } + + Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl"); } /** @@ -1055,7 +1064,10 @@ class moduleController extends module { $args = new stdClass(); $args->module_srl = $module_srl; - return executeQuery('module.deleteModuleGrants', $args); + $output = executeQuery('module.deleteModuleGrants', $args); + + Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl"); + return $output; } /** diff --git a/modules/module/module.model.php b/modules/module/module.model.php index a49765da9..cde31a42c 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1594,25 +1594,36 @@ class moduleModel extends module */ function isSiteAdmin($member_info, $site_srl = null) { - if(!$member_info->member_srl) return false; - if($member_info->is_admin == 'Y') return true; - - $args = new stdClass(); - if(!isset($site_srl)) + if (!$member_info || !$member_info->member_srl) + { + return false; + } + if ($member_info->is_admin == 'Y') + { + return true; + } + if ($site_srl === null) { $site_module_info = Context::get('site_module_info'); - if(!$site_module_info) return; - $args->site_srl = $site_module_info->site_srl; + if(!$site_module_info) return false; + $site_srl = $site_module_info->site_srl; } - else + + $site_srl = $site_srl ?: 0; + $site_admins = Rhymix\Framework\Cache::get("site_and_module:site_admins:$site_srl"); + if ($site_admins === null) { + $args = new stdClass; $args->site_srl = $site_srl; + $output = executeQueryArray('module.isSiteAdmin', $args); + $site_admins = array(); + foreach ($output->data as $site_admin) + { + $site_admins[$site_admin->member_srl] = true; + } + Rhymix\Framework\Cache::set("site_and_module:site_admins:$site_srl", $site_admins, 0, true); } - - $args->member_srl = $member_info->member_srl; - $output = executeQuery('module.isSiteAdmin', $args); - if($output->data->member_srl == $args->member_srl) return true; - return false; + return isset($site_admins[$member_info->member_srl]); } /** @@ -1626,6 +1637,43 @@ class moduleModel extends module return $output->data; } + /** + * @brief Check if a member is a module administrator + */ + function isModuleAdmin($member_info, $module_srl = null) + { + if (!$member_info || !$member_info->member_srl) + { + return false; + } + if ($member_info->is_admin == 'Y') + { + return true; + } + if ($module_srl === null) + { + $site_module_info = Context::get('site_module_info'); + if(!$site_module_info) return false; + $module_srl = $site_module_info->module_srl; + } + + $module_srl = $module_srl ?: 0; + $module_admins = Rhymix\Framework\Cache::get("site_and_module:module_admins:$module_srl"); + if ($module_admins === null) + { + $args = new stdClass; + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleAdmin', $args); + $module_admins = array(); + foreach ($output->data as $module_admin) + { + $module_admins[$module_admin->member_srl] = true; + } + Rhymix\Framework\Cache::set("site_and_module:module_admins:$module_srl", $module_admins, 0, true); + } + return isset($module_admins[$member_info->member_srl]); + } + /** * @brief Get admin ID of the module */ @@ -1862,13 +1910,18 @@ class moduleModel extends module */ function getGrant($module_info, $member_info, $xml_info = '') { + if (!$xml_info && isset($GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)])) + { + return $GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)]; + } + $grant = new stdClass(); - if(!$xml_info) { $module = $module_info->module; $xml_info = $this->getModuleActionXml($module); } + // Set variables to grant group permission $module_srl = $module_info->module_srl; $grant_info = $xml_info->grant; @@ -1898,15 +1951,13 @@ class moduleModel extends module // Get a type of granted permission $grant->access = $grant->manager = $grant->is_site_admin = ($member_info->is_admin=='Y'||$this->isSiteAdmin($member_info, $module_info->site_srl))?true:false; $grant->is_admin = ($member_info->is_admin == 'Y') ? true : false; + // If a just logged-in member is, check if the member is a module administrator - if(!$grant->manager && $member_info->member_srl) + if (!$grant->manager && $member_info->member_srl && $this->isModuleAdmin($member_info, $module_srl)) { - $args = new stdClass(); - $args->module_srl = $module_srl; - $args->member_srl = $member_info->member_srl; - $output = executeQuery('module.getModuleAdmin',$args); - if($output->data && $output->data->member_srl == $member_info->member_srl) $grant->manager = true; + $grant->manager = true; } + // If not an administrator, get information from the DB and grant manager privilege. if(!$grant->manager) { @@ -1918,9 +1969,7 @@ class moduleModel extends module } else { - $args = new stdClass; - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleGrants', $args); + $output = $this->getModuleGrants($module_srl); } $grant_exists = $granted = array(); @@ -2015,9 +2064,27 @@ class moduleModel extends module } } + $GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)] = $grant; + return $grant; } + /** + * @brief Get module grants + */ + function getModuleGrants($module_srl) + { + $output = Rhymix\Framework\Cache::get("site_and_module:module_grants:$module_srl"); + if ($output === null) + { + $args = new stdClass; + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleGrants', $args); + Rhymix\Framework\Cache::set("site_and_module:module_grants:$module_srl", $output, 0, true); + } + return $output; + } + function getModuleFileBox($module_filebox_srl) { $args = new stdClass(); diff --git a/modules/module/queries/getModuleAdmin.xml b/modules/module/queries/getModuleAdmin.xml index 3f51b9442..55f163796 100644 --- a/modules/module/queries/getModuleAdmin.xml +++ b/modules/module/queries/getModuleAdmin.xml @@ -3,7 +3,7 @@