]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 219021: Only display email addresses to logged-in users
authormkanat%bugzilla.org <>
Thu, 29 Jan 2009 21:22:19 +0000 (21:22 +0000)
committermkanat%bugzilla.org <>
Thu, 29 Jan 2009 21:22:19 +0000 (21:22 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=LpSolit

21 files changed:
Bugzilla/DB.pm
Bugzilla/Template.pm
Bugzilla/Util.pm
buglist.cgi
t/007util.t
template/en/default/attachment/list.html.tmpl
template/en/default/bug/activity/table.html.tmpl
template/en/default/bug/comments.html.tmpl
template/en/default/bug/dependency-tree.html.tmpl
template/en/default/bug/edit.html.tmpl
template/en/default/bug/show-multiple.html.tmpl
template/en/default/bug/show.xml.tmpl
template/en/default/bug/votes/list-for-bug.html.tmpl
template/en/default/global/user.html.tmpl [new file with mode: 0644]
template/en/default/list/list.html.tmpl
template/en/default/reports/components.html.tmpl
template/en/default/reports/report-table.csv.tmpl
template/en/default/reports/report-table.html.tmpl
template/en/default/reports/report.html.tmpl
template/en/default/request/queue.html.tmpl
votes.cgi

index 377f839300f30b99cb0836b208e2093e127d8c6a..81a720ee59eb04da7b538b0ef17965f1a10c84b9 100644 (file)
@@ -342,6 +342,12 @@ sub sql_string_concat {
     return '(' . join(' || ', @params) . ')';
 }
 
+sub sql_string_until {
+    my ($self, $string, $substring) = @_;
+    return "SUBSTRING($string FROM 1 FOR " .
+                      $self->sql_position($substring, $string) . " - 1)";
+}
+
 sub sql_in {
     my ($self, $column_name, $in_list_ref) = @_;
     return " $column_name IN (" . join(',', @$in_list_ref) . ") ";
@@ -1811,6 +1817,25 @@ Formatted SQL for concatenating specified strings
 
 =back
 
+=item C<sql_string_until>
+
+=over
+
+=item B<Description>
+
+Returns SQL for truncating a string at the first occurrence of a certain
+substring.
+
+=item B<Params>
+
+Note that both parameters need to be sql-quoted.
+
+=item C<$string> The string we're truncating
+
+=item C<$substring> The substring we're truncating at.
+
+=back
+
 =item C<sql_fulltext_search>
 
 =over
index 03a9df8272633b06ed59fcf9578712ba1123c77d..688c533860c0f509951f0e3bd4ec518de99953b1 100644 (file)
@@ -664,6 +664,8 @@ sub create {
 
             html_light => \&Bugzilla::Util::html_light_quote,
 
+            email => \&Bugzilla::Util::email_filter,
+
             # iCalendar contentline filter
             ics => [ sub {
                          my ($context, @args) = @_;
index 991bfedc1b32533cbbe36ec421907361af47d987..01f824c5b5d3feac371feed77d543eaa16d3755b 100644 (file)
@@ -53,6 +53,7 @@ use Date::Format;
 use DateTime;
 use DateTime::TimeZone;
 use Digest;
+use Email::Address;
 use Scalar::Util qw(tainted);
 use Text::Wrap;
 
@@ -170,6 +171,20 @@ sub html_light_quote {
     }
 }
 
+sub email_filter {
+    my ($toencode) = @_;
+    if (!Bugzilla->user->id) {
+        my @emails = Email::Address->parse($toencode);
+        if (scalar @emails) {
+            my @hosts = map { quotemeta($_->host) } @emails;
+            my $hosts_re = join('|', @hosts);
+            $toencode =~ s/\@(?:$hosts_re)//g;
+            return $toencode;
+        }
+    }
+    return $toencode;
+}
+
 # This originally came from CGI.pm, by Lincoln D. Stein
 sub url_quote {
     my ($toencode) = (@_);
@@ -638,6 +653,7 @@ Bugzilla::Util - Generic utility functions for bugzilla
   html_quote($var);
   url_quote($var);
   xml_quote($var);
+  email_filter($var);
 
   # Functions for decoding
   $rv = url_decode($var);
@@ -755,6 +771,12 @@ is kept separate from html_quote partly for compatibility with previous code
 
 Converts the %xx encoding from the given URL back to its original form.
 
+=item C<email_filter>
+
+Removes the hostname from email addresses in the string, if the user
+currently viewing Bugzilla is logged out. If the user is logged-in,
+this filter just returns the input string.
+
 =back
 
 =head2 Environment and Location
index 55bb8a70d7f155f782ca888045e05d08ff0b3813..d51112a5c21c74985801080a5801b4bcea450bc8 100755 (executable)
@@ -673,6 +673,9 @@ foreach my $field (Bugzilla->get_fields({ obsolete => 0, buglist => 1 })) {
     my $name = 'bugs.' . $field->name;
     if ($id eq 'assigned_to' || $id eq 'reporter' || $id eq 'qa_contact') {
         $name = 'map_' . $field->name . '.login_name';
+        if (!Bugzilla->user->id) {
+            $name = $dbh->sql_string_until($name, $dbh->quote('@'));
+        }
     }
     elsif ($id eq 'product' || $id eq 'component' || $id eq 'classification') {
         $name = 'map_' . $field->name . 's.name';
@@ -696,15 +699,25 @@ foreach my $field (Bugzilla->get_fields({ obsolete => 0, buglist => 1 })) {
     $columns->{$id} = { 'name' => $name, 'title' => $field->description };
 }
 
-if ($format->{'extension'} eq 'html') {
-    $columns->{assigned_to_realname} = { name => "CASE WHEN map_assigned_to.realname = '' THEN map_assigned_to.login_name ELSE map_assigned_to.realname END AS assigned_to_realname", title => "Assignee" };
-    $columns->{reporter_realname} = { name => "CASE WHEN map_reporter.realname    = '' THEN map_reporter.login_name    ELSE map_reporter.realname    END AS reporter_realname", title => "Reporter" };
-    $columns->{qa_contact_realname} = { name => "CASE WHEN map_qa_contact.realname  = '' THEN map_qa_contact.login_name  ELSE map_qa_contact.realname  END AS qa_contact_realname", title => "QA Contact" };
-} else {
-    $columns->{assigned_to_realname} = { name => "map_assigned_to.realname AS assigned_to_realname", title => "Assignee" };
-    $columns->{reporter_realname} = { name => "map_reporter.realname AS reporter_realname", title => "Reporter" };
-    $columns->{qa_contact_realname} = { name => "map_qa_contact.realname AS qa_contact_realname", title => "QA Contact" };
+foreach my $col (qw(assigned_to reporter qa_contact)) {
+    my $colname = "${col}_realname";
+    if ($format->{'extension'} eq 'html') {
+        my $login = "map_${col}.login_name";
+        if (!Bugzilla->user->id) {
+            $login = $dbh->sql_string_until($login, $dbh->quote('@'));
+        }
+        $columns->{$colname}->{name} =
+            "CASE WHEN map_${col}.realname = '' 
+                  THEN $login ELSE map_${col}.realname 
+                   END AS $colname";
+    }
+    else {
+        $columns->{$colname}->{name} = "map_${col}.realname AS $colname";
+    }
 }
+$columns->{assigned_to_realname}->{title} = "Assignee";
+$columns->{reporter_realname}->{title} = "Reporter";
+$columns->{qa_contact_realname}->{title} = "QA Contact";
 
 Bugzilla::Hook::process("buglist-columns", {'columns' => $columns} );
 
index dad5dfb02b1602a3929d4e93ba03ee88ddc4feff..c0433639bf0c8932dc833891fc9cd64f006faa7f 100644 (file)
 # The Original Code are the Bugzilla Tests.
 # 
 # The Initial Developer of the Original Code is Zach Lipton
-# Portions created by Zach Lipton are 
-# Copyright (C) 2002 Zach Lipton.  All
-# Rights Reserved.
+# Portions created by Zach Lipton are Copyright (C) 2002 Zach Lipton.
+# All Rights Reserved.
 # 
 # Contributor(s): Zach Lipton <zach@zachlipton.com>
+#                 Max Kanat-Alexander <mkanat@bugzilla.org>
 
 
 #################
 
 use lib 't';
 use Support::Files;
+use Test::More tests => 16;
 
 BEGIN { 
-        use Test::More tests => 12;
-        use_ok(Bugzilla);
-        use_ok(Bugzilla::Util);
+    use_ok(Bugzilla);
+    use_ok(Bugzilla::Util);
 }
 
 # We need to override user preferences so we can get an expected value when
@@ -64,3 +64,17 @@ is(format_time("2002.11.24 00:05"), "2002-11-24 00:05 $tz",'format_time("2002.11
 is(format_time("2002.11.24 00:05:56"), "2002-11-24 00:05:56 $tz",'format_time("2002.11.24 00:05:56")');
 is(format_time("2002.11.24 00:05:56", "%Y-%m-%d %R"), '2002-11-24 00:05', 'format_time("2002.11.24 00:05:56", "%Y-%m-%d %R") (with no timezone)');
 is(format_time("2002.11.24 00:05:56", "%Y-%m-%d %R %Z"), "2002-11-24 00:05 $tz", 'format_time("2002.11.24 00:05:56", "%Y-%m-%d %R %Z") (with timezone)');
+
+# email_filter
+my %email_strings = (
+    'somebody@somewhere.com' => 'somebody',
+    'Somebody <somebody@somewhere.com>' => 'Somebody <somebody>',
+    'One Person <one@person.com>, Two Person <two@person.com>' 
+        => 'One Person <one>, Two Person <two>',
+    'This string contains somebody@somewhere.com and also this@that.com'
+        => 'This string contains somebody and also this',
+);
+foreach my $input (keys %email_strings) {
+    is(Bugzilla::Util::email_filter($input), $email_strings{$input}, 
+       "email_filter('$input')");
+}
index 054b684551c91dde8c075508972ef4363e5f3409..c93ea5808ffb94f26815ed3fc2bca2b18e0df44b 100644 (file)
                title="Go to the comment associated with the attachment">
               [%- attachment.attached FILTER time %]</a>,
 
-            <a href="mailto:[% attachment.attacher.email FILTER html %]"
-               title="Write an email to the creator of the attachment">
-              [% attachment.attacher.name || attachment.attacher.login FILTER html %]
-            </a>
+            [% INCLUDE global/user.html.tmpl who = attachment.attacher %]
           </span>
         </td>
 
index b676eb1c9d021e24925c53e2dcfddd55fc4e59f5..8e44230ae117d934331178d513addc5a4bd6662c 100644 (file)
@@ -61,7 +61,7 @@
     [% FOREACH operation = operations %]
       <tr>
         <td rowspan="[% operation.changes.size %]" valign="top">
-          [% operation.who FILTER html %]
+          [% operation.who FILTER email FILTER html %]
         </td>
         <td rowspan="[% operation.changes.size %]" valign="top">
           [% operation.when FILTER time %]
@@ -89,7 +89,7 @@
                          change.fieldname == 'dependson' %]
                   [% change.removed FILTER bug_list_link FILTER none %]
                 [% ELSE %]
-                  [% change.removed FILTER html %]
+                  [% change.removed FILTER email FILTER html %]
                 [% END %]
               [% ELSE %]
                 &nbsp;
                          change.fieldname == 'dependson' %]
                   [% change.added FILTER bug_list_link FILTER none %]
                 [% ELSE %]
-                  [% change.added FILTER html %]
+                  [% change.added FILTER email FILTER html %]
                 [% END %]
               [% ELSE %]
                 &nbsp;
index 1e8ee8c546ae14c552cc4c17ca0029d012435bce..3a30ca5b2868e30787cddd667026c5d1ab7cc0aa 100644 (file)
         </span>
 
         <span class="bz_comment_user">
-          <span class="vcard">
-            <a class="fn email" 
-               href="mailto:[% comment.author.email FILTER html %]">
-              [% (comment.author.name || comment.author.login) FILTER html %]</a>
-          </span>
+          [% INCLUDE global/user.html.tmpl who = comment.author %]
         </span>
 
         <span class="bz_comment_user_images">
 [% END %]
 <pre class="bz_comment_text" 
      [% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]>
-  [%- wrapped_comment FILTER quoteUrls(bug.bug_id, comment.already_wrapped) -%]
+  [%- wrapped_comment FILTER email 
+                      FILTER quoteUrls(bug.bug_id, comment.already_wrapped) -%]
 </pre>
     </div>
   [% END %]
index adabf8ea2f914acd000d4a601cd19405b72b8db6..347478bfcf96d58e83eea6d5b68580e5fcf7164b 100644 (file)
 
 [% BLOCK buginfo %]
   [% get_status(bug.bug_status) FILTER html -%] [%+ get_resolution(bug.resolution) FILTER html %];
-  [%-%] assigned to [% bug.assigned_to.login FILTER html %]
+  [%-%] assigned to [% bug.assigned_to.login FILTER email FILTER html %]
   [%-%][% "; Target: " _ bug.target_milestone IF bug.target_milestone %]
 [% END %]
 
index 50c7ea9d56a25e164ac9ff6d1de00ef43b3bd74e..bb80fc1ad468bd898d9be98b2af58e1f87bbb1a3 100644 (file)
         [% IF bug.check_can_change_field("assigned_to", 0, 1) %]
           <div id="bz_assignee_edit_container" class="bz_default_hidden">
             <span>
-              [% INCLUDE user_identity user=> bug.assigned_to %]
+              [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
               (<a href="#" id="bz_assignee_edit_action">edit</a>)
             </span>
           </div>
            initDefaultCheckbox('assignee');                  
           </script>
         [% ELSE %]
-          [% INCLUDE user_identity user => bug.assigned_to %]
+          [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
         [% END %]
       </td>
     </tr>
         <label for="qa_contact" accesskey="q"><b><u>Q</u>A Contact</b></label>:
       </td>
       <td>
-
         [% IF bug.check_can_change_field("qa_contact", 0, 1) %]
           [% IF bug.qa_contact != "" %]
            <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
             <span>
               <span id="bz_qa_contact_edit_display">
-              [% INCLUDE user_identity user=> bug.qa_contact %]</span>
+              [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]</span>
               (<a href="#" id="bz_qa_contact_edit_action">edit</a>)
             </span>
           </div>
             initDefaultCheckbox('qa_contact');
           </script>
         [% ELSE %]
-          [% INCLUDE user_identity user => bug.qa_contact %]
+          [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
         [% END %]
       </td>
     </tr>
       <b>Reported</b>:
     </td>
     <td>
-     [% bug.creation_ts FILTER time %] by [% INCLUDE user_identity user => bug.reporter %]
+     [% bug.creation_ts FILTER time %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %]
     </td>
   </tr>
   
 [%# Block for CC LIST                                                        #%]
 [%############################################################################%]
 [% BLOCK section_cclist %]
-  [% IF user.id %]
     <tr>
-        <td class="field_label">
-          <label for="newcc" accesskey="a"><b>CC List</b>:</label>
-        </td>
+      <td class="field_label">
+        <label for="newcc" accesskey="a"><b>CC List</b>:</label>
+      </td>
       <td>
         [% IF user.id %]
           [% IF NOT bug.cc || NOT bug.cc.contains(user.login) %]
           [% END %]
         [% END %]
         <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
-          (<a href="#" id="cc_edit_area_showhide">edit</a>)
+          (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>)
         </span>
         <div id="cc_edit_area">
-          <div>
+          <br>
+          [% IF user.id %]
             <div>
-              <label for="cc">
-                <b>Add</b>
-              </label>
+              <div><label for="cc"><b>Add</b></label></div>
+              [% INCLUDE global/userselect.html.tmpl
+                  id => "newcc"
+                  name => "newcc"
+                  size => 30
+                  multiple => 5
+                %]
             </div>
-            [% INCLUDE global/userselect.html.tmpl
-                id => "newcc"
-                name => "newcc"
-                size => 30
-                multiple => 5
-              %]
-          </div>
-        [% IF bug.cc %]
-          <select id="cc" name="cc" multiple="multiple" size="5">
-          [% FOREACH c = bug.cc %]
-            <option value="[% c FILTER html %]">[% c FILTER html %]</option>
           [% END %]
-          </select>
-          [% IF user.id %]
-            <br>
-            <input type="checkbox" id="removecc" name="removecc">
-            [%%]<label for="removecc">Remove selected CCs</label>
-            <br>
+          [% IF bug.cc %]
+            <select id="cc" name="cc" multiple="multiple" size="5">
+              [% FOREACH c = bug.cc %]
+                <option value="[% c FILTER email FILTER html %]">
+                  [% c FILTER email FILTER html %]</option>
+              [% END %]
+            </select>
+            [% IF user.id %]
+              <br>
+              <input type="checkbox" id="removecc" name="removecc">
+              [%%]<label for="removecc">Remove selected CCs</label>
+              <br>
+            [% END %]
           [% END %]
-        [% END %]
         </div>
         <script type="text/javascript">
           hideEditableField( 'cc_edit_area_showhide_container', 
         </script>
       </td>
     </tr>
-  [% END %]
 [% END %]
 
 [%############################################################################%]
   [% value = undef %]
   [% spellcheck = undef %]
 [% END %]
-
-[%############################################################################%]
-[%# Block for user identities. Wraps the information inside of an hCard.     #%]
-[%############################################################################%]
-
-[% BLOCK user_identity %]
-  <span class="vcard">
-    [% FILTER collapse %]
-      [% IF user.name %]
-        <a class="email" href="mailto:[% user.email FILTER html %]" 
-           title="[% user.email FILTER html %]"
-          ><span class="fn">[% user.name FILTER html %]</span
-        ></a>
-      [% ELSE %]
-        <a class="fn email" href="mailto:[% user.email FILTER html %]">
-          [% user.email FILTER html %]</a>
-      [% END %]
-    [% END %]</span>
-[% END %]
-
index 173d98e924bd44cb0bbd58c8e1c4479b9726b899..f1a5cc466014134b20e8c1e5c6c325f200c25e98 100644 (file)
       <th class="rightcell">[% field_descs.cc FILTER html %]:</th>
       <td>
         [% FOREACH c = bug.cc %]
-          [% c FILTER html %][% ", " IF not loop.last() %]
+          [% c FILTER email FILTER html %][% ", " IF not loop.last() %]
         [% END %]
     [% ELSIF name == "reporter" || name == "assigned_to" 
              || name == "qa_contact" %]
       <th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
-      <td>[% bug.${name}.identity FILTER html %]</td>
+      <td>[% bug.${name}.identity FILTER email FILTER html %]</td>
     [% ELSIF name == "flags" %]
         <th class="rightcell">Flags:</th>
         <td>
index 23874d989b1535498336b255fdced3f51b78bdf6..f6f3617a0b4bf7401d0d9d0914c56bc589402aa1 100644 (file)
 
 <bugzilla version="[% constants.BUGZILLA_VERSION %]"
           urlbase="[% urlbase FILTER xml %]"
+          [%# Note that the maintainer's email is not filtered, 
+            # intentionally. Even logged-out users should be able
+            # to see that, since it will be in error messages anyway. 
+          %]
           maintainer="[% Param('maintainer') FILTER xml %]"
 [% IF user.id %]
-          exporter="[% user.email FILTER xml %]"
+          exporter="[% user.email FILTER email FILTER xml %]"
 [% END %]
 >
 
@@ -58,9 +62,9 @@
           <flag name="[% type.name FILTER xml %]"
                 id="[% flag.id FILTER xml %]"
                 status="[% flag.status FILTER xml %]"
-                setter="[% flag.setter.login FILTER xml %]"
+                setter="[% flag.setter.login FILTER email FILTER xml %]"
           [% IF flag.requestee %]
-              requestee="[% flag.requestee.login FILTER xml %]"
+              requestee="[% flag.requestee.login FILTER email FILTER xml %]"
           [% END %]
           />
         [% END %]
         [% FOREACH c = bug.longdescs %]
           [% NEXT IF c.isprivate && !user.in_group(Param("insidergroup")) %]
           <long_desc isprivate="[% c.isprivate FILTER xml %]">
-            <who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER xml %]</who>
+            <who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER email FILTER xml %]</who>
             <bug_when>[% c.time FILTER time FILTER xml %]</bug_when>
             [% IF user.in_group(Param('timetrackinggroup')) && (c.work_time - 0 != 0) %]
               <work_time>[% PROCESS formattimeunit time_unit = c.work_time FILTER xml %]</work_time>
             [% END %]
-            <thetext>[% c.body FILTER xml %]</thetext>
+            <thetext>[% c.body FILTER email FILTER xml %]</thetext>
           </long_desc>
         [% END %]
       [% END %]
@@ -93,7 +97,7 @@
             <filename>[% a.filename FILTER xml %]</filename>
             <type>[% a.contenttype FILTER xml %]</type>
             <size>[% a.datasize FILTER xml %]</size>
-            <attacher>[% a.attacher.email FILTER xml %]</attacher>
+            <attacher>[% a.attacher.email FILTER email FILTER xml %]</attacher>
         [% IF displayfields.attachmentdata %]
             <data encoding="base64">[% a.data FILTER base64 %]</data>
         [% END %]        
               <flag name="[% flag.type.name FILTER xml %]"
                     id="[% flag.id FILTER xml %]"
                     status="[% flag.status FILTER xml %]"
-                    setter="[% flag.setter.email FILTER xml %]"
+                    setter="[% flag.setter.email FILTER email FILTER xml %]"
                     [% IF flag.status == "?" && flag.requestee %]
-                      requestee="[% flag.requestee.email FILTER xml %]"
+                      requestee="[% flag.requestee.email FILTER email FILTER xml %]"
                     [% END %]
                />
             [% END %]
     [% IF field == 'reporter' OR field == 'assigned_to' OR
           field == 'qa_contact' %]
       [% name = val.name %]
-      [% val = val.email %]
+      [% val = val.email FILTER email %]
+    [% ELSIF field == 'cc' %]
+        [% val = val FILTER email %]
     [% ELSIF field == 'creation_ts' OR field == 'delta_ts' %]
       [% val = val FILTER time %]
     [% END %]
-    <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>[% val FILTER xml %]</[% field %]>
+    <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>
+      [%- val FILTER xml %]</[% field %]>
   [% END %]
 [% END %]
index b93d1f3466b6cd70a36ec3fad154b92d6b29c57b..a599dc0fb9e3415c65eb866399a3d2753b83780b 100644 (file)
@@ -43,8 +43,9 @@
     [% total = total + voter.vote_count %]
     <tr>
       <td>
-        <a href="votes.cgi?action=show_user&amp;user=[% voter.login_name FILTER url_quote %]">
-          [% voter.login_name FILTER html %]
+          <a href="votes.cgi?action=show_user&amp;user_id=
+                  [%- voter.id FILTER url_quote %]">
+          [% voter.login_name FILTER email FILTER html %]
         </a>
       </td>
       <td align="right">
diff --git a/template/en/default/global/user.html.tmpl b/template/en/default/global/user.html.tmpl
new file mode 100644 (file)
index 0000000..df902b4
--- /dev/null
@@ -0,0 +1,39 @@
+[%# 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 Daniel Brooks.
+  # Portions created by the Initial Developer are Copyright (C) 2007
+  # the Initial Developer. All Rights Reserved.
+  #
+  # Contributor(s): 
+  #   Daniel Brooks <db48x@db48x.net>
+  #   Max Kanat-Alexander <mkanat@bugzilla.org>
+  #%]
+
+[%# INTERFACE:
+  # who: A Bugzilla::User object that we are going to represent.
+  #%]
+
+<span class="vcard">
+  [% FILTER collapse %]
+    [% IF user.id %]
+      <a class="email" href="mailto:[% who.email FILTER html %]"
+         title="[% who.identity FILTER html %]">
+    [%- END -%]
+    [% IF who.name %]
+       <span class="fn">[% who.name FILTER html %]</span>
+    [% ELSE %]
+      [% who.login FILTER email FILTER html %]
+    [% END %]
+    [% '</a>' IF user.id %]
+  [% END %]
+</span>
index 467e4dfc76854f8044693c78a9f5e867f3f552a9..4929c416d059e76cac4da4ccf0d3bec9bf32af4e 100644 (file)
           |
         [% END %]
 
-        [% IF bugowners %]
+        [% IF bugowners && user.id %]
           <a href="mailto:
             [% bugowners FILTER html %]">Send&nbsp;Mail&nbsp;to&nbsp;[% terms.Bug %]&nbsp;Assignees</a> |
         [% END %]
index 351c7d01b5e6679c34829538ff5742b401cff4b6..eb08a35ac2079fa08626cf6acdc856469b2811e1 100644 (file)
       <a name="[% comp.name FILTER html %]">[% comp.name FILTER html %]</a>
     </td>
     <td>
-      <a href="mailto:[% comp.default_assignee.email FILTER html %]">
-      [% comp.default_assignee.login FILTER html %]</a>
+      [% INCLUDE global/user.html.tmpl who = comp.default_assignee %]
     </td>
     [% IF Param("useqacontact") %]
       <td>
-        <a href="mailto:[% comp.default_qa_contact.email FILTER html %]">
-        [% comp.default_qa_contact.login FILTER html %]</a>
+        [% INCLUDE global/user.html.tmpl who = comp.default_qa_contact %]
       </td>
     [% END %]
   </tr>
index cf3774973d43608d45c756874f3d1d760a041a33..0f315cc023a8d43bcee9ceeb83aae771a32df12c 100644 (file)
 [% row_field_disp = field_descs.$row_field || row_field %]
 
 [% IF tbl_field %]
-  [% tbl_field_disp FILTER csv %]: [% tbl FILTER csv %]
+  [% IF tbl_field == 'assigned_to' OR tbl_field == 'reporter'
+        OR tbl_field == 'qa_contact'
+  %]
+    [% tbl_disp = tbl FILTER email %]
+  [% ELSE %]
+    [% tbl_disp = tbl %]
+  [% END %]
+  [% tbl_field_disp FILTER csv %]: [% tbl_disp FILTER csv %]
 [% END %]
 [% IF row_field %]
   [% row_field_disp FILTER csv %]
 [% IF col_field -%]
   [% FOREACH col = col_names -%]
     [% colsepchar %]
-    [% IF col_field == 'bug_status' %]
-      [% get_status(col) FILTER csv -%]
-    [% ELSIF col_field == 'resolution' %]
-      [% get_resolution(col) FILTER csv -%]
-    [% ELSE %]
-      [% col FILTER csv -%]
-    [% END %]
+    [% PROCESS value_display value = col field = col_field %]
   [% END -%]
 [% ELSE -%]
   [% colsepchar %][% num_bugs FILTER csv %]
 [% END %]
 
 [% FOREACH row = row_names %]
-  [% IF row_field == 'bug_status' %]
-    [% get_status(row) FILTER csv -%]
-  [% ELSIF row_field == 'resolution' %]
-    [% get_resolution(row) FILTER csv -%]
-  [% ELSE %]
-    [% row FILTER csv -%]
-  [% END %]
+  [% PROCESS value_display value = row field = row_field %]
   [% FOREACH col = col_names %]
     [% colsepchar %]
     [% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %]
   [% END %]
 
 [% END %]
+
+[% BLOCK value_display %]
+  [% SET disp_value = value %]
+  [% IF field == 'bug_status' %]
+    [% SET disp_value = get_status(value) %]
+  [% ELSIF field == 'resolution' %]
+    [% SET disp_value = get_resolution(value) %]
+  [% ELSIF field == 'assigned_to' OR field == 'reporter'
+           OR field == 'qa_contact'
+  %]
+    [% disp_value = value FILTER email %]
+  [% END %]
+  [% disp_value FILTER csv %]
+[% END %]
index 0ebe631d1fee8585a0683f69c29163f0f1974e76..6c5d6ede2fa8e4969cfe659192109688930ccbad 100644 (file)
@@ -44,7 +44,7 @@
 [% END %]
 
 [% IF tbl_field %]
-  <h2>[% tbl_disp FILTER html %]</h2>
+  <h2>[% tbl_disp FILTER email FILTER html %]</h2>
 [% END %]
 
 <table>
         
         [% col_idx = 1 - col_idx %]
         <td class="[% classes.$row_idx.$col_idx %]">
-          [% IF col_field == 'bug_status' %]
-            [% get_status(col) FILTER html FILTER replace('^ $','&nbsp;') %]
-          [% ELSIF col_field == 'resolution' %]
-            [% get_resolution(col) FILTER html FILTER replace('^ $','&nbsp;') %]
-          [% ELSE %]
-            [% col FILTER html FILTER replace('^ $','&nbsp;') %]
-          [% END %]
+          [% PROCESS value_display value = col field = col_field %]
         </td>
       [% END %]
       <td class="ttotal">
     [% row_idx = 1 - row_idx %]
     <tr>
       <td class="[% classes.$row_idx.$col_idx %]" align="right">
-        [% IF row_field == 'bug_status' %]
-          [% get_status(row) FILTER html FILTER replace('^ $','&nbsp;') %]
-        [% ELSIF row_field == 'resolution' %]
-          [% get_resolution(row) FILTER html FILTER replace('^ $','&nbsp;') %]
-        [% ELSE %]
-          [% row FILTER html FILTER replace('^ $','&nbsp;') %]
-        [% END %]
+        [% PROCESS value_display value = row field = row_field %]
       </td>
       [% FOREACH col = col_names %]
         [% row_total = row_total + data.$tbl.$col.$row %]
       
     </td>
   </tr>
-</table>    
+</table>
+
+[% BLOCK value_display %]
+  [% SET disp_value = value %]
+  [% IF field == 'bug_status' %]
+    [% SET disp_value = get_status(value) %]
+  [% ELSIF field == 'resolution' %]
+    [% SET disp_value = get_resolution(value) %]
+  [% ELSIF field == 'assigned_to' OR field == 'reporter'
+           OR field == 'qa_contact'
+  %]
+    [% disp_value = value FILTER email %]
+  [% END %]
+  [% disp_value FILTER html FILTER replace('^ $','&nbsp;') %]
+[% END %] 
index 37af0b3006c0e9ad453c24a61f12f5eee2fbd848..4f7ee49b61a5de3834edc9cf11371456f412de0e 100644 (file)
@@ -96,7 +96,7 @@
       [% PROCESS "reports/report-table.html.tmpl" %]
     [% ELSE %]
       [% IF tbl %]
-        <h2>[% tbl_disp FILTER html %]</h2>
+        <h2>[% tbl_disp FILTER email FILTER html %]</h2>
       [% END %]
       
       [% imageurl = BLOCK %]report.cgi?[% imagebase FILTER html %]&amp;format=
index af911b2efaf9f9377a5930ba64ba3704e849dad0..8dd0f0400eb9a0a23cb233068acea0f7e5d7eaa5 100644 (file)
@@ -157,7 +157,8 @@ to some group are shown by default.
 [% PROCESS global/footer.html.tmpl %]
 
 [% BLOCK start_new_table %]
-  <h3>[% column_headers.$group_field %]: [% (request.$group_field || "None") FILTER html %]</h3>
+  <h3>[% column_headers.$group_field %]: 
+    [%+ (request.$group_field || "None") FILTER email FILTER html %]</h3>
   <table class="requests" cellspacing="0" cellpadding="4" border="1">
     <tr>
       [% FOREACH column = display_columns %]
@@ -190,11 +191,11 @@ to some group are shown by default.
 [% END %]
 
 [% BLOCK display_requestee %]
-  [% request.requestee FILTER html %]
+  [% request.requestee FILTER email FILTER html %]
 [% END %]
 
 [% BLOCK display_requester %]
-  [% request.requester FILTER html %]
+  [% request.requester FILTER email FILTER html %]
 [% END %]
 
 [% BLOCK display_created %]
index af41af0e48111f0a72ee49740d0740871221d46c..3e33d8fa9a4253157cff7465581634953b0130f0 100755 (executable)
--- a/votes.cgi
+++ b/votes.cgi
@@ -52,7 +52,7 @@ my $bug_id = $cgi->param('bug_id');
 my $action = $cgi->param('action') || ($bug_id ? "show_bug" : "show_user");
 
 if ($action eq "show_bug" ||
-    ($action eq "show_user" && defined $cgi->param('user')))
+    ($action eq "show_user" && defined $cgi->param('user_id')))
 {
     Bugzilla->login();
 }
@@ -103,7 +103,9 @@ sub show_bug {
 
     $vars->{'bug_id'} = $bug_id;
     $vars->{'users'} =
-        $dbh->selectall_arrayref('SELECT profiles.login_name, votes.vote_count 
+        $dbh->selectall_arrayref('SELECT profiles.login_name,
+                                         profiles.userid AS id,
+                                         votes.vote_count
                                     FROM votes
                               INNER JOIN profiles 
                                       ON profiles.userid = votes.who
@@ -127,11 +129,11 @@ sub show_user {
     # If a bug_id is given, and we're editing, we'll add it to the votes list.
     $bug_id ||= "";
 
-    my $name = $cgi->param('user') || $user->login;
-    my $who = login_to_id($name, THROW_ERROR);
-    my $userid = $user->id;
+    my $who_id = $cgi->param('user_id') || $user->id;
+    my $who = Bugzilla::User->check({ id => $who_id });
 
-    my $canedit = (Bugzilla->params->{'usevotes'} && $userid == $who) ? 1 : 0;
+    my $canedit = (Bugzilla->params->{'usevotes'} && $user->id == $who->id) 
+                  ? 1 : 0;
 
     $dbh->bz_start_transaction();
 
@@ -140,10 +142,10 @@ sub show_user {
         # in the vote table, just so that things display right.
         my $has_votes = $dbh->selectrow_array('SELECT vote_count FROM votes 
                                                WHERE bug_id = ? AND who = ?',
-                                               undef, ($bug_id, $who));
+                                               undef, ($bug_id, $who->id));
         if (!$has_votes) {
             $dbh->do('INSERT INTO votes (who, bug_id, vote_count) 
-                      VALUES (?, ?, 0)', undef, ($who, $bug_id));
+                      VALUES (?, ?, 0)', undef, ($who->id, $bug_id));
         }
     }
 
@@ -168,7 +170,7 @@ sub show_user {
                                        WHERE votes.who = ?
                                          AND bugs.product_id = ?
                                     ORDER BY votes.bug_id',
-                                      undef, ($who, $product->id));
+                                      undef, ($who->id, $product->id));
 
         foreach (@$vote_list) {
             my ($id, $count, $summary) = @$_;
@@ -206,7 +208,7 @@ sub show_user {
     $dbh->bz_commit_transaction();
 
     $vars->{'canedit'} = $canedit;
-    $vars->{'voting_user'} = { "login" => $name };
+    $vars->{'voting_user'} = { "login" => $who->name };
     $vars->{'products'} = \@products;
     $vars->{'bug_id'} = $bug_id;
     $vars->{'all_bug_ids'} = \@all_bug_ids;