Bug 405946: Some emails are not sent in the language chosen by the addressee - Patch by Fr��d��ric Buclin <LpSolit@gmail.com> r=wurblzap a=LpSolit

This commit is contained in:
lpsolit%gmail.com 2008-04-02 17:42:29 +00:00
Родитель 41911c1539
Коммит 4c1d306d40
14 изменённых файлов: 130 добавлений и 134 удалений

Просмотреть файл

@ -3024,7 +3024,6 @@ sub RemoveVotes {
if (scalar(@list)) { if (scalar(@list)) {
foreach my $ref (@list) { foreach my $ref (@list) {
my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = (@$ref); my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = (@$ref);
my $s;
$maxvotesperbug = min($votesperuser, $maxvotesperbug); $maxvotesperbug = min($votesperuser, $maxvotesperbug);
@ -3038,23 +3037,13 @@ sub RemoveVotes {
my $removedvotes = $oldvotes - $newvotes; my $removedvotes = $oldvotes - $newvotes;
$s = ($oldvotes == 1) ? "" : "s";
my $oldvotestext = "You had $oldvotes vote$s on this bug.";
$s = ($removedvotes == 1) ? "" : "s";
my $removedvotestext = "You had $removedvotes vote$s removed from this bug.";
my $newvotestext;
if ($newvotes) { if ($newvotes) {
$dbh->do("UPDATE votes SET vote_count = ? " . $dbh->do("UPDATE votes SET vote_count = ? " .
"WHERE bug_id = ? AND who = ?", "WHERE bug_id = ? AND who = ?",
undef, ($newvotes, $id, $userid)); undef, ($newvotes, $id, $userid));
$s = $newvotes == 1 ? "" : "s";
$newvotestext = "You still have $newvotes vote$s on this bug."
} else { } else {
$dbh->do("DELETE FROM votes WHERE bug_id = ? AND who = ?", $dbh->do("DELETE FROM votes WHERE bug_id = ? AND who = ?",
undef, ($id, $userid)); undef, ($id, $userid));
$newvotestext = "You have no more votes remaining on this bug.";
} }
# Notice that we did not make sure that the user fit within the $votesperuser # Notice that we did not make sure that the user fit within the $votesperuser
@ -3065,7 +3054,6 @@ sub RemoveVotes {
# Now lets send the e-mail to alert the user to the fact that their votes have # Now lets send the e-mail to alert the user to the fact that their votes have
# been reduced or removed. # been reduced or removed.
my $vars = { my $vars = {
'to' => $name . Bugzilla->params->{'emailsuffix'}, 'to' => $name . Bugzilla->params->{'emailsuffix'},
'bugid' => $id, 'bugid' => $id,
'reason' => $reason, 'reason' => $reason,
@ -3073,19 +3061,17 @@ sub RemoveVotes {
'votesremoved' => $removedvotes, 'votesremoved' => $removedvotes,
'votesold' => $oldvotes, 'votesold' => $oldvotes,
'votesnew' => $newvotes, 'votesnew' => $newvotes,
'votesremovedtext' => $removedvotestext,
'votesoldtext' => $oldvotestext,
'votesnewtext' => $newvotestext,
'count' => $removedvotes . "\n " . $newvotestext
}; };
my $voter = new Bugzilla::User($userid);
my $template = Bugzilla->template_inner($voter->settings->{'lang'}->{'value'});
my $msg; my $msg;
my $template = Bugzilla->template;
$template->process("email/votes-removed.txt.tmpl", $vars, \$msg); $template->process("email/votes-removed.txt.tmpl", $vars, \$msg);
push(@messages, $msg); push(@messages, $msg);
} }
Bugzilla->template_inner("");
my $votes = $dbh->selectrow_array("SELECT SUM(vote_count) " . my $votes = $dbh->selectrow_array("SELECT SUM(vote_count) " .
"FROM votes WHERE bug_id = ?", "FROM votes WHERE bug_id = ?",
undef, $id) || 0; undef, $id) || 0;

Просмотреть файл

@ -1063,56 +1063,54 @@ or deleted.
sub notify { sub notify {
my ($flag, $bug, $attachment) = @_; my ($flag, $bug, $attachment) = @_;
my $template = Bugzilla->template;
# There is nobody to notify. # There is nobody to notify.
return unless ($flag->{'addressee'} || $flag->type->cc_list); return unless ($flag->{'addressee'} || $flag->type->cc_list);
my $attachment_is_private = $attachment ? $attachment->isprivate : undef;
# If the target bug is restricted to one or more groups, then we need # If the target bug is restricted to one or more groups, then we need
# to make sure we don't send email about it to unauthorized users # to make sure we don't send email about it to unauthorized users
# on the request type's CC: list, so we have to trawl the list for users # on the request type's CC: list, so we have to trawl the list for users
# not in those groups or email addresses that don't have an account. # not in those groups or email addresses that don't have an account.
my @bug_in_groups = grep {$_->{'ison'} || $_->{'mandatory'}} @{$bug->groups}; my @bug_in_groups = grep {$_->{'ison'} || $_->{'mandatory'}} @{$bug->groups};
my $attachment_is_private = $attachment ? $attachment->isprivate : undef;
if (scalar(@bug_in_groups) || $attachment_is_private) { my %recipients;
my @new_cc_list; foreach my $cc (split(/[, ]+/, $flag->type->cc_list)) {
foreach my $cc (split(/[, ]+/, $flag->type->cc_list)) { my $ccuser = new Bugzilla::User({ name => $cc });
my $ccuser = new Bugzilla::User({ name => $cc }) || next; next if (scalar(@bug_in_groups) && (!$ccuser || !$ccuser->can_see_bug($bug->bug_id)));
next if $attachment_is_private && (!$ccuser || !$ccuser->is_insider);
next if (scalar(@bug_in_groups) && !$ccuser->can_see_bug($bug->bug_id)); # Prevent duplicated entries due to case sensitivity.
next if $attachment_is_private $cc = $ccuser ? $ccuser->email : $cc;
&& Bugzilla->params->{"insidergroup"} $recipients{$cc} = $ccuser;
&& !$ccuser->in_group(Bugzilla->params->{"insidergroup"});
push(@new_cc_list, $cc);
}
$flag->type->{'cc_list'} = join(", ", @new_cc_list);
} }
# If there is nobody left to notify, return.
return unless ($flag->{'addressee'} || $flag->type->cc_list);
my @recipients = split(/[, ]+/, $flag->type->cc_list);
# Only notify if the addressee is allowed to receive the email. # Only notify if the addressee is allowed to receive the email.
if ($flag->{'addressee'} && $flag->{'addressee'}->email_enabled) { if ($flag->{'addressee'} && $flag->{'addressee'}->email_enabled) {
push @recipients, $flag->{'addressee'}->email; $recipients{$flag->{'addressee'}->email} = $flag->{'addressee'};
} }
# Process and send notification for each recipient # Process and send notification for each recipient.
foreach my $to (@recipients) # If there are users in the CC list who don't have an account,
{ # use the default language for email notifications.
next unless $to; my $default_lang;
if (grep { !$_ } values %recipients) {
my $default_user = new Bugzilla::User();
$default_lang = $default_user->settings->{'lang'}->{'value'};
}
foreach my $to (keys %recipients) {
my $vars = { 'flag' => $flag, my $vars = { 'flag' => $flag,
'to' => $to, 'to' => $to,
'bug' => $bug, 'bug' => $bug,
'attachment' => $attachment}; 'attachment' => $attachment};
my $message;
my $rv = $template->process("request/email.txt.tmpl", $vars, \$message);
if (!$rv) {
Bugzilla->cgi->header();
ThrowTemplateError($template->error());
}
my $lang = $recipients{$to} ?
$recipients{$to}->settings->{'lang'}->{'value'} : $default_lang;
my $template = Bugzilla->template_inner($lang);
my $message;
$template->process("request/email.txt.tmpl", $vars, \$message)
|| ThrowTemplateError($template->error());
Bugzilla->template_inner("");
MessageToMTA($message); MessageToMTA($message);
} }
} }

Просмотреть файл

@ -34,6 +34,7 @@ use Bugzilla::Constants;
use Bugzilla::Error; use Bugzilla::Error;
use Bugzilla::Mailer; use Bugzilla::Mailer;
use Bugzilla::Util; use Bugzilla::Util;
use Bugzilla::User;
use Date::Format; use Date::Format;
use Date::Parse; use Date::Parse;
@ -80,20 +81,24 @@ sub issue_new_user_account_token {
$template->process('account/email/request-new.txt.tmpl', $vars, \$message) $template->process('account/email/request-new.txt.tmpl', $vars, \$message)
|| ThrowTemplateError($template->error()); || ThrowTemplateError($template->error());
# In 99% of cases, the user getting the confirmation email is the same one
# who made the request, and so it is reasonable to send the email in the same
# language used to view the "Create a New Account" page (we cannot use his
# user prefs as the user has no account yet!).
MessageToMTA($message); MessageToMTA($message);
} }
sub IssueEmailChangeToken { sub IssueEmailChangeToken {
my ($userid, $old_email, $new_email) = @_; my ($user, $old_email, $new_email) = @_;
my $email_suffix = Bugzilla->params->{'emailsuffix'}; my $email_suffix = Bugzilla->params->{'emailsuffix'};
my ($token, $token_ts) = _create_token($userid, 'emailold', $old_email . ":" . $new_email); my ($token, $token_ts) = _create_token($user->id, 'emailold', $old_email . ":" . $new_email);
my $newtoken = _create_token($userid, 'emailnew', $old_email . ":" . $new_email); my $newtoken = _create_token($user->id, 'emailnew', $old_email . ":" . $new_email);
# Mail the user the token along with instructions for using it. # Mail the user the token along with instructions for using it.
my $template = Bugzilla->template; my $template = Bugzilla->template_inner($user->settings->{'lang'}->{'value'});
my $vars = {}; my $vars = {};
$vars->{'oldemailaddress'} = $old_email . $email_suffix; $vars->{'oldemailaddress'} = $old_email . $email_suffix;
@ -118,38 +123,34 @@ sub IssueEmailChangeToken {
$template->process("account/email/change-new.txt.tmpl", $vars, \$message) $template->process("account/email/change-new.txt.tmpl", $vars, \$message)
|| ThrowTemplateError($template->error()); || ThrowTemplateError($template->error());
Bugzilla->template_inner("");
MessageToMTA($message); MessageToMTA($message);
} }
# Generates a random token, adds it to the tokens table, and sends it # 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. # to the user with instructions for using it to change their password.
sub IssuePasswordToken { sub IssuePasswordToken {
my $loginname = shift; my $user = shift;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
my $template = Bugzilla->template;
my $vars = {};
# Retrieve the user's ID from the database. my $too_soon =
trick_taint($loginname); $dbh->selectrow_array('SELECT 1 FROM tokens
my ($userid, $too_soon) = WHERE userid = ?
$dbh->selectrow_array('SELECT profiles.userid, tokens.issuedate AND tokentype = ?
FROM profiles AND issuedate > NOW() - ' .
LEFT JOIN tokens $dbh->sql_interval(10, 'MINUTE'),
ON tokens.userid = profiles.userid undef, ($user->id, 'password'));
AND tokens.tokentype = ?
AND tokens.issuedate > NOW() - ' .
$dbh->sql_interval(10, 'MINUTE') . '
WHERE ' . $dbh->sql_istrcmp('login_name', '?'),
undef, ('password', $loginname));
ThrowUserError('too_soon_for_new_token', {'type' => 'password'}) if $too_soon; ThrowUserError('too_soon_for_new_token', {'type' => 'password'}) if $too_soon;
my ($token, $token_ts) = _create_token($userid, 'password', $::ENV{'REMOTE_ADDR'}); my ($token, $token_ts) = _create_token($user->id, 'password', $::ENV{'REMOTE_ADDR'});
# Mail the user the token along with instructions for using it. # Mail the user the token along with instructions for using it.
$vars->{'token'} = $token; my $template = Bugzilla->template_inner($user->settings->{'lang'}->{'value'});
$vars->{'emailaddress'} = $loginname . Bugzilla->params->{'emailsuffix'}; my $vars = {};
$vars->{'token'} = $token;
$vars->{'emailaddress'} = $user->email;
$vars->{'max_token_age'} = MAX_TOKEN_AGE; $vars->{'max_token_age'} = MAX_TOKEN_AGE;
$vars->{'token_ts'} = $token_ts; $vars->{'token_ts'} = $token_ts;
@ -158,6 +159,7 @@ sub IssuePasswordToken {
$vars, \$message) $vars, \$message)
|| ThrowTemplateError($template->error()); || ThrowTemplateError($template->error());
Bugzilla->template_inner("");
MessageToMTA($message); MessageToMTA($message);
} }
@ -205,31 +207,28 @@ sub GenerateUniqueToken {
return $token; return $token;
} }
# Cancels a previously issued token and notifies the system administrator. # Cancels a previously issued token and notifies the user.
# This should only happen when the user accidentally makes a token request # 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. # or when a malicious hacker makes a token request on behalf of a user.
sub Cancel { sub Cancel {
my ($token, $cancelaction, $vars) = @_; my ($token, $cancelaction, $vars) = @_;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
my $template = Bugzilla->template;
$vars ||= {}; $vars ||= {};
# Get information about the token being canceled. # Get information about the token being canceled.
trick_taint($token); trick_taint($token);
my ($issuedate, $tokentype, $eventdata, $loginname) = my ($issuedate, $tokentype, $eventdata, $userid) =
$dbh->selectrow_array('SELECT ' . $dbh->sql_date_format('issuedate') . ', $dbh->selectrow_array('SELECT ' . $dbh->sql_date_format('issuedate') . ',
tokentype, eventdata, login_name tokentype, eventdata, userid
FROM tokens FROM tokens
LEFT JOIN profiles
ON tokens.userid = profiles.userid
WHERE token = ?', WHERE token = ?',
undef, $token); undef, $token);
# If we are cancelling the creation of a new user account, then there # If we are canceling the creation of a new user account, then there
# is no entry in the 'profiles' table. # is no entry in the 'profiles' table.
$loginname ||= $eventdata; my $user = new Bugzilla::User($userid);
$vars->{'emailaddress'} = $loginname . Bugzilla->params->{'emailsuffix'};
$vars->{'maintainer'} = Bugzilla->params->{'maintainer'}; $vars->{'emailaddress'} = $userid ? $user->email : $eventdata;
$vars->{'remoteaddress'} = $::ENV{'REMOTE_ADDR'}; $vars->{'remoteaddress'} = $::ENV{'REMOTE_ADDR'};
$vars->{'token'} = $token; $vars->{'token'} = $token;
$vars->{'tokentype'} = $tokentype; $vars->{'tokentype'} = $tokentype;
@ -238,11 +237,13 @@ sub Cancel {
$vars->{'cancelaction'} = $cancelaction; $vars->{'cancelaction'} = $cancelaction;
# Notify the user via email about the cancellation. # Notify the user via email about the cancellation.
my $template = Bugzilla->template_inner($user->settings->{'lang'}->{'value'});
my $message; my $message;
$template->process("account/cancel-token.txt.tmpl", $vars, \$message) $template->process("account/cancel-token.txt.tmpl", $vars, \$message)
|| ThrowTemplateError($template->error()); || ThrowTemplateError($template->error());
Bugzilla->template_inner("");
MessageToMTA($message); MessageToMTA($message);
# Delete the token from the database. # Delete the token from the database.
@ -391,8 +392,8 @@ Bugzilla::Token - Provides different routines to manage tokens.
use Bugzilla::Token; use Bugzilla::Token;
Bugzilla::Token::issue_new_user_account_token($login_name); Bugzilla::Token::issue_new_user_account_token($login_name);
Bugzilla::Token::IssueEmailChangeToken($user_id, $old_email, $new_email); Bugzilla::Token::IssueEmailChangeToken($user, $old_email, $new_email);
Bugzilla::Token::IssuePasswordToken($login_name); Bugzilla::Token::IssuePasswordToken($user);
Bugzilla::Token::DeletePasswordTokens($user_id, $reason); Bugzilla::Token::DeletePasswordTokens($user_id, $reason);
Bugzilla::Token::Cancel($token, $cancelaction, $vars); Bugzilla::Token::Cancel($token, $cancelaction, $vars);
@ -422,26 +423,26 @@ Bugzilla::Token - Provides different routines to manage tokens.
Returns: Nothing. It throws an error if the same user made the same Returns: Nothing. It throws an error if the same user made the same
request in the last few minutes. request in the last few minutes.
=item C<sub IssueEmailChangeToken($user_id, $old_email, $new_email)> =item C<sub IssueEmailChangeToken($user, $old_email, $new_email)>
Description: Sends two distinct tokens per email to the old and new email Description: Sends two distinct tokens per email to the old and new email
addresses to confirm the email address change for the given addresses to confirm the email address change for the given
user ID. These tokens remain valid for the next MAX_TOKEN_AGE days. user. These tokens remain valid for the next MAX_TOKEN_AGE days.
Params: $user_id - The user ID of the user account requesting a new Params: $user - User object of the user requesting a new
email address. email address.
$old_email - The current (old) email address of the user. $old_email - The current (old) email address of the user.
$new_email - The new email address of the user. $new_email - The new email address of the user.
Returns: Nothing. Returns: Nothing.
=item C<IssuePasswordToken($login_name)> =item C<IssuePasswordToken($user)>
Description: Sends a token per email to the given login name. This token Description: Sends a token per email to the given user. This token
can be used to change the password (e.g. in case the user can be used to change the password (e.g. in case the user
cannot remember his password and wishes to enter a new one). cannot remember his password and wishes to enter a new one).
Params: $login_name - The login name of the user requesting a new password. Params: $user - User object of the user requesting a new password.
Returns: Nothing. It throws an error if the same user made the same Returns: Nothing. It throws an error if the same user made the same
request in the last few minutes. request in the last few minutes.

Просмотреть файл

@ -939,10 +939,7 @@ if ($action eq 'update') {
my ($who, $id) = (@$vote); my ($who, $id) = (@$vote);
# If some votes are removed, RemoveVotes() returns a list # If some votes are removed, RemoveVotes() returns a list
# of messages to send to voters. # of messages to send to voters.
my $msgs = my $msgs = RemoveVotes($id, $who, 'votes_too_many_per_bug');
RemoveVotes($id, $who, "The rules for voting on this product " .
"has changed;\nyou had too many votes " .
"for a single bug.");
foreach my $msg (@$msgs) { foreach my $msg (@$msgs) {
MessageToMTA($msg); MessageToMTA($msg);
} }
@ -991,11 +988,7 @@ if ($action eq 'update') {
foreach my $bug_id (@$bug_ids) { foreach my $bug_id (@$bug_ids) {
# RemoveVotes() returns a list of messages to send # RemoveVotes() returns a list of messages to send
# in case some voters had too many votes. # in case some voters had too many votes.
my $msgs = my $msgs = RemoveVotes($bug_id, $who, 'votes_too_many_per_user');
RemoveVotes($bug_id, $who, "The rules for voting on this " .
"product has changed; you had " .
"too many\ntotal votes, so all " .
"votes have been removed.");
foreach my $msg (@$msgs) { foreach my $msg (@$msgs) {
MessageToMTA($msg); MessageToMTA($msg);
} }

Просмотреть файл

@ -560,9 +560,7 @@ foreach my $bug (@bug_objects) {
# If some votes have been removed, RemoveVotes() returns # If some votes have been removed, RemoveVotes() returns
# a list of messages to send to voters. # a list of messages to send to voters.
# We delay the sending of these messages till tables are unlocked. # We delay the sending of these messages till tables are unlocked.
$msgs = RemoveVotes($bug->id, 0, $msgs = RemoveVotes($bug->id, 0, 'votes_bug_moved');
"This bug has been moved to a different product");
CheckIfVotedConfirmed($bug->id, Bugzilla->user->id); CheckIfVotedConfirmed($bug->id, Bugzilla->user->id);
} }

Просмотреть файл

@ -158,11 +158,11 @@ elsif ($action eq 'begin-sudo') {
# Go ahead and send out the message now # Go ahead and send out the message now
my $message; my $message;
$template->process('email/sudo.txt.tmpl', my $mail_template = Bugzilla->template_inner($target_user->settings->{'lang'}->{'value'});
{ reason => $reason }, $mail_template->process('email/sudo.txt.tmpl', { reason => $reason }, \$message);
\$message); Bugzilla->template_inner("");
MessageToMTA($message); MessageToMTA($message);
$vars->{'message'} = 'sudo_started'; $vars->{'message'} = 'sudo_started';
$vars->{'target'} = $target_user->login; $vars->{'target'} = $target_user->login;
$target = 'global/message.html.tmpl'; $target = 'global/message.html.tmpl';

Просмотреть файл

@ -69,7 +69,15 @@ my $user = Bugzilla->login(LOGIN_REQUIRED);
my $cgi = Bugzilla->cgi; my $cgi = Bugzilla->cgi;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
my $template = Bugzilla->template; # If the result of the sanity check is sent per email, then we have to
# take the user prefs into account rather than querying the web browser.
my $template;
if (Bugzilla->usage_mode == USAGE_MODE_CMDLINE) {
$template = Bugzilla->template_inner($user->settings->{'lang'}->{'value'});
}
else {
$template = Bugzilla->template;
}
my $vars = {}; my $vars = {};
print $cgi->header() unless Bugzilla->usage_mode == USAGE_MODE_CMDLINE; print $cgi->header() unless Bugzilla->usage_mode == USAGE_MODE_CMDLINE;

Просмотреть файл

@ -32,7 +32,7 @@ If you did not request this, it could be either an honest
mistake or someone attempting to break into your [% terms.Bugzilla %] account. mistake or someone attempting to break into your [% terms.Bugzilla %] account.
Take a look at the information below and forward this email Take a look at the information below and forward this email
to [% maintainer %] if you suspect foul play. to [% Param('maintainer') %] if you suspect foul play.
Token: [% token %] Token: [% token %]
Token Type: [% tokentype %] Token Type: [% tokentype %]

Просмотреть файл

@ -27,11 +27,28 @@ X-Bugzilla-Type: voteremoved
Some or all of your votes have been removed from [% terms.bug %] [%+ bugid %]. Some or all of your votes have been removed from [% terms.bug %] [%+ bugid %].
[% votesoldtext %] You had [% votesold FILTER html %] [%+ IF votesold == 1 %]vote[% ELSE %]votes[% END
%] on this [% terms.bug %], but [% votesremoved FILTER html %] have been removed.
[% votesnewtext %] [% IF votesnew %]
You still have [% votesnew FILTER html %] [%+ IF votesnew == 1 %]vote[% ELSE %]votes[% END %] on this [% terms.bug %].
[% ELSE %]
You have no more votes remaining on this [% terms.bug %].
[% END %]
Reason:
[% IF reason == "votes_bug_moved" %]
This [% terms.bug %] has been moved to a different product.
[% ELSIF reason == "votes_too_many_per_bug" %]
The rules for voting on this product has changed;
you had too many votes for a single [% terms.bug %].
[% ELSIF reason == "votes_too_many_per_user" %]
The rules for voting on this product has changed; you had
too many total votes, so all votes have been removed.
[% END %]
Reason: [% reason %]
[% urlbase %]show_bug.cgi?id=[% bugid %] [% urlbase %]show_bug.cgi?id=[% bugid %]

Просмотреть файл

@ -76,11 +76,6 @@
that login name. that login name.
[% END %] [% END %]
[% ELSIF error == "account_does_not_exist" %]
[% title = "Account Does Not Exist" %]
<code>[% email FILTER html %]</code> is not a valid [% terms.Bugzilla %]
account.
[% ELSIF error == "alias_has_comma_or_space" %] [% ELSIF error == "alias_has_comma_or_space" %]
[% title = "Invalid Characters In Alias" %] [% title = "Invalid Characters In Alias" %]
The alias you entered, <em>[% alias FILTER html %]</em>, The alias you entered, <em>[% alias FILTER html %]</em>,

Просмотреть файл

@ -101,11 +101,10 @@ if ($cgi->param('t')) {
# If the user is requesting a password change, make sure they submitted # If the user is requesting a password change, make sure they submitted
# their login name and it exists in the database, and that the DB module is in # their login name and it exists in the database, and that the DB module is in
# the list of allowed verification methods. # the list of allowed verification methods.
my $login_name; my $user_account;
if ( $::action eq 'reqpw' ) { if ( $::action eq 'reqpw' ) {
$login_name = $cgi->param('loginname'); my $login_name = $cgi->param('loginname')
defined $login_name || ThrowUserError("login_needed_for_password_change");
|| ThrowUserError("login_needed_for_password_change");
# check verification methods # check verification methods
unless (Bugzilla->user->authorizer->can_change_password) { unless (Bugzilla->user->authorizer->can_change_password) {
@ -115,10 +114,7 @@ if ( $::action eq 'reqpw' ) {
validate_email_syntax($login_name) validate_email_syntax($login_name)
|| ThrowUserError('illegal_email_address', {addr => $login_name}); || ThrowUserError('illegal_email_address', {addr => $login_name});
my ($user_id) = $dbh->selectrow_array('SELECT userid FROM profiles WHERE ' . $user_account = Bugzilla::User->check($login_name);
$dbh->sql_istrcmp('login_name', '?'),
undef, $login_name);
$user_id || ThrowUserError("account_does_not_exist", {'email' => $login_name});
} }
# If the user is changing their password, make sure they submitted a new # If the user is changing their password, make sure they submitted a new
@ -142,7 +138,7 @@ if ( $::action eq 'chgpw' ) {
# that variable and runs the appropriate code. # that variable and runs the appropriate code.
if ($::action eq 'reqpw') { if ($::action eq 'reqpw') {
requestChangePassword($login_name); requestChangePassword($user_account);
} elsif ($::action eq 'cfmpw') { } elsif ($::action eq 'cfmpw') {
confirmChangePassword(); confirmChangePassword();
} elsif ($::action eq 'cxlpw') { } elsif ($::action eq 'cxlpw') {
@ -175,8 +171,8 @@ exit;
################################################################################ ################################################################################
sub requestChangePassword { sub requestChangePassword {
my ($login_name) = @_; my ($user) = @_;
Bugzilla::Token::IssuePasswordToken($login_name); Bugzilla::Token::IssuePasswordToken($user);
$vars->{'message'} = "password_change_request"; $vars->{'message'} = "password_change_request";

Просмотреть файл

@ -138,7 +138,7 @@ sub SaveAccount {
is_available_username($new_login_name) is_available_username($new_login_name)
|| ThrowUserError("account_exists", {email => $new_login_name}); || ThrowUserError("account_exists", {email => $new_login_name});
Bugzilla::Token::IssueEmailChangeToken($user->id, $old_login_name, Bugzilla::Token::IssueEmailChangeToken($user, $old_login_name,
$new_login_name); $new_login_name);
$vars->{'email_changes_saved'} = 1; $vars->{'email_changes_saved'} = 1;

Просмотреть файл

@ -353,10 +353,11 @@ while (my $event = get_next_event) {
# #
sub mail { sub mail {
my $args = shift; my $args = shift;
my $addressee = $args->{recipient};
# Don't send mail to someone whose bugmail notification is disabled.
return if $addressee->email_disabled;
# Don't send mail to someone on the nomail list. my $template = Bugzilla->template_inner($addressee->settings->{'lang'}->{'value'});
return if $args->{recipient}->email_disabled;
my $msg = ''; # it's a temporary variable to hold the template output my $msg = ''; # it's a temporary variable to hold the template output
$args->{'alternatives'} ||= []; $args->{'alternatives'} ||= [];
@ -387,6 +388,7 @@ sub mail {
$template->process("whine/multipart-mime.txt.tmpl", $args, \$msg) $template->process("whine/multipart-mime.txt.tmpl", $args, \$msg)
or die($template->error()); or die($template->error());
Bugzilla->template_inner("");
MessageToMTA($msg); MessageToMTA($msg);
delete $args->{'boundary'}; delete $args->{'boundary'};

Просмотреть файл

@ -85,9 +85,11 @@ foreach my $email (sort (keys %bugs)) {
$vars->{'bugs'} = \@bugs; $vars->{'bugs'} = \@bugs;
my $msg; my $msg;
my $template = Bugzilla->template; my $template = Bugzilla->template_inner($user->settings->{'lang'}->{'value'});
$template->process("email/whine.txt.tmpl", $vars, \$msg); $template->process("email/whine.txt.tmpl", $vars, \$msg)
or die($template->error());
Bugzilla->template_inner("");
MessageToMTA($msg); MessageToMTA($msg);
print "$email " . join(" ", @{$bugs{$email}}) . "\n"; print "$email " . join(" ", @{$bugs{$email}}) . "\n";