Commit 5e5c2716 authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Backout bug 305506: group inheritance is now broken

parent 18c825ad
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
# Shane H. W. Travis <travis@sedsystems.ca> # Shane H. W. Travis <travis@sedsystems.ca>
# Max Kanat-Alexander <mkanat@bugzilla.org> # Max Kanat-Alexander <mkanat@bugzilla.org>
# Gervase Markham <gerv@gerv.net> # Gervase Markham <gerv@gerv.net>
# Dennis Melentyev <dennis.melentyev@infopulse.com.ua>
################################################################################ ################################################################################
# Module Initialization # Module Initialization
...@@ -272,49 +271,21 @@ sub groups { ...@@ -272,49 +271,21 @@ sub groups {
my $sth; my $sth;
my @groupidstocheck = values(%groups); my @groupidstocheck = values(%groups);
my %groupidschecked = (); my %groupidschecked = ();
my $rows = $dbh->selectall_arrayref( $sth = $dbh->prepare("SELECT groups.name, groups.id
"SELECT DISTINCT groups.name, groups.id, member_id
FROM group_group_map FROM group_group_map
INNER JOIN groups INNER JOIN groups
ON groups.id = grantor_id ON groups.id = grantor_id
WHERE grant_type = " . GROUP_MEMBERSHIP); WHERE member_id = ?
my %group_names = (); AND grant_type = " . GROUP_MEMBERSHIP);
my %group_membership = (); while (my $node = shift @groupidstocheck) {
foreach my $row (@$rows) { $sth->execute($node);
my ($member_name, $grantor_id, $member_id) = @$row; my ($member_name, $member_id);
# Just save the group names while (($member_name, $member_id) = $sth->fetchrow_array) {
$group_names{$grantor_id} = $member_name; if (!$groupidschecked{$member_id}) {
$groupidschecked{$member_id} = 1;
# And group membership push @groupidstocheck, $member_id;
push (@{$group_membership{$member_id}}, $grantor_id); $groups{$member_name} = $member_id;
}
# Let's walk the groups hierarhy tree (using FIFO)
# On the first iteration it's pre-filled with direct groups
# membership. Later on, each group can add it's own members into the
# FIFO. Curcular dependencies are eliminated by checking
# $groupidschecked{$member_id} hash values.
# As a result, %groups will have all the groups we are the member of.
while ($#groupidstocheck >= 0) {
# Pop the head group from FIFO
my $member_id = shift @groupidstocheck;
# Skip the group if we have it checked already
if (!$groupidschecked{$member_id}) {
# Mark group as checked
$groupidschecked{$member_id} = 1;
# Add all it's members to check list FIFO
# %group_membership contains arrays of group members
# for all groups. Accessible by group number.
foreach my $newgroupid (@{$group_membership{$member_id}}) {
push @groupidstocheck, $newgroupid
if (!$groupidschecked{$member_id});
} }
# Note on if clause: we could have group in %groups from 1st
# query and do not have it in second one
$groups{$group_names{$member_id}} = $member_id
if $group_names{$member_id} && $member_id;
} }
} }
$self->{groups} = \%groups; $self->{groups} = \%groups;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment