aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/functions_module.php88
1 files changed, 73 insertions, 15 deletions
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index 53218402c3..b93aca2345 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -75,10 +75,16 @@ class p_master
$this->module_cache['modules'] = array();
while ($row = $db->sql_fetchrow($result))
{
+ // Only add if we are allowed to view this module...
+ if (!$this->module_auth($row['module_auth']))
+ {
+ continue;
+ }
+
$this->module_cache['modules'][] = $row;
}
$db->sql_freeresult($result);
-
+
// Get module parents
$this->module_cache['parents'] = array();
foreach ($this->module_cache['modules'] as $row)
@@ -102,21 +108,12 @@ class p_master
$right = $depth = $i = 0;
$depth_ary = $disable = array();
- foreach ($this->module_cache['modules'] as $row)
+ foreach ($this->module_cache['modules'] as $key => $row)
{
- /**
- * Authorisation is required ... not authed, skip
- * @todo implement $this->is_module_id
- * @todo put in seperate method for authentication
- */
- if ($row['module_auth'])
+ // Not allowed to view module?
+ if (!$this->module_auth($row['module_auth']))
{
- $is_auth = false;
- eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z_]+)(,\$id)?#e', '#\$id#', '#cfg_([a-z_]+)#e'), array('(int) $auth->acl_get("\\1"\\2)', '$this->acl_forup_id', '(int) $config["\\1"]'), trim($row['module_auth'])) . ');');
- if (!$is_auth)
- {
- continue;
- }
+ continue;
}
// Category with no members, ignore
@@ -125,6 +122,45 @@ class p_master
continue;
}
+ // Category with no members on their way down (we have to check every level)
+ if (!$row['module_name'])
+ {
+ $empty_category = true;
+
+ // If we do find members we can add this module to the array
+ $right_id = $row['right_id'];
+
+ // Get branch (from this module to module with left_id >= right_id)
+ $temp_module_cache = array_slice($this->module_cache['modules'], $key + 1);
+
+ if (!sizeof($temp_module_cache))
+ {
+ continue;
+ }
+
+ foreach ($temp_module_cache as $temp_row)
+ {
+ if ($temp_row['left_id'] >= $right_id)
+ {
+ break;
+ }
+
+ // Module there
+ if ($temp_row['module_name'])
+ {
+ $empty_category = false;
+ break;
+ }
+ }
+
+ unset($temp_module_cache);
+
+ if ($empty_category)
+ {
+ continue;
+ }
+ }
+
// Not enabled?
if (!$row['module_enabled'])
{
@@ -198,6 +234,28 @@ class p_master
unset($this->module_cache['modules']);
}
+ /**
+ * Check module authorisation
+ * @todo implement $this->is_module_id
+ */
+ function module_auth($module_auth)
+ {
+ global $auth, $config;
+
+ $module_auth = trim($module_auth);
+
+ // Generally allowed to access module if module_auth is empty
+ if (!$module_auth)
+ {
+ return true;
+ }
+
+ $is_auth = false;
+ eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z_]+)(,\$id)?#e', '#\$id#', '#cfg_([a-z_]+)#e'), array('(int) $auth->acl_get("\\1"\\2)', '$this->acl_forup_id', '(int) $config["\\1"]'), trim($module_auth)) . ');');
+
+ return $is_auth;
+ }
+
function set_active($id = false, $mode = false)
{
$category = false;
@@ -207,7 +265,7 @@ class p_master
// If this is a category and the module is the first within it, active
// If this is a module and no mode selected, select first mode
// If no category or module selected, go active for first module in first category
- if (
+ if (
(($itep_ary['name'] === $id || $itep_ary['id'] === (int) $id) && $itep_ary['mode'] == $mode && !$itep_ary['cat']) ||
($itep_ary['parent'] === $category && !$itep_ary['cat']) ||
(($itep_ary['name'] === $id || $itep_ary['id'] === (int) $id) && !$mode && !$itep_ary['cat']) ||