diff options
-rw-r--r-- | Attachment.pm | 107 | ||||
-rwxr-xr-x | Bug.pm | 510 | ||||
-rw-r--r-- | Bugzilla/Attachment.pm | 2 | ||||
-rwxr-xr-x | Bugzilla/Bug.pm | 12 | ||||
-rw-r--r-- | Bugzilla/BugMail.pm | 4 | ||||
-rw-r--r-- | Bugzilla/Flag.pm | 5 | ||||
-rw-r--r-- | Bugzilla/RelationSet.pm | 17 | ||||
-rw-r--r-- | Bugzilla/Token.pm | 2 | ||||
-rw-r--r-- | RelationSet.pm | 266 | ||||
-rw-r--r-- | Token.pm | 268 | ||||
-rwxr-xr-x | checksetup.pl | 1 | ||||
-rw-r--r-- | globals.pl | 6 | ||||
-rwxr-xr-x | move.pl | 6 | ||||
-rwxr-xr-x | post_bug.cgi | 4 | ||||
-rwxr-xr-x | process_bug.cgi | 11 | ||||
-rwxr-xr-x | show_bug.cgi | 8 | ||||
-rwxr-xr-x | token.cgi | 16 | ||||
-rwxr-xr-x | userprefs.cgi | 14 |
18 files changed, 54 insertions, 1205 deletions
diff --git a/Attachment.pm b/Attachment.pm deleted file mode 100644 index 84979d3ea..000000000 --- a/Attachment.pm +++ /dev/null @@ -1,107 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Mozilla Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is the Bugzilla Bug Tracking System. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All -# Rights Reserved. -# -# Contributor(s): Terry Weissman <terry@mozilla.org> -# Myk Melez <myk@mozilla.org> - -############################################################################ -# Module Initialization -############################################################################ - -use strict; - -package Attachment; - -# This module requires that its caller have said "require CGI.pl" to import -# relevant functions from that script and its companion globals.pl. - -# Use the Flag module to handle flags. -use Bugzilla::Flag; - -############################################################################ -# Functions -############################################################################ - -sub new { - # Returns a hash of information about the attachment with the given ID. - - my ($invocant, $id) = @_; - return undef if !$id; - my $self = { 'id' => $id }; - my $class = ref($invocant) || $invocant; - bless($self, $class); - - &::PushGlobalSQLState(); - &::SendSQL("SELECT 1, description, bug_id, isprivate FROM attachments " . - "WHERE attach_id = $id"); - ($self->{'exists'}, - $self->{'summary'}, - $self->{'bug_id'}, - $self->{'isprivate'}) = &::FetchSQLData(); - &::PopGlobalSQLState(); - - return $self; -} - -sub query -{ - # Retrieves and returns an array of attachment records for a given bug. - # This data should be given to attachment/list.atml in an - # "attachments" variable. - my ($bugid) = @_; - - my $in_editbugs = &::UserInGroup("editbugs"); - &::SendSQL("SELECT product_id - FROM bugs - WHERE bug_id = $bugid"); - my $productid = &::FetchOneColumn(); - my $caneditproduct = &::CanEditProductId($productid); - - # Retrieve a list of attachments for this bug and write them into an array - # of hashes in which each hash represents a single attachment. - &::SendSQL(" - SELECT attach_id, DATE_FORMAT(creation_ts, '%Y.%m.%d %H:%i'), - mimetype, description, ispatch, isobsolete, isprivate, - submitter_id, LENGTH(thedata) - FROM attachments WHERE bug_id = $bugid ORDER BY attach_id - "); - my @attachments = (); - while (&::MoreSQLData()) { - my %a; - my $submitter_id; - ($a{'attachid'}, $a{'date'}, $a{'contenttype'}, $a{'description'}, - $a{'ispatch'}, $a{'isobsolete'}, $a{'isprivate'}, $submitter_id, - $a{'datasize'}) = &::FetchSQLData(); - - # Retrieve a list of flags for this attachment. - $a{'flags'} = Bugzilla::Flag::match({ 'attach_id' => $a{'attachid'} }); - - # We will display the edit link if the user can edit the attachment; - # ie the are the submitter, or they have canedit. - # Also show the link if the user is not logged in - in that cae, - # They'll be prompted later - $a{'canedit'} = ($::userid == 0 || (($submitter_id == $::userid || - $in_editbugs) && $caneditproduct)); - push @attachments, \%a; - } - - return \@attachments; -} - -1; diff --git a/Bug.pm b/Bug.pm deleted file mode 100755 index 94bd628e2..000000000 --- a/Bug.pm +++ /dev/null @@ -1,510 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Mozilla Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is the Bugzilla Bug Tracking System. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All -# Rights Reserved. -# -# Contributor(s): Dawn Endico <endico@mozilla.org> -# Terry Weissman <terry@mozilla.org> -# Chris Yeh <cyeh@bluemartini.com> - -package Bug; - -use strict; - -use RelationSet; -use vars qw($unconfirmedstate $legal_keywords @legal_platform - @legal_priority @legal_severity @legal_opsys @legal_bugs_status - @settable_resolution %components %versions %target_milestone - @enterable_products %milestoneurl %prodmaxvotes); - -use CGI::Carp qw(fatalsToBrowser); - -use Attachment; -use Bugzilla::Config; -use Bugzilla::Constants; -use Bugzilla::Flag; -use Bugzilla::FlagType; -use Bugzilla::User; -use Bugzilla::Util; - -sub fields { - # Keep this ordering in sync with bugzilla.dtd - my @fields = qw(bug_id alias creation_ts short_desc delta_ts - reporter_accessible cclist_accessible - product component version rep_platform op_sys - bug_status resolution - bug_file_loc status_whiteboard keywords - priority bug_severity target_milestone - dependson blocked votes - reporter assigned_to cc - ); - - if (Param('useqacontact')) { - push @fields, "qa_contact"; - } - - if (Param('timetrackinggroup')) { - push @fields, qw(estimated_time remaining_time actual_time); - } - - return @fields; -} - -my %ok_field; -foreach my $key (qw(error groups - longdescs milestoneurl attachments - isopened isunconfirmed - flag_types num_attachment_flag_types - show_attachment_flags use_keywords any_flags_requesteeble - ), - fields()) { - $ok_field{$key}++; -} - -# create a new empty bug -# -sub new { - my $type = shift(); - my %bug; - - # create a ref to an empty hash and bless it - # - my $self = {%bug}; - bless $self, $type; - - # construct from a hash containing a bug's info - # - if ($#_ == 1) { - $self->initBug(@_); - } else { - confess("invalid number of arguments \($#_\)($_)"); - } - - # bless as a Bug - # - return $self; -} - -# dump info about bug into hash unless user doesn't have permission -# user_id 0 is used when person is not logged in. -# -sub initBug { - my $self = shift(); - my ($bug_id, $user_id) = (@_); - - $bug_id = trim($bug_id); - - my $old_bug_id = $bug_id; - - # If the bug ID isn't numeric, it might be an alias, so try to convert it. - $bug_id = &::BugAliasToID($bug_id) if $bug_id !~ /^[1-9][0-9]*$/; - - if ((! defined $bug_id) || (!$bug_id) || (!detaint_natural($bug_id))) { - # no bug number given or the alias didn't match a bug - $self->{'bug_id'} = $old_bug_id; - $self->{'error'} = "InvalidBugId"; - return $self; - } - -# default userid 0, or get DBID if you used an email address - unless (defined $user_id) { - $user_id = 0; - } - else { - if ($user_id =~ /^\@/) { - $user_id = &::DBname_to_id($user_id); - } - } - - $self->{'whoid'} = $user_id; - - my $query = " - SELECT - bugs.bug_id, alias, bugs.product_id, products.name, version, - rep_platform, op_sys, bug_status, resolution, priority, - bug_severity, bugs.component_id, components.name, assigned_to, - reporter, bug_file_loc, short_desc, target_milestone, - qa_contact, status_whiteboard, - DATE_FORMAT(creation_ts,'%Y.%m.%d %H:%i'), - delta_ts, ifnull(sum(votes.vote_count),0), - reporter_accessible, cclist_accessible, - estimated_time, remaining_time - from bugs left join votes using(bug_id), - products, components - where bugs.bug_id = $bug_id - AND products.id = bugs.product_id - AND components.id = bugs.component_id - group by bugs.bug_id"; - - &::SendSQL($query); - my @row = (); - - if ((@row = &::FetchSQLData()) && &::CanSeeBug($bug_id, $self->{'whoid'})) { - my $count = 0; - my %fields; - foreach my $field ("bug_id", "alias", "product_id", "product", "version", - "rep_platform", "op_sys", "bug_status", "resolution", - "priority", "bug_severity", "component_id", "component", - "assigned_to", "reporter", "bug_file_loc", "short_desc", - "target_milestone", "qa_contact", "status_whiteboard", - "creation_ts", "delta_ts", "votes", - "reporter_accessible", "cclist_accessible", - "estimated_time", "remaining_time") - { - $fields{$field} = shift @row; - if (defined $fields{$field}) { - $self->{$field} = $fields{$field}; - } - $count++; - } - } elsif (@row) { - $self->{'bug_id'} = $bug_id; - $self->{'error'} = "NotPermitted"; - return $self; - } else { - $self->{'bug_id'} = $bug_id; - $self->{'error'} = "NotFound"; - return $self; - } - - $self->{'assigned_to'} = new Bugzilla::User($self->{'assigned_to'}); - $self->{'reporter'} = new Bugzilla::User($self->{'reporter'}); - - if (Param('useqacontact') && $self->{'qa_contact'} > 0) { - $self->{'qa_contact'} = new Bugzilla::User($self->{'qa_contact'}); - } else { - $self->{'qa_contact'} = undef; - } - - my $ccSet = new RelationSet; - $ccSet->mergeFromDB("select who from cc where bug_id=$bug_id"); - my @cc = $ccSet->toArrayOfStrings(); - if (@cc) { - $self->{'cc'} = \@cc; - } - - if (@::legal_keywords) { - &::SendSQL("SELECT keyworddefs.name - FROM keyworddefs, keywords - WHERE keywords.bug_id = $bug_id - AND keyworddefs.id = keywords.keywordid - ORDER BY keyworddefs.name"); - my @list; - while (&::MoreSQLData()) { - push(@list, &::FetchOneColumn()); - } - if (@list) { - $self->{'keywords'} = join(', ', @list); - } - } - - $self->{'attachments'} = Attachment::query($self->{bug_id}); - - # The types of flags that can be set on this bug. - # If none, no UI for setting flags will be displayed. - my $flag_types = - Bugzilla::FlagType::match({ 'target_type' => 'bug', - 'product_id' => $self->{'product_id'}, - 'component_id' => $self->{'component_id'} }); - foreach my $flag_type (@$flag_types) { - $flag_type->{'flags'} = - Bugzilla::Flag::match({ 'bug_id' => $self->{bug_id}, - 'type_id' => $flag_type->{'id'}, - 'target_type' => 'bug' }); - } - $self->{'flag_types'} = $flag_types; - $self->{'any_flags_requesteeble'} = grep($_->{'is_requesteeble'}, @$flag_types); - - # The number of types of flags that can be set on attachments to this bug - # and the number of flags on those attachments. One of these counts must be - # greater than zero in order for the "flags" column to appear in the table - # of attachments. - my $num_attachment_flag_types = - Bugzilla::FlagType::count({ 'target_type' => 'attachment', - 'product_id' => $self->{'product_id'}, - 'component_id' => $self->{'component_id'}, - 'is_active' => 1 }); - my $num_attachment_flags = - Bugzilla::Flag::count({ 'target_type' => 'attachment', - 'bug_id' => $self->{bug_id} }); - - $self->{'show_attachment_flags'} - = $num_attachment_flag_types || $num_attachment_flags; - - $self->{'milestoneurl'} = $::milestoneurl{$self->{product}}; - - $self->{'isunconfirmed'} = ($self->{bug_status} eq $::unconfirmedstate); - $self->{'isopened'} = &::IsOpenedState($self->{bug_status}); - - my @depends = EmitDependList("blocked", "dependson", $bug_id); - if (@depends) { - $self->{'dependson'} = \@depends; - } - my @blocked = EmitDependList("dependson", "blocked", $bug_id); - if (@blocked) { - $self->{'blocked'} = \@blocked; - } - - return $self; -} - -sub dup_id { - my ($self) = @_; - - return $self->{'dup_id'} if exists $self->{'dup_id'}; - - $self->{'dup_id'} = undef; - if ($self->{'resolution'} eq 'DUPLICATE') { - my $dbh = Bugzilla->dbh; - $self->{'dup_id'} = - $dbh->selectrow_array(q{SELECT dupe_of - FROM duplicates - WHERE dupe = ?}, - undef, - $self->{'bug_id'}); - } - return $self->{'dup_id'}; -} - -sub actual_time { - my ($self) = @_; - - return $self->{'actual_time'} if exists $self->{'actual_time'}; - - if (&::UserInGroup(Param("timetrackinggroup"))) { - &::SendSQL("SELECT SUM(work_time) - FROM longdescs WHERE longdescs.bug_id=$self->{bug_id}"); - $self->{'actual_time'} = &::FetchSQLData(); - } - - return $self->{'actual_time'}; -} - -sub longdescs { - my ($self) = @_; - - return $self->{'longdescs'} if exists $self->{'longdescs'}; - - $self->{'longdescs'} = &::GetComments($self->{bug_id}); - - return $self->{'longdescs'}; -} - -sub use_keywords { - return @::legal_keywords; -} - -sub use_votes { - my ($self) = @_; - - return Param('usevotes') - && $::prodmaxvotes{$self->{product}} > 0; -} - -sub groups { - my $self = shift; - - return $self->{'groups'} if exists $self->{'groups'}; - - my @groups; - - # Some of this stuff needs to go into Bugzilla::User - - # For every group, we need to know if there is ANY bug_group_map - # record putting the current bug in that group and if there is ANY - # user_group_map record putting the user in that group. - # The LEFT JOINs are checking for record existence. - # - &::SendSQL("SELECT DISTINCT groups.id, name, description," . - " bug_group_map.group_id IS NOT NULL," . - " user_group_map.group_id IS NOT NULL," . - " isactive, membercontrol, othercontrol" . - " FROM groups" . - " LEFT JOIN bug_group_map" . - " ON bug_group_map.group_id = groups.id" . - " AND bug_id = $self->{'bug_id'}" . - " LEFT JOIN user_group_map" . - " ON user_group_map.group_id = groups.id" . - " AND user_id = $::userid" . - " AND NOT isbless" . - " LEFT JOIN group_control_map" . - " ON group_control_map.group_id = groups.id" . - " AND group_control_map.product_id = " . $self->{'product_id'} . - " WHERE isbuggroup"); - - while (&::MoreSQLData()) { - my ($groupid, $name, $description, $ison, $ingroup, $isactive, - $membercontrol, $othercontrol) = &::FetchSQLData(); - - $membercontrol ||= 0; - - # For product groups, we only want to use the group if either - # (1) The bit is set and not required, or - # (2) The group is Shown or Default for members and - # the user is a member of the group. - if ($ison || - ($isactive && $ingroup - && (($membercontrol == CONTROLMAPDEFAULT) - || ($membercontrol == CONTROLMAPSHOWN)) - )) - { - my $ismandatory = $isactive - && ($membercontrol == CONTROLMAPMANDATORY); - - push (@groups, { "bit" => $groupid, - "name" => $name, - "ison" => $ison, - "ingroup" => $ingroup, - "mandatory" => $ismandatory, - "description" => $description }); - } - } - - $self->{'groups'} = \@groups; - - return $self->{'groups'}; -} - -sub user { - my $self = shift; - return $self->{'user'} if exists $self->{'user'}; - - $self->{'user'} = {}; - - my $movers = Param("movers"); - $movers =~ s/\s?,\s?/|/g; - $movers =~ s/@/\@/g; - $self->{'user'}->{'canmove'} = Param("move-enabled") - && (defined $::COOKIE{"Bugzilla_login"}) - && ($::COOKIE{"Bugzilla_login"} =~ /$movers/); - - # In the below, if the person hasn't logged in ($::userid == 0), then - # we treat them as if they can do anything. That's because we don't - # know why they haven't logged in; it may just be because they don't - # use cookies. Display everything as if they have all the permissions - # in the world; their permissions will get checked when they log in - # and actually try to make the change. - $self->{'user'}->{'canedit'} = $::userid == 0 - || $::userid == $self->{'reporter'}{'id'} - || (Param('useqacontact') && $self->{'qa_contact'} && $::userid == $self->{'qa_contact'}{'id'}) - || $::userid == $self->{'assigned_to'}{'id'} - || &::UserInGroup("editbugs"); - $self->{'user'}->{'canconfirm'} = $::userid == 0 - || ($self->{'qa_contact'} && $::userid == $self->{'qa_contact'}{'id'}) - || $::userid == $self->{'assigned_to'}{'id'} - || &::UserInGroup("editbugs") - || &::UserInGroup("canconfirm"); - - return $self->{'user'}; -} - -sub choices { - my $self = shift; - return $self->{'choices'} if exists $self->{'choices'}; - - &::GetVersionTable(); - - $self->{'choices'} = {}; - - # Fiddle the product list. - my $seen_curr_prod; - my @prodlist; - - foreach my $product (@::enterable_products) { - if ($product eq $self->{'product'}) { - # if it's the product the bug is already in, it's ALWAYS in - # the popup, period, whether the user can see it or not, and - # regardless of the disallownew setting. - $seen_curr_prod = 1; - push(@prodlist, $product); - next; - } - - if (!&::CanEnterProduct($product)) { - # If we're using bug groups to restrict entry on products, and - # this product has an entry group, and the user is not in that - # group, we don't want to include that product in this list. - next; - } - - push(@prodlist, $product); - } - - # The current product is part of the popup, even if new bugs are no longer - # allowed for that product - if (!$seen_curr_prod) { - push (@prodlist, $self->{'product'}); - @prodlist = sort @prodlist; - } - - # Hack - this array contains "". See bug 106589. - my @res = grep ($_, @::settable_resolution); - - $self->{'choices'} = - { - 'product' => \@prodlist, - 'rep_platform' => \@::legal_platform, - 'priority' => \@::legal_priority, - 'bug_severity' => \@::legal_severity, - 'op_sys' => \@::legal_opsys, - 'bug_status' => \@::legal_bugs_status, - 'resolution' => \@res, - 'component' => $::components{$self->{product}}, - 'version' => $::versions{$self->{product}}, - 'target_milestone' => $::target_milestone{$self->{product}}, - }; - - return $self->{'choices'}; -} - -sub EmitDependList { - my ($myfield, $targetfield, $bug_id) = (@_); - my @list; - &::SendSQL("select dependencies.$targetfield, bugs.bug_status - from dependencies, bugs - where dependencies.$myfield = $bug_id - and bugs.bug_id = dependencies.$targetfield - order by dependencies.$targetfield"); - while (&::MoreSQLData()) { - my ($i, $stat) = (&::FetchSQLData()); - push @list, $i; - } - return @list; -} - -sub AUTOLOAD { - use vars qw($AUTOLOAD); - my $attr = $AUTOLOAD; - - $attr =~ s/.*:://; - return unless $attr=~ /[^A-Z]/; - confess ("invalid bug attribute $attr") unless $ok_field{$attr}; - - no strict 'refs'; - *$AUTOLOAD = sub { - my $self = shift; - if (defined $self->{$attr}) { - return $self->{$attr}; - } else { - return ''; - } - }; - - goto &$AUTOLOAD; -} - -1; diff --git a/Bugzilla/Attachment.pm b/Bugzilla/Attachment.pm index 84979d3ea..9f0467bb7 100644 --- a/Bugzilla/Attachment.pm +++ b/Bugzilla/Attachment.pm @@ -26,7 +26,7 @@ use strict; -package Attachment; +package Bugzilla::Attachment; # This module requires that its caller have said "require CGI.pl" to import # relevant functions from that script and its companion globals.pl. diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 94bd628e2..b1c2ea54d 100755 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -20,12 +20,14 @@ # Contributor(s): Dawn Endico <endico@mozilla.org> # Terry Weissman <terry@mozilla.org> # Chris Yeh <cyeh@bluemartini.com> +# Bradley Baetz <bbaetz@acm.org> +# Dave Miller <justdave@bugzilla.org> -package Bug; +package Bugzilla::Bug; use strict; -use RelationSet; +use Bugzilla::RelationSet; use vars qw($unconfirmedstate $legal_keywords @legal_platform @legal_priority @legal_severity @legal_opsys @legal_bugs_status @settable_resolution %components %versions %target_milestone @@ -33,7 +35,7 @@ use vars qw($unconfirmedstate $legal_keywords @legal_platform use CGI::Carp qw(fatalsToBrowser); -use Attachment; +use Bugzilla::Attachment; use Bugzilla::Config; use Bugzilla::Constants; use Bugzilla::Flag; @@ -190,7 +192,7 @@ sub initBug { $self->{'qa_contact'} = undef; } - my $ccSet = new RelationSet; + my $ccSet = new Bugzilla::RelationSet; $ccSet->mergeFromDB("select who from cc where bug_id=$bug_id"); my @cc = $ccSet->toArrayOfStrings(); if (@cc) { @@ -212,7 +214,7 @@ sub initBug { } } - $self->{'attachments'} = Attachment::query($self->{bug_id}); + $self->{'attachments'} = Bugzilla::Attachment::query($self->{bug_id}); # The types of flags that can be set on this bug. # If none, no UI for setting flags will be displayed. diff --git a/Bugzilla/BugMail.pm b/Bugzilla/BugMail.pm index 059667a08..fad3ad5d8 100644 --- a/Bugzilla/BugMail.pm +++ b/Bugzilla/BugMail.pm @@ -30,7 +30,7 @@ use strict; package Bugzilla::BugMail; -use RelationSet; +use Bugzilla::RelationSet; use Bugzilla::Config qw(:DEFAULT $datadir); use Bugzilla::Util; @@ -166,7 +166,7 @@ sub ProcessOneBug($) { trick_taint($start); trick_taint($end); - my $ccSet = new RelationSet(); + my $ccSet = new Bugzilla::RelationSet(); $ccSet->mergeFromDB("SELECT who FROM cc WHERE bug_id = $id"); $values{'cc'} = $ccSet->toString(); diff --git a/Bugzilla/Flag.pm b/Bugzilla/Flag.pm index 2052f9507..8c9a4befe 100644 --- a/Bugzilla/Flag.pm +++ b/Bugzilla/Flag.pm @@ -34,8 +34,7 @@ use Bugzilla::User; use Bugzilla::Config; use Bugzilla::Util; use Bugzilla::Error; - -use Attachment; +use Bugzilla::Attachment; use constant TABLES_ALREADY_LOCKED => 1; @@ -529,7 +528,7 @@ sub GetTarget { my $target = { 'exists' => 0 }; if ($attach_id) { - $target->{'attachment'} = new Attachment($attach_id); + $target->{'attachment'} = new Bugzilla::Attachment($attach_id); if ($bug_id) { # Make sure the bug and attachment IDs correspond to each other # (i.e. this is the bug to which this attachment is attached). diff --git a/Bugzilla/RelationSet.pm b/Bugzilla/RelationSet.pm index f2f822fc4..628746352 100644 --- a/Bugzilla/RelationSet.pm +++ b/Bugzilla/RelationSet.pm @@ -31,15 +31,16 @@ use strict; -# Everything that uses RelationSet should already have globals.pl loaded -# so we don't want to load it here. Doing so causes a loop in Perl because -# globals.pl turns around and does a 'use RelationSet' +# XXX - mod_perl +# Everything that uses Bugzilla::RelationSet should already have globals.pl +# loaded so we don't want to load it here. Doing so causes a loop in Perl +# because globals.pl turns around and does a 'use Bugzilla::RelationSet' # See http://bugzilla.mozilla.org/show_bug.cgi?id=72862 -#require "globals.pl"; +#require "../globals.pl"; -package RelationSet; +package Bugzilla::RelationSet; -# create a new empty RelationSet +# create a new empty Bugzilla::RelationSet # sub new { my $type = shift(); @@ -60,7 +61,7 @@ sub new { confess("invalid number of arguments"); } - # bless as a RelationSet + # bless as a Bugzilla::RelationSet # return $self; } @@ -81,7 +82,7 @@ sub generateSqlDeltas { my ( $self, # instance ptr to set representing the existing state $endState, # instance ptr to set representing the desired state $table, # table where these relations are kept - $invariantName, # column held const for a RelationSet (often "bug_id") + $invariantName, # column held const for a Bugzilla::RelationSet (often "bug_id") $invariantValue, # what to hold the above column constant at $columnName # the column which varies (often a userid) ) = @_; diff --git a/Bugzilla/Token.pm b/Bugzilla/Token.pm index f7be40ab3..20ce48050 100644 --- a/Bugzilla/Token.pm +++ b/Bugzilla/Token.pm @@ -27,7 +27,7 @@ use strict; # Bundle the functions in this file together into the "Token" package. -package Token; +package Bugzilla::Token; use Bugzilla::Config; use Bugzilla::Error; diff --git a/RelationSet.pm b/RelationSet.pm deleted file mode 100644 index f2f822fc4..000000000 --- a/RelationSet.pm +++ /dev/null @@ -1,266 +0,0 @@ -# -# The contents of this file are subject to the Mozilla Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is the Bugzilla Bug Tracking System. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are -# Copyright (C) 2000 Netscape Communications Corporation. All -# Rights Reserved. -# -# Contributor(s): Dan Mosedale <dmose@mozilla.org> -# Terry Weissman <terry@mozilla.org> -# Dave Miller <justdave@syndicomm.com> - -# This object models a set of relations between one item and a group -# of other items. An example is the set of relations between one bug -# and the users CCed on that bug. Currently, the relation objects are -# expected to be bugzilla userids. However, this could and perhaps -# should be generalized to work with non userid objects, such as -# keywords associated with a bug. That shouldn't be hard to do; it -# might involve turning this into a virtual base class, and having -# UserSet and KeywordSet types that inherit from it. - -use strict; - -# Everything that uses RelationSet should already have globals.pl loaded -# so we don't want to load it here. Doing so causes a loop in Perl because -# globals.pl turns around and does a 'use RelationSet' -# See http://bugzilla.mozilla.org/show_bug.cgi?id=72862 -#require "globals.pl"; - -package RelationSet; - -# create a new empty RelationSet -# -sub new { - my $type = shift(); - - # create a ref to an empty hash and bless it - # - my $self = {}; - bless $self, $type; - - # construct from a comma-delimited string - # - if ($#_ == 0) { - $self->mergeFromString($_[0]); - } - # unless this was a constructor for an empty list, somebody screwed up. - # - elsif ( $#_ != -1 ) { - confess("invalid number of arguments"); - } - - # bless as a RelationSet - # - return $self; -} - -# Assumes that the set of relations "FROM $table WHERE $constantSql and -# $column = $value" is currently represented by $self, and this set should -# be updated to look like $other. -# -# Returns an array of two strings, one INSERT and one DELETE, which will -# make this change. Either or both strings may be the empty string, -# meaning that no INSERT or DELETE or both (respectively) need to be done. -# -# THE CALLER IS RESPONSIBLE FOR ANY DESIRED LOCKING AND/OR CONSISTENCY -# CHECKS (not to mention doing the SendSQL() calls). -# -sub generateSqlDeltas { - ($#_ == 5) || confess("invalid number of arguments"); - my ( $self, # instance ptr to set representing the existing state - $endState, # instance ptr to set representing the desired state - $table, # table where these relations are kept - $invariantName, # column held const for a RelationSet (often "bug_id") - $invariantValue, # what to hold the above column constant at - $columnName # the column which varies (often a userid) - ) = @_; - - # construct the insert list by finding relations which exist in the - # end state but not the current state. - # - my @endStateRelations = keys(%$endState); - my @insertList = (); - foreach ( @endStateRelations ) { - push ( @insertList, $_ ) if ( ! exists $$self{"$_"} ); - } - - # we've built the list. If it's non-null, add required sql chrome. - # - my $sqlInsert=""; - if ( $#insertList > -1 ) { - $sqlInsert = "INSERT INTO $table ($invariantName, $columnName) VALUES " . - join (",", - map ( "($invariantValue, $_)" , @insertList ) - ); - } - - # construct the delete list by seeing which relations exist in the - # current state but not the end state - # - my @selfRelations = keys(%$self); - my @deleteList = (); - foreach ( @selfRelations ) { - push (@deleteList, $_) if ( ! exists $$endState{"$_"} ); - } - - # we've built the list. if it's non-empty, add required sql chrome. - # - my $sqlDelete = ""; - if ( $#deleteList > -1 ) { - $sqlDelete = "DELETE FROM $table WHERE $invariantName = $invariantValue " . - "AND $columnName IN ( " . join (",", @deleteList) . " )"; - } - - return ($sqlInsert, $sqlDelete); -} - -# compare the current object with another. -# -sub isEqual { - ($#_ == 1) || confess("invalid number of arguments"); - my $self = shift(); - my $other = shift(); - - # get arrays of the keys for faster processing - # - my @selfRelations = keys(%$self); - my @otherRelations = keys(%$other); - - # make sure the arrays are the same size - # - return 0 if ( $#selfRelations != $#otherRelations ); - - # bail out if any of the elements are different - # - foreach my $relation ( @selfRelations ) { - return 0 if ( !exists $$other{$relation}) - } - - # we made it! - # - return 1; - -} - -# merge the results of a SQL command into this set -# -sub mergeFromDB { - ( $#_ == 1 ) || confess("invalid number of arguments"); - my $self = shift(); - - &::SendSQL(shift()); - while (my @row = &::FetchSQLData()) { - $$self{$row[0]} = 1; - } - - return; -} - -# merge a set in string form into this set -# -sub mergeFromString { - ($#_ == 1) || confess("invalid number of arguments"); - my $self = shift(); - - # do the merge - # - foreach my $person (split(/[ ,]/, shift())) { - if ($person ne "") { - $$self{&::DBNameToIdAndCheck($person)} = 1; - } - } -} - -# remove a set in string form from this set -# -sub removeItemsInString { - ($#_ == 1) || confess("invalid number of arguments"); - my $self = shift(); - - # do the merge - # - foreach my $person (split(/[ ,]/, shift())) { - if ($person ne "") { - my $dbid = &::DBNameToIdAndCheck($person); - if (exists $$self{$dbid}) { - delete $$self{$dbid}; - } - } - } -} - -# remove a set in array form from this set -# -sub removeItemsInArray { - ($#_ > 0) || confess("invalid number of arguments"); - my $self = shift(); - - # do the merge - # - while (my $person = shift()) { - if ($person ne "") { - my $dbid = &::DBNameToIdAndCheck($person); - if (exists $$self{$dbid}) { - delete $$self{$dbid}; - } - } - } -} - -# return the number of elements in this set -# -sub size { - my $self = shift(); - - my @k = keys(%$self); - return $#k++; -} - -# return this set in array form -# -sub toArray { - my $self= shift(); - - return keys(%$self); -} - -# return this set as an array of strings -# -sub toArrayOfStrings { - ($#_ == 0) || confess("invalid number of arguments"); - my $self = shift(); - - my @result = (); - foreach my $i ( keys %$self ) { - push @result, &::DBID_to_name($i); - } - - return sort { lc($a) cmp lc($b) } @result; -} - -# return this set in string form (comma-separated and sorted) -# -sub toString { - ($#_ == 0) || confess("invalid number of arguments"); - my $self = shift(); - - my @result = (); - foreach my $i ( keys %$self ) { - push @result, &::DBID_to_name($i); - } - - return join(',', sort(@result)); -} - -1; diff --git a/Token.pm b/Token.pm deleted file mode 100644 index f7be40ab3..000000000 --- a/Token.pm +++ /dev/null @@ -1,268 +0,0 @@ -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Mozilla Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is the Bugzilla Bug Tracking System. -# -# The Initial Developer of the Original Code is Netscape Communications -# Corporation. Portions created by Netscape are -# Copyright (C) 1998 Netscape Communications Corporation. All -# Rights Reserved. -# -# Contributor(s): Myk Melez <myk@mozilla.org> - -################################################################################ -# Module Initialization -################################################################################ - -# Make it harder for us to do dangerous things in Perl. -use strict; - -# Bundle the functions in this file together into the "Token" package. -package Token; - -use Bugzilla::Config; -use Bugzilla::Error; - -use Date::Format; - -# This module requires that its caller have said "require CGI.pl" to import -# relevant functions from that script and its companion globals.pl. - -################################################################################ -# Constants -################################################################################ - -# The maximum number of days a token will remain valid. -my $maxtokenage = 3; - -################################################################################ -# Functions -################################################################################ - -sub IssueEmailChangeToken { - my ($userid, $old_email, $new_email) = @_; - - my $token_ts = time(); - my $issuedate = time2str("%Y-%m-%d %H:%M", $token_ts); - - # Generate a unique token and insert it into the tokens table. - # We have to lock the tokens table before generating the token, - # since the database must be queried for token uniqueness. - &::SendSQL("LOCK TABLES tokens WRITE"); - my $token = GenerateUniqueToken(); - my $quotedtoken = &::SqlQuote($token); - my $quoted_emails = &::SqlQuote($old_email . ":" . $new_email); - &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , - tokentype , eventdata ) - VALUES ( $userid , '$issuedate' , $quotedtoken , - 'emailold' , $quoted_emails )"); - my $newtoken = GenerateUniqueToken(); - $quotedtoken = &::SqlQuote($newtoken); - &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , - tokentype , eventdata ) - VALUES ( $userid , '$issuedate' , $quotedtoken , - 'emailnew' , $quoted_emails )"); - &::SendSQL("UNLOCK TABLES"); - - # Mail the user the token along with instructions for using it. - - my $template = $::template; - my $vars = $::vars; - - $vars->{'oldemailaddress'} = $old_email . Param('emailsuffix'); - $vars->{'newemailaddress'} = $new_email . Param('emailsuffix'); - - $vars->{'max_token_age'} = $maxtokenage; - $vars->{'token_ts'} = $token_ts; - - $vars->{'token'} = $token; - $vars->{'emailaddress'} = $old_email . Param('emailsuffix'); - - my $message; - $template->process("account/email/change-old.txt.tmpl", $vars, \$message) - || ThrowTemplateError($template->error()); - - open SENDMAIL, "|/usr/lib/sendmail -t -i"; - print SENDMAIL $message; - close SENDMAIL; - - $vars->{'token'} = $newtoken; - $vars->{'emailaddress'} = $new_email . Param('emailsuffix'); - - $message = ""; - $template->process("account/email/change-new.txt.tmpl", $vars, \$message) - || ThrowTemplateError($template->error()); - - open SENDMAIL, "|/usr/lib/sendmail -t -i"; - print SENDMAIL $message; - close SENDMAIL; - -} - -sub IssuePasswordToken { - # Generates a random token, adds it to the tokens table, and sends it - # to the user with instructions for using it to change their password. - - my ($loginname) = @_; - - # Retrieve the user's ID from the database. - my $quotedloginname = &::SqlQuote($loginname); - &::SendSQL("SELECT userid FROM profiles WHERE login_name = $quotedloginname"); - my ($userid) = &::FetchSQLData(); - - my $token_ts = time(); - my $issuedate = time2str("%Y-%m-%d %H:%M", $token_ts); - - # Generate a unique token and insert it into the tokens table. - # We have to lock the tokens table before generating the token, - # since the database must be queried for token uniqueness. - &::SendSQL("LOCK TABLES tokens WRITE"); - my $token = GenerateUniqueToken(); - my $quotedtoken = &::SqlQuote($token); - my $quotedipaddr = &::SqlQuote($::ENV{'REMOTE_ADDR'}); - &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , tokentype , eventdata ) - VALUES ( $userid , '$issuedate' , $quotedtoken , 'password' , $quotedipaddr )"); - &::SendSQL("UNLOCK TABLES"); - - # Mail the user the token along with instructions for using it. - - my $template = $::template; - my $vars = $::vars; - - $vars->{'token'} = $token; - $vars->{'emailaddress'} = $loginname . Param('emailsuffix'); - - $vars->{'max_token_age'} = $maxtokenage; - $vars->{'token_ts'} = $token_ts; - - my $message = ""; - $template->process("account/password/forgotten-password.txt.tmpl", - $vars, \$message) - || ThrowTemplateError($template->error()); - - open SENDMAIL, "|/usr/lib/sendmail -t -i"; - print SENDMAIL $message; - close SENDMAIL; - -} - - -sub CleanTokenTable { - &::SendSQL("LOCK TABLES tokens WRITE"); - &::SendSQL("DELETE FROM tokens - WHERE TO_DAYS(NOW()) - TO_DAYS(issuedate) >= " . $maxtokenage); - &::SendSQL("UNLOCK TABLES"); -} - - -sub GenerateUniqueToken { - # Generates a unique random token. Uses &GenerateRandomPassword - # for the tokens themselves and checks uniqueness by searching for - # the token in the "tokens" table. Gives up if it can't come up - # with a token after about one hundred tries. - - my $token; - my $duplicate = 1; - my $tries = 0; - while ($duplicate) { - - ++$tries; - if ($tries > 100) { - ThrowCodeError("token_generation_error"); - } - - $token = &::GenerateRandomPassword(); - &::SendSQL("SELECT userid FROM tokens WHERE token = " . &::SqlQuote($token)); - $duplicate = &::FetchSQLData(); - } - - return $token; - -} - - -sub Cancel { - # Cancels a previously issued token and notifies the system administrator. - # This should only happen when the user accidentally makes a token request - # or when a malicious hacker makes a token request on behalf of a user. - - my ($token, $cancelaction) = @_; - - # Quote the token for inclusion in SQL statements. - my $quotedtoken = &::SqlQuote($token); - - # Get information about the token being cancelled. - &::SendSQL("SELECT issuedate , tokentype , eventdata , login_name , realname - FROM tokens, profiles - WHERE tokens.userid = profiles.userid - AND token = $quotedtoken"); - my ($issuedate, $tokentype, $eventdata, $loginname, $realname) = &::FetchSQLData(); - - # Get the email address of the Bugzilla maintainer. - my $maintainer = Param('maintainer'); - - my $template = $::template; - my $vars = $::vars; - - $vars->{'emailaddress'} = $loginname . Param('emailsuffix'); - $vars->{'maintainer'} = $maintainer; - $vars->{'remoteaddress'} = $::ENV{'REMOTE_ADDR'}; - $vars->{'token'} = $token; - $vars->{'tokentype'} = $tokentype; - $vars->{'issuedate'} = $issuedate; - $vars->{'eventdata'} = $eventdata; - $vars->{'cancelaction'} = $cancelaction; - - # Notify the user via email about the cancellation. - - my $message; - $template->process("account/cancel-token.txt.tmpl", $vars, \$message) - || ThrowTemplateError($template->error()); - - open SENDMAIL, "|/usr/lib/sendmail -t -i"; - print SENDMAIL $message; - close SENDMAIL; - - # Delete the token from the database. - &::SendSQL("LOCK TABLES tokens WRITE"); - &::SendSQL("DELETE FROM tokens WHERE token = $quotedtoken"); - &::SendSQL("UNLOCK TABLES"); -} - -sub DeletePasswordTokens { - my ($userid, $reason) = @_; - - my $dbh = Bugzilla->dbh; - my $sth = $dbh->prepare("SELECT token " . - "FROM tokens " . - "WHERE userid=? AND tokentype='password'"); - $sth->execute($userid); - while (my $token = $sth->fetchrow_array) { - Token::Cancel($token, $reason); - } -} - -sub HasEmailChangeToken { - # Returns an email change token if the user has one. - - my ($userid) = @_; - - &::SendSQL("SELECT token FROM tokens WHERE userid = $userid " . - "AND (tokentype = 'emailnew' OR tokentype = 'emailold') " . - "LIMIT 1"); - my ($token) = &::FetchSQLData(); - - return $token; -} - - -1; diff --git a/checksetup.pl b/checksetup.pl index c14339f9a..e2daba47e 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -1348,7 +1348,6 @@ if ($^O !~ /MSWin32/i) { fixPerms('css', $<, $webservergid, 027, 1); fixPerms('js', $<, $webservergid, 027, 1); chmod 0644, 'globals.pl'; - chmod 0644, 'RelationSet.pm'; # Don't use fixPerms here, because it won't change perms on the directory # unless its using recursion diff --git a/globals.pl b/globals.pl index cdb61cd66..399482caa 100644 --- a/globals.pl +++ b/globals.pl @@ -74,7 +74,7 @@ use DBI; use Date::Format; # For time2str(). use Date::Parse; # For str2time(). -use RelationSet; +use Bugzilla::RelationSet; # Use standard Perl libraries for cross-platform file/directory manipulation. use File::Spec; @@ -354,8 +354,8 @@ sub GetVersionTable { $mtime = 0; } if (time() - $mtime > 3600) { - use Token; - Token::CleanTokenTable() if Bugzilla->dbwritesallowed; + use Bugzilla::Token; + Bugzilla::Token::CleanTokenTable() if Bugzilla->dbwritesallowed; GenerateVersionTable(); } require "$datadir/versioncache"; @@ -30,8 +30,8 @@ require "CGI.pl"; use vars qw($template $userid %COOKIE); -use Bug; use Bugzilla; +use Bugzilla::Bug; use Bugzilla::Config qw(:DEFAULT $datadir); use Bugzilla::BugMail; @@ -106,7 +106,7 @@ my @bugs; print "<P>\n"; foreach my $id (split(/:/, $::FORM{'buglist'})) { - my $bug = new Bug($id, $::userid); + my $bug = new Bugzilla::Bug($id, $::userid); push @bugs, $bug; if (!$bug->error) { my $exporterid = DBNameToIdAndCheck($exporter); @@ -155,7 +155,7 @@ $from =~ s/@/\@/; $msg .= "From: Bugzilla <" . $from . ">\n"; $msg .= "Subject: Moving bug(s) $buglist\n\n"; -my @fieldlist = (Bug::fields(), 'group', 'long_desc', 'attachment'); +my @fieldlist = (Bugzilla::Bug::fields(), 'group', 'long_desc', 'attachment'); my %displayfields; foreach (@fieldlist) { $displayfields{$_} = 1; diff --git a/post_bug.cgi b/post_bug.cgi index dbc102d3e..d6fda9b3b 100755 --- a/post_bug.cgi +++ b/post_bug.cgi @@ -30,7 +30,7 @@ use Bugzilla; use Bugzilla::Constants; require "CGI.pl"; -use Bug; +use Bugzilla::Bug; use Bugzilla::User; @@ -478,7 +478,7 @@ if (defined $::FORM{'qa_contact'}) { } $vars->{'id'} = $id; -my $bug = new Bug($id, $::userid); +my $bug = new Bugzilla::Bug($id, $::userid); $vars->{'bug'} = $bug; ThrowCodeError("bug_error", { bug => $bug }) if $bug->error; diff --git a/process_bug.cgi b/process_bug.cgi index d81f866e5..774883a9c 100755 --- a/process_bug.cgi +++ b/process_bug.cgi @@ -35,10 +35,9 @@ use Bugzilla; use Bugzilla::Constants; require "CGI.pl"; -use Bug; +use Bugzilla::Bug; use Bugzilla::User; - -use RelationSet; +use Bugzilla::RelationSet; # Use the Flag module to modify flag data if the user set flags. use Bugzilla::Flag; @@ -330,8 +329,8 @@ my $qacontactid; # CheckCanChangeField() defines what users are allowed to change what bugs. You # can add code here for site-specific policy changes, according to the # instructions given in the Bugzilla Guide and below. Note that you may also -# have to update the Bug::user() function to give people access to the options -# that they are permitted to change. +# have to update the Bugzilla::Bug::user() function to give people access to the +# options that they are permitted to change. # # CheckCanChangeField() should return true if the user is allowed to change this # field, and false if they are not. @@ -1752,7 +1751,7 @@ foreach my $id (@idlist) { # now show the next bug if ($next_bug) { if (detaint_natural($next_bug) && CanSeeBug($next_bug, $::userid)) { - my $bug = new Bug($next_bug, $::userid); + my $bug = new Bugzilla::Bug($next_bug, $::userid); ThrowCodeError("bug_error", { bug => $bug }) if $bug->error; # next.html.tmpl includes edit.html.tmpl, and therefore we diff --git a/show_bug.cgi b/show_bug.cgi index c7a780404..6d971bbfc 100755 --- a/show_bug.cgi +++ b/show_bug.cgi @@ -32,7 +32,7 @@ ConnectToDatabase(); use vars qw($template $vars $userid); -use Bug; +use Bugzilla::Bug; my $cgi = Bugzilla->cgi; @@ -65,10 +65,10 @@ if ($single) { # Its a bit silly to do the validation twice - that functionality should # probably move into Bug.pm at some point ValidateBugID($id); - push @bugs, new Bug($id, $userid); + push @bugs, new Bugzilla::Bug($id, $userid); } else { foreach my $id ($cgi->param('id')) { - my $bug = new Bug($id, $userid); + my $bug = new Bugzilla::Bug($id, $userid); push @bugs, $bug; } } @@ -93,7 +93,7 @@ $vars->{'bug_list'} = \@bug_list; # If no explicit list is defined, we show all fields. We then exclude any # on the exclusion list. This is so you can say e.g. "Everything except # attachments" without listing almost all the fields. -my @fieldlist = (Bug::fields(), 'group', 'long_desc', 'attachment'); +my @fieldlist = (Bugzilla::Bug::fields(), 'group', 'long_desc', 'attachment'); my %displayfields; if ($cgi->param("field")) { @@ -41,9 +41,9 @@ require "CGI.pl"; ConnectToDatabase(); quietly_check_login('permit_anonymous'); -# Use the "Token" module that contains functions for doing various +# Use the "Bugzilla::Token" module that contains functions for doing various # token-related tasks. -use Token; +use Bugzilla::Token; use Bugzilla::User; @@ -72,7 +72,7 @@ if ($cgi->param('t')) { } - Token::CleanTokenTable(); + Bugzilla::Token::CleanTokenTable(); # Make sure the token exists in the database. SendSQL( "SELECT tokentype FROM tokens WHERE token = $::quotedtoken" ); @@ -80,17 +80,17 @@ if ($cgi->param('t')) { # Make sure the token is the correct type for the action being taken. if ( grep($::action eq $_ , qw(cfmpw cxlpw chgpw)) && $tokentype ne 'password' ) { - Token::Cancel($::token, "wrong_token_for_changing_passwd"); + Bugzilla::Token::Cancel($::token, "wrong_token_for_changing_passwd"); ThrowUserError("wrong_token_for_changing_passwd"); } if ( ($::action eq 'cxlem') && (($tokentype ne 'emailold') && ($tokentype ne 'emailnew')) ) { - Token::Cancel($::token, "wrong_token_for_cancelling_email_change"); + Bugzilla::Token::Cancel($::token, "wrong_token_for_cancelling_email_change"); ThrowUserError("wrong_token_for_cancelling_email_change"); } if ( grep($::action eq $_ , qw(cfmem chgem)) && ($tokentype ne 'emailnew') ) { - Token::Cancel($::token, "wrong_token_for_confirming_email_change"); + Bugzilla::Token::Cancel($::token, "wrong_token_for_confirming_email_change"); ThrowUserError("wrong_token_for_confirming_email_change"); } } @@ -176,7 +176,7 @@ sub confirmChangePassword { sub cancelChangePassword { $vars->{'message'} = "password_change_canceled"; - Token::Cancel($::token, $vars->{'message'}); + Bugzilla::Token::Cancel($::token, $vars->{'message'}); print $cgi->header(); $template->process("global/message.html.tmpl", $vars) @@ -308,7 +308,7 @@ sub cancelChangeEmail { $vars->{'old_email'} = $old_email; $vars->{'new_email'} = $new_email; - Token::Cancel($::token, $vars->{'message'}); + Bugzilla::Token::Cancel($::token, $vars->{'message'}); SendSQL("LOCK TABLES tokens WRITE"); SendSQL("DELETE FROM tokens diff --git a/userprefs.cgi b/userprefs.cgi index f2b9445ed..5466c80cc 100755 --- a/userprefs.cgi +++ b/userprefs.cgi @@ -29,7 +29,7 @@ use Bugzilla; require "CGI.pl"; -use RelationSet; +use Bugzilla::RelationSet; # Use global template variables. use vars qw($template $vars $userid); @@ -121,9 +121,9 @@ sub SaveAccount { $cgi->param('Bugzilla_password') || ThrowCodeError("old_password_required"); - use Token; + use Bugzilla::Token; # Block multiple email changes for the same user. - if (Token::HasEmailChangeToken($userid)) { + if (Bugzilla::Token::HasEmailChangeToken($userid)) { ThrowUserError("email_change_in_progress"); } @@ -133,7 +133,7 @@ sub SaveAccount { ValidateNewUser($new_login_name) || ThrowUserError("account_exists", {email => $new_login_name}); - Token::IssueEmailChangeToken($userid,$old_login_name, + Bugzilla::Token::IssueEmailChangeToken($userid,$old_login_name, $new_login_name); $vars->{'email_changes_saved'} = 1; @@ -148,7 +148,7 @@ sub SaveAccount { sub DoEmail { if (Param("supportwatchers")) { - my $watcheduserSet = new RelationSet; + my $watcheduserSet = new Bugzilla::RelationSet; $watcheduserSet->mergeFromDB("SELECT watched FROM watch WHERE" . " watcher=$userid"); $vars->{'watchedusers'} = $watcheduserSet->toString(); @@ -246,12 +246,12 @@ sub SaveEmail { SendSQL("LOCK TABLES watch WRITE, profiles READ"); # what the db looks like now - my $origWatchedUsers = new RelationSet; + my $origWatchedUsers = new Bugzilla::RelationSet; $origWatchedUsers->mergeFromDB("SELECT watched FROM watch WHERE" . " watcher=$userid"); # Update the database to look like the form - my $newWatchedUsers = new RelationSet($cgi->param('watchedusers')); + my $newWatchedUsers = new Bugzilla::RelationSet($cgi->param('watchedusers')); my @CCDELTAS = $origWatchedUsers->generateSqlDeltas( $newWatchedUsers, "watch", |