# This patch file was generated by NetBeans IDE # This patch can be applied using context Tools: Apply Diff Patch action on respective folder. # It uses platform neutral UTF-8 encoding. # Above lines and this line are ignored by the patching process. --- administrator/components/com_comprofiler/library/cb/cb.acl.php +++ administrator/components/com_comprofiler/library/cb/cb.acl.php @@ -332,19 +332,41 @@ if ( ! isset( $gids[$gid] ) ) { if ( checkJversion() == 2 ) { - $query = 'SELECT g1.' . $_CB_database->NameQuote( 'id' ) . ' AS group_id' - . ', g1.' . $_CB_database->NameQuote( 'title' ) . ' AS name' - . "\n FROM " . $_CB_database->NameQuote( '#__usergroups' ) . " AS g1"; - if ( $gid != 8 ) { - $query .= "\n LEFT JOIN " . $_CB_database->NameQuote( '#__usergroups' ) . " AS g2" - . ' ON g2.' . $_CB_database->NameQuote( 'rgt' ) . ' <= g1.' . $_CB_database->NameQuote( 'rgt' ) - . ' AND g2.' . $_CB_database->NameQuote( 'lft' ) . ' >= g1.' . $_CB_database->NameQuote( 'lft' ) - . "\n WHERE g2." . $_CB_database->NameQuote( 'id' ) . " = " . (int) $gid; + static $grps, $paths; + + if ( ! isset( $grps ) ) { + $query = 'SELECT *' + . "\n FROM " . $_CB_database->NameQuote( '#__usergroups' ) + . "\n ORDER BY " . $_CB_database->NameQuote( 'lft' ); + $_CB_database->setQuery( $query ); + $grps = $_CB_database->loadObjectList( 'id' ); } - $query .= "\n ORDER BY g1." . $_CB_database->NameQuote( 'title' ); - $_CB_database->setQuery( $query ); - $groups = $_CB_database->loadResultArray(); + if ( ! array_key_exists( $gid, $grps ) ) { + return array(); + } + + if ( ! isset( $paths[$gid] ) ) { + $paths[$gid] = array(); + + foreach( $grps as $grp ) { + if ( ( $grp->lft <= $grps[$gid]->lft ) && ( $grp->rgt >= $grps[$gid]->rgt ) ) { + $paths[$gid][] = $grp->id; + } + } + } + + $type = $this->get_parent_container( $grps[$gid], $grps ); + + if ( in_array( $type, array( 2, 3 ) ) ) { + $paths[$gid] = array_merge( $paths[$gid], array_diff( $this->get_group_parent_ids( 2 ), $this->get_group_parent_ids( $gid ) ) ); + } + + $paths[$gid] = array_values( array_unique( $paths[$gid] ) ); + + sort( $paths[$gid] ); + + $groups = $paths[$gid]; } elseif ( checkJversion() == 1 ) { $query = 'SELECT g1.' . $_CB_database->NameQuote( 'id' ) . ' AS group_id' . ', g1.' . $_CB_database->NameQuote( 'name' ) @@ -379,10 +401,6 @@ $groups = array_merge( $groups, $standardlist ); - if ( checkJversion() == 2 ) { - sort( $groups ); - } - $gids[$gid] = $groups; } @@ -398,22 +416,43 @@ if ( ! isset( $gids[$gid] ) ) { if ( checkJversion() == 2 ) { - $query = 'SELECT g1.' . $_CB_database->NameQuote( 'id' ) . ' AS group_id' - // . ', g1.' . $_CB_database->NameQuote( 'title' ) . ' AS name' - . "\n FROM " . $_CB_database->NameQuote( '#__usergroups' ) . " AS g1" - . "\n LEFT JOIN " . $_CB_database->NameQuote( '#__usergroups' ) . " AS g2" - . ' ON g2.' . $_CB_database->NameQuote( 'rgt' ) . ' >= g1.' . $_CB_database->NameQuote( 'rgt' ) - . ' AND g2.' . $_CB_database->NameQuote( 'lft' ) . ' <= g1.' . $_CB_database->NameQuote( 'lft' ) - . "\n WHERE g2." . $_CB_database->NameQuote( 'id' ) . " = " . (int) $gid - . "\n ORDER BY g1." . $_CB_database->NameQuote( 'title' ); - $_CB_database->setQuery( $query ); - $groups = $_CB_database->loadResultArray(); + static $grps, $paths; - if ( in_array( $gid, array( 6, 7 ) ) ) { - // Add the missing super admin if admin or moderator in list, but superadmin is missing, for backwards compatibility: - array_unshift( $groups, '8' ); + if ( ! isset( $grps ) ) { + $query = 'SELECT *' + . "\n FROM " . $_CB_database->NameQuote( '#__usergroups' ) + . "\n ORDER BY " . $_CB_database->NameQuote( 'lft' ); + $_CB_database->setQuery( $query ); + $grps = $_CB_database->loadObjectList( 'id' ); } + if ( ! array_key_exists( $gid, $grps ) ) { + return array(); + } + + if ( ! isset( $paths[$gid] ) ) { + $paths[$gid] = array(); + + foreach( $grps as $grp ) { + if ( ( $grp->lft >= $grps[$gid]->lft ) && ( $grp->rgt <= $grps[$gid]->rgt ) ) { + $paths[$gid][] = $grp->id; + } + } + } + + $type = $this->get_parent_container( $grps[$gid], $grps ); + + if ( $type === 1 ) { + $paths[$gid] = array_merge( $paths[$gid], $this->get_group_parent_ids( 6 ) ); + } elseif ( $type === 2 ) { + $paths[$gid] = array_merge( $paths[$gid], $this->get_group_parent_ids( 8 ) ); + } + + $paths[$gid] = array_values( array_unique( $paths[$gid] ) ); + + sort( $paths[$gid] ); + + $groups = $paths[$gid]; } elseif ( checkJversion() == 1 ) { $query = 'SELECT g1.' . $_CB_database->NameQuote( 'id' ) . ' AS group_id' // . ', g1.' . $_CB_database->NameQuote( 'name' ) @@ -440,16 +479,47 @@ $groups[$i] = (int) $groups[$i]; } - if ( checkJversion() == 2 ) { - sort( $groups ); - } - $gids[$gid] = $groups; } return $gids[$gid]; } + function get_parent_container( $grp, $groups ) { + if ( $grp && $groups ) foreach ( $groups as $group ) { + $id = (int) $grp->id; + $parent = (int) $grp->parent_id; + $grps = array( $parent, $id ); + + // Go no further if group has no parent: + if ( $parent ) { + // Determine Joomla version: + if ( checkJversion() == 2 ) { + if ( in_array( 2, $grps ) ) { + return 1; // Registered + } elseif ( in_array( 6, $grps ) ) { + return 2; // Moderators + } elseif ( in_array( 8, $grps ) ) { + return 3; // Super Users + } + } else { + if ( in_array( 29, $grps ) ) { + return 1; // Public Frontend + } elseif ( in_array( 30, $grps ) ) { + return 2; // Public Backend + } + } + + // Loop through for deep groups: + return $this->get_parent_container( $groups[$parent], $groups ); + } else { + return 0; // Root + } + } + + return null; // Unknown + } + function get_groups_below_me() { global $_CB_framework;