diff options
Diffstat (limited to 'Bugzilla/Group.pm')
-rw-r--r-- | Bugzilla/Group.pm | 727 |
1 files changed, 375 insertions, 352 deletions
diff --git a/Bugzilla/Group.pm b/Bugzilla/Group.pm index 7f684ea15..df8bc5899 100644 --- a/Bugzilla/Group.pm +++ b/Bugzilla/Group.pm @@ -27,22 +27,22 @@ use Scalar::Util qw(blessed); use constant IS_CONFIG => 1; sub DB_COLUMNS { - my $class = shift; - my @columns = qw( - id - name - description - isbuggroup - userregexp - isactive - icon_url - owner_user_id - idle_member_removal - ); - my $dbh = Bugzilla->dbh; - my $table = $class->DB_TABLE; + my $class = shift; + my @columns = qw( + id + name + description + isbuggroup + userregexp + isactive + icon_url + owner_user_id + idle_member_removal + ); + my $dbh = Bugzilla->dbh; + my $table = $class->DB_TABLE; - return map { "$table.$_" } grep { $dbh->bz_column_info($table, $_) } @columns; + return map {"$table.$_"} grep { $dbh->bz_column_info($table, $_) } @columns; } use constant DB_TABLE => 'groups'; @@ -50,174 +50,178 @@ use constant DB_TABLE => 'groups'; use constant LIST_ORDER => 'isbuggroup, name'; use constant VALIDATORS => { - name => \&_check_name, - description => \&_check_description, - userregexp => \&_check_user_regexp, - isactive => \&_check_is_active, - isbuggroup => \&_check_is_bug_group, - icon_url => \&_check_icon_url, - owner_user_id => \&_check_owner, - idle_member_removal => \&_check_idle_member_removal + name => \&_check_name, + description => \&_check_description, + userregexp => \&_check_user_regexp, + isactive => \&_check_is_active, + isbuggroup => \&_check_is_bug_group, + icon_url => \&_check_icon_url, + owner_user_id => \&_check_owner, + idle_member_removal => \&_check_idle_member_removal }; use constant UPDATE_COLUMNS => qw( - name - description - userregexp - isactive - icon_url - owner_user_id - idle_member_removal + name + description + userregexp + isactive + icon_url + owner_user_id + idle_member_removal ); # Parameters that are lists of groups. use constant GROUP_PARAMS => qw(chartgroup insidergroup timetrackinggroup - querysharegroup); + querysharegroup); sub DYNAMIC_COLUMNS { - return Bugzilla->usage_mode == USAGE_MODE_CMDLINE; + return Bugzilla->usage_mode == USAGE_MODE_CMDLINE; } ############################### #### Accessors ###### ############################### -sub description { return $_[0]->{'description'}; } -sub is_bug_group { return $_[0]->{'isbuggroup'}; } -sub user_regexp { return $_[0]->{'userregexp'}; } -sub is_active { return $_[0]->{'isactive'}; } -sub icon_url { return $_[0]->{'icon_url'}; } +sub description { return $_[0]->{'description'}; } +sub is_bug_group { return $_[0]->{'isbuggroup'}; } +sub user_regexp { return $_[0]->{'userregexp'}; } +sub is_active { return $_[0]->{'isactive'}; } +sub icon_url { return $_[0]->{'icon_url'}; } sub idle_member_removal { return $_[0]->{'idle_member_removal'}; } sub bugs { - my $self = shift; - return $self->{bugs} if exists $self->{bugs}; - my $bug_ids = Bugzilla->dbh->selectcol_arrayref( - 'SELECT bug_id FROM bug_group_map WHERE group_id = ?', - undef, $self->id); - require Bugzilla::Bug; - $self->{bugs} = Bugzilla::Bug->new_from_list($bug_ids); - return $self->{bugs}; + my $self = shift; + return $self->{bugs} if exists $self->{bugs}; + my $bug_ids + = Bugzilla->dbh->selectcol_arrayref( + 'SELECT bug_id FROM bug_group_map WHERE group_id = ?', + undef, $self->id); + require Bugzilla::Bug; + $self->{bugs} = Bugzilla::Bug->new_from_list($bug_ids); + return $self->{bugs}; } sub members_direct { - my ($self) = @_; - $self->{members_direct} ||= $self->_get_members(GRANT_DIRECT); - return $self->{members_direct}; + my ($self) = @_; + $self->{members_direct} ||= $self->_get_members(GRANT_DIRECT); + return $self->{members_direct}; } sub members_non_inherited { - my ($self) = @_; - $self->{members_non_inherited} ||= $self->_get_members(); - return $self->{members_non_inherited}; + my ($self) = @_; + $self->{members_non_inherited} ||= $self->_get_members(); + return $self->{members_non_inherited}; } # returns all possible members of groups, keyed by the group name or _direct # a user present in multiple groups will be returned multiple times sub members_complete { - my ($self) = @_; - my $dbh = Bugzilla->dbh; - require Bugzilla::User; + my ($self) = @_; + my $dbh = Bugzilla->dbh; + require Bugzilla::User; - my $sth = $dbh->prepare( - "SELECT DISTINCT user_id FROM user_group_map WHERE isbless = 0 AND group_id = ?" + my $sth + = $dbh->prepare( + "SELECT DISTINCT user_id FROM user_group_map WHERE isbless = 0 AND group_id = ?" ); - my $result = { _direct => $self->members_direct() }; - foreach my $group_id (@{ $self->flatten_group_membership($self->id) }) { - next if $group_id == $self->id; - my $group_name = Bugzilla::Group->new({ id => $group_id, cache => 1 })->name; - my $user_ids = $dbh->selectcol_arrayref($sth, undef, $group_id); - $result->{$group_name} = Bugzilla::User->new_from_list($user_ids); - } - return $result; + my $result = {_direct => $self->members_direct()}; + foreach my $group_id (@{$self->flatten_group_membership($self->id)}) { + next if $group_id == $self->id; + my $group_name = Bugzilla::Group->new({id => $group_id, cache => 1})->name; + my $user_ids = $dbh->selectcol_arrayref($sth, undef, $group_id); + $result->{$group_name} = Bugzilla::User->new_from_list($user_ids); + } + return $result; } # A helper for members_direct and members_non_inherited sub _get_members { - my ($self, $grant_type) = @_; - my $dbh = Bugzilla->dbh; - my $grant_clause = $grant_type ? "AND grant_type = $grant_type" : ""; - my $user_ids = $dbh->selectcol_arrayref( - "SELECT DISTINCT user_id + my ($self, $grant_type) = @_; + my $dbh = Bugzilla->dbh; + my $grant_clause = $grant_type ? "AND grant_type = $grant_type" : ""; + my $user_ids = $dbh->selectcol_arrayref( + "SELECT DISTINCT user_id FROM user_group_map - WHERE isbless = 0 $grant_clause AND group_id = ?", undef, $self->id); - require Bugzilla::User; - return Bugzilla::User->new_from_list($user_ids); + WHERE isbless = 0 $grant_clause AND group_id = ?", undef, $self->id + ); + require Bugzilla::User; + return Bugzilla::User->new_from_list($user_ids); } sub flag_types { - my ($self, $params) = @_; - $params ||= {}; - require Bugzilla::FlagType; - $self->{flag_types} ||= Bugzilla::FlagType::match({ group => $self->id, %$params }); - return $self->{flag_types}; + my ($self, $params) = @_; + $params ||= {}; + require Bugzilla::FlagType; + $self->{flag_types} + ||= Bugzilla::FlagType::match({group => $self->id, %$params}); + return $self->{flag_types}; } sub grant_direct { - my ($self, $type) = @_; - $self->{grant_direct} ||= {}; - return $self->{grant_direct}->{$type} - if defined $self->{grant_direct}->{$type}; - my $dbh = Bugzilla->dbh; - - my $ids = $dbh->selectcol_arrayref( - "SELECT member_id FROM group_group_map - WHERE grantor_id = ? AND grant_type = $type", - undef, $self->id) || []; - - $self->{grant_direct}->{$type} = $self->new_from_list($ids); - return $self->{grant_direct}->{$type}; + my ($self, $type) = @_; + $self->{grant_direct} ||= {}; + return $self->{grant_direct}->{$type} if defined $self->{grant_direct}->{$type}; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT member_id FROM group_group_map + WHERE grantor_id = ? AND grant_type = $type", undef, $self->id + ) || []; + + $self->{grant_direct}->{$type} = $self->new_from_list($ids); + return $self->{grant_direct}->{$type}; } sub granted_by_direct { - my ($self, $type) = @_; - $self->{granted_by_direct} ||= {}; - return $self->{granted_by_direct}->{$type} - if defined $self->{granted_by_direct}->{$type}; - my $dbh = Bugzilla->dbh; - - my $ids = $dbh->selectcol_arrayref( - "SELECT grantor_id FROM group_group_map - WHERE member_id = ? AND grant_type = $type", - undef, $self->id) || []; - - $self->{granted_by_direct}->{$type} = $self->new_from_list($ids); - return $self->{granted_by_direct}->{$type}; + my ($self, $type) = @_; + $self->{granted_by_direct} ||= {}; + return $self->{granted_by_direct}->{$type} + if defined $self->{granted_by_direct}->{$type}; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT grantor_id FROM group_group_map + WHERE member_id = ? AND grant_type = $type", undef, $self->id + ) || []; + + $self->{granted_by_direct}->{$type} = $self->new_from_list($ids); + return $self->{granted_by_direct}->{$type}; } sub products { - my $self = shift; - return $self->{products} if exists $self->{products}; - my $product_data = Bugzilla->dbh->selectall_arrayref( - 'SELECT product_id, entry, membercontrol, othercontrol, + my $self = shift; + return $self->{products} if exists $self->{products}; + my $product_data = Bugzilla->dbh->selectall_arrayref( + 'SELECT product_id, entry, membercontrol, othercontrol, canedit, editcomponents, editbugs, canconfirm - FROM group_control_map WHERE group_id = ?', {Slice=>{}}, - $self->id); - my @ids = map { $_->{product_id} } @$product_data; - require Bugzilla::Product; - my $products = Bugzilla::Product->new_from_list(\@ids); - my %data_map = map { $_->{product_id} => $_ } @$product_data; - my @retval; - foreach my $product (@$products) { - # Data doesn't need to contain product_id--we already have - # the product object. - delete $data_map{$product->id}->{product_id}; - push(@retval, { controls => $data_map{$product->id}, - product => $product }); - } - $self->{products} = \@retval; - return $self->{products}; + FROM group_control_map WHERE group_id = ?', {Slice => {}}, $self->id + ); + my @ids = map { $_->{product_id} } @$product_data; + require Bugzilla::Product; + my $products = Bugzilla::Product->new_from_list(\@ids); + my %data_map = map { $_->{product_id} => $_ } @$product_data; + my @retval; + foreach my $product (@$products) { + + # Data doesn't need to contain product_id--we already have + # the product object. + delete $data_map{$product->id}->{product_id}; + push(@retval, {controls => $data_map{$product->id}, product => $product}); + } + $self->{products} = \@retval; + return $self->{products}; } sub owner { - my $self = shift; - return $self->{owner} if exists $self->{owner}; - if ($self->{owner_user_id}) { - $self->{owner} = Bugzilla::User->check({ id => $self->{owner_user_id}, cache => 1 }); - } - return $self->{owner} || undef; + my $self = shift; + return $self->{owner} if exists $self->{owner}; + if ($self->{owner_user_id}) { + $self->{owner} + = Bugzilla::User->check({id => $self->{owner_user_id}, cache => 1}); + } + return $self->{owner} || undef; } ############################### @@ -225,134 +229,136 @@ sub owner { ############################### sub check_members_are_visible { - my $self = shift; - my $user = Bugzilla->user; - return if !Bugzilla->params->{'usevisibilitygroups'}; - - my $group_id = $self->id; - my $is_visible = grep { $_ == $group_id } @{ $user->visible_groups_inherited }; - if (!$is_visible) { - ThrowUserError('group_not_visible', { group => $self }); - } + my $self = shift; + my $user = Bugzilla->user; + return if !Bugzilla->params->{'usevisibilitygroups'}; + + my $group_id = $self->id; + my $is_visible = grep { $_ == $group_id } @{$user->visible_groups_inherited}; + if (!$is_visible) { + ThrowUserError('group_not_visible', {group => $self}); + } } -sub set_description { $_[0]->set('description', $_[1]); } -sub set_is_active { $_[0]->set('isactive', $_[1]); } -sub set_name { $_[0]->set('name', $_[1]); } -sub set_user_regexp { $_[0]->set('userregexp', $_[1]); } -sub set_icon_url { $_[0]->set('icon_url', $_[1]); } +sub set_description { $_[0]->set('description', $_[1]); } +sub set_is_active { $_[0]->set('isactive', $_[1]); } +sub set_name { $_[0]->set('name', $_[1]); } +sub set_user_regexp { $_[0]->set('userregexp', $_[1]); } +sub set_icon_url { $_[0]->set('icon_url', $_[1]); } sub set_idle_member_removal { $_[0]->set('idle_member_removal', $_[1]); } sub set_owner { - my ($self, $owner_id) = @_; - $self->set('owner_user_id', $owner_id); - # Reset the default owner object. - delete $self->{owner}; + my ($self, $owner_id) = @_; + $self->set('owner_user_id', $owner_id); + + # Reset the default owner object. + delete $self->{owner}; } sub update { - my $self = shift; - my $dbh = Bugzilla->dbh; - $dbh->bz_start_transaction(); - my $changes = $self->SUPER::update(@_); - - if (exists $changes->{name}) { - my ($old_name, $new_name) = @{$changes->{name}}; - my $update_params; - foreach my $group (GROUP_PARAMS) { - if ($old_name eq Bugzilla->params->{$group}) { - SetParam($group, $new_name); - $update_params = 1; - } - } - write_params() if $update_params; + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->bz_start_transaction(); + my $changes = $self->SUPER::update(@_); + + if (exists $changes->{name}) { + my ($old_name, $new_name) = @{$changes->{name}}; + my $update_params; + foreach my $group (GROUP_PARAMS) { + if ($old_name eq Bugzilla->params->{$group}) { + SetParam($group, $new_name); + $update_params = 1; + } } + write_params() if $update_params; + } - # If we've changed this group to be active, fix any Mandatory groups. - $self->_enforce_mandatory if (exists $changes->{isactive} - && $changes->{isactive}->[1]); + # If we've changed this group to be active, fix any Mandatory groups. + $self->_enforce_mandatory + if (exists $changes->{isactive} && $changes->{isactive}->[1]); - $self->_rederive_regexp() if exists $changes->{userregexp}; + $self->_rederive_regexp() if exists $changes->{userregexp}; - Bugzilla::Hook::process('group_end_of_update', - { group => $self, changes => $changes }); - $dbh->bz_commit_transaction(); - Bugzilla->memcached->clear_config(); - return $changes; + Bugzilla::Hook::process('group_end_of_update', + {group => $self, changes => $changes}); + $dbh->bz_commit_transaction(); + Bugzilla->memcached->clear_config(); + return $changes; } sub check_remove { - my ($self, $params) = @_; - - # System groups cannot be deleted! - if (!$self->is_bug_group) { - ThrowUserError("system_group_not_deletable", { name => $self->name }); + my ($self, $params) = @_; + + # System groups cannot be deleted! + if (!$self->is_bug_group) { + ThrowUserError("system_group_not_deletable", {name => $self->name}); + } + + # Groups having a special role cannot be deleted. + my @special_groups; + foreach my $special_group (GROUP_PARAMS) { + if ($self->name eq Bugzilla->params->{$special_group}) { + push(@special_groups, $special_group); } + } + if (scalar(@special_groups)) { + ThrowUserError('group_has_special_role', + {name => $self->name, groups => \@special_groups}); + } - # Groups having a special role cannot be deleted. - my @special_groups; - foreach my $special_group (GROUP_PARAMS) { - if ($self->name eq Bugzilla->params->{$special_group}) { - push(@special_groups, $special_group); - } - } - if (scalar(@special_groups)) { - ThrowUserError('group_has_special_role', - { name => $self->name, - groups => \@special_groups }); - } + return if $params->{'test_only'}; - return if $params->{'test_only'}; + my $cantdelete = 0; - my $cantdelete = 0; + my $users = $self->members_non_inherited; + if (scalar(@$users) && !$params->{'remove_from_users'}) { + $cantdelete = 1; + } - my $users = $self->members_non_inherited; - if (scalar(@$users) && !$params->{'remove_from_users'}) { - $cantdelete = 1; - } + my $bugs = $self->bugs; + if (scalar(@$bugs) && !$params->{'remove_from_bugs'}) { + $cantdelete = 1; + } - my $bugs = $self->bugs; - if (scalar(@$bugs) && !$params->{'remove_from_bugs'}) { - $cantdelete = 1; - } + my $products = $self->products; + if (scalar(@$products) && !$params->{'remove_from_products'}) { + $cantdelete = 1; + } - my $products = $self->products; - if (scalar(@$products) && !$params->{'remove_from_products'}) { - $cantdelete = 1; - } + my $flag_types = $self->flag_types; + if (scalar(@$flag_types) && !$params->{'remove_from_flags'}) { + $cantdelete = 1; + } - my $flag_types = $self->flag_types; - if (scalar(@$flag_types) && !$params->{'remove_from_flags'}) { - $cantdelete = 1; - } - - ThrowUserError('group_cannot_delete', { group => $self }) if $cantdelete; + ThrowUserError('group_cannot_delete', {group => $self}) if $cantdelete; } sub remove_from_db { - my $self = shift; - my $dbh = Bugzilla->dbh; - $self->check_remove(@_); - $dbh->bz_start_transaction(); - Bugzilla::Hook::process('group_before_delete', { group => $self }); - $dbh->do('DELETE FROM whine_schedules - WHERE mailto_type = ? AND mailto = ?', - undef, MAILTO_GROUP, $self->id); - # All the other tables will be handled by foreign keys when we - # drop the main "groups" row. - $self->SUPER::remove_from_db(@_); - $dbh->bz_commit_transaction(); + my $self = shift; + my $dbh = Bugzilla->dbh; + $self->check_remove(@_); + $dbh->bz_start_transaction(); + Bugzilla::Hook::process('group_before_delete', {group => $self}); + $dbh->do( + 'DELETE FROM whine_schedules + WHERE mailto_type = ? AND mailto = ?', undef, MAILTO_GROUP, $self->id + ); + + # All the other tables will be handled by foreign keys when we + # drop the main "groups" row. + $self->SUPER::remove_from_db(@_); + $dbh->bz_commit_transaction(); } # Add missing entries in bug_group_map for bugs created while # a mandatory group was disabled and which is now enabled again. sub _enforce_mandatory { - my ($self) = @_; - my $dbh = Bugzilla->dbh; - my $gid = $self->id; + my ($self) = @_; + my $dbh = Bugzilla->dbh; + my $gid = $self->id; - my $bug_ids = - $dbh->selectcol_arrayref('SELECT bugs.bug_id + my $bug_ids = $dbh->selectcol_arrayref( + 'SELECT bugs.bug_id FROM bugs INNER JOIN group_control_map ON group_control_map.product_id = bugs.product_id @@ -361,148 +367,161 @@ sub _enforce_mandatory { AND bug_group_map.group_id = group_control_map.group_id WHERE group_control_map.group_id = ? AND group_control_map.membercontrol = ? - AND bug_group_map.group_id IS NULL', - undef, ($gid, CONTROLMAPMANDATORY)); - - my $sth = $dbh->prepare('INSERT INTO bug_group_map (bug_id, group_id) VALUES (?, ?)'); - foreach my $bug_id (@$bug_ids) { - $sth->execute($bug_id, $gid); - } + AND bug_group_map.group_id IS NULL', undef, + ($gid, CONTROLMAPMANDATORY) + ); + + my $sth + = $dbh->prepare('INSERT INTO bug_group_map (bug_id, group_id) VALUES (?, ?)'); + foreach my $bug_id (@$bug_ids) { + $sth->execute($bug_id, $gid); + } } sub is_active_bug_group { - my $self = shift; - return $self->is_active && $self->is_bug_group; + my $self = shift; + return $self->is_active && $self->is_bug_group; } sub _rederive_regexp { - my ($self) = @_; + my ($self) = @_; - my $dbh = Bugzilla->dbh; - my $sth = $dbh->prepare("SELECT userid, login_name, group_id + my $dbh = Bugzilla->dbh; + my $sth = $dbh->prepare( + "SELECT userid, login_name, group_id FROM profiles LEFT JOIN user_group_map ON user_group_map.user_id = profiles.userid AND group_id = ? AND grant_type = ? - AND isbless = 0"); - my $sthadd = $dbh->prepare("INSERT INTO user_group_map + AND isbless = 0" + ); + my $sthadd = $dbh->prepare( + "INSERT INTO user_group_map (user_id, group_id, grant_type, isbless) - VALUES (?, ?, ?, 0)"); - my $sthdel = $dbh->prepare("DELETE FROM user_group_map + VALUES (?, ?, ?, 0)" + ); + my $sthdel = $dbh->prepare( + "DELETE FROM user_group_map WHERE user_id = ? AND group_id = ? - AND grant_type = ? and isbless = 0"); - $sth->execute($self->id, GRANT_REGEXP); - my $regexp = $self->user_regexp; - while (my ($uid, $login, $present) = $sth->fetchrow_array) { - if ($regexp ne '' and $login =~ /$regexp/i) { - $sthadd->execute($uid, $self->id, GRANT_REGEXP) unless $present; - } else { - $sthdel->execute($uid, $self->id, GRANT_REGEXP) if $present; - } + AND grant_type = ? and isbless = 0" + ); + $sth->execute($self->id, GRANT_REGEXP); + my $regexp = $self->user_regexp; + + while (my ($uid, $login, $present) = $sth->fetchrow_array) { + if ($regexp ne '' and $login =~ /$regexp/i) { + $sthadd->execute($uid, $self->id, GRANT_REGEXP) unless $present; } + else { + $sthdel->execute($uid, $self->id, GRANT_REGEXP) if $present; + } + } } sub flatten_group_membership { - my ($self, @groups) = @_; - - my $dbh = Bugzilla->dbh; - my $sth; - my @groupidstocheck = @groups; - my %groupidschecked = (); - $sth = $dbh->prepare("SELECT member_id FROM group_group_map + my ($self, @groups) = @_; + + my $dbh = Bugzilla->dbh; + my $sth; + my @groupidstocheck = @groups; + my %groupidschecked = (); + $sth = $dbh->prepare( + "SELECT member_id FROM group_group_map WHERE grantor_id = ? - AND grant_type = " . GROUP_MEMBERSHIP); - while (my $node = shift @groupidstocheck) { - $sth->execute($node); - my $member; - while (($member) = $sth->fetchrow_array) { - if (!$groupidschecked{$member}) { - $groupidschecked{$member} = 1; - push @groupidstocheck, $member; - push @groups, $member unless grep $_ == $member, @groups; - } - } + AND grant_type = " . GROUP_MEMBERSHIP + ); + while (my $node = shift @groupidstocheck) { + $sth->execute($node); + my $member; + while (($member) = $sth->fetchrow_array) { + if (!$groupidschecked{$member}) { + $groupidschecked{$member} = 1; + push @groupidstocheck, $member; + push @groups, $member unless grep $_ == $member, @groups; + } } - return \@groups; + } + return \@groups; } - - ################################ ##### Module Subroutines ### ################################ sub create { - my $class = shift; - my ($params) = @_; - my $dbh = Bugzilla->dbh; - - my $silently = delete $params->{silently}; - if (Bugzilla->usage_mode == USAGE_MODE_CMDLINE and !$silently) { - print get_text('install_group_create', { name => $params->{name} }), - "\n"; - } + my $class = shift; + my ($params) = @_; + my $dbh = Bugzilla->dbh; - $dbh->bz_start_transaction(); + my $silently = delete $params->{silently}; + if (Bugzilla->usage_mode == USAGE_MODE_CMDLINE and !$silently) { + print get_text('install_group_create', {name => $params->{name}}), "\n"; + } - my $group = $class->SUPER::create(@_); + $dbh->bz_start_transaction(); - # Since we created a new group, give the "admin" group all privileges - # initially. - my $admin = new Bugzilla::Group({name => 'admin'}); - # This function is also used to create the "admin" group itself, - # so there's a chance it won't exist yet. - if ($admin) { - my $sth = $dbh->prepare('INSERT INTO group_group_map + my $group = $class->SUPER::create(@_); + + # Since we created a new group, give the "admin" group all privileges + # initially. + my $admin = new Bugzilla::Group({name => 'admin'}); + + # This function is also used to create the "admin" group itself, + # so there's a chance it won't exist yet. + if ($admin) { + my $sth = $dbh->prepare( + 'INSERT INTO group_group_map (member_id, grantor_id, grant_type) - VALUES (?, ?, ?)'); - $sth->execute($admin->id, $group->id, GROUP_MEMBERSHIP); - $sth->execute($admin->id, $group->id, GROUP_BLESS); - $sth->execute($admin->id, $group->id, GROUP_VISIBLE); - } + VALUES (?, ?, ?)' + ); + $sth->execute($admin->id, $group->id, GROUP_MEMBERSHIP); + $sth->execute($admin->id, $group->id, GROUP_BLESS); + $sth->execute($admin->id, $group->id, GROUP_VISIBLE); + } - $group->_rederive_regexp() if $group->user_regexp; + $group->_rederive_regexp() if $group->user_regexp; - Bugzilla::Hook::process('group_end_of_create', { group => $group }); - $dbh->bz_commit_transaction(); - Bugzilla->memcached->clear_config(); - return $group; + Bugzilla::Hook::process('group_end_of_create', {group => $group}); + $dbh->bz_commit_transaction(); + Bugzilla->memcached->clear_config(); + return $group; } sub ValidateGroupName { - my ($name, @users) = (@_); - my $dbh = Bugzilla->dbh; - my $query = "SELECT id FROM groups " . - "WHERE name = ?"; - if (Bugzilla->params->{'usevisibilitygroups'}) { - my @visible = (-1); - foreach my $user (@users) { - $user && push @visible, @{$user->visible_groups_direct}; - } - my $visible = join(', ', @visible); - $query .= " AND id IN($visible)"; + my ($name, @users) = (@_); + my $dbh = Bugzilla->dbh; + my $query = "SELECT id FROM groups " . "WHERE name = ?"; + if (Bugzilla->params->{'usevisibilitygroups'}) { + my @visible = (-1); + foreach my $user (@users) { + $user && push @visible, @{$user->visible_groups_direct}; } - my $sth = $dbh->prepare($query); - $sth->execute($name); - my ($ret) = $sth->fetchrow_array(); - return $ret; + my $visible = join(', ', @visible); + $query .= " AND id IN($visible)"; + } + my $sth = $dbh->prepare($query); + $sth->execute($name); + my ($ret) = $sth->fetchrow_array(); + return $ret; } sub check_no_disclose { - my ($class, $params) = @_; - my $action = delete $params->{action}; + my ($class, $params) = @_; + my $action = delete $params->{action}; - $action =~ /^(?:add|remove)$/ - or ThrowCodeError('bad_arg', { argument => $action, - function => "${class}::check_no_disclose" }); + $action =~ /^(?:add|remove)$/ + or ThrowCodeError('bad_arg', + {argument => $action, function => "${class}::check_no_disclose"}); - $params->{_error} = ($action eq 'add') ? 'group_restriction_not_allowed' - : 'group_invalid_removal'; + $params->{_error} + = ($action eq 'add') + ? 'group_restriction_not_allowed' + : 'group_invalid_removal'; - my $group = $class->check($params); - return $group; + my $group = $class->check($params); + return $group; } ############################### @@ -510,53 +529,57 @@ sub check_no_disclose { ############################### sub _check_name { - my ($invocant, $name) = @_; - $name = trim($name); - $name || ThrowUserError("empty_group_name"); - # If we're creating a Group or changing the name... - if (!ref($invocant) || lc($invocant->name) ne lc($name)) { - my $exists = new Bugzilla::Group({name => $name }); - ThrowUserError("group_exists", { name => $name }) if $exists; - } - return $name; + my ($invocant, $name) = @_; + $name = trim($name); + $name || ThrowUserError("empty_group_name"); + + # If we're creating a Group or changing the name... + if (!ref($invocant) || lc($invocant->name) ne lc($name)) { + my $exists = new Bugzilla::Group({name => $name}); + ThrowUserError("group_exists", {name => $name}) if $exists; + } + return $name; } sub _check_description { - my ($invocant, $desc) = @_; - $desc = trim($desc); - $desc || ThrowUserError("empty_group_description"); - return $desc; + my ($invocant, $desc) = @_; + $desc = trim($desc); + $desc || ThrowUserError("empty_group_description"); + return $desc; } sub _check_user_regexp { - my ($invocant, $regex) = @_; - $regex = trim($regex) || ''; - ThrowUserError("invalid_regexp") unless (eval {qr/$regex/}); - return $regex; + my ($invocant, $regex) = @_; + $regex = trim($regex) || ''; + ThrowUserError("invalid_regexp") unless (eval {qr/$regex/}); + return $regex; } sub _check_is_active { return $_[1] ? 1 : 0; } + sub _check_is_bug_group { - return $_[1] ? 1 : 0; + return $_[1] ? 1 : 0; } sub _check_icon_url { return $_[1] ? clean_text($_[1]) : undef; } sub _check_owner { - my ($invocant, $owner, undef, $params) = @_; - return Bugzilla::User->check({ name => $owner, cache => 1 })->id if $owner; - # We require an owner if the group is a not a system group - if (blessed($invocant) && !$invocant->is_bug_group) { - return undef; - } - ThrowUserError('group_needs_owner'); + my ($invocant, $owner, undef, $params) = @_; + return Bugzilla::User->check({name => $owner, cache => 1})->id if $owner; + + # We require an owner if the group is a not a system group + if (blessed($invocant) && !$invocant->is_bug_group) { + return undef; + } + ThrowUserError('group_needs_owner'); } sub _check_idle_member_removal { - my ($invocant, $value) = @_; - detaint_natural($value) - || ThrowUserError('invalid_parameter', { name => 'idle member removal', err => 'must be numeric' }); - return $value <= 0 ? 0 : $value ; + my ($invocant, $value) = @_; + detaint_natural($value) + || ThrowUserError('invalid_parameter', + {name => 'idle member removal', err => 'must be numeric'}); + return $value <= 0 ? 0 : $value; } 1; |