<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[174765] trunk/Websites/bugs.webkit.org</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/174765">174765</a></dd>
<dt>Author</dt> <dd>ddkilzer@apple.com</dd>
<dt>Date</dt> <dd>2014-10-16 09:01:12 -0700 (Thu, 16 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Upgrade to Bugzilla 4.2.7.

Conflicts:
    buglist.cgi
    report.cgi</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesbugswebkitorghtaccess">trunk/Websites/bugs.webkit.org/.htaccess</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaAttachmentPatchReaderpm">trunk/Websites/bugs.webkit.org/Bugzilla/Attachment/PatchReader.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaAttachmentpm">trunk/Websites/bugs.webkit.org/Bugzilla/Attachment.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaAuthLoginCookiepm">trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Login/Cookie.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaAuthVerifyLDAPpm">trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Verify/LDAP.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaBugpm">trunk/Websites/bugs.webkit.org/Bugzilla/Bug.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaCGIpm">trunk/Websites/bugs.webkit.org/Bugzilla/CGI.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaConfigMTApm">trunk/Websites/bugs.webkit.org/Bugzilla/Config/MTA.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaConstantspm">trunk/Websites/bugs.webkit.org/Bugzilla/Constants.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBMysqlpm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Mysql.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBOraclepm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Oracle.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBPgpm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Pg.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBSchemaOraclepm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Oracle.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBSchemaPgpm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Pg.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBSchemapm">trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaDBpm">trunk/Websites/bugs.webkit.org/Bugzilla/DB.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaFieldChoiceInterfacepm">trunk/Websites/bugs.webkit.org/Bugzilla/Field/ChoiceInterface.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaFieldpm">trunk/Websites/bugs.webkit.org/Bugzilla/Field.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaFlagTypepm">trunk/Websites/bugs.webkit.org/Bugzilla/FlagType.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaGrouppm">trunk/Websites/bugs.webkit.org/Bugzilla/Group.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaHookpm">trunk/Websites/bugs.webkit.org/Bugzilla/Hook.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaInstallDBpm">trunk/Websites/bugs.webkit.org/Bugzilla/Install/DB.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaInstallRequirementspm">trunk/Websites/bugs.webkit.org/Bugzilla/Install/Requirements.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaMailerpm">trunk/Websites/bugs.webkit.org/Bugzilla/Mailer.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaObjectpm">trunk/Websites/bugs.webkit.org/Bugzilla/Object.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaSearchClausepm">trunk/Websites/bugs.webkit.org/Bugzilla/Search/Clause.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaSearchConditionpm">trunk/Websites/bugs.webkit.org/Bugzilla/Search/Condition.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaSearchQuicksearchpm">trunk/Websites/bugs.webkit.org/Bugzilla/Search/Quicksearch.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaSearchSavedpm">trunk/Websites/bugs.webkit.org/Bugzilla/Search/Saved.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaSearchpm">trunk/Websites/bugs.webkit.org/Bugzilla/Search.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaTemplatepm">trunk/Websites/bugs.webkit.org/Bugzilla/Template.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaTokenpm">trunk/Websites/bugs.webkit.org/Bugzilla/Token.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaUserSettingpm">trunk/Websites/bugs.webkit.org/Bugzilla/User/Setting.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaUserpm">trunk/Websites/bugs.webkit.org/Bugzilla/User.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceBugpm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Bug.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceConstantspm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Constants.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceServerXMLRPCpm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server/XMLRPC.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceServerpm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceUserpm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/User.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillaWebServiceUtilpm">trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Util.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgBugzillapm">trunk/Websites/bugs.webkit.org/Bugzilla.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgattachmentcgi">trunk/Websites/bugs.webkit.org/attachment.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgbuglistcgi">trunk/Websites/bugs.webkit.org/buglist.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgcontribbz_webservice_demopl">trunk/Websites/bugs.webkit.org/contrib/bz_webservice_demo.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgcontribconvertworkflowpl">trunk/Websites/bugs.webkit.org/contrib/convert-workflow.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmlBugzillaGuidexml">trunk/Websites/bugs.webkit.org/docs/en/xml/Bugzilla-Guide.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmladministrationxml">trunk/Websites/bugs.webkit.org/docs/en/xml/administration.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmlcustomizationxml">trunk/Websites/bugs.webkit.org/docs/en/xml/customization.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmlinstallationxml">trunk/Websites/bugs.webkit.org/docs/en/xml/installation.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmlmodulesxml">trunk/Websites/bugs.webkit.org/docs/en/xml/modules.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgdocsenxmlusingxml">trunk/Websites/bugs.webkit.org/docs/en/xml/using.xml</a></li>
<li><a href="#trunkWebsitesbugswebkitorgeditflagtypescgi">trunk/Websites/bugs.webkit.org/editflagtypes.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgemail_inpl">trunk/Websites/bugs.webkit.org/email_in.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgenter_bugcgi">trunk/Websites/bugs.webkit.org/enter_bug.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgextensionsExampleExtensionpm">trunk/Websites/bugs.webkit.org/extensions/Example/Extension.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgextensionsOldBugMoveExtensionpm">trunk/Websites/bugs.webkit.org/extensions/OldBugMove/Extension.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgextensionsVotingExtensionpm">trunk/Websites/bugs.webkit.org/extensions/Voting/Extension.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgimportxmlpl">trunk/Websites/bugs.webkit.org/importxml.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgjobqueuepl">trunk/Websites/bugs.webkit.org/jobqueue.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgjscustomsearchjs">trunk/Websites/bugs.webkit.org/js/custom-search.js</a></li>
<li><a href="#trunkWebsitesbugswebkitorgjsfieldjs">trunk/Websites/bugs.webkit.org/js/field.js</a></li>
<li><a href="#trunkWebsitesbugswebkitorgjsyuiswfstoreswfstoreswf">trunk/Websites/bugs.webkit.org/js/yui/swfstore/swfstore.swf</a></li>
<li><a href="#trunkWebsitesbugswebkitorgprocess_bugcgi">trunk/Websites/bugs.webkit.org/process_bug.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgquerycgi">trunk/Websites/bugs.webkit.org/query.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgreportcgi">trunk/Websites/bugs.webkit.org/report.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgshow_bugcgi">trunk/Websites/bugs.webkit.org/show_bug.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgshowdependencygraphcgi">trunk/Websites/bugs.webkit.org/showdependencygraph.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgskinscontribDuskglobalcss">trunk/Websites/bugs.webkit.org/skins/contrib/Dusk/global.css</a></li>
<li><a href="#trunkWebsitesbugswebkitorgskinsstandardglobalcss">trunk/Websites/bugs.webkit.org/skins/standard/global.css</a></li>
<li><a href="#trunkWebsitesbugswebkitorgskinsstandardshow_bugcss">trunk/Websites/bugs.webkit.org/skins/standard/show_bug.css</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultaccountauthloginsmallhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login-small.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultaccountauthloginhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultadminflagtypeedithtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/admin/flag-type/edit.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultadminparamseditparamshtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/admin/params/editparams.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugcommentshtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/comments.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugcreatecreatehtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/create/create.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugdependencytreehtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/dependency-tree.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugedithtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/edit.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugfieldeventsjstmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/field-events.js.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbugfieldhelpnonetmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/field-help.none.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultbuglinkhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/bug/link.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultemailbugmailhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/email/bugmail.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultfilterexceptionspl">trunk/Websites/bugs.webkit.org/template/en/default/filterexceptions.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultglobalcodeerrorhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/global/code-error.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultglobalconfirmusermatchhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/global/confirm-user-match.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultglobalfielddescsnonetmpl">trunk/Websites/bugs.webkit.org/template/en/default/global/field-descs.none.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultglobalheaderhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/global/header.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultglobalusererrorhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/global/user-error.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultlistserverpushhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/list/server-push.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultlisttablehtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/list/table.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultpagesreleasenoteshtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/pages/release-notes.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultreportsreporttablehtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/reports/report-table.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultreportsreporthtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/reports/report.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultsearchformhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/search/form.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultsearchknobhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/search/knob.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultsearchsearchadvancedhtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/search/search-advanced.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultsearchsearchreportselecthtmltmpl">trunk/Websites/bugs.webkit.org/template/en/default/search/search-report-select.html.tmpl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtemplateendefaultsetupstringstxtpl">trunk/Websites/bugs.webkit.org/template/en/default/setup/strings.txt.pl</a></li>
<li><a href="#trunkWebsitesbugswebkitorgtokencgi">trunk/Websites/bugs.webkit.org/token.cgi</a></li>
<li><a href="#trunkWebsitesbugswebkitorgxtlibBugzillaTestSearchConstantspm">trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/Constants.pm</a></li>
<li><a href="#trunkWebsitesbugswebkitorgxtlibBugzillaTestSearchFieldTestpm">trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/FieldTest.pm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkWebsitesbugswebkitorgextensionsVotingConfigpm">trunk/Websites/bugs.webkit.org/extensions/Voting/Config.pm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesbugswebkitorghtaccess"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/.htaccess (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/.htaccess        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/.htaccess        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> # Don't allow people to retrieve non-cgi executable files or our private data
</span><del>-&lt;FilesMatch ^(.*\.pm|.*\.pl|.*localconfig.*)$&gt;
</del><ins>+&lt;FilesMatch (\.pm|\.pl|\.tmpl|localconfig.*)$&gt;
</ins><span class="cx">   deny from all
</span><span class="cx"> &lt;/FilesMatch&gt;
</span><span class="cx"> &lt;FilesMatch ^(localconfig.js|localconfig.rdf)$&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaAttachmentPatchReaderpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Attachment/PatchReader.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Attachment/PatchReader.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Attachment/PatchReader.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -37,7 +37,6 @@
</span><span class="cx">         $last_reader-&gt;sends_data_to(new PatchReader::DiffPrinter::raw());
</span><span class="cx">         # Actually print out the patch.
</span><span class="cx">         print $cgi-&gt;header(-type =&gt; 'text/plain',
</span><del>-                           -x_content_type_options =&gt; &quot;nosniff&quot;,
</del><span class="cx">                            -expires =&gt; '+3M');
</span><span class="cx">         disable_utf8();
</span><span class="cx">         $reader-&gt;iterate_string('Attachment ' . $attachment-&gt;id, $attachment-&gt;data);
</span><span class="lines">@@ -119,7 +118,6 @@
</span><span class="cx">         $last_reader-&gt;sends_data_to(new PatchReader::DiffPrinter::raw());
</span><span class="cx">         # Actually print out the patch.
</span><span class="cx">         print $cgi-&gt;header(-type =&gt; 'text/plain',
</span><del>-                           -x_content_type_options =&gt; &quot;nosniff&quot;,
</del><span class="cx">                            -expires =&gt; '+3M');
</span><span class="cx">         disable_utf8();
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaAttachmentpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Attachment.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Attachment.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Attachment.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -723,11 +723,8 @@
</span><span class="cx">         $attachment-&gt;validate_can_edit($bug-&gt;product_id)
</span><span class="cx">           || ThrowUserError('illegal_attachment_edit', { attach_id =&gt; $attachment-&gt;id });
</span><span class="cx"> 
</span><del>-        $vars-&gt;{'description'} = $attachment-&gt;description;
-
</del><span class="cx">         if ($attachment-&gt;bug_id != $bug-&gt;bug_id) {
</span><span class="cx">             $vars-&gt;{'my_bug_id'} = $bug-&gt;bug_id;
</span><del>-            $vars-&gt;{'attach_bug_id'} = $attachment-&gt;bug_id;
</del><span class="cx">             ThrowCodeError('mismatched_bug_ids_on_obsolete', $vars);
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaAuthLoginCookiepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Login/Cookie.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Login/Cookie.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Login/Cookie.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -60,8 +60,8 @@
</span><span class="cx">         trick_taint($login_cookie);
</span><span class="cx">         detaint_natural($user_id);
</span><span class="cx"> 
</span><del>-        my $is_valid =
-          $dbh-&gt;selectrow_array('SELECT 1
</del><ins>+        my $db_cookie =
+          $dbh-&gt;selectrow_array('SELECT cookie
</ins><span class="cx">                                    FROM logincookies
</span><span class="cx">                                   WHERE cookie = ?
</span><span class="cx">                                         AND userid = ?
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">                                  undef, ($login_cookie, $user_id, $ip_addr));
</span><span class="cx"> 
</span><span class="cx">         # If the cookie is valid, return a valid username.
</span><del>-        if ($is_valid) {
</del><ins>+        if (defined $db_cookie &amp;&amp; $login_cookie eq $db_cookie) {
</ins><span class="cx">             # If we logged in successfully, then update the lastused 
</span><span class="cx">             # time on the login cookie
</span><span class="cx">             $dbh-&gt;do(&quot;UPDATE logincookies SET lastused = NOW() 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaAuthVerifyLDAPpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Verify/LDAP.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Verify/LDAP.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Auth/Verify/LDAP.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> use Bugzilla::Util;
</span><span class="cx"> 
</span><span class="cx"> use Net::LDAP;
</span><ins>+use Net::LDAP::Util qw(escape_filter_value);
</ins><span class="cx"> 
</span><span class="cx"> use constant admin_can_create_account =&gt; 0;
</span><span class="cx"> use constant user_can_create_account  =&gt; 0;
</span><span class="lines">@@ -144,6 +145,7 @@
</span><span class="cx"> 
</span><span class="cx"> sub _bz_search_params {
</span><span class="cx">     my ($username) = @_;
</span><ins>+    $username = escape_filter_value($username);
</ins><span class="cx">     return (base   =&gt; Bugzilla-&gt;params-&gt;{&quot;LDAPBaseDN&quot;},
</span><span class="cx">             scope  =&gt; &quot;sub&quot;,
</span><span class="cx">             filter =&gt; '(&amp;(' . Bugzilla-&gt;params-&gt;{&quot;LDAPuidattribute&quot;} 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaBugpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Bug.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Bug.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Bug.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -523,17 +523,14 @@
</span><span class="cx">     if ($dbh-&gt;FULLTEXT_OR) {
</span><span class="cx">         my $joined_terms = join($dbh-&gt;FULLTEXT_OR, @words);
</span><span class="cx">         ($where_sql, $relevance_sql) = 
</span><del>-            $dbh-&gt;sql_fulltext_search('bugs_fulltext.short_desc', 
-                                      $joined_terms, 1);
</del><ins>+            $dbh-&gt;sql_fulltext_search('bugs_fulltext.short_desc', $joined_terms);
</ins><span class="cx">         $relevance_sql ||= $where_sql;
</span><span class="cx">     }
</span><span class="cx">     else {
</span><span class="cx">         my (@where, @relevance);
</span><del>-        my $count = 0;
</del><span class="cx">         foreach my $word (@words) {
</span><del>-            $count++;
</del><span class="cx">             my ($term, $rel_term) = $dbh-&gt;sql_fulltext_search(
</span><del>-                'bugs_fulltext.short_desc', $word, $count);
</del><ins>+                'bugs_fulltext.short_desc', $word);
</ins><span class="cx">             push(@where, $term);
</span><span class="cx">             push(@relevance, $rel_term || $term);
</span><span class="cx">         }
</span><span class="lines">@@ -733,6 +730,17 @@
</span><span class="cx">     my $class  = shift;
</span><span class="cx">     my $params = $class-&gt;SUPER::run_create_validators(@_);
</span><span class="cx"> 
</span><ins>+    # Add classification for checking mandatory fields which depend on it
+    $params-&gt;{classification} = $params-&gt;{product}-&gt;classification-&gt;name;
+
+    my @mandatory_fields = @{ Bugzilla-&gt;fields({ is_mandatory =&gt; 1,
+                                                 enter_bug    =&gt; 1,
+                                                 obsolete     =&gt; 0 }) };
+    foreach my $field (@mandatory_fields) {
+        $class-&gt;_check_field_is_mandatory($params-&gt;{$field-&gt;name}, $field,
+                                          $params);
+    }
+
</ins><span class="cx">     my $product = delete $params-&gt;{product};
</span><span class="cx">     $params-&gt;{product_id} = $product-&gt;id;
</span><span class="cx">     my $component = delete $params-&gt;{component};
</span><span class="lines">@@ -757,18 +765,11 @@
</span><span class="cx">     delete $params-&gt;{resolution};
</span><span class="cx">     delete $params-&gt;{lastdiffed};
</span><span class="cx">     delete $params-&gt;{bug_id};
</span><ins>+    delete $params-&gt;{classification};
</ins><span class="cx"> 
</span><span class="cx">     Bugzilla::Hook::process('bug_end_of_create_validators',
</span><span class="cx">                             { params =&gt; $params });
</span><span class="cx"> 
</span><del>-    my @mandatory_fields = @{ Bugzilla-&gt;fields({ is_mandatory =&gt; 1,
-                                                 enter_bug    =&gt; 1,
-                                                 obsolete     =&gt; 0 }) };
-    foreach my $field (@mandatory_fields) {
-        $class-&gt;_check_field_is_mandatory($params-&gt;{$field-&gt;name}, $field,
-                                          $params);
-    }
-
</del><span class="cx">     return $params;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1371,7 +1372,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     # Check if a comment is required for this change.
</span><del>-    if ($new_status-&gt;comment_required_on_change_from($old_status) &amp;&amp; !$comment)
</del><ins>+    if ($new_status-&gt;comment_required_on_change_from($old_status) &amp;&amp; !$comment-&gt;{'thetext'})
</ins><span class="cx">     {
</span><span class="cx">         ThrowUserError('comment_required', { old =&gt; $old_status,
</span><span class="cx">                                              new =&gt; $new_status });
</span><span class="lines">@@ -1465,8 +1466,12 @@
</span><span class="cx">     $name || ThrowUserError(&quot;require_component&quot;);
</span><span class="cx">     my $product = blessed($invocant) ? $invocant-&gt;product_obj 
</span><span class="cx">                                      : $params-&gt;{product};
</span><del>-    my $obj = Bugzilla::Component-&gt;check({ product =&gt; $product, name =&gt; $name });
-    return $obj;
</del><ins>+    my $old_comp = blessed($invocant) ? $invocant-&gt;component : '';
+    my $object = Bugzilla::Component-&gt;check({ product =&gt; $product, name =&gt; $name });
+    if ($object-&gt;name ne $old_comp &amp;&amp; !$object-&gt;is_active) {
+        ThrowUserError('value_inactive', { class =&gt; ref($object), value =&gt; $name });
+    }
+    return $object;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub _check_creation_ts {
</span><span class="lines">@@ -1908,10 +1913,14 @@
</span><span class="cx">     my ($invocant, $target, undef, $params) = @_;
</span><span class="cx">     my $product = blessed($invocant) ? $invocant-&gt;product_obj 
</span><span class="cx">                                      : $params-&gt;{product};
</span><ins>+    my $old_target = blessed($invocant) ? $invocant-&gt;target_milestone : '';
</ins><span class="cx">     $target = trim($target);
</span><span class="cx">     $target = $product-&gt;default_milestone if !defined $target;
</span><span class="cx">     my $object = Bugzilla::Milestone-&gt;check(
</span><span class="cx">         { product =&gt; $product, name =&gt; $target });
</span><ins>+    if ($old_target &amp;&amp; $object-&gt;name ne $old_target &amp;&amp; !$object-&gt;is_active) {
+        ThrowUserError('value_inactive', { class =&gt; ref($object),  value =&gt; $target });
+    }
</ins><span class="cx">     return $object-&gt;name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1934,8 +1943,11 @@
</span><span class="cx">     $version = trim($version);
</span><span class="cx">     my $product = blessed($invocant) ? $invocant-&gt;product_obj 
</span><span class="cx">                                      : $params-&gt;{product};
</span><del>-    my $object = 
-        Bugzilla::Version-&gt;check({ product =&gt; $product, name =&gt; $version });
</del><ins>+    my $old_vers = blessed($invocant) ? $invocant-&gt;version : '';
+    my $object = Bugzilla::Version-&gt;check({ product =&gt; $product, name =&gt; $version });
+    if ($object-&gt;name ne $old_vers &amp;&amp; !$object-&gt;is_active) {
+        ThrowUserError('value_inactive', { class =&gt; ref($object), value =&gt; $version });
+    }
</ins><span class="cx">     return $object-&gt;name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1953,6 +1965,12 @@
</span><span class="cx"> 
</span><span class="cx">     return if !$field-&gt;is_visible_on_bug($params || $invocant);
</span><span class="cx"> 
</span><ins>+    return if ($field-&gt;type == FIELD_TYPE_SINGLE_SELECT
+                 &amp;&amp; scalar @{ get_legal_field_values($field-&gt;name) } == 1);
+
+    return if ($field-&gt;type == FIELD_TYPE_MULTI_SELECT
+                 &amp;&amp; !scalar @{ get_legal_field_values($field-&gt;name) });
+
</ins><span class="cx">     if (ref($value) eq 'ARRAY') {
</span><span class="cx">         $value = join('', @$value);
</span><span class="cx">     }
</span><span class="lines">@@ -2464,9 +2482,9 @@
</span><span class="cx">                 milestone =&gt; $milestone_ok ? $self-&gt;target_milestone
</span><span class="cx">                                            : $product-&gt;default_milestone
</span><span class="cx">             };
</span><del>-            $vars{components} = [map { $_-&gt;name } @{$product-&gt;components}];
-            $vars{milestones} = [map { $_-&gt;name } @{$product-&gt;milestones}];
-            $vars{versions}   = [map { $_-&gt;name } @{$product-&gt;versions}];
</del><ins>+            $vars{components} = [map { $_-&gt;name } grep($_-&gt;is_active, @{$product-&gt;components})];
+            $vars{milestones} = [map { $_-&gt;name } grep($_-&gt;is_active, @{$product-&gt;milestones})];
+            $vars{versions}   = [map { $_-&gt;name } grep($_-&gt;is_active, @{$product-&gt;versions})];
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!$verified) {
</span><span class="lines">@@ -2872,7 +2890,8 @@
</span><span class="cx">         # ref bug id for sending changes email.
</span><span class="cx">         my $ref_bug = delete $field_values-&gt;{ref_bug};
</span><span class="cx">         if ($class-&gt;isa('Bugzilla::BugUrl::Bugzilla::Local')
</span><del>-            and !$skip_recursion)
</del><ins>+            and !$skip_recursion
+            and $ref_bug-&gt;check_can_change_field('see_also', '', $self-&gt;id, \$privs))
</ins><span class="cx">         {
</span><span class="cx">             $ref_bug-&gt;add_see_also($self-&gt;id, 'skip_recursion');
</span><span class="cx">             push @{ $self-&gt;{_update_ref_bugs} }, $ref_bug;
</span><span class="lines">@@ -2904,12 +2923,15 @@
</span><span class="cx">     # we need to notify changes for that bug too.
</span><span class="cx">     $removed_bug_url = $removed_bug_url-&gt;[0];
</span><span class="cx">     if (!$skip_recursion and $removed_bug_url
</span><del>-        and $removed_bug_url-&gt;isa('Bugzilla::BugUrl::Bugzilla::Local'))
</del><ins>+        and $removed_bug_url-&gt;isa('Bugzilla::BugUrl::Bugzilla::Local')
+        and $removed_bug_url-&gt;ref_bug_url)
</ins><span class="cx">     {
</span><span class="cx">         my $ref_bug
</span><span class="cx">             = Bugzilla::Bug-&gt;check($removed_bug_url-&gt;ref_bug_url-&gt;bug_id);
</span><span class="cx"> 
</span><del>-        if (Bugzilla-&gt;user-&gt;can_edit_product($ref_bug-&gt;product_id)) {
</del><ins>+        if (Bugzilla-&gt;user-&gt;can_edit_product($ref_bug-&gt;product_id)
+            and $ref_bug-&gt;check_can_change_field('see_also', $self-&gt;id, '', \$privs))
+        {
</ins><span class="cx">             my $self_url = $removed_bug_url-&gt;local_uri($self-&gt;id);
</span><span class="cx">             $ref_bug-&gt;remove_see_also($self_url, 'skip_recursion');
</span><span class="cx">             push @{ $self-&gt;{_update_ref_bugs} }, $ref_bug;
</span><span class="lines">@@ -3632,9 +3654,13 @@
</span><span class="cx"> # Subroutines
</span><span class="cx"> #####################################################################
</span><span class="cx"> 
</span><del>-# Represents which fields from the bugs table are handled by process_bug.cgi.
</del><ins>+# Returns a list of currently active and editable bug fields,
+# including multi-select fields.
</ins><span class="cx"> sub editable_bug_fields {
</span><span class="cx">     my @fields = Bugzilla-&gt;dbh-&gt;bz_table_columns('bugs');
</span><ins>+    # Add multi-select fields
+    push(@fields, map { $_-&gt;name } @{Bugzilla-&gt;fields({obsolete =&gt; 0,
+                                                       type =&gt; FIELD_TYPE_MULTI_SELECT})});
</ins><span class="cx">     # Obsolete custom fields are not editable.
</span><span class="cx">     my @obsolete_fields = @{ Bugzilla-&gt;fields({obsolete =&gt; 1, custom =&gt; 1}) };
</span><span class="cx">     @obsolete_fields = map { $_-&gt;name } @obsolete_fields;
</span><span class="lines">@@ -3642,7 +3668,7 @@
</span><span class="cx">                         &quot;lastdiffed&quot;, @obsolete_fields) 
</span><span class="cx">     {
</span><span class="cx">         my $location = firstidx { $_ eq $remove } @fields;
</span><del>-        # Custom multi-select fields are not stored in the bugs table.
</del><ins>+        # Ensure field exists before attempting to remove it.
</ins><span class="cx">         splice(@fields, $location, 1) if ($location &gt; -1);
</span><span class="cx">     }
</span><span class="cx">     # Sorted because the old @::log_columns variable, which this replaces,
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaCGIpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/CGI.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/CGI.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/CGI.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -169,6 +169,16 @@
</span><span class="cx">     # Delete leftovers from the login form
</span><span class="cx">     $self-&gt;delete('Bugzilla_remember', 'GoAheadAndLogIn');
</span><span class="cx"> 
</span><ins>+    # Delete the token if we're not performing an action which needs it
+    unless ((defined $self-&gt;param('remtype')
+             &amp;&amp; ($self-&gt;param('remtype') eq 'asdefault'
+                 || $self-&gt;param('remtype') eq 'asnamed'))
+            || (defined $self-&gt;param('remaction')
+                &amp;&amp; $self-&gt;param('remaction') eq 'forget'))
+    {
+        $self-&gt;delete(&quot;token&quot;);
+    }
+
</ins><span class="cx">     foreach my $num (1,2,3) {
</span><span class="cx">         # If there's no value in the email field, delete the related fields.
</span><span class="cx">         if (!$self-&gt;param(&quot;email$num&quot;)) {
</span><span class="lines">@@ -306,6 +316,14 @@
</span><span class="cx">         unshift(@_, '-x_frame_options' =&gt; 'SAMEORIGIN');
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    # Add X-XSS-Protection header to prevent simple XSS attacks
+    # and enforce the blocking (rather than the rewriting) mode.
+    unshift(@_, '-x_xss_protection' =&gt; '1; mode=block');
+
+    # Add X-Content-Type-Options header to prevent browsers sniffing
+    # the MIME type away from the declared Content-Type.
+    unshift(@_, '-x_content_type_options' =&gt; 'nosniff');
+
</ins><span class="cx">     return $self-&gt;SUPER::header(@_) || &quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -353,7 +371,7 @@
</span><span class="cx"> sub _fix_utf8 {
</span><span class="cx">     my $input = shift;
</span><span class="cx">     # The is_utf8 is here in case CGI gets smart about utf8 someday.
</span><del>-    utf8::decode($input) if defined $input &amp;&amp; !utf8::is_utf8($input);
</del><ins>+    utf8::decode($input) if defined $input &amp;&amp; !ref $input &amp;&amp; !utf8::is_utf8($input);
</ins><span class="cx">     return $input;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaConfigMTApm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Config/MTA.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Config/MTA.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Config/MTA.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -34,6 +34,12 @@
</span><span class="cx"> use strict;
</span><span class="cx"> 
</span><span class="cx"> use Bugzilla::Config::Common;
</span><ins>+# Return::Value 1.666002 pollutes the error log with warnings about this
+# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send
+# to disable these warnings.
+BEGIN {
+    $Return::Value::NO_CLUCK = 1;
+}
</ins><span class="cx"> use Email::Send;
</span><span class="cx"> 
</span><span class="cx"> our $sortkey = 1200;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaConstantspm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Constants.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Constants.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Constants.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -203,7 +203,7 @@
</span><span class="cx"> # CONSTANTS
</span><span class="cx"> #
</span><span class="cx"> # Bugzilla version
</span><del>-use constant BUGZILLA_VERSION =&gt; &quot;4.2.1&quot;;
</del><ins>+use constant BUGZILLA_VERSION =&gt; &quot;4.2.7&quot;;
</ins><span class="cx"> 
</span><span class="cx"> # Location of the remote and local XML files to track new releases.
</span><span class="cx"> use constant REMOTE_FILE =&gt; 'http://updates.bugzilla.org/bugzilla-update.xml';
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBMysqlpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Mysql.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Mysql.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Mysql.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -325,9 +325,8 @@
</span><span class="cx">     # hard to fix later. We do this up here because none of the code below
</span><span class="cx">     # works if InnoDB is off. (Particularly if we've already converted the
</span><span class="cx">     # tables to InnoDB.)
</span><del>-    my ($innodb_on) = @{$self-&gt;selectcol_arrayref(
-        q{SHOW VARIABLES LIKE '%have_innodb%'}, {Columns=&gt;[2]})};
-    if ($innodb_on ne 'YES') {
</del><ins>+    my %engines = @{$self-&gt;selectcol_arrayref('SHOW ENGINES', {Columns =&gt; [1,2]})};
+    if (!$engines{InnoDB} || $engines{InnoDB} !~ /^(YES|DEFAULT)$/) {
</ins><span class="cx">         die install_string('mysql_innodb_disabled');
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -941,7 +940,9 @@
</span><span class="cx">               $index = name of an index
</span><span class="cx">  Returns:     An abstract index definition, always in hashref format.
</span><span class="cx">               If the index does not exist, the function returns undef.
</span><ins>+
</ins><span class="cx"> =cut
</span><ins>+
</ins><span class="cx"> sub bz_index_info_real {
</span><span class="cx">     my ($self, $table, $index) = @_;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBOraclepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Oracle.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Oracle.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Oracle.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -56,6 +56,8 @@
</span><span class="cx"> use constant MIN_LONG_READ_LEN =&gt; 32 * 1024;
</span><span class="cx"> use constant FULLTEXT_OR =&gt; ' OR ';
</span><span class="cx"> 
</span><ins>+our $fulltext_label = 0;
+
</ins><span class="cx"> sub new {
</span><span class="cx">     my ($class, $params) = @_;
</span><span class="cx">     my ($user, $pass, $host, $dbname, $port) = 
</span><span class="lines">@@ -72,7 +74,7 @@
</span><span class="cx">     my $dsn = &quot;dbi:Oracle:host=$host;sid=$dbname&quot;;
</span><span class="cx">     $dsn .= &quot;;port=$port&quot; if $port;
</span><span class="cx">     my $attrs = { FetchHashKeyName =&gt; 'NAME_lc',  
</span><del>-                  LongReadLen =&gt; max(Bugzilla-&gt;params-&gt;{'maxattachmentsize'},
</del><ins>+                  LongReadLen =&gt; max(Bugzilla-&gt;params-&gt;{'maxattachmentsize'} || 0,
</ins><span class="cx">                                      MIN_LONG_READ_LEN) * 1024,
</span><span class="cx">                 };
</span><span class="cx">     my $self = $class-&gt;db_new({ dsn =&gt; $dsn, user =&gt; $user, 
</span><span class="lines">@@ -124,7 +126,8 @@
</span><span class="cx"> sub sql_group_concat {
</span><span class="cx">     my ($self, $text, $separator) = @_;
</span><span class="cx">     $separator = $self-&gt;quote(', ') if !defined $separator;
</span><del>-    return &quot;group_concat(T_CLOB_DELIM($text, $separator))&quot;;
</del><ins>+    my ($distinct, $rest) = $text =~/^(\s*DISTINCT\s|)(.+)$/i;
+    return &quot;group_concat($distinct T_CLOB_DELIM(NVL($rest, ' '), $separator))&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub sql_regexp {
</span><span class="lines">@@ -170,11 +173,13 @@
</span><span class="cx"> 
</span><span class="cx">     return &quot; TO_DATE($date,'J') &quot;;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> sub sql_fulltext_search {
</span><del>-    my ($self, $column, $text, $label) = @_;
</del><ins>+    my ($self, $column, $text) = @_;
</ins><span class="cx">     $text = $self-&gt;quote($text);
</span><span class="cx">     trick_taint($text);
</span><del>-    return &quot;CONTAINS($column,$text,$label) &gt; 0&quot;, &quot;SCORE($label)&quot;;
</del><ins>+    $fulltext_label++;
+    return &quot;CONTAINS($column,$text,$fulltext_label) &gt; 0&quot;, &quot;SCORE($fulltext_label)&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub sql_date_format {
</span><span class="lines">@@ -211,16 +216,16 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub sql_in {
</span><del>-    my ($self, $column_name, $in_list_ref) = @_;
</del><ins>+    my ($self, $column_name, $in_list_ref, $negate) = @_;
</ins><span class="cx">     my @in_list = @$in_list_ref;
</span><del>-    return $self-&gt;SUPER::sql_in($column_name, $in_list_ref) if $#in_list &lt; 1000;
</del><ins>+    return $self-&gt;SUPER::sql_in($column_name, $in_list_ref, $negate) if $#in_list &lt; 1000;
</ins><span class="cx">     my @in_str;
</span><span class="cx">     while (@in_list) {
</span><span class="cx">         my $length = $#in_list + 1;
</span><span class="cx">         my $splice = $length &gt; 1000 ? 1000 : $length;
</span><span class="cx">         my @sub_in_list = splice(@in_list, 0, $splice);
</span><span class="cx">         push(@in_str, 
</span><del>-             $self-&gt;SUPER::sql_in($column_name, \@sub_in_list)); 
</del><ins>+             $self-&gt;SUPER::sql_in($column_name, \@sub_in_list, $negate));
</ins><span class="cx">     }
</span><span class="cx">     return &quot;( &quot; . join(&quot; OR &quot;, @in_str) . &quot; )&quot;;
</span><span class="cx"> }
</span><span class="lines">@@ -310,8 +315,9 @@
</span><span class="cx">     my $has_from =  ($part =~ m/\bFROM\b/io) if $is_select;
</span><span class="cx"> 
</span><span class="cx">     # Oracle recognizes CURRENT_DATE, but not CURRENT_DATE()
</span><del>-    $part =~ s/\bCURRENT_DATE\b\(\)/CURRENT_DATE/io;
-    
</del><ins>+    # and its CURRENT_DATE is a date+time, so wrap in TRUNC()
+    $part =~ s/\bCURRENT_DATE\b(?:\(\))?/TRUNC(CURRENT_DATE)/io;
+
</ins><span class="cx">     # Oracle use SUBSTR instead of SUBSTRING
</span><span class="cx">     $part =~ s/\bSUBSTRING\b/SUBSTR/io;
</span><span class="cx">    
</span><span class="lines">@@ -341,7 +347,8 @@
</span><span class="cx">                     if ($is_select and !$has_from);
</span><span class="cx"> 
</span><span class="cx">         # Oracle recognizes CURRENT_DATE, but not CURRENT_DATE()
</span><del>-        $nonstring =~ s/\bCURRENT_DATE\b\(\)/CURRENT_DATE/io;
</del><ins>+        # and its CURRENT_DATE is a date+time, so wrap in TRUNC()
+        $nonstring =~ s/\bCURRENT_DATE\b(?:\(\))?/TRUNC(CURRENT_DATE)/io;
</ins><span class="cx"> 
</span><span class="cx">         # Oracle use SUBSTR instead of SUBSTRING
</span><span class="cx">         $nonstring =~ s/\bSUBSTRING\b/SUBSTR/io;
</span><span class="lines">@@ -543,15 +550,20 @@
</span><span class="cx">               . &quot; RETURN NUMBER IS BEGIN RETURN LENGTH(COLUMN_NAME); END;&quot;);
</span><span class="cx">     
</span><span class="cx">     # Create types for group_concat
</span><del>-    my $t_clob_delim = $self-&gt;selectcol_arrayref(&quot;
-        SELECT TYPE_NAME FROM USER_TYPES WHERE TYPE_NAME=?&quot;,
-        undef, 'T_CLOB_DELIM'); 
</del><ins>+    my $type_exists = $self-&gt;selectrow_array(&quot;SELECT 1 FROM user_types
+                                              WHERE type_name = 'T_GROUP_CONCAT'&quot;);
+    $self-&gt;do(&quot;DROP TYPE T_GROUP_CONCAT&quot;) if $type_exists;
+    $self-&gt;do(&quot;CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT &quot;
+          . &quot;( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256)&quot;
+          . &quot;, MAP MEMBER FUNCTION T_CLOB_DELIM_ToVarchar return VARCHAR2&quot;
+          . &quot;);&quot;);
+    $self-&gt;do(&quot;CREATE OR REPLACE TYPE BODY T_CLOB_DELIM IS
+                  MAP MEMBER FUNCTION T_CLOB_DELIM_ToVarchar return VARCHAR2 is
+                  BEGIN
+                      RETURN p_CONTENT;
+                  END;
+              END;&quot;);
</ins><span class="cx"> 
</span><del>-    if ( !@$t_clob_delim ) {
-        $self-&gt;do(&quot;CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT &quot;
-              . &quot;( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256));&quot;);
-    }
-
</del><span class="cx">     $self-&gt;do(&quot;CREATE OR REPLACE TYPE T_GROUP_CONCAT AS OBJECT 
</span><span class="cx">                (  CLOB_CONTENT CLOB,
</span><span class="cx">                   DELIMITER    VARCHAR2(256),
</span><span class="lines">@@ -635,11 +647,25 @@
</span><span class="cx"> 
</span><span class="cx">     $self-&gt;SUPER::bz_setup_database(@_);
</span><span class="cx"> 
</span><ins>+    my $sth = $self-&gt;prepare(&quot;SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME = ?&quot;);
</ins><span class="cx">     my @tables = $self-&gt;bz_table_list_real();
</span><ins>+
</ins><span class="cx">     foreach my $table (@tables) {
</span><span class="cx">         my @columns = $self-&gt;bz_table_columns_real($table);
</span><span class="cx">         foreach my $column (@columns) {
</span><span class="cx">             my $def = $self-&gt;bz_column_info($table, $column);
</span><ins>+            # bz_add_column() before Bugzilla 4.2.3 didn't handle primary keys
+            # correctly (bug 731156). We have to add missing sequences and
+            # triggers ourselves.
+            if ($def-&gt;{TYPE} =~ /SERIAL/i) {
+                my $sequence = &quot;${table}_${column}_SEQ&quot;;
+                my $exists = $self-&gt;selectrow_array($sth, undef, $sequence);
+                if (!$exists) {
+                    my @sql = $self-&gt;_get_create_seq_ddl($table, $column);
+                    $self-&gt;do($_) foreach @sql;
+                }
+            }
+
</ins><span class="cx">             if ($def-&gt;{REFERENCES}) {
</span><span class="cx">                 my $references = $def-&gt;{REFERENCES};
</span><span class="cx">                 my $update = $references-&gt;{UPDATE} || 'CASCADE';
</span><span class="lines">@@ -653,15 +679,13 @@
</span><span class="cx">                     $to_table = 'tag';
</span><span class="cx">                 }
</span><span class="cx">                 if ( $update =~ /CASCADE/i ){
</span><del>-                     my $trigger_name = uc($fk_name . &quot;_UC&quot;);
-                     my $exist_trigger = $self-&gt;selectcol_arrayref(
-                         &quot;SELECT OBJECT_NAME FROM USER_OBJECTS 
-                          WHERE OBJECT_NAME = ?&quot;, undef, $trigger_name);
</del><ins>+                    my $trigger_name = uc($fk_name . &quot;_UC&quot;);
+                    my $exist_trigger = $self-&gt;selectcol_arrayref($sth, undef, $trigger_name);
</ins><span class="cx">                     if(@$exist_trigger) {
</span><span class="cx">                         $self-&gt;do(&quot;DROP TRIGGER $trigger_name&quot;);
</span><span class="cx">                     }
</span><span class="cx">   
</span><del>-                     my $tr_str = &quot;CREATE OR REPLACE TRIGGER $trigger_name&quot;
</del><ins>+                    my $tr_str = &quot;CREATE OR REPLACE TRIGGER $trigger_name&quot;
</ins><span class="cx">                          . &quot; AFTER UPDATE OF $to_column ON $to_table &quot;
</span><span class="cx">                          . &quot; REFERENCING &quot;
</span><span class="cx">                          . &quot; NEW AS NEW &quot;
</span><span class="lines">@@ -672,22 +696,46 @@
</span><span class="cx">                          . &quot;        SET $column = :NEW.$to_column&quot;
</span><span class="cx">                          . &quot;      WHERE $column = :OLD.$to_column;&quot;
</span><span class="cx">                          . &quot; END $trigger_name;&quot;;
</span><del>-                         $self-&gt;do($tr_str);
-               }
-         }
-     }
-   }
</del><ins>+                    $self-&gt;do($tr_str);
+                }
+            }
+        }
+    }
</ins><span class="cx"> 
</span><span class="cx">    # Drop the trigger which causes bug 541553
</span><span class="cx">    my $trigger_name = &quot;PRODUCTS_MILESTONEURL&quot;;
</span><del>-   my $exist_trigger = $self-&gt;selectcol_arrayref(
-       &quot;SELECT OBJECT_NAME FROM USER_OBJECTS
-        WHERE OBJECT_NAME = ?&quot;, undef, $trigger_name);
</del><ins>+   my $exist_trigger = $self-&gt;selectcol_arrayref($sth, undef, $trigger_name);
</ins><span class="cx">    if(@$exist_trigger) {
</span><span class="cx">        $self-&gt;do(&quot;DROP TRIGGER $trigger_name&quot;);
</span><span class="cx">    }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+# These two methods have been copied from Bugzilla::DB::Schema::Oracle.
+sub _get_create_seq_ddl {
+    my ($self, $table, $column) = @_;
+
+    my $seq_name = &quot;${table}_${column}_SEQ&quot;;
+    my $seq_sql = &quot;CREATE SEQUENCE $seq_name INCREMENT BY 1 START WITH 1 &quot; .
+                  &quot;NOMAXVALUE NOCYCLE NOCACHE&quot;;
+    my $trigger_sql = $self-&gt;_get_create_trigger_ddl($table, $column, $seq_name);
+    return ($seq_sql, $trigger_sql);
+}
+
+sub _get_create_trigger_ddl {
+    my ($self, $table, $column, $seq_name) = @_;
+
+    my $trigger_sql = &quot;CREATE OR REPLACE TRIGGER ${table}_${column}_TR &quot;
+                    . &quot; BEFORE INSERT ON $table &quot;
+                    . &quot; FOR EACH ROW &quot;
+                    . &quot; BEGIN &quot;
+                    . &quot;   SELECT ${seq_name}.NEXTVAL &quot;
+                    . &quot;   INTO :NEW.$column FROM DUAL; &quot;
+                    . &quot; END;&quot;;
+    return $trigger_sql;
+}
+
+############################################################################
+
</ins><span class="cx"> package Bugzilla::DB::Oracle::st;
</span><span class="cx"> use base qw(DBI::st);
</span><span class="cx">  
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBPgpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Pg.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Pg.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Pg.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -215,11 +215,12 @@
</span><span class="cx">     my $self = shift;
</span><span class="cx">     my ($db) = @_;
</span><span class="cx">     my $server_version = $self-&gt;SUPER::bz_check_server_version(@_);
</span><del>-    my ($major_version) = $server_version =~ /^(\d+)/;
-    # Pg 9 requires DBD::Pg 2.17.2 in order to properly read bytea values.
</del><ins>+    my ($major_version, $minor_version) = $server_version =~ /^0*(\d+)\.0*(\d+)/;
+    # Pg 9.0 requires DBD::Pg 2.17.2 in order to properly read bytea values.
+    # Pg 9.2 requires DBD::Pg 2.19.3 as spclocation no longer exists.
</ins><span class="cx">     if ($major_version &gt;= 9) {
</span><del>-        local $db-&gt;{dbd}-&gt;{version} = '2.17.2';
-        local $db-&gt;{name} = $db-&gt;{name} . ' 9+';
</del><ins>+        local $db-&gt;{dbd}-&gt;{version} = ($minor_version &gt;= 2) ? '2.19.3' : '2.17.2';
+        local $db-&gt;{name} = $db-&gt;{name} . &quot; ${major_version}.$minor_version&quot;;
</ins><span class="cx">         Bugzilla::DB::_bz_check_dbd(@_);
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBSchemaOraclepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Oracle.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Oracle.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Oracle.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -199,6 +199,35 @@
</span><span class="cx">     return $fk_name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub get_add_column_ddl {
+    my $self = shift;
+    my ($table, $column, $definition, $init_value) = @_;
+    my @sql;
+
+    # Create sequences and triggers to emulate SERIAL datatypes.
+    if ($definition-&gt;{TYPE} =~ /SERIAL/i) {
+        # Clone the definition to not alter the original one.
+        my %def = %$definition;
+        # Oracle requires to define the column is several steps.
+        my $pk = delete $def{PRIMARYKEY};
+        my $notnull = delete $def{NOTNULL};
+        @sql = $self-&gt;SUPER::get_add_column_ddl($table, $column, \%def, $init_value);
+        push(@sql, $self-&gt;_get_create_seq_ddl($table, $column));
+        push(@sql, &quot;UPDATE $table SET $column = ${table}_${column}_SEQ.NEXTVAL&quot;);
+        push(@sql, &quot;ALTER TABLE $table MODIFY $column NOT NULL&quot;) if $notnull;
+        push(@sql, &quot;ALTER TABLE $table ADD PRIMARY KEY ($column)&quot;) if $pk;
+    }
+    else {
+        @sql = $self-&gt;SUPER::get_add_column_ddl(@_);
+        # Create triggers to deal with empty string. 
+        if ($definition-&gt;{TYPE} =~ /varchar|TEXT/i &amp;&amp; $definition-&gt;{NOTNULL}) {
+            push(@sql, _get_notnull_trigger_ddl($table, $column));
+        }
+    }
+
+    return @sql;
+}
+
</ins><span class="cx"> sub get_alter_column_ddl {
</span><span class="cx">     my ($self, $table, $column, $new_def, $set_nulls_to) = @_;
</span><span class="cx"> 
</span><span class="lines">@@ -364,6 +393,29 @@
</span><span class="cx">     return @sql;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub get_drop_column_ddl {
+    my $self = shift;
+    my ($table, $column) = @_;
+    my @sql;
+    push(@sql, $self-&gt;SUPER::get_drop_column_ddl(@_));
+    my $dbh=Bugzilla-&gt;dbh;
+    my $trigger_name = uc($table . &quot;_&quot; . $column);
+    my $exist_trigger = $dbh-&gt;selectcol_arrayref(
+        &quot;SELECT OBJECT_NAME FROM USER_OBJECTS
+         WHERE OBJECT_NAME = ?&quot;, undef, $trigger_name);
+    if(@$exist_trigger) {
+        push(@sql, &quot;DROP TRIGGER $trigger_name&quot;);
+    }
+    # If this column is of type SERIAL, we need to drop the sequence
+    # and trigger that went along with it.
+    my $def = $self-&gt;get_column_abstract($table, $column);
+    if ($def-&gt;{TYPE} =~ /SERIAL/i) {
+        push(@sql, &quot;DROP SEQUENCE ${table}_${column}_SEQ&quot;);
+        push(@sql, &quot;DROP TRIGGER ${table}_${column}_TR&quot;);
+    }
+    return @sql;
+}
+
</ins><span class="cx"> sub get_rename_table_sql {
</span><span class="cx">     my ($self, $old_name, $new_name) = @_;
</span><span class="cx">     if (lc($old_name) eq lc($new_name)) {
</span><span class="lines">@@ -465,20 +517,4 @@
</span><span class="cx">     return @sql;
</span><span class="cx"> } 
</span><span class="cx"> 
</span><del>-sub get_drop_column_ddl {
-    my $self = shift;
-    my ($table, $column) = @_;
-    my @sql;
-    push(@sql, $self-&gt;SUPER::get_drop_column_ddl(@_));
-    my $dbh=Bugzilla-&gt;dbh;
-    my $trigger_name = uc($table . &quot;_&quot; . $column);
-    my $exist_trigger = $dbh-&gt;selectcol_arrayref(
-        &quot;SELECT OBJECT_NAME FROM USER_OBJECTS
-         WHERE OBJECT_NAME = ?&quot;, undef, $trigger_name);
-    if(@$exist_trigger) {
-        push(@sql, &quot;DROP TRIGGER $trigger_name&quot;);
-    }
-    return @sql;
-}
-
</del><span class="cx"> 1;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBSchemaPgpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Pg.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Pg.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema/Pg.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -90,6 +90,16 @@
</span><span class="cx"> } #eosub--_initialize
</span><span class="cx"> #--------------------------------------------------------------------
</span><span class="cx"> 
</span><ins>+sub get_create_database_sql {
+    my ($self, $name) = @_;
+    # We only create as utf8 if we have no params (meaning we're doing
+    # a new installation) or if the utf8 param is on.
+    my $create_utf8 = Bugzilla-&gt;params-&gt;{'utf8'}
+                      || !defined Bugzilla-&gt;params-&gt;{'utf8'};
+    my $charset = $create_utf8 ? &quot;ENCODING 'UTF8' TEMPLATE template0&quot; : '';
+    return (&quot;CREATE DATABASE $name $charset&quot;);
+}
+
</ins><span class="cx"> sub get_rename_column_ddl {
</span><span class="cx">     my ($self, $table, $old_name, $new_name) = @_;
</span><span class="cx">     if (lc($old_name) eq lc($new_name)) {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBSchemapm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB/Schema.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1858,6 +1858,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> sub get_fk_ddl {
</span><ins>+
</ins><span class="cx"> =item C&lt;_get_fk_ddl&gt;
</span><span class="cx"> 
</span><span class="cx"> =over
</span><span class="lines">@@ -1871,7 +1872,9 @@
</span><span class="cx"> =over
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;$table&gt;  - The name of the table the reference is from.
</span><ins>+
</ins><span class="cx"> =item C&lt;$column&gt; - The name of the column the reference is from
</span><ins>+
</ins><span class="cx"> =item C&lt;$references&gt; - The C&lt;REFERENCES&gt; hashref from a column.
</span><span class="cx"> 
</span><span class="cx"> =back
</span><span class="lines">@@ -1972,6 +1975,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub get_column {
</span><ins>+
</ins><span class="cx"> =item C&lt;get_column($table, $column)&gt;
</span><span class="cx"> 
</span><span class="cx">  Description: Public method to get the abstract definition of a column.
</span><span class="lines">@@ -2837,6 +2841,7 @@
</span><span class="cx">               in the same fashion as) the current version of Schema. 
</span><span class="cx">               However, it will represent the serialized data instead of
</span><span class="cx">               ABSTRACT_SCHEMA.
</span><ins>+
</ins><span class="cx"> =cut
</span><span class="cx"> 
</span><span class="cx"> sub deserialize_abstract {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaDBpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/DB.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/DB.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/DB.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -405,8 +405,10 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub sql_in {
</span><del>-    my ($self, $column_name, $in_list_ref) = @_;
-    return &quot; $column_name IN (&quot; . join(',', @$in_list_ref) . &quot;) &quot;;
</del><ins>+    my ($self, $column_name, $in_list_ref, $negate) = @_;
+    return &quot; $column_name &quot;
+             . ($negate ? &quot;NOT &quot; : &quot;&quot;)
+             . &quot;IN (&quot; . join(',', @$in_list_ref) . &quot;) &quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub sql_fulltext_search {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaFieldChoiceInterfacepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Field/ChoiceInterface.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Field/ChoiceInterface.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Field/ChoiceInterface.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -183,6 +183,7 @@
</span><span class="cx">     # This allows bug/create/create.html.tmpl to pass in a hashref that 
</span><span class="cx">     # looks like a bug object.
</span><span class="cx">     my $value = blessed($bug) ? $bug-&gt;$field_name : $bug-&gt;{$field_name};
</span><ins>+    $value = $value-&gt;name if blessed($value);
</ins><span class="cx">     return 0 if !defined $value;
</span><span class="cx"> 
</span><span class="cx">     if ($self-&gt;field-&gt;type == FIELD_TYPE_BUG_URLS
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaFieldpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Field.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Field.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Field.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1016,7 +1016,11 @@
</span><span class="cx">     # the parameter isn't sent to create().
</span><span class="cx">     $params-&gt;{sortkey} = undef if !exists $params-&gt;{sortkey};
</span><span class="cx">     $params-&gt;{type} ||= 0;
</span><del>-    
</del><ins>+    # We mark the custom field as obsolete till it has been fully created,
+    # to avoid race conditions when viewing bugs at the same time.
+    my $is_obsolete = $params-&gt;{obsolete};
+    $params-&gt;{obsolete} = 1 if $params-&gt;{custom};
+
</ins><span class="cx">     $dbh-&gt;bz_start_transaction();
</span><span class="cx">     $class-&gt;check_required_create_fields(@_);
</span><span class="cx">     my $field_values      = $class-&gt;run_create_validators($params);
</span><span class="lines">@@ -1045,6 +1049,10 @@
</span><span class="cx">             # Insert a default value of &quot;---&quot; into the legal values table.
</span><span class="cx">             $dbh-&gt;do(&quot;INSERT INTO $name (value) VALUES ('---')&quot;);
</span><span class="cx">         }
</span><ins>+
+        # Restore the original obsolete state of the custom field.
+        $dbh-&gt;do('UPDATE fielddefs SET obsolete = 0 WHERE id = ?', undef, $field-&gt;id)
+          unless $is_obsolete;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return $field;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaFlagTypepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/FlagType.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/FlagType.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/FlagType.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">     description      =&gt; \&amp;_check_description,
</span><span class="cx">     cc_list          =&gt; \&amp;_check_cc_list,
</span><span class="cx">     target_type      =&gt; \&amp;_check_target_type,
</span><del>-    sortkey          =&gt; \&amp;_check_sortey,
</del><ins>+    sortkey          =&gt; \&amp;_check_sortkey,
</ins><span class="cx">     is_active        =&gt; \&amp;Bugzilla::Object::check_boolean,
</span><span class="cx">     is_requestable   =&gt; \&amp;Bugzilla::Object::check_boolean,
</span><span class="cx">     is_requesteeble  =&gt; \&amp;Bugzilla::Object::check_boolean,
</span><span class="lines">@@ -325,7 +325,7 @@
</span><span class="cx">     return $target_type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-sub _check_sortey {
</del><ins>+sub _check_sortkey {
</ins><span class="cx">     my ($invocant, $sortkey) = @_;
</span><span class="cx"> 
</span><span class="cx">     (detaint_natural($sortkey) &amp;&amp; $sortkey &lt;= MAX_SMALLINT)
</span><span class="lines">@@ -681,7 +681,10 @@
</span><span class="cx">     }
</span><span class="cx">     if ($criteria-&gt;{product_id}) {
</span><span class="cx">         my $product_id = $criteria-&gt;{product_id};
</span><del>-        
</del><ins>+        detaint_natural($product_id)
+          || ThrowCodeError('bad_arg', { argument =&gt; 'product_id',
+                                         function =&gt; 'Bugzilla::FlagType::sqlify_criteria' });
+
</ins><span class="cx">         # Add inclusions to the query, which simply involves joining the table
</span><span class="cx">         # by flag type ID and target product/component.
</span><span class="cx">         push(@$tables, &quot;INNER JOIN flaginclusions AS i ON flagtypes.id = i.type_id&quot;);
</span><span class="lines">@@ -698,6 +701,10 @@
</span><span class="cx">         my $addl_join_clause = &quot;&quot;;
</span><span class="cx">         if ($criteria-&gt;{component_id}) {
</span><span class="cx">             my $component_id = $criteria-&gt;{component_id};
</span><ins>+            detaint_natural($component_id)
+              || ThrowCodeError('bad_arg', { argument =&gt; 'component_id',
+                                             function =&gt; 'Bugzilla::FlagType::sqlify_criteria' });
+
</ins><span class="cx">             push(@criteria, &quot;(i.component_id = $component_id OR i.component_id IS NULL)&quot;);
</span><span class="cx">             $join_clause .= &quot;AND (e.component_id = $component_id OR e.component_id IS NULL) &quot;;
</span><span class="cx">         }
</span><span class="lines">@@ -711,7 +718,10 @@
</span><span class="cx">     }
</span><span class="cx">     if ($criteria-&gt;{group}) {
</span><span class="cx">         my $gid = $criteria-&gt;{group};
</span><del>-        detaint_natural($gid);
</del><ins>+        detaint_natural($gid)
+          || ThrowCodeError('bad_arg', { argument =&gt; 'group',
+                                         function =&gt; 'Bugzilla::FlagType::sqlify_criteria' });
+
</ins><span class="cx">         push(@criteria, &quot;(flagtypes.grant_group_id = $gid &quot; .
</span><span class="cx">                         &quot; OR flagtypes.request_group_id = $gid)&quot;);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaGrouppm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Group.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Group.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Group.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -189,7 +189,9 @@
</span><span class="cx">     my $self = shift;
</span><span class="cx">     my $user = Bugzilla-&gt;user;
</span><span class="cx">     return if !Bugzilla-&gt;params-&gt;{'usevisibilitygroups'};
</span><del>-    my $is_visible = grep { $_-&gt;id == $_ } @{ $user-&gt;visible_groups_inherited };
</del><ins>+
+    my $group_id = $self-&gt;id;
+    my $is_visible = grep { $_ == $group_id } @{ $user-&gt;visible_groups_inherited };
</ins><span class="cx">     if (!$is_visible) {
</span><span class="cx">         ThrowUserError('group_not_visible', { group =&gt; $self });
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaHookpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Hook.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Hook.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Hook.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -426,6 +426,12 @@
</span><span class="cx"> not a bug comment (but could still be some other part of a bug, like
</span><span class="cx"> the summary line).
</span><span class="cx"> 
</span><ins>+=item C&lt;user&gt;
+
+The L&lt;Bugzilla::User&gt; object representing the user who will see the text.
+This is useful to determine how much confidential information can be displayed
+to the user.
+
</ins><span class="cx"> =back
</span><span class="cx"> 
</span><span class="cx"> =head2 buglist_columns
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaInstallDBpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Install/DB.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Install/DB.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Install/DB.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -3538,9 +3538,6 @@
</span><span class="cx">                                      VALUES (?, ?)');
</span><span class="cx">     my $sth_nq = $dbh-&gt;prepare('UPDATE namedqueries SET query = ?
</span><span class="cx">                                 WHERE id = ?');
</span><del>-    my $sth_nq_footer = $dbh-&gt;prepare(
-        'DELETE FROM namedqueries_link_in_footer 
-               WHERE user_id = ? AND namedquery_id = ?');
</del><span class="cx"> 
</span><span class="cx">     if (scalar @$tags) {
</span><span class="cx">         print install_string('update_queries_to_tags'), &quot;\n&quot;;
</span><span class="lines">@@ -3580,13 +3577,11 @@
</span><span class="cx">             next if !$bug_id;
</span><span class="cx">             $sth_bug_tag-&gt;execute($bug_id, $tag_id);
</span><span class="cx">         }
</span><del>-        
</del><ins>+
</ins><span class="cx">         # Existing tags may be used in whines, or shared with
</span><span class="cx">         # other users. So we convert them rather than delete them.
</span><span class="cx">         $uri-&gt;query_param('tag', $tag_name);
</span><span class="cx">         $sth_nq-&gt;execute($uri-&gt;query, $query_id);
</span><del>-        # But we don't keep showing them in the footer.
-        $sth_nq_footer-&gt;execute($user_id, $query_id);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     $dbh-&gt;bz_commit_transaction();
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaInstallRequirementspm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Install/Requirements.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Install/Requirements.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Install/Requirements.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -32,6 +32,13 @@
</span><span class="cx"> use Safe;
</span><span class="cx"> use Term::ANSIColor;
</span><span class="cx"> 
</span><ins>+# Return::Value 1.666002 pollutes the error log with warnings about this
+# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send
+# in have_vers() to disable these warnings.
+BEGIN {
+    $Return::Value::NO_CLUCK = 1;
+}
+
</ins><span class="cx"> use base qw(Exporter);
</span><span class="cx"> our @EXPORT = qw(
</span><span class="cx">     REQUIRED_MODULES
</span><span class="lines">@@ -547,26 +554,6 @@
</span><span class="cx">         ( (!$output and @{$check_results-&gt;{missing}})
</span><span class="cx">           or ($output and $check_results-&gt;{any_missing}) ) ? 1 : 0;
</span><span class="cx"> 
</span><del>-    # We only print the PPM repository note if we have to.
-    my $perl_ver = sprintf('%vd', $^V);
-    if ($need_module_instructions &amp;&amp; ON_ACTIVESTATE &amp;&amp; vers_cmp($perl_ver, '5.12') &lt; 0) {
-        # URL when running Perl 5.8.x.
-        my $url_to_theory58S = 'http://theoryx5.uwinnipeg.ca/ppms';
-        # Packages for Perl 5.10 are not compatible with Perl 5.8.
-        if (vers_cmp($perl_ver, '5.10') &gt; -1) {
-            $url_to_theory58S = 'http://cpan.uwinnipeg.ca/PPMPackages/10xx/';
-        }
-        print colored(
-            install_string('ppm_repo_add', 
-                           { theory_url =&gt; $url_to_theory58S }),
-            COLOR_ERROR);
-
-        # ActivePerls older than revision 819 require an additional command.
-        if (ON_ACTIVESTATE &lt; 819) {
-            print install_string('ppm_repo_up');
-        }
-    }
-
</del><span class="cx">     if ($need_module_instructions or @{ $check_results-&gt;{apache} }) {
</span><span class="cx">         # If any output was required, we want to close the &quot;table&quot;
</span><span class="cx">         print &quot;*&quot; x TABLE_WIDTH . &quot;\n&quot;;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaMailerpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Mailer.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Mailer.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Mailer.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -48,6 +48,12 @@
</span><span class="cx"> use Encode::MIME::Header;
</span><span class="cx"> use Email::Address;
</span><span class="cx"> use Email::MIME;
</span><ins>+# Return::Value 1.666002 pollutes the error log with warnings about this
+# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send
+# to disable these warnings.
+BEGIN {
+    $Return::Value::NO_CLUCK = 1;
+}
</ins><span class="cx"> use Email::Send;
</span><span class="cx"> 
</span><span class="cx"> sub MessageToMTA {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaObjectpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Object.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Object.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Object.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -801,7 +801,7 @@
</span><span class="cx"> The name of the column that should be considered to be the unique
</span><span class="cx"> &quot;name&quot; of this object. The 'name' is a B&lt;string&gt; that uniquely identifies
</span><span class="cx"> this Object in the database. Defaults to 'name'. When you specify 
</span><del>-C&lt;{name =&gt; $name}&gt; to C&lt;new()&gt;, this is the column that will be 
</del><ins>+C&lt;&lt; {name =&gt; $name} &gt;&gt; to C&lt;new()&gt;, this is the column that will be 
</ins><span class="cx"> matched against in the DB.
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;ID_FIELD&gt;
</span><span class="lines">@@ -964,7 +964,7 @@
</span><span class="cx"> 
</span><span class="cx"> This is to allow subclasses to have complex parameters, and then to
</span><span class="cx"> translate those parameters into C&lt;condition&gt; and C&lt;values&gt; when they
</span><del>-call C&lt;$self-&gt;SUPER::new&gt; (which is this function, usually).
</del><ins>+call C&lt;&lt; $self-&gt;SUPER::new &gt;&gt; (which is this function, usually).
</ins><span class="cx"> 
</span><span class="cx"> If you try to call C&lt;new&gt; outside of a subclass with the C&lt;condition&gt;
</span><span class="cx"> and C&lt;values&gt; parameters, Bugzilla will throw an error. These parameters
</span><span class="lines">@@ -1089,8 +1089,9 @@
</span><span class="cx">              your subclass's L&lt;/ID_FIELD&gt; must be of C&lt;SERIAL&gt;
</span><span class="cx">              type in the database.
</span><span class="cx"> 
</span><del>-             Subclass Implementors: This function basically just
-             calls L&lt;/check_required_create_fields&gt;, then
</del><ins>+Subclass Implementors:
+             This function basically just calls 
+             L&lt;/check_required_create_fields&gt;, then
</ins><span class="cx">              L&lt;/run_create_validators&gt;, and then finally
</span><span class="cx">              L&lt;/insert_create_data&gt;. So if you have a complex system that
</span><span class="cx">              you need to implement, you can do it by calling these
</span><span class="lines">@@ -1283,9 +1284,9 @@
</span><span class="cx"> 
</span><span class="cx">  Returns:     A list of objects, or an empty list if there are none.
</span><span class="cx"> 
</span><del>- Notes:       Note that you must call this as C&lt;$class-&gt;get_all&gt;. For 
-              example, C&lt;Bugzilla::Keyword-&gt;get_all&gt;. 
-              C&lt;Bugzilla::Keyword::get_all&gt; will not work.
</del><ins>+ Notes:       Note that you must call this as $class-&gt;get_all. For 
+              example, Bugzilla::Keyword-&gt;get_all. 
+              Bugzilla::Keyword::get_all will not work.
</ins><span class="cx"> 
</span><span class="cx"> =back
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaSearchClausepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Search/Clause.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Search/Clause.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Search/Clause.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -93,25 +93,29 @@
</span><span class="cx"> 
</span><span class="cx"> sub as_string {
</span><span class="cx">     my ($self) = @_;
</span><del>-    my @strings;
-    foreach my $child (@{ $self-&gt;children }) {
-        next if $child-&gt;isa(__PACKAGE__) &amp;&amp; !$child-&gt;has_translated_conditions;
-        next if $child-&gt;isa('Bugzilla::Search::Condition')
-                &amp;&amp; !$child-&gt;translated;
</del><ins>+    if (!$self-&gt;{sql}) {
+        my @strings;
+        foreach my $child (@{ $self-&gt;children }) {
+            next if $child-&gt;isa(__PACKAGE__) &amp;&amp; !$child-&gt;has_translated_conditions;
+            next if $child-&gt;isa('Bugzilla::Search::Condition')
+                    &amp;&amp; !$child-&gt;translated;
</ins><span class="cx"> 
</span><del>-        my $string = $child-&gt;as_string;
-        if ($self-&gt;joiner eq 'AND') {
-            $string = &quot;( $string )&quot; if $string =~ /OR/;
</del><ins>+            my $string = $child-&gt;as_string;
+            next unless $string;
+            if ($self-&gt;joiner eq 'AND') {
+                $string = &quot;( $string )&quot; if $string =~ /OR/;
+            }
+            else {
+                $string = &quot;( $string )&quot; if $string =~ /AND/;
+            }
+            push(@strings, $string);
</ins><span class="cx">         }
</span><del>-        else {
-            $string = &quot;( $string )&quot; if $string =~ /AND/;
-        }
-        push(@strings, $string);
</del><ins>+
+        my $sql = join(' ' . $self-&gt;joiner . ' ', @strings);
+        $sql = &quot;NOT( $sql )&quot; if $sql &amp;&amp; $self-&gt;negate;
+        $self-&gt;{sql} = $sql;
</ins><span class="cx">     }
</span><del>-    
-    my $sql = join(' ' . $self-&gt;joiner . ' ', @strings);
-    $sql = &quot;NOT( $sql )&quot; if $sql &amp;&amp; $self-&gt;negate;
-    return $sql;
</del><ins>+    return $self-&gt;{sql};
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # Search.pm converts URL parameters to Clause objects. This helps do the
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaSearchConditionpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Search/Condition.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Search/Condition.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Search/Condition.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -32,9 +32,16 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub field    { return $_[0]-&gt;{field}    }
</span><del>-sub operator { return $_[0]-&gt;{operator} }
</del><span class="cx"> sub value    { return $_[0]-&gt;{value}    }
</span><span class="cx"> 
</span><ins>+sub operator {
+    my ($self, $value) = @_;
+    if (@_ == 2) {
+        $self-&gt;{operator} = $value;
+    }
+    return $self-&gt;{operator};
+}
+
</ins><span class="cx"> sub fov {
</span><span class="cx">     my ($self) = @_;
</span><span class="cx">     return ($self-&gt;field, $self-&gt;operator, $self-&gt;value);
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaSearchQuicksearchpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Search/Quicksearch.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Search/Quicksearch.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Search/Quicksearch.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -377,9 +377,14 @@
</span><span class="cx"> 
</span><span class="cx">     # Flag and requestee shortcut
</span><span class="cx">     if ($or_operand =~ /^(?:flag:)?([^\?]+\?)([^\?]*)$/) {
</span><del>-        addChart('flagtypes.name', 'substring', $1, $negate);
-        $chart++; $and = $or = 0; # Next chart for boolean AND
-        addChart('requestees.login_name', 'substring', $2, $negate);
</del><ins>+        my ($flagtype, $requestee) = ($1, $2);
+        addChart('flagtypes.name', 'substring', $flagtype, $negate);
+        if ($requestee) {
+            # AND
+            $chart++;
+            $and = $or = 0;
+            addChart('requestees.login_name', 'substring', $requestee, $negate);
+        }
</ins><span class="cx">         return 1;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaSearchSavedpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Search/Saved.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Search/Saved.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Search/Saved.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx">     if (!$search-&gt;shared_with_group
</span><span class="cx">         or !$user-&gt;in_group($search-&gt;shared_with_group)) 
</span><span class="cx">     {
</span><del>-        ThrowUserError('missing_query', { queryname =&gt; $search-&gt;name, 
</del><ins>+        ThrowUserError('missing_query', { name =&gt; $search-&gt;name,
</ins><span class="cx">                                           sharer_id =&gt; $search-&gt;user-&gt;id });
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaSearchpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Search.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Search.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Search.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -290,12 +290,14 @@
</span><span class="cx">     },
</span><span class="cx">     dependson        =&gt; MULTI_SELECT_OVERRIDE,
</span><span class="cx">     keywords         =&gt; MULTI_SELECT_OVERRIDE,
</span><del>-    'flagtypes.name' =&gt; MULTI_SELECT_OVERRIDE,
</del><ins>+    'flagtypes.name' =&gt; {
+        _non_changed =&gt; \&amp;_flagtypes_nonchanged,
+    },
</ins><span class="cx">     longdesc =&gt; {
</span><del>-        %{ MULTI_SELECT_OVERRIDE() },
</del><span class="cx">         changedby     =&gt; \&amp;_long_desc_changedby,
</span><span class="cx">         changedbefore =&gt; \&amp;_long_desc_changedbefore_after,
</span><span class="cx">         changedafter  =&gt; \&amp;_long_desc_changedbefore_after,
</span><ins>+        _non_changed  =&gt; \&amp;_long_desc_nonchanged,
</ins><span class="cx">     },
</span><span class="cx">     'longdescs.count' =&gt; {
</span><span class="cx">         changedby     =&gt; \&amp;_long_desc_changedby,
</span><span class="lines">@@ -690,8 +692,16 @@
</span><span class="cx">     my ($self) = @_;
</span><span class="cx">     return $self-&gt;{sql} if $self-&gt;{sql};
</span><span class="cx">     my $dbh = Bugzilla-&gt;dbh;
</span><del>-    
</del><ins>+
</ins><span class="cx">     my ($joins, $clause) = $self-&gt;_charts_to_conditions();
</span><ins>+
+    if (!$clause-&gt;as_string
+        &amp;&amp; !Bugzilla-&gt;params-&gt;{'search_allow_no_criteria'}
+        &amp;&amp; !$self-&gt;{allow_unlimited})
+    {
+        ThrowUserError('buglist_parameters_required');
+    }
+
</ins><span class="cx">     my $select = join(', ', $self-&gt;_sql_select);
</span><span class="cx">     my $from = $self-&gt;_sql_from($joins);
</span><span class="cx">     my $where = $self-&gt;_sql_where($clause);
</span><span class="lines">@@ -822,28 +832,47 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # These are the columns that we're going to be actually SELECTing.
</span><ins>+sub _display_columns {
+    my ($self) = @_;
+    return @{ $self-&gt;{display_columns} } if $self-&gt;{display_columns};
+
+    # Do not alter the list from _input_columns at all, even if there are
+    # duplicated columns. Those are passed by the caller, and the caller
+    # expects to get them back in the exact same order.
+    my @columns = $self-&gt;_input_columns;
+
+    # Only add columns which are not already listed.
+    my %list = map { $_ =&gt; 1 } @columns;
+    foreach my $column ($self-&gt;_extra_columns) {
+        push(@columns, $column) unless $list{$column}++;
+    }
+    $self-&gt;{display_columns} = \@columns;
+    return @{ $self-&gt;{display_columns} };
+}
+
+# These are the columns that are involved in the query.
</ins><span class="cx"> sub _select_columns {
</span><span class="cx">     my ($self) = @_;
</span><span class="cx">     return @{ $self-&gt;{select_columns} } if $self-&gt;{select_columns};
</span><span class="cx"> 
</span><span class="cx">     my @select_columns;
</span><del>-    foreach my $column ($self-&gt;_input_columns, $self-&gt;_extra_columns) {
</del><ins>+    foreach my $column ($self-&gt;_display_columns) {
</ins><span class="cx">         if (my $add_first = COLUMN_DEPENDS-&gt;{$column}) {
</span><span class="cx">             push(@select_columns, @$add_first);
</span><span class="cx">         }
</span><span class="cx">         push(@select_columns, $column);
</span><span class="cx">     }
</span><del>-    
</del><ins>+    # Remove duplicated columns.
</ins><span class="cx">     $self-&gt;{select_columns} = [uniq @select_columns];
</span><span class="cx">     return @{ $self-&gt;{select_columns} };
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-# This takes _select_columns and translates it into the actual SQL that
</del><ins>+# This takes _display_columns and translates it into the actual SQL that
</ins><span class="cx"> # will go into the SELECT clause.
</span><span class="cx"> sub _sql_select {
</span><span class="cx">     my ($self) = @_;
</span><span class="cx">     my @sql_fields;
</span><del>-    foreach my $column ($self-&gt;_select_columns) {
</del><ins>+    foreach my $column ($self-&gt;_display_columns) {
</ins><span class="cx">         my $alias = $column;
</span><span class="cx">         # Aliases cannot contain dots in them. We convert them to underscores.
</span><span class="cx">         $alias =~ s/\./_/g;
</span><span class="lines">@@ -1172,14 +1201,7 @@
</span><span class="cx">     # SQL a bit more readable for debugging.
</span><span class="cx">     my $where = join(&quot;\n   AND &quot;, $self-&gt;_standard_where);
</span><span class="cx">     my $clause_sql = $main_clause-&gt;as_string;
</span><del>-    if ($clause_sql) {
-        $where .= &quot;\n   AND &quot; . $clause_sql;
-    }
-    elsif (!Bugzilla-&gt;params-&gt;{'search_allow_no_criteria'}
-           &amp;&amp; !$self-&gt;{allow_unlimited})
-    {
-        ThrowUserError('buglist_parameters_required');
-    }
</del><ins>+    $where .= &quot;\n   AND &quot; . $clause_sql if $clause_sql;
</ins><span class="cx">     return $where;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1670,6 +1692,7 @@
</span><span class="cx">         value      =&gt; $string_value,
</span><span class="cx">         all_values =&gt; $value,
</span><span class="cx">         joins      =&gt; [],
</span><ins>+        condition  =&gt; $condition,
</ins><span class="cx">     );
</span><span class="cx">     $search_args{quoted} = $self-&gt;_quote_unless_numeric(\%search_args);
</span><span class="cx">     # This should add a &quot;term&quot; selement to %search_args.
</span><span class="lines">@@ -1747,7 +1770,9 @@
</span><span class="cx"> sub _do_operator_function {
</span><span class="cx">     my ($self, $func_args) = @_;
</span><span class="cx">     my $operator = $func_args-&gt;{operator};
</span><del>-    my $operator_func = OPERATORS-&gt;{$operator};
</del><ins>+    my $operator_func = OPERATORS-&gt;{$operator}
+      || ThrowCodeError(&quot;search_field_operator_unsupported&quot;,
+                        { operator =&gt; $operator });
</ins><span class="cx">     $self-&gt;$operator_func($func_args);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1840,8 +1865,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub build_subselect {
</span><del>-    my ($outer, $inner, $table, $cond) = @_;
-    return &quot;$outer IN (SELECT $inner FROM $table WHERE $cond)&quot;;
</del><ins>+    my ($outer, $inner, $table, $cond, $negate) = @_;
+    # Execute subselects immediately to avoid dependent subqueries, which are
+    # large performance hits on MySql
+    my $q = &quot;SELECT DISTINCT $inner FROM $table WHERE $cond&quot;;
+    my $dbh = Bugzilla-&gt;dbh;
+    my $list = $dbh-&gt;selectcol_arrayref($q);
+    return $negate ? &quot;1=1&quot; : &quot;1=2&quot; unless @$list;
+    return $dbh-&gt;sql_in($outer, $list, $negate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # Used by anyexact to get the list of input values. This allows us to
</span><span class="lines">@@ -2029,8 +2060,8 @@
</span><span class="cx">     my ($self, $args) = @_;
</span><span class="cx">     my $value = $args-&gt;{value};
</span><span class="cx">     my $user = $self-&gt;_user;
</span><del>-    
-    if ($value =~ /^\%group/) {
</del><ins>+
+    if ($value =~ /^\%group\.[^%]+%$/) {
</ins><span class="cx">         $self-&gt;_contact_exact_group($args);
</span><span class="cx">     }
</span><span class="cx">     elsif ($value =~ /^(%\w+%)$/) {
</span><span class="lines">@@ -2047,11 +2078,17 @@
</span><span class="cx">     my $dbh = Bugzilla-&gt;dbh;
</span><span class="cx">     my $user = $self-&gt;_user;
</span><span class="cx">     
</span><ins>+    # We already know $value will match this regexp, else we wouldn't be here.
</ins><span class="cx">     $value =~ /\%group\.([^%]+)%/;
</span><del>-    my $group = Bugzilla::Group-&gt;check({ name =&gt; $1, _error =&gt; 'invalid_group_name' });
</del><ins>+    my $group_name = $1;
+    my $group = Bugzilla::Group-&gt;check({ name =&gt; $group_name, _error =&gt; 'invalid_group_name' });
+    # Pass $group_name instead of $group-&gt;name to the error message
+    # to not leak the existence of the group.
+    $user-&gt;in_group($group)
+      || ThrowUserError('invalid_group_name', { name =&gt; $group_name });
+    # Now that we know the user belongs to this group, it's safe
+    # to disclose more information.
</ins><span class="cx">     $group-&gt;check_members_are_visible();
</span><del>-    $user-&gt;in_group($group)
-      || ThrowUserError('invalid_group_name', {name =&gt; $group-&gt;name});
</del><span class="cx"> 
</span><span class="cx">     my $group_ids = Bugzilla::Group-&gt;flatten_group_membership($group-&gt;id);
</span><span class="cx">     my $table = &quot;user_group_map_$chart_id&quot;;
</span><span class="lines">@@ -2242,7 +2279,7 @@
</span><span class="cx">             my $table = $first_join-&gt;{table};
</span><span class="cx">             my $columns = &quot;bug_id&quot;;
</span><span class="cx">             $columns .= &quot;,isprivate&quot; if @{ $first_join-&gt;{extra} };
</span><del>-            my $new_table = &quot;SELECT $columns FROM $table AS $as $join_sql&quot;;
</del><ins>+            my $new_table = &quot;SELECT DISTINCT $columns FROM $table AS $as $join_sql&quot;;
</ins><span class="cx">             $first_join-&gt;{table} = &quot;($new_table)&quot;;
</span><span class="cx">             # We always want to LEFT JOIN the generated table.
</span><span class="cx">             delete $first_join-&gt;{join};
</span><span class="lines">@@ -2292,16 +2329,58 @@
</span><span class="cx">     };
</span><span class="cx">     push(@$joins, $join);
</span><span class="cx">     $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
</span><ins>+
+    # If the user is not part of the insiders group, they cannot see
+    # private comments
+    if (!$self-&gt;_user-&gt;is_insider) {
+        $args-&gt;{term} .= &quot; AND $table.isprivate = 0&quot;;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub _long_desc_nonchanged {
+    my ($self, $args) = @_;
+    my ($chart_id, $operator, $value, $joins) =
+        @$args{qw(chart_id operator value joins)};
+    my $dbh = Bugzilla-&gt;dbh;
+
+    my $table = &quot;longdescs_$chart_id&quot;;
+    my $join_args = {
+        chart_id   =&gt; $chart_id,
+        sequence   =&gt; $chart_id,
+        field      =&gt; 'longdesc',
+        full_field =&gt; &quot;$table.thetext&quot;,
+        operator   =&gt; $operator,
+        value      =&gt; $value,
+        all_values =&gt; $value,
+        quoted     =&gt; $dbh-&gt;quote($value),
+        joins      =&gt; [],
+    };
+    $self-&gt;_do_operator_function($join_args);
+
+    # If the user is not part of the insiders group, they cannot see
+    # private comments
+    if (!$self-&gt;_user-&gt;is_insider) {
+        $join_args-&gt;{term} .= &quot; AND $table.isprivate = 0&quot;;
+    }
+
+    my $join = {
+        table =&gt; 'longdescs',
+        as    =&gt; $table,
+        extra =&gt; [ $join_args-&gt;{term} ],
+    };
+    push(@$joins, $join);
+
+    $args-&gt;{term} =  &quot;$table.comment_id IS NOT NULL&quot;;
+}
+
</ins><span class="cx"> sub _content_matches {
</span><span class="cx">     my ($self, $args) = @_;
</span><span class="cx">     my ($chart_id, $joins, $fields, $operator, $value) =
</span><span class="cx">         @$args{qw(chart_id joins fields operator value)};
</span><span class="cx">     my $dbh = Bugzilla-&gt;dbh;
</span><del>-    
</del><ins>+
</ins><span class="cx">     # &quot;content&quot; is an alias for columns containing text for which we
</span><del>-    # can search a full-text index and retrieve results by relevance, 
</del><ins>+    # can search a full-text index and retrieve results by relevance,
</ins><span class="cx">     # currently just bug comments (and summaries to some degree).
</span><span class="cx">     # There's only one way to search a full-text index, so we only
</span><span class="cx">     # accept the &quot;matches&quot; operator, which is specific to full-text
</span><span class="lines">@@ -2315,9 +2394,9 @@
</span><span class="cx">     
</span><span class="cx">     # Create search terms to add to the SELECT and WHERE clauses.
</span><span class="cx">     my ($term1, $rterm1) =
</span><del>-        $dbh-&gt;sql_fulltext_search(&quot;$table.$comments_col&quot;, $value, 1);
</del><ins>+        $dbh-&gt;sql_fulltext_search(&quot;$table.$comments_col&quot;, $value);
</ins><span class="cx">     my ($term2, $rterm2) =
</span><del>-        $dbh-&gt;sql_fulltext_search(&quot;$table.short_desc&quot;, $value, 2);
</del><ins>+        $dbh-&gt;sql_fulltext_search(&quot;$table.short_desc&quot;, $value);
</ins><span class="cx">     $rterm1 = $term1 if !$rterm1;
</span><span class="cx">     $rterm2 = $term2 if !$rterm2;
</span><span class="cx"> 
</span><span class="lines">@@ -2534,6 +2613,7 @@
</span><span class="cx">     
</span><span class="cx">     my @terms;
</span><span class="cx">     foreach my $word (@words) {
</span><ins>+        next if $word eq '';
</ins><span class="cx">         $args-&gt;{value} = $word;
</span><span class="cx">         $args-&gt;{quoted} = $dbh-&gt;quote($word);
</span><span class="cx">         push(@terms, $self-&gt;_multiselect_term($args));
</span><span class="lines">@@ -2548,6 +2628,53 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub _flagtypes_nonchanged {
+    my ($self, $args) = @_;
+    my ($chart_id, $operator, $value, $joins, $condition) =
+        @$args{qw(chart_id operator value joins condition)};
+    my $dbh = Bugzilla-&gt;dbh;
+
+    # For 'not' operators, we need to negate the whole term.
+    # If you search for &quot;Flags&quot; (does not contain) &quot;approval+&quot; we actually want
+    # to return *bugs* that don't contain an approval+ flag.  Without rewriting
+    # the negation we'll search for *flags* which don't contain approval+.
+    if ($operator =~ s/^not//) {
+        $args-&gt;{operator} = $operator;
+        $condition-&gt;operator($operator);
+        $condition-&gt;negate(1);
+    }
+
+    my $subselect_args = {
+        chart_id   =&gt; $chart_id,
+        sequence   =&gt; $chart_id,
+        field      =&gt; 'flagtypes.name',
+        full_field =&gt;  $dbh-&gt;sql_string_concat(&quot;flagtypes_$chart_id.name&quot;, &quot;flags_$chart_id.status&quot;),
+        operator   =&gt; $operator,
+        value      =&gt; $value,
+        all_values =&gt; $value,
+        quoted     =&gt; $dbh-&gt;quote($value),
+        joins      =&gt; [],
+    };
+    $self-&gt;_do_operator_function($subselect_args);
+    my $subselect_term = $subselect_args-&gt;{term};
+
+    # don't call build_subselect as this must run as a true sub-select
+    $args-&gt;{term} = &quot;EXISTS (
+        SELECT 1
+          FROM bugs bugs_$chart_id
+          LEFT JOIN attachments AS attachments_$chart_id
+                    ON bugs_$chart_id.bug_id = attachments_$chart_id.bug_id
+          LEFT JOIN flags AS flags_$chart_id
+                    ON bugs_$chart_id.bug_id = flags_$chart_id.bug_id
+                       AND (flags_$chart_id.attach_id = attachments_$chart_id.attach_id
+                            OR flags_$chart_id.attach_id IS NULL)
+          LEFT JOIN flagtypes AS flagtypes_$chart_id
+                    ON flags_$chart_id.type_id = flagtypes_$chart_id.id
+     WHERE bugs_$chart_id.bug_id = bugs.bug_id
+           AND $subselect_term
+    )&quot;;
+}
+
</ins><span class="cx"> sub _multiselect_nonchanged {
</span><span class="cx">     my ($self, $args) = @_;
</span><span class="cx">     my ($chart_id, $joins, $field, $operator) =
</span><span class="lines">@@ -2625,8 +2752,7 @@
</span><span class="cx">     my $term = $args-&gt;{term};
</span><span class="cx">     $term .= $args-&gt;{_extra_where} || '';
</span><span class="cx">     my $select = $args-&gt;{_select_field} || 'bug_id';
</span><del>-    my $not_sql = $not ? &quot;NOT &quot; : '';
-    return &quot;bugs.bug_id ${not_sql}IN (SELECT $select FROM $table WHERE $term)&quot;;
</del><ins>+    return build_subselect(&quot;bugs.bug_id&quot;, $select, $table, $term, $not);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ###############################
</span><span class="lines">@@ -2701,15 +2827,14 @@
</span><span class="cx"> 
</span><span class="cx"> sub _anywordsubstr {
</span><span class="cx">     my ($self, $args) = @_;
</span><del>-    my ($full_field, $value) = @$args{qw(full_field value)};
-    
</del><ins>+
</ins><span class="cx">     my @terms = $self-&gt;_substring_terms($args);
</span><span class="cx">     $args-&gt;{term} = join(&quot;\n\tOR &quot;, @terms);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub _allwordssubstr {
</span><span class="cx">     my ($self, $args) = @_;
</span><del>-    
</del><ins>+
</ins><span class="cx">     my @terms = $self-&gt;_substring_terms($args);
</span><span class="cx">     $args-&gt;{term} = join(&quot;\n\tAND &quot;, @terms);
</span><span class="cx"> }
</span><span class="lines">@@ -2774,8 +2899,10 @@
</span><span class="cx">         extra =&gt; [&quot;$table.fieldid = $field_id&quot;,
</span><span class="cx">                   &quot;$table.bug_when $sql_operator $sql_date&quot;],
</span><span class="cx">     };
</span><ins>+
+    $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
+    $self-&gt;_changed_security_check($args, $join);
</ins><span class="cx">     push(@$joins, $join);
</span><del>-    $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub _changedfrom_changedto {
</span><span class="lines">@@ -2794,9 +2921,10 @@
</span><span class="cx">         extra =&gt; [&quot;$table.fieldid = $field_id&quot;,
</span><span class="cx">                   &quot;$table.$column = $quoted&quot;],
</span><span class="cx">     };
</span><del>-    push(@$joins, $join);
</del><span class="cx"> 
</span><span class="cx">     $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
</span><ins>+    $self-&gt;_changed_security_check($args, $join);
+    push(@$joins, $join);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub _changedby {
</span><span class="lines">@@ -2815,10 +2943,34 @@
</span><span class="cx">         extra =&gt; [&quot;$table.fieldid = $field_id&quot;,
</span><span class="cx">                   &quot;$table.who = $user_id&quot;],
</span><span class="cx">     };
</span><ins>+
+    $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
+    $self-&gt;_changed_security_check($args, $join);
</ins><span class="cx">     push(@$joins, $join);
</span><del>-    $args-&gt;{term} = &quot;$table.bug_when IS NOT NULL&quot;;
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub _changed_security_check {
+    my ($self, $args, $join) = @_;
+    my ($chart_id, $field) = @$args{qw(chart_id field)};
+
+    my $field_object = $self-&gt;_chart_fields-&gt;{$field}
+        || ThrowCodeError(&quot;invalid_field_name&quot;, { field =&gt; $field });
+    my $field_id = $field_object-&gt;id;
+
+    # If the user is not part of the insiders group, they cannot see
+    # changes to attachments (including attachment flags) that are private
+    if ($field =~ /^(?:flagtypes\.name$|attach)/ and !$self-&gt;_user-&gt;is_insider) {
+        $join-&gt;{then_to} = {
+            as    =&gt; &quot;attach_${field_id}_$chart_id&quot;,
+            table =&gt; 'attachments',
+            from  =&gt; &quot;act_${field_id}_$chart_id.attach_id&quot;,
+            to    =&gt; 'attach_id',
+        };
+
+        $args-&gt;{term} .= &quot; AND COALESCE(attach_${field_id}_$chart_id.isprivate, 0) = 0&quot;;
+    }
+}
+
</ins><span class="cx"> ######################
</span><span class="cx"> # Public Subroutines #
</span><span class="cx"> ######################
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaTemplatepm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Template.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Template.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Template.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> # Pseudo-constant.
</span><span class="cx"> sub SAFE_URL_REGEXP {
</span><span class="cx">     my $safe_protocols = join('|', SAFE_PROTOCOLS);
</span><del>-    return qr/($safe_protocols):[^\s&lt;&gt;\&quot;]+[\w\/]/i;
</del><ins>+    return qr/($safe_protocols):[^:\s&lt;&gt;\&quot;][^\s&lt;&gt;\&quot;]+[\w\/]/i;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # Convert the constants in the Bugzilla::Constants module into a hash we can
</span><span class="lines">@@ -154,8 +154,9 @@
</span><span class="cx"> # If you want to modify this routine, read the comments carefully
</span><span class="cx"> 
</span><span class="cx"> sub quoteUrls {
</span><del>-    my ($text, $bug, $comment) = (@_);
</del><ins>+    my ($text, $bug, $comment, $user) = @_;
</ins><span class="cx">     return $text unless $text;
</span><ins>+    $user ||= Bugzilla-&gt;user;
</ins><span class="cx"> 
</span><span class="cx">     # We use /g for speed, but uris can have other things inside them
</span><span class="cx">     # (http://foo/bug#3 for example). Filtering that out filters valid
</span><span class="lines">@@ -185,7 +186,7 @@
</span><span class="cx">     my @hook_regexes;
</span><span class="cx">     Bugzilla::Hook::process('bug_format_comment',
</span><span class="cx">         { text =&gt; \$text, bug =&gt; $bug, regexes =&gt; \@hook_regexes,
</span><del>-          comment =&gt; $comment });
</del><ins>+          comment =&gt; $comment, user =&gt; $user });
</ins><span class="cx"> 
</span><span class="cx">     foreach my $re (@hook_regexes) {
</span><span class="cx">         my ($match, $replace) = @$re{qw(match replace)};
</span><span class="lines">@@ -207,7 +208,7 @@
</span><span class="cx">         map { qr/$_/ } grep($_, Bugzilla-&gt;params-&gt;{'urlbase'}, 
</span><span class="cx">                             Bugzilla-&gt;params-&gt;{'sslbase'})) . ')';
</span><span class="cx">     $text =~ s~\b(${urlbase_re}\Qshow_bug.cgi?id=\E([0-9]+)(\#c([0-9]+))?)\b
</span><del>-              ~($things[$count++] = get_bug_link($3, $1, { comment_num =&gt; $5 })) &amp;&amp;
</del><ins>+              ~($things[$count++] = get_bug_link($3, $1, { comment_num =&gt; $5, user =&gt; $user })) &amp;&amp;
</ins><span class="cx">                (&quot;\0\0&quot; . ($count-1) . &quot;\0\0&quot;)
</span><span class="cx">               ~egox;
</span><span class="cx"> 
</span><span class="lines">@@ -236,7 +237,7 @@
</span><span class="cx"> 
</span><span class="cx">     # attachment links
</span><span class="cx">     $text =~ s~\b(attachment\s*\#?\s*(\d+)(?:\s+\[details\])?)
</span><del>-              ~($things[$count++] = get_attachment_link($2, $1)) &amp;&amp;
</del><ins>+              ~($things[$count++] = get_attachment_link($2, $1, $user)) &amp;&amp;
</ins><span class="cx">                (&quot;\0\0&quot; . ($count-1) . &quot;\0\0&quot;)
</span><span class="cx">               ~egmxi;
</span><span class="cx"> 
</span><span class="lines">@@ -253,7 +254,7 @@
</span><span class="cx">     $text =~ s~\b($bug_re(?:\s*,?\s*$comment_re)?|$comment_re)
</span><span class="cx">               ~ # We have several choices. $1 here is the link, and $2-4 are set
</span><span class="cx">                 # depending on which part matched
</span><del>-               (defined($2) ? get_bug_link($2, $1, { comment_num =&gt; $3 }) :
</del><ins>+               (defined($2) ? get_bug_link($2, $1, { comment_num =&gt; $3, user =&gt; $user }) :
</ins><span class="cx">                               &quot;&lt;a href=\&quot;$current_bugurl#c$4\&quot;&gt;$1&lt;/a&gt;&quot;)
</span><span class="cx">               ~egox;
</span><span class="cx"> 
</span><span class="lines">@@ -262,7 +263,7 @@
</span><span class="cx">     $text =~ s~(?&lt;=^\*\*\*\ This\ bug\ has\ been\ marked\ as\ a\ duplicate\ of\ )
</span><span class="cx">                (\d+)
</span><span class="cx">                (?=\ \*\*\*\Z)
</span><del>-              ~get_bug_link($1, $1)
</del><ins>+              ~get_bug_link($1, $1, { user =&gt; $user })
</ins><span class="cx">               ~egmx;
</span><span class="cx"> 
</span><span class="cx">     # Now remove the encoding hacks in reverse order
</span><span class="lines">@@ -276,15 +277,18 @@
</span><span class="cx"> 
</span><span class="cx"> # Creates a link to an attachment, including its title.
</span><span class="cx"> sub get_attachment_link {
</span><del>-    my ($attachid, $link_text) = @_;
</del><ins>+    my ($attachid, $link_text, $user) = @_;
</ins><span class="cx">     my $dbh = Bugzilla-&gt;dbh;
</span><ins>+    $user ||= Bugzilla-&gt;user;
</ins><span class="cx"> 
</span><span class="cx">     my $attachment = new Bugzilla::Attachment($attachid);
</span><span class="cx"> 
</span><span class="cx">     if ($attachment) {
</span><span class="cx">         my $title = &quot;&quot;;
</span><span class="cx">         my $className = &quot;&quot;;
</span><del>-        if (Bugzilla-&gt;user-&gt;can_see_bug($attachment-&gt;bug_id)) {
</del><ins>+        if ($user-&gt;can_see_bug($attachment-&gt;bug_id)
+            &amp;&amp; (!$attachment-&gt;isprivate || $user-&gt;is_insider))
+        {
</ins><span class="cx">             $title = $attachment-&gt;description;
</span><span class="cx">         }
</span><span class="cx">         if ($attachment-&gt;isobsolete) {
</span><span class="lines">@@ -324,6 +328,7 @@
</span><span class="cx"> sub get_bug_link {
</span><span class="cx">     my ($bug, $link_text, $options) = @_;
</span><span class="cx">     $options ||= {};
</span><ins>+    $options-&gt;{user} ||= Bugzilla-&gt;user;
</ins><span class="cx">     my $dbh = Bugzilla-&gt;dbh;
</span><span class="cx"> 
</span><span class="cx">     if (defined $bug) {
</span><span class="lines">@@ -700,10 +705,10 @@
</span><span class="cx">             clean_text =&gt; \&amp;Bugzilla::Util::clean_text ,
</span><span class="cx"> 
</span><span class="cx">             quoteUrls =&gt; [ sub {
</span><del>-                               my ($context, $bug, $comment) = @_;
</del><ins>+                               my ($context, $bug, $comment, $user) = @_;
</ins><span class="cx">                                return sub {
</span><span class="cx">                                    my $text = shift;
</span><del>-                                   return quoteUrls($text, $bug, $comment);
</del><ins>+                                   return quoteUrls($text, $bug, $comment, $user);
</ins><span class="cx">                                };
</span><span class="cx">                            },
</span><span class="cx">                            1
</span><span class="lines">@@ -719,10 +724,9 @@
</span><span class="cx">                           1
</span><span class="cx">                         ],
</span><span class="cx"> 
</span><del>-            bug_list_link =&gt; sub
-            {
-                my $buglist = shift;
-                return join(&quot;, &quot;, map(get_bug_link($_, $_), split(/ *, */, $buglist)));
</del><ins>+            bug_list_link =&gt; sub {
+                my ($buglist, $options) = @_;
+                return join(&quot;, &quot;, map(get_bug_link($_, $_, $options), split(/ *, */, $buglist)));
</ins><span class="cx">             },
</span><span class="cx"> 
</span><span class="cx">             # In CSV, quotes are doubled, and any value containing a quote or a
</span><span class="lines">@@ -968,7 +972,7 @@
</span><span class="cx">                 }
</span><span class="cx">                 return \@optional;
</span><span class="cx">             },
</span><del>-            'default_authorizer' =&gt; new Bugzilla::Auth(),
</del><ins>+            'default_authorizer' =&gt; sub { return Bugzilla::Auth-&gt;new() },
</ins><span class="cx">         },
</span><span class="cx">     };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaTokenpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/Token.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/Token.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/Token.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -275,13 +275,18 @@
</span><span class="cx"> 
</span><span class="cx">     # Get information about the token being canceled.
</span><span class="cx">     trick_taint($token);
</span><del>-    my ($issuedate, $tokentype, $eventdata, $userid) =
-        $dbh-&gt;selectrow_array('SELECT ' . $dbh-&gt;sql_date_format('issuedate') . ',
</del><ins>+    my ($db_token, $issuedate, $tokentype, $eventdata, $userid) =
+        $dbh-&gt;selectrow_array('SELECT token, ' . $dbh-&gt;sql_date_format('issuedate') . ',
</ins><span class="cx">                                       tokentype, eventdata, userid
</span><span class="cx">                                  FROM tokens
</span><span class="cx">                                 WHERE token = ?',
</span><span class="cx">                                 undef, $token);
</span><span class="cx"> 
</span><ins>+    # Some DBs such as MySQL are case-insensitive by default so we do
+    # a quick comparison to make sure the tokens are indeed the same.
+    (defined $db_token &amp;&amp; $db_token eq $token)
+        || ThrowCodeError(&quot;cancel_token_does_not_exist&quot;);
+
</ins><span class="cx">     # If we are canceling the creation of a new user account, then there
</span><span class="cx">     # is no entry in the 'profiles' table.
</span><span class="cx">     my $user = new Bugzilla::User($userid);
</span><span class="lines">@@ -346,10 +351,17 @@
</span><span class="cx">     $token = clean_text($token);
</span><span class="cx">     trick_taint($token);
</span><span class="cx"> 
</span><del>-    return $dbh-&gt;selectrow_array(
-        &quot;SELECT userid, &quot; . $dbh-&gt;sql_date_format('issuedate') . &quot;, eventdata 
-         FROM   tokens 
</del><ins>+    my @token_data = $dbh-&gt;selectrow_array(
+        &quot;SELECT token, userid, &quot; . $dbh-&gt;sql_date_format('issuedate') . &quot;, eventdata
+         FROM   tokens
</ins><span class="cx">          WHERE  token = ?&quot;, undef, $token);
</span><ins>+
+    # Some DBs such as MySQL are case-insensitive by default so we do
+    # a quick comparison to make sure the tokens are indeed the same.
+    my $db_token = shift @token_data;
+    return undef if (!defined $db_token || $db_token ne $token);
+
+    return @token_data;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # Deletes specified token
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaUserSettingpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/User/Setting.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/User/Setting.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/User/Setting.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -391,10 +391,10 @@
</span><span class="cx"> Params:      C&lt;$setting_name&gt; - string - the setting name
</span><span class="cx"> Returns:     boolean - true if the setting already exists in the DB.
</span><span class="cx"> 
</span><ins>+=end private
+
</ins><span class="cx"> =back
</span><span class="cx"> 
</span><del>-=end private
-
</del><span class="cx"> =head1 METHODS
</span><span class="cx"> 
</span><span class="cx"> =over 4
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaUserpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/User.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/User.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/User.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1069,7 +1069,7 @@
</span><span class="cx">                        @{$self-&gt;get_selectable_products},
</span><span class="cx">                        @{$self-&gt;get_enterable_products};
</span><span class="cx">     
</span><del>-    return [ values %products ];
</del><ins>+    return [ sort { $a-&gt;name cmp $b-&gt;name } values %products ];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub check_can_admin_product {
</span><span class="lines">@@ -1528,6 +1528,8 @@
</span><span class="cx">         my @logins;
</span><span class="cx">         for my $query (@queries) {
</span><span class="cx">             $query = trim($query);
</span><ins>+            next if $query eq '';
+
</ins><span class="cx">             my $users = match(
</span><span class="cx">                 $query,   # match string
</span><span class="cx">                 $limit,   # match limit
</span><span class="lines">@@ -2068,7 +2070,7 @@
</span><span class="cx">     my $complexity_level = Bugzilla-&gt;params-&gt;{password_complexity};
</span><span class="cx">     if ($complexity_level eq 'letters_numbers_specialchars') {
</span><span class="cx">         ThrowUserError('password_not_complex')
</span><del>-          if ($password !~ /\w/ || $password !~ /\d/ || $password !~ /[[:punct:]]/);
</del><ins>+          if ($password !~ /[[:alpha:]]/ || $password !~ /\d/ || $password !~ /[[:punct:]]/);
</ins><span class="cx">     } elsif ($complexity_level eq 'letters_numbers') {
</span><span class="cx">         ThrowUserError('password_not_complex')
</span><span class="cx">           if ($password !~ /[[:lower:]]/ || $password !~ /[[:upper:]]/ || $password !~ /\d/);
</span><span class="lines">@@ -2199,6 +2201,35 @@
</span><span class="cx"> 
</span><span class="cx"> =back
</span><span class="cx"> 
</span><ins>+=head2 Saved Recent Bug Lists
+
+=over
+
+=item C&lt;recent_searches&gt;
+
+Returns an arrayref of L&lt;Bugzilla::Search::Recent&gt; objects
+containing the user's recent searches.
+
+=item C&lt;recent_search_containing(bug_id)&gt;
+
+Returns a L&lt;Bugzilla::Search::Recent&gt; object that contains the most recent
+search by the user for the specified bug id. Retuns undef if no match is found.
+
+=item C&lt;recent_search_for(bug)&gt;
+
+Returns a L&lt;Bugzilla::Search::Recent&gt; object that contains a search by the
+user. Uses the list_id of the current loaded page, or the referrer page, and
+the bug id if that fails. Finally it will check the BUGLIST cookie, and create
+an object based on that, or undef if it does not exist.
+
+=item C&lt;save_last_search&gt;
+
+Saves the users most recent search in the database if logged in, or in the
+BUGLIST cookie if not logged in. Parameters are bug_ids, order, vars and
+list_id.
+
+=back
+
</ins><span class="cx"> =head2 Account Lockout
</span><span class="cx"> 
</span><span class="cx"> =over
</span><span class="lines">@@ -2397,7 +2428,8 @@
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;can_enter_product($product_name, $warn)&gt;
</span><span class="cx"> 
</span><del>- Description: Returns 1 if the user can enter bugs into the specified product.
</del><ins>+ Description: Returns a product object if the user can enter bugs into the
+              specified product.
</ins><span class="cx">               If the user cannot enter bugs into the product, the behavior of
</span><span class="cx">               this method depends on the value of $warn:
</span><span class="cx">               - if $warn is false (or not given), a 'false' value is returned;
</span><span class="lines">@@ -2408,7 +2440,7 @@
</span><span class="cx">                               must be thrown if the user cannot enter bugs
</span><span class="cx">                               into the specified product.
</span><span class="cx"> 
</span><del>- Returns:     1 if the user can enter bugs into the product,
</del><ins>+ Returns:     A product object if the user can enter bugs into the product,
</ins><span class="cx">               0 if the user cannot enter bugs into the product and if $warn
</span><span class="cx">               is false (an error is thrown if $warn is true).
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceBugpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Bug.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Bug.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Bug.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -399,12 +399,23 @@
</span><span class="cx"> 
</span><span class="cx"> sub search {
</span><span class="cx">     my ($self, $params) = @_;
</span><del>-    
</del><ins>+
</ins><span class="cx">     if ( defined($params-&gt;{offset}) and !defined($params-&gt;{limit}) ) {
</span><span class="cx">         ThrowCodeError('param_required', 
</span><span class="cx">                        { param =&gt; 'limit', function =&gt; 'Bug.search()' });
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+    my $max_results = Bugzilla-&gt;params-&gt;{max_search_results};
+    unless (defined $params-&gt;{limit} &amp;&amp; $params-&gt;{limit} == 0) {
+        if (!defined $params-&gt;{limit} || $params-&gt;{limit} &gt; $max_results) {
+            $params-&gt;{limit} = $max_results;
+        }
+    }
+    else {
+        delete $params-&gt;{limit};
+        delete $params-&gt;{offset};
+    }
+
</ins><span class="cx">     $params = Bugzilla::Bug::map_fields($params);
</span><span class="cx">     delete $params-&gt;{WHERE};
</span><span class="cx"> 
</span><span class="lines">@@ -431,7 +442,17 @@
</span><span class="cx">         my $clause = join(' OR ', @likes);
</span><span class="cx">         $params-&gt;{WHERE}-&gt;{&quot;($clause)&quot;} = [map { &quot;\%$_\%&quot; } @strings];
</span><span class="cx">     }
</span><del>-   
</del><ins>+
+    # If no other parameters have been passed other than limit and offset
+    # and a WHERE parameter was not created earlier, then we throw error
+    # if system is configured to do so.
+    if (!$params-&gt;{WHERE}
+        &amp;&amp; !grep(!/(limit|offset)/i, keys %$params)
+        &amp;&amp; !Bugzilla-&gt;params-&gt;{search_allow_no_criteria})
+    {
+        ThrowUserError('buglist_parameters_required');
+    }
+
</ins><span class="cx">     # We want include_fields and exclude_fields to be passed to
</span><span class="cx">     # _bug_to_hash but not to Bugzilla::Bug-&gt;match so we copy the 
</span><span class="cx">     # params and delete those before passing to Bugzilla::Bug-&gt;match.
</span><span class="lines">@@ -1997,7 +2018,60 @@
</span><span class="cx"> 
</span><span class="cx"> =back
</span><span class="cx"> 
</span><ins>+=head2 possible_duplicates
</ins><span class="cx"> 
</span><ins>+B&lt;UNSTABLE&gt;
+
+=over
+
+=item B&lt;Description&gt;
+
+Allows a user to find possible duplicate bugs based on a set of keywords
+such as a user may use as a bug summary. Optionally the search can be
+narrowed down to specific products.
+
+=item B&lt;Params&gt;
+
+=over
+
+=item C&lt;summary&gt; (string) B&lt;Required&gt; - A string of keywords defining
+the type of bug you are trying to report.
+
+=item C&lt;products&gt; (array) - One or more product names to narrow the
+duplicate search to. If omitted, all bugs are searched.
+
+=back
+
+=item B&lt;Returns&gt;
+
+The same as L&lt;/get&gt;.
+
+Note that you will only be returned information about bugs that you
+can see. Bugs that you can't see will be entirely excluded from the
+results. So, if you want to see private bugs, you will have to first 
+log in and I&lt;then&gt; call this method.
+
+=item B&lt;Errors&gt;
+
+=over
+
+=item 50 (Param Required)
+
+You must specify a value for C&lt;summary&gt; containing a string of keywords to 
+search for duplicates.
+
+=back
+
+=item B&lt;History&gt;
+
+=over
+
+=item Added in Bugzilla B&lt;4.0&gt;.
+
+=back
+
+=back
+
</ins><span class="cx"> =head2 search
</span><span class="cx"> 
</span><span class="cx"> B&lt;UNSTABLE&gt;
</span><span class="lines">@@ -2074,13 +2148,16 @@
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;limit&gt;
</span><span class="cx"> 
</span><del>-C&lt;int&gt; Limit the number of results returned to C&lt;int&gt; records.
</del><ins>+C&lt;int&gt; Limit the number of results returned to C&lt;int&gt; records. If the limit
+is more than zero and higher than the maximum limit set by the administrator,
+then the maximum limit will be used instead. If you set the limit equal to zero,
+then all matching results will be returned instead.
</ins><span class="cx"> 
</span><span class="cx"> =item C&lt;offset&gt;
</span><span class="cx"> 
</span><del>-C&lt;int&gt; Used in conjunction with the C&lt;limit&gt; argument, C&lt;offset&gt; defines 
-the starting position for the search. For example, given a search that 
-would return 100 bugs, setting C&lt;limit&gt; to 10 and C&lt;offset&gt; to 10 would return 
</del><ins>+C&lt;int&gt; Used in conjunction with the C&lt;limit&gt; argument, C&lt;offset&gt; defines
+the starting position for the search. For example, given a search that
+would return 100 bugs, setting C&lt;limit&gt; to 10 and C&lt;offset&gt; to 10 would return
</ins><span class="cx"> bugs 11 through 20 from the set of 100.
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;op_sys&gt;
</span><span class="lines">@@ -2166,11 +2243,17 @@
</span><span class="cx"> 
</span><span class="cx"> =item B&lt;Errors&gt;
</span><span class="cx"> 
</span><del>-Currently, this function doesn't throw any special errors (other than
-the ones that all webservice functions can throw). If you specify
-an invalid value for a particular field, you just won't get any results
-for that value.
</del><ins>+If you specify an invalid value for a particular field, you just won't
+get any results for that value.
</ins><span class="cx"> 
</span><ins>+=over
+
+=item 1000 (Parameters Required)
+
+You may not search without any search terms.
+
+=back
+
</ins><span class="cx"> =item B&lt;History&gt;
</span><span class="cx"> 
</span><span class="cx"> =over
</span><span class="lines">@@ -2182,6 +2265,10 @@
</span><span class="cx"> =item The C&lt;reporter&gt; input parameter was renamed to C&lt;creator&gt;
</span><span class="cx"> in Bugzilla B&lt;4.0&gt;.
</span><span class="cx"> 
</span><ins>+=item In B&lt;4.2.6&gt; and newer, added the ability to return all results if
+C&lt;limit&gt; is set equal to zero. Otherwise maximum results returned are limited
+by system configuration.
+
</ins><span class="cx"> =back
</span><span class="cx"> 
</span><span class="cx"> =back
</span><span class="lines">@@ -2198,8 +2285,9 @@
</span><span class="cx"> =item B&lt;Description&gt;
</span><span class="cx"> 
</span><span class="cx"> This allows you to create a new bug in Bugzilla. If you specify any
</span><del>-invalid fields, they will be ignored. If you specify any fields you
-are not allowed to set, they will just be set to their defaults or ignored.
</del><ins>+invalid fields, an error will be thrown stating which field is invalid.
+If you specify any fields you are not allowed to set, they will just be
+set to their defaults or ignored.
</ins><span class="cx"> 
</span><span class="cx"> You cannot currently set all the items here that you can set on enter_bug.cgi.
</span><span class="cx"> 
</span><span class="lines">@@ -2391,7 +2479,9 @@
</span><span class="cx"> 
</span><span class="cx"> =item C&lt;data&gt;
</span><span class="cx"> 
</span><del>-B&lt;Required&gt; C&lt;base64&gt; The content of the attachment.
</del><ins>+B&lt;Required&gt; C&lt;base64&gt; or C&lt;string&gt; The content of the attachment.
+If the content of the attachment is not ASCII text, you must encode
+it in base64 and declare it as the C&lt;base64&gt; type.
</ins><span class="cx"> 
</span><span class="cx"> =item C&lt;file_name&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceConstantspm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Constants.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Constants.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Constants.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -166,7 +166,11 @@
</span><span class="cx">     group_exists =&gt; 801,
</span><span class="cx">     empty_group_description =&gt; 802,
</span><span class="cx">     invalid_regexp =&gt; 803,
</span><ins>+    invalid_group_name =&gt; 804,
</ins><span class="cx"> 
</span><ins>+    # Search errors are 1000-1100
+    buglist_parameters_required =&gt; 1000,
+
</ins><span class="cx">     # Errors thrown by the WebService itself. The ones that are negative 
</span><span class="cx">     # conform to http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php
</span><span class="cx">     xmlrpc_invalid_value =&gt; -32600,
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceServerXMLRPCpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server/XMLRPC.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server/XMLRPC.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server/XMLRPC.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -61,9 +61,17 @@
</span><span class="cx"> 
</span><span class="cx">     # XMLRPC::Transport::HTTP::CGI doesn't know about Bugzilla carrying around
</span><span class="cx">     # its cookies in Bugzilla::CGI, so we need to copy them over.
</span><del>-    foreach (@{Bugzilla-&gt;cgi-&gt;{'Bugzilla_cookie_list'}}) {
-        $self-&gt;response-&gt;headers-&gt;push_header('Set-Cookie', $_);
</del><ins>+    foreach my $cookie (@{Bugzilla-&gt;cgi-&gt;{'Bugzilla_cookie_list'}}) {
+        $self-&gt;response-&gt;headers-&gt;push_header('Set-Cookie', $cookie);
</ins><span class="cx">     }
</span><ins>+
+    # Copy across security related headers from Bugzilla::CGI
+    foreach my $header (split(/[\r\n]+/, Bugzilla-&gt;cgi-&gt;header)) {
+        my ($name, $value) = $header =~ /^([^:]+): (.*)/;
+        if (!$self-&gt;response-&gt;headers-&gt;header($name)) {
+           $self-&gt;response-&gt;headers-&gt;header($name =&gt; $value);
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub handle_login {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceServerpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Server.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -25,6 +25,9 @@
</span><span class="cx"> 
</span><span class="cx"> sub handle_login {
</span><span class="cx">     my ($self, $class, $method, $full_method) = @_;
</span><ins>+    # Throw error if the supplied class does not exist or the method is private
+    ThrowCodeError('unknown_method', {method =&gt; $full_method}) if (!$class or $method =~ /^_/);
+
</ins><span class="cx">     eval &quot;require $class&quot;;
</span><span class="cx">     ThrowCodeError('unknown_method', {method =&gt; $full_method}) if $@;
</span><span class="cx">     return if ($class-&gt;login_exempt($method) 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceUserpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/User.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/User.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/User.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -233,13 +233,19 @@
</span><span class="cx">     # If no groups are specified, we return all users.
</span><span class="cx">     return $users if (!$group_ids and !$group_names);
</span><span class="cx"> 
</span><ins>+    my $user = Bugzilla-&gt;user;
+
</ins><span class="cx">     my @groups = map { Bugzilla::Group-&gt;check({ id =&gt; $_ }) } 
</span><span class="cx">                      @{ $group_ids || [] };
</span><del>-    my @name_groups = map { Bugzilla::Group-&gt;check($_) } 
-                          @{ $group_names || [] };
-    push(@groups, @name_groups);
-    
</del><span class="cx"> 
</span><ins>+    if ($group_names) {
+        foreach my $name (@$group_names) {
+            my $group = Bugzilla::Group-&gt;check({ name =&gt; $name, _error =&gt; 'invalid_group_name' });
+            $user-&gt;in_group($group) || ThrowUserError('invalid_group_name', { name =&gt; $name });
+            push(@groups, $group);
+        }
+    }
+
</ins><span class="cx">     my @in_group = grep { $self-&gt;_user_in_any_group($_, \@groups) }
</span><span class="cx">                         @$users;
</span><span class="cx">     return \@in_group;
</span><span class="lines">@@ -586,10 +592,10 @@
</span><span class="cx"> 
</span><span class="cx"> =over
</span><span class="cx"> 
</span><del>-=item 51 (Bad Login Name or Group Name)
</del><ins>+=item 51 (Bad Login Name or Group ID)
</ins><span class="cx"> 
</span><span class="cx"> You passed an invalid login name in the &quot;names&quot; array or a bad
</span><del>-group name/id in the C&lt;groups&gt;/C&lt;group_ids&gt; arguments.
</del><ins>+group ID in the C&lt;group_ids&gt; argument.
</ins><span class="cx"> 
</span><span class="cx"> =item 304 (Authorization Required)
</span><span class="cx"> 
</span><span class="lines">@@ -601,6 +607,11 @@
</span><span class="cx"> Logged-out users cannot use the &quot;ids&quot; or &quot;match&quot; arguments to this 
</span><span class="cx"> function.
</span><span class="cx"> 
</span><ins>+=item 804 (Invalid Group Name)
+
+You passed a group name in the C&lt;groups&gt; argument which either does not
+exist or you do not belong to it.
+
</ins><span class="cx"> =back
</span><span class="cx"> 
</span><span class="cx"> =item B&lt;History&gt;
</span><span class="lines">@@ -614,6 +625,9 @@
</span><span class="cx"> =item C&lt;include_disabled&gt; added in Bugzilla B&lt;4.0&gt;. Default behavior 
</span><span class="cx"> for C&lt;match&gt; has changed to only returning enabled accounts.
</span><span class="cx"> 
</span><ins>+=item Error 804 has been added in Bugzilla 4.0.9 and 4.2.4. It's now
+illegal to pass a group name you don't belong to.
+
</ins><span class="cx"> =back
</span><span class="cx"> 
</span><span class="cx"> =back
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillaWebServiceUtilpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Util.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Util.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla/WebService/Util.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -143,7 +143,7 @@
</span><span class="cx"> 
</span><span class="cx"> =head2 validate
</span><span class="cx"> 
</span><del>-This helps in the validation of parameters passed into the WebSerice
</del><ins>+This helps in the validation of parameters passed into the WebService
</ins><span class="cx"> methods. Currently it converts listed parameters into an array reference
</span><span class="cx"> if the client only passed a single scalar value. It modifies the parameters
</span><span class="cx"> hash in place so other parameters should be unaltered.
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgBugzillapm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/Bugzilla.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/Bugzilla.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/Bugzilla.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -592,7 +592,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return $do_by_name ? \%requested : [values %requested];
</del><ins>+    return $do_by_name ? \%requested
+        : [sort { $a-&gt;sortkey &lt;=&gt; $b-&gt;sortkey || $a-&gt;name cmp $b-&gt;name } values %requested];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub active_custom_fields {
</span><span class="lines">@@ -847,7 +848,7 @@
</span><span class="cx"> =item C&lt;by_name&gt;
</span><span class="cx"> 
</span><span class="cx"> If false (or not specified), this method will return an arrayref of
</span><del>-the requested fields. The order of the returned fields is random.
</del><ins>+the requested fields.
</ins><span class="cx"> 
</span><span class="cx"> If true, this method will return a hashref of fields, where the keys
</span><span class="cx"> are field names and the valules are L&lt;Bugzilla::Field&gt; objects.
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgattachmentcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/attachment.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/attachment.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/attachment.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -432,8 +432,7 @@
</span><span class="cx">     }
</span><span class="cx">     print $cgi-&gt;header(-type=&gt;&quot;$contenttype; name=\&quot;$filename\&quot;&quot;,
</span><span class="cx">                        -content_disposition=&gt; &quot;$disposition; filename=\&quot;$filename\&quot;&quot;,
</span><del>-                       -content_length =&gt; $attachment-&gt;datasize,
-                       -x_content_type_options =&gt; &quot;nosniff&quot;);
</del><ins>+                       -content_length =&gt; $attachment-&gt;datasize);
</ins><span class="cx">     disable_utf8();
</span><span class="cx">     print $attachment-&gt;data;
</span><span class="cx"> }
</span><span class="lines">@@ -733,20 +732,23 @@
</span><span class="cx">         $attachment-&gt;set_filename(scalar $cgi-&gt;param('filename'));
</span><span class="cx"> 
</span><span class="cx">         # Now make sure the attachment has not been edited since we loaded the page.
</span><del>-        if (defined $cgi-&gt;param('delta_ts')
-            &amp;&amp; $cgi-&gt;param('delta_ts') ne $attachment-&gt;modification_time)
-        {
</del><ins>+        my $delta_ts = $cgi-&gt;param('delta_ts');
+        my $modification_time = $attachment-&gt;modification_time;
+
+        if ($delta_ts &amp;&amp; $delta_ts ne $modification_time) {
+            datetime_from($delta_ts)
+              or ThrowCodeError('invalid_timestamp', { timestamp =&gt; $delta_ts });
</ins><span class="cx">             ($vars-&gt;{'operations'}) =
</span><del>-                Bugzilla::Bug::GetBugActivity($bug-&gt;id, $attachment-&gt;id, $cgi-&gt;param('delta_ts'));
</del><ins>+              Bugzilla::Bug::GetBugActivity($bug-&gt;id, $attachment-&gt;id, $delta_ts);
</ins><span class="cx"> 
</span><del>-            # The token contains the old modification_time. We need a new one.
-            $cgi-&gt;param('token', issue_hash_token([$attachment-&gt;id, $attachment-&gt;modification_time]));
-
</del><span class="cx">             # If the modification date changed but there is no entry in
</span><span class="cx">             # the activity table, this means someone commented only.
</span><span class="cx">             # In this case, there is no reason to midair.
</span><span class="cx">             if (scalar(@{$vars-&gt;{'operations'}})) {
</span><del>-                $cgi-&gt;param('delta_ts', $attachment-&gt;modification_time);
</del><ins>+                $cgi-&gt;param('delta_ts', $modification_time);
+                # The token contains the old modification_time. We need a new one.
+                $cgi-&gt;param('token', issue_hash_token([$attachment-&gt;id, $modification_time]));
+
</ins><span class="cx">                 $vars-&gt;{'attachment'} = $attachment;
</span><span class="cx"> 
</span><span class="cx">                 print $cgi-&gt;header();
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgbuglistcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/buglist.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/buglist.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/buglist.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -64,7 +64,6 @@
</span><span class="cx"> my $user = Bugzilla-&gt;login();
</span><span class="cx"> 
</span><span class="cx"> if (length($buffer) == 0) {
</span><del>-    print $cgi-&gt;header(-refresh=&gt; '10; URL=query.cgi');
</del><span class="cx">     ThrowUserError(&quot;buglist_parameters_required&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -141,7 +140,7 @@
</span><span class="cx">     &amp;&amp; exists $ENV{'HTTP_USER_AGENT'} 
</span><span class="cx">       &amp;&amp; $ENV{'HTTP_USER_AGENT'} =~ /Mozilla.[3-9]/ 
</span><span class="cx">         &amp;&amp; (($ENV{'HTTP_USER_AGENT'} !~ /[Cc]ompatible/) || ($ENV{'HTTP_USER_AGENT'} =~ /MSIE 5.*Mac_PowerPC/))
</span><del>-          &amp;&amp; $ENV{'HTTP_USER_AGENT'} !~ /WebKit/
</del><ins>+          &amp;&amp; $ENV{'HTTP_USER_AGENT'} !~ /(?:WebKit|Trident|KHTML)/
</ins><span class="cx">             &amp;&amp; !$agent
</span><span class="cx">               &amp;&amp; !defined($cgi-&gt;param('serverpush'))
</span><span class="cx">                 || $cgi-&gt;param('serverpush');
</span><span class="lines">@@ -213,7 +212,7 @@
</span><span class="cx">     Bugzilla-&gt;login(LOGIN_REQUIRED);
</span><span class="cx"> 
</span><span class="cx">     my $query = Bugzilla::Search::Saved-&gt;check(
</span><del>-        { user =&gt; $sharer_id, name =&gt; $name });
</del><ins>+        { user =&gt; $sharer_id, name =&gt; $name, _error =&gt; 'missing_query' });
</ins><span class="cx"> 
</span><span class="cx">     $query-&gt;url
</span><span class="cx">        || ThrowUserError(&quot;buglist_parameters_required&quot;);
</span><span class="lines">@@ -452,7 +451,9 @@
</span><span class="cx">         # Generate and return the UI (HTML page) from the appropriate template.
</span><span class="cx">         $vars-&gt;{'message'} = &quot;buglist_query_gone&quot;;
</span><span class="cx">         $vars-&gt;{'namedcmd'} = $qname;
</span><del>-        $vars-&gt;{'url'} = &quot;buglist.cgi?newquery=&quot; . url_quote($buffer) . &quot;&amp;cmdtype=doit&amp;remtype=asnamed&amp;newqueryname=&quot; . url_quote($qname);
</del><ins>+        $vars-&gt;{'url'} = &quot;buglist.cgi?newquery=&quot; . url_quote($buffer)
+                         . &quot;&amp;cmdtype=doit&amp;remtype=asnamed&amp;newqueryname=&quot; . url_quote($qname)
+                         . &quot;&amp;token=&quot; . url_quote(issue_hash_token(['savedsearch']));
</ins><span class="cx">         $template-&gt;process(&quot;global/message.html.tmpl&quot;, $vars)
</span><span class="cx">           || ThrowTemplateError($template-&gt;error());
</span><span class="cx">         exit;
</span><span class="lines">@@ -461,6 +462,10 @@
</span><span class="cx"> elsif (($cmdtype eq &quot;doit&quot;) &amp;&amp; defined $cgi-&gt;param('remtype')) {
</span><span class="cx">     if ($cgi-&gt;param('remtype') eq &quot;asdefault&quot;) {
</span><span class="cx">         $user = Bugzilla-&gt;login(LOGIN_REQUIRED);
</span><ins>+        my $token = $cgi-&gt;param('token');
+        check_hash_token($token, ['searchknob']);
+        $buffer = $params-&gt;canonicalise_query('cmdtype', 'remtype',
+                                              'query_based_on', 'token');
</ins><span class="cx">         InsertNamedQuery(DEFAULT_QUERY_NAME, $buffer);
</span><span class="cx">         $vars-&gt;{'message'} = &quot;buglist_new_default_query&quot;;
</span><span class="cx">     }
</span><span class="lines">@@ -783,7 +788,7 @@
</span><span class="cx"> 
</span><span class="cx"> if ($cgi-&gt;param('debug')
</span><span class="cx">     &amp;&amp; Bugzilla-&gt;params-&gt;{debug_group}
</span><del>-    &amp;&amp; Bugzilla-&gt;user-&gt;in_group(Bugzilla-&gt;params-&gt;{debug_group})
</del><ins>+    &amp;&amp; $user-&gt;in_group(Bugzilla-&gt;params-&gt;{debug_group})
</ins><span class="cx"> ) {
</span><span class="cx">     $vars-&gt;{'debug'} = 1;
</span><span class="cx">     $vars-&gt;{'query'} = $query;
</span><span class="lines">@@ -1115,7 +1120,8 @@
</span><span class="cx"> 
</span><span class="cx"> # Set 'urlquerypart' once the buglist ID is known.
</span><span class="cx"> $vars-&gt;{'urlquerypart'} = $params-&gt;canonicalise_query('order', 'cmdtype',
</span><del>-                                                      'query_based_on');
</del><ins>+                                                      'query_based_on',
+                                                      'token');
</ins><span class="cx"> 
</span><span class="cx"> if ($format-&gt;{'extension'} eq &quot;csv&quot;) {
</span><span class="cx">     # We set CSV files to be downloaded, as they are designed for importing
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgcontribbz_webservice_demopl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/contrib/bz_webservice_demo.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/contrib/bz_webservice_demo.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/contrib/bz_webservice_demo.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -287,25 +287,33 @@
</span><span class="cx"> 
</span><span class="cx"> =head2 Retrieving Product Information
</span><span class="cx"> 
</span><del>-Call C&lt;Product.get_product&gt; with the name of the product you want to know more
-of.
</del><ins>+Call C&lt;Product.get&gt; with the name of the product you want to know more of.
</ins><span class="cx"> The call will return a C&lt;Bugzilla::Product&gt; object.
</span><span class="cx"> 
</span><span class="cx"> =cut
</span><span class="cx"> 
</span><span class="cx"> if ($product_name) {
</span><del>-    $soapresult = $proxy-&gt;call('Product.get_product', $product_name);
</del><ins>+    $soapresult = $proxy-&gt;call('Product.get', {'names' =&gt; [$product_name]});
</ins><span class="cx">     _die_on_fault($soapresult);
</span><del>-    $result = $soapresult-&gt;result;
</del><ins>+    $result = $soapresult-&gt;result()-&gt;{'products'}-&gt;[0];
</ins><span class="cx"> 
</span><del>-    if (ref($result) eq 'HASH') {
-        foreach (keys(%$result)) {
-            print &quot;$_: $$result{$_}\n&quot;;
</del><ins>+    # Iterate all entries, the values may be scalars or array refs with hash refs.
+    foreach my $key (sort(keys %$result)) {
+      my $value = $result-&gt;{$key};
+
+      if (ref($value)) {
+        my $counter = 0;
+        foreach my $hash (@$value) {
+          while (my ($innerKey, $innerValue) = each %$hash) {
+            print &quot;$key.$counter.$innerKey: $innerValue\n&quot;;
+          }
+          ++$counter;
</ins><span class="cx">         }
</span><ins>+      }
+      else {
+        print &quot;$key: $value\n&quot;
+      }
</ins><span class="cx">     }
</span><del>-    else {
-        print &quot;$result\n&quot;;
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> =head2 Creating A Bug
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgcontribconvertworkflowpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/contrib/convert-workflow.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/contrib/convert-workflow.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/contrib/convert-workflow.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -20,7 +20,6 @@
</span><span class="cx"> #   Max Kanat-Alexander &lt;mkanat@bugzilla.org&gt;
</span><span class="cx"> 
</span><span class="cx"> use strict;
</span><del>-use warnings;
</del><span class="cx"> use lib qw(. lib);
</span><span class="cx"> 
</span><span class="cx"> use Bugzilla;
</span><span class="lines">@@ -82,6 +81,8 @@
</span><span class="cx"> foreach my $pair (@translation) {
</span><span class="cx">     my ($from, $to) = @$pair;
</span><span class="cx">     print &quot;Converting $from to $to...\n&quot;;
</span><ins>+    # There is no FK on bugs.bug_status pointing to bug_status.value,
+    # so it's fine to update the bugs table first.
</ins><span class="cx">     $dbh-&gt;do('UPDATE bugs SET bug_status = ? WHERE bug_status = ?',
</span><span class="cx">              undef, $to, $from);
</span><span class="cx"> 
</span><span class="lines">@@ -103,11 +104,53 @@
</span><span class="cx"> 
</span><span class="cx">     # If the new status already exists, just delete the old one, but retain
</span><span class="cx">     # the workflow items from it.
</span><del>-    if (my $existing = new Bugzilla::Status({ name =&gt; $to })) {
</del><ins>+    my $new_status = new Bugzilla::Status({ name =&gt; $to });
+    my $old_status = new Bugzilla::Status({ name =&gt; $from });
+
+    if ($new_status &amp;&amp; $old_status) {
+        my $to_id = $new_status-&gt;id;
+        my $from_id = $old_status-&gt;id;
+        # The subselect collects existing transitions from the target bug status.
+        # The main select collects existing transitions from the renamed bug status.
+        # The diff tells us which transitions are missing from the target bug status.
+        my $missing_transitions =
+          $dbh-&gt;selectcol_arrayref('SELECT sw1.new_status
+                                      FROM status_workflow sw1
+                                     WHERE sw1.old_status = ?
+                                       AND sw1.new_status NOT IN (SELECT sw2.new_status
+                                                                    FROM status_workflow sw2
+                                                                   WHERE sw2.old_status = ?)',
+                                     undef, ($from_id, $to_id));
+
+        $dbh-&gt;do('UPDATE status_workflow SET old_status = ? WHERE old_status = ? AND '
+                 . $dbh-&gt;sql_in('new_status', $missing_transitions),
+                 undef, ($to_id, $from_id)) if @$missing_transitions;
+
+        # The subselect collects existing transitions to the target bug status.
+        # The main select collects existing transitions to the renamed bug status.
+        # The diff tells us which transitions are missing to the target bug status.
+        # We have to explicitly exclude NULL from the subselect, because NOT IN
+        # doesn't know what to do with it (neither true nor false) and no data is returned.
+        $missing_transitions =
+          $dbh-&gt;selectcol_arrayref('SELECT sw1.old_status
+                                      FROM status_workflow sw1
+                                     WHERE sw1.new_status = ?
+                                       AND sw1.old_status NOT IN (SELECT sw2.old_status
+                                                                    FROM status_workflow sw2
+                                                                   WHERE sw2.new_status = ?
+                                                                     AND sw2.old_status IS NOT NULL)',
+                                     undef, ($from_id, $to_id));
+
+        $dbh-&gt;do('UPDATE status_workflow SET new_status = ? WHERE new_status = ? AND '
+                 . $dbh-&gt;sql_in('old_status', $missing_transitions),
+                 undef, ($to_id, $from_id)) if @$missing_transitions;
+
+        # Delete rows where old_status = new_status, and then the old status itself.
+        $dbh-&gt;do('DELETE FROM status_workflow WHERE old_status = new_status');
</ins><span class="cx">         $dbh-&gt;do('DELETE FROM bug_status WHERE value = ?', undef, $from);
</span><span class="cx">     }
</span><span class="cx">     # Otherwise, rename the old status to the new one.
</span><del>-    else {
</del><ins>+    elsif ($old_status) {
</ins><span class="cx">         $dbh-&gt;do('UPDATE bug_status SET value = ? WHERE value = ?',
</span><span class="cx">                  undef, $to, $from);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmlBugzillaGuidexml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/Bugzilla-Guide.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/Bugzilla-Guide.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/Bugzilla-Guide.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -32,10 +32,10 @@
</span><span class="cx">      For a devel release, simple bump bz-ver and bz-date
</span><span class="cx"> --&gt;
</span><span class="cx"> 
</span><del>-&lt;!ENTITY bz-ver &quot;4.2.1&quot;&gt;
</del><ins>+&lt;!ENTITY bz-ver &quot;4.2.7&quot;&gt;
</ins><span class="cx"> &lt;!ENTITY bz-nextver &quot;4.4&quot;&gt;
</span><del>-&lt;!ENTITY bz-date &quot;2012-04-18&quot;&gt;
-&lt;!ENTITY current-year &quot;2012&quot;&gt;
</del><ins>+&lt;!ENTITY bz-date &quot;2013-10-16&quot;&gt;
+&lt;!ENTITY current-year &quot;2013&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;!ENTITY landfillbase &quot;http://landfill.bugzilla.org/bugzilla-4.2-branch/&quot;&gt;
</span><span class="cx"> &lt;!ENTITY bz &quot;http://www.bugzilla.org/&quot;&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmladministrationxml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/administration.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/administration.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/administration.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1056,7 +1056,7 @@
</span><span class="cx">             &lt;para&gt;
</span><span class="cx">             &lt;emphasis&gt;Login Name&lt;/emphasis&gt;: 
</span><span class="cx">             This is generally the user's full email address. However, if you
</span><del>-            have are using the &lt;quote&gt;emailsuffix&lt;/quote&gt; parameter, this may
</del><ins>+            are using the &lt;quote&gt;emailsuffix&lt;/quote&gt; parameter, this may
</ins><span class="cx">             just be the user's login name. Note that users can now change their
</span><span class="cx">             login names themselves (to any valid email address).
</span><span class="cx">             &lt;/para&gt;
</span><span class="lines">@@ -2425,37 +2425,72 @@
</span><span class="cx">               &lt;emphasis&gt;Type:&lt;/emphasis&gt;
</span><span class="cx">               The type of field to create. There are
</span><span class="cx">               several types available:
</span><del>-               &lt;simplelist&gt;
-                 &lt;member&gt;
-                   Bug ID: A field where you can enter the ID of another bug from
-                   the same Bugzilla installation. To point to a bug in a remote
-                   installation, use the See Also field instead.
-                 &lt;/member&gt;
-                 &lt;member&gt;
-                   Large Text Box: A multiple line box for entering free text.
-                 &lt;/member&gt;
-                 &lt;member&gt;
-                   Free Text: A single line box for entering free text.
-                 &lt;/member&gt;
-                 &lt;member&gt;
-                   Multiple-Selection Box: A list box where multiple options 
-                   can be selected. After creating this field, it must be edited
-                   to add the selection options. See 
-                   &lt;xref linkend=&quot;edit-values-list&quot; /&gt; for information about 
-                   editing legal values.
-                 &lt;/member&gt;
-                 &lt;member&gt;
-                   Drop Down: A list box where only one option can be selected.
-                   After creating this field, it must be edited to add the
-                   selection options. See 
-                   &lt;xref linkend=&quot;edit-values-list&quot; /&gt; for information about 
-                   editing legal values.
-                 &lt;/member&gt;
-                 &lt;member&gt;
-                   Date/Time: A date field. This field appears with a 
-                   calendar widget for choosing the date.
-                 &lt;/member&gt;
-               &lt;/simplelist&gt;
</del><ins>+              &lt;variablelist&gt;
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Bug ID:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A field where you can enter the ID of another bug from
+                      the same Bugzilla installation. To point to a bug in a remote
+                      installation, use the See Also field instead.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Large Text Box:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A multiple line box for entering free text.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Free Text:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A single line box for entering free text.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Multiple-Selection Box:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A list box where multiple options
+                      can be selected. After creating this field, it must be edited
+                      to add the selection options. See
+                      &lt;xref linkend=&quot;edit-values-list&quot; /&gt; for information about
+                      editing legal values.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Drop Down:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A list box where only one option can be selected.
+                      After creating this field, it must be edited to add the
+                      selection options. See
+                      &lt;xref linkend=&quot;edit-values-list&quot; /&gt; for information about
+                      editing legal values.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+
+                &lt;varlistentry&gt;
+                  &lt;term&gt;Date/Time:&lt;/term&gt;
+                  &lt;listitem&gt;
+                    &lt;para&gt;
+                      A date field. This field appears with a
+                      calendar widget for choosing the date.
+                    &lt;/para&gt;
+                  &lt;/listitem&gt;
+                &lt;/varlistentry&gt;
+              &lt;/variablelist&gt;
</ins><span class="cx">             &lt;/para&gt;
</span><span class="cx">           &lt;/listitem&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmlcustomizationxml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/customization.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/customization.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/customization.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -110,14 +110,14 @@
</span><span class="cx">         The first method of making customizations is to directly edit the
</span><span class="cx">         templates found in &lt;filename&gt;template/en/default&lt;/filename&gt;.
</span><span class="cx">         This is probably the best way to go about it if you are going to
</span><del>-        be upgrading Bugzilla through CVS, because if you then execute
-        a &lt;command&gt;cvs update&lt;/command&gt;, any changes you have made will
</del><ins>+        be upgrading Bugzilla through Bzr, because if you then execute
+        a &lt;command&gt;bzr update&lt;/command&gt;, any changes you have made will
</ins><span class="cx">         be merged automagically with the updated versions.
</span><span class="cx">       &lt;/para&gt;
</span><span class="cx"> 
</span><span class="cx">       &lt;note&gt;
</span><span class="cx">         &lt;para&gt;
</span><del>-          If you use this method, and CVS conflicts occur during an
</del><ins>+          If you use this method, and Bzr conflicts occur during an
</ins><span class="cx">           update, the conflicted templates (and possibly other parts
</span><span class="cx">           of your installation) will not work until they are resolved.
</span><span class="cx">         &lt;/para&gt;
</span><span class="lines">@@ -143,7 +143,7 @@
</span><span class="cx">         The second method of customization should be used if you 
</span><span class="cx">         use the overwriting method of upgrade, because otherwise 
</span><span class="cx">         your changes will be lost.  This method may also be better if
</span><del>-        you are using the CVS method of upgrading and are going to make major
</del><ins>+        you are using the Bzr method of upgrading and are going to make major
</ins><span class="cx">         changes, because it is guaranteed that the contents of this directory
</span><span class="cx">         will not be touched during an upgrade, and you can then decide whether
</span><span class="cx">         to continue using your own templates, or make the effort to merge your
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmlinstallationxml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/installation.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/installation.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/installation.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -191,8 +191,8 @@
</span><span class="cx"> 
</span><span class="cx">       &lt;para&gt;
</span><span class="cx">         &lt;ulink url=&quot;http://www.bugzilla.org/download/&quot;&gt;Download a Bugzilla tarball&lt;/ulink&gt;
</span><del>-        (or check it out from CVS) and place
-        it in a suitable directory, accessible by the default web server user 
</del><ins>+        (or &lt;ulink url=&quot;https://wiki.mozilla.org/Bugzilla:Bzr&quot;&gt;check it out from Bzr&lt;/ulink&gt;)
+        and place it in a suitable directory, accessible by the default web server user
</ins><span class="cx">         (probably &lt;quote&gt;apache&lt;/quote&gt; or &lt;quote&gt;www&lt;/quote&gt;). 
</span><span class="cx">         Good locations are either directly in the web server's document directories or
</span><span class="cx">         in &lt;filename&gt;/usr/local&lt;/filename&gt; with a symbolic link to the web server's 
</span><span class="lines">@@ -1582,35 +1582,8 @@
</span><span class="cx"> C:\perl&amp;gt; &lt;command&gt;ppm install &amp;lt;module name&amp;gt;&lt;/command&gt;
</span><span class="cx">         &lt;/programlisting&gt;
</span><span class="cx"> 
</span><del>-        &lt;para&gt;
-          The best source for the Windows PPM modules needed for Bugzilla
-          is probably the theory58S website, which you can add to your list
-          of repositories as follows (for Perl 5.8.x):
-        &lt;/para&gt;
-
-        &lt;programlisting&gt;
-&lt;command&gt;ppm repo add theory58S http://theoryx5.uwinnipeg.ca/ppms/&lt;/command&gt;
-        &lt;/programlisting&gt;
-
-        &lt;para&gt;
-          If you are using Perl 5.10.x, you cannot use the same PPM modules as Perl
-          5.8.x as they are incompatible. In this case, you should add the following
-          repository:
-        &lt;/para&gt;
-        &lt;programlisting&gt;
-&lt;command&gt;ppm repo add theory58S http://cpan.uwinnipeg.ca/PPMPackages/10xx/&lt;/command&gt;
-        &lt;/programlisting&gt;
-
</del><span class="cx">         &lt;note&gt;
</span><span class="cx">           &lt;para&gt;
</span><del>-            In versions prior to 5.8.8 build 819 of PPM the command is 
-            &lt;programlisting&gt;
-&lt;command&gt;ppm repository add theory58S http://theoryx5.uwinnipeg.ca/ppms/&lt;/command&gt;
-            &lt;/programlisting&gt;
-          &lt;/para&gt;
-        &lt;/note&gt;
-        &lt;note&gt;
-          &lt;para&gt;
</del><span class="cx">             The PPM repository stores modules in 'packages' that may have
</span><span class="cx">             a slightly different name than the module.  If retrieving these
</span><span class="cx">             modules from there, you will need to pay attention to the information
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmlmodulesxml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/modules.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/modules.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/modules.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -42,10 +42,8 @@
</span><span class="cx">       &lt;para&gt;
</span><span class="cx">         Running Bugzilla on Windows requires the use of ActiveState
</span><span class="cx">         Perl 5.8.1 or higher. Many modules already exist in the core
</span><del>-        distribution of ActiveState Perl. Additional modules can be downloaded
-        from &lt;ulink url=&quot;http://theoryx5.uwinnipeg.ca/ppms/&quot; /&gt; if you use
-        Perl 5.8.x or from &lt;ulink url=&quot;http://cpan.uwinnipeg.ca/PPMPackages/10xx/&quot; /&gt;
-        if you use Perl 5.10.x.
</del><ins>+        distribution of ActiveState Perl. If some modules are missing, upgrade
+        ActiveState Perl to at least 5.12; it has all the required modules.
</ins><span class="cx">       &lt;/para&gt;
</span><span class="cx">     &lt;/note&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgdocsenxmlusingxml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/docs/en/xml/using.xml (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/docs/en/xml/using.xml        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/docs/en/xml/using.xml        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -125,58 +125,108 @@
</span><span class="cx">     &lt;orderedlist&gt;
</span><span class="cx">       &lt;listitem&gt;
</span><span class="cx">         &lt;para&gt;
</span><del>-        &lt;emphasis&gt;Product and Component&lt;/emphasis&gt;: 
-        Bugs are divided up by Product and Component, with a Product
-        having one or more Components in it. For example,
-        bugzilla.mozilla.org's &quot;Bugzilla&quot; Product is composed of several
-        Components: 
-        &lt;simplelist&gt;
-        &lt;member&gt;
-        &lt;emphasis&gt;Administration:&lt;/emphasis&gt;
-        Administration of a Bugzilla installation.&lt;/member&gt;
</del><ins>+          &lt;emphasis&gt;Product and Component&lt;/emphasis&gt;: 
+          Bugs are divided up by Product and Component, with a Product
+          having one or more Components in it. For example,
+          bugzilla.mozilla.org's &quot;Bugzilla&quot; Product is composed of several
+          Components:
+          &lt;variablelist&gt;
+            &lt;varlistentry&gt;
+              &lt;term&gt;Administration:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Administration of a Bugzilla installation.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Bugzilla-General:&lt;/emphasis&gt;
-        Anything that doesn't fit in the other components, or spans
-        multiple components.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Bugzilla-General:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Anything that doesn't fit in the other components, or spans
+                  multiple components.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Creating/Changing Bugs:&lt;/emphasis&gt;
-        Creating, changing, and viewing bugs.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Creating/Changing Bugs:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Creating, changing, and viewing bugs.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Documentation:&lt;/emphasis&gt;
-        The Bugzilla documentation, including The Bugzilla Guide.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Documentation:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  The Bugzilla documentation, including The Bugzilla Guide.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Email:&lt;/emphasis&gt;
-        Anything to do with email sent by Bugzilla.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Email:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Anything to do with email sent by Bugzilla.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Installation:&lt;/emphasis&gt;
-        The installation process of Bugzilla.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Installation:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  The installation process of Bugzilla.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Query/Buglist:&lt;/emphasis&gt;
-        Anything to do with searching for bugs and viewing the
-        buglists.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Query/Buglist:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Anything to do with searching for bugs and viewing the
+                  buglists.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Reporting/Charting:&lt;/emphasis&gt;
-        Getting reports from Bugzilla.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;Reporting/Charting:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Getting reports from Bugzilla.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;User Accounts:&lt;/emphasis&gt;
-        Anything about managing a user account from the user's perspective.
-        Saved queries, creating accounts, changing passwords, logging in,
-        etc.&lt;/member&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;User Accounts:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  Anything about managing a user account from the user's perspective.
+                  Saved queries, creating accounts, changing passwords, logging in,
+                  etc.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;User Interface:&lt;/emphasis&gt;
-        General issues having to do with the user interface cosmetics (not
-        functionality) including cosmetic issues, HTML templates,
-        etc.&lt;/member&gt;
-        &lt;/simplelist&gt;
</del><ins>+            &lt;varlistentry&gt;
+              &lt;term&gt;User Interface:&lt;/term&gt;
+              &lt;listitem&gt;
+                &lt;para&gt;
+                  General issues having to do with the user interface cosmetics (not
+                  functionality) including cosmetic issues, HTML templates,
+                  etc.
+                &lt;/para&gt;
+              &lt;/listitem&gt;
+            &lt;/varlistentry&gt;
+          &lt;/variablelist&gt;
</ins><span class="cx">         &lt;/para&gt;
</span><span class="cx">       &lt;/listitem&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -290,41 +340,76 @@
</span><span class="cx">         This form can be used for time tracking.
</span><span class="cx">         To use this feature, you have to be blessed group membership
</span><span class="cx">         specified by the &lt;quote&gt;timetrackinggroup&lt;/quote&gt; parameter.
</span><del>-        &lt;simplelist&gt;
-        &lt;member&gt;
-        &lt;emphasis&gt;Orig. Est.:&lt;/emphasis&gt;
-        This field shows the original estimated time.&lt;/member&gt;
</del><ins>+        &lt;variablelist&gt;
+          &lt;varlistentry&gt;
+            &lt;term&gt;Orig. Est.:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the original estimated time.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Current Est.:&lt;/emphasis&gt;
-        This field shows the current estimated time.
-        This number is calculated from &lt;quote&gt;Hours Worked&lt;/quote&gt;
-        and &lt;quote&gt;Hours Left&lt;/quote&gt;.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Current Est.:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the current estimated time.
+                This number is calculated from &lt;quote&gt;Hours Worked&lt;/quote&gt;
+                and &lt;quote&gt;Hours Left&lt;/quote&gt;.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Hours Worked:&lt;/emphasis&gt;
-        This field shows the number of hours worked.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Hours Worked:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the number of hours worked.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Hours Left:&lt;/emphasis&gt;
-        This field shows the &lt;quote&gt;Current Est.&lt;/quote&gt; -
-        &lt;quote&gt;Hours Worked&lt;/quote&gt;.
-        This value + &lt;quote&gt;Hours Worked&lt;/quote&gt; will become the
-        new Current Est.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Hours Left:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the &lt;quote&gt;Current Est.&lt;/quote&gt; -
+                &lt;quote&gt;Hours Worked&lt;/quote&gt;.
+                This value + &lt;quote&gt;Hours Worked&lt;/quote&gt; will become the
+                new Current Est.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;%Complete:&lt;/emphasis&gt;
-        This field shows what percentage of the task is complete.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;%Complete:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows what percentage of the task is complete.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Gain:&lt;/emphasis&gt;
-        This field shows the number of hours that the bug is ahead of the
-        &lt;quote&gt;Orig. Est.&lt;/quote&gt;.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Gain:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the number of hours that the bug is ahead of the
+              &lt;quote&gt;Orig. Est.&lt;/quote&gt;.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Deadline:&lt;/emphasis&gt;
-        This field shows the deadline for this bug.&lt;/member&gt;
-        &lt;/simplelist&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Deadline:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                This field shows the deadline for this bug.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
+        &lt;/variablelist&gt;
</ins><span class="cx">         &lt;/para&gt;
</span><span class="cx">       &lt;/listitem&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -591,73 +676,112 @@
</span><span class="cx">       &lt;para&gt;The format of the list is configurable. For example, it can be
</span><span class="cx">       sorted by clicking the column headings. Other useful features can be
</span><span class="cx">       accessed using the links at the bottom of the list:
</span><del>-      &lt;simplelist&gt;
-        &lt;member&gt;
-        &lt;emphasis&gt;Long Format:&lt;/emphasis&gt;
</del><ins>+        &lt;variablelist&gt;
+          &lt;varlistentry&gt;
+            &lt;term&gt;Long Format:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                this gives you a large page with a non-editable summary of the fields
+                of each bug.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        this gives you a large page with a non-editable summary of the fields
-        of each bug.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;XML:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                get the buglist in the XML format.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;XML:&lt;/emphasis&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;CSV:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                get the buglist as comma-separated values, for import into e.g.
+                a spreadsheet.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        get the buglist in the XML format.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Feed:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                get the buglist as an Atom feed.  Copy this link into your
+                favorite feed reader.  If you are using Firefox, you can also
+                save the list as a live bookmark by clicking the live bookmark
+                icon in the status bar.  To limit the number of bugs in the feed,
+                add a limit=n parameter to the URL.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;CSV:&lt;/emphasis&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;iCalendar:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                Get the buglist as an iCalendar file. Each bug is represented as a
+                to-do item in the imported calendar.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        get the buglist as comma-separated values, for import into e.g.
-        a spreadsheet.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Change Columns:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                change the bug attributes which appear in the list.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;Feed:&lt;/emphasis&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Change several bugs at once:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                If your account is sufficiently empowered, and more than one bug
+                appear in the bug list, this link is displayed which lets you make
+                the same change to all the bugs in the list - for example, changing
+                their assignee.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        get the buglist as an Atom feed.  Copy this link into your
-        favorite feed reader.  If you are using Firefox, you can also
-        save the list as a live bookmark by clicking the live bookmark
-        icon in the status bar.  To limit the number of bugs in the feed,
-        add a limit=n parameter to the URL.&lt;/member&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Send mail to bug assignees:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                If more than one bug appear in the bug list and there are at least
+                two distinct bug assignees, this links is displayed which lets you
+                easily send a mail to the assignees of all bugs on the list.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        &lt;member&gt;
-        &lt;emphasis&gt;iCalendar:&lt;/emphasis&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Edit Search:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                If you didn't get exactly the results you were looking for, you can
+                return to the Query page through this link and make small revisions
+                to the query you just made so you get more accurate results.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
</ins><span class="cx"> 
</span><del>-        Get the buglist as an iCalendar file. Each bug is represented as a
-        to-do item in the imported calendar.&lt;/member&gt;
-
-        &lt;member&gt;
-        &lt;emphasis&gt;Change Columns:&lt;/emphasis&gt;
-
-        change the bug attributes which appear in the list.&lt;/member&gt;
-
-        &lt;member&gt;
-        &lt;emphasis&gt;Change several bugs at once:&lt;/emphasis&gt;
-
-        If your account is sufficiently empowered, and more than one bug
-        appear in the bug list, this link is displayed which lets you make
-        the same change to all the bugs in the list - for example, changing
-        their assignee.&lt;/member&gt;
-
-        &lt;member&gt;
-        &lt;emphasis&gt;Send mail to bug assignees:&lt;/emphasis&gt;
-
-        If more than one bug appear in the bug list and there are at least
-        two distinct bug assignees, this links is displayed which lets you
-        easily send a mail to the assignees of all bugs on the list.&lt;/member&gt;
-
-        &lt;member&gt;
-        &lt;emphasis&gt;Edit Search:&lt;/emphasis&gt;
-
-        If you didn't get exactly the results you were looking for, you can
-        return to the Query page through this link and make small revisions
-        to the query you just made so you get more accurate results.&lt;/member&gt;
-
-        &lt;member&gt;
-        &lt;emphasis&gt;Remember Search As:&lt;/emphasis&gt;
-
-        You can give a search a name and remember it; a link will appear
-        in your page footer giving you quick access to run it again later.
-        &lt;/member&gt;
-      &lt;/simplelist&gt;
</del><ins>+          &lt;varlistentry&gt;
+            &lt;term&gt;Remember Search As:&lt;/term&gt;
+            &lt;listitem&gt;
+              &lt;para&gt;
+                You can give a search a name and remember it; a link will appear
+                in your page footer giving you quick access to run it again later.
+              &lt;/para&gt;
+            &lt;/listitem&gt;
+          &lt;/varlistentry&gt;
+        &lt;/variablelist&gt;
</ins><span class="cx">       &lt;/para&gt;
</span><span class="cx">     &lt;/section&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -665,14 +789,10 @@
</span><span class="cx">       &lt;title&gt;Adding/removing tags to/from bugs&lt;/title&gt;
</span><span class="cx">       &lt;para&gt;
</span><span class="cx">         You can add and remove tags from individual bugs, which let you find and
</span><del>-        manage them more easily. Creating a new tag automatically generates a saved
-        search - whose name is the name of the tag - which lists bugs with this tag.
-        This saved search will be displayed in the footer of pages by default, as
-        all other saved searches. The main difference between tags and normal saved
-        searches is that saved searches, as described in the previous section, are
-        stored in the form of a list of matching criteria, while the saved search
-        generated by tags is a list of bug numbers. Consequently, you can easily
-        edit this list by either adding or removing tags from bugs. To enable this
</del><ins>+        manage bugs more easily. Tags are per-user and so are only visible and editable
+        by the user who created them. You can then run queries using tags as a criteria,
+        either by using the Advanced Search form, or simply by typing &quot;tag:my_tag_name&quot;
+        in the QuickSearch box at the top (or bottom) of the page. To enable this
</ins><span class="cx">         feature, you have to turn on the &lt;quote&gt;Enable tags for bugs&lt;/quote&gt; user
</span><span class="cx">         preference, see &lt;xref linkend=&quot;userpreferences&quot; /&gt;. This feature is disabled
</span><span class="cx">         by default.
</span><span class="lines">@@ -684,9 +804,7 @@
</span><span class="cx">         these bugs and mixing all these reasons, you can now store these bugs in
</span><span class="cx">         separate lists, e.g. &lt;quote&gt;Keep in mind&lt;/quote&gt;, &lt;quote&gt;Interesting bugs&lt;/quote&gt;,
</span><span class="cx">         or &lt;quote&gt;Triage&lt;/quote&gt;. One big advantage of this way to manage bugs
</span><del>-        is that you can easily add or remove bugs one by one, which is not
-        possible to do with saved searches without having to edit the search
-        criteria again.
</del><ins>+        is that you can easily add or remove tags from bugs one by one.
</ins><span class="cx">       &lt;/para&gt;
</span><span class="cx">     &lt;/section&gt;
</span><span class="cx">   &lt;/section&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgeditflagtypescgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/editflagtypes.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/editflagtypes.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/editflagtypes.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -156,6 +156,9 @@
</span><span class="cx">     my $component_id = $component ? $component-&gt;id : 0;
</span><span class="cx">     my $show_flag_counts = $cgi-&gt;param('show_flag_counts') ? 1 : 0;
</span><span class="cx">     my $group_id = $cgi-&gt;param('group');
</span><ins>+    if ($group_id) {
+        detaint_natural($group_id) || ThrowUserError('invalid_group_ID');
+    }
</ins><span class="cx"> 
</span><span class="cx">     my $bug_flagtypes;
</span><span class="cx">     my $attach_flagtypes;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgemail_inpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/email_in.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/email_in.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/email_in.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -235,7 +235,8 @@
</span><span class="cx"> 
</span><span class="cx">     my $added_comment;
</span><span class="cx">     if (trim($fields{'comment'})) {
</span><del>-        $added_comment = $bug-&gt;comments-&gt;[-1];
</del><ins>+        # The &quot;old&quot; bug object doesn't contain the comment we just added.
+        $added_comment = Bugzilla::Bug-&gt;check($bug_id)-&gt;comments-&gt;[-1];
</ins><span class="cx">     }
</span><span class="cx">     return ($bug, $added_comment);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgenter_bugcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/enter_bug.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/enter_bug.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/enter_bug.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -310,6 +310,7 @@
</span><span class="cx">               /\(.*Windows.*NT.*\)/ &amp;&amp; do {push @os, &quot;Windows NT&quot;;};
</span><span class="cx">             };
</span><span class="cx">             /\(.*Mac OS X.*\)/ &amp;&amp; do {
</span><ins>+              /\(.*Mac OS X (?:|Mach-O |\()10.8.*\)/ &amp;&amp; do {push @os, &quot;Mac OS X 10.8&quot;;};
</ins><span class="cx">               /\(.*Mac OS X (?:|Mach-O |\()10.7.*\)/ &amp;&amp; do {push @os, &quot;Mac OS X 10.7&quot;;};
</span><span class="cx">               /\(.*Mac OS X (?:|Mach-O |\()10.6.*\)/ &amp;&amp; do {push @os, &quot;Mac OS X 10.6&quot;;};
</span><span class="cx">               /\(.*Mac OS X (?:|Mach-O |\()10.5.*\)/ &amp;&amp; do {push @os, &quot;Mac OS X 10.5&quot;;};
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgextensionsExampleExtensionpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/extensions/Example/Extension.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/extensions/Example/Extension.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/extensions/Example/Extension.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -371,7 +371,13 @@
</span><span class="cx">     my $new_error_msg = &quot;Ah ah, you tried to access $page_id? Good try!&quot;;
</span><span class="cx">     $new_error_msg = html_quote($new_error_msg);
</span><span class="cx">     # There are better tools to parse an HTML page, but it's just an example.
</span><del>-    $$page =~ s/(?&lt;=&lt;td id=&quot;error_msg&quot; class=&quot;throw_error&quot;&gt;).*(?=&lt;\/td&gt;)/$new_error_msg/si;
</del><ins>+    # Since Perl 5.16, we can no longer write &quot;class&quot; inside look-behind
+    # assertions, because &quot;ss&quot; is also seen as the german ß character, which
+    # makes Perl 5.16 complain. The right fix is to use the /aa modifier,
+    # but it's only understood since Perl 5.14. So the workaround is to write
+    # &quot;clas[s]&quot; instead of &quot;class&quot;. Stupid and ugly hack, but it works with
+    # all Perl versions.
+    $$page =~ s/(?&lt;=&lt;td id=&quot;error_msg&quot; clas[s]=&quot;throw_error&quot;&gt;).*(?=&lt;\/td&gt;)/$new_error_msg/si;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub flag_end_of_update {
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgextensionsOldBugMoveExtensionpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/extensions/OldBugMove/Extension.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/extensions/OldBugMove/Extension.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/extensions/OldBugMove/Extension.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -132,7 +132,9 @@
</span><span class="cx">     my $original_validator = shift;
</span><span class="cx">     my ($invocant, $resolution) = @_;
</span><span class="cx"> 
</span><del>-    if ($resolution eq 'MOVED' and !Bugzilla-&gt;input_params-&gt;{'oldbugmove'}) {
</del><ins>+    if ($resolution eq 'MOVED' &amp;&amp; $invocant-&gt;resolution ne 'MOVED'
+        &amp;&amp; !Bugzilla-&gt;input_params-&gt;{'oldbugmove'})
+    {
</ins><span class="cx">         # MOVED has a special meaning and can only be used when
</span><span class="cx">         # really moving bugs to another installation.
</span><span class="cx">         ThrowUserError('oldbugmove_no_manual_move');
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgextensionsVotingConfigpm"></a>
<div class="addfile"><h4>Added: trunk/Websites/bugs.webkit.org/extensions/Voting/Config.pm (0 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/extensions/Voting/Config.pm                                (rev 0)
+++ trunk/Websites/bugs.webkit.org/extensions/Voting/Config.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the &quot;License&quot;); 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 &quot;AS
+# IS&quot; 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 Frédéric Buclin.
+# Portions created by the Initial Developer is Copyright (C) 2012 the
+# Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Frédéric Buclin &lt;LpSolit@gmail.com&gt;
+
+package Bugzilla::Extension::Voting;
+use strict;
+
+use constant NAME =&gt; 'Voting';
+
+use constant REQUIRED_MODULES =&gt; [
+];
+
+use constant OPTIONAL_MODULES =&gt; [
+];
+
+__PACKAGE__-&gt;NAME;
</ins></span></pre></div>
<a id="trunkWebsitesbugswebkitorgextensionsVotingExtensionpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/extensions/Voting/Extension.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/extensions/Voting/Extension.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/extensions/Voting/Extension.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -40,7 +40,6 @@
</span><span class="cx"> 
</span><span class="cx"> use List::Util qw(min);
</span><span class="cx"> 
</span><del>-use constant NAME =&gt; 'Voting';
</del><span class="cx"> use constant VERSION =&gt; BUGZILLA_VERSION;
</span><span class="cx"> use constant DEFAULT_VOTES_PER_BUG =&gt; 1;
</span><span class="cx"> # These came from Bugzilla itself, so they maintain the old numbers
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgimportxmlpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/importxml.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/importxml.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/importxml.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -498,7 +498,7 @@
</span><span class="cx">     foreach my $comment ( $bug-&gt;children('long_desc') ) {
</span><span class="cx">         Debug( &quot;Parsing Long Description&quot;, DEBUG_LEVEL );
</span><span class="cx">         my %long_desc = ( who       =&gt; $comment-&gt;field('who'),
</span><del>-                          bug_when  =&gt; $comment-&gt;field('bug_when'),
</del><ins>+                          bug_when  =&gt; format_time($comment-&gt;field('bug_when'), '%Y-%m-%d %T'),
</ins><span class="cx">                           isprivate =&gt; $comment-&gt;{'att'}-&gt;{'isprivate'} || 0 );
</span><span class="cx"> 
</span><span class="cx">         # If the exporter is not in the insidergroup, keep the comment public.
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgjobqueuepl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/jobqueue.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/jobqueue.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/jobqueue.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -22,8 +22,14 @@
</span><span class="cx"> #   Max Kanat-Alexander &lt;mkanat@bugzilla.org&gt;
</span><span class="cx"> 
</span><span class="cx"> use strict;
</span><ins>+
+use Cwd qw(abs_path);
</ins><span class="cx"> use File::Basename;
</span><del>-BEGIN { chdir dirname($0); }
</del><ins>+BEGIN {
+    # Untaint the abs_path.
+    my ($a) = abs_path($0) =~ /^(.*)$/;
+    chdir dirname($a);
+}
</ins><span class="cx"> 
</span><span class="cx"> use lib qw(. lib);
</span><span class="cx"> use Bugzilla;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgjscustomsearchjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/js/custom-search.js (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/js/custom-search.js        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/js/custom-search.js        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -146,7 +146,15 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     var form = YAHOO.util.Dom.getAncestorByTagName(form_member, 'form');
</span><ins>+    // Disable the token field so setForm doesn't include it
+    var reenable_token = false;
+    if (form['token'] &amp;&amp; !form['token'].disabled) {
+      form['token'].disabled = true;
+      reenable_token = true;
+    }
</ins><span class="cx">     var query = YAHOO.util.Connect.setForm(form);
</span><ins>+    if (reenable_token)
+      form['token'].disabled = false;
</ins><span class="cx">     window.History.replaceState(null, document.title, '?' + query);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgjsfieldjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/js/field.js (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/js/field.js        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/js/field.js        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -770,6 +770,7 @@
</span><span class="cx">         }
</span><span class="cx">         var keywordAutoComp = new YAHOO.widget.AutoComplete(field, container, this.dataSource);
</span><span class="cx">         keywordAutoComp.maxResultsDisplayed = YAHOO.bugzilla.keyword_array.length;
</span><ins>+        keywordAutoComp.formatResult = keywordAutoComp.formatEscapedResult;
</ins><span class="cx">         keywordAutoComp.minQueryLength = 0;
</span><span class="cx">         keywordAutoComp.useIFrame = true;
</span><span class="cx">         keywordAutoComp.delimChar = [&quot;,&quot;,&quot; &quot;];
</span><span class="lines">@@ -786,5 +787,8 @@
</span><span class="cx">                 this.expandContainer();
</span><span class="cx">             }
</span><span class="cx">         });
</span><ins>+        keywordAutoComp.dataRequestEvent.subscribe( function(type, args) {
+            args[0].autoHighlight = args[1] != '';
+        });
</ins><span class="cx">     }
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgjsyuiswfstoreswfstoreswf"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/js/yui/swfstore/swfstore.swf (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/js/yui/swfstore/swfstore.swf        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/js/yui/swfstore/swfstore.swf        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1,51 +1,43 @@
</span><del>-CWS
-\x94x\xDA}Yi|[ŵ\x9Fs\x8D\xAE$\xDB\xF2\xC7v\xB6\x9BĎ\x97\xC8K6HL0\xF1\xA6\xD8\xC1\x89\x82\x97\xC4        8֕t\xAF%&quot;\xE9
-\xDD+/\x976\xD0R(P
---\xA5.\xA5\xA5\x94.P\xA0t\x85\xB6t\xE3\xF5\xF5U\xB2I\xBE\xBFO\xFDԏ\xEF\xC3\xFB\xE2wf\xAE$\xDB\xD0\xDFs\x98\xD1̙3gΜ\xF3?\xE7\xCC\xFD\x91!n\x83\x90 \xA7H\x90\xA1\xEAFB\xC8\xF5ڿ!'\xB31\xA3w|(\xA8.\xA6\x92i\xABgw\xB7\xC6m;\xD3\xDBݽ\xB0\xB0еp\xA4\xCB\xCC\xCEu:q\xE2Dw\xCF\xE1\xEEÇ;\x91\xA3\xD3ZJ\xDB\xDAbg\xDA\xDA\xDF\xDA\xC7 \xE9V4\x9B\xC8\xD8        3\xAD\xB2\xB91s\xF6ݭ\xADE\xA9\xB1hYh&amp;\x97Mr\x91\xB1h\xB7\x9E\xD4Szڶ\xBAuBA\xB1h\xAFafS\x9Aݧe2\xC9DTc\xE2\xBA;\xAD\xB8\xBD\xBA\xA0\xCD\xEB\x9DFR\xB3\xE2'\xBB7\xD9;a'\xF5\xBE\xFE\x98\xD1\xD5`R_T\x8F\xA8\xFD\xFB9\xB7\xC3˜c\x8A\xF6m\xBA\xA6\xC6vwE\xCDTw&amp;k\xC6rQ\xD4\xC9@Q|\xF3\xE6-LD&amp;I&amp;\xAC\xB8\x9E\xED˥\xAF\xA6\xCD\xE7\x88-*\xE3\x89fu\xCD6\xB7r\x94hl=\xA9\xA5\xE7rڜ\xDE7|\x8E\xAF\x95\xE7\G\xCD\xD6\xFB&amp;\xF4\x8Cz\xE8h@=\xDCs\xA8\xC7Q\x83QOv\xC2\xDAE
-:\xB0\x8F \xF9\xFF)\x9E$\x83\xC2\xE3/\xBF~\xD9#\xA2\x87]\xD8D\xE9\xCEf\xC2\xFF&gt;\xF7ϖ\xEA\x83\xE8\xF1\x8F=\x83\xA8\x89N&gt;\xAC\xBB\xB2\x93\xA4#\xAB\xA5\xF4C\xC4O\xBA\x88\xB4\x8EUO\xC2m\xA4\xAF\xA1\xA6\x99Ե\xB44o&amp;b\xAE        \x9BHω\x89\xB4-\xF7g\xB3ڒ\x94á4\x84\xBA\xF9\xB8s\xBA\xF4y\xE6Qy\x98\xFD\xF8FC\xC3٬\x99哚        =\x9A\xCB&amp;\xEC\xA5-\x92+yP\x8Fڢ\x8B\xB9\xCE\xE5R=[yN\xB7'l\xCD\xCEY\x9C\xA1‘KX\x99\xA4\xB6$\xE3ʜ\xEE.i\xEF\x9AȠ8\xBD&quot;ij\xB1\x8Bq\xA1\xFD\xEDmq\xCD\xEA\x8F\xE9\xE5P\xA3\xA1\xA2\xCBB#Y\xEEY-\x8D'\xE6u\xC9BU\xE5M趍\x97\xB1\xA8\xA5ۓ\xC8[e\xA6\xB7\xE8\xA8\xCC!})\xA3\xF7\xDB]В9\xD6\xCC.\x94\xCE
-&amp;\x92\xFA94\xDB6 \xD5A\xCD:\xCB+]{\xAF\x99._ƍ\xFBGm=ŏ\x9AH&lt;\xAC3\x81\xA3阾2\xD8)LJ\xBF]\x8D\xA3)K4S\x99\xACn1ŕ\xA5\&quot;\x92M\xC4\xE6\xF4J\xC4fג7ͮ\x9C\x9DH*\x97\xA6F\xF8BUFϲ`\x98;\xAB\xD9Ѹ/\xAB\xA7\xCCy\x9D\x9D\xD6o\xFBf鄝Вxd̛\xD1\xEC8\xE7ѭZ&lt;\xEA\xACK\xC5(a\xAC\xB6&gt;y&lt;E\xAE\xF3\xB8\xA9b֊kY=\xE6\xB8Kq\x9C\x92\xD6m\xDF\xC4&amp;2\xBB;U\x8E&quot;Z\xB2&gt;vQ\xB6\x8A\x925j\xA6\xB9A=\x8EFb\xB7\xD3\xD3sv\xBCd\xE5\x90Q\xB6rȨ\xDF\xD0{\xF3uQ-\xCD%Q\xD9\xC1\6\x8B\xE1\xB6ܸ\xB1\xC7L3\xF5\x93:\xC2qn\x938\xB9W_*\xBA\xB0j6\xB7\xE5\x9A-[m\xDB[\xB6\xADg\xF6AkDKǒz\xD65k-\xA3C\x8A\xA5\xA7c\x9A\x8E浬\xE5C\xF8j\xC9dD\x8B^\xB5\x90\x8F\x81\xB4\xF2\xEC\xE8\xB9ѳSggG\x86GO\x8FLV\x94\xA6G\x87&amp;G\xF6\xCFF\xD2\xE9\x9F8\xD2}\xB8\xA7\xE7\x8E\xEEH.\x91DL\xD6m\xC1}\xAF\xF4\xE6\xAD\xC4!\xE7\xD71̠\x89        9\x91ֳ{\xB62\x8D\xA6m=\xABEm\x84\xBEø\xE3\xFF\xB2ss\xF7\xF2[\xB2u\x8E\x98\xAC\xCC\xEF\xE5uX\x98\x99,e`\xC9֝$cN.\x86\x98w\x81)\xEBHtG\x8BV\x96
 \x8DdΊ\xD3b\xA0Tb\x90\x86\xD2\xE7\xB3&amp;\x82\xD7^r\xE52,\xB9IH\x8DK\xE43fƕ\xE4\xE8pY,\x93뮘Μ*\xD9\xC9B\xA7W\xE0\xD64\xEF\x82Ĝ+\xE6k\xC9B\xB8KA\Q\x9C\xD7\xD2z\xB2b,4\xD8?6;1\xEF?=\xECâ\xB2PJu\x89\xB4\xF6\xA9\x9CAS\xA87*{t2\xAE\xABQn*;Z5-\xD5F\xE6!5a\xA9\xB6i\xAAV
-\xFD\x8F#\xB5hW\xF5
-c\xB0\x8A\xE2\xD5 ;\xBFK=\x8F\x81a\xE9j&quot;\xCD*\x8F6\xAF%\x92Z$\xA9\xAB \x89\x98Wmj\O\xCC\xC5m&amp;\xEE\xF0\xA1c\x99EuQ=t\xE48\xFE\x9AY5\xA9e\xE7\xF4l\x97?\xF5\x89إ\x89b2\xC140\x86\xF9PϺCgϏ-O\xFB\x9Eܗc\x98\x98t\x84\x88{44;&lt;&gt;\xAF\x9C\x9C\x9D\xBC\xE4L=I\xBEq4m\x98&quot;iW\xA3\xA7߆n\xD9b\xF0\xA2\x85K)˃\xA7\x8C\xA3\xBDt˖\xD8&amp;q\xFA\xEC\x98\xCBf\xAAٲ\xCE\xBD\xB2\x88\xA4ED_ZKV\x8E\x86\xD5ی\:ʔok\xBF\x96\xD5\xED\6\x8D\xF7O\xC7̅\xAE\xA4\xE9ܪ+\x9EՍ\xBB\x950\xE2\x93\xD5\xD8̅N-E\x97tY3UamN\xD4\xF7\x95\xAD\xF2i/\xB7l9\xAB1S\xB7Դi\xAB\\x8C\xEA\x88a\xE6-\xC2Qeq:\xB3t\xBA\xC22F3ȁ\xF7\x95\xE71\xC5$\x96C=Q\x8C64(\xDEZ\xD4\xE7\xF1\xCA̺\x92\x8D\xB7u\x8D\xEBsËWK[WG{ \xCD\xEA\x86\xA8\xF7\xB8si,\xD9ZF?\xC5\xC03S\xAB%1\xF9j*\x87z\xA6X\xA4\x95\xA0\xD5j\xF9\xBA&lt;\xE7\x91\xA7\xA8D\xAF
-\xAF\xB3\xC8g2W\x9C\xA8ǐ6;&lt;1\xE8)\xA2\xA7Jy\xA1r\x83\xC8y2\xAB\xF8\xE8\x8BF\xB2悅n\xE2\xD1Y\xA5\x9C\xA2%;\x9B\xD3+\xB7\xA6J[\xE0\xD5w\x96մ14W\xD2snxêrjBA`\xC7XZ\xB0&lt;\xE8\xDF\xE26#:\xF9\xC0W\xB4\xDC8R\x96f\xEC$\xAB/&quot;\x8E\xE4ۦ`\xFCf\xB8V{XQ޾9\xFFYqJ*-\x8EMM\x8C I        \x86׫\xFA\x92\xDBL\xC6x\x82w\xA7\xF5&gt;\x90yP\xD0\xF3\xC3\xE7\x86Fϝ\xA6\x980b\x8EO\xC1T\x9A\xBE\xBA\xD4\xC1du\xEA\xB41\xBD         \xCCEjD\xD7\xD3,\xA2wL\xC5&quot;\xEB`\xA4\xE8u\xD2Tu.)P{\xE6\xBB \x83\xFE'b\x9F\x875\x92T\xAD|\x80\x962si\xBB\xCB]B\x9C M\x95K\xDArє\xACy(g\xDA\xDA\xF0bT\xD7\xD1{\xDC\xC9\xD5\xE5\xC7D        \xE4RԌ\xE9G'\x8A\xF2]Z\x94\x85@\xD6        L\xD4X\xE7\xFB\xADM9\xA6x(\xB5r&lt;\xBC&lt;\xA7\x8F\xF0t\xE3\xE1\xE3\x8B,        U}&quot;\xF5Wl\xA9՟\xAA)\xF5\xFF\xBEU\x97\xEBh\xA9:\xBA\x912\x81e4\xA6\x94U\xAA\xBAr\xE7e\xAD\xF3\xE1\x9E\xCE]3\xCD0\x87\x81d\xD9\xDEM5U\xB6\xF14\xBD\xB6?\x86\xA6P\xA3E&quot;wUӈ\xE1\x98\xEA\xC6\xDA\xCC!U9\xE1\xF8X\xE5!\xA96\xD5C\xBDR_\xDDP+\x93\
 xFA\xD6\xFAC-2\x91\xC9vp\xDF\xDBT\xDB4\xD6t\xB6\xE9\S\xA8\xE9|SE\xFDx\xBD^\xBF \xB8\xD4\xDA4 U\xC8c&gt;\xA9\xA2\xB2\xCA_]S\xAB(\xB0\xDD\xD5\xE0s7ւ\xEB\xCF@A\xA0 R\x90(\xC8\(7&lt;T\xF0R\xC1G\xA1\x82B\xFCT\xAC\xA1PK\xC5:*o\xA3PO\xE5\xEDTj\xA0\xD0H\xA5&amp;*\x93\xC2.*漣Ja/\x85}T\xDEO\xA1\x99B \x95PW\x95\xDB)tP\xF9 \x95:)tQ\xE8\xA6r\xA5\x87)\xA1p\x94\xC21*\xDFA\xE5;)\xA7p\x82B/\x95\xEE\xA2p\x92\xC2\xDDT\xEE\xA3p\x95NQ\xB9\x9F*\x83T\xA20L!H\xE14UF(\x8CR8\xA3\xF4\x82\xB2\x94]\xA04\x83r\x94NPN\x82r\x94\xBBA\xE9\xE5((\xFB@i\xE5(;A\xE9\xA5\x94c\xA0\xDCJ=Z\xE0&gt;Z7AaR\x99\xC2\xF1
-)L+\x97@\xB9 ;@y\x94P\xAE\x802 \xD47\xA3\x84\x91%J\xB7t\xDB\x858\x85\x84\x92\xC5D\xA3e(&lt;D!K\xC1\xA2`S\xC8Q\x98\xA70K} ԷD}Sz\x8D\xC2#\xA5\xF0e\x85\\xA5\xF5\x9Fş\xCFA\xE5&lt;\xFE&lt;\x81\xED:\xF5~\xA8\xF7\x8B؞\xC4\xF6%l\xF3\xD4\xFB\xFE&lt;\x8DG\x9B\xBE\x8CL\xCF\xE0\xF09\xFC}\xDBװ}\x97_\xC2\xF6-l\xDF\xC4\xF62Ҿ\xCA+\xCA
-\xB6W\xE7\xAFa\xFB\xEE\xBBL\xE1\xFB8|\xDB\x90\xF5\x87\xD8\xDE\xC4\xF6
-\xB6a\xFB1\xB2\xFCo\xF2S\ \x94(o\xA3\x84\x9Fa{ۻ\xD8\xDEc\xD2~\x8E\xACoc{\xDB{\xD8~\x89\xEDl\xEA\xFD.\xBF-ʯ\x91\xF5\xC6\xFA{l*|T\xFC#\xB6?a\xFB3\xEC@\xC0}\x8Cg\xFD'\xAE\xFE\xDB\xE1Y\x82\xD2&amp;\xB6\x93\xD2~\xA5\x81\x9B\x88|&amp;\xB2N\xC2Nd#Q*v\x8C\x84a@\x80\xB1H\xCEN\xF6\xAD\xE8, \xD8(N$љ\x80\xE0&amp;\x82\xE0\xD6y\x8A2q\x95\xFF/\xE4ŁG\xF6\xF9*\xC1\x87 \x82\xE0c\xFC\xC5#\xCA
-W2\xAA\xB7\xD8\xF1?\xA1ʯHڪ\x81\xD4\xD7\xD9WK\x88\x97\xD4ٳ-Hm=u;\x90\xA6 \x9EF \xEE&amp;\xFC\xAA݃p#{w\xA9\xD8\xA4f7\x90m{\x80xU \xC2^B\xF6\x91\xFD@v6\xA9ja\xC7\xD2\xD0
-\xA4\xAE-m\xD2dG!I\x88\xAB\x88\xBF \x88\xDC-\xA4\xB1\x87q\xE2; c\x81У@vR}\xEA{'\x90\xED\xC7ј'\x80\xEC\xEEe\x8C\x{3F0A6F4}\xB8\xEEBM\xC8I\xD6\xDD-\xA4\xB5\x8F)}\x9Ew\x8A\xB0+
-\xFDD\xF0        \xE2\x9F(6a?TI@\xDA`^\xB4\xAD\xE6V\xAA\xF3=WZn\x836p\xA5\xBF\xE5I\xD0\xFAO3\xCB
-\x8A\xE7\xC8\xF7\xE4GI&gt;TM\xA6Ȳ\xF7f!o\xD1\xB1ߩ-aߨ-c\xBFG bH;\x8D}\xAB6\x82\xFD1m\xFB\x80v\xFB;\xB4{\xB1o\xD6ư\xEF\xD4\xCEb\xBFK;\x87\xFD6-\x84\xFDa\xED&lt;\xF6-\xDA}طi\xE3ث\xDA\xF6]\xDA$\xF6ǵ\xA9\xF2\xB8F\xBB\x90\x9F\xD9\xBExf\xC4\xF7捽\x85\xD0=p\x9A\x81 \x8F \xB54zG\xF0\xFE\x82\xA8x\xF3=\xEA\xF2\xF4\xAD|!ޛ7:\x8CK\xC6\xE5\xF0\xF4;/v\xD4 R\xDA \xF35藙\xE93\xD3YV\xF3Fm\xE8~X-=@8\xE7\xAAvC3K[\xCBZË\xB3B\xBC':\xCA\2U&lt;\xABh \xF5FTR\x97\xBD\xB7Q\x98q\xA5\x9C\x85\x9A6B\x9C\x89^\xADC趎\xE4 \xC1#P\xE6Y\xD5\x{38D2FDE}\x90@eT*\xD9@+\x84&quot;\x90/D\xA4\xB5\xD5`\x9D4\xDF\x95\xAB\x84\xF81\xCE\x87oM \xFB/\x96g\x86\xDB\xF9\xAEP\x94\xF8\xFB\x91\xEAGD\xA4\xA8+p\xC4Մ\xB1\xD4L\xFCM\xEC\x94\xE2 \xFC        ~6\xFC\xEBݮ__\xDEX_}GoK\xD9m\x9B\xD8\xDDK7R6n4\xA2&quot;\x87[\x90O3\xB3Gpܸ\xB5Z\x8D\xC2\xD4βj\x84\xF1\xA2ke-y&amp;m\xC7fi\x9E-i/pqƢpq\x8D\xF0\xBC̑ۜ=\xB2\x95\x8FX\xC5Es\x8D\xA7\xB8hĐR!\xA1:ǐ&lt;D\xAC\x9BȲ|\xAB\x99
 ط\xFD-x\xFA*?\x8A\xF3\xAEa#\xD2a\xED9\xFB\xF6Za\xDB\xAF\xAF3q\x95.Y\xF1\xDC\xC9\xDF-֭\x92feo\x95L\xBC\xDA !C\xC8ښ\x8A\xBE\x91\xD17n\xAFbۏu_\xF6\xDErL\xE2\xEC]+\xED-8{\xD7ڪZ\xD8\xD8\xEB\x97\xF1ޭ\xEC&amp;\xA1N\x92\\x9A&quot;\x81.\x90)!^\x88\xA6P\xDEM\x8E\xF5\xBB\xE1\xB2WC\x85\xD69\xFBfI5&quot;\xAA\x8E\x81\xEF(\xB4,\xBB_-\xCE0\x8F\xE0Z-\x93Σ\xA5kH\xCD.DB$\xDB,6'\x8CCW\xC1\xBF\x9D/&gt;\xB8HR+S\xC2\x82\xBD\x8E9\xA86\xDF3C\x9D\x90J\x9E\xA1\xB0L\xB9\xDBؒ\xAF\xE4\xAA`
-\x90V/\xB9O\x8Eiu{&amp;}&amp;M\x96\xD37 a\xB7a\xE6\x8D;C\xA1V\x8C\x87\xF2F7z\x8Cl\xDE؎ðeب\xF7\xAA\x91{&gt;8\x81\xC57\xD1D )\xABͤy=\xB8 \xE0Z3Y-,\x81\xCDn\xAFW\xF2F\xD3ʍ\xA8\\x98Y\x8A\xC8g\x96 \xF40\xD3u\xBB,{\xAA\xFE\x85\x81y\xB1\xE3V\x8F\xEA򵔠CkJt\xC62\xFE\xDCH\xB9\xD8ě\xA2:R\xA0\xC3\xCC5\x92`&lt;b&lt;z\xE6\xB0-\xFE\xFD\x88ў՞ˤ\xE3vG\xCF\xC1\x84\xF7\xA2u\xAE\xAE\xEA\xF2}fJ@\xBB\xECr\xA3\xC8\xF0\xF5\xC0c\\xB8\x91\x92\x9A\xC9m#&gt;F\xF81\x8Co\xCC\xE5\x8A\xCA\xFB\x9DsqQ6&gt;\x8B\x9C\xAE&lt;%l\xAE\xE0\x81\x97R\xA2\xCB\xDDaI\xAC\xFEx}\xDD-1\xD9I\xB1ƍj`\xBE\xF1\xEFd&lt;\xA8\xC1-@=\xCC=)\xF4\xC5^d\xA2\xCCEp\xB0o\xE01|\x98\xD0\xCFcy\xC9-,1@ǚr\x8D&lt;\x81\xC5\xE8\xF9\xD6\x91| \x8A\x97&lt;        ܤ\x81\xC5XM\xBE\xA7\xB0\xFC@\xF3z%؁\x91Vt_#\xC3E\x97\x86\xF6\xB3L\xD7$\x89&lt;\x8F/O\xF1\xF3p{Wx\xEC`(\xACGQ\xE1\xA7!\xF0, @\xDEh~\x87;]\xA2\xA7\xEA\x819\xE4f\xB7&gt;\xF0^\xE0\xBD\xC8{\xC9\xF1\x87\xBCŠ\xCC`\xF8
-\xF5kd6`\xA4f\xB2i\x81\x81\x81qnZ(a\x84\x919\xAC\xD8Q\xE8\x97OI\xF8a\xB3$a\xCBBY\x92g\x9E\xE1g\x9Fa\xAA\x89\xA5\xB9\xE0̙3\x99Ǥ\xBA\x92Ǻ6{\xEC\xAB|\xEBJ\xE0l/\xC2
-\xDB\xC7C,%;&gt;\x94ю\xFEF\xB9\x83ܭ&quot;\xE4\xD88Є\xD3в&quot;\xBC&amp;&lt; ρ\xFC\xEEbt\xA5\xEC%ϣ+E\xF2Ut\xB1H^@\xA7\x8Bd\x97\x8C\xD6\xFE놵\x97\xA7\xE3N\x91\xEF\xD8\xE4E0\xBE7:\xAA\xF1\xC5\xD4\xF86^@\xC8-ջQg\xF1\xEB\xF8\xBC\x89\xC5Ι\xBE\xE4L{\xF1F\xDFE\xE7\xF6\xD4 T\xF0\x98_&amp;\xDCN\x8F\xAD\xA0E\xF2\xE1\x83E#@\xF0 \xC4;0U\x84+\x8Co&quot;\xFF\x8Co\x9E8S\xC1\x97\xAA\xAB\xC9\xD6d\xE7\xBFA\xC8F\xAD\xAEI1\xA9\xE5\xF9\xCE-\x8AE\x9B݂\x87\x8E\xCC]$\xB9з@\xE4&amp;|\x9FQ\xFB?e\xC3\xB6 ?9\xF8m x4+Fų\xE2\xB5\xF9\xF1\xF4\xEEy\xA6\x80ֿ\xE0\xE0\xE1Y\x8C-y\x85\xFB;\xDC̯r\x93\x9D0M^C\x87L\x93\xDD,\xB2\xB2\xDCIX\x9D$d\x8F\xEC\xF6T\xFD\x83\xBB&quot;\xEAr\x90\xEFv\\xA1\xF3\xCE*\xD6CSDb\x97\x8C\xC8\xEC~\xEC\xAD\xC52T\xA0\x81%\xA8\xA4T\x83/\xD7\xFC =CI\xF0{@B\xF5h\x9Bޚ\x83\xCCH%\xA3\xA0\xBC\xA4\xE2\xBCfب\xF4\xA0ac\xED2\xBF&quot;\x9B&quot;\x83v\x99[68CP-\xB3V\xC4\xC5\xCC\xA5\xDC^\xBB\xDC\xECDw\xF8\xFB`\xBCu\xE7\xB8{],\xC9h?\x80\xE2P\xD0
 \xDE(-A\xFBai(jo\x96\x86\x92\xF6\xA3\xD2P\xD6~ \xC2]\xBC\x86\x95d\xFF\xEA\x8B\xF1\xF1&gt;\xB0z\x84)\xB1\xCC\xD6:\xC2\xD0k\x81_8\x99n\xCB&quot;~R\xBD\x84\x9FK, \x97\x97yA\x99&amp;?e\xA9į &quot;y}\xBE\xB7\xD13\x88?c.\xF3\xF9\xDEA\x9F!\xF1]L&quot;y\xDF\xEE&quot;Q\x85\x8Dbz\xA9\xA0%1\x8D\xEDua;\xCB 歂\xF1s0އ\xC0\xF5\xBA6^\x81\xB7!\xF0[\xE0\xF4_`_-|S\xE2F\xF4Ws\xBE\xDF\xF1\xEBlʍ\xFB|\xAD4\xE6{\xC2\x8D_B\xB8\xFF\xAD\x96\xEF\xDBq\xF6+\xBC\x85(ُoX7&gt;t\xF6\xF6\x84-=\xE1\xDF`\xFB-\xB6\xB0\xF9\xF1\xBFi\xB2\x8B\xFFūN\xB37~\x89\xF9\xB6\x88\xA2$?\xC2\xF4}n\xB1wz!~
-\xB1|\xCA`1\xEF\xCB}\x81\xBF\x80\xF1!\xCCw\xD4\xE0N;\x9B\xFF\xB58\xA7L\x87\xEB\xC6\xEF`\xBE\xE68\x80&quot;k\xFC.\x96\xC2\xFF\x83\x81\x89\xC5\xE7\xD3]\xC1\xDFc\xCC\xCA,fq=_?\x89:\x90dI\xBE\xC4 \^\xCD\xF6\xE8\xBC]`\xF5\x8F=Z\xB1\xFA\xEDfK\xAB\x85U\xDC\xFA3A\xE0\xC0\xA7+\x81&lt;\xAC\xAC\xAE\x84&gt;`\x85/\xEF\xBE&lt;\x9A\xB1P ?|&lt;K\x82$\xB7\xA1\xFD\xB8t\xAC\x83l\xFF*\xFA\xE1\x8F\xC07\x86\xAF\xA3\x86y\xE3d!\xB4 &quot;\xF2\xB7\xA19E?&gt;U\xFE̞\xDEi\xD8߇\xF4\x8AZ\xF6\xEDW\xFE_\x8E\xF8mD\xFE\xD4B\xA1\xBE
</del><span class="cx">\ No newline at end of file
</span><ins>+CWS \x8Dx\xDA}Y\xD9{Ǒ\xEF̠1H$E\x91\xD45\x92H\xF1\x92l\x8B\x96i\xF1\x82H\x99d%\x99&quot;\xC0  \xC0\xC0\x98ˉo'\x8E\xC7ql'q\xE2Ȏs8\xCE\xE1\xC4N\x9C\xCBv\xF6\xC8\xEE:\xBB\xD9\xC8O\xE2\xFB&gt;\xEC\xB7O\xF9\xB8\xD5=H\xCA٥\xDC=\xDD\xD5\xD5\xD5\xD5U\xBF\xAAj|\xCE\x97N\xC8\xC5ӤȈ\xBF\x89r\xB3\xEE\xCF@ȩ\\\xEF\x9F        )\xCB\xE9T\xC6\xEC\xC7\xD9Cm        \xCB\xCA\xF6ww/--\x97\x8E\x8D\xDCBw\xEFɓ'\xBB{\xFA\xBA\xFB\xFA\xBA\x90\xA3\xCB\\xC9X\xEArW\xC6&lt;\xDC6\xC0\x8Chf,\x97\xCCZI#\xA3\xB0\xB95\xF2\xD6Cmm%\xA9\xF1XEh6\x9FKq\x91\xF1X\xB7\x96\xD2\xD2Z\xC62\xBB{\x83\xBD((\xEB׍\Z\xB5\xD4l6\x95\x8C\xA9L\\xF7r\x97\x990bח\xD4E\xADKO\xA9f\xE2T\xF7#\xDBc%\xAD\x94607\xA2\x9AJi\xCB\xCAqepk?\xE7\xB6Ys|Kсm\xD7T\xD9\xEE`\xCCHwgsF&lt;C\x9Dt\xC57o\xDF\xC2Dd\xF3\xD1T\xD2Lh\xB9\x81|\xE6z\xC6X\xB2\x8Fآ2\x9EXNS-c'G\x99\xC6\xD6Sjf!\xAF.h\xA3\xE7\xF9Ze\xCEuT-m༱\xA8\x9C(}=\xBD}\xB6\x8Cx\xAA\xFBc\x97(\xE8\xBF2\xE2\xFB\xC7)2,lnn^q;\xD0\xC1Nl\xA2ta\x8A\xF0\
 xBF\xAA\xD7f\xD7\xFB\xD1៸\xA7.\x85\xA6P\x8D|\?\xBB\x97\xA4=\xA7\xA6\xB5^\xE2#A&quot;\xE2\xFE͚+x\xE9k@\xE8\x90a\xA445#.ɸs\xCA\xCA%3 \x8Edƒs9uE\xCC\xE3PAݼ\xDC7Am\x919Te\xEFxx4\x973r|R;\xA5\xC5򹤵\xB2Er\x86\xA3\x8Fk1ˡ\xC6\xE3\xCE\xF3\xF9tT\xCBU\x9F׬)K\xB5\xF2&amp;g\xA8\xB2eƓf6\xA5\xAEH\xB8\xB2\xA0\xB9\xCA\xDA;\xA7\xB2(N\xAB\x9A7jN\x8B۲d{GF\xB3\xBCS\xDBȮy5K$\xB5\x9A\xF9\xBC\xA9+\xE9lN3M\xB4\x9F\xDBލP\xBD\xF3\xC9L\xD2J\xAA\xA9\xE4\x93Z\xBCv~)\x81\xC2ѣV(\x99\xD2Σuv\x99x**\xD0UY        &quot;\xB8\xE5\x95|2\x9AK\xC6\xB4jDOpEMF0o%S\xF2\xE5\x99\xF1!\xBE\xE0_Ь\x99\xA7\xFA\xCD{)^䙪hbn\x9BP\x9C\x8C[Zڍ\xD5T^ \xEB\x95\xE1\xA0%\xE3pz%\x8B\xC4\xF2Ȧ1\x85\xEDф\x96Y\xB0\xAE[\x8A\xE9\xCEiicQcc\xEF\xD6pВb\xE8\xE4\}LM\xC5\xF2)t\xE7p&gt;\x97CL\xA11\x98\xEC[S\xF2ÔfY\xB3e\x9E3\xE2I\xBDi L\xB5\xF1L\[\xEBU)C\x8D_*\xDB\xCAmd\xD8uS\x9A\xA5y\xB2\xAA\x958\xA7Z\xB1\x84fR#\xC3\xF1Pcdv\xE0\x83\xA2\x9C \xC8V\x93\xD5r,\xD4g&amp;'\xF8\x8E\x86-m\xF7o\xB2?\xA2\xAD\x9
 4\x8C&quot;\x9A\x98+\x98\xD6\xD3ɴ\xE612P\xEDJ\xA8\xE6`\{&quot;\x8F\x9A\x8E\xE0Z\x86\x99\xDEl\xDC\xE9\xB8\xFE\x8A\xE3\x9C\xF3&amp;C\x9C\x8D\xA9E5g\xBA\xE77\xC7\xD4L&lt;\xA5\xE5pmI\xF1&quot;v\x87\xD5T*\xAAƮ\x9B\xB2\xA9e\xE26pύ\x9F?7sn\xFE\xD2\xF8\xC8\xF4Xuy66:~fl\xFA`)\xEFl\xE5\x9C\xC1\xA9c\xDD}==\xF7uG\xF3\xC9ڶ~\xEE\xFBm\xA0\xB7\xEC$\x8E\xD8_\xFB\xFE\xC3\xE6\xE3dF\xCB\xD8\xC94\x9E\xB1\xB4\x9C\xB3\xF96\xE3\x9E\xFFG\xC8\xDE\xED\xDC\xCF\xEF\xC1ֹ\xA3r7\x85\xC7faf2\xE5\xA1K\xB3\x93@\x9C\xE1\xB4a\x9E%\xA6l)\xECb%\x84Kz*o&amp;h)\x82\xAA\xD1+\xE1\xA5̅\x9C\x81޵V\x9C\xF9,Kn&quot;Rb\xF9Y#\xEBLq\xDC:M\x96\xC85g\c\xC8-\xB8h\xA2\xF3\xABpkA8\x82X0J\xB9\xC7\1ˮ2\x90\xAAʃ jFKUM\x84\x87'槦Ó\x83gF\xBDXS\x96\xCA@\xAEOf\xD4O\xA1\x82\xA6QoT\xF6\xF8tBSbv4(\xECh\xC5\xD0 i\x98\x87\x94\xA4\xA9X\x86\xA1\x98i\x84\x8E\x94\x92]\x95k\x8C\xC1,\x89W\xB2\xEC\xFC\xA0r#\xCCԔd\x860uQM\xA6\xD4hJS\x96\x92q+\xA1 \xB8\x94\x84\x96\HXL\_\xEF\x89첲\xAC\xF4{\xBFFNI\xA9\xB9-
 \xF4\xA5\xEF        \x9A\xB4cN\xC68\x99\xC0\xB0\xD3r\xAE\xE1\xF0\xB9 \xA3ӣ&gt;D(\xF7\xE5F\xA1\x86q\x8D\x87\xE7G''Ó\xD5S\xA3\xC33\x93\xE3ӗ\xED\xA9;\xC57\x8EgtÁ5\xDA\xC3\xF8\xB4\xA0[2\x99&lt;h\xE1rd\xBB\xF1\x94I\xB4\x97fZ&quot;\xDB\xE4\x98=7ᴘj\x96\xA4\xB1\xE8\xAD.!iїQS\xFE\xD1Ҁ\xC3QWcZ\xBB\x9E\xCFĘ\xF2\xED7r\x9A\x95\xCFe\xF0\xFE\x99\xB8\xB1L\x{1AD089}\x9C\xA6?\xF8Rʏ\xCDX\xEARc1tI\x97\x9E3\xD2U\xE6\xF6d\xF1h\xD9\xD1
+\x9F\xF6s\xCBV\xB2\xB474S\xC9\x96\xC2\xC5(\xB6f\xDE&amp;\xF7\xA03˧\xCB,\x93raw  \xBFxQi\xB3O\x9Cfq#\x9AAd\xB9̡-Z\xA2\x85\xB7uNj \xA3\xCBYgk{\xB0\xB3\xA3\x95\xE64CL\x83\x87]\xF9 \x96l5\xAB\x9Df`\x8Ai\x8C\xD52\x8C\x98 %\x9DG=\xD3,\xD2\xCA\xD0j3K|A\xF7\xE4\xC0)\x9E֯\x80\xDBc/\xF2\x99\xC4U\xCD]\xC2'e\xEE\xC58\x8E\xAA\xB7\x88\xF3\xA3S\xC3U\x956sgUV\xF1\xD1f7\x8B\xE1\xC7y\xF8\xCC\x9F\xFD?\xB4\xAD4\x81yV\xC1\xB7r.\x890T0\x9E\xD3I^\xD0̝z\xD3h\xCEX21\x8D(%'W\x8A\xAEh\xE5\xF2Z\xF5=5\x99-\xF0?\xCF\xCA\xD6\xFA$\xE5&gt;?:\x8D\xB1;8=3%c\xF4\xC4Y\xEE1\xDD\xA2\xD267#\xDAI\xC7[\xF2\xD5$RVd\xE6\xD1\xAB$ɘ\xB2|\xABe=\xAB2\xACF\xEC\xDE^KB,U\xD9\xF5\x82\x86&amp;f\xA6\xC6FG\xC4$ \x8A\xEBڊ\xCBH\xC5y\x91qe\xB4%&gt;\x90x\xE4\xD1 \xA3\xE7G\xC6ϟ\xA1\x98\x95\xE2\xF3\xCF\xC1L\x86G5C)\xA8 \xA7\x92\xA8S\x97\x99\x8Ck\xDCa\xC2S\xA2\x9A\x96ai\x83q\xC7,u6K\xBEW\xA6+E\xE3\x92\x95\xDC\xC2\xDCb\xF1uO\x82\xE1\xB9I\x8AZ9@M\xF9\x8C\x94R\xE2T\xEDy\xC3RG\x97c\x9A
 \x868\xE0\xC8\xF1W*c9rĘ׎O\x95\xF6#d\xD5\x8B\xAB\x9C\x{DA21}\xC6\xF7\x9B\xDBW\xE9j\xE6y`yx\xA1\xE39\xCC\xCDǗXf\xAB\xB9\xA7\x9ET\xED(=\xFEO\xAA\x86\xBF]\xDF\xFC\x95\xE2\\xAE\xBA.\xA4La)\x8E\xCB\x95j\xAE]캢v=\xD9\xD3u28\xD7\xD9 \x9D\xA6U+\xDFj\xEDX\xB6\x9FZ\xD02Wq\xD7&lt;\xDB
+\xB8 \xD78j\xF6] \x87\x83K\xEC+\x88g\xC5R\xE9oj\x80\xB9\xC1\xDFX'\x91\x86\x86\x86\x8DC\x91\xC8np=\xD2\\xD7&lt;\xD1|\xAE\xF9|s\xB8\xF9B\xC3d\x83ְ
+\xB8p\xA0yH\xF4J\xB8^\xB1\xAA\xBA\xC6\xE7\xAFu\xC9\xD0@w{]\x8D@\xFF
+
+&quot;\x89\x82\x93\xA5ࢂ\x9B
+*x)TQ\xA8\xA1\x82\x8F:j)\xD4QG=\x95vQ\xE7n*5R\xA9\x89J\xCDT\xDAC\xA5\xBDT\xDAO\xA9B\xE1 \x85CSh\xA1\xD0J\xE1\x856
+\xED:(tR8J!@\xA1\x8BB\x90B7\x85
+\xBD\xFA(\xA3\xD2q*\x9D\xA0\xD2}T\xBA\x9FJP\xE9$\x85~*=H\xC5ST|\x88\x8AT|\x98\x8A\xA7) Ry\x98\xC2\x95G\xA9\xA2p\x86\xC2\x85q
+g\xE5# @n\xB9\xE4\xA3 \xB9\xE4V\x90\xBB@\x82\xDC+r/\xC8} \xB7\x83\xDC\xF2!\x90\x82\xDC\xF2a\x90\xD1\x8FҺ)
+\xD3\xF2 \x8E/R\xB8DaV\xBE \xF2\xD8\xF2c ρ|+\xE4y\xA0\xDE99\x82,1Z\xAF\xD3\xFA
+        
+I9\xB2ԙ\xA5\xF0\x85\x93\x82E!Oa\x91\xC2&lt;\xF5.Q\xEF
+\xF5&gt;I\x9D7(&lt;E\xE13&gt;+O\xA3\x90\xEBt\xD7\xE7\xF0\xF3wP\xBD\x88\x9Fg\xB0ݤ\x9E/\xF5|        ۳ؾ\x8C\xED9l\x8B\xD4\xF3&lt;mP\xF8
+2\xBD\x80\xC3\xF1\xFB\xB6W\xB1}9\xBE\x89\xED[\xD8^\xC3\xF6m\xA4}\xE4\xD7\xBF\xDF\xF9+\xF9{ؾ\xCF\xE6?\xC4\xF6#\xDC\x85\xC2\xDB8\xFC1\xB6wp\xCB\xEB\xD8~\x8A\xED+l?\xC3\xF6sl\xEF&quot;\xDB/\xF0V\xBFD\x9E\xF7@\x8E\x82\xFC&gt;J\xF9\xB6_c\xFB\xDBo\x98\xC4\xDFb{\xE4?\xE0\xFCc6\xFFl\xFFT\xF8'\xA0\x8E?a\xFBgl\xFF{aF\x81\xC1\xD5\xFFYqt\x90\xF2\xFE\xC4\xB6+p\xF0\x99\x83u&quot;v6r\x88\xA5\x8E\x91\xEC\x80h\xEFd?4\xEDeʼn\xE8\xB0' \xB8\x88 \xD8B\x99u\xEE\x92L\\xE5\xFF\xC0\x83\xFB$$yp\xE0\x92\xBC\xDEj\xF0\xE28@\xF02\xFE\xAA\xD2\x85\xAB\xD5S\xEA\xF8\x9FP\xE3\x93E\xED~BjI!R\xCFw\xB1\xAE\x81u\xBB        q\xEC\x83FB\x9AH3a^o/\xDEni?\xE7\xFC\x91\xABq\x82\xD0$\xEE\xC3@&lt;-@\xBC\xAD@\xAA\x8E\xE0\x81m@jځ\xF8:\x80\xF8;\x81\xD4RR߅g\xF1\x88n&lt;\xA1Hc/\x90\xA6&gt; \xCDǀ\xEC9d\xEF         \xFB\xEE\xB2\xFF~ \xA2\x9Cr\x80j\xF2\xC8.\xD2\xEA|\x90\xE0]N1uB\xFD\xC8\xEBr\xE44\x906&quot; \xF0
+\x8E!&quot;x\x8E&quot;\x86H;4\xE1E;\xD0j.\xD9_\xE8\xB96غ\xEAൡ\xD6gA:\xC3,+\xC8\xEEס\xD0S'\x85p\x90̐UϝbA?\xA0cߪ\x8E`\xAF\xA8\xA3\xD8VCط\xA8g\xB0\xA8c\xD8w\xA8\xE3\xD8\xEFW\xCFbD}\xFB6u\xFBv\xF5\xF6\x9D\xEAy쏪a\xEC\xAA\xB0?\xA4&gt;\x8A\xFDu\xFBfu
+\xFB}\xEA4\xF6{ՙʸ_\xBDX\x98k\x8A\:\xDB\x89Ƃ\xDEX ? g\xC8@v;QK\xBD~ o-8d\xF7p\xA1GY\x9D\xBD[(&amp;\xEA \xBA_\xBF\xAC_\x89̾\xF7Jg-&quot;\xA5\xA3\xB8X{\x90\x90\xB9ٳ\xB3Y\xD6
+z]\xF8*\xAC\x85#\x9CsM\xBD\x82\xDF\xF0A\xC1\xE2\xC1\x92\x80\xD6\xF0ଘ\xD8U\x9F` N\x89\xCA\xEE54\x90r+&amp;*\xAB\x9E+\xA6_+\x86桶\x9D{\xA2G\xD6\xEA\xBAmc\x85b\xE8Tx\xD6\xD4H\xE0jL\xF4!\xA2\xD51\xB1Bd\xB5\x8EB\xA1\xD7\xD7B\x{1CB2DD}1ɟ$Bd\x9Bo]\x8D\xF8.Uf\x8FG:\xF8\xAEp\x8C\xF8\x91\xEACDŘ3p5\xEAl\xC6Xj!\xBEfvJi&gt;\x8C        &gt;\x81\xF5.瞿ln
+oon~\xB0\xB9\x89\xA3\xA8\x84\xB7\xA5\xEC\xB6\xCD\xEC\xEE\xE5\xC9[7S\x90\xC3%\x88\xB2\xBB\x85\xD9#tn\xDD]\xF3\xA30e\x8C\xB3\xAC\xE9\xBC\xE8\xBAMYG^\x99I۳]\x9A{K\xDA\xCB\\x9C\x9B\xB1\xC8\\x9C/#\xC1\xC3\xB9\xCBޣ&quot;[\xE5\x885\\xF42׸K\x8Bz)U&quot;\xAAs)\xA1b޹HV\xA5\xBB-\xC4\xDA\xF0a\x9C\xCAk\xFC(λ\xAEG\xF4HX\x83\xF5\xAD\x8D\xF5\xE2\xAE\xFF\xDA\xDCd⪝\x92쾟\xDE\xE6ݲfo\x95M\xBC\xD6a](꺂\xBE\x91\xD07&quot;n\xAFaۏ\x97t_\xF5ܵMb\xEF]/\xEF-\xDA{\xD7\xEA\x9AR\xDC\xDA\xEB\x93\xF0\xDEm\xEC&amp;\xFEp;).ϐ\xC0cɌ\x90\xA8 D3(\xEF\xC7\xFAi8\x82\xEC~(\xA1\xC1\xBA`\xDD)&quot;\xA9ց\x86\xAAg D\xC5\xFD\xC5\xD6Uכ\xA19\xE6\\xABc\xD2y4\xA0\x94P?\xA9݇H\x88\xE2\xDB\xC5F\x91\xA4\xFEx\xF8:\xF8v\xF3\xC5\xC7\xD7\xA9@\xFA\xF6\x8C\xB0Ń`\xAFg\xAA+\xF4\xCCQ;\xA4Rg)\xACR\xAE\xC1.\xB6\xE4-\xBB*\x94\xA45\x88NٝgZm\xCCe\xCEf\xC8j\xE6N1\xE2ҍ\x82\xDE\xCE
+ň\xAC?Q\xD0{\xF9Э\xE7
+z#\xA6n\xA1\xDEkz\xFE\xA5\xD0&quot;\x96\xDFA1\xA4\xAC\xB5\x90\x96\xCDВ\x80k-d-\xB0Z6\xDBX,\xDF.\xE8\xBBoߊIŹ\x95\xA8tv\xC2O2]wK\x92\xBB\xE6\xAF\x98\x97:\xEF\xF6h\xA0\xAC\xDEH \xB4\xA5\xF6X\xC2ϭ\xB4\x93M&lt;i\xAAA1+\xCC\xDD\xD0 \xFAS\xFAg\xCE\xDE\xB6\xC1w1ڳ\xD6s\x85tnt\xF6MC\xA4\xADs3p]\x90\xEF\xB33\xDAe\x9F EFn\x9E\x86\xD0*\xC0\xAD\xB4\xD8B6P\x8C\xF8&lt;葧1\xBE{~`(\xB6\xCF\xC5EI\xFFr: 8\xB19C= .+\x8E\xA4&gt;,w}\xA2\xC3\xFF\xC9\xE6\xA6Kd\xB2S\x8EZ\xAA\x81\xF9Ʒ\x97\xF1\xA0\xB7\xF4`\xEEI\xA3/\x91\x892\xC1с\xA1\xA7\xF1        B?\\xE4֦\xE4 X\x9D\x80&lt;\x83\xF5\xC9A\xBE\x88\xEA\xF9\xD6(y\xAB\x94\x874\xB2\xAB-\xF4\xD7B_h٬\xC6;2ֆ\xEEkb8\xA3\xE8\xD2\xF0q\x96\xE9\x9AEO\xA5\xE3\x8B\xFAs\xFC|\\xE3\x9A+\x8F= \x85+(*\xF2&lt;\xBE
+CPЏ\x85\xBE\x82\x8DýN\x87\xBB\xE6#\x819\xE4N\xB7&gt;\xF0^གྷ\xF7\xA2\xEDi\x87A\x99\xC1 \xF05(\xE9\xD7\xC4l\xC0H-d\xDB\xE3ܶP\xC6#sX\xB1\xA3\xD0/\x9F\x92$\xF0+\xC2vIŽ\x85\x8A$$Ͻ\xC0\xCF\xBD\xC0Ts\x94\xE7\x82=g\xCEd\xEB\xCB n\xF7\xD8\xD7\xF9\xD6ہ\x97\xB1\xBD\xB7\xD9&gt;bi\xC9\xF6\xA1\x84v\xF451\xC8\xE4\xEE\x96 \xC7\xC0Ɓ&amp;\x9C\x81\xD6\xDB\xC2[\xC2W\xE1E\x90\xBE\x86.v\x90\x97\xD0\xC5\xF2ut\xB1\x83\xBC\xCC]\x8Cn\x95&lt;d\x9F\x84\xD6~\xD5Q\xB1\xB6mU\xAC\x886\xE6g\xE6\xD1(\xAF\x80\xFE*\xDC\xEA\x{133AA8}\xDC*ٺ_D\x91\x85\xBF\xB0t\xB7\xE1^\x85\xCBN\xB4\xA5}\x93I\xC3XG\xE0Mf\x9F\x82\xDE\xE0ߏ\xB2\xBF\x81\xB7\xE0\xAC\x9D\xF6\xF45{Z\x8F\xD2\x80X\xD9U\x8B\xC8\xC0\xD3&gt;\x89\x98r&lt;}+Z\x88Ԗ\x82D}\x84\x843O\xA4J\xFF\xF2\x9F\xC4t\xC1\xF3P`&amp;\x84\xCFc?\xBE\xD6v\xE4N\xDF-B\xB6Jm\x9AI\xAD̟\xB1-Qz0k\xA4\x9C,\x8A\xB8ǝz&gt;\xFC]p𨺍\xEF\xB4ßr\xC9\xDF\xC8\x8Bfz\xCDj[\xE9\xACD]\xE1H\xA2\xED\x85{~3\xC0\xE3\xF4C\xE1O\xC2'\xE8G \xD57\xB
 9\xBF\xC7\xFD\xF8\xF7\xE3\xF7\xB7\xF9\xF1\xAA\xB3\xE4\x87\xAA\xB3d?˱\xAC\xE2\x85Z        +\xC1\x84=\xB2\xF7\xAF\xF6\xEBÅ^\x8D\xC9쁆u F\xA3b-&gt;u s\xF4,%\xA1        ?\x80\xB7\xAF\xAF=Ty\xF8t\xC6d\xFB\xE5\x95\xCBO\x9F\xA8\xAC^ẳ        .\xF2\x97Ph\x8E\xA0t_+3\x9A \xE6\xE66\xD8\xE7rG]\x91\xB7A\xFF1\xD4\xF7\xE2k\xC3\xA5\xEA;u\xAE\xA9?\xC1\xBE\xA8\xFE\xFBu\xF5g\xD8GE\xF5\xE7\xEC#\xA9\xEF\xA2\x8DQ'\xAFc\xF6\xE6_@\xFD.^q~\xACŜe\x86\xB61\xDBā\xDFs\xC0m_\x80\xAB\xF1\x8B\xA2[\x85\xF0rQMa
+:\xE8\xC4t\x8E\xBB\xBBE\xFD\x97\xA0\xBF\x81\x9B\xF5\xED\xFC\x88!\xF0&gt;&gt;NC\xF0z\xE0\x8F0\xE3\xD8Ja&gt;?\xE7\xFB{\xAEʶ\xBCvH\xC0\x97FS\xA1'rI\xFFD\x86\xDE\xEDd\xB9\xBAg\xBF\x86\xC8\xE0\xBB\xE8\x86\xC3\xF8\xFEta\xD7H\xC4\xD3\xF9z&quot;\xBF\xC1\xF6[l\xBF\xC3\xE6\xC3\xFFf\xC9&gt;\xFE\x97\xA89\xC3\xDE_\xF8\xDBC\x87\xADQ\x94\xDE`\}\xEE\xB2n\x83\xBD\xB4\x8B\x89&gt;\xEA,L\xA7
+\xFA\xA9\xC0\xBF\x82\xFE{X\xEC\xACş(l\xFEIiN\x99&amp;7\xF5?\xC0b\xED,\xC7\\x895\xF1K\xC2\xFF\x81\x87!\x81\xC9\xC6\xD0C\xA11L$&amp;\xB8^\xA8\x88I 0\xDE\xFF\xA8\xF0n\xAC\xF4\x81\xED\xBC\xA8\xE9Q\xA5a\xFE\xC4\xE0\xE7\xD5g\xCFʍ&quot;\xABp\xF8I\xC6\xFA\xB6\x9F-\xAD\xD7Pd\xF8#X\xFBo\xBB\x88Ь\x85\xF6\xF1!,
+\xA2\xC4\xEC\xC9\xE5 H1\xD9\xC5\xF0*8\x90\xA1\xED\xE9\xF0\xE1;\xE3c`\xF5\xCC¾Dҫ\xEA\xD8\xB7\xCA\xFFl&lt;\x8D\x93\xFF;\xA3\xAD\xA9
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgprocess_bugcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/process_bug.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/process_bug.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/process_bug.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -277,7 +277,7 @@
</span><span class="cx">     if (should_set($dep_field)) {
</span><span class="cx">         if (my $dep_action = $cgi-&gt;param(&quot;${dep_field}_action&quot;)) {
</span><span class="cx">             $set_all_fields{$dep_field}-&gt;{$dep_action} =
</span><del>-                [split(/\s,/, $cgi-&gt;param($dep_field))];
</del><ins>+                [split(/[\s,]+/, $cgi-&gt;param($dep_field))];
</ins><span class="cx">         }
</span><span class="cx">         else {
</span><span class="cx">             $set_all_fields{$dep_field}-&gt;{set} = $cgi-&gt;param($dep_field);
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgquerycgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/query.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/query.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/query.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> use Bugzilla::Keyword;
</span><span class="cx"> use Bugzilla::Field;
</span><span class="cx"> use Bugzilla::Install::Util qw(vers_cmp);
</span><ins>+use Bugzilla::Token;
</ins><span class="cx"> 
</span><span class="cx"> my $cgi = Bugzilla-&gt;cgi;
</span><span class="cx"> my $dbh = Bugzilla-&gt;dbh;
</span><span class="lines">@@ -51,6 +52,8 @@
</span><span class="cx"> 
</span><span class="cx"> if ($cgi-&gt;param('nukedefaultquery')) {
</span><span class="cx">     if ($userid) {
</span><ins>+        my $token = $cgi-&gt;param('token');
+        check_hash_token($token, ['nukedefaultquery']);
</ins><span class="cx">         $dbh-&gt;do(&quot;DELETE FROM namedqueries&quot; .
</span><span class="cx">                  &quot; WHERE userid = ? AND name = ?&quot;, 
</span><span class="cx">                  undef, ($userid, DEFAULT_QUERY_NAME));
</span><span class="lines">@@ -245,13 +248,6 @@
</span><span class="cx">     $vars-&gt;{'category'} = Bugzilla::Chart::getVisibleSeries();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-if ($cgi-&gt;param('format') &amp;&amp; $cgi-&gt;param('format') =~ /^report-(table|graph)$/) {
-    # Get legal custom fields for tabular and graphical reports.
-    my @custom_fields_for_reports =
-      grep { $_-&gt;type == FIELD_TYPE_SINGLE_SELECT } Bugzilla-&gt;active_custom_fields;
-    $vars-&gt;{'custom_fields'} = \@custom_fields_for_reports;
-}
-
</del><span class="cx"> $vars-&gt;{'known_name'} = $cgi-&gt;param('known_name');
</span><span class="cx"> $vars-&gt;{'columnlist'} = $cgi-&gt;param('columnlist');
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgreportcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/report.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/report.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/report.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -84,10 +84,12 @@
</span><span class="cx">    $height &lt;= 2000 || ThrowUserError(&quot;chart_too_large&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+my $formatparam = $cgi-&gt;param('format') || '';
+
</ins><span class="cx"> # These shenanigans are necessary to make sure that both vertical and 
</span><span class="cx"> # horizontal 1D tables convert to the correct dimension when you ask to
</span><span class="cx"> # display them as some sort of chart.
</span><del>-if (defined $cgi-&gt;param('format') &amp;&amp; $cgi-&gt;param('format') eq &quot;table&quot;) {
</del><ins>+if ($formatparam eq &quot;table&quot;) {
</ins><span class="cx">     if ($col_field &amp;&amp; !$row_field) {    
</span><span class="cx">         # 1D *tables* should be displayed vertically (with a row_field only)
</span><span class="cx">         $row_field = $col_field;
</span><span class="lines">@@ -210,7 +212,7 @@
</span><span class="cx"> $vars-&gt;{'tbl_names'} = \@tbl_names;
</span><span class="cx"> 
</span><span class="cx"> # Below a certain width, we don't see any bars, so there needs to be a minimum.
</span><del>-if ($width &amp;&amp; $cgi-&gt;param('format') eq &quot;bar&quot;) {
</del><ins>+if ($width &amp;&amp; $formatparam eq &quot;bar&quot;) {
</ins><span class="cx">     my $min_width = (scalar(@col_names) || 1) * 20;
</span><span class="cx"> 
</span><span class="cx">     if (!$cgi-&gt;param('cumulate')) {
</span><span class="lines">@@ -232,8 +234,6 @@
</span><span class="cx">     $vars-&gt;{'debug'} = 1;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-my $formatparam = $cgi-&gt;param('format');
-
</del><span class="cx"> if ($action eq &quot;wrap&quot;) {
</span><span class="cx">     # So which template are we using? If action is &quot;wrap&quot;, we will be using
</span><span class="cx">     # no format (it gets passed through to be the format of the actual data),
</span><span class="lines">@@ -242,7 +242,6 @@
</span><span class="cx">     # data, or images generated by calling report.cgi again with action as
</span><span class="cx">     # &quot;plot&quot;.
</span><span class="cx">     $formatparam =~ s/[^a-zA-Z\-]//g;
</span><del>-    trick_taint($formatparam);
</del><span class="cx">     $vars-&gt;{'format'} = $formatparam;
</span><span class="cx">     $formatparam = '';
</span><span class="cx"> 
</span><span class="lines">@@ -311,6 +310,10 @@
</span><span class="cx"> sub get_names {
</span><span class="cx">     my ($names, $isnumeric, $field_name) = @_;
</span><span class="cx">     my ($field, @sorted);
</span><ins>+    # XXX - This is a hack to handle the actual_time/work_time field,
+    # because it's named 'actual_time' in Search.pm but 'work_time' in Field.pm.
+    $_[2] = $field_name = 'work_time' if $field_name eq 'actual_time';
+
</ins><span class="cx">     # _realname fields aren't real Bugzilla::Field objects, but they are a
</span><span class="cx">     # valid axis, so we don't vailidate them as Bugzilla::Field objects.
</span><span class="cx">     $field = Bugzilla::Field-&gt;check($field_name) 
</span><span class="lines">@@ -320,7 +323,7 @@
</span><span class="cx">         foreach my $value (@{$field-&gt;legal_values}) {
</span><span class="cx">             push(@sorted, $value-&gt;name) if $names-&gt;{$value-&gt;name};
</span><span class="cx">         }
</span><del>-        unshift(@sorted, ' ') if $field_name eq 'resolution';
</del><ins>+        unshift(@sorted, '---') if $field_name eq 'resolution';
</ins><span class="cx">         @sorted = uniq @sorted;
</span><span class="cx">     }  
</span><span class="cx">     elsif ($isnumeric) {
</span><span class="lines">@@ -349,6 +352,7 @@
</span><span class="cx">     else {
</span><span class="cx">         $value = shift @$result;
</span><span class="cx">         $value = ' ' if (!defined $value || $value eq '');
</span><ins>+        $value = '---' if ($field eq 'resolution' &amp;&amp; $value eq ' ');
</ins><span class="cx">     }
</span><span class="cx">     return $value;
</span><span class="cx"> }
</span><span class="lines">@@ -357,5 +361,5 @@
</span><span class="cx">     my $field = shift;
</span><span class="cx">     my $cgi = Bugzilla-&gt;cgi;
</span><span class="cx"> 
</span><del>-    return join('&amp;', map {&quot;$field=$_&quot;} $cgi-&gt;param($field));
</del><ins>+    return join('&amp;amp;', map {url_quote($field) . '=' . url_quote($_)} $cgi-&gt;param($field));
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgshow_bugcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/show_bug.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/show_bug.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/show_bug.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -51,9 +51,6 @@
</span><span class="cx">     exit;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-my $format = $template-&gt;get_format(&quot;bug/show&quot;, scalar $cgi-&gt;param('format'), 
-                                   scalar $cgi-&gt;param('ctype'));
-
</del><span class="cx"> my @bugs;
</span><span class="cx"> my %marks;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgshowdependencygraphcgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/showdependencygraph.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/showdependencygraph.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/showdependencygraph.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx">     or warn install_string('chmod_failed', { path =&gt; $filename,
</span><span class="cx">                                              error =&gt; $! });
</span><span class="cx"> 
</span><del>-my $urlbase = Bugzilla-&gt;params-&gt;{'urlbase'};
</del><ins>+my $urlbase = correct_urlbase();
</ins><span class="cx"> 
</span><span class="cx"> print $fh &quot;digraph G {&quot;;
</span><span class="cx"> print $fh qq{
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgskinscontribDuskglobalcss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/skins/contrib/Dusk/global.css (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/skins/contrib/Dusk/global.css        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/skins/contrib/Dusk/global.css        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -30,8 +30,8 @@
</span><span class="cx"> /* page title */
</span><span class="cx"> 
</span><span class="cx"> #titles {
</span><del>-    -moz-border-radius-topleft: 5px;
-    -moz-border-radius-topright: 5px;
</del><ins>+    border-top-left-radius: 5px;
+    border-top-right-radius: 5px;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #header .links, #footer {
</span><span class="lines">@@ -40,8 +40,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #header {
</span><del>-    -moz-border-radius-bottomleft: 5px;
-    -moz-border-radius-bottomright: 5px;
</del><ins>+    border-bottom-left-radius: 5px;
+    border-bottom-right-radius: 5px;
</ins><span class="cx">     border: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx">     border: 1px solid #747e93;
</span><span class="cx">     padding: 10px;
</span><span class="cx">     font-size: 10pt;
</span><del>-    -moz-border-radius: 5px;
</del><ins>+    border-radius: 5px;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> a {
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx"> #footer {
</span><span class="cx">     border: 1px solid #747e93;
</span><span class="cx">     width: 100%;
</span><del>-    -moz-border-radius: 5px;
</del><ins>+    border-radius: 5px;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #footer #links-actions,
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgskinsstandardglobalcss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/skins/standard/global.css (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/skins/standard/global.css        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/skins/standard/global.css        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -55,8 +55,8 @@
</span><span class="cx">         border-left: 1px solid #747E93;
</span><span class="cx">         border-right: 1px solid #747E93;
</span><span class="cx">         border-bottom: 1px solid #747E93;
</span><del>-        -moz-border-radius-bottomleft: 5px;
-        -moz-border-radius-bottomright: 5px;
</del><ins>+        border-bottom-left-radius: 5px;
+        border-bottom-right-radius: 5px;
</ins><span class="cx">         padding: 0.5em;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -105,8 +105,8 @@
</span><span class="cx">         width: 100%;
</span><span class="cx">         background-color: #404D6C;
</span><span class="cx">         color: #fff;
</span><del>-        -moz-border-radius-topleft: 5px;
-        -moz-border-radius-topright: 5px;
</del><ins>+        border-top-left-radius: 5px;
+        border-top-right-radius: 5px;
</ins><span class="cx">         font-size: 110%;
</span><span class="cx">         margin: 0;
</span><span class="cx">         padding: 0.5em;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgskinsstandardshow_bugcss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/skins/standard/show_bug.css (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/skins/standard/show_bug.css        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/skins/standard/show_bug.css        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">     margin: 8px 0; 
</span><span class="cx">     padding: 0.3em; 
</span><span class="cx">     background-color: rgb(208, 208, 208); 
</span><del>-    -moz-border-radius: 0.5em; 
</del><ins>+    border-radius: 0.5em;
</ins><span class="cx">     font-size: 125%; 
</span><span class="cx">     font-weight: bold;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultaccountauthloginsmallhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login-small.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login-small.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login-small.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -36,8 +36,8 @@
</span><span class="cx">   [% IF cgi.request_method == &quot;GET&quot; AND cgi.query_string %]
</span><span class="cx">     [% connector = &quot;&amp;&quot; %]
</span><span class="cx">   [% END %]
</span><del>-  [% script_name = login_target _ connector _ &quot;GoAheadAndLogIn=1&quot; %]
-  &lt;a id=&quot;login_link[% qs_suffix %]&quot; href=&quot;[% script_name FILTER html %]&quot;
</del><ins>+  [% script_url = login_target _ connector _ &quot;GoAheadAndLogIn=1&quot; %]
+  &lt;a id=&quot;login_link[% qs_suffix %]&quot; href=&quot;[% script_url FILTER html %]&quot;
</ins><span class="cx">      onclick=&quot;return show_mini_login_form('[% qs_suffix %]')&quot;&gt;Log In&lt;/a&gt;
</span><span class="cx"> 
</span><span class="cx">   [% Hook.process('additional_methods') %]
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx"> &lt;/li&gt;
</span><span class="cx"> &lt;li id=&quot;forgot_container[% qs_suffix %]&quot;&gt;
</span><span class="cx">   &lt;span class=&quot;separator&quot;&gt;| &lt;/span&gt;
</span><del>-  &lt;a id=&quot;forgot_link[% qs_suffix %]&quot; href=&quot;[% script_name FILTER html %]#forgot&quot;
</del><ins>+  &lt;a id=&quot;forgot_link[% qs_suffix %]&quot; href=&quot;[% script_url FILTER html %]#forgot&quot;
</ins><span class="cx">      onclick=&quot;return show_forgot_form('[% qs_suffix %]')&quot;&gt;Forgot Password&lt;/a&gt;
</span><span class="cx">   &lt;form action=&quot;token.cgi&quot; method=&quot;post&quot; id=&quot;forgot_form[% qs_suffix %]&quot;
</span><span class="cx">         class=&quot;mini_forgot bz_default_hidden&quot;&gt;
</span><span class="lines">@@ -123,6 +123,7 @@
</span><span class="cx">     &lt;input id=&quot;forgot_button[% qs_suffix %]&quot; value=&quot;Reset Password&quot; 
</span><span class="cx">            type=&quot;submit&quot;&gt;
</span><span class="cx">     &lt;input type=&quot;hidden&quot; name=&quot;a&quot; value=&quot;reqpw&quot;&gt;
</span><ins>+    &lt;input type=&quot;hidden&quot; id=&quot;token[% qs_suffix FILTER html %]&quot; name=&quot;token&quot; value=&quot;[% issue_hash_token(['reqpw']) FILTER html %]&quot;&gt;
</ins><span class="cx">     &lt;a href=&quot;#&quot; onclick=&quot;return hide_forgot_form('[% qs_suffix %]')&quot;&gt;[x]&lt;/a&gt;
</span><span class="cx">   &lt;/form&gt;
</span><span class="cx"> &lt;/li&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultaccountauthloginhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/account/auth/login.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -115,6 +115,7 @@
</span><span class="cx">       enter your login name below and submit a request
</span><span class="cx">       to change your password.&lt;br&gt;
</span><span class="cx">       &lt;input size=&quot;35&quot; name=&quot;loginname&quot;&gt;
</span><ins>+      &lt;input type=&quot;hidden&quot; id=&quot;token&quot; name=&quot;token&quot; value=&quot;[% issue_hash_token(['reqpw']) FILTER html %]&quot;&gt;
</ins><span class="cx">       &lt;input type=&quot;submit&quot; id=&quot;request&quot; value=&quot;Reset Password&quot;&gt;
</span><span class="cx">     &lt;/form&gt;
</span><span class="cx">   [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultadminflagtypeedithtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/admin/flag-type/edit.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/admin/flag-type/edit.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/admin/flag-type/edit.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> &lt;form id=&quot;flagtype_properties&quot; method=&quot;post&quot; action=&quot;editflagtypes.cgi&quot;&gt;
</span><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;[% action FILTER html %]&quot;&gt;
</span><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;can_fully_edit&quot; value=&quot;[% can_fully_edit FILTER html %]&quot;&gt;
</span><del>-  &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% type.id %]&quot;&gt;
</del><ins>+  &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% type.id FILTER html %]&quot;&gt;
</ins><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;token&quot; value=&quot;[% token FILTER html %]&quot;&gt;
</span><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;target_type&quot; value=&quot;[% type.target_type FILTER html %]&quot;&gt;
</span><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;check_clusions&quot; value=&quot;[% check_clusions FILTER none %]&quot;&gt;
</span><span class="lines">@@ -149,8 +149,8 @@
</span><span class="cx">         this type will be sorted when displayed to users in a list; ignore if you
</span><span class="cx">         don't care what order the types appear in or if you want them to appear
</span><span class="cx">         in alphabetical order.&lt;br&gt;
</span><del>-        &lt;input type=&quot;text&quot; name=&quot;sortkey&quot; value=&quot;[% type.sortkey || 1 %]&quot; size=&quot;5&quot; maxlength=&quot;5&quot;
-               [%- ' disabled=&quot;disabled&quot;' UNLESS can_fully_edit %]&gt;
</del><ins>+        &lt;input type=&quot;text&quot; name=&quot;sortkey&quot; value=&quot;[% type.sortkey || 1 FILTER html %]&quot; size=&quot;5&quot;
+               maxlength=&quot;5&quot; [% ' disabled=&quot;disabled&quot;' UNLESS can_fully_edit %]&gt;
</ins><span class="cx">       &lt;/td&gt;
</span><span class="cx">     &lt;/tr&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultadminparamseditparamshtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/admin/params/editparams.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/admin/params/editparams.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/admin/params/editparams.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -93,11 +93,12 @@
</span><span class="cx">       [% ELSE %]
</span><span class="cx"> 
</span><span class="cx">         &lt;div class=&quot;contribute&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt;
</span><del>-          [%+ terms.Bugzilla %] is developed entirely by volunteers. The
-          best way to give back to the [% terms.Bugzilla %] project is
-          to &lt;a href=&quot;http://www.bugzilla.org/contribute/&quot;&gt;contribute&lt;/a&gt;
-          yourself! You don't have to be a programmer to contribute, there are
-          lots of things that we need.
</del><ins>+          B[% %]ugzilla is developed entirely by volunteers.
+          The best way to give back to the B[% %]ugzilla project is to
+          &lt;a href=&quot;http://www.bugzilla.org/contribute/&quot;&gt;contribute&lt;/a&gt;
+          yourself!
+          You don't have to be a programmer to contribute, there are lots of
+          things that we need.
</ins><span class="cx">         &lt;/div&gt;
</span><span class="cx"> 
</span><span class="cx">         &lt;p&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugcommentshtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/comments.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/comments.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/comments.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -35,34 +35,15 @@
</span><span class="cx">     [% sort_order = &quot;oldest_to_newest&quot; %]
</span><span class="cx"> [% END %]
</span><span class="cx"> 
</span><del>-
-[%# Set up the variables as needed, depending on the sort order %]
-[% IF sort_order == &quot;oldest_to_newest&quot; %]
-    [% count = 0 %]
-    [% description = 0 %]
-    [% increment = 1 %]
-[% ELSE %]
-    [% increment = -1 %]
-    [% IF sort_order == &quot;newest_to_oldest&quot; %]
-        [% count = comments.size - 1 %]
-        [% description = 0 %]
-    [% ELSIF sort_order == &quot;newest_to_oldest_desc_first&quot; %]
-        [% count = comments.size %]
-        [% description = comments.size %]
-    [% END %]
-[% END %]
-
</del><span class="cx"> &lt;!-- This auto-sizes the comments and positions the collapse/expand links 
</span><span class="cx">      to the right. --&gt;
</span><span class="cx"> &lt;table class=&quot;bz_comment_table&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tr&gt;
</span><span class="cx"> &lt;td&gt;
</span><span class="cx"> 
</span><span class="cx"> [% FOREACH comment = comments %]
</span><del>-  [% IF count &gt;= start_at %]
</del><ins>+  [% IF comment.count &gt;= start_at %]
</ins><span class="cx">     [% PROCESS a_comment %]
</span><span class="cx">   [% END %]
</span><del>-  
-  [% count = count + increment %]
</del><span class="cx"> [% END %]
</span><span class="cx"> 
</span><span class="cx"> [% IF user.settings.comment_box_position.value == &quot;before_comments&quot; &amp;&amp; user.id %]
</span><span class="lines">@@ -105,15 +86,15 @@
</span><span class="cx">   [% comment_text = comment.body_full %]
</span><span class="cx">   [% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
</span><span class="cx"> 
</span><del>-    &lt;div id=&quot;c[% count %]&quot; class=&quot;bz_comment[% &quot; bz_private&quot; IF comment.is_private %]
-                [% &quot; bz_comment_hilite&quot; IF marks.$count %]
-                [% &quot; bz_first_comment&quot; IF count == description %]&quot;&gt;
-      [% IF count == description %]
</del><ins>+    &lt;div id=&quot;c[% comment.count %]&quot; class=&quot;bz_comment[% &quot; bz_private&quot; IF comment.is_private %]
+                [% &quot; bz_comment_hilite&quot; IF marks.${comment.count} %]
+                [% &quot; bz_first_comment&quot; IF comment.count == 0 %]&quot;&gt;
+      [% IF comment.count == 0 %]
</ins><span class="cx">         [% class_name = &quot;bz_first_comment_head&quot; %]
</span><span class="cx">         [% comment_label = &quot;Description&quot; %]
</span><span class="cx">       [% ELSE %]
</span><span class="cx">         [% class_name = &quot;bz_comment_head&quot; %]
</span><del>-        [% comment_label = &quot;Comment &quot; _ count %]
</del><ins>+        [% comment_label = &quot;Comment &quot; _ comment.count %]
</ins><span class="cx">       [% END %]
</span><span class="cx"> 
</span><span class="cx">       &lt;div class=&quot;[% class_name FILTER html %]&quot;&gt;
</span><span class="lines">@@ -121,8 +102,8 @@
</span><span class="cx">         [% IF mode == &quot;edit&quot; %]
</span><span class="cx">           &lt;span class=&quot;bz_comment_actions&quot;&gt;
</span><span class="cx">             &lt;script type=&quot;text/javascript&quot;&gt;&lt;!--
</span><del>-              addReplyLink([% count %], [% comment.id %]);
-              addCollapseLink([% count %], 'Toggle comment display'); // --&gt;
</del><ins>+              addReplyLink([% comment.count %], [% comment.id %]);
+              addCollapseLink([% comment.count %], 'Toggle comment display'); // --&gt;
</ins><span class="cx">             &lt;/script&gt;
</span><span class="cx">           &lt;/span&gt;
</span><span class="cx">         [% END %]
</span><span class="lines">@@ -134,7 +115,7 @@
</span><span class="cx">             &lt;input type=&quot;checkbox&quot;
</span><span class="cx">                    name=&quot;isprivate_[% comment.id %]&quot; value=&quot;1&quot;
</span><span class="cx">                    id=&quot;isprivate_[% comment.id %]&quot;
</span><del>-                   onClick=&quot;updateCommentPrivacy(this, [% count %])&quot;
</del><ins>+                   onClick=&quot;updateCommentPrivacy(this, [% comment.count %])&quot;
</ins><span class="cx">                    [% &quot; checked=\&quot;checked\&quot;&quot; IF comment.is_private %]&gt;
</span><span class="cx">             &lt;label for=&quot;isprivate_[% comment.id %]&quot;&gt;Private&lt;/label&gt;
</span><span class="cx">           &lt;/div&gt;
</span><span class="lines">@@ -142,7 +123,7 @@
</span><span class="cx"> 
</span><span class="cx">         &lt;span class=&quot;bz_comment_number&quot;&gt;
</span><span class="cx">           &lt;a 
</span><del>-             href=&quot;show_bug.cgi?id=[% bug.bug_id %]#c[% count %]&quot;&gt;
</del><ins>+             href=&quot;show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]&quot;&gt;
</ins><span class="cx">             [%- comment_label FILTER html %]&lt;/a&gt;
</span><span class="cx">         &lt;/span&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -175,7 +156,7 @@
</span><span class="cx">   # generated HTML
</span><span class="cx">   #%]
</span><span class="cx"> &lt;pre class=&quot;bz_comment_text&quot; 
</span><del>-     [% ' id=&quot;comment_text_' _ count _ '&quot;' IF mode == &quot;edit&quot; %]&gt;
</del><ins>+     [% ' id=&quot;comment_text_' _ comment.count _ '&quot;' IF mode == &quot;edit&quot; %]&gt;
</ins><span class="cx">   [%- comment_text FILTER quoteUrls(bug, comment) -%]
</span><span class="cx"> &lt;/pre&gt;
</span><span class="cx">     &lt;/div&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugcreatecreatehtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/create/create.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/create/create.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/create/create.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -303,7 +303,7 @@
</span><span class="cx">        bug = default, field = bug_fields.op_sys, editable = 1, 
</span><span class="cx">        value = default.op_sys %]
</span><span class="cx">   &lt;/tr&gt;
</span><del>-  [% IF !Param('defaultplatform') || !Param('defaultopsys') %]
</del><ins>+  [% IF (!Param('defaultplatform') || !Param('defaultopsys')) &amp;&amp; !cloned_bug_id %]
</ins><span class="cx">     &lt;tr&gt;
</span><span class="cx">       &lt;th colspan=&quot;3&quot;&gt;&amp;nbsp;&lt;/th&gt;
</span><span class="cx">       &lt;td id=&quot;os_guess_note&quot; class=&quot;comment&quot;&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugdependencytreehtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/dependency-tree.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/dependency-tree.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/dependency-tree.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -81,11 +81,27 @@
</span><span class="cx">     [% END %] 
</span><span class="cx">   &lt;/h3&gt;
</span><span class="cx">   [% IF ids.size %]
</span><del>-    ([% IF maxdepth -%]Up to [% maxdepth %] level[% &quot;s&quot; IF maxdepth &gt; 1 %] deep | [% END -%]
-    &lt;a href=&quot;buglist.cgi?bug_id=[% ids.join(&quot;,&quot;) %]&quot;&gt;view as [% terms.bug %] list&lt;/a&gt;
-    [% IF user.in_group('editbugs') &amp;&amp; ids.size &gt; 1 %]
-      | &lt;a href=&quot;buglist.cgi?bug_id=[% ids.join(&quot;,&quot;) %]&amp;amp;tweak=1&quot;&gt;change several&lt;/a&gt;
-    [% END %])
</del><ins>+    [%# 27 chars is the length of buglist.cgi?tweak=&amp;bug_id=&quot; %]
+    [% use_post = (ids.join(&quot;,&quot;).length &gt; constants.CGI_URI_LIMIT - 27 ) ? 1 : 0 %]
+    [% IF use_post %]
+      &lt;form action=&quot;buglist.cgi&quot; method=&quot;post&quot;&gt;
+      &lt;input type=&quot;hidden&quot; name=&quot;bug_id&quot; value=&quot;[% ids.join(&quot;,&quot;) %]&quot;&gt;
+    [% END %]
+
+    [% IF maxdepth -%]Up to [% maxdepth %] level[% &quot;s&quot; IF maxdepth &gt; 1 %] deep | [% END -%]
+    [% IF use_post %]
+      &lt;button&gt;view as [% terms.bug %] list&lt;/button&gt;
+      [% IF user.in_group('editbugs') &amp;&amp; ids.size &gt; 1 %]
+        | &lt;button type=&quot;submit&quot; name=&quot;tweak&quot; value=&quot;1&quot;&gt;change several&lt;/button&gt;
+      [% END %]
+      &lt;/form&gt;
+    [% ELSE %]
+      &lt;a href=&quot;buglist.cgi?bug_id=[% ids.join(&quot;,&quot;) %]&quot;&gt;view as [% terms.bug %] list&lt;/a&gt;
+      [% IF user.in_group('editbugs') &amp;&amp; ids.size &gt; 1 %]
+        | &lt;a href=&quot;buglist.cgi?bug_id=[% ids.join(&quot;,&quot;) %]&amp;amp;tweak=1&quot;&gt;change several&lt;/a&gt;
+      [% END %]
+    [% END %]
+
</ins><span class="cx">     &lt;ul class=&quot;tree&quot;&gt;
</span><span class="cx">       [% INCLUDE display_tree tree=$tree_name %]
</span><span class="cx">     &lt;/ul&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugedithtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/edit.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/edit.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/edit.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -30,9 +30,8 @@
</span><span class="cx"> 
</span><span class="cx"> [% PROCESS bug/time.html.tmpl %]
</span><span class="cx"> 
</span><del>-  &lt;script type=&quot;text/javascript&quot;&gt;
-  &lt;!--
-  
</del><ins>+&lt;script type=&quot;text/javascript&quot;&gt;
+&lt;!--
</ins><span class="cx">   /* Outputs a link to call replyToComment(); used to reduce HTML output */
</span><span class="cx">   function addReplyLink(id, real_id) {
</span><span class="cx">       /* XXX this should really be updated to use the DOM Core's
</span><span class="lines">@@ -119,6 +118,7 @@
</span><span class="cx"> 
</span><span class="cx"> [% END %]
</span><span class="cx"> 
</span><ins>+[% IF user.id %]
</ins><span class="cx">   /* Index all classifications so we can keep track of the classification
</span><span class="cx">    * for the selected product, which could control field visibility.
</span><span class="cx">    */
</span><span class="lines">@@ -127,10 +127,10 @@
</span><span class="cx">       all_classifications['[% product.name FILTER js %]'] = '
</span><span class="cx">           [%- product.classification.name FILTER js %]';
</span><span class="cx">   [%- END %]
</span><ins>+[% END %]
+//--&gt;
+&lt;/script&gt;
</ins><span class="cx"> 
</span><del>-  //--&gt;
-  &lt;/script&gt;
-
</del><span class="cx"> &lt;form name=&quot;changeform&quot; id=&quot;changeform&quot; method=&quot;post&quot; action=&quot;process_bug.cgi&quot;&gt;
</span><span class="cx"> 
</span><span class="cx">   &lt;input type=&quot;hidden&quot; name=&quot;delta_ts&quot; value=&quot;[% bug.delta_ts %]&quot;&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugfieldeventsjstmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/field-events.js.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/field-events.js.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/field-events.js.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -24,11 +24,23 @@
</span><span class="cx">   #%]
</span><span class="cx"> 
</span><span class="cx"> [% FOREACH controlled_field = field.controls_visibility_of %]
</span><ins>+  [% vis_names = [] %]
+  [% FOREACH visibility_value = controlled_field.visibility_values %]
+    [%# Exclude non-enterable products and components outside the current product. %]
+    [% NEXT IF field.name == &quot;product&quot;
+               &amp;&amp; visibility_value.id != product.id
+               &amp;&amp; !user.can_enter_product(visibility_value) %]
+    [% NEXT IF field.name == &quot;component&quot; &amp;&amp; visibility_value.product_id != product.id %]
+    [% vis_names.push(visibility_value.name) %]
+  [% END %]
+
+  [% NEXT UNLESS vis_names.size %]
+
</ins><span class="cx">   showFieldWhen('[% controlled_field.name FILTER js %]',
</span><span class="cx">                 '[% field.name FILTER js %]', [
</span><del>-  [%- FOREACH visibility_value = controlled_field.visibility_values -%]
-    '[%- visibility_value.name FILTER js -%]'[% &quot;,&quot; UNLESS loop.last %]
-  [%- END %]
</del><ins>+                [%~ FOREACH vis_name = vis_names ~%]
+                  '[% vis_name FILTER js %]'[% &quot;,&quot; UNLESS loop.last %]
+                [%~ END ~%]
</ins><span class="cx">   ]);
</span><span class="cx"> [% END %]
</span><span class="cx"> 
</span><span class="lines">@@ -43,6 +55,7 @@
</span><span class="cx">   [% FOREACH controlled_field = legal_value.controlled_values.keys %]
</span><span class="cx">     [% SET cont_ids = [] %]
</span><span class="cx">     [% FOREACH val = legal_value.controlled_values.$controlled_field %]
</span><ins>+      [% NEXT IF !val.is_active %]
</ins><span class="cx">       [% cont_ids.push(val.id) %]
</span><span class="cx">     [% END %]
</span><span class="cx">     [% NEXT IF !cont_ids.size %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbugfieldhelpnonetmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/field-help.none.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/field-help.none.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/field-help.none.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx"> 
</span><span class="cx"> keywords =&gt;
</span><span class="cx">    &quot;You can add keywords from a defined list to $terms.bugs, in order&quot;
</span><del>-   _ &quot; to tag and group them.&quot;,
</del><ins>+   _ &quot; to easily identify and group them.&quot;,
</ins><span class="cx"> 
</span><span class="cx"> longdesc =&gt;
</span><span class="cx">   &quot;$terms.Bugs have comments added to them by $terms.Bugzilla users.&quot;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultbuglinkhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/bug/link.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/bug/link.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/bug/link.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -36,7 +36,9 @@
</span><span class="cx"> [%# We use &quot;FILTER none&quot; here because link_title is filtered down below. %]
</span><span class="cx"> [% link_title = BLOCK %]
</span><span class="cx">   [% display_value('bug_status', bug.bug_status) FILTER none %]
</span><del>-  [%+ display_value('resolution', bug.resolution) FILTER none %]
</del><ins>+  [% IF bug.resolution %]
+    [%+ display_value('resolution', bug.resolution) FILTER none %]
+  [% END %]
</ins><span class="cx"> [% END %]
</span><span class="cx"> 
</span><span class="cx"> [% IF user.can_see_bug(bug) %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultemailbugmailhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/email/bugmail.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/email/bugmail.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/email/bugmail.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -31,11 +31,12 @@
</span><span class="cx">       [% FOREACH comment = new_comments.reverse %]
</span><span class="cx">         &lt;div&gt;
</span><span class="cx">           [% IF comment.count %]
</span><del>-            &lt;b&gt;[% &quot;Comment # ${comment.count}&quot; FILTER bug_link( bug, 
-              {comment_num =&gt; comment.count, full_url =&gt; 1}) FILTER none %] 
</del><ins>+            &lt;b&gt;[% &quot;Comment # ${comment.count}&quot; FILTER bug_link(bug,
+              {comment_num =&gt; comment.count, full_url =&gt; 1, user =&gt; to_user}) FILTER none %]
+              on [% &quot;$terms.bug $bug.id&quot; FILTER bug_link(bug, { full_url =&gt; 1, user =&gt; to_user }) FILTER none %]
</ins><span class="cx">               from [% INCLUDE global/user.html.tmpl who = comment.author %]&lt;/b&gt;
</span><span class="cx">           [% END %]
</span><del>-        &lt;pre&gt;[% comment.body_full({ wrap =&gt; 1 }) FILTER quoteUrls(bug, comment) %]&lt;/pre&gt;
</del><ins>+        &lt;pre&gt;[% comment.body_full({ wrap =&gt; 1 }) FILTER quoteUrls(bug, comment, to_user) %]&lt;/pre&gt;
</ins><span class="cx">         &lt;/div&gt;
</span><span class="cx">       [% END %]
</span><span class="cx">       &lt;/p&gt;
</span><span class="lines">@@ -68,13 +69,14 @@
</span><span class="cx">           [% SET in_table = 0 %]
</span><span class="cx">         [% END %]
</span><span class="cx">         [% IF change.blocker %]
</span><del>-              [% &quot;${terms.Bug} ${bug.id}&quot; FILTER bug_link(bug, full_url =&gt; 1) FILTER none  %] depends 
-              on [% &quot;${terms.bug} ${change.blocker.id}&quot; 
-                  FILTER bug_link(change.blocker, full_url =&gt; 1) FILTER none %],
</del><ins>+              [% &quot;${terms.Bug} ${bug.id}&quot; FILTER bug_link(bug, {full_url =&gt; 1, user =&gt; to_user}) FILTER none %]
+              depends on
+              [%+ &quot;${terms.bug} ${change.blocker.id}&quot;
+                  FILTER bug_link(change.blocker, {full_url =&gt; 1, user =&gt; to_user}) FILTER none %],
</ins><span class="cx">               which changed state.
</span><span class="cx">         [% ELSE %]
</span><del>-              [% INCLUDE global/user.html.tmpl who = change.who %]
-              changed [% &quot;${terms.Bug} ${bug.id}&quot; FILTER bug_link(bug, full_url =&gt; 1) FILTER none %]
</del><ins>+              [% INCLUDE global/user.html.tmpl who = change.who %] changed
+              [%+ &quot;${terms.bug} ${bug.id}&quot; FILTER bug_link(bug, {full_url =&gt; 1, user =&gt; to_user}) FILTER none %]
</ins><span class="cx">         [% END %]
</span><span class="cx">         &lt;br&gt;
</span><span class="cx">           [% IF in_table == 0 %]
</span><span class="lines">@@ -98,7 +100,7 @@
</span><span class="cx">           &lt;th&gt;[% field_label FILTER html %]&lt;/th&gt;
</span><span class="cx">           &lt;td&gt;
</span><span class="cx">             [% IF change.field_name == &quot;bug_id&quot; %]
</span><del>-              [% new_value FILTER bug_link(bug, full_url =&gt; 1) FILTER none %]
</del><ins>+              [% new_value FILTER bug_link(bug, {full_url =&gt; 1, user =&gt; to_user}) FILTER none %]
</ins><span class="cx">             [% ELSE %]
</span><span class="cx">               [% new_value FILTER html %]
</span><span class="cx">             [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultfilterexceptionspl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/filterexceptions.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/filterexceptions.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/filterexceptions.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -106,7 +106,6 @@
</span><span class="cx">   'other_format.name', 
</span><span class="cx">   'sizeurl', 
</span><span class="cx">   'switchbase',
</span><del>-  'format',
</del><span class="cx">   'cumulate',
</span><span class="cx"> ],
</span><span class="cx"> 
</span><span class="lines">@@ -154,7 +153,6 @@
</span><span class="cx"> 'list/table.html.tmpl' =&gt; [
</span><span class="cx">   'tableheader',
</span><span class="cx">   'bug.bug_id', 
</span><del>-  'abbrev.$id.title || field_descs.$id || column.title',
</del><span class="cx"> ],
</span><span class="cx"> 
</span><span class="cx"> 'list/list.csv.tmpl' =&gt; [
</span><span class="lines">@@ -213,7 +211,6 @@
</span><span class="cx"> 
</span><span class="cx"> 'global/confirm-user-match.html.tmpl' =&gt; [
</span><span class="cx">   'script',
</span><del>-  'fields.${field_name}.flag_type.name',
</del><span class="cx"> ],
</span><span class="cx"> 
</span><span class="cx"> 'global/site-navigation.html.tmpl' =&gt; [
</span><span class="lines">@@ -222,6 +219,7 @@
</span><span class="cx"> 
</span><span class="cx"> 'bug/comments.html.tmpl' =&gt; [
</span><span class="cx">   'comment.id',
</span><ins>+  'comment.count',
</ins><span class="cx">   'bug.bug_id',
</span><span class="cx"> ],
</span><span class="cx"> 
</span><span class="lines">@@ -412,8 +410,6 @@
</span><span class="cx"> ],
</span><span class="cx"> 
</span><span class="cx"> 'admin/flag-type/edit.html.tmpl' =&gt; [
</span><del>-  'type.id', 
-  'type.sortkey || 1',
</del><span class="cx">   'selname',
</span><span class="cx"> ],
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultglobalcodeerrorhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/global/code-error.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/global/code-error.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/global/code-error.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -244,8 +244,7 @@
</span><span class="cx">     setting in [% constants.bz_locations.localconfig FILTER html %].
</span><span class="cx"> 
</span><span class="cx">   [% ELSIF error == &quot;mismatched_bug_ids_on_obsolete&quot; %]
</span><del>-    Attachment [% attach_id FILTER html %] ([% description FILTER html %]) 
-    is attached to [% terms.bug %] [%+ attach_bug_id FILTER html %], 
</del><ins>+    Attachment [% attach_id FILTER html %] is attached to another [% terms.bug %],
</ins><span class="cx">     but you tried to flag it as obsolete while creating a new attachment to 
</span><span class="cx">     [%+ terms.bug %] [%+ my_bug_id FILTER html %].
</span><span class="cx"> 
</span><span class="lines">@@ -439,6 +438,9 @@
</span><span class="cx">   [% ELSIF error == &quot;token_generation_error&quot; %]
</span><span class="cx">     Something is seriously wrong with the token generation system.
</span><span class="cx"> 
</span><ins>+  [% ELSIF error == &quot;cancel_token_does_not_exist&quot; %]
+    The token to be cancelled does not exist.
+
</ins><span class="cx">   [% ELSIF error == &quot;template_error&quot; %]
</span><span class="cx">     [% template_error_msg FILTER html %]
</span><span class="cx"> 
</span><span class="lines">@@ -467,6 +469,10 @@
</span><span class="cx">   [% ELSIF error == &quot;invalid_post_bug_submit_action&quot; %]
</span><span class="cx">     Invalid setting for post_bug_submit_action
</span><span class="cx"> 
</span><ins>+  [% ELSIF error == &quot;search_field_operator_unsupported&quot; %]
+    [% terms.Bugzilla %] does not support the search type
+    &quot;[% operator FILTER html %]&quot;.
+
</ins><span class="cx">   [% ELSE %]
</span><span class="cx">     [%# Try to find hooked error messages %]
</span><span class="cx">     [% error_message = Hook.process(&quot;errors&quot;) %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultglobalconfirmusermatchhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/global/confirm-user-match.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/global/confirm-user-match.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/global/confirm-user-match.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -150,8 +150,6 @@
</span><span class="cx">                 [% ELSE %]
</span><span class="cx">                   matched
</span><span class="cx">                   &lt;b&gt;[% query.value.users.0.identity FILTER html %]&lt;/b&gt;
</span><del>-                  &lt;input type=&quot;hidden&quot; name=&quot;[% field.key FILTER html %]&quot;
-                         value=&quot;[% query.value.users.0.login FILTER html %]&quot;&gt;
</del><span class="cx">                 [% END %]
</span><span class="cx">             [% ELSE %]
</span><span class="cx">                 [% IF (query.key.length &lt; 3) &amp;&amp; !Param('emailsuffix') %]
</span><span class="lines">@@ -176,8 +174,10 @@
</span><span class="cx"> 
</span><span class="cx"> [% IF matchsuccess == 1 %]
</span><span class="cx"> 
</span><del>-  [% SET exclude_these = 
-           matches.keys.merge(['Bugzilla_login', 'Bugzilla_password']) %]
</del><ins>+  [% SET exclude_these = ['Bugzilla_login', 'Bugzilla_password'] %]
+  [% FOREACH key IN matches.keys %]
+    [% exclude_these.push(key) IF cgi.param(key) == '' %]
+  [% END %]
</ins><span class="cx">   [% SET exclude = '^' _ exclude_these.join('|') _ '$' %]
</span><span class="cx">   [% PROCESS &quot;global/hidden-fields.html.tmpl&quot; exclude = exclude %]
</span><span class="cx"> 
</span><span class="lines">@@ -199,7 +199,7 @@
</span><span class="cx">   [% ELSIF field_labels.$field_name %]
</span><span class="cx">     [% field_labels.$field_name FILTER html %]
</span><span class="cx">   [% ELSIF field_name.match(&quot;^requestee&quot;) %]
</span><del>-    [% fields.${field_name}.flag_type.name %] requestee
</del><ins>+    [% fields.${field_name}.flag_type.name FILTER html %] requestee
</ins><span class="cx">   [% ELSE %]
</span><span class="cx">     [% field_name FILTER html %]
</span><span class="cx">   [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultglobalfielddescsnonetmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/global/field-descs.none.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/global/field-descs.none.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/global/field-descs.none.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -132,6 +132,7 @@
</span><span class="cx">      &quot;setting&quot;                 =&gt; &quot;Setting&quot;,
</span><span class="cx">      &quot;settings&quot;                =&gt; &quot;Settings&quot;,
</span><span class="cx">      &quot;short_desc&quot;              =&gt; &quot;Summary&quot;,
</span><ins>+     &quot;short_short_desc&quot;        =&gt; &quot;Summary&quot;,
</ins><span class="cx">      &quot;status_whiteboard&quot;       =&gt; &quot;Whiteboard&quot;,
</span><span class="cx">      &quot;tag.name&quot;                =&gt; &quot;Tags&quot;,
</span><span class="cx">      &quot;target_milestone&quot;        =&gt; &quot;Target Milestone&quot;,
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultglobalheaderhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/global/header.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/global/header.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/global/header.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -249,7 +249,7 @@
</span><span class="cx">   #%]
</span><span class="cx"> 
</span><span class="cx">   &lt;body onload=&quot;[% onload %]&quot;
</span><del>-        class=&quot;[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') %]
</del><ins>+        class=&quot;[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %]
</ins><span class="cx">                [% FOREACH class = bodyclasses %]
</span><span class="cx">                  [% ' ' %][% class FILTER css_class_quote %]
</span><span class="cx">                [% END %] yui-skin-sam&quot;&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultglobalusererrorhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/global/user-error.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/global/user-error.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/global/user-error.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -1177,7 +1177,7 @@
</span><span class="cx">     [% title = &quot;Missing Search&quot; %]
</span><span class="cx">     [% docslinks = {'query.html' =&gt; &quot;Searching for $terms.bugs&quot;,
</span><span class="cx">                     'query.html#list' =&gt; &quot;$terms.Bug lists&quot;} %]
</span><del>-    The search named &lt;em&gt;[% queryname FILTER html %]&lt;/em&gt;
</del><ins>+    The search named &lt;em&gt;[% name FILTER html %]&lt;/em&gt;
</ins><span class="cx">     [% IF sharer_id &amp;&amp; sharer_id != user.id %]
</span><span class="cx">       has not been made visible to you.
</span><span class="cx">     [% ELSE %]
</span><span class="lines">@@ -1334,21 +1334,21 @@
</span><span class="cx">     [%+ constants.USER_PASSWORD_MIN_LENGTH FILTER html %] characters long.
</span><span class="cx"> 
</span><span class="cx">   [% ELSIF error == &quot;password_not_complex&quot; %]
</span><del>-     [% title = &quot;Password Fails Requirements&quot; %]
-     [% passregex = Param('password_complexity') %]
-     The password must contain at least one:
-     &lt;ul&gt;
-       [% IF passregex.search('letters') %]
-         &lt;li&gt;UPPERCASE letter&lt;/li&gt;
-         &lt;li&gt;lowercase letter&lt;/li&gt;
-       [% END %]
-       [% IF passregex.search('numbers') %]
-         &lt;li&gt;digit&lt;/li&gt;
-       [% END %]
-       [% IF passregex.search('specialchars') %]
-         &lt;li&gt;special character&lt;/li&gt;
-       [% END %]
-     &lt;/ul&gt;
</del><ins>+    [% title = &quot;Password Fails Requirements&quot; %]
+    [% passregex = Param('password_complexity') %]
+    The password must contain at least one:
+    &lt;ul&gt;
+      [% IF passregex == 'letters_numbers_specialchars' %]
+        &lt;li&gt;letter&lt;/li&gt;
+        &lt;li&gt;special character&lt;/li&gt;
+      [% ELSIF passregex.search('letters') %]
+        &lt;li&gt;UPPERCASE letter&lt;/li&gt;
+        &lt;li&gt;lowercase letter&lt;/li&gt;
+      [% END %]
+      [% IF passregex.search('numbers') %]
+        &lt;li&gt;digit&lt;/li&gt;
+      [% END %]
+    &lt;/ul&gt;
</ins><span class="cx"> 
</span><span class="cx">   [% ELSIF error == &quot;product_access_denied&quot; %]
</span><span class="cx">     [% title = &quot;Product Access Denied&quot; %]
</span><span class="lines">@@ -1639,6 +1639,11 @@
</span><span class="cx">     [% title = &quot;Unknown Tab&quot; %]
</span><span class="cx">     &lt;code&gt;[% current_tab_name FILTER html %]&lt;/code&gt; is not a legal tab name.
</span><span class="cx"> 
</span><ins>+  [% ELSIF error == &quot;value_inactive&quot; %]
+    [% title = &quot;Value is Not Active&quot; %]
+    [% type = BLOCK %][% INCLUDE object_name class = class %][% END %]
+    The [% type FILTER html %] value '[% value FILTER html %]' is not active.
+
</ins><span class="cx">   [% ELSIF error == &quot;version_already_exists&quot; %]
</span><span class="cx">     [% title = &quot;Version Already Exists&quot; %]
</span><span class="cx">     [% admindocslinks = {'versions.html' =&gt; 'Administering versions'} %]
</span><span class="lines">@@ -1809,7 +1814,7 @@
</span><span class="cx">                   
</span><span class="cx">     [% FOREACH q = Bugzilla.user.queries %]
</span><span class="cx">       [% IF q.name == namedcmd %]
</span><del>-        or &lt;a href=&quot;query.cgi?[% q.url FILTER uri %]&quot;&gt;edit&lt;/a&gt;
</del><ins>+        or &lt;a href=&quot;query.cgi?[% q.url FILTER html %]&quot;&gt;edit&lt;/a&gt;
</ins><span class="cx">       [% END %]
</span><span class="cx">     [% END %]
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultlistserverpushhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/list/server-push.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/list/server-push.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/list/server-push.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -33,15 +33,10 @@
</span><span class="cx">     &lt;h1 style=&quot;margin-top: 20%; text-align: center;&quot;&gt;Please stand by ...&lt;/h1&gt;
</span><span class="cx"> 
</span><span class="cx">     [% IF debug %]
</span><del>-      &lt;p&gt;
-        [% FOREACH debugline = debugdata %]
-          &lt;code&gt;[% debugline FILTER html %]&lt;/code&gt;&lt;br&gt;
-        [% END %]
-      &lt;/p&gt;
-      &lt;p&gt;
-        &lt;code&gt;[% query FILTER html %]&lt;/code&gt;
-      &lt;/p&gt;
</del><ins>+      &lt;p&gt;[% query FILTER html %]&lt;/p&gt;
+      [% IF query_explain.defined %]
+        &lt;pre&gt;[% query_explain FILTER html %]&lt;/pre&gt;
+      [% END %]
</ins><span class="cx">     [% END %]
</span><del>-
</del><span class="cx">   &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultlisttablehtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/list/table.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/list/table.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/list/table.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx">       [% PROCESS new_order %]
</span><span class="cx">       [%-#%]&amp;amp;query_based_on=
</span><span class="cx">       [% defaultsavename OR searchname FILTER uri %]&quot;&gt;
</span><del>-        [%- abbrev.$id.title || field_descs.$id || column.title -%]
</del><ins>+        [%- abbrev.$id.title || field_descs.$id || column.title FILTER html -%]
</ins><span class="cx">         [% PROCESS order_arrow ~%]
</span><span class="cx">     &lt;/a&gt;
</span><span class="cx">   &lt;/th&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultpagesreleasenoteshtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/pages/release-notes.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/pages/release-notes.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/pages/release-notes.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -53,6 +53,221 @@
</span><span class="cx"> 
</span><span class="cx"> &lt;h2 id=&quot;v42_point&quot;&gt;Updates in this 4.2.x Release&lt;/h2&gt;
</span><span class="cx"> 
</span><ins>+&lt;h3&gt;4.2.7&lt;/h3&gt;
+
+&lt;p&gt;This release fixes several security issues. See the
+  &lt;a href=&quot;http://www.bugzilla.org/security/4.0.10/&quot;&gt;Security Advisory&lt;/a&gt;
+  for details.&lt;/p&gt;
+
+&lt;p&gt;In addition, the following [% terms.bugs %] have been fixed in this release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Internet Explorer 11 and KHTML-based browsers such as Konqueror can now
+    display buglists correctly.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=902515&quot;&gt;[% terms.Bug %] 902515&lt;/a&gt; and
+    &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=914262&quot;&gt;[% terms.bug %] 914262&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;When the &lt;kbd&gt;password_complexity&lt;/kbd&gt; parameter was set to
+    'letters_numbers_specialchars', passwords containing numbers and special
+    characters only were accepted. Now it makes sure that a letter is also present.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=897264&quot;&gt;[% terms.Bug %] 897264&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;With DB servers doing case-insensitive comparisons, such as MySQL, tokens
+    and login cookies were not correctly validated as the case was ignored.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=906745&quot;&gt;[% terms.Bug %] 906745&lt;/a&gt; and
+    &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=907438&quot;&gt;[% terms.bug %] 907438&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;All security headers (such as X-Frame-Options) are now returned when using XML-RPC.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=787328&quot;&gt;[% terms.Bug %] 787328&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Oracle crashed when reporting a new [% terms.bug %] if a custom free-text field
+    was non-mandatory and left empty.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=919475&quot;&gt;[% terms.Bug %] 919475&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;It was not possible to import [% terms.bugs %] using &lt;kbd&gt;importxml.pl&lt;/kbd&gt; with Oracle.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=848063&quot;&gt;[% terms.Bug %] 848063&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3&gt;4.2.6&lt;/h3&gt;
+
+&lt;p&gt;The following important fixes/changes have been made in this release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;MySQL 5.6 is now supported.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=852560&quot;&gt;[% terms.Bug %] 852560&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A regression introduced in [% terms.Bugzilla %] 4.2.4 made Oracle crash
+    when installing [% terms.Bugzilla %] for the first time.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=858911&quot;&gt;[% terms.Bug %] 858911&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;If a custom field depends on a product, component or classification,
+    the &quot;mandatory&quot; bit was ignored on [% terms.bug %] creation.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=782210&quot;&gt;[% terms.Bug %] 782210&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Queries involving flags were broken in several ways. These queries
+    have been fixed.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=828344&quot;&gt;[% terms.Bug %] 828344&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Tabular reports involving the empty resolution did not link [% terms.bug %]
+    counts correctly.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=212471&quot;&gt;[% terms.Bug %] 212471&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;The &lt;kbd&gt;B[%%]ug.search&lt;/kbd&gt; WebService method was returning all visible
+    [%+ terms.bugs %] when called with no arguments, ignoring the
+    &lt;kbd&gt;max_search_results&lt;/kbd&gt; and &lt;kbd&gt;search_allow_no_criteria&lt;/kbd&gt; parameters.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859118&quot;&gt;[% terms.Bug %] 859118&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3&gt;4.2.5&lt;/h3&gt;
+
+&lt;p&gt;This release fixes one security issue. See the
+  &lt;a href=&quot;http://www.bugzilla.org/security/3.6.12/&quot;&gt;Security Advisory&lt;/a&gt;
+  for details.&lt;/p&gt;
+
+&lt;p&gt;In addition, the following important fixes/changes have been made in this
+  release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Queries involving commenters were slow to return results. These queries
+    have been optimized for better performance.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=818007&quot;&gt;[% terms.Bug %] 818007&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;It is no longer possible to create a new [% terms.bug %] using a disabled
+    component, target milestone or version. These inactive values are also no
+    longer accessible when moving [% terms.abug %] into another product.
+    ([% terms.Bugs %] &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=752946&quot;&gt;752946&lt;/a&gt;
+    and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=840824&quot;&gt;840824&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;It was possible to create a new [% terms.bug %] with no description
+    despite the status workflow required one for new [% terms.bugs %].
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=818890&quot;&gt;[% terms.Bug %] 818890&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Custom multi-select fields are now available in the &quot;Search By Change
+    History&quot; section of the &quot;Advanced Search&quot; page.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=839950&quot;&gt;[% terms.Bug %] 839950&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A custom select field could have its list of values truncated if one
+    or more of its values were disabled and the visibility of the values were
+    controlled by another field.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=806809&quot;&gt;[% terms.Bug %] 806809&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Warnings thrown by Return::Value 1.666002 about this deprecated module
+    and which are polluting the web server error log are now disabled.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=826678&quot;&gt;[% terms.Bug %] 826678&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3&gt;4.2.4&lt;/h3&gt;
+
+&lt;p&gt;This release fixes several security issues. See the
+  &lt;a href=&quot;http://www.bugzilla.org/security/3.6.11/&quot;&gt;Security Advisory&lt;/a&gt;
+  for details.&lt;/p&gt;
+
+&lt;p&gt;In addition, the following important fixes/changes have been made in this
+  release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Queries involving group substitution were crashing when the &quot;usevisibilitygroups&quot;
+    parameter was enabled. Also, CVE-2011-2979 was not fully fixed in
+    [%+ terms.Bugzilla %] 4.1.3.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=788098&quot;&gt;[% terms.Bug %] 788098&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Flag names were not properly escaped when displayed on the &quot;confirm user
+    match&quot; page. An admin could unintentionally break the display of this page
+    if a flag name contains a &amp;lt; or &amp;gt; character, because these characters
+    were not filtered.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=790215&quot;&gt;[% terms.Bug %] 790215&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;We now prevent private WebServices methods from being called by external
+    applications.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=793826&quot;&gt;[% terms.Bug %] 793826&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;PostgreSQL 9.2 requires DBD::Pg 2.19.3.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=799721&quot;&gt;[% terms.Bug %] 799721&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Oracle was crashing when listing keywords or flags in buglists.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=780053&quot;&gt;[% terms.Bug %] 780053&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Oracle was crashing when typing several bare words in the QuickSearch field.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=804505&quot;&gt;[% terms.Bug %] 804505&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;[% terms.Bugs %] with the resolution MOVED couldn't be edited anymore.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=757935&quot;&gt;[% terms.Bug %] 757935&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Editing dependencies from the &quot;Change Several [% terms.Bugs %] at Once&quot;
+    page didn't work as expected. [% terms.Bug %] IDs were incorrectly parsed.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=790909&quot;&gt;[% terms.Bug %] 790909&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;The &quot;Actual Hours&quot; axis now works correctly in tabular and graphical reports.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=794389&quot;&gt;[% terms.Bug %] 794389&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;&lt;kbd&gt;checksetup.pl&lt;/kbd&gt; was failing to run if the Voting extension was
+    enabled on a fresh installation and some mandatory modules were missing.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=652047&quot;&gt;[% terms.Bug %] 652047&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;[% terms.Bugzilla %] no longer crashes when viewing [% terms.abug %] while
+    a custom field is being added.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=531243&quot;&gt;[% terms.Bug %] 531243&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;For improved security, we now send the &quot;X-Content-Type-Options:&amp;nbsp;nosniff&quot;
+    and &quot;X-XSS-Protection:&amp;nbsp;block&quot; headers with every response.
+    ([% terms.Bugs %] &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=671612&quot;&gt;671612&lt;/a&gt;
+    and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=680771&quot;&gt;680771&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3&gt;4.2.3&lt;/h3&gt;
+
+&lt;p&gt;This release fixes two security issues. See the
+  &lt;a href=&quot;http://www.bugzilla.org/security/3.6.10/&quot;&gt;Security Advisory&lt;/a&gt;
+  for details.&lt;/p&gt;
+
+&lt;p&gt;In addition, the following important fixes/changes have been made in this
+  release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Attaching a file to [% terms.abug %] was broken due to a change in
+    Perl 5.16.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=771100&quot;&gt;[% terms.Bug %] 771100&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A regression in [% terms.Bugzilla %] 4.2.2 made Oracle crash when
+    displaying a buglist.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=780028&quot;&gt;[% terms.Bug %] 780028&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;It was possible to search on history for comments and attachments you
+    cannot see (though these private comments and attachments are never disclosed).
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=779709&quot;&gt;[% terms.Bug %] 779709&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;PostgreSQL databases could be created with the wrong encoding despite
+    the utf8 parameter being enabled.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=783786&quot;&gt;[% terms.Bug %] 783786&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Scheduled whines could be sent at the wrong time on Oracle.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=559539&quot;&gt;[% terms.Bug %] 559539&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Tokens are no longer included in saved queries.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=772953&quot;&gt;[% terms.Bug %] 772953&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;An admin could unintentionally break the display of buglists if a custom
+    field description contains a &amp;lt; or &amp;gt; character, because these characters
+    were not filtered.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=785917&quot;&gt;[% terms.Bug %] 785917&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Adding or removing a DB column in Oracle didn't handle SERIAL columns
+    correctly.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=731156&quot;&gt;[% terms.Bug %] 731156&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A minor CSRF vulnerability in token.cgi allowed possible unauthorized
+    password reset e-mail requests.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=706271&quot;&gt;[% terms.Bug %] 706271&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3&gt;4.2.2&lt;/h3&gt;
+
+&lt;p&gt;This release fixes two security issues. See the
+  &lt;a href=&quot;http://www.bugzilla.org/security/3.6.9/&quot;&gt;Security Advisory&lt;/a&gt;
+  for details.&lt;/p&gt;
+
+&lt;p&gt;In addition, the following important fixes/changes have been made in this
+  release:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;A regression introduced in [% terms.Bugzilla %] 4.0 caused some login
+    names to be ignored when entered in the CC list of [% terms.bugs %].
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=756314&quot;&gt;[% terms.Bug %] 756314&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Some queries could trigger an invalid SQL query if strings entered by
+    the user contained leading or trailing whitespaces.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=760075&quot;&gt;[% terms.Bug %] 760075&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;The auto-completion form for keywords no longer automatically selects
+    the first keyword in the list when the field is empty.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=764517&quot;&gt;[% terms.Bug %] 764517&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A regression in [% terms.Bugzilla %] 4.2 prevented classifications
+    from being used in graphical and tabular reports in the &quot;Multiple Tables&quot;
+    field.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=753688&quot;&gt;[% terms.Bug %] 753688&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Attachments created by the &lt;kbd&gt;email_in.pl&lt;/kbd&gt; script were associated
+    to the wrong comment.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=762785&quot;&gt;[% terms.Bug %] 762785&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Very long dependency lists can now be viewed correctly.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=762783&quot;&gt;[% terms.Bug %] 762783&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Keywords are now correctly escaped in the auto-completion form to prevent
+    any XSS abuse.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=754561&quot;&gt;[% terms.Bug %] 754561&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;A regression introduced in [% terms.Bugzilla %] 4.0rc2 when fixing
+    CVE-2011-0046 caused the &quot;Un-forget the search&quot; link to not work correctly
+    anymore when restoring a deleted saved search, because this link was
+    lacking a valid token.
+    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=768870&quot;&gt;[% terms.Bug %] 768870&lt;/a&gt;)&lt;/li&gt;
+  &lt;li&gt;Two minor CSRF vulnerabilities have been fixed which could let an attacker
+    alter your default search criteria in the Advanced Search page.
+    ([% terms.Bugs %] &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=754672&quot;&gt;754672&lt;/a&gt;
+    and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=754673&quot;&gt;754673&lt;/a&gt;)&lt;/li&gt;
+&lt;/ul&gt;
+
</ins><span class="cx"> &lt;h3&gt;4.2.1&lt;/h3&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;p&gt;This release fixes two security issues. See the
</span><span class="lines">@@ -390,6 +605,9 @@
</span><span class="cx">     [%- terms.Bug %] 584742&lt;/a&gt;: When viewing [% terms.abug %], WebKit-based
</span><span class="cx">     browsers can automatically reset a field's selected value when the field
</span><span class="cx">     has disabled values.&lt;/li&gt;
</span><ins>+  &lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=780053&quot;&gt;
+    [%- terms.Bug %] 780053&lt;/a&gt;: Oracle crashes when listing keywords, tags
+    or flags in buglists.&lt;/li&gt;
</ins><span class="cx"> &lt;/ul&gt;
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -530,8 +748,8 @@
</span><span class="cx">     (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=640719&quot;&gt;[% terms.Bug %] 640719&lt;/a&gt;)&lt;/li&gt;
</span><span class="cx">   &lt;li&gt;Email notifications about dependencies and flags had the wrong
</span><span class="cx">     timestamp.
</span><del>-    (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=643910&quot;&gt;[% terms.Bug %] 643910&lt;/a&gt;
-    and  (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=652165&quot;&gt;[% terms.Bug %] 652165&lt;/a&gt;)&lt;/li&gt;
</del><ins>+    ([% terms.Bugs %] &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=643910&quot;&gt;643910&lt;/a&gt;
+    and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=652165&quot;&gt;652165&lt;/a&gt;)&lt;/li&gt;
</ins><span class="cx">   &lt;li&gt;You can now select &quot;UTC&quot; as a valid timezone in General Preferences.
</span><span class="cx">     (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=646209&quot;&gt;[% terms.Bug %] 646209&lt;/a&gt;)&lt;/li&gt;
</span><span class="cx">   &lt;li&gt;Automatic duplicate detection now works on PostgreSQL (although
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultreportsreporttablehtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/reports/report-table.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/reports/report-table.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/reports/report-table.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -47,32 +47,42 @@
</span><span class="cx"> [% END %]
</span><span class="cx"> 
</span><span class="cx"> &lt;script type=&quot;text/javascript&quot;&gt;
</span><ins>+function bz_encode (str, decode) {
+  // First decode HTML entities, if requested.
+  if (decode)
+    str = str.replace(/&amp;lt;/g, &quot;&lt;&quot;).replace(/&amp;gt;/g, &quot;&gt;&quot;).replace(/&amp;quot;/g, '&quot;')
+             .replace(/&amp;nbsp;/g, &quot; &quot;).replace(/&amp;amp;/g, &quot;&amp;&quot;).replace(/\s+$/,&quot;&quot;);
+
+  // encodeURIComponent() doesn't escape single quotes.
+  return encodeURIComponent(str).replace(/'/g, escape);
+};
+
</ins><span class="cx"> YAHOO.util.Event.addListener(window, &quot;load&quot;, function() {
</span><span class="cx">   this.Linkify = function(elLiner, oRecord, oColumn, oData) {
</span><span class="cx">     if (oData == 0)
</span><span class="cx">       elLiner.innerHTML = &quot;.&quot;;
</span><span class="cx">     else if (oRecord.getData(&quot;row_title&quot;) == &quot;Total&quot;)
</span><del>-      elLiner.innerHTML = &quot;&lt;a href='[% urlbase %]&amp;amp;[% col_field FILTER js %]=&quot;
-                          + oColumn.field + &quot;[% '&amp;amp;' _ row_vals IF row_vals %]'&gt;&quot;
-                          + oData + &quot;&lt;/a&gt;&quot;;
</del><ins>+      elLiner.innerHTML = '&lt;a href=&quot;[% urlbase FILTER js %]&amp;amp;[% col_field FILTER uri FILTER js %]='
+                          + bz_encode(oColumn.field)
+                          + '[% &quot;&amp;amp;&quot; _ row_vals IF row_vals %]&quot;&gt;' + oData + '&lt;/a&gt;';
</ins><span class="cx">     else
</span><del>-      elLiner.innerHTML = &quot;&lt;a href='[% urlbase %]&amp;amp;[% row_field FILTER js %]=&quot;
-                          + oRecord.getData(&quot;row_title&quot;).replace(/\s+$/,&quot;&quot;)
-                          + &quot;&amp;amp;[% col_field FILTER js %]=&quot; + oColumn.field
-                          + &quot;'&gt;&quot; + oData + &quot;&lt;/a&gt;&quot;;
</del><ins>+      elLiner.innerHTML = '&lt;a href=&quot;[% urlbase FILTER js %]&amp;amp;[% row_field FILTER uri FILTER js %]='
+                          + bz_encode(oRecord.getData(&quot;row_title&quot;), 1)
+                          + '&amp;amp;[% col_field FILTER uri FILTER js %]='
+                          + bz_encode(oColumn.field) + '&quot;&gt;' + oData + '&lt;/a&gt;';
</ins><span class="cx">   };
</span><span class="cx"> 
</span><span class="cx">   this.LinkifyTotal = function(elLiner, oRecord, oColumn, oData) {
</span><span class="cx">     if (oData == 0)
</span><span class="cx">       elLiner.innerHTML = &quot;.&quot;;
</span><span class="cx">     else if (oRecord.getData(&quot;row_title&quot;) == &quot;Total&quot;)
</span><del>-      elLiner.innerHTML = &quot;&lt;a href='[% urlbase %][% '&amp;amp;' _ row_vals IF row_vals %]
-                          [%~ '&amp;amp;' _ col_vals IF col_vals %]'&gt;&quot;
-                          + oData + &quot;&lt;/a&gt;&quot;;
</del><ins>+      elLiner.innerHTML = '&lt;a href=&quot;[% urlbase FILTER js %][% &quot;&amp;amp;&quot; _ row_vals IF row_vals %]
+                          [%~ &quot;&amp;amp;&quot; _ col_vals IF col_vals %]&quot;&gt;'
+                          + oData + '&lt;/a&gt;';
</ins><span class="cx">     else
</span><del>-      elLiner.innerHTML = &quot;&lt;a href='[% urlbase %]&amp;amp;[% row_field FILTER js %]=&quot;
-                          + oRecord.getData(&quot;row_title&quot;).replace(/\s+$/,&quot;&quot;)
-                          + &quot;[% '&amp;amp;' _ col_vals IF col_vals %]'&gt;&quot; + oData + &quot;&lt;/a&gt;&quot;;
</del><ins>+      elLiner.innerHTML = '&lt;a href=&quot;[% urlbase FILTER js %]&amp;amp;[% row_field FILTER uri FILTER js %]='
+                          + bz_encode(oRecord.getData(&quot;row_title&quot;), 1)
+                          + '[% &quot;&amp;amp;&quot; _ col_vals IF col_vals %]&quot;&gt;' + oData + '&lt;/a&gt;';
</ins><span class="cx"> 
</span><span class="cx">     YAHOO.util.Dom.addClass(elLiner.parentNode, &quot;ttotal&quot;);
</span><span class="cx">   };
</span><span class="lines">@@ -102,7 +112,7 @@
</span><span class="cx">   var myColumnDefs = [
</span><span class="cx">         {key:&quot;row_title&quot;, label:&quot;&quot;, sortable:true, sortOptions: { sortFunction:totalNumberSorter }},
</span><span class="cx">         [% FOREACH col = col_names %]
</span><del>-          {key:&quot;[% col FILTER js %]&quot;, label:&quot;[% display_value(col_field, col) FILTER js %]&quot;, sortable:true,
</del><ins>+          {key:&quot;[% col FILTER js %]&quot;, label:&quot;[% display_value(col_field, col) FILTER html FILTER js %]&quot;, sortable:true,
</ins><span class="cx">            formatter:this.Linkify, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC, sortFunction:totalNumberSorter }},
</span><span class="cx">         [% END %]
</span><span class="cx">         {key:&quot;total&quot;, label:&quot;Total&quot;, sortable:true, formatter:this.LinkifyTotal,
</span><span class="lines">@@ -164,7 +174,7 @@
</span><span class="cx"> [% col_idx = 0 %]
</span><span class="cx"> [% row_idx = 0 %]
</span><span class="cx"> [% grand_total = 0 %]
</span><del>-&lt;div id=&quot;tabular_report_container_[% tbl FILTER js %]&quot;&gt;
</del><ins>+&lt;div id=&quot;tabular_report_container_[% tbl FILTER html %]&quot;&gt;
</ins><span class="cx"> &lt;table id=&quot;tabular_report&quot; border=&quot;1&quot;&gt;
</span><span class="cx">   [% IF col_field %]
</span><span class="cx">     &lt;thead&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultreportsreporthtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/reports/report.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/reports/report.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/reports/report.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -170,7 +170,7 @@
</span><span class="cx">       this report&lt;/a&gt;
</span><span class="cx">     [% ELSE %]
</span><span class="cx">       &lt;a href=&quot;query.cgi?[% switchbase %]&amp;amp;chart_format=
</span><del>-        [% format %]&amp;amp;format=report-graph&amp;amp;cumulate=[% cumulate %]&quot;&gt;
</del><ins>+        [% format FILTER uri %]&amp;amp;format=report-graph&amp;amp;cumulate=[% cumulate %]&quot;&gt;
</ins><span class="cx">         Edit this report
</span><span class="cx">       &lt;/a&gt;
</span><span class="cx">     [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultsearchformhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/search/form.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/search/form.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/search/form.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -341,12 +341,12 @@
</span><span class="cx">           [% &quot; selected&quot; IF default.emailtype.$n == qv.name %]&gt;[% qv.description %]&lt;/option&gt;
</span><span class="cx">       [% END %]
</span><span class="cx">       &lt;/select&gt;
</span><del>-      [% IF feature_enabled('jsonrpc') %]
</del><ins>+      [% IF feature_enabled('jsonrpc') &amp;&amp; Param('ajax_user_autocompletion') %]
</ins><span class="cx">         &lt;div id=&quot;email[% n %]_autocomplete&quot;&gt;
</span><span class="cx">       [% END %]
</span><span class="cx">       &lt;input name=&quot;email[% n %]&quot; class=&quot;email&quot; id=&quot;email[% n %]&quot; 
</span><span class="cx">              value=&quot;[% default.email.$n FILTER html %]&quot;&gt;
</span><del>-      [% IF feature_enabled('jsonrpc') %]
</del><ins>+      [% IF feature_enabled('jsonrpc') &amp;&amp; Param('ajax_user_autocompletion') %]
</ins><span class="cx">         &lt;div id=&quot;email[% n %]_autocomplete_container&quot;&gt;&lt;/div&gt;
</span><span class="cx">         &lt;/div&gt;
</span><span class="cx">         &lt;script type=&quot;text/javascript&quot;&gt;
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultsearchknobhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/search/knob.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/search/knob.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/search/knob.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -40,6 +40,9 @@
</span><span class="cx">    &quot;Last Changed&quot; =&gt; &quot;Last Changed&quot; } %]
</span><span class="cx"> 
</span><span class="cx"> &lt;input type=&quot;hidden&quot; name=&quot;cmdtype&quot; value=&quot;doit&quot;&gt;
</span><ins>+[% IF user.id %]
+  &lt;input type=&quot;hidden&quot; name=&quot;token&quot; value=&quot;[% issue_hash_token(['searchknob']) FILTER html %]&quot;&gt;
+[% END %]
</ins><span class="cx"> 
</span><span class="cx"> &lt;p&gt;
</span><span class="cx">   &lt;label for=&quot;order&quot;&gt;Sort results by&lt;/label&gt;:
</span><span class="lines">@@ -56,7 +59,7 @@
</span><span class="cx">   &lt;input type=&quot;submit&quot; id=&quot;[% button_name FILTER html %]&quot;
</span><span class="cx">          value=&quot;[% button_name FILTER html %]&quot;&gt;
</span><span class="cx">   [% IF known_name %]
</span><del>-    [%# We store known_name in case the user add a boolean chart. %]
</del><ins>+    [%# We store known_name in case the user adds a boolean chart. %]
</ins><span class="cx">     &lt;input type=&quot;hidden&quot; name=&quot;known_name&quot; value=&quot;[% known_name FILTER html %]&quot;&gt;
</span><span class="cx"> 
</span><span class="cx">     [%# The name of the existing query will be passed to buglist.cgi. %]
</span><span class="lines">@@ -68,18 +71,21 @@
</span><span class="cx">   [% END %]
</span><span class="cx"> &lt;/p&gt;
</span><span class="cx"> 
</span><del>-&lt;p&gt;
-  &amp;nbsp;&amp;nbsp;&amp;nbsp;
-  &lt;input type=&quot;checkbox&quot; id=&quot;remasdefault&quot;
-         name=&quot;remtype&quot; value=&quot;asdefault&quot;&gt;
-  &lt;label for=&quot;remasdefault&quot;&gt;
-    and remember these as my default search options
-  &lt;/label&gt;
-&lt;/p&gt;
</del><ins>+[% IF user.id %]
+  &lt;p&gt;
+    &amp;nbsp;&amp;nbsp;&amp;nbsp;
+    &lt;input type=&quot;checkbox&quot; id=&quot;remasdefault&quot;
+           name=&quot;remtype&quot; value=&quot;asdefault&quot;&gt;
+    &lt;label for=&quot;remasdefault&quot;&gt;
+      and remember these as my default search options
+    &lt;/label&gt;
+  &lt;/p&gt;
+[% END %]
</ins><span class="cx">         
</span><span class="cx"> [% IF userdefaultquery %]
</span><span class="cx">   &lt;p&gt;
</span><del>-    &lt;a href=&quot;query.cgi?nukedefaultquery=1&quot;&gt;
</del><ins>+    &lt;a href=&quot;query.cgi?nukedefaultquery=1&amp;amp;token=
+       [%- issue_hash_token(['nukedefaultquery']) FILTER uri %]&quot;&gt;
</ins><span class="cx">       Set my default search back to the system default&lt;/a&gt;.
</span><span class="cx">   &lt;/p&gt;
</span><span class="cx"> [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultsearchsearchadvancedhtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/search/search-advanced.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/search/search-advanced.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/search/search-advanced.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -31,7 +31,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> [% js_data = BLOCK %]
</span><del>-var queryform = &quot;queryform&quot;
</del><ins>+var queryform = &quot;queryform&quot;;
+function remove_token() {
+  if (queryform.token) {
+    var asDefault = document.getElementById('remasdefault');
+    queryform.token.disabled = !asDefault.checked;
+  }
+}
</ins><span class="cx"> [% END %]
</span><span class="cx"> 
</span><span class="cx"> [% PROCESS global/header.html.tmpl
</span><span class="lines">@@ -53,7 +59,8 @@
</span><span class="cx"> 
</span><span class="cx"> &lt;p id=&quot;search_help&quot;&gt;Hover your mouse over each field label to get help for that field.&lt;/p&gt;
</span><span class="cx"> 
</span><del>-&lt;form method=&quot;post&quot; action=&quot;buglist.cgi&quot; name=&quot;queryform&quot; id=&quot;queryform&quot;&gt;
</del><ins>+&lt;form method=&quot;post&quot; action=&quot;buglist.cgi&quot; name=&quot;queryform&quot; id=&quot;queryform&quot;
+      onsubmit=&quot;remove_token()&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> [% PROCESS search/form.html.tmpl %]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultsearchsearchreportselecthtmltmpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/search/search-report-select.html.tmpl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/search/search-report-select.html.tmpl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/search/search-report-select.html.tmpl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -39,12 +39,5 @@
</span><span class="cx">         [% &quot; selected&quot; IF default.$name.0 == field %]&gt;
</span><span class="cx">         [% field_descs.$field || field FILTER html %]&lt;/option&gt;
</span><span class="cx">     [% END %]
</span><del>-
-    [%# Single-select fields are also valid column names. %]
-    [% FOREACH field = custom_fields %]
-      &lt;option value=&quot;[% field.name FILTER html %]&quot;
-        [% &quot; selected&quot; IF default.$name.0 == field.name %]&gt;
-        [% field.description FILTER html %]&lt;/option&gt;
-    [% END %]
</del><span class="cx">   &lt;/select&gt;
</span><span class="cx"> [% END %]
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtemplateendefaultsetupstringstxtpl"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/template/en/default/setup/strings.txt.pl (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/template/en/default/setup/strings.txt.pl        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/template/en/default/setup/strings.txt.pl        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -382,24 +382,6 @@
</span><span class="cx"> 
</span><span class="cx">     http://cyberelk.net/tim/patchutils/
</span><span class="cx"> END
</span><del>-    ppm_repo_add =&gt; &lt;&lt;EOT,
-***********************************************************************
-* Note For Windows Users                                              *
-***********************************************************************
-* In order to install the modules listed below, you first have to run * 
-* the following command as an Administrator:                          *
-*                                                                     *
-*   ppm repo add theory58S ##theory_url##
-EOT
-    ppm_repo_up =&gt; &lt;&lt;EOT,
-*                                                                     *
-* Then you have to do (also as an Administrator):                     *
-*                                                                     *
-*   ppm repo up theory58S                                             *
-*                                                                     *
-* Do that last command over and over until you see &quot;theory58S&quot; at the *
-* top of the displayed list.                                          *
-EOT
</del><span class="cx">     template_precompile   =&gt; &quot;Precompiling templates...&quot;,
</span><span class="cx">     template_removal_failed =&gt; &lt;&lt;END,
</span><span class="cx"> WARNING: The directory '##template_cache##' could not be removed.
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgtokencgi"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/token.cgi (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/token.cgi        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/token.cgi        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -67,9 +67,10 @@
</span><span class="cx">   trick_taint($token);
</span><span class="cx"> 
</span><span class="cx">   # Make sure the token exists in the database.
</span><del>-  my ($tokentype) = $dbh-&gt;selectrow_array('SELECT tokentype FROM tokens
-                                           WHERE token = ?', undef, $token);
-  $tokentype || ThrowUserError(&quot;token_does_not_exist&quot;);
</del><ins>+  my ($db_token, $tokentype) = $dbh-&gt;selectrow_array('SELECT token, tokentype FROM tokens
+                                                       WHERE token = ?', undef, $token);
+  (defined $db_token &amp;&amp; $db_token eq $token)
+    || ThrowUserError(&quot;token_does_not_exist&quot;);
</ins><span class="cx"> 
</span><span class="cx">   # Make sure the token is the correct type for the action being taken.
</span><span class="cx">   if ( grep($action eq $_ , qw(cfmpw cxlpw chgpw)) &amp;&amp; $tokentype ne 'password' ) {
</span><span class="lines">@@ -108,6 +109,11 @@
</span><span class="cx">         ThrowUserError(&quot;password_change_requests_not_allowed&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    # Check the hash token to make sure this user actually submitted
+    # the forgotten password form.
+    my $token = $cgi-&gt;param('token');
+    check_hash_token($token, ['reqpw']);
+
</ins><span class="cx">     validate_email_syntax($login_name)
</span><span class="cx">         || ThrowUserError('illegal_email_address', {addr =&gt; $login_name});
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgxtlibBugzillaTestSearchConstantspm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/Constants.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/Constants.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/Constants.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -197,11 +197,14 @@
</span><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> # allwords and allwordssubstr have these broken tests in common.
</span><del>-#
-# allwordssubstr on cc fields matches against a single cc,
-# instead of matching against all ccs on a bug.
</del><span class="cx"> use constant ALLWORDS_BROKEN =&gt; (
</span><ins>+    # allwordssubstr on cc fields matches against a single cc,
+    # instead of matching against all ccs on a bug.
</ins><span class="cx">     cc        =&gt; { contains =&gt; [1] },
</span><ins>+    # bug 828344 changed how these searches operate to revert back to the 4.0
+    # behavour, so these tests need to be updated (bug 849117).
+    'flagtypes.name' =&gt; { contains =&gt; [1] },
+    longdesc         =&gt; { contains =&gt; [1] },
</ins><span class="cx"> );
</span><span class="cx"> 
</span><span class="cx"> # Fields that don't generally work at all with changed* searches, but
</span><span class="lines">@@ -260,6 +263,15 @@
</span><span class="cx">     'allwords-&lt;1&gt;' =&gt; {
</span><span class="cx">         ALLWORDS_BROKEN,
</span><span class="cx">     },
</span><ins>+    'anywords-&lt;1&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1,2,3,4,5] },
+    },
+    'anywords-&lt;1&gt; &lt;2&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [3,4,5] },
+    },
+    'anywordssubstr-&lt;1&gt; &lt;2&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [3,4,5] },
+    },
</ins><span class="cx"> 
</span><span class="cx">     # setters.login_name and requestees.login name aren't tracked individually
</span><span class="cx">     # in bugs_activity, so can't be searched using this method.
</span><span class="lines">@@ -330,6 +342,24 @@
</span><span class="cx">         # This should probably search the reporter.
</span><span class="cx">         creation_ts =&gt; { contains =&gt; [1] },
</span><span class="cx">     },
</span><ins>+    notequals =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    notregexp =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    notsubstring =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    nowords =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+    },
+    nowordssubstr =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> ###################
</span><span class="lines">@@ -360,18 +390,41 @@
</span><span class="cx"> 
</span><span class="cx"> # These are field/operator combinations that are broken when run under NOT().
</span><span class="cx"> use constant BROKEN_NOT =&gt; {
</span><del>-    allwords       =&gt; {
-        cc =&gt; { contains =&gt; [1] },
</del><ins>+    allwords =&gt; {
+        cc               =&gt; { contains =&gt; [1] },
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+        longdesc         =&gt; { contains =&gt; [1] },
</ins><span class="cx">     },
</span><span class="cx">     'allwords-&lt;1&gt; &lt;2&gt;' =&gt; {
</span><span class="cx">         cc =&gt; { },
</span><span class="cx">     },
</span><span class="cx">     allwordssubstr =&gt; {
</span><del>-        cc =&gt; { contains =&gt; [1] },
</del><ins>+        cc               =&gt; { contains =&gt; [1] },
+        'flagtypes.name' =&gt; { contains =&gt; [5, 6] },
+        longdesc         =&gt; { contains =&gt; [1] },
</ins><span class="cx">     },
</span><span class="cx">     'allwordssubstr-&lt;1&gt;,&lt;2&gt;' =&gt; {
</span><del>-        cc =&gt; { },
</del><ins>+        cc               =&gt; { },
+        longdesc         =&gt; { contains =&gt; [1] },
</ins><span class="cx">     },
</span><ins>+    anyexact =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 2, 5] },
+    },
+    'anywords-&lt;1&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 2, 3, 4, 5] },
+    },
+    'anywords-&lt;1&gt; &lt;2&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [3, 4, 5] },
+    },
+    anywordssubstr =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
+    'anywordssubstr-&lt;1&gt; &lt;2&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [3,4,5] },
+    },
+    casesubstring =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
</ins><span class="cx">     changedafter =&gt; {
</span><span class="cx">         &quot;attach_data.thedata&quot;   =&gt; { contains =&gt; [2, 3, 4] },
</span><span class="cx">         &quot;classification&quot;        =&gt; { contains =&gt; [2, 3, 4] },
</span><span class="lines">@@ -397,7 +450,6 @@
</span><span class="cx">         dependson       =&gt; { contains =&gt; [1, 3] },
</span><span class="cx">         work_time       =&gt; { contains =&gt; [1] },
</span><span class="cx">         FIELD_TYPE_BUG_ID, { contains =&gt; [1 .. 4] },
</span><del>-        
</del><span class="cx">     },
</span><span class="cx">     changedto =&gt; {
</span><span class="cx">         CHANGED_BROKEN_NOT,
</span><span class="lines">@@ -406,11 +458,45 @@
</span><span class="cx">         &quot;remaining_time&quot; =&gt; { contains =&gt; [1] },
</span><span class="cx">     },
</span><span class="cx">     greaterthan =&gt; {
</span><del>-        cc        =&gt; { contains =&gt; [1] },
</del><ins>+        cc               =&gt; { contains =&gt; [1] },
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
</ins><span class="cx">     },
</span><span class="cx">     greaterthaneq =&gt; {
</span><span class="cx">         cc               =&gt; { contains =&gt; [1] },
</span><ins>+        'flagtypes.name' =&gt; { contains =&gt; [2, 5] },
</ins><span class="cx">     },
</span><ins>+    equals =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+    },
+    notequals =&gt; {
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    notregexp =&gt; {
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    notsubstring =&gt; {
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    'nowords-&lt;1&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
+    'nowordssubstr-&lt;1&gt;' =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
+    lessthan =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+    },
+    lessthaneq =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+    },
+    regexp =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [1, 5] },
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
+    substring =&gt; {
+        'flagtypes.name' =&gt; { contains =&gt; [5] },
+        longdesc         =&gt; { contains =&gt; [1] },
+    },
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #############
</span></span></pre></div>
<a id="trunkWebsitesbugswebkitorgxtlibBugzillaTestSearchFieldTestpm"></a>
<div class="modfile"><h4>Modified: trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/FieldTest.pm (174764 => 174765)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/FieldTest.pm        2014-10-16 16:00:58 UTC (rev 174764)
+++ trunk/Websites/bugs.webkit.org/xt/lib/Bugzilla/Test/Search/FieldTest.pm        2014-10-16 16:01:12 UTC (rev 174765)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> use warnings;
</span><span class="cx"> use Bugzilla::Search;
</span><span class="cx"> use Bugzilla::Test::Search::Constants;
</span><ins>+use Bugzilla::Util qw(trim);
</ins><span class="cx"> 
</span><span class="cx"> use Data::Dumper;
</span><span class="cx"> use Scalar::Util qw(blessed);
</span><span class="lines">@@ -72,6 +73,13 @@
</span><span class="cx">     my $self = shift;
</span><span class="cx">     return $self-&gt;search_test-&gt;bug(@_);
</span><span class="cx"> }
</span><ins>+sub number {
+    my ($self, $id) = @_;
+    foreach my $number (1..NUM_BUGS) {
+        return $number if $self-&gt;search_test-&gt;bug($number)-&gt;id == $id;
+    }
+    return 0;
+}
</ins><span class="cx"> 
</span><span class="cx"> # The name displayed for this test by Test::More. Used in test descriptions.
</span><span class="cx"> sub name {
</span><span class="lines">@@ -147,9 +155,18 @@
</span><span class="cx">     return $self-&gt;{translated_value};
</span><span class="cx"> }
</span><span class="cx"> # Used in failure diagnostic messages.
</span><del>-sub debug_value {
-    my ($self) = @_;
-    return &quot;Value: '&quot; . $self-&gt;translated_value . &quot;'&quot;;
</del><ins>+sub debug_fail {
+    my ($self, $number, $results, $sql) = @_;
+    my @expected = @{ $self-&gt;test-&gt;{contains} };
+    my @results = sort
+                  map { $self-&gt;number($_) }
+                  map { $_-&gt;[0] }
+                  @$results;
+    return
+        &quot;   Value: '&quot; . $self-&gt;translated_value . &quot;'\n&quot; .
+        &quot;Expected: [&quot; . join(',', @expected) . &quot;]\n&quot; .
+        &quot; Results: [&quot; . join(',', @results) . &quot;]\n&quot; .
+        trim($sql) . &quot;\n&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # True for a bug if we ran the &quot;transform&quot; function on it and the
</span><span class="lines">@@ -184,6 +201,7 @@
</span><span class="cx"> # The tests we know are broken for this operator/field combination.
</span><span class="cx"> sub _known_broken {
</span><span class="cx">     my ($self, $constant, $skip_pg_check) = @_;
</span><ins>+
</ins><span class="cx">     $constant ||= KNOWN_BROKEN;
</span><span class="cx">     my $field = $self-&gt;field;
</span><span class="cx">     my $type = $self-&gt;field_object-&gt;type;
</span><span class="lines">@@ -192,8 +210,8 @@
</span><span class="cx">     my $value_name = &quot;$operator-$value&quot;;
</span><span class="cx">     if (my $extra_name = $self-&gt;test-&gt;{extra_name}) {
</span><span class="cx">         $value_name .= &quot;-$extra_name&quot;;
</span><del>-    }    
-    
</del><ins>+    }
+
</ins><span class="cx">     my $value_broken = $constant-&gt;{$value_name}-&gt;{$field};
</span><span class="cx">     $value_broken ||= $constant-&gt;{$value_name}-&gt;{$type};
</span><span class="cx">     return $value_broken if $value_broken;
</span><span class="lines">@@ -601,12 +619,12 @@
</span><span class="cx">         if ($self-&gt;bug_is_contained($number)) {
</span><span class="cx">             ok($result_ids{$bug_id},
</span><span class="cx">                &quot;$name: contains bug $number ($bug_id)&quot;)
</span><del>-                or diag Dumper($results) . $self-&gt;debug_value . &quot;\n\nSQL: $sql&quot;;
</del><ins>+                or diag $self-&gt;debug_fail($number, $results, $sql);
</ins><span class="cx">         }
</span><span class="cx">         else {
</span><span class="cx">             ok(!$result_ids{$bug_id},
</span><span class="cx">                &quot;$name: does not contain bug $number ($bug_id)&quot;)
</span><del>-                or diag Dumper($results) . $self-&gt;debug_value . &quot;\n\nSQL: $sql&quot;;
</del><ins>+                or diag $self-&gt;debug_fail($number, $results, $sql);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>