Commit 6bff5c39 authored by mkanat%kerio.com's avatar mkanat%kerio.com

Bug 87404: Attachments don't work if you need to use user matching

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=justdave
parent e29e5757
...@@ -48,8 +48,20 @@ use base qw(Exporter); ...@@ -48,8 +48,20 @@ use base qw(Exporter);
@Bugzilla::User::EXPORT = qw(insert_new_user is_available_username @Bugzilla::User::EXPORT = qw(insert_new_user is_available_username
login_to_id login_to_id
UserInGroup UserInGroup
USER_MATCH_MULTIPLE USER_MATCH_FAILED USER_MATCH_SUCCESS
MATCH_SKIP_CONFIRM
); );
#####################################################################
# Constants
#####################################################################
use constant USER_MATCH_MULTIPLE => -1;
use constant USER_MATCH_FAILED => 0;
use constant USER_MATCH_SUCCESS => 1;
use constant MATCH_SKIP_CONFIRM => 1;
################################################################################ ################################################################################
# Functions # Functions
################################################################################ ################################################################################
...@@ -723,6 +735,11 @@ sub match { ...@@ -723,6 +735,11 @@ sub match {
# searchable fields have been replaced by exact fields and the calling script # searchable fields have been replaced by exact fields and the calling script
# is executed as normal. # is executed as normal.
# #
# You also have the choice of *never* displaying the confirmation screen.
# In this case, match_field will return one of the three USER_MATCH
# constants described in the POD docs. To make match_field behave this
# way, pass in MATCH_SKIP_CONFIRM as the third argument.
#
# match_field must be called early in a script, before anything external is # match_field must be called early in a script, before anything external is
# done with the form data. # done with the form data.
# #
...@@ -744,9 +761,11 @@ sub match { ...@@ -744,9 +761,11 @@ sub match {
sub match_field { sub match_field {
my $cgi = shift; # CGI object to look up fields in my $cgi = shift; # CGI object to look up fields in
my $fields = shift; # arguments as a hash my $fields = shift; # arguments as a hash
my $behavior = shift || 0; # A constant that tells us how to act
my $matches = {}; # the values sent to the template my $matches = {}; # the values sent to the template
my $matchsuccess = 1; # did the match fail? my $matchsuccess = 1; # did the match fail?
my $need_confirm = 0; # whether to display confirmation screen my $need_confirm = 0; # whether to display confirmation screen
my $match_multiple = 0; # whether we ever matched more than one user
# prepare default form values # prepare default form values
...@@ -881,6 +900,7 @@ sub match_field { ...@@ -881,6 +900,7 @@ sub match_field {
elsif ((scalar(@{$users}) > 1) elsif ((scalar(@{$users}) > 1)
&& (&::Param('maxusermatches') != 1)) { && (&::Param('maxusermatches') != 1)) {
$need_confirm = 1; $need_confirm = 1;
$match_multiple = 1;
if ((&::Param('maxusermatches')) if ((&::Param('maxusermatches'))
&& (scalar(@{$users}) > &::Param('maxusermatches'))) && (scalar(@{$users}) > &::Param('maxusermatches')))
...@@ -899,7 +919,19 @@ sub match_field { ...@@ -899,7 +919,19 @@ sub match_field {
} }
} }
return 1 unless $need_confirm; # skip confirmation if not needed. my $retval;
if (!$matchsuccess) {
$retval = USER_MATCH_FAILED;
}
elsif ($match_multiple) {
$retval = USER_MATCH_MULTIPLE;
}
else {
$retval = USER_MATCH_SUCCESS;
}
# Skip confirmation if we were told to, or if we don't need to confirm.
return $retval if ($behavior == MATCH_SKIP_CONFIRM || !$need_confirm);
$vars->{'script'} = $ENV{'SCRIPT_NAME'}; # for self-referencing URLs $vars->{'script'} = $ENV{'SCRIPT_NAME'}; # for self-referencing URLs
$vars->{'fields'} = $fields; # fields being matched $vars->{'fields'} = $fields; # fields being matched
...@@ -1219,6 +1251,28 @@ there is currently no way to modify a user from this package. ...@@ -1219,6 +1251,28 @@ there is currently no way to modify a user from this package.
Note that the currently logged in user (if any) is available via Note that the currently logged in user (if any) is available via
L<Bugzilla-E<gt>user|Bugzilla/"user">. L<Bugzilla-E<gt>user|Bugzilla/"user">.
=head1 CONSTANTS
=item C<USER_MATCH_MULTIPLE>
Returned by C<match_field()> when at least one field matched more than
one user, but no matches failed.
=item C<USER_MATCH_FAILED>
Returned by C<match_field()> when at least one field failed to match
anything.
=item C<USER_MATCH_SUCCESS>
Returned by C<match_field()> when all fields successfully matched only one
user.
=item C<MATCH_SKIP_CONFIRM>
Passed in to match_field to tell match_field to never display a
confirmation screen.
=head1 METHODS =head1 METHODS
=over 4 =over 4
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
# Daniel Raichle <draichle@gmx.net> # Daniel Raichle <draichle@gmx.net>
# Dave Miller <justdave@syndicomm.com> # Dave Miller <justdave@syndicomm.com>
# Alexander J. Vincent <ajvincent@juno.com> # Alexander J. Vincent <ajvincent@juno.com>
# Max Kanat-Alexander <mkanat@bugzilla.org>
################################################################################ ################################################################################
# Script Initialization # Script Initialization
...@@ -900,9 +901,18 @@ sub insert ...@@ -900,9 +901,18 @@ sub insert
# The order of these function calls is important, as both Flag::validate # The order of these function calls is important, as both Flag::validate
# and FlagType::validate assume User::match_field has ensured that the # and FlagType::validate assume User::match_field has ensured that the
# values in the requestee fields are legitimate user email addresses. # values in the requestee fields are legitimate user email addresses.
Bugzilla::User::match_field($cgi, { my $match_status = Bugzilla::User::match_field($cgi, {
'^requestee(_type)?-(\d+)$' => { 'type' => 'single' } '^requestee(_type)?-(\d+)$' => { 'type' => 'single' },
}); }, MATCH_SKIP_CONFIRM);
$vars->{'match_field'} = 'requestee';
if ($match_status == USER_MATCH_FAILED) {
$vars->{'message'} = 'user_match_failed';
}
elsif ($match_status == USER_MATCH_MULTIPLE) {
$vars->{'message'} = 'user_match_multiple';
}
Bugzilla::Flag::validate($cgi, $bugid); Bugzilla::Flag::validate($cgi, $bugid);
Bugzilla::FlagType::validate($cgi, $bugid, $cgi->param('id')); Bugzilla::FlagType::validate($cgi, $bugid, $cgi->param('id'));
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
# Rights Reserved. # Rights Reserved.
# #
# Contributor(s): Gervase Markham <gerv@gerv.net> # Contributor(s): Gervase Markham <gerv@gerv.net>
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%] #%]
[%# This is a list of all the possible messages. Please keep them in [%# This is a list of all the possible messages. Please keep them in
...@@ -236,6 +237,16 @@ ...@@ -236,6 +237,16 @@
[% ELSIF message_tag == "shutdown" %] [% ELSIF message_tag == "shutdown" %]
[% title = "$terms.Bugzilla is Down" %] [% title = "$terms.Bugzilla is Down" %]
[% Param("shutdownhtml") %] [% Param("shutdownhtml") %]
[% ELSIF message_tag == "user_match_failed" %]
You entered a username that did not match any known
[% terms.Bugzilla %] users, so we have instead left
the [% match_field FILTER html %] field blank.
[% ELSIF message_tag == "user_match_multiple" %]
You entered a username that matched more than one
user, so we have instead left the [% match_field FILTER html %]
field blank.
[% ELSE %] [% ELSE %]
[%# Give sensible error if error functions are used incorrectly. [%# Give sensible error if error functions are used incorrectly.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment