summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Group.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/Group.pm')
-rw-r--r--Bugzilla/Group.pm727
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;