<!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>-<FilesMatch ^(.*\.pm|.*\.pl|.*localconfig.*)$>
</del><ins>+<FilesMatch (\.pm|\.pl|\.tmpl|localconfig.*)$>
</ins><span class="cx"> deny from all
</span><span class="cx"> </FilesMatch>
</span><span class="cx"> <FilesMatch ^(localconfig.js|localconfig.rdf)$>
</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->sends_data_to(new PatchReader::DiffPrinter::raw());
</span><span class="cx"> # Actually print out the patch.
</span><span class="cx"> print $cgi->header(-type => 'text/plain',
</span><del>- -x_content_type_options => "nosniff",
</del><span class="cx"> -expires => '+3M');
</span><span class="cx"> disable_utf8();
</span><span class="cx"> $reader->iterate_string('Attachment ' . $attachment->id, $attachment->data);
</span><span class="lines">@@ -119,7 +118,6 @@
</span><span class="cx"> $last_reader->sends_data_to(new PatchReader::DiffPrinter::raw());
</span><span class="cx"> # Actually print out the patch.
</span><span class="cx"> print $cgi->header(-type => 'text/plain',
</span><del>- -x_content_type_options => "nosniff",
</del><span class="cx"> -expires => '+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->validate_can_edit($bug->product_id)
</span><span class="cx"> || ThrowUserError('illegal_attachment_edit', { attach_id => $attachment->id });
</span><span class="cx">
</span><del>- $vars->{'description'} = $attachment->description;
-
</del><span class="cx"> if ($attachment->bug_id != $bug->bug_id) {
</span><span class="cx"> $vars->{'my_bug_id'} = $bug->bug_id;
</span><del>- $vars->{'attach_bug_id'} = $attachment->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->selectrow_array('SELECT 1
</del><ins>+ my $db_cookie =
+ $dbh->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 && $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->do("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 => 0;
</span><span class="cx"> use constant user_can_create_account => 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 => Bugzilla->params->{"LDAPBaseDN"},
</span><span class="cx"> scope => "sub",
</span><span class="cx"> filter => '(&(' . Bugzilla->params->{"LDAPuidattribute"}
</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->FULLTEXT_OR) {
</span><span class="cx"> my $joined_terms = join($dbh->FULLTEXT_OR, @words);
</span><span class="cx"> ($where_sql, $relevance_sql) =
</span><del>- $dbh->sql_fulltext_search('bugs_fulltext.short_desc',
- $joined_terms, 1);
</del><ins>+ $dbh->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->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->SUPER::run_create_validators(@_);
</span><span class="cx">
</span><ins>+ # Add classification for checking mandatory fields which depend on it
+ $params->{classification} = $params->{product}->classification->name;
+
+ my @mandatory_fields = @{ Bugzilla->fields({ is_mandatory => 1,
+ enter_bug => 1,
+ obsolete => 0 }) };
+ foreach my $field (@mandatory_fields) {
+ $class->_check_field_is_mandatory($params->{$field->name}, $field,
+ $params);
+ }
+
</ins><span class="cx"> my $product = delete $params->{product};
</span><span class="cx"> $params->{product_id} = $product->id;
</span><span class="cx"> my $component = delete $params->{component};
</span><span class="lines">@@ -757,18 +765,11 @@
</span><span class="cx"> delete $params->{resolution};
</span><span class="cx"> delete $params->{lastdiffed};
</span><span class="cx"> delete $params->{bug_id};
</span><ins>+ delete $params->{classification};
</ins><span class="cx">
</span><span class="cx"> Bugzilla::Hook::process('bug_end_of_create_validators',
</span><span class="cx"> { params => $params });
</span><span class="cx">
</span><del>- my @mandatory_fields = @{ Bugzilla->fields({ is_mandatory => 1,
- enter_bug => 1,
- obsolete => 0 }) };
- foreach my $field (@mandatory_fields) {
- $class->_check_field_is_mandatory($params->{$field->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->comment_required_on_change_from($old_status) && !$comment)
</del><ins>+ if ($new_status->comment_required_on_change_from($old_status) && !$comment->{'thetext'})
</ins><span class="cx"> {
</span><span class="cx"> ThrowUserError('comment_required', { old => $old_status,
</span><span class="cx"> new => $new_status });
</span><span class="lines">@@ -1465,8 +1466,12 @@
</span><span class="cx"> $name || ThrowUserError("require_component");
</span><span class="cx"> my $product = blessed($invocant) ? $invocant->product_obj
</span><span class="cx"> : $params->{product};
</span><del>- my $obj = Bugzilla::Component->check({ product => $product, name => $name });
- return $obj;
</del><ins>+ my $old_comp = blessed($invocant) ? $invocant->component : '';
+ my $object = Bugzilla::Component->check({ product => $product, name => $name });
+ if ($object->name ne $old_comp && !$object->is_active) {
+ ThrowUserError('value_inactive', { class => ref($object), value => $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->product_obj
</span><span class="cx"> : $params->{product};
</span><ins>+ my $old_target = blessed($invocant) ? $invocant->target_milestone : '';
</ins><span class="cx"> $target = trim($target);
</span><span class="cx"> $target = $product->default_milestone if !defined $target;
</span><span class="cx"> my $object = Bugzilla::Milestone->check(
</span><span class="cx"> { product => $product, name => $target });
</span><ins>+ if ($old_target && $object->name ne $old_target && !$object->is_active) {
+ ThrowUserError('value_inactive', { class => ref($object), value => $target });
+ }
</ins><span class="cx"> return $object->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->product_obj
</span><span class="cx"> : $params->{product};
</span><del>- my $object =
- Bugzilla::Version->check({ product => $product, name => $version });
</del><ins>+ my $old_vers = blessed($invocant) ? $invocant->version : '';
+ my $object = Bugzilla::Version->check({ product => $product, name => $version });
+ if ($object->name ne $old_vers && !$object->is_active) {
+ ThrowUserError('value_inactive', { class => ref($object), value => $version });
+ }
</ins><span class="cx"> return $object->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->is_visible_on_bug($params || $invocant);
</span><span class="cx">
</span><ins>+ return if ($field->type == FIELD_TYPE_SINGLE_SELECT
+ && scalar @{ get_legal_field_values($field->name) } == 1);
+
+ return if ($field->type == FIELD_TYPE_MULTI_SELECT
+ && !scalar @{ get_legal_field_values($field->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 => $milestone_ok ? $self->target_milestone
</span><span class="cx"> : $product->default_milestone
</span><span class="cx"> };
</span><del>- $vars{components} = [map { $_->name } @{$product->components}];
- $vars{milestones} = [map { $_->name } @{$product->milestones}];
- $vars{versions} = [map { $_->name } @{$product->versions}];
</del><ins>+ $vars{components} = [map { $_->name } grep($_->is_active, @{$product->components})];
+ $vars{milestones} = [map { $_->name } grep($_->is_active, @{$product->milestones})];
+ $vars{versions} = [map { $_->name } grep($_->is_active, @{$product->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->{ref_bug};
</span><span class="cx"> if ($class->isa('Bugzilla::BugUrl::Bugzilla::Local')
</span><del>- and !$skip_recursion)
</del><ins>+ and !$skip_recursion
+ and $ref_bug->check_can_change_field('see_also', '', $self->id, \$privs))
</ins><span class="cx"> {
</span><span class="cx"> $ref_bug->add_see_also($self->id, 'skip_recursion');
</span><span class="cx"> push @{ $self->{_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->[0];
</span><span class="cx"> if (!$skip_recursion and $removed_bug_url
</span><del>- and $removed_bug_url->isa('Bugzilla::BugUrl::Bugzilla::Local'))
</del><ins>+ and $removed_bug_url->isa('Bugzilla::BugUrl::Bugzilla::Local')
+ and $removed_bug_url->ref_bug_url)
</ins><span class="cx"> {
</span><span class="cx"> my $ref_bug
</span><span class="cx"> = Bugzilla::Bug->check($removed_bug_url->ref_bug_url->bug_id);
</span><span class="cx">
</span><del>- if (Bugzilla->user->can_edit_product($ref_bug->product_id)) {
</del><ins>+ if (Bugzilla->user->can_edit_product($ref_bug->product_id)
+ and $ref_bug->check_can_change_field('see_also', $self->id, '', \$privs))
+ {
</ins><span class="cx"> my $self_url = $removed_bug_url->local_uri($self->id);
</span><span class="cx"> $ref_bug->remove_see_also($self_url, 'skip_recursion');
</span><span class="cx"> push @{ $self->{_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->dbh->bz_table_columns('bugs');
</span><ins>+ # Add multi-select fields
+ push(@fields, map { $_->name } @{Bugzilla->fields({obsolete => 0,
+ type => FIELD_TYPE_MULTI_SELECT})});
</ins><span class="cx"> # Obsolete custom fields are not editable.
</span><span class="cx"> my @obsolete_fields = @{ Bugzilla->fields({obsolete => 1, custom => 1}) };
</span><span class="cx"> @obsolete_fields = map { $_->name } @obsolete_fields;
</span><span class="lines">@@ -3642,7 +3668,7 @@
</span><span class="cx"> "lastdiffed", @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 > -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->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->param('remtype')
+ && ($self->param('remtype') eq 'asdefault'
+ || $self->param('remtype') eq 'asnamed'))
+ || (defined $self->param('remaction')
+ && $self->param('remaction') eq 'forget'))
+ {
+ $self->delete("token");
+ }
+
</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->param("email$num")) {
</span><span class="lines">@@ -306,6 +316,14 @@
</span><span class="cx"> unshift(@_, '-x_frame_options' => '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' => '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' => 'nosniff');
+
</ins><span class="cx"> return $self->SUPER::header(@_) || "";
</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 && !utf8::is_utf8($input);
</del><ins>+ utf8::decode($input) if defined $input && !ref $input && !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 => "4.2.1";
</del><ins>+use constant BUGZILLA_VERSION => "4.2.7";
</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 => '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->selectcol_arrayref(
- q{SHOW VARIABLES LIKE '%have_innodb%'}, {Columns=>[2]})};
- if ($innodb_on ne 'YES') {
</del><ins>+ my %engines = @{$self->selectcol_arrayref('SHOW ENGINES', {Columns => [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 => 32 * 1024;
</span><span class="cx"> use constant FULLTEXT_OR => ' 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 = "dbi:Oracle:host=$host;sid=$dbname";
</span><span class="cx"> $dsn .= ";port=$port" if $port;
</span><span class="cx"> my $attrs = { FetchHashKeyName => 'NAME_lc',
</span><del>- LongReadLen => max(Bugzilla->params->{'maxattachmentsize'},
</del><ins>+ LongReadLen => max(Bugzilla->params->{'maxattachmentsize'} || 0,
</ins><span class="cx"> MIN_LONG_READ_LEN) * 1024,
</span><span class="cx"> };
</span><span class="cx"> my $self = $class->db_new({ dsn => $dsn, user => $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->quote(', ') if !defined $separator;
</span><del>- return "group_concat(T_CLOB_DELIM($text, $separator))";
</del><ins>+ my ($distinct, $rest) = $text =~/^(\s*DISTINCT\s|)(.+)$/i;
+ return "group_concat($distinct T_CLOB_DELIM(NVL($rest, ' '), $separator))";
</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 " TO_DATE($date,'J') ";
</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->quote($text);
</span><span class="cx"> trick_taint($text);
</span><del>- return "CONTAINS($column,$text,$label) > 0", "SCORE($label)";
</del><ins>+ $fulltext_label++;
+ return "CONTAINS($column,$text,$fulltext_label) > 0", "SCORE($fulltext_label)";
</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->SUPER::sql_in($column_name, $in_list_ref) if $#in_list < 1000;
</del><ins>+ return $self->SUPER::sql_in($column_name, $in_list_ref, $negate) if $#in_list < 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 > 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->SUPER::sql_in($column_name, \@sub_in_list));
</del><ins>+ $self->SUPER::sql_in($column_name, \@sub_in_list, $negate));
</ins><span class="cx"> }
</span><span class="cx"> return "( " . join(" OR ", @in_str) . " )";
</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"> . " RETURN NUMBER IS BEGIN RETURN LENGTH(COLUMN_NAME); END;");
</span><span class="cx">
</span><span class="cx"> # Create types for group_concat
</span><del>- my $t_clob_delim = $self->selectcol_arrayref("
- SELECT TYPE_NAME FROM USER_TYPES WHERE TYPE_NAME=?",
- undef, 'T_CLOB_DELIM');
</del><ins>+ my $type_exists = $self->selectrow_array("SELECT 1 FROM user_types
+ WHERE type_name = 'T_GROUP_CONCAT'");
+ $self->do("DROP TYPE T_GROUP_CONCAT") if $type_exists;
+ $self->do("CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT "
+ . "( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256)"
+ . ", MAP MEMBER FUNCTION T_CLOB_DELIM_ToVarchar return VARCHAR2"
+ . ");");
+ $self->do("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;");
</ins><span class="cx">
</span><del>- if ( !@$t_clob_delim ) {
- $self->do("CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT "
- . "( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256));");
- }
-
</del><span class="cx"> $self->do("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->SUPER::bz_setup_database(@_);
</span><span class="cx">
</span><ins>+ my $sth = $self->prepare("SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME = ?");
</ins><span class="cx"> my @tables = $self->bz_table_list_real();
</span><ins>+
</ins><span class="cx"> foreach my $table (@tables) {
</span><span class="cx"> my @columns = $self->bz_table_columns_real($table);
</span><span class="cx"> foreach my $column (@columns) {
</span><span class="cx"> my $def = $self->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->{TYPE} =~ /SERIAL/i) {
+ my $sequence = "${table}_${column}_SEQ";
+ my $exists = $self->selectrow_array($sth, undef, $sequence);
+ if (!$exists) {
+ my @sql = $self->_get_create_seq_ddl($table, $column);
+ $self->do($_) foreach @sql;
+ }
+ }
+
</ins><span class="cx"> if ($def->{REFERENCES}) {
</span><span class="cx"> my $references = $def->{REFERENCES};
</span><span class="cx"> my $update = $references->{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 . "_UC");
- my $exist_trigger = $self->selectcol_arrayref(
- "SELECT OBJECT_NAME FROM USER_OBJECTS
- WHERE OBJECT_NAME = ?", undef, $trigger_name);
</del><ins>+ my $trigger_name = uc($fk_name . "_UC");
+ my $exist_trigger = $self->selectcol_arrayref($sth, undef, $trigger_name);
</ins><span class="cx"> if(@$exist_trigger) {
</span><span class="cx"> $self->do("DROP TRIGGER $trigger_name");
</span><span class="cx"> }
</span><span class="cx">
</span><del>- my $tr_str = "CREATE OR REPLACE TRIGGER $trigger_name"
</del><ins>+ my $tr_str = "CREATE OR REPLACE TRIGGER $trigger_name"
</ins><span class="cx"> . " AFTER UPDATE OF $to_column ON $to_table "
</span><span class="cx"> . " REFERENCING "
</span><span class="cx"> . " NEW AS NEW "
</span><span class="lines">@@ -672,22 +696,46 @@
</span><span class="cx"> . " SET $column = :NEW.$to_column"
</span><span class="cx"> . " WHERE $column = :OLD.$to_column;"
</span><span class="cx"> . " END $trigger_name;";
</span><del>- $self->do($tr_str);
- }
- }
- }
- }
</del><ins>+ $self->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 = "PRODUCTS_MILESTONEURL";
</span><del>- my $exist_trigger = $self->selectcol_arrayref(
- "SELECT OBJECT_NAME FROM USER_OBJECTS
- WHERE OBJECT_NAME = ?", undef, $trigger_name);
</del><ins>+ my $exist_trigger = $self->selectcol_arrayref($sth, undef, $trigger_name);
</ins><span class="cx"> if(@$exist_trigger) {
</span><span class="cx"> $self->do("DROP TRIGGER $trigger_name");
</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 = "${table}_${column}_SEQ";
+ my $seq_sql = "CREATE SEQUENCE $seq_name INCREMENT BY 1 START WITH 1 " .
+ "NOMAXVALUE NOCYCLE NOCACHE";
+ my $trigger_sql = $self->_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 = "CREATE OR REPLACE TRIGGER ${table}_${column}_TR "
+ . " BEFORE INSERT ON $table "
+ . " FOR EACH ROW "
+ . " BEGIN "
+ . " SELECT ${seq_name}.NEXTVAL "
+ . " INTO :NEW.$column FROM DUAL; "
+ . " END;";
+ 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->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 >= 9) {
</span><del>- local $db->{dbd}->{version} = '2.17.2';
- local $db->{name} = $db->{name} . ' 9+';
</del><ins>+ local $db->{dbd}->{version} = ($minor_version >= 2) ? '2.19.3' : '2.17.2';
+ local $db->{name} = $db->{name} . " ${major_version}.$minor_version";
</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->{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->SUPER::get_add_column_ddl($table, $column, \%def, $init_value);
+ push(@sql, $self->_get_create_seq_ddl($table, $column));
+ push(@sql, "UPDATE $table SET $column = ${table}_${column}_SEQ.NEXTVAL");
+ push(@sql, "ALTER TABLE $table MODIFY $column NOT NULL") if $notnull;
+ push(@sql, "ALTER TABLE $table ADD PRIMARY KEY ($column)") if $pk;
+ }
+ else {
+ @sql = $self->SUPER::get_add_column_ddl(@_);
+ # Create triggers to deal with empty string.
+ if ($definition->{TYPE} =~ /varchar|TEXT/i && $definition->{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->SUPER::get_drop_column_ddl(@_));
+ my $dbh=Bugzilla->dbh;
+ my $trigger_name = uc($table . "_" . $column);
+ my $exist_trigger = $dbh->selectcol_arrayref(
+ "SELECT OBJECT_NAME FROM USER_OBJECTS
+ WHERE OBJECT_NAME = ?", undef, $trigger_name);
+ if(@$exist_trigger) {
+ push(@sql, "DROP TRIGGER $trigger_name");
+ }
+ # If this column is of type SERIAL, we need to drop the sequence
+ # and trigger that went along with it.
+ my $def = $self->get_column_abstract($table, $column);
+ if ($def->{TYPE} =~ /SERIAL/i) {
+ push(@sql, "DROP SEQUENCE ${table}_${column}_SEQ");
+ push(@sql, "DROP TRIGGER ${table}_${column}_TR");
+ }
+ 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->SUPER::get_drop_column_ddl(@_));
- my $dbh=Bugzilla->dbh;
- my $trigger_name = uc($table . "_" . $column);
- my $exist_trigger = $dbh->selectcol_arrayref(
- "SELECT OBJECT_NAME FROM USER_OBJECTS
- WHERE OBJECT_NAME = ?", undef, $trigger_name);
- if(@$exist_trigger) {
- push(@sql, "DROP TRIGGER $trigger_name");
- }
- 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->params->{'utf8'}
+ || !defined Bugzilla->params->{'utf8'};
+ my $charset = $create_utf8 ? "ENCODING 'UTF8' TEMPLATE template0" : '';
+ return ("CREATE DATABASE $name $charset");
+}
+
</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<_get_fk_ddl>
</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<$table> - The name of the table the reference is from.
</span><ins>+
</ins><span class="cx"> =item C<$column> - The name of the column the reference is from
</span><ins>+
</ins><span class="cx"> =item C<$references> - The C<REFERENCES> 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<get_column($table, $column)>
</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 " $column_name IN (" . join(',', @$in_list_ref) . ") ";
</del><ins>+ my ($self, $column_name, $in_list_ref, $negate) = @_;
+ return " $column_name "
+ . ($negate ? "NOT " : "")
+ . "IN (" . join(',', @$in_list_ref) . ") ";
</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->$field_name : $bug->{$field_name};
</span><ins>+ $value = $value->name if blessed($value);
</ins><span class="cx"> return 0 if !defined $value;
</span><span class="cx">
</span><span class="cx"> if ($self->field->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->{sortkey} = undef if !exists $params->{sortkey};
</span><span class="cx"> $params->{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->{obsolete};
+ $params->{obsolete} = 1 if $params->{custom};
+
</ins><span class="cx"> $dbh->bz_start_transaction();
</span><span class="cx"> $class->check_required_create_fields(@_);
</span><span class="cx"> my $field_values = $class->run_create_validators($params);
</span><span class="lines">@@ -1045,6 +1049,10 @@
</span><span class="cx"> # Insert a default value of "---" into the legal values table.
</span><span class="cx"> $dbh->do("INSERT INTO $name (value) VALUES ('---')");
</span><span class="cx"> }
</span><ins>+
+ # Restore the original obsolete state of the custom field.
+ $dbh->do('UPDATE fielddefs SET obsolete = 0 WHERE id = ?', undef, $field->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 => \&_check_description,
</span><span class="cx"> cc_list => \&_check_cc_list,
</span><span class="cx"> target_type => \&_check_target_type,
</span><del>- sortkey => \&_check_sortey,
</del><ins>+ sortkey => \&_check_sortkey,
</ins><span class="cx"> is_active => \&Bugzilla::Object::check_boolean,
</span><span class="cx"> is_requestable => \&Bugzilla::Object::check_boolean,
</span><span class="cx"> is_requesteeble => \&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) && $sortkey <= MAX_SMALLINT)
</span><span class="lines">@@ -681,7 +681,10 @@
</span><span class="cx"> }
</span><span class="cx"> if ($criteria->{product_id}) {
</span><span class="cx"> my $product_id = $criteria->{product_id};
</span><del>-
</del><ins>+ detaint_natural($product_id)
+ || ThrowCodeError('bad_arg', { argument => 'product_id',
+ function => '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, "INNER JOIN flaginclusions AS i ON flagtypes.id = i.type_id");
</span><span class="lines">@@ -698,6 +701,10 @@
</span><span class="cx"> my $addl_join_clause = "";
</span><span class="cx"> if ($criteria->{component_id}) {
</span><span class="cx"> my $component_id = $criteria->{component_id};
</span><ins>+ detaint_natural($component_id)
+ || ThrowCodeError('bad_arg', { argument => 'component_id',
+ function => 'Bugzilla::FlagType::sqlify_criteria' });
+
</ins><span class="cx"> push(@criteria, "(i.component_id = $component_id OR i.component_id IS NULL)");
</span><span class="cx"> $join_clause .= "AND (e.component_id = $component_id OR e.component_id IS NULL) ";
</span><span class="cx"> }
</span><span class="lines">@@ -711,7 +718,10 @@
</span><span class="cx"> }
</span><span class="cx"> if ($criteria->{group}) {
</span><span class="cx"> my $gid = $criteria->{group};
</span><del>- detaint_natural($gid);
</del><ins>+ detaint_natural($gid)
+ || ThrowCodeError('bad_arg', { argument => 'group',
+ function => 'Bugzilla::FlagType::sqlify_criteria' });
+
</ins><span class="cx"> push(@criteria, "(flagtypes.grant_group_id = $gid " .
</span><span class="cx"> " OR flagtypes.request_group_id = $gid)");
</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->user;
</span><span class="cx"> return if !Bugzilla->params->{'usevisibilitygroups'};
</span><del>- my $is_visible = grep { $_->id == $_ } @{ $user->visible_groups_inherited };
</del><ins>+
+ my $group_id = $self->id;
+ my $is_visible = grep { $_ == $group_id } @{ $user->visible_groups_inherited };
</ins><span class="cx"> if (!$is_visible) {
</span><span class="cx"> ThrowUserError('group_not_visible', { group => $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<user>
+
+The L<Bugzilla::User> 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->prepare('UPDATE namedqueries SET query = ?
</span><span class="cx"> WHERE id = ?');
</span><del>- my $sth_nq_footer = $dbh->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'), "\n";
</span><span class="lines">@@ -3580,13 +3577,11 @@
</span><span class="cx"> next if !$bug_id;
</span><span class="cx"> $sth_bug_tag->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->query_param('tag', $tag_name);
</span><span class="cx"> $sth_nq->execute($uri->query, $query_id);
</span><del>- # But we don't keep showing them in the footer.
- $sth_nq_footer->execute($user_id, $query_id);
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> $dbh->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->{missing}})
</span><span class="cx"> or ($output and $check_results->{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 && ON_ACTIVESTATE && vers_cmp($perl_ver, '5.12') < 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') > -1) {
- $url_to_theory58S = 'http://cpan.uwinnipeg.ca/PPMPackages/10xx/';
- }
- print colored(
- install_string('ppm_repo_add',
- { theory_url => $url_to_theory58S }),
- COLOR_ERROR);
-
- # ActivePerls older than revision 819 require an additional command.
- if (ON_ACTIVESTATE < 819) {
- print install_string('ppm_repo_up');
- }
- }
-
</del><span class="cx"> if ($need_module_instructions or @{ $check_results->{apache} }) {
</span><span class="cx"> # If any output was required, we want to close the "table"
</span><span class="cx"> print "*" x TABLE_WIDTH . "\n";
</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"> "name" of this object. The 'name' is a B<string> that uniquely identifies
</span><span class="cx"> this Object in the database. Defaults to 'name'. When you specify
</span><del>-C<{name => $name}> to C<new()>, this is the column that will be
</del><ins>+C<< {name => $name} >> to C<new()>, 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<ID_FIELD>
</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<condition> and C<values> when they
</span><del>-call C<$self->SUPER::new> (which is this function, usually).
</del><ins>+call C<< $self->SUPER::new >> (which is this function, usually).
</ins><span class="cx">
</span><span class="cx"> If you try to call C<new> outside of a subclass with the C<condition>
</span><span class="cx"> and C<values> parameters, Bugzilla will throw an error. These parameters
</span><span class="lines">@@ -1089,8 +1089,9 @@
</span><span class="cx"> your subclass's L</ID_FIELD> must be of C<SERIAL>
</span><span class="cx"> type in the database.
</span><span class="cx">
</span><del>- Subclass Implementors: This function basically just
- calls L</check_required_create_fields>, then
</del><ins>+Subclass Implementors:
+ This function basically just calls
+ L</check_required_create_fields>, then
</ins><span class="cx"> L</run_create_validators>, and then finally
</span><span class="cx"> L</insert_create_data>. 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<$class->get_all>. For
- example, C<Bugzilla::Keyword->get_all>.
- C<Bugzilla::Keyword::get_all> will not work.
</del><ins>+ Notes: Note that you must call this as $class->get_all. For
+ example, Bugzilla::Keyword->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->children }) {
- next if $child->isa(__PACKAGE__) && !$child->has_translated_conditions;
- next if $child->isa('Bugzilla::Search::Condition')
- && !$child->translated;
</del><ins>+ if (!$self->{sql}) {
+ my @strings;
+ foreach my $child (@{ $self->children }) {
+ next if $child->isa(__PACKAGE__) && !$child->has_translated_conditions;
+ next if $child->isa('Bugzilla::Search::Condition')
+ && !$child->translated;
</ins><span class="cx">
</span><del>- my $string = $child->as_string;
- if ($self->joiner eq 'AND') {
- $string = "( $string )" if $string =~ /OR/;
</del><ins>+ my $string = $child->as_string;
+ next unless $string;
+ if ($self->joiner eq 'AND') {
+ $string = "( $string )" if $string =~ /OR/;
+ }
+ else {
+ $string = "( $string )" if $string =~ /AND/;
+ }
+ push(@strings, $string);
</ins><span class="cx"> }
</span><del>- else {
- $string = "( $string )" if $string =~ /AND/;
- }
- push(@strings, $string);
</del><ins>+
+ my $sql = join(' ' . $self->joiner . ' ', @strings);
+ $sql = "NOT( $sql )" if $sql && $self->negate;
+ $self->{sql} = $sql;
</ins><span class="cx"> }
</span><del>-
- my $sql = join(' ' . $self->joiner . ' ', @strings);
- $sql = "NOT( $sql )" if $sql && $self->negate;
- return $sql;
</del><ins>+ return $self->{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]->{field} }
</span><del>-sub operator { return $_[0]->{operator} }
</del><span class="cx"> sub value { return $_[0]->{value} }
</span><span class="cx">
</span><ins>+sub operator {
+ my ($self, $value) = @_;
+ if (@_ == 2) {
+ $self->{operator} = $value;
+ }
+ return $self->{operator};
+}
+
</ins><span class="cx"> sub fov {
</span><span class="cx"> my ($self) = @_;
</span><span class="cx"> return ($self->field, $self->operator, $self->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->shared_with_group
</span><span class="cx"> or !$user->in_group($search->shared_with_group))
</span><span class="cx"> {
</span><del>- ThrowUserError('missing_query', { queryname => $search->name,
</del><ins>+ ThrowUserError('missing_query', { name => $search->name,
</ins><span class="cx"> sharer_id => $search->user->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 => MULTI_SELECT_OVERRIDE,
</span><span class="cx"> keywords => MULTI_SELECT_OVERRIDE,
</span><del>- 'flagtypes.name' => MULTI_SELECT_OVERRIDE,
</del><ins>+ 'flagtypes.name' => {
+ _non_changed => \&_flagtypes_nonchanged,
+ },
</ins><span class="cx"> longdesc => {
</span><del>- %{ MULTI_SELECT_OVERRIDE() },
</del><span class="cx"> changedby => \&_long_desc_changedby,
</span><span class="cx"> changedbefore => \&_long_desc_changedbefore_after,
</span><span class="cx"> changedafter => \&_long_desc_changedbefore_after,
</span><ins>+ _non_changed => \&_long_desc_nonchanged,
</ins><span class="cx"> },
</span><span class="cx"> 'longdescs.count' => {
</span><span class="cx"> changedby => \&_long_desc_changedby,
</span><span class="lines">@@ -690,8 +692,16 @@
</span><span class="cx"> my ($self) = @_;
</span><span class="cx"> return $self->{sql} if $self->{sql};
</span><span class="cx"> my $dbh = Bugzilla->dbh;
</span><del>-
</del><ins>+
</ins><span class="cx"> my ($joins, $clause) = $self->_charts_to_conditions();
</span><ins>+
+ if (!$clause->as_string
+ && !Bugzilla->params->{'search_allow_no_criteria'}
+ && !$self->{allow_unlimited})
+ {
+ ThrowUserError('buglist_parameters_required');
+ }
+
</ins><span class="cx"> my $select = join(', ', $self->_sql_select);
</span><span class="cx"> my $from = $self->_sql_from($joins);
</span><span class="cx"> my $where = $self->_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->{display_columns} } if $self->{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->_input_columns;
+
+ # Only add columns which are not already listed.
+ my %list = map { $_ => 1 } @columns;
+ foreach my $column ($self->_extra_columns) {
+ push(@columns, $column) unless $list{$column}++;
+ }
+ $self->{display_columns} = \@columns;
+ return @{ $self->{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->{select_columns} } if $self->{select_columns};
</span><span class="cx">
</span><span class="cx"> my @select_columns;
</span><del>- foreach my $column ($self->_input_columns, $self->_extra_columns) {
</del><ins>+ foreach my $column ($self->_display_columns) {
</ins><span class="cx"> if (my $add_first = COLUMN_DEPENDS->{$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->{select_columns} = [uniq @select_columns];
</span><span class="cx"> return @{ $self->{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->_select_columns) {
</del><ins>+ foreach my $column ($self->_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("\n AND ", $self->_standard_where);
</span><span class="cx"> my $clause_sql = $main_clause->as_string;
</span><del>- if ($clause_sql) {
- $where .= "\n AND " . $clause_sql;
- }
- elsif (!Bugzilla->params->{'search_allow_no_criteria'}
- && !$self->{allow_unlimited})
- {
- ThrowUserError('buglist_parameters_required');
- }
</del><ins>+ $where .= "\n AND " . $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 => $string_value,
</span><span class="cx"> all_values => $value,
</span><span class="cx"> joins => [],
</span><ins>+ condition => $condition,
</ins><span class="cx"> );
</span><span class="cx"> $search_args{quoted} = $self->_quote_unless_numeric(\%search_args);
</span><span class="cx"> # This should add a "term" 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->{operator};
</span><del>- my $operator_func = OPERATORS->{$operator};
</del><ins>+ my $operator_func = OPERATORS->{$operator}
+ || ThrowCodeError("search_field_operator_unsupported",
+ { operator => $operator });
</ins><span class="cx"> $self->$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 "$outer IN (SELECT $inner FROM $table WHERE $cond)";
</del><ins>+ my ($outer, $inner, $table, $cond, $negate) = @_;
+ # Execute subselects immediately to avoid dependent subqueries, which are
+ # large performance hits on MySql
+ my $q = "SELECT DISTINCT $inner FROM $table WHERE $cond";
+ my $dbh = Bugzilla->dbh;
+ my $list = $dbh->selectcol_arrayref($q);
+ return $negate ? "1=1" : "1=2" unless @$list;
+ return $dbh->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->{value};
</span><span class="cx"> my $user = $self->_user;
</span><del>-
- if ($value =~ /^\%group/) {
</del><ins>+
+ if ($value =~ /^\%group\.[^%]+%$/) {
</ins><span class="cx"> $self->_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->dbh;
</span><span class="cx"> my $user = $self->_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->check({ name => $1, _error => 'invalid_group_name' });
</del><ins>+ my $group_name = $1;
+ my $group = Bugzilla::Group->check({ name => $group_name, _error => 'invalid_group_name' });
+ # Pass $group_name instead of $group->name to the error message
+ # to not leak the existence of the group.
+ $user->in_group($group)
+ || ThrowUserError('invalid_group_name', { name => $group_name });
+ # Now that we know the user belongs to this group, it's safe
+ # to disclose more information.
</ins><span class="cx"> $group->check_members_are_visible();
</span><del>- $user->in_group($group)
- || ThrowUserError('invalid_group_name', {name => $group->name});
</del><span class="cx">
</span><span class="cx"> my $group_ids = Bugzilla::Group->flatten_group_membership($group->id);
</span><span class="cx"> my $table = "user_group_map_$chart_id";
</span><span class="lines">@@ -2242,7 +2279,7 @@
</span><span class="cx"> my $table = $first_join->{table};
</span><span class="cx"> my $columns = "bug_id";
</span><span class="cx"> $columns .= ",isprivate" if @{ $first_join->{extra} };
</span><del>- my $new_table = "SELECT $columns FROM $table AS $as $join_sql";
</del><ins>+ my $new_table = "SELECT DISTINCT $columns FROM $table AS $as $join_sql";
</ins><span class="cx"> $first_join->{table} = "($new_table)";
</span><span class="cx"> # We always want to LEFT JOIN the generated table.
</span><span class="cx"> delete $first_join->{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->{term} = "$table.bug_when IS NOT NULL";
</span><ins>+
+ # If the user is not part of the insiders group, they cannot see
+ # private comments
+ if (!$self->_user->is_insider) {
+ $args->{term} .= " AND $table.isprivate = 0";
+ }
</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->dbh;
+
+ my $table = "longdescs_$chart_id";
+ my $join_args = {
+ chart_id => $chart_id,
+ sequence => $chart_id,
+ field => 'longdesc',
+ full_field => "$table.thetext",
+ operator => $operator,
+ value => $value,
+ all_values => $value,
+ quoted => $dbh->quote($value),
+ joins => [],
+ };
+ $self->_do_operator_function($join_args);
+
+ # If the user is not part of the insiders group, they cannot see
+ # private comments
+ if (!$self->_user->is_insider) {
+ $join_args->{term} .= " AND $table.isprivate = 0";
+ }
+
+ my $join = {
+ table => 'longdescs',
+ as => $table,
+ extra => [ $join_args->{term} ],
+ };
+ push(@$joins, $join);
+
+ $args->{term} = "$table.comment_id IS NOT NULL";
+}
+
</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->dbh;
</span><del>-
</del><ins>+
</ins><span class="cx"> # "content" 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 "matches" 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->sql_fulltext_search("$table.$comments_col", $value, 1);
</del><ins>+ $dbh->sql_fulltext_search("$table.$comments_col", $value);
</ins><span class="cx"> my ($term2, $rterm2) =
</span><del>- $dbh->sql_fulltext_search("$table.short_desc", $value, 2);
</del><ins>+ $dbh->sql_fulltext_search("$table.short_desc", $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->{value} = $word;
</span><span class="cx"> $args->{quoted} = $dbh->quote($word);
</span><span class="cx"> push(@terms, $self->_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->dbh;
+
+ # For 'not' operators, we need to negate the whole term.
+ # If you search for "Flags" (does not contain) "approval+" 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->{operator} = $operator;
+ $condition->operator($operator);
+ $condition->negate(1);
+ }
+
+ my $subselect_args = {
+ chart_id => $chart_id,
+ sequence => $chart_id,
+ field => 'flagtypes.name',
+ full_field => $dbh->sql_string_concat("flagtypes_$chart_id.name", "flags_$chart_id.status"),
+ operator => $operator,
+ value => $value,
+ all_values => $value,
+ quoted => $dbh->quote($value),
+ joins => [],
+ };
+ $self->_do_operator_function($subselect_args);
+ my $subselect_term = $subselect_args->{term};
+
+ # don't call build_subselect as this must run as a true sub-select
+ $args->{term} = "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
+ )";
+}
+
</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->{term};
</span><span class="cx"> $term .= $args->{_extra_where} || '';
</span><span class="cx"> my $select = $args->{_select_field} || 'bug_id';
</span><del>- my $not_sql = $not ? "NOT " : '';
- return "bugs.bug_id ${not_sql}IN (SELECT $select FROM $table WHERE $term)";
</del><ins>+ return build_subselect("bugs.bug_id", $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->_substring_terms($args);
</span><span class="cx"> $args->{term} = join("\n\tOR ", @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->_substring_terms($args);
</span><span class="cx"> $args->{term} = join("\n\tAND ", @terms);
</span><span class="cx"> }
</span><span class="lines">@@ -2774,8 +2899,10 @@
</span><span class="cx"> extra => ["$table.fieldid = $field_id",
</span><span class="cx"> "$table.bug_when $sql_operator $sql_date"],
</span><span class="cx"> };
</span><ins>+
+ $args->{term} = "$table.bug_when IS NOT NULL";
+ $self->_changed_security_check($args, $join);
</ins><span class="cx"> push(@$joins, $join);
</span><del>- $args->{term} = "$table.bug_when IS NOT NULL";
</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 => ["$table.fieldid = $field_id",
</span><span class="cx"> "$table.$column = $quoted"],
</span><span class="cx"> };
</span><del>- push(@$joins, $join);
</del><span class="cx">
</span><span class="cx"> $args->{term} = "$table.bug_when IS NOT NULL";
</span><ins>+ $self->_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 => ["$table.fieldid = $field_id",
</span><span class="cx"> "$table.who = $user_id"],
</span><span class="cx"> };
</span><ins>+
+ $args->{term} = "$table.bug_when IS NOT NULL";
+ $self->_changed_security_check($args, $join);
</ins><span class="cx"> push(@$joins, $join);
</span><del>- $args->{term} = "$table.bug_when IS NOT NULL";
</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->_chart_fields->{$field}
+ || ThrowCodeError("invalid_field_name", { field => $field });
+ my $field_id = $field_object->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->_user->is_insider) {
+ $join->{then_to} = {
+ as => "attach_${field_id}_$chart_id",
+ table => 'attachments',
+ from => "act_${field_id}_$chart_id.attach_id",
+ to => 'attach_id',
+ };
+
+ $args->{term} .= " AND COALESCE(attach_${field_id}_$chart_id.isprivate, 0) = 0";
+ }
+}
+
</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<>\"]+[\w\/]/i;
</del><ins>+ return qr/($safe_protocols):[^:\s<>\"][^\s<>\"]+[\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->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 => \$text, bug => $bug, regexes => \@hook_regexes,
</span><del>- comment => $comment });
</del><ins>+ comment => $comment, user => $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->params->{'urlbase'},
</span><span class="cx"> Bugzilla->params->{'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 => $5 })) &&
</del><ins>+ ~($things[$count++] = get_bug_link($3, $1, { comment_num => $5, user => $user })) &&
</ins><span class="cx"> ("\0\0" . ($count-1) . "\0\0")
</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)) &&
</del><ins>+ ~($things[$count++] = get_attachment_link($2, $1, $user)) &&
</ins><span class="cx"> ("\0\0" . ($count-1) . "\0\0")
</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 => $3 }) :
</del><ins>+ (defined($2) ? get_bug_link($2, $1, { comment_num => $3, user => $user }) :
</ins><span class="cx"> "<a href=\"$current_bugurl#c$4\">$1</a>")
</span><span class="cx"> ~egox;
</span><span class="cx">
</span><span class="lines">@@ -262,7 +263,7 @@
</span><span class="cx"> $text =~ s~(?<=^\*\*\*\ 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 => $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->dbh;
</span><ins>+ $user ||= Bugzilla->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 = "";
</span><span class="cx"> my $className = "";
</span><del>- if (Bugzilla->user->can_see_bug($attachment->bug_id)) {
</del><ins>+ if ($user->can_see_bug($attachment->bug_id)
+ && (!$attachment->isprivate || $user->is_insider))
+ {
</ins><span class="cx"> $title = $attachment->description;
</span><span class="cx"> }
</span><span class="cx"> if ($attachment->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->{user} ||= Bugzilla->user;
</ins><span class="cx"> my $dbh = Bugzilla->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 => \&Bugzilla::Util::clean_text ,
</span><span class="cx">
</span><span class="cx"> quoteUrls => [ 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 => sub
- {
- my $buglist = shift;
- return join(", ", map(get_bug_link($_, $_), split(/ *, */, $buglist)));
</del><ins>+ bug_list_link => sub {
+ my ($buglist, $options) = @_;
+ return join(", ", 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' => new Bugzilla::Auth(),
</del><ins>+ 'default_authorizer' => sub { return Bugzilla::Auth->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->selectrow_array('SELECT ' . $dbh->sql_date_format('issuedate') . ',
</del><ins>+ my ($db_token, $issuedate, $tokentype, $eventdata, $userid) =
+ $dbh->selectrow_array('SELECT token, ' . $dbh->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 && $db_token eq $token)
+ || ThrowCodeError("cancel_token_does_not_exist");
+
</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->selectrow_array(
- "SELECT userid, " . $dbh->sql_date_format('issuedate') . ", eventdata
- FROM tokens
</del><ins>+ my @token_data = $dbh->selectrow_array(
+ "SELECT token, userid, " . $dbh->sql_date_format('issuedate') . ", eventdata
+ FROM tokens
</ins><span class="cx"> WHERE token = ?", 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<$setting_name> - 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->get_selectable_products},
</span><span class="cx"> @{$self->get_enterable_products};
</span><span class="cx">
</span><del>- return [ values %products ];
</del><ins>+ return [ sort { $a->name cmp $b->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->params->{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<recent_searches>
+
+Returns an arrayref of L<Bugzilla::Search::Recent> objects
+containing the user's recent searches.
+
+=item C<recent_search_containing(bug_id)>
+
+Returns a L<Bugzilla::Search::Recent> object that contains the most recent
+search by the user for the specified bug id. Retuns undef if no match is found.
+
+=item C<recent_search_for(bug)>
+
+Returns a L<Bugzilla::Search::Recent> 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<save_last_search>
+
+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<can_enter_product($product_name, $warn)>
</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->{offset}) and !defined($params->{limit}) ) {
</span><span class="cx"> ThrowCodeError('param_required',
</span><span class="cx"> { param => 'limit', function => 'Bug.search()' });
</span><span class="cx"> }
</span><del>-
</del><ins>+
+ my $max_results = Bugzilla->params->{max_search_results};
+ unless (defined $params->{limit} && $params->{limit} == 0) {
+ if (!defined $params->{limit} || $params->{limit} > $max_results) {
+ $params->{limit} = $max_results;
+ }
+ }
+ else {
+ delete $params->{limit};
+ delete $params->{offset};
+ }
+
</ins><span class="cx"> $params = Bugzilla::Bug::map_fields($params);
</span><span class="cx"> delete $params->{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->{WHERE}->{"($clause)"} = [map { "\%$_\%" } @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->{WHERE}
+ && !grep(!/(limit|offset)/i, keys %$params)
+ && !Bugzilla->params->{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->match so we copy the
</span><span class="cx"> # params and delete those before passing to Bugzilla::Bug->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<UNSTABLE>
+
+=over
+
+=item B<Description>
+
+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<Params>
+
+=over
+
+=item C<summary> (string) B<Required> - A string of keywords defining
+the type of bug you are trying to report.
+
+=item C<products> (array) - One or more product names to narrow the
+duplicate search to. If omitted, all bugs are searched.
+
+=back
+
+=item B<Returns>
+
+The same as L</get>.
+
+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<then> call this method.
+
+=item B<Errors>
+
+=over
+
+=item 50 (Param Required)
+
+You must specify a value for C<summary> containing a string of keywords to
+search for duplicates.
+
+=back
+
+=item B<History>
+
+=over
+
+=item Added in Bugzilla B<4.0>.
+
+=back
+
+=back
+
</ins><span class="cx"> =head2 search
</span><span class="cx">
</span><span class="cx"> B<UNSTABLE>
</span><span class="lines">@@ -2074,13 +2148,16 @@
</span><span class="cx">
</span><span class="cx"> =item C<limit>
</span><span class="cx">
</span><del>-C<int> Limit the number of results returned to C<int> records.
</del><ins>+C<int> Limit the number of results returned to C<int> 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<offset>
</span><span class="cx">
</span><del>-C<int> Used in conjunction with the C<limit> argument, C<offset> defines
-the starting position for the search. For example, given a search that
-would return 100 bugs, setting C<limit> to 10 and C<offset> to 10 would return
</del><ins>+C<int> Used in conjunction with the C<limit> argument, C<offset> defines
+the starting position for the search. For example, given a search that
+would return 100 bugs, setting C<limit> to 10 and C<offset> 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<op_sys>
</span><span class="lines">@@ -2166,11 +2243,17 @@
</span><span class="cx">
</span><span class="cx"> =item B<Errors>
</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<History>
</span><span class="cx">
</span><span class="cx"> =over
</span><span class="lines">@@ -2182,6 +2265,10 @@
</span><span class="cx"> =item The C<reporter> input parameter was renamed to C<creator>
</span><span class="cx"> in Bugzilla B<4.0>.
</span><span class="cx">
</span><ins>+=item In B<4.2.6> and newer, added the ability to return all results if
+C<limit> 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<Description>
</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<data>
</span><span class="cx">
</span><del>-B<Required> C<base64> The content of the attachment.
</del><ins>+B<Required> C<base64> or C<string> 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<base64> type.
</ins><span class="cx">
</span><span class="cx"> =item C<file_name>
</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 => 801,
</span><span class="cx"> empty_group_description => 802,
</span><span class="cx"> invalid_regexp => 803,
</span><ins>+ invalid_group_name => 804,
</ins><span class="cx">
</span><ins>+ # Search errors are 1000-1100
+ buglist_parameters_required => 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 => -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->cgi->{'Bugzilla_cookie_list'}}) {
- $self->response->headers->push_header('Set-Cookie', $_);
</del><ins>+ foreach my $cookie (@{Bugzilla->cgi->{'Bugzilla_cookie_list'}}) {
+ $self->response->headers->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->cgi->header)) {
+ my ($name, $value) = $header =~ /^([^:]+): (.*)/;
+ if (!$self->response->headers->header($name)) {
+ $self->response->headers->header($name => $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 => $full_method}) if (!$class or $method =~ /^_/);
+
</ins><span class="cx"> eval "require $class";
</span><span class="cx"> ThrowCodeError('unknown_method', {method => $full_method}) if $@;
</span><span class="cx"> return if ($class->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->user;
+
</ins><span class="cx"> my @groups = map { Bugzilla::Group->check({ id => $_ }) }
</span><span class="cx"> @{ $group_ids || [] };
</span><del>- my @name_groups = map { Bugzilla::Group->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->check({ name => $name, _error => 'invalid_group_name' });
+ $user->in_group($group) || ThrowUserError('invalid_group_name', { name => $name });
+ push(@groups, $group);
+ }
+ }
+
</ins><span class="cx"> my @in_group = grep { $self->_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 "names" array or a bad
</span><del>-group name/id in the C<groups>/C<group_ids> arguments.
</del><ins>+group ID in the C<group_ids> 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 "ids" or "match" 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<groups> 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<History>
</span><span class="lines">@@ -614,6 +625,9 @@
</span><span class="cx"> =item C<include_disabled> added in Bugzilla B<4.0>. Default behavior
</span><span class="cx"> for C<match> 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->sortkey <=> $b->sortkey || $a->name cmp $b->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<by_name>
</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<Bugzilla::Field> 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->header(-type=>"$contenttype; name=\"$filename\"",
</span><span class="cx"> -content_disposition=> "$disposition; filename=\"$filename\"",
</span><del>- -content_length => $attachment->datasize,
- -x_content_type_options => "nosniff");
</del><ins>+ -content_length => $attachment->datasize);
</ins><span class="cx"> disable_utf8();
</span><span class="cx"> print $attachment->data;
</span><span class="cx"> }
</span><span class="lines">@@ -733,20 +732,23 @@
</span><span class="cx"> $attachment->set_filename(scalar $cgi->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->param('delta_ts')
- && $cgi->param('delta_ts') ne $attachment->modification_time)
- {
</del><ins>+ my $delta_ts = $cgi->param('delta_ts');
+ my $modification_time = $attachment->modification_time;
+
+ if ($delta_ts && $delta_ts ne $modification_time) {
+ datetime_from($delta_ts)
+ or ThrowCodeError('invalid_timestamp', { timestamp => $delta_ts });
</ins><span class="cx"> ($vars->{'operations'}) =
</span><del>- Bugzilla::Bug::GetBugActivity($bug->id, $attachment->id, $cgi->param('delta_ts'));
</del><ins>+ Bugzilla::Bug::GetBugActivity($bug->id, $attachment->id, $delta_ts);
</ins><span class="cx">
</span><del>- # The token contains the old modification_time. We need a new one.
- $cgi->param('token', issue_hash_token([$attachment->id, $attachment->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->{'operations'}})) {
</span><del>- $cgi->param('delta_ts', $attachment->modification_time);
</del><ins>+ $cgi->param('delta_ts', $modification_time);
+ # The token contains the old modification_time. We need a new one.
+ $cgi->param('token', issue_hash_token([$attachment->id, $modification_time]));
+
</ins><span class="cx"> $vars->{'attachment'} = $attachment;
</span><span class="cx">
</span><span class="cx"> print $cgi->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->login();
</span><span class="cx">
</span><span class="cx"> if (length($buffer) == 0) {
</span><del>- print $cgi->header(-refresh=> '10; URL=query.cgi');
</del><span class="cx"> ThrowUserError("buglist_parameters_required");
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -141,7 +140,7 @@
</span><span class="cx"> && exists $ENV{'HTTP_USER_AGENT'}
</span><span class="cx"> && $ENV{'HTTP_USER_AGENT'} =~ /Mozilla.[3-9]/
</span><span class="cx"> && (($ENV{'HTTP_USER_AGENT'} !~ /[Cc]ompatible/) || ($ENV{'HTTP_USER_AGENT'} =~ /MSIE 5.*Mac_PowerPC/))
</span><del>- && $ENV{'HTTP_USER_AGENT'} !~ /WebKit/
</del><ins>+ && $ENV{'HTTP_USER_AGENT'} !~ /(?:WebKit|Trident|KHTML)/
</ins><span class="cx"> && !$agent
</span><span class="cx"> && !defined($cgi->param('serverpush'))
</span><span class="cx"> || $cgi->param('serverpush');
</span><span class="lines">@@ -213,7 +212,7 @@
</span><span class="cx"> Bugzilla->login(LOGIN_REQUIRED);
</span><span class="cx">
</span><span class="cx"> my $query = Bugzilla::Search::Saved->check(
</span><del>- { user => $sharer_id, name => $name });
</del><ins>+ { user => $sharer_id, name => $name, _error => 'missing_query' });
</ins><span class="cx">
</span><span class="cx"> $query->url
</span><span class="cx"> || ThrowUserError("buglist_parameters_required");
</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->{'message'} = "buglist_query_gone";
</span><span class="cx"> $vars->{'namedcmd'} = $qname;
</span><del>- $vars->{'url'} = "buglist.cgi?newquery=" . url_quote($buffer) . "&cmdtype=doit&remtype=asnamed&newqueryname=" . url_quote($qname);
</del><ins>+ $vars->{'url'} = "buglist.cgi?newquery=" . url_quote($buffer)
+ . "&cmdtype=doit&remtype=asnamed&newqueryname=" . url_quote($qname)
+ . "&token=" . url_quote(issue_hash_token(['savedsearch']));
</ins><span class="cx"> $template->process("global/message.html.tmpl", $vars)
</span><span class="cx"> || ThrowTemplateError($template->error());
</span><span class="cx"> exit;
</span><span class="lines">@@ -461,6 +462,10 @@
</span><span class="cx"> elsif (($cmdtype eq "doit") && defined $cgi->param('remtype')) {
</span><span class="cx"> if ($cgi->param('remtype') eq "asdefault") {
</span><span class="cx"> $user = Bugzilla->login(LOGIN_REQUIRED);
</span><ins>+ my $token = $cgi->param('token');
+ check_hash_token($token, ['searchknob']);
+ $buffer = $params->canonicalise_query('cmdtype', 'remtype',
+ 'query_based_on', 'token');
</ins><span class="cx"> InsertNamedQuery(DEFAULT_QUERY_NAME, $buffer);
</span><span class="cx"> $vars->{'message'} = "buglist_new_default_query";
</span><span class="cx"> }
</span><span class="lines">@@ -783,7 +788,7 @@
</span><span class="cx">
</span><span class="cx"> if ($cgi->param('debug')
</span><span class="cx"> && Bugzilla->params->{debug_group}
</span><del>- && Bugzilla->user->in_group(Bugzilla->params->{debug_group})
</del><ins>+ && $user->in_group(Bugzilla->params->{debug_group})
</ins><span class="cx"> ) {
</span><span class="cx"> $vars->{'debug'} = 1;
</span><span class="cx"> $vars->{'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->{'urlquerypart'} = $params->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->{'extension'} eq "csv") {
</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<Product.get_product> with the name of the product you want to know more
-of.
</del><ins>+Call C<Product.get> with the name of the product you want to know more of.
</ins><span class="cx"> The call will return a C<Bugzilla::Product> 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->call('Product.get_product', $product_name);
</del><ins>+ $soapresult = $proxy->call('Product.get', {'names' => [$product_name]});
</ins><span class="cx"> _die_on_fault($soapresult);
</span><del>- $result = $soapresult->result;
</del><ins>+ $result = $soapresult->result()->{'products'}->[0];
</ins><span class="cx">
</span><del>- if (ref($result) eq 'HASH') {
- foreach (keys(%$result)) {
- print "$_: $$result{$_}\n";
</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->{$key};
+
+ if (ref($value)) {
+ my $counter = 0;
+ foreach my $hash (@$value) {
+ while (my ($innerKey, $innerValue) = each %$hash) {
+ print "$key.$counter.$innerKey: $innerValue\n";
+ }
+ ++$counter;
</ins><span class="cx"> }
</span><ins>+ }
+ else {
+ print "$key: $value\n"
+ }
</ins><span class="cx"> }
</span><del>- else {
- print "$result\n";
- }
</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 <mkanat@bugzilla.org>
</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 "Converting $from to $to...\n";
</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->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 => $to })) {
</del><ins>+ my $new_status = new Bugzilla::Status({ name => $to });
+ my $old_status = new Bugzilla::Status({ name => $from });
+
+ if ($new_status && $old_status) {
+ my $to_id = $new_status->id;
+ my $from_id = $old_status->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->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->do('UPDATE status_workflow SET old_status = ? WHERE old_status = ? AND '
+ . $dbh->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->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->do('UPDATE status_workflow SET new_status = ? WHERE new_status = ? AND '
+ . $dbh->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->do('DELETE FROM status_workflow WHERE old_status = new_status');
</ins><span class="cx"> $dbh->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->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"> -->
</span><span class="cx">
</span><del>-<!ENTITY bz-ver "4.2.1">
</del><ins>+<!ENTITY bz-ver "4.2.7">
</ins><span class="cx"> <!ENTITY bz-nextver "4.4">
</span><del>-<!ENTITY bz-date "2012-04-18">
-<!ENTITY current-year "2012">
</del><ins>+<!ENTITY bz-date "2013-10-16">
+<!ENTITY current-year "2013">
</ins><span class="cx">
</span><span class="cx"> <!ENTITY landfillbase "http://landfill.bugzilla.org/bugzilla-4.2-branch/">
</span><span class="cx"> <!ENTITY bz "http://www.bugzilla.org/">
</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"> <para>
</span><span class="cx"> <emphasis>Login Name</emphasis>:
</span><span class="cx"> This is generally the user's full email address. However, if you
</span><del>- have are using the <quote>emailsuffix</quote> parameter, this may
</del><ins>+ are using the <quote>emailsuffix</quote> 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"> </para>
</span><span class="lines">@@ -2425,37 +2425,72 @@
</span><span class="cx"> <emphasis>Type:</emphasis>
</span><span class="cx"> The type of field to create. There are
</span><span class="cx"> several types available:
</span><del>- <simplelist>
- <member>
- 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.
- </member>
- <member>
- Large Text Box: A multiple line box for entering free text.
- </member>
- <member>
- Free Text: A single line box for entering free text.
- </member>
- <member>
- 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
- <xref linkend="edit-values-list" /> for information about
- editing legal values.
- </member>
- <member>
- 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
- <xref linkend="edit-values-list" /> for information about
- editing legal values.
- </member>
- <member>
- Date/Time: A date field. This field appears with a
- calendar widget for choosing the date.
- </member>
- </simplelist>
</del><ins>+ <variablelist>
+ <varlistentry>
+ <term>Bug ID:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Large Text Box:</term>
+ <listitem>
+ <para>
+ A multiple line box for entering free text.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Free Text:</term>
+ <listitem>
+ <para>
+ A single line box for entering free text.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Multiple-Selection Box:</term>
+ <listitem>
+ <para>
+ A list box where multiple options
+ can be selected. After creating this field, it must be edited
+ to add the selection options. See
+ <xref linkend="edit-values-list" /> for information about
+ editing legal values.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Drop Down:</term>
+ <listitem>
+ <para>
+ A list box where only one option can be selected.
+ After creating this field, it must be edited to add the
+ selection options. See
+ <xref linkend="edit-values-list" /> for information about
+ editing legal values.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Date/Time:</term>
+ <listitem>
+ <para>
+ A date field. This field appears with a
+ calendar widget for choosing the date.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</ins><span class="cx"> </para>
</span><span class="cx"> </listitem>
</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 <filename>template/en/default</filename>.
</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 <command>cvs update</command>, any changes you have made will
</del><ins>+ be upgrading Bugzilla through Bzr, because if you then execute
+ a <command>bzr update</command>, any changes you have made will
</ins><span class="cx"> be merged automagically with the updated versions.
</span><span class="cx"> </para>
</span><span class="cx">
</span><span class="cx"> <note>
</span><span class="cx"> <para>
</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"> </para>
</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"> <para>
</span><span class="cx"> <ulink url="http://www.bugzilla.org/download/">Download a Bugzilla tarball</ulink>
</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 <ulink url="https://wiki.mozilla.org/Bugzilla:Bzr">check it out from Bzr</ulink>)
+ and place it in a suitable directory, accessible by the default web server user
</ins><span class="cx"> (probably <quote>apache</quote> or <quote>www</quote>).
</span><span class="cx"> Good locations are either directly in the web server's document directories or
</span><span class="cx"> in <filename>/usr/local</filename> with a symbolic link to the web server's
</span><span class="lines">@@ -1582,35 +1582,8 @@
</span><span class="cx"> C:\perl&gt; <command>ppm install &lt;module name&gt;</command>
</span><span class="cx"> </programlisting>
</span><span class="cx">
</span><del>- <para>
- 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):
- </para>
-
- <programlisting>
-<command>ppm repo add theory58S http://theoryx5.uwinnipeg.ca/ppms/</command>
- </programlisting>
-
- <para>
- 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:
- </para>
- <programlisting>
-<command>ppm repo add theory58S http://cpan.uwinnipeg.ca/PPMPackages/10xx/</command>
- </programlisting>
-
</del><span class="cx"> <note>
</span><span class="cx"> <para>
</span><del>- In versions prior to 5.8.8 build 819 of PPM the command is
- <programlisting>
-<command>ppm repository add theory58S http://theoryx5.uwinnipeg.ca/ppms/</command>
- </programlisting>
- </para>
- </note>
- <note>
- <para>
</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"> <para>
</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 <ulink url="http://theoryx5.uwinnipeg.ca/ppms/" /> if you use
- Perl 5.8.x or from <ulink url="http://cpan.uwinnipeg.ca/PPMPackages/10xx/" />
- 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"> </para>
</span><span class="cx"> </note>
</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"> <orderedlist>
</span><span class="cx"> <listitem>
</span><span class="cx"> <para>
</span><del>- <emphasis>Product and Component</emphasis>:
- Bugs are divided up by Product and Component, with a Product
- having one or more Components in it. For example,
- bugzilla.mozilla.org's "Bugzilla" Product is composed of several
- Components:
- <simplelist>
- <member>
- <emphasis>Administration:</emphasis>
- Administration of a Bugzilla installation.</member>
</del><ins>+ <emphasis>Product and Component</emphasis>:
+ Bugs are divided up by Product and Component, with a Product
+ having one or more Components in it. For example,
+ bugzilla.mozilla.org's "Bugzilla" Product is composed of several
+ Components:
+ <variablelist>
+ <varlistentry>
+ <term>Administration:</term>
+ <listitem>
+ <para>
+ Administration of a Bugzilla installation.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Bugzilla-General:</emphasis>
- Anything that doesn't fit in the other components, or spans
- multiple components.</member>
</del><ins>+ <varlistentry>
+ <term>Bugzilla-General:</term>
+ <listitem>
+ <para>
+ Anything that doesn't fit in the other components, or spans
+ multiple components.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Creating/Changing Bugs:</emphasis>
- Creating, changing, and viewing bugs.</member>
</del><ins>+ <varlistentry>
+ <term>Creating/Changing Bugs:</term>
+ <listitem>
+ <para>
+ Creating, changing, and viewing bugs.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Documentation:</emphasis>
- The Bugzilla documentation, including The Bugzilla Guide.</member>
</del><ins>+ <varlistentry>
+ <term>Documentation:</term>
+ <listitem>
+ <para>
+ The Bugzilla documentation, including The Bugzilla Guide.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Email:</emphasis>
- Anything to do with email sent by Bugzilla.</member>
</del><ins>+ <varlistentry>
+ <term>Email:</term>
+ <listitem>
+ <para>
+ Anything to do with email sent by Bugzilla.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Installation:</emphasis>
- The installation process of Bugzilla.</member>
</del><ins>+ <varlistentry>
+ <term>Installation:</term>
+ <listitem>
+ <para>
+ The installation process of Bugzilla.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Query/Buglist:</emphasis>
- Anything to do with searching for bugs and viewing the
- buglists.</member>
</del><ins>+ <varlistentry>
+ <term>Query/Buglist:</term>
+ <listitem>
+ <para>
+ Anything to do with searching for bugs and viewing the
+ buglists.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Reporting/Charting:</emphasis>
- Getting reports from Bugzilla.</member>
</del><ins>+ <varlistentry>
+ <term>Reporting/Charting:</term>
+ <listitem>
+ <para>
+ Getting reports from Bugzilla.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>User Accounts:</emphasis>
- Anything about managing a user account from the user's perspective.
- Saved queries, creating accounts, changing passwords, logging in,
- etc.</member>
</del><ins>+ <varlistentry>
+ <term>User Accounts:</term>
+ <listitem>
+ <para>
+ Anything about managing a user account from the user's perspective.
+ Saved queries, creating accounts, changing passwords, logging in,
+ etc.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>User Interface:</emphasis>
- General issues having to do with the user interface cosmetics (not
- functionality) including cosmetic issues, HTML templates,
- etc.</member>
- </simplelist>
</del><ins>+ <varlistentry>
+ <term>User Interface:</term>
+ <listitem>
+ <para>
+ General issues having to do with the user interface cosmetics (not
+ functionality) including cosmetic issues, HTML templates,
+ etc.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</ins><span class="cx"> </para>
</span><span class="cx"> </listitem>
</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 <quote>timetrackinggroup</quote> parameter.
</span><del>- <simplelist>
- <member>
- <emphasis>Orig. Est.:</emphasis>
- This field shows the original estimated time.</member>
</del><ins>+ <variablelist>
+ <varlistentry>
+ <term>Orig. Est.:</term>
+ <listitem>
+ <para>
+ This field shows the original estimated time.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Current Est.:</emphasis>
- This field shows the current estimated time.
- This number is calculated from <quote>Hours Worked</quote>
- and <quote>Hours Left</quote>.</member>
</del><ins>+ <varlistentry>
+ <term>Current Est.:</term>
+ <listitem>
+ <para>
+ This field shows the current estimated time.
+ This number is calculated from <quote>Hours Worked</quote>
+ and <quote>Hours Left</quote>.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Hours Worked:</emphasis>
- This field shows the number of hours worked.</member>
</del><ins>+ <varlistentry>
+ <term>Hours Worked:</term>
+ <listitem>
+ <para>
+ This field shows the number of hours worked.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Hours Left:</emphasis>
- This field shows the <quote>Current Est.</quote> -
- <quote>Hours Worked</quote>.
- This value + <quote>Hours Worked</quote> will become the
- new Current Est.</member>
</del><ins>+ <varlistentry>
+ <term>Hours Left:</term>
+ <listitem>
+ <para>
+ This field shows the <quote>Current Est.</quote> -
+ <quote>Hours Worked</quote>.
+ This value + <quote>Hours Worked</quote> will become the
+ new Current Est.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>%Complete:</emphasis>
- This field shows what percentage of the task is complete.</member>
</del><ins>+ <varlistentry>
+ <term>%Complete:</term>
+ <listitem>
+ <para>
+ This field shows what percentage of the task is complete.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Gain:</emphasis>
- This field shows the number of hours that the bug is ahead of the
- <quote>Orig. Est.</quote>.</member>
</del><ins>+ <varlistentry>
+ <term>Gain:</term>
+ <listitem>
+ <para>
+ This field shows the number of hours that the bug is ahead of the
+ <quote>Orig. Est.</quote>.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Deadline:</emphasis>
- This field shows the deadline for this bug.</member>
- </simplelist>
</del><ins>+ <varlistentry>
+ <term>Deadline:</term>
+ <listitem>
+ <para>
+ This field shows the deadline for this bug.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</ins><span class="cx"> </para>
</span><span class="cx"> </listitem>
</span><span class="cx">
</span><span class="lines">@@ -591,73 +676,112 @@
</span><span class="cx"> <para>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>- <simplelist>
- <member>
- <emphasis>Long Format:</emphasis>
</del><ins>+ <variablelist>
+ <varlistentry>
+ <term>Long Format:</term>
+ <listitem>
+ <para>
+ this gives you a large page with a non-editable summary of the fields
+ of each bug.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- this gives you a large page with a non-editable summary of the fields
- of each bug.</member>
</del><ins>+ <varlistentry>
+ <term>XML:</term>
+ <listitem>
+ <para>
+ get the buglist in the XML format.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>XML:</emphasis>
</del><ins>+ <varlistentry>
+ <term>CSV:</term>
+ <listitem>
+ <para>
+ get the buglist as comma-separated values, for import into e.g.
+ a spreadsheet.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- get the buglist in the XML format.</member>
</del><ins>+ <varlistentry>
+ <term>Feed:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>CSV:</emphasis>
</del><ins>+ <varlistentry>
+ <term>iCalendar:</term>
+ <listitem>
+ <para>
+ Get the buglist as an iCalendar file. Each bug is represented as a
+ to-do item in the imported calendar.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- get the buglist as comma-separated values, for import into e.g.
- a spreadsheet.</member>
</del><ins>+ <varlistentry>
+ <term>Change Columns:</term>
+ <listitem>
+ <para>
+ change the bug attributes which appear in the list.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>Feed:</emphasis>
</del><ins>+ <varlistentry>
+ <term>Change several bugs at once:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
</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.</member>
</del><ins>+ <varlistentry>
+ <term>Send mail to bug assignees:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
</ins><span class="cx">
</span><del>- <member>
- <emphasis>iCalendar:</emphasis>
</del><ins>+ <varlistentry>
+ <term>Edit Search:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
</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.</member>
-
- <member>
- <emphasis>Change Columns:</emphasis>
-
- change the bug attributes which appear in the list.</member>
-
- <member>
- <emphasis>Change several bugs at once:</emphasis>
-
- 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.</member>
-
- <member>
- <emphasis>Send mail to bug assignees:</emphasis>
-
- 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.</member>
-
- <member>
- <emphasis>Edit Search:</emphasis>
-
- 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.</member>
-
- <member>
- <emphasis>Remember Search As:</emphasis>
-
- 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.
- </member>
- </simplelist>
</del><ins>+ <varlistentry>
+ <term>Remember Search As:</term>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</ins><span class="cx"> </para>
</span><span class="cx"> </section>
</span><span class="cx">
</span><span class="lines">@@ -665,14 +789,10 @@
</span><span class="cx"> <title>Adding/removing tags to/from bugs</title>
</span><span class="cx"> <para>
</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 "tag:my_tag_name"
+ 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 <quote>Enable tags for bugs</quote> user
</span><span class="cx"> preference, see <xref linkend="userpreferences" />. 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. <quote>Keep in mind</quote>, <quote>Interesting bugs</quote>,
</span><span class="cx"> or <quote>Triage</quote>. 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"> </para>
</span><span class="cx"> </section>
</span><span class="cx"> </section>
</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->id : 0;
</span><span class="cx"> my $show_flag_counts = $cgi->param('show_flag_counts') ? 1 : 0;
</span><span class="cx"> my $group_id = $cgi->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->comments->[-1];
</del><ins>+ # The "old" bug object doesn't contain the comment we just added.
+ $added_comment = Bugzilla::Bug->check($bug_id)->comments->[-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.*\)/ && do {push @os, "Windows NT";};
</span><span class="cx"> };
</span><span class="cx"> /\(.*Mac OS X.*\)/ && do {
</span><ins>+ /\(.*Mac OS X (?:|Mach-O |\()10.8.*\)/ && do {push @os, "Mac OS X 10.8";};
</ins><span class="cx"> /\(.*Mac OS X (?:|Mach-O |\()10.7.*\)/ && do {push @os, "Mac OS X 10.7";};
</span><span class="cx"> /\(.*Mac OS X (?:|Mach-O |\()10.6.*\)/ && do {push @os, "Mac OS X 10.6";};
</span><span class="cx"> /\(.*Mac OS X (?:|Mach-O |\()10.5.*\)/ && do {push @os, "Mac OS X 10.5";};
</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 = "Ah ah, you tried to access $page_id? Good try!";
</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/(?<=<td id="error_msg" class="throw_error">).*(?=<\/td>)/$new_error_msg/si;
</del><ins>+ # Since Perl 5.16, we can no longer write "class" inside look-behind
+ # assertions, because "ss" 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
+ # "clas[s]" instead of "class". Stupid and ugly hack, but it works with
+ # all Perl versions.
+ $$page =~ s/(?<=<td id="error_msg" clas[s]="throw_error">).*(?=<\/td>)/$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->input_params->{'oldbugmove'}) {
</del><ins>+ if ($resolution eq 'MOVED' && $invocant->resolution ne 'MOVED'
+ && !Bugzilla->input_params->{'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 "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is 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 <LpSolit@gmail.com>
+
+package Bugzilla::Extension::Voting;
+use strict;
+
+use constant NAME => 'Voting';
+
+use constant REQUIRED_MODULES => [
+];
+
+use constant OPTIONAL_MODULES => [
+];
+
+__PACKAGE__->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 => 'Voting';
</del><span class="cx"> use constant VERSION => BUGZILLA_VERSION;
</span><span class="cx"> use constant DEFAULT_VOTES_PER_BUG => 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->children('long_desc') ) {
</span><span class="cx"> Debug( "Parsing Long Description", DEBUG_LEVEL );
</span><span class="cx"> my %long_desc = ( who => $comment->field('who'),
</span><del>- bug_when => $comment->field('bug_when'),
</del><ins>+ bug_when => format_time($comment->field('bug_when'), '%Y-%m-%d %T'),
</ins><span class="cx"> isprivate => $comment->{'att'}->{'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 <mkanat@bugzilla.org>
</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'] && !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 = [","," "];
</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%"\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&\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\xC3c\x8A\xF6m\xBA\xA6\xC6vwE\xCDTw&k\xC6rQ\xD4\xC9@Q|\xF3\xE6-LD&I&\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&\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>\xF7ϖ\xEA\x83\xE8\xF1\x8F=\x83\xA8\x89N>\xAC\xBB\xB2\x93\xA4#\xAB\xA5\xF4C\xC4O\xBA\x88\xB4\x8EUO\xC2m\xA4\xAF\xA1\xA6\x99Ե\xB44o&b\xAE        \x9BHω\x89\xB4-\xF7g\xB3ڒ\x94á4\x84\xBA\xF9\xB8s\xBA\xF4y\xE6Qy\x98\xFD\xF8FC\xC3٬\x99哚        =\x9A\xCB&\xEC\xA5-\x92+yP\x8Fڢ\x8B\xB9\xCE\xE5R=[yN\xB7'l\xCD\xCEY\x9C\xA1KX\x99\xA4\xB6$\xE3ʜ\xEE.i\xEF\x9AȠ8\xBD"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
-&\x92\xFA94\xDB6\xD5A\xCD:\xCB+]{\xAF\x99._ƍ\xFBGm=ŏ\x9AH<\xAC3\x81\xA3阾2\xD8)LJ\xBF]\x8D\xA3)K4S\x99\xACn1ŕ\xA5\"\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<\xEA\xACK\xC5(a\xAC\xB6>y<E\xAE\xF3\xB8\xA9b֊kY=\xE6\xB8Kq\x9C\x92\xD6m\xDF\xC4&2\xBB;U\x8E"Z\xB2>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&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&\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"\xCD*\x8F6\xAF%\x92Z$\xA9\xAB\x89\x98Wmj\O\xCC\xC5m&\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;<>\xAF\x9C\x9C\x9D\xBC\xE4L=I\xBEq4m\x98"iW\xA3\xA7߆n\xD9b\xF0\xA2\x85K)˃\xA7\x8C\xA3\xBDt˖\xD8&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<\xE7\x91\xA7\xA8D\xAF
-\xAF\xB3\xC8g2W\x9C\xA8ǐ6;<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<\xE8\xDF\xE26#:\xF9\xC0W\xB4\xDC8R\x96f\xEC$\xAB/"\x8E\xE4ۦ`\xFCf\xB8V{XQ9\xFFYqJ*-\x8EMM\x8CI        \x86\xFA\x92\xDBL\xC6x\x82w\xA7\xF5>\x90yP\xD0\xF3\xC3\xE7\x86Fϝ\xA6\x980b\x8EO\xC1T\x9A\xBE\xBA\xD4\xC1du\xEA\xB41\xBD        \xCCEjD\xD7\xD3,\xA2wL\xC5"\xEB`\xA4\xE8u\xD2Tu.)P{\xE6\xBB \x83\xFE'b\x9F\x875\x92T\xAD|\x80\x962si\xBB\xCB]B\x9CM\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<\xBC<\xA7\x8F\xF0t\xE3\xE1\xE3\x8B,        U}"\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"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>\xA9\xA2\xB2\xCA_]S\xAB(\xB0\xDD\xD5\xE0s7ւ\xEB\xCF@A\xA0 R\x90(\xC8\(7<T\xF0R\xC1G\xA1\x82B\xFCT\xAC\xA1PK\xC5:*o\xA3PO\xE5\xEDTj\xA0\xD0H\xA5&*\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>Z7AaR\x99\xC2\xF1
-)L+\x97@\xB9;@y\x94P\xAE\x802\xD47\xA3\x84\x91%J\xB7t\xDB\x858\x85\x84\x92\xC5D\xA3e(<D!K\xC1\xA2`S\xC8Q\x98\xA70K}ԷD}Sz\x8D\xC2#\xA5\xF0e\x85\\xA5\xF5\x9Fş\xCFA\xE5<\xFE<\x81\xED:\xF5~\xA8\xF7\x8B؞\xC4\xF6%l\xF3\xD4\xFB\xFE<\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&\xB6\x93\xD2~\xA5\x81\x9B\x88|&\xB2N\xC2Nd#Q*v\x8C\x84a@\x80\xB1H\xCEN\xF6\xAD\xE8,\xD8(N$љ\x80\xE0&\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&\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>TM\xA6Ȳ\xF7f!o\xD1\xB1ߩ-aߨ-c\xBFGbH;\x8D}\xAB6\x82\xFD1m\xFB\x80v\xFB;\xB4{\xB1o\xD6ư\xEF\xD4\xCEb\xBFK;\x87\xFD6-\x84\xFDa\xED<\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<\xABh \xF5FTR\x97\xBD\xB7Q\x98q\xA5\x9C\x85\x9A6B\x9C\x89^\xADC趎\xE4\xC1#P\xE6Y\xD5\x{38D2FDE}\x90@eT*\xD9@+\x84"\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"\x87[\x90O3\xB3Gpܸ\xB5Z\x8D\xC2\xD4βj\x84\xF1\xA2ke-y&m\xC7fi\x9E-i/pqƢpq\x8D\xF0\xBC̑ۜ=\xB2\x95\x8FX\xC5Es\x8D\xA7\xB8hĐR!\xA1:ǐ<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&\xA1N\x92\\x9A"\x81.\x90)!^\x88\xA6P\xDEM\x8E\xF5\xBB\xE1\xB2WC\x85\xD69\xFBfI5"\xAA\x8E\x81\xEF(\xB4,\xBB_-\xCE0\x8F\xE0Z-\x93Σ\xA5kH\xCD.DB$\xDB,6'\x8CCW\xC1\xBF\x9D/>\xB8HR+S\xC2\x82\xBD\x8E9\xA86\xDF3C\x9D\x90J\x9E\xA1\xB0L\xB9\xDBؒ\xAF\xE4\xAA`
-\x90V/\xB9O\x8Eiu{&}&M\x96\xD37a\xB7a\xE6\x8D;C\xA1V\x8C\x87\xF2F7z\x8Cl\xDE؎ðeب\xF7\xAA\x91{>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\xEACkJt\xC62\xFE\xDCH\xB9\xD8ě\xA2:R\xA0\xC3\xCC5\x92`<b<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#>F\xF81\x8Co\xCC\xE5\x8A\xCA\xFB\x9DsqQ6>\x8B\x9C\xAE<%l\xAE\xE0\x81\x97R\xA2\xCB\xDDaI\xAC\xFEx}\xDD-1\xD9I\xB1ƍj`\xBE\xF1\xEFd<\xA8\xC1-@=\xCC=)\xF4\xC5^d\xA2\xCCEp\xB0o\xE01|\x98\xD0\xCFcy\xC9-,1@ǚr\x8D<\x81\xC5\xE8\xF9\xD6\x91|\x8A\x97<        ܤ\x81\xC5XM\xBE\xA7\xB0\xFC@\xF3z%\x91Vt_#\xC3E\x97\x86\xF6\xB3L\xD7$\x89<\x8F/O\xF1\xF3p{Wx\xEC`(\xACGQ\xE1\xA7!\xF0,@\xDEh~\x87;]\xA2\xA7\xEA\x819\xE4f\xB7>\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,%;>\x94ю\xFEF\xB9\x83ܭ"\xE4\xD88Є\xD3в"\xBC&<ρ\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_&\xDCN\x8F\xAD\xA0E\xF2\xE1\x83E#@\xF0 \xC4;0U\x84+\x8Co"\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&|\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"\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"\x9B"\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>\xB0z\x84)\xB1\xCC\xD6:\xC2\xD0k\x81_8\x99n\xCB"~R\xBD\x84\x9FK,\x97\x97yA\x99&?e\xA9į "y}\xBE\xB7\xD13\x88?c.\xF3\xF9\xDEA\x9F!\xF1]L"y\xDF\xEE"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>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"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<\xAC\xAC\xAE\x84>`\x85/\xEF\xBE<\x9A\xB1P?|<K\x82$\xB7\xA1\xFD\xB8t\xAC\x83l\xFF*\xFA\xE1\x8F\xC07\x86\xAF\xA3\x86y\xE3d!\xB4"\xF2\xB7\xA19E?>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"\xC0\xC0\xC0\x98ˉo'\x8E\xC7ql'q\xE2Ȏs8\xCE\xE1\xC4N\x9C\xCBv\xF6\xC8\xEE:\xBB\xD9\xC8O\xE2\xFB>\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<\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<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"\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&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        "\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>\x97CL\xA11\x98\xEC[S\xF2ÔfY\xB3e\x9E3\xE2I\xBDiL\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&'\xF8\x8E\x86-m\xF7o\xB2?\xA2\xAD\x9
4\x8C"\x9A\x98+\x98\xD6\xD3ɴ\xE612P\xEDJ\xA8\xE6`\{"\x8F\x9A\x8E\xE0Z\x86\x99\xDEl\xDC\xE9\xB8\xFE\x8A\xE3\x9C\xF3&C\x9C\x8D\xA9E5g\xBA\xE77\xC7\xD4L<\xA5\xE5pmI\xF1"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&h)\x82\xAA\xD1+\xE1\xA5̅\x9C\x81V\x9C\xF9,Kn"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\xD0i\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ӣ>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<h\xE1rd\xBB\xF1\x94I\xB4\x97fZ"\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&\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>?:\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&f\xA6\xC6FG\xC4$\x8A\xEBڊ\xCBH\xC5y\x91qe\xB4%>\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<\xDB
+\xB8\xD78j\xF6]\x87\x83K\xEC+\x88g\xC5R\xE9oj\x80\xB9\xC1\xDFX'\x91\x86\x86\x86\x8DC\x91\xC8np=\xD2\\xD7<\xD1|\xAE\xF9|s\xB8\xF9B\xC3d\x83ְ
+\xB8p\xA0yH\xF4J\xB8^\xB1\xAA\xBA\xC6\xE7\xAFu\xC9\xD0@w{]\x8D@\xFF
+
+"\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<\xF5.Q\xEF
+\xF5>I\x9D7(<E\xE13>+O\xA3\x90\xEBt\xD7\xE7\xF0\xF3wP\xBD\x88\x9Fg\xB0ݤ\x9E/\xF5|        ۳ؾ\x8C\xED9l\x8B\xD4\xF3<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"\xDB/\xF0V\xBFD\x9E\xF7@\x8E\x82\xFC>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"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@<-@\xBC\xAD@\xAA\x8E\xE0\x81m@jځ\xF8:\x80\xF8;\x81\xD4RR߅g\xF1\x88n<\xA1Hc/\x90\xA6> \xCDǀ\xEC9d\xEF         \xFB\xEE\xB2\xFF~ \xA2\x9Cr\x80j\xF2\xC8.\xD2\xEA|\x90\xE0]N1uB\xFD\xC8\xEBr\xE44\x906"\xF0
+\x8E!"x\x8E"\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>\x8A\xFDu\xFBfu
+\xFB}\xEA4\xF6{ՙʸ_\xBDX\x98k\x8A\:\xDB\x89Ƃ\xDEX?g\xC8@v;QK\xBD~o-8d\xF7p\xA1GY\x9D\xBD[(&\xEA\xBA_\xBF\xAC_\x89̾\xF7Jg-"\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+&*\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>\x8C        >\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ޣ"[\xE5\x885\\xF42K\x8Bz)U"\xAAs)\xA1bHV\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"n\xAFaۏ\x97t_\xF5ܵMb\xEF]/\xEF-\xDA{\xD7\xEA\x9AR\xDC\xDA\xEB\x93\xF0\xDEm\xEC&\xFEp;).ϐ\xC0cɌ\x90\xA8D3(\xEF\xC7\xFAi8\x82\xEC~(\xA1\xC1\xBA`\xDD)"\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"\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<i\xAAA1+\xCC\xDD\xD0 \xFAS\xFAg\xCE\xDE\xB6\xC1w1ڳ\xD6s\x85tnt\xF6MC\xA4\xADs3p]\x90\xEF\xB33\xDAe\x9FEFn\x9E\x86\xD0*\xC0\xAD\xB4\xD8B6P\x8C\xF8<葧1\xBE{~`(\xB6\xCF\xC5EI\xFFr:8\xB19C=.+\x8E\xA4>,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֦\xE4X\x9D\x80<\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<\xBE
+CPЏ\x85\xBE\x82\x8DýN\x87\xBB\xE6#\x819\xE4N\xB7>\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\xCBn\xF7\xD8\xD7\xF9\xD6ہ\x97\xB1\xBD\xB7\xD9>bi\xC9\xF6\xA1\x84v\xF451\xC8\xE4\xEE\x96 \xC7\xC0Ɓ&\x9C\x81\xD6\xDB\xC2[\xC2W\xE1E\x90\xBE\x86.v\x90\x97\xD0\xC5\xF2ut\xB1\x83\xBC\xCC]\x8Cn\x95<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>\x89\x98r<}+Z\x88Ԗ\x82D}\x84\x843O\xA4J\xFF\xF2\x9F\xC4t\xC1\xF3P`&\x84\xCFc?\xBE\xD6v\xE4N\xDF-B\xB6Jm\x9AI\xAD̟\xB1-Qz0k\xA4\x9C,\x8A\xB8ǝz>\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->us\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>>NC\xF0z\xE0\x8F0\xE3\xD8Ja>?\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"\xBF\xC1\xF6[l\xBF\xC3\xE6\xC3\xFFf\xC9>\xFE\x97\xA89\xC3\xDE_\xF8\xDBC\x87\xADQ\x94\xDE`\}\xEE\xB2n\x83\xBD\xB4\x8B\x89>\xEA,L\xA7
+\xFA\xA9\xC0\xBF\x82\xFE{X\xEC\xACş(l\xFEIiN\x99&7\xF5?\xC0b\xED,\xC7\\x895\xF1K\xC2\xFF\x81\x87!\x81\xC9\xC6\xD0C\xA11L$&\xB8^\xA8\x88I0\xDE\xFF\xA8\xF0n\xAC\xF4\x81\xED\xBC\xA8\xE9Q\xA5a\xFE\xC4\xE0\xE7\xD5g\xCFʍ"\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<\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->param("${dep_field}_action")) {
</span><span class="cx"> $set_all_fields{$dep_field}->{$dep_action} =
</span><del>- [split(/\s,/, $cgi->param($dep_field))];
</del><ins>+ [split(/[\s,]+/, $cgi->param($dep_field))];
</ins><span class="cx"> }
</span><span class="cx"> else {
</span><span class="cx"> $set_all_fields{$dep_field}->{set} = $cgi->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->cgi;
</span><span class="cx"> my $dbh = Bugzilla->dbh;
</span><span class="lines">@@ -51,6 +52,8 @@
</span><span class="cx">
</span><span class="cx"> if ($cgi->param('nukedefaultquery')) {
</span><span class="cx"> if ($userid) {
</span><ins>+ my $token = $cgi->param('token');
+ check_hash_token($token, ['nukedefaultquery']);
</ins><span class="cx"> $dbh->do("DELETE FROM namedqueries" .
</span><span class="cx"> " WHERE userid = ? AND name = ?",
</span><span class="cx"> undef, ($userid, DEFAULT_QUERY_NAME));
</span><span class="lines">@@ -245,13 +248,6 @@
</span><span class="cx"> $vars->{'category'} = Bugzilla::Chart::getVisibleSeries();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-if ($cgi->param('format') && $cgi->param('format') =~ /^report-(table|graph)$/) {
- # Get legal custom fields for tabular and graphical reports.
- my @custom_fields_for_reports =
- grep { $_->type == FIELD_TYPE_SINGLE_SELECT } Bugzilla->active_custom_fields;
- $vars->{'custom_fields'} = \@custom_fields_for_reports;
-}
-
</del><span class="cx"> $vars->{'known_name'} = $cgi->param('known_name');
</span><span class="cx"> $vars->{'columnlist'} = $cgi->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 <= 2000 || ThrowUserError("chart_too_large");
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+my $formatparam = $cgi->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->param('format') && $cgi->param('format') eq "table") {
</del><ins>+if ($formatparam eq "table") {
</ins><span class="cx"> if ($col_field && !$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->{'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 && $cgi->param('format') eq "bar") {
</del><ins>+if ($width && $formatparam eq "bar") {
</ins><span class="cx"> my $min_width = (scalar(@col_names) || 1) * 20;
</span><span class="cx">
</span><span class="cx"> if (!$cgi->param('cumulate')) {
</span><span class="lines">@@ -232,8 +234,6 @@
</span><span class="cx"> $vars->{'debug'} = 1;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-my $formatparam = $cgi->param('format');
-
</del><span class="cx"> if ($action eq "wrap") {
</span><span class="cx"> # So which template are we using? If action is "wrap", 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"> # "plot".
</span><span class="cx"> $formatparam =~ s/[^a-zA-Z\-]//g;
</span><del>- trick_taint($formatparam);
</del><span class="cx"> $vars->{'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->check($field_name)
</span><span class="lines">@@ -320,7 +323,7 @@
</span><span class="cx"> foreach my $value (@{$field->legal_values}) {
</span><span class="cx"> push(@sorted, $value->name) if $names->{$value->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' && $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->cgi;
</span><span class="cx">
</span><del>- return join('&', map {"$field=$_"} $cgi->param($field));
</del><ins>+ return join('&amp;', map {url_quote($field) . '=' . url_quote($_)} $cgi->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->get_format("bug/show", scalar $cgi->param('format'),
- scalar $cgi->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 => $filename,
</span><span class="cx"> error => $! });
</span><span class="cx">
</span><del>-my $urlbase = Bugzilla->params->{'urlbase'};
</del><ins>+my $urlbase = correct_urlbase();
</ins><span class="cx">
</span><span class="cx"> print $fh "digraph G {";
</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 == "GET" AND cgi.query_string %]
</span><span class="cx"> [% connector = "&" %]
</span><span class="cx"> [% END %]
</span><del>- [% script_name = login_target _ connector _ "GoAheadAndLogIn=1" %]
- <a id="login_link[% qs_suffix %]" href="[% script_name FILTER html %]"
</del><ins>+ [% script_url = login_target _ connector _ "GoAheadAndLogIn=1" %]
+ <a id="login_link[% qs_suffix %]" href="[% script_url FILTER html %]"
</ins><span class="cx"> onclick="return show_mini_login_form('[% qs_suffix %]')">Log In</a>
</span><span class="cx">
</span><span class="cx"> [% Hook.process('additional_methods') %]
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx"> </li>
</span><span class="cx"> <li id="forgot_container[% qs_suffix %]">
</span><span class="cx"> <span class="separator">| </span>
</span><del>- <a id="forgot_link[% qs_suffix %]" href="[% script_name FILTER html %]#forgot"
</del><ins>+ <a id="forgot_link[% qs_suffix %]" href="[% script_url FILTER html %]#forgot"
</ins><span class="cx"> onclick="return show_forgot_form('[% qs_suffix %]')">Forgot Password</a>
</span><span class="cx"> <form action="token.cgi" method="post" id="forgot_form[% qs_suffix %]"
</span><span class="cx"> class="mini_forgot bz_default_hidden">
</span><span class="lines">@@ -123,6 +123,7 @@
</span><span class="cx"> <input id="forgot_button[% qs_suffix %]" value="Reset Password"
</span><span class="cx"> type="submit">
</span><span class="cx"> <input type="hidden" name="a" value="reqpw">
</span><ins>+ <input type="hidden" id="token[% qs_suffix FILTER html %]" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]">
</ins><span class="cx"> <a href="#" onclick="return hide_forgot_form('[% qs_suffix %]')">[x]</a>
</span><span class="cx"> </form>
</span><span class="cx"> </li>
</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.<br>
</span><span class="cx"> <input size="35" name="loginname">
</span><ins>+ <input type="hidden" id="token" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]">
</ins><span class="cx"> <input type="submit" id="request" value="Reset Password">
</span><span class="cx"> </form>
</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"> <form id="flagtype_properties" method="post" action="editflagtypes.cgi">
</span><span class="cx"> <input type="hidden" name="action" value="[% action FILTER html %]">
</span><span class="cx"> <input type="hidden" name="can_fully_edit" value="[% can_fully_edit FILTER html %]">
</span><del>- <input type="hidden" name="id" value="[% type.id %]">
</del><ins>+ <input type="hidden" name="id" value="[% type.id FILTER html %]">
</ins><span class="cx"> <input type="hidden" name="token" value="[% token FILTER html %]">
</span><span class="cx"> <input type="hidden" name="target_type" value="[% type.target_type FILTER html %]">
</span><span class="cx"> <input type="hidden" name="check_clusions" value="[% check_clusions FILTER none %]">
</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.<br>
</span><del>- <input type="text" name="sortkey" value="[% type.sortkey || 1 %]" size="5" maxlength="5"
- [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
</del><ins>+ <input type="text" name="sortkey" value="[% type.sortkey || 1 FILTER html %]" size="5"
+ maxlength="5" [% ' disabled="disabled"' UNLESS can_fully_edit %]>
</ins><span class="cx"> </td>
</span><span class="cx"> </tr>
</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"> <div class="contribute"><strong>Note:</strong>
</span><del>- [%+ terms.Bugzilla %] is developed entirely by volunteers. The
- best way to give back to the [% terms.Bugzilla %] project is
- to <a href="http://www.bugzilla.org/contribute/">contribute</a>
- 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
+ <a href="http://www.bugzilla.org/contribute/">contribute</a>
+ yourself!
+ You don't have to be a programmer to contribute, there are lots of
+ things that we need.
</ins><span class="cx"> </div>
</span><span class="cx">
</span><span class="cx"> <p>
</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 = "oldest_to_newest" %]
</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 == "oldest_to_newest" %]
- [% count = 0 %]
- [% description = 0 %]
- [% increment = 1 %]
-[% ELSE %]
- [% increment = -1 %]
- [% IF sort_order == "newest_to_oldest" %]
- [% count = comments.size - 1 %]
- [% description = 0 %]
- [% ELSIF sort_order == "newest_to_oldest_desc_first" %]
- [% count = comments.size %]
- [% description = comments.size %]
- [% END %]
-[% END %]
-
</del><span class="cx"> <!-- This auto-sizes the comments and positions the collapse/expand links
</span><span class="cx"> to the right. -->
</span><span class="cx"> <table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr>
</span><span class="cx"> <td>
</span><span class="cx">
</span><span class="cx"> [% FOREACH comment = comments %]
</span><del>- [% IF count >= start_at %]
</del><ins>+ [% IF comment.count >= 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 == "before_comments" && 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>- <div id="c[% count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
- [% " bz_comment_hilite" IF marks.$count %]
- [% " bz_first_comment" IF count == description %]">
- [% IF count == description %]
</del><ins>+ <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
+ [% " bz_comment_hilite" IF marks.${comment.count} %]
+ [% " bz_first_comment" IF comment.count == 0 %]">
+ [% IF comment.count == 0 %]
</ins><span class="cx"> [% class_name = "bz_first_comment_head" %]
</span><span class="cx"> [% comment_label = "Description" %]
</span><span class="cx"> [% ELSE %]
</span><span class="cx"> [% class_name = "bz_comment_head" %]
</span><del>- [% comment_label = "Comment " _ count %]
</del><ins>+ [% comment_label = "Comment " _ comment.count %]
</ins><span class="cx"> [% END %]
</span><span class="cx">
</span><span class="cx"> <div class="[% class_name FILTER html %]">
</span><span class="lines">@@ -121,8 +102,8 @@
</span><span class="cx"> [% IF mode == "edit" %]
</span><span class="cx"> <span class="bz_comment_actions">
</span><span class="cx"> <script type="text/javascript"><!--
</span><del>- addReplyLink([% count %], [% comment.id %]);
- addCollapseLink([% count %], 'Toggle comment display'); // -->
</del><ins>+ addReplyLink([% comment.count %], [% comment.id %]);
+ addCollapseLink([% comment.count %], 'Toggle comment display'); // -->
</ins><span class="cx"> </script>
</span><span class="cx"> </span>
</span><span class="cx"> [% END %]
</span><span class="lines">@@ -134,7 +115,7 @@
</span><span class="cx"> <input type="checkbox"
</span><span class="cx"> name="isprivate_[% comment.id %]" value="1"
</span><span class="cx"> id="isprivate_[% comment.id %]"
</span><del>- onClick="updateCommentPrivacy(this, [% count %])"
</del><ins>+ onClick="updateCommentPrivacy(this, [% comment.count %])"
</ins><span class="cx"> [% " checked=\"checked\"" IF comment.is_private %]>
</span><span class="cx"> <label for="isprivate_[% comment.id %]">Private</label>
</span><span class="cx"> </div>
</span><span class="lines">@@ -142,7 +123,7 @@
</span><span class="cx">
</span><span class="cx"> <span class="bz_comment_number">
</span><span class="cx"> <a
</span><del>- href="show_bug.cgi?id=[% bug.bug_id %]#c[% count %]">
</del><ins>+ href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]">
</ins><span class="cx"> [%- comment_label FILTER html %]</a>
</span><span class="cx"> </span>
</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"> <pre class="bz_comment_text"
</span><del>- [% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]>
</del><ins>+ [% ' id="comment_text_' _ comment.count _ '"' IF mode == "edit" %]>
</ins><span class="cx"> [%- comment_text FILTER quoteUrls(bug, comment) -%]
</span><span class="cx"> </pre>
</span><span class="cx"> </div>
</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"> </tr>
</span><del>- [% IF !Param('defaultplatform') || !Param('defaultopsys') %]
</del><ins>+ [% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %]
</ins><span class="cx"> <tr>
</span><span class="cx"> <th colspan="3">&nbsp;</th>
</span><span class="cx"> <td id="os_guess_note" class="comment">
</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"> </h3>
</span><span class="cx"> [% IF ids.size %]
</span><del>- ([% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
- <a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
- [% IF user.in_group('editbugs') && ids.size > 1 %]
- | <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
- [% END %])
</del><ins>+ [%# 27 chars is the length of buglist.cgi?tweak=&bug_id=" %]
+ [% use_post = (ids.join(",").length > constants.CGI_URI_LIMIT - 27 ) ? 1 : 0 %]
+ [% IF use_post %]
+ <form action="buglist.cgi" method="post">
+ <input type="hidden" name="bug_id" value="[% ids.join(",") %]">
+ [% END %]
+
+ [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
+ [% IF use_post %]
+ <button>view as [% terms.bug %] list</button>
+ [% IF user.in_group('editbugs') && ids.size > 1 %]
+ | <button type="submit" name="tweak" value="1">change several</button>
+ [% END %]
+ </form>
+ [% ELSE %]
+ <a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
+ [% IF user.in_group('editbugs') && ids.size > 1 %]
+ | <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
+ [% END %]
+ [% END %]
+
</ins><span class="cx"> <ul class="tree">
</span><span class="cx"> [% INCLUDE display_tree tree=$tree_name %]
</span><span class="cx"> </ul>
</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>- <script type="text/javascript">
- <!--
-
</del><ins>+<script type="text/javascript">
+<!--
</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 %]
+//-->
+</script>
</ins><span class="cx">
</span><del>- //-->
- </script>
-
</del><span class="cx"> <form name="changeform" id="changeform" method="post" action="process_bug.cgi">
</span><span class="cx">
</span><span class="cx"> <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
</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 == "product"
+ && visibility_value.id != product.id
+ && !user.can_enter_product(visibility_value) %]
+ [% NEXT IF field.name == "component" && 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 -%]'[% "," UNLESS loop.last %]
- [%- END %]
</del><ins>+ [%~ FOREACH vis_name = vis_names ~%]
+ '[% vis_name FILTER js %]'[% "," 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 =>
</span><span class="cx"> "You can add keywords from a defined list to $terms.bugs, in order"
</span><del>- _ " to tag and group them.",
</del><ins>+ _ " to easily identify and group them.",
</ins><span class="cx">
</span><span class="cx"> longdesc =>
</span><span class="cx"> "$terms.Bugs have comments added to them by $terms.Bugzilla users."
</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 "FILTER none" 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"> <div>
</span><span class="cx"> [% IF comment.count %]
</span><del>- <b>[% "Comment # ${comment.count}" FILTER bug_link( bug,
- {comment_num => comment.count, full_url => 1}) FILTER none %]
</del><ins>+ <b>[% "Comment # ${comment.count}" FILTER bug_link(bug,
+ {comment_num => comment.count, full_url => 1, user => to_user}) FILTER none %]
+ on [% "$terms.bug $bug.id" FILTER bug_link(bug, { full_url => 1, user => to_user }) FILTER none %]
</ins><span class="cx"> from [% INCLUDE global/user.html.tmpl who = comment.author %]</b>
</span><span class="cx"> [% END %]
</span><del>- <pre>[% comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment) %]</pre>
</del><ins>+ <pre>[% comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment, to_user) %]</pre>
</ins><span class="cx"> </div>
</span><span class="cx"> [% END %]
</span><span class="cx"> </p>
</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>- [% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, full_url => 1) FILTER none %] depends
- on [% "${terms.bug} ${change.blocker.id}"
- FILTER bug_link(change.blocker, full_url => 1) FILTER none %],
</del><ins>+ [% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %]
+ depends on
+ [%+ "${terms.bug} ${change.blocker.id}"
+ FILTER bug_link(change.blocker, {full_url => 1, user => 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 [% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, full_url => 1) FILTER none %]
</del><ins>+ [% INCLUDE global/user.html.tmpl who = change.who %] changed
+ [%+ "${terms.bug} ${bug.id}" FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %]
</ins><span class="cx"> [% END %]
</span><span class="cx"> <br>
</span><span class="cx"> [% IF in_table == 0 %]
</span><span class="lines">@@ -98,7 +100,7 @@
</span><span class="cx"> <th>[% field_label FILTER html %]</th>
</span><span class="cx"> <td>
</span><span class="cx"> [% IF change.field_name == "bug_id" %]
</span><del>- [% new_value FILTER bug_link(bug, full_url => 1) FILTER none %]
</del><ins>+ [% new_value FILTER bug_link(bug, {full_url => 1, user => 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' => [
</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' => [
</span><span class="lines">@@ -213,7 +211,6 @@
</span><span class="cx">
</span><span class="cx"> 'global/confirm-user-match.html.tmpl' => [
</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' => [
</span><span class="lines">@@ -222,6 +219,7 @@
</span><span class="cx">
</span><span class="cx"> 'bug/comments.html.tmpl' => [
</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' => [
</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 == "mismatched_bug_ids_on_obsolete" %]
</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 == "token_generation_error" %]
</span><span class="cx"> Something is seriously wrong with the token generation system.
</span><span class="cx">
</span><ins>+ [% ELSIF error == "cancel_token_does_not_exist" %]
+ The token to be cancelled does not exist.
+
</ins><span class="cx"> [% ELSIF error == "template_error" %]
</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 == "invalid_post_bug_submit_action" %]
</span><span class="cx"> Invalid setting for post_bug_submit_action
</span><span class="cx">
</span><ins>+ [% ELSIF error == "search_field_operator_unsupported" %]
+ [% terms.Bugzilla %] does not support the search type
+ "[% operator FILTER html %]".
+
</ins><span class="cx"> [% ELSE %]
</span><span class="cx"> [%# Try to find hooked error messages %]
</span><span class="cx"> [% error_message = Hook.process("errors") %]
</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"> <b>[% query.value.users.0.identity FILTER html %]</b>
</span><del>- <input type="hidden" name="[% field.key FILTER html %]"
- value="[% query.value.users.0.login FILTER html %]">
</del><span class="cx"> [% END %]
</span><span class="cx"> [% ELSE %]
</span><span class="cx"> [% IF (query.key.length < 3) && !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 "global/hidden-fields.html.tmpl" 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("^requestee") %]
</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"> "setting" => "Setting",
</span><span class="cx"> "settings" => "Settings",
</span><span class="cx"> "short_desc" => "Summary",
</span><ins>+ "short_short_desc" => "Summary",
</ins><span class="cx"> "status_whiteboard" => "Whiteboard",
</span><span class="cx"> "tag.name" => "Tags",
</span><span class="cx"> "target_milestone" => "Target Milestone",
</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"> <body onload="[% onload %]"
</span><del>- class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') %]
</del><ins>+ class="[% 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">
</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 = "Missing Search" %]
</span><span class="cx"> [% docslinks = {'query.html' => "Searching for $terms.bugs",
</span><span class="cx"> 'query.html#list' => "$terms.Bug lists"} %]
</span><del>- The search named <em>[% queryname FILTER html %]</em>
</del><ins>+ The search named <em>[% name FILTER html %]</em>
</ins><span class="cx"> [% IF sharer_id && 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 == "password_not_complex" %]
</span><del>- [% title = "Password Fails Requirements" %]
- [% passregex = Param('password_complexity') %]
- The password must contain at least one:
- <ul>
- [% IF passregex.search('letters') %]
- <li>UPPERCASE letter</li>
- <li>lowercase letter</li>
- [% END %]
- [% IF passregex.search('numbers') %]
- <li>digit</li>
- [% END %]
- [% IF passregex.search('specialchars') %]
- <li>special character</li>
- [% END %]
- </ul>
</del><ins>+ [% title = "Password Fails Requirements" %]
+ [% passregex = Param('password_complexity') %]
+ The password must contain at least one:
+ <ul>
+ [% IF passregex == 'letters_numbers_specialchars' %]
+ <li>letter</li>
+ <li>special character</li>
+ [% ELSIF passregex.search('letters') %]
+ <li>UPPERCASE letter</li>
+ <li>lowercase letter</li>
+ [% END %]
+ [% IF passregex.search('numbers') %]
+ <li>digit</li>
+ [% END %]
+ </ul>
</ins><span class="cx">
</span><span class="cx"> [% ELSIF error == "product_access_denied" %]
</span><span class="cx"> [% title = "Product Access Denied" %]
</span><span class="lines">@@ -1639,6 +1639,11 @@
</span><span class="cx"> [% title = "Unknown Tab" %]
</span><span class="cx"> <code>[% current_tab_name FILTER html %]</code> is not a legal tab name.
</span><span class="cx">
</span><ins>+ [% ELSIF error == "value_inactive" %]
+ [% title = "Value is Not Active" %]
+ [% 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 == "version_already_exists" %]
</span><span class="cx"> [% title = "Version Already Exists" %]
</span><span class="cx"> [% admindocslinks = {'versions.html' => '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 <a href="query.cgi?[% q.url FILTER uri %]">edit</a>
</del><ins>+ or <a href="query.cgi?[% q.url FILTER html %]">edit</a>
</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"> <h1 style="margin-top: 20%; text-align: center;">Please stand by ...</h1>
</span><span class="cx">
</span><span class="cx"> [% IF debug %]
</span><del>- <p>
- [% FOREACH debugline = debugdata %]
- <code>[% debugline FILTER html %]</code><br>
- [% END %]
- </p>
- <p>
- <code>[% query FILTER html %]</code>
- </p>
</del><ins>+ <p>[% query FILTER html %]</p>
+ [% IF query_explain.defined %]
+ <pre>[% query_explain FILTER html %]</pre>
+ [% END %]
</ins><span class="cx"> [% END %]
</span><del>-
</del><span class="cx"> </body>
</span><span class="cx"> </html>
</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;query_based_on=
</span><span class="cx"> [% defaultsavename OR searchname FILTER uri %]">
</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"> </a>
</span><span class="cx"> </th>
</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"> <h2 id="v42_point">Updates in this 4.2.x Release</h2>
</span><span class="cx">
</span><ins>+<h3>4.2.7</h3>
+
+<p>This release fixes several security issues. See the
+ <a href="http://www.bugzilla.org/security/4.0.10/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following [% terms.bugs %] have been fixed in this release:</p>
+
+<ul>
+ <li>Internet Explorer 11 and KHTML-based browsers such as Konqueror can now
+ display buglists correctly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=902515">[% terms.Bug %] 902515</a> and
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=914262">[% terms.bug %] 914262</a>)</li>
+ <li>When the <kbd>password_complexity</kbd> 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.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=897264">[% terms.Bug %] 897264</a>)</li>
+ <li>With DB servers doing case-insensitive comparisons, such as MySQL, tokens
+ and login cookies were not correctly validated as the case was ignored.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=906745">[% terms.Bug %] 906745</a> and
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=907438">[% terms.bug %] 907438</a>)</li>
+ <li>All security headers (such as X-Frame-Options) are now returned when using XML-RPC.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=787328">[% terms.Bug %] 787328</a>)</li>
+ <li>Oracle crashed when reporting a new [% terms.bug %] if a custom free-text field
+ was non-mandatory and left empty.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=919475">[% terms.Bug %] 919475</a>)</li>
+ <li>It was not possible to import [% terms.bugs %] using <kbd>importxml.pl</kbd> with Oracle.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=848063">[% terms.Bug %] 848063</a>)</li>
+</ul>
+
+<h3>4.2.6</h3>
+
+<p>The following important fixes/changes have been made in this release:</p>
+
+<ul>
+ <li>MySQL 5.6 is now supported.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=852560">[% terms.Bug %] 852560</a>)</li>
+ <li>A regression introduced in [% terms.Bugzilla %] 4.2.4 made Oracle crash
+ when installing [% terms.Bugzilla %] for the first time.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=858911">[% terms.Bug %] 858911</a>)</li>
+ <li>If a custom field depends on a product, component or classification,
+ the "mandatory" bit was ignored on [% terms.bug %] creation.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=782210">[% terms.Bug %] 782210</a>)</li>
+ <li>Queries involving flags were broken in several ways. These queries
+ have been fixed.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=828344">[% terms.Bug %] 828344</a>)</li>
+ <li>Tabular reports involving the empty resolution did not link [% terms.bug %]
+ counts correctly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=212471">[% terms.Bug %] 212471</a>)</li>
+ <li>The <kbd>B[%%]ug.search</kbd> WebService method was returning all visible
+ [%+ terms.bugs %] when called with no arguments, ignoring the
+ <kbd>max_search_results</kbd> and <kbd>search_allow_no_criteria</kbd> parameters.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=859118">[% terms.Bug %] 859118</a>)</li>
+</ul>
+
+<h3>4.2.5</h3>
+
+<p>This release fixes one security issue. See the
+ <a href="http://www.bugzilla.org/security/3.6.12/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in this
+ release:</p>
+
+<ul>
+ <li>Queries involving commenters were slow to return results. These queries
+ have been optimized for better performance.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=818007">[% terms.Bug %] 818007</a>)</li>
+ <li>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 %] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=752946">752946</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=840824">840824</a>)</li>
+ <li>It was possible to create a new [% terms.bug %] with no description
+ despite the status workflow required one for new [% terms.bugs %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=818890">[% terms.Bug %] 818890</a>)</li>
+ <li>Custom multi-select fields are now available in the "Search By Change
+ History" section of the "Advanced Search" page.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=839950">[% terms.Bug %] 839950</a>)</li>
+ <li>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.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=806809">[% terms.Bug %] 806809</a>)</li>
+ <li>Warnings thrown by Return::Value 1.666002 about this deprecated module
+ and which are polluting the web server error log are now disabled.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=826678">[% terms.Bug %] 826678</a>)</li>
+</ul>
+
+<h3>4.2.4</h3>
+
+<p>This release fixes several security issues. See the
+ <a href="http://www.bugzilla.org/security/3.6.11/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in this
+ release:</p>
+
+<ul>
+ <li>Queries involving group substitution were crashing when the "usevisibilitygroups"
+ parameter was enabled. Also, CVE-2011-2979 was not fully fixed in
+ [%+ terms.Bugzilla %] 4.1.3.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=788098">[% terms.Bug %] 788098</a>)</li>
+ <li>Flag names were not properly escaped when displayed on the "confirm user
+ match" page. An admin could unintentionally break the display of this page
+ if a flag name contains a &lt; or &gt; character, because these characters
+ were not filtered.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=790215">[% terms.Bug %] 790215</a>)</li>
+ <li>We now prevent private WebServices methods from being called by external
+ applications.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=793826">[% terms.Bug %] 793826</a>)</li>
+ <li>PostgreSQL 9.2 requires DBD::Pg 2.19.3.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=799721">[% terms.Bug %] 799721</a>)</li>
+ <li>Oracle was crashing when listing keywords or flags in buglists.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=780053">[% terms.Bug %] 780053</a>)</li>
+ <li>Oracle was crashing when typing several bare words in the QuickSearch field.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=804505">[% terms.Bug %] 804505</a>)</li>
+ <li>[% terms.Bugs %] with the resolution MOVED couldn't be edited anymore.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=757935">[% terms.Bug %] 757935</a>)</li>
+ <li>Editing dependencies from the "Change Several [% terms.Bugs %] at Once"
+ page didn't work as expected. [% terms.Bug %] IDs were incorrectly parsed.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=790909">[% terms.Bug %] 790909</a>)</li>
+ <li>The "Actual Hours" axis now works correctly in tabular and graphical reports.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=794389">[% terms.Bug %] 794389</a>)</li>
+ <li><kbd>checksetup.pl</kbd> was failing to run if the Voting extension was
+ enabled on a fresh installation and some mandatory modules were missing.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652047">[% terms.Bug %] 652047</a>)</li>
+ <li>[% terms.Bugzilla %] no longer crashes when viewing [% terms.abug %] while
+ a custom field is being added.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=531243">[% terms.Bug %] 531243</a>)</li>
+ <li>For improved security, we now send the "X-Content-Type-Options:&nbsp;nosniff"
+ and "X-XSS-Protection:&nbsp;block" headers with every response.
+ ([% terms.Bugs %] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=671612">671612</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=680771">680771</a>)</li>
+</ul>
+
+<h3>4.2.3</h3>
+
+<p>This release fixes two security issues. See the
+ <a href="http://www.bugzilla.org/security/3.6.10/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in this
+ release:</p>
+
+<ul>
+ <li>Attaching a file to [% terms.abug %] was broken due to a change in
+ Perl 5.16.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=771100">[% terms.Bug %] 771100</a>)</li>
+ <li>A regression in [% terms.Bugzilla %] 4.2.2 made Oracle crash when
+ displaying a buglist.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=780028">[% terms.Bug %] 780028</a>)</li>
+ <li>It was possible to search on history for comments and attachments you
+ cannot see (though these private comments and attachments are never disclosed).
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=779709">[% terms.Bug %] 779709</a>)</li>
+ <li>PostgreSQL databases could be created with the wrong encoding despite
+ the utf8 parameter being enabled.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=783786">[% terms.Bug %] 783786</a>)</li>
+ <li>Scheduled whines could be sent at the wrong time on Oracle.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=559539">[% terms.Bug %] 559539</a>)</li>
+ <li>Tokens are no longer included in saved queries.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=772953">[% terms.Bug %] 772953</a>)</li>
+ <li>An admin could unintentionally break the display of buglists if a custom
+ field description contains a &lt; or &gt; character, because these characters
+ were not filtered.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=785917">[% terms.Bug %] 785917</a>)</li>
+ <li>Adding or removing a DB column in Oracle didn't handle SERIAL columns
+ correctly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=731156">[% terms.Bug %] 731156</a>)</li>
+ <li>A minor CSRF vulnerability in token.cgi allowed possible unauthorized
+ password reset e-mail requests.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=706271">[% terms.Bug %] 706271</a>)</li>
+</ul>
+
+<h3>4.2.2</h3>
+
+<p>This release fixes two security issues. See the
+ <a href="http://www.bugzilla.org/security/3.6.9/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in this
+ release:</p>
+
+<ul>
+ <li>A regression introduced in [% terms.Bugzilla %] 4.0 caused some login
+ names to be ignored when entered in the CC list of [% terms.bugs %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=756314">[% terms.Bug %] 756314</a>)</li>
+ <li>Some queries could trigger an invalid SQL query if strings entered by
+ the user contained leading or trailing whitespaces.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=760075">[% terms.Bug %] 760075</a>)</li>
+ <li>The auto-completion form for keywords no longer automatically selects
+ the first keyword in the list when the field is empty.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=764517">[% terms.Bug %] 764517</a>)</li>
+ <li>A regression in [% terms.Bugzilla %] 4.2 prevented classifications
+ from being used in graphical and tabular reports in the "Multiple Tables"
+ field.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=753688">[% terms.Bug %] 753688</a>)</li>
+ <li>Attachments created by the <kbd>email_in.pl</kbd> script were associated
+ to the wrong comment.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=762785">[% terms.Bug %] 762785</a>)</li>
+ <li>Very long dependency lists can now be viewed correctly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=762783">[% terms.Bug %] 762783</a>)</li>
+ <li>Keywords are now correctly escaped in the auto-completion form to prevent
+ any XSS abuse.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754561">[% terms.Bug %] 754561</a>)</li>
+ <li>A regression introduced in [% terms.Bugzilla %] 4.0rc2 when fixing
+ CVE-2011-0046 caused the "Un-forget the search" link to not work correctly
+ anymore when restoring a deleted saved search, because this link was
+ lacking a valid token.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=768870">[% terms.Bug %] 768870</a>)</li>
+ <li>Two minor CSRF vulnerabilities have been fixed which could let an attacker
+ alter your default search criteria in the Advanced Search page.
+ ([% terms.Bugs %] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754672">754672</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754673">754673</a>)</li>
+</ul>
+
</ins><span class="cx"> <h3>4.2.1</h3>
</span><span class="cx">
</span><span class="cx"> <p>This release fixes two security issues. See the
</span><span class="lines">@@ -390,6 +605,9 @@
</span><span class="cx"> [%- terms.Bug %] 584742</a>: 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.</li>
</span><ins>+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=780053">
+ [%- terms.Bug %] 780053</a>: Oracle crashes when listing keywords, tags
+ or flags in buglists.</li>
</ins><span class="cx"> </ul>
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -530,8 +748,8 @@
</span><span class="cx"> (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=640719">[% terms.Bug %] 640719</a>)</li>
</span><span class="cx"> <li>Email notifications about dependencies and flags had the wrong
</span><span class="cx"> timestamp.
</span><del>- (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=643910">[% terms.Bug %] 643910</a>
- and (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652165">[% terms.Bug %] 652165</a>)</li>
</del><ins>+ ([% terms.Bugs %] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=643910">643910</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652165">652165</a>)</li>
</ins><span class="cx"> <li>You can now select "UTC" as a valid timezone in General Preferences.
</span><span class="cx"> (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=646209">[% terms.Bug %] 646209</a>)</li>
</span><span class="cx"> <li>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"> <script type="text/javascript">
</span><ins>+function bz_encode (str, decode) {
+ // First decode HTML entities, if requested.
+ if (decode)
+ str = str.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"')
+ .replace(/&nbsp;/g, " ").replace(/&amp;/g, "&").replace(/\s+$/,"");
+
+ // encodeURIComponent() doesn't escape single quotes.
+ return encodeURIComponent(str).replace(/'/g, escape);
+};
+
</ins><span class="cx"> YAHOO.util.Event.addListener(window, "load", 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 = ".";
</span><span class="cx"> else if (oRecord.getData("row_title") == "Total")
</span><del>- elLiner.innerHTML = "<a href='[% urlbase %]&amp;[% col_field FILTER js %]="
- + oColumn.field + "[% '&amp;' _ row_vals IF row_vals %]'>"
- + oData + "</a>";
</del><ins>+ elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% col_field FILTER uri FILTER js %]='
+ + bz_encode(oColumn.field)
+ + '[% "&amp;" _ row_vals IF row_vals %]">' + oData + '</a>';
</ins><span class="cx"> else
</span><del>- elLiner.innerHTML = "<a href='[% urlbase %]&amp;[% row_field FILTER js %]="
- + oRecord.getData("row_title").replace(/\s+$/,"")
- + "&amp;[% col_field FILTER js %]=" + oColumn.field
- + "'>" + oData + "</a>";
</del><ins>+ elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% row_field FILTER uri FILTER js %]='
+ + bz_encode(oRecord.getData("row_title"), 1)
+ + '&amp;[% col_field FILTER uri FILTER js %]='
+ + bz_encode(oColumn.field) + '">' + oData + '</a>';
</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 = ".";
</span><span class="cx"> else if (oRecord.getData("row_title") == "Total")
</span><del>- elLiner.innerHTML = "<a href='[% urlbase %][% '&amp;' _ row_vals IF row_vals %]
- [%~ '&amp;' _ col_vals IF col_vals %]'>"
- + oData + "</a>";
</del><ins>+ elLiner.innerHTML = '<a href="[% urlbase FILTER js %][% "&amp;" _ row_vals IF row_vals %]
+ [%~ "&amp;" _ col_vals IF col_vals %]">'
+ + oData + '</a>';
</ins><span class="cx"> else
</span><del>- elLiner.innerHTML = "<a href='[% urlbase %]&amp;[% row_field FILTER js %]="
- + oRecord.getData("row_title").replace(/\s+$/,"")
- + "[% '&amp;' _ col_vals IF col_vals %]'>" + oData + "</a>";
</del><ins>+ elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% row_field FILTER uri FILTER js %]='
+ + bz_encode(oRecord.getData("row_title"), 1)
+ + '[% "&amp;" _ col_vals IF col_vals %]">' + oData + '</a>';
</ins><span class="cx">
</span><span class="cx"> YAHOO.util.Dom.addClass(elLiner.parentNode, "ttotal");
</span><span class="cx"> };
</span><span class="lines">@@ -102,7 +112,7 @@
</span><span class="cx"> var myColumnDefs = [
</span><span class="cx"> {key:"row_title", label:"", sortable:true, sortOptions: { sortFunction:totalNumberSorter }},
</span><span class="cx"> [% FOREACH col = col_names %]
</span><del>- {key:"[% col FILTER js %]", label:"[% display_value(col_field, col) FILTER js %]", sortable:true,
</del><ins>+ {key:"[% col FILTER js %]", label:"[% display_value(col_field, col) FILTER html FILTER js %]", 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:"total", label:"Total", 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>-<div id="tabular_report_container_[% tbl FILTER js %]">
</del><ins>+<div id="tabular_report_container_[% tbl FILTER html %]">
</ins><span class="cx"> <table id="tabular_report" border="1">
</span><span class="cx"> [% IF col_field %]
</span><span class="cx"> <thead>
</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</a>
</span><span class="cx"> [% ELSE %]
</span><span class="cx"> <a href="query.cgi?[% switchbase %]&amp;chart_format=
</span><del>- [% format %]&amp;format=report-graph&amp;cumulate=[% cumulate %]">
</del><ins>+ [% format FILTER uri %]&amp;format=report-graph&amp;cumulate=[% cumulate %]">
</ins><span class="cx"> Edit this report
</span><span class="cx"> </a>
</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"> [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option>
</span><span class="cx"> [% END %]
</span><span class="cx"> </select>
</span><del>- [% IF feature_enabled('jsonrpc') %]
</del><ins>+ [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') %]
</ins><span class="cx"> <div id="email[% n %]_autocomplete">
</span><span class="cx"> [% END %]
</span><span class="cx"> <input name="email[% n %]" class="email" id="email[% n %]"
</span><span class="cx"> value="[% default.email.$n FILTER html %]">
</span><del>- [% IF feature_enabled('jsonrpc') %]
</del><ins>+ [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') %]
</ins><span class="cx"> <div id="email[% n %]_autocomplete_container"></div>
</span><span class="cx"> </div>
</span><span class="cx"> <script type="text/javascript">
</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"> "Last Changed" => "Last Changed" } %]
</span><span class="cx">
</span><span class="cx"> <input type="hidden" name="cmdtype" value="doit">
</span><ins>+[% IF user.id %]
+ <input type="hidden" name="token" value="[% issue_hash_token(['searchknob']) FILTER html %]">
+[% END %]
</ins><span class="cx">
</span><span class="cx"> <p>
</span><span class="cx"> <label for="order">Sort results by</label>:
</span><span class="lines">@@ -56,7 +59,7 @@
</span><span class="cx"> <input type="submit" id="[% button_name FILTER html %]"
</span><span class="cx"> value="[% button_name FILTER html %]">
</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"> <input type="hidden" name="known_name" value="[% known_name FILTER html %]">
</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"> </p>
</span><span class="cx">
</span><del>-<p>
- &nbsp;&nbsp;&nbsp;
- <input type="checkbox" id="remasdefault"
- name="remtype" value="asdefault">
- <label for="remasdefault">
- and remember these as my default search options
- </label>
-</p>
</del><ins>+[% IF user.id %]
+ <p>
+ &nbsp;&nbsp;&nbsp;
+ <input type="checkbox" id="remasdefault"
+ name="remtype" value="asdefault">
+ <label for="remasdefault">
+ and remember these as my default search options
+ </label>
+ </p>
+[% END %]
</ins><span class="cx">
</span><span class="cx"> [% IF userdefaultquery %]
</span><span class="cx"> <p>
</span><del>- <a href="query.cgi?nukedefaultquery=1">
</del><ins>+ <a href="query.cgi?nukedefaultquery=1&amp;token=
+ [%- issue_hash_token(['nukedefaultquery']) FILTER uri %]">
</ins><span class="cx"> Set my default search back to the system default</a>.
</span><span class="cx"> </p>
</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 = "queryform"
</del><ins>+var queryform = "queryform";
+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"> <p id="search_help">Hover your mouse over each field label to get help for that field.</p>
</span><span class="cx">
</span><del>-<form method="post" action="buglist.cgi" name="queryform" id="queryform">
</del><ins>+<form method="post" action="buglist.cgi" name="queryform" id="queryform"
+ onsubmit="remove_token()">
</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"> [% " selected" IF default.$name.0 == field %]>
</span><span class="cx"> [% field_descs.$field || field FILTER html %]</option>
</span><span class="cx"> [% END %]
</span><del>-
- [%# Single-select fields are also valid column names. %]
- [% FOREACH field = custom_fields %]
- <option value="[% field.name FILTER html %]"
- [% " selected" IF default.$name.0 == field.name %]>
- [% field.description FILTER html %]</option>
- [% END %]
</del><span class="cx"> </select>
</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 => <<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 => <<EOT,
-* *
-* Then you have to do (also as an Administrator): *
-* *
-* ppm repo up theory58S *
-* *
-* Do that last command over and over until you see "theory58S" at the *
-* top of the displayed list. *
-EOT
</del><span class="cx"> template_precompile => "Precompiling templates...",
</span><span class="cx"> template_removal_failed => <<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->selectrow_array('SELECT tokentype FROM tokens
- WHERE token = ?', undef, $token);
- $tokentype || ThrowUserError("token_does_not_exist");
</del><ins>+ my ($db_token, $tokentype) = $dbh->selectrow_array('SELECT token, tokentype FROM tokens
+ WHERE token = ?', undef, $token);
+ (defined $db_token && $db_token eq $token)
+ || ThrowUserError("token_does_not_exist");
</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)) && $tokentype ne 'password' ) {
</span><span class="lines">@@ -108,6 +109,11 @@
</span><span class="cx"> ThrowUserError("password_change_requests_not_allowed");
</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->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 => $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 => (
</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 => { contains => [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' => { contains => [1] },
+ longdesc => { contains => [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-<1>' => {
</span><span class="cx"> ALLWORDS_BROKEN,
</span><span class="cx"> },
</span><ins>+ 'anywords-<1>' => {
+ 'flagtypes.name' => { contains => [1,2,3,4,5] },
+ },
+ 'anywords-<1> <2>' => {
+ 'flagtypes.name' => { contains => [3,4,5] },
+ },
+ 'anywordssubstr-<1> <2>' => {
+ 'flagtypes.name' => { contains => [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 => { contains => [1] },
</span><span class="cx"> },
</span><ins>+ notequals => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ longdesc => { contains => [1] },
+ },
+ notregexp => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ longdesc => { contains => [1] },
+ },
+ notsubstring => {
+ 'flagtypes.name' => { contains => [5] },
+ longdesc => { contains => [1] },
+ },
+ nowords => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ },
+ nowordssubstr => {
+ 'flagtypes.name' => { contains => [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 => {
</span><del>- allwords => {
- cc => { contains => [1] },
</del><ins>+ allwords => {
+ cc => { contains => [1] },
+ 'flagtypes.name' => { contains => [1, 5] },
+ longdesc => { contains => [1] },
</ins><span class="cx"> },
</span><span class="cx"> 'allwords-<1> <2>' => {
</span><span class="cx"> cc => { },
</span><span class="cx"> },
</span><span class="cx"> allwordssubstr => {
</span><del>- cc => { contains => [1] },
</del><ins>+ cc => { contains => [1] },
+ 'flagtypes.name' => { contains => [5, 6] },
+ longdesc => { contains => [1] },
</ins><span class="cx"> },
</span><span class="cx"> 'allwordssubstr-<1>,<2>' => {
</span><del>- cc => { },
</del><ins>+ cc => { },
+ longdesc => { contains => [1] },
</ins><span class="cx"> },
</span><ins>+ anyexact => {
+ 'flagtypes.name' => { contains => [1, 2, 5] },
+ },
+ 'anywords-<1>' => {
+ 'flagtypes.name' => { contains => [1, 2, 3, 4, 5] },
+ },
+ 'anywords-<1> <2>' => {
+ 'flagtypes.name' => { contains => [3, 4, 5] },
+ },
+ anywordssubstr => {
+ 'flagtypes.name' => { contains => [5] },
+ },
+ 'anywordssubstr-<1> <2>' => {
+ 'flagtypes.name' => { contains => [3,4,5] },
+ },
+ casesubstring => {
+ 'flagtypes.name' => { contains => [5] },
+ },
</ins><span class="cx"> changedafter => {
</span><span class="cx"> "attach_data.thedata" => { contains => [2, 3, 4] },
</span><span class="cx"> "classification" => { contains => [2, 3, 4] },
</span><span class="lines">@@ -397,7 +450,6 @@
</span><span class="cx"> dependson => { contains => [1, 3] },
</span><span class="cx"> work_time => { contains => [1] },
</span><span class="cx"> FIELD_TYPE_BUG_ID, { contains => [1 .. 4] },
</span><del>-
</del><span class="cx"> },
</span><span class="cx"> changedto => {
</span><span class="cx"> CHANGED_BROKEN_NOT,
</span><span class="lines">@@ -406,11 +458,45 @@
</span><span class="cx"> "remaining_time" => { contains => [1] },
</span><span class="cx"> },
</span><span class="cx"> greaterthan => {
</span><del>- cc => { contains => [1] },
</del><ins>+ cc => { contains => [1] },
+ 'flagtypes.name' => { contains => [5] },
</ins><span class="cx"> },
</span><span class="cx"> greaterthaneq => {
</span><span class="cx"> cc => { contains => [1] },
</span><ins>+ 'flagtypes.name' => { contains => [2, 5] },
</ins><span class="cx"> },
</span><ins>+ equals => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ },
+ notequals => {
+ longdesc => { contains => [1] },
+ },
+ notregexp => {
+ longdesc => { contains => [1] },
+ },
+ notsubstring => {
+ longdesc => { contains => [1] },
+ },
+ 'nowords-<1>' => {
+ 'flagtypes.name' => { contains => [5] },
+ },
+ 'nowordssubstr-<1>' => {
+ 'flagtypes.name' => { contains => [5] },
+ },
+ lessthan => {
+ 'flagtypes.name' => { contains => [5] },
+ },
+ lessthaneq => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ },
+ regexp => {
+ 'flagtypes.name' => { contains => [1, 5] },
+ longdesc => { contains => [1] },
+ },
+ substring => {
+ 'flagtypes.name' => { contains => [5] },
+ longdesc => { contains => [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->search_test->bug(@_);
</span><span class="cx"> }
</span><ins>+sub number {
+ my ($self, $id) = @_;
+ foreach my $number (1..NUM_BUGS) {
+ return $number if $self->search_test->bug($number)->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->{translated_value};
</span><span class="cx"> }
</span><span class="cx"> # Used in failure diagnostic messages.
</span><del>-sub debug_value {
- my ($self) = @_;
- return "Value: '" . $self->translated_value . "'";
</del><ins>+sub debug_fail {
+ my ($self, $number, $results, $sql) = @_;
+ my @expected = @{ $self->test->{contains} };
+ my @results = sort
+ map { $self->number($_) }
+ map { $_->[0] }
+ @$results;
+ return
+ " Value: '" . $self->translated_value . "'\n" .
+ "Expected: [" . join(',', @expected) . "]\n" .
+ " Results: [" . join(',', @results) . "]\n" .
+ trim($sql) . "\n";
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> # True for a bug if we ran the "transform" 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->field;
</span><span class="cx"> my $type = $self->field_object->type;
</span><span class="lines">@@ -192,8 +210,8 @@
</span><span class="cx"> my $value_name = "$operator-$value";
</span><span class="cx"> if (my $extra_name = $self->test->{extra_name}) {
</span><span class="cx"> $value_name .= "-$extra_name";
</span><del>- }
-
</del><ins>+ }
+
</ins><span class="cx"> my $value_broken = $constant->{$value_name}->{$field};
</span><span class="cx"> $value_broken ||= $constant->{$value_name}->{$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->bug_is_contained($number)) {
</span><span class="cx"> ok($result_ids{$bug_id},
</span><span class="cx"> "$name: contains bug $number ($bug_id)")
</span><del>- or diag Dumper($results) . $self->debug_value . "\n\nSQL: $sql";
</del><ins>+ or diag $self->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"> "$name: does not contain bug $number ($bug_id)")
</span><del>- or diag Dumper($results) . $self->debug_value . "\n\nSQL: $sql";
</del><ins>+ or diag $self->debug_fail($number, $results, $sql);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>